从去年 Claude 推出 MCP,到最近微软在 Build 2025 上宣布 Windows 将支持 MCP,MCP 已成为 AI 领域最重要的协议之一。本文将秉承“无废话”原则,快速介绍 MCP 核心概念、开发流程和安全注意事项。
虽然本文是付费内容,但假若各位动手能力强,开发经验足够,搜索或跟 AI 互动的能力超高,可根据下列核心要点自行摸索和学习,本文的付费部分不过就是帮助时间成本高的同学节约时间罢了:
- MCP 核心概念可自行搜索或直接问 AI。
- 主流的 MCP 开发框架:fastmcp、mcp-framework、vercel mcp adapter、cloudflare mcp agent。
- 对于新近引入的 oauth ,个人推荐观望即可,如果实在想用推荐 cloudflare mcp agent。
- MCP 安全方面工具,可参考 mcp-scan。
MCP 协议要点
MCP 解决了什么问题?
MCP 统一了 LLM 模型与外界交互的方式,如果没有 MCP,模型将不得不依赖不同的交互协议与外部交互。
有人或许会说,不是已经有了 function calling 了嘛?
答:function calling 并不是通用协议标准,且其关注于 tool 的调用,而 MCP 支持的类型则更多。
因此,你总能听到 MCP 被人比做 USB 接口。
MCP 中的组件
三部分:Host、Client 和 Server。
- Server,给 LLM 模型提供服务,可以是本地进程或远程服务。
- Client,负责与 Server 交互,它与 Server 之间是一一对应的关系,它一般不会独立运行,而是包含在 Host 中。
- Host,AI 应用(如 Claude / Cursor),Client 运行于 Host 中,一个 Host 可以有多个 Client。
关系如下图:
【来源:HF MCP 课程】
如果你应用里的 agent 需要与多个 MCP Server 交互,但又嫌开多个 client 太麻烦,可以考虑 langchain 的 mcp adapter。
MCP 提供的服务
乍一看,MCP 跟 function calling 很像,但 MCP 提供了更多的服务:
- tools,function calling。
- resources,静态只读数据源。
- prompts,预定义 prompt 模板。
- sampling,Server 主动发起的与 Client 的互动,典型场景: human in the loop。
注意:
- Server 不必实现全部服务。
- 前三者是 Client 主动发起的请求;最后一个是由 Server 主动发起。
由于 MCP 还在快速演进,未必所有的 Host 都支持所有的服务。比如,就连 Claude 自己也没有支持全部服务。因此,在你设计 MCP Server 服务时,最好先调研你的目标 Host 支持哪些服务,省的你辛辛苦苦实现的服务,Host 却不支持。
通信协议
MCP 的通信协议基于 JSON-RPC 2.0,但开发一般不需要了解这些细节,故略过不谈。
在这基础之上,有两种通信方式:
- stdio,本地通信,client 和 server 都运行在本地。它也是协议推荐 client 优先支持的协议。
Clients SHOULD support stdio whenever possible.
- http + sse / streamable http,远程通信,mcp server 运行在远程服务器上。在最新的规范中,已经推荐了使用 streamable http。如果你考虑创建一个 mcp 付费服务器,那么这个协议是必须支持的。
借助工具,你可以轻松实现 client 和 server 异种通信。即支持 stdio 的 client 和 支持 streamable 的 server 之间相互通信:
- mcp-proxy,支持两种协议自由切换。
- mcp-remote,支持 stdio client 与 remote server 之间通信。
MCP 开发
目前 MCP 开发框架百花齐放,以下是我了解到的一些:
- fastmcp,该框架有 ts 和 python 版本,作者不同。其中 python 版本的 1.0 已经融入 MCP Python SDK,github 上是 2.0 版本。
- mcp-framework,ts 版本
- vercel mcp adapter,完美融合 nextjs,且可方便托管于 vercel。
- cloudflare mcp agent,可方便部署于 cloudflare,同时对于 OAuth 支持较好。
如果你是打算做 MCP 付费 Server,我推荐 vercel mcp adapter,考虑到 nextjs 的流行程度、ai coding 支持程度和 vercel 的托管便利性。
对于 vercel mcp adapter
的基本使用,由于其文档已经给出了详细的示例,这里就不再赘述。本文只重点介绍在使用 Vercel MCP Adapter 时的认证、调试和客户端的添加,最后再说说 MCP Server 中的 OAuth。
为 MCP Server 添加认证功能
vercel mcp adapter 虽然好用,但文档并未给出一个完整的认证示例,而付费 MCP Server 却又离不开它。
假设你的 MCP Server 采用 access token
认证方式,以下是一个简单的实现:
const mcpEndpointHandler = async (request: NextRequest) => {
const accessToken = await request.headers.get("x-access-token");
if (!accessToken) {
return NextResponse.json({ message: "Auth required" }, { status: 401 });
}
// verify access token
return createMcpHandler(
// 参见文档示例
)(request);
};
export { mcpEndpointHandler as GET, mcpEndpointHandler as POST };
这段代码实现了一个 wrapper,先验证 access token
,在通过验证之后返回 createMcpHandler
的结果。注意这里返回的是 createMcpHandler
的调用结果,而非文档中直接返回了 createMcpHandler
函数本身。
MCP Server 调试
如何在 client 调用时传入这个 access token
呢?,需要修改 StreamableHTTPClientTransport
:
const transport = new StreamableHTTPClientTransport(
new URL(`${origin}/mcp`),
{
requestInit: {
headers: {
"x-access-token": "********",
},
},
},
);
MCP Host 使用
对于 Claude 或 Cursor 目前并不直接支持 streamable http
,建议使用 mcp-remote
,比如在 Cursor 中:
{
"mcpServers": {
"remote-example": {
"command": "npx",
"args": [
"mcp-remote",
"https://remote.mcp.server/sse",
"--header",
"x-access-token:${ACCESS_TOKEN}",
],
"env": {
"ACCESS_TOKEN": "..."
}
},
}
}
详见 mcp-remote
文档。vercel mcp adapter 会 fallback 到 sse
。vscode 的 github copilot 则已经支持 streamable http
,在工程目录的 .vscode/mcp.json
中添加:
{
"inputs": [
{
"type": "promptString",
"id": "access-token",
"description": "MCP Server Access Token",
"password": true
}
],
"servers": {
"my-mcp-server": {
"type": "http",
"url": "https://remote.mcp.server/api/mcp",
"headers": {
"x-access-token": "${input:access-token}"
},
}
}
}
在首次运行时,vscode 会提示输入 access token
。
MCP Server 中的 OAuth
在最新的 MCP 规范中,已经引入了 OAuth 认证方式,并且将其作为推荐方式。但经过若干尝试和调研之后,个人认为还是观望为佳,主要因为几点:
- MCP 协议本身还在快速演进中,OAuth 相关的规范也在不断变化。
- 并非所有的 Host 都支持 OAuth,比如 vscode,从其 GitHub 上的讨论来看,应该在今年 5月底。
- MCP Server 需要自身实现 OAuth 的认证的全过程,可以理解为它自身就是一个 OAuth Server。
- 虽然可以借助
OAuth Proxy
(如 auth0、 better-auth 都提供了简单的实现)的方式实现,但有引入了新的问题(An Introduction to MCP and Authorization)。
But, according to the MCP spec, that raises new issues. In section 2.9.2, the spec states that the MCP server authorizes with the third-party authorization server, and then it generates its own access token bound to the third-party session.
The issue here is that if we delegate authorization, as explained before, we would not be able to comply with this part of the spec.
既然如此,建议先观望。如果你有兴趣进一步了解,参见下面的链接:
- https://developers.cloudflare.com/agents/guides/remote-mcp-server/
- https://github.com/empires-security/mcp-oauth2-aws-cognito/blob/main/src/mcp-server/index.js
使用 MCP Inspector 测试即可:npx @modelcontextprotocol/inspector@latest
。之后,你会看到一个 oauth 的全过程。
MCP 安全
一篇不提 MCP 安全性的指南时不完整的,在之前的微信文摘:《MCP:人工智能的新领域,布满安全漏洞》中也已经提到,请自行前往阅读。
其他有用的资源还包括:
并且 Docker 也推出了相关的工具:Docker MCP Catalog and Toolkit。
此外,另一个值得采纳的实践是使用 sandbox 来隔离 MCP Server 的运行环境。比如:
总结
MCP 作为 AI 领域的重要协议,正在快速发展。本文简要介绍了 MCP 的核心概念、开发流程和安全注意事项。希望能帮助你快速上手 MCP 开发。
本文包含付费内容,需要会员权限才能查看完整内容。