大家好!随着 AI Agent 的爆发式增长,如何让大模型更标准化、更安全地调用外部工具和资源,成为了开发者们关注的焦点。Model Context Protocol (MCP) 应运而生,它为 AI 应用提供了一个标准化的接口,用于发现和使用各种服务。
今天,我们将深入探讨 Vercel AI SDK 中最新支持的 MCP Tools 功能,并手把手教你如何结合智谱最新发布的 GLM-5 模型,构建一个强大的 AI 智能体!
🌟 什么是 MCP?为什么我们需要它?
Model Context Protocol (MCP) 是一个开放标准。简单来说,它就像是 AI 时代的“USB 接口”。通过连接到 MCP 服务器,你的 AI 应用程序可以无缝访问服务器提供的:
- 工具 (Tools) :供大模型调用的函数(如查询天气、执行代码等)。
- 资源 (Resources) :为模型提供上下文的数据源(如读取本地文件、数据库)。
- 提示词 (Prompts) :服务器端预设的用户控制模板。
Vercel AI SDK 原生支持了 MCP 客户端,只需几行代码,就能让你的 GLM-5 模型获得超能力!
🛠️ 准备工作
首先,安装必需的依赖包。由于我们要使用智谱的 GLM-5 模型,可以通过 Vercel AI SDK 的 OpenAI 兼容适配器来接入。
Bash
npm install @ai-sdk/mcp @ai-sdk/openai ai zod
🎯 核心实战:连接 MCP 并使用 GLM-5
1. 初始化 MCP 客户端
Vercel AI SDK 提供了多种连接 MCP 服务器的传输方式 (Transport)。在生产环境中,强烈推荐使用 HTTP 或 SSE 传输;而在本地开发时,可以使用 Stdio。
TypeScript
import { createMCPClient } from '@ai-sdk/mcp';
// 以 HTTP 传输为例 (推荐用于生产)
const mcpClient = await createMCPClient({
transport: {
type: 'http',
url: 'https://your-mcp-server.com/mcp',
// 可选:配置鉴权请求头
headers: { Authorization: 'Bearer your-api-key' },
},
});
注:如果是本地开发,可以将 type 换为 stdio 或者使用 @modelcontextprotocol/sdk/client/stdio.js。
2. 结合智谱 GLM-5 模型进行工具调用
配置好 MCP 客户端后,我们可以通过 mcpClient.tools() 将服务器端的工具一键转换为 AI SDK 兼容的格式,并传递给 GLM-5 模型。
注意: 使用完毕后,务必调用
mcpClient.close()关闭客户端以释放资源。对于非流式请求,推荐使用try/finally块;对于流式请求(streamText),可在onFinish回调中关闭。
TypeScript
import { createMCPClient } from '@ai-sdk/mcp';
import { generateText } from 'ai';
import { createOpenAI } from '@ai-sdk/openai';
// 1. 配置智谱大模型 (利用 OpenAI 兼容接口)
const zhipu = createOpenAI({
baseURL: 'https://open.bigmodel.cn/api/paas/v4/',
apiKey: process.env.ZHIPU_API_KEY, // 填入你的智谱 API Key
});
async function runAgent() {
// 2. 初始化 MCP 客户端
let mcpClient;
try {
mcpClient = await createMCPClient({
transport: { type: 'http', url: 'https://your-mcp-server.com/mcp' }
});
// 3. 自动发现 MCP 服务器上的所有工具 (Schema Discovery)
const tools = await mcpClient.tools();
// 4. 调用智谱 GLM-5 模型
const result = await generateText({
model: zhipu('glm-5'), // 指定使用最新的 GLM-5 模型
tools: tools, // 直接传入 MCP 工具集合
prompt: '请帮我查询一下北京今天的天气,并给出穿衣建议。',
});
console.log('🤖 GLM-5 回复:', result.text);
// 如果模型决定调用工具,这里会打印工具调用记录
if (result.toolCalls && result.toolCalls.length > 0) {
console.log('🛠️ 触发了工具调用:', result.toolCalls);
}
} finally {
// 5. 养成良好习惯,完成后关闭客户端
await mcpClient?.close();
}
}
runAgent().catch(console.error);
🚀 进阶玩法:解锁 MCP 的完全体
1. 强类型的工具定义 (Schema Definition)
默认的 mcpClient.tools() 会拉取所有工具,但这在开发时缺乏 TypeScript 的类型提示。为了获得完整的类型安全和 IDE 自动补全,你可以结合 zod 显式定义你需要的工具和输入/输出结构:
TypeScript
import { z } from 'zod';
const tools = await mcpClient.tools({
schemas: {
'get-weather': {
// 定义传入参数的结构
inputSchema: z.object({
location: z.string().describe('城市名称'),
}),
// (可选) 定义返回结果的结构,确保输出也是强类型的
outputSchema: z.object({
temperature: z.number(),
conditions: z.string(),
}),
},
// 如果工具不需要参数,传入空对象即可
'ping-server': {
inputSchema: z.object({}),
}
},
});
这种方式不仅能提供极致的类型安全,还能让你的应用只加载切实需要的工具,避免上下文冗余。
2. 获取 MCP 资源 (Resources)
资源是由应用程序主动控制的数据源。你可以列出或读取这些资源来作为 GLM-5 模型的背景知识:
TypeScript
// 1. 获取可用资源列表
const resources = await mcpClient.listResources();
// 2. 读取特定资源的详细内容
const documentData = await mcpClient.readResource({
uri: 'file:///example/document.txt',
});
3. 处理 Elicitation (请求用户输入)
有时候,MCP 服务器在执行工具前需要用户的确认(比如敏感操作或表单验证)。你可以在初始化时开启这个能力,并监听请求:
TypeScript
import { ElicitationRequestSchema } from '@ai-sdk/mcp';
// 开启能力
const mcpClient = await createMCPClient({
transport: { /* ... */ },
capabilities: { elicitation: {} },
});
// 注册处理函数
mcpClient.onElicitationRequest(ElicitationRequestSchema, async request => {
console.log('服务器请求输入:', request.params.message);
// 假设这里通过某种方式获取了用户的确认或输入内容
const userInput = await getCliUserInput();
return {
action: 'accept', // 可选 'accept', 'decline', 'cancel'
content: userInput,
};
});
总结
通过 Vercel AI SDK 引入 MCP Tools,极大地降低了我们整合外部系统和工具的成本。再搭配上智谱 GLM-5 强大的逻辑推理和工具调用能力,无论是开发智能客服、数据分析看板还是自动化执行助手,都变得前所未有的简单。
赶紧升级你的 @ai-sdk/mcp,动手试试看吧!如果你在接入过程中遇到任何问题,欢迎在评论区留言交流讨论~ 👇