参考
前言
MCP(Model Context Protocol)是一种开放协议,旨在通过标准化接口实现大语言模型(LLMs)与外部数据源及工具的无缝集成。MCP由 Anthropic 公司在2024年底推出,其设计理念类似于USB接口,为AI模型提供了一个“即插即用”的扩展能力,使其能够轻松连接至不同的工具和数据源。想深入了解可查看 官方文档,这里只做实战经验分享。
概念
MCP 全称 Model Context Protocol 是一种用于描述模型上下文的协议,它允许模型在生成文本时获取更多的上下文信息。MCP 协议定义了一种标准的方式来描述模型的上下文,包括模型的名称、版本、输入和输出格式等信息。
简单理解就是:
每一个 MCP Server 都是大语言模型客户端的插件,MCP 可以提供 Tools、Prompt、Resource 等功能供客户端使用,客户端启动时读取所有的 MCP 的 Tools、Prompt、Resource 描述当做大语言模型的系统提示词,客户端根据模型返回的内容判断调用对应的 MCP 获取函数返回内容,客户端将用户输入 + 函数返回内容发送给大语言模型,大语言模型根据用户的问题生成更相关的回复
MCP 可以干什么?
相比于 MCP 是什么我其实更想知道 MCP 能干什么?
AI 有一个缺点: AI 只知道过去发生的事情,却无法实时从外界获取最新的信息 比如今天的天气情况、今天的热点新闻等。因为训练 AI 的数据集始终是滞后的
在 MCP 之前我们可以通过 Function Call 来给 AI 增加类似网页搜索的功能让其可以获取到实时数据,但没有一个标准,同样的功能换一个 AI 可能还需要重新实现一下
就像上边的那张图片 MCP 提供一种标准的接入协议,只要是按照 MCP 开发的服务端就可以在 MCP 客户端中接入(这他么不是废话吗!)
MCP 可以定义一系列的能力比如 GitHub MCP 服务
提供了比如搜索仓库、issuer、回复、用户,创建仓库,提交代码等功能
你可以通过自然语言让 AI 来执行这些操作
然后还有 filesystem 可以让 AI 操作文件
MCP 三种标准的传输机制
标准输入和标准输出的通信 STDIO
专为本地 MCP 连接设计,比如通过 node index.js 执行 MCP Server 进行交互
服务器发送事件 SSE
目前大多数远程 MCP 客户端都支持,但预计随着时间的推移将被流式 HTTP 取代。
它需要两个端点:一个用于发送请求,另一个用于接收流式响应。
可流式传输 HTTP
2025 年 3 月引入的新传输方法。它通过使用单个 HTTP 端点简化了双向通信。
目前,它正在被远程 MCP 客户端采用,预计未来将成为标准的传输方式。
为什么要替换可以看 Replace HTTP+SSE with new “Streamable HTTP” transport GitHub 上的这个 RFC
MCP Server的三种实现方式
三种实现方式只是数据传输的方式不同, server 实现是一样的,下面就以实现 一个time MCP 服务为例:
创建一个简单的 MCP server
1 | // mcpServerTest.ts |
注意 !/usr/bin/env node (解释器指示符) 意思是需要使用 node 去执行代码
标准输入和标准输出的通信 STDIO
1 | // stdio.ts |
测试 MCP 服务
官方提供了一个测试工具inspector
在调试之前需要先执行 pnpm run build
执行打包
执行 npx @modelcontextprotocol/inspector node transports/dist/stdio.js 启动测试页面:
访问 http://127.0.0.1:6274
服务器发送事件 SSE
这是一个简单的 mcp sse 服务的实现,在生产中可能需要继续完善代码比如对跨域、鉴权的处理
1 | // sse.ts |
测试
执行 node dist/sse.js 启动服务
执行 npx @modelcontextprotocol/inspector http://127.0.0.1 启动测试页面
可流式传输 HTTP
这是一个简单的 Streamable HTTP mcp 服务实现,其实是官方仓库的示例代码 (看起来有点绕🤪) 加了一些注释便于理解
1 | // streamable.ts |
测试
执行 node dist/streamable.js 启动服务
执行 npx @modelcontextprotocol/inspector http://127.0.0.1 启动测试页面
访问 http://127.0.0.1:6274
这里需要选择 Streamable HTTP 和确认服务的地址及端口,确认没有问题后点击连接即可
server 同时兼容 SSE 与 Streamable 的写法
把 sse 和 Streamable HTTP 的 server 实现组合起来,没有什么魔法!
MCP 三种 Client 的实现
三种客户端的实现区别不大, MCP SDK 导出了三个文件对应三种 server 的实现
STDIO
1 | // stdio.ts |
SSE
这里需要先启动 sse serevr node ./dist/sse.js
1 | // sse.ts |
Streamable HTTP
实现与 SSE 几乎相同将 SSEClientTransport 替换为 StreamableHTTPClientTransport 即可
如果失败并出现 4xx 错误时尝试使用 SSE 客户端
1 | // streamable.ts |