最近MCP(Model Context Protocol)的概念可谓是炙手可热,但是对它的定义众说纷纭,本着读书要读原著的原则,我们来打开MCP的官方网站,看看到底是怎么个事
先从概念入手
1、什么是MCP
模型上下文协议(MCP)是一个开放协议,旨在实现LLM应用程序与外部数据源和工具之间的无缝集成。它作为一种标准化的方式,将大模型与他们所需的上下文联系起来。
2、MCP解决了什么问题
MCP解决了AI和数据源之间碎片化集成的问题。它解决了AI与数据隔离并被困在信息孤岛后面的挑战,用一个通用协议取代了多个自定义实现。
3、谁开发了MCP
由Anthropic公司开发
4、MCP有哪些使用场景
MCP可用于各种场景,包括:构建AI驱动的ide,增强聊天界面,创建自定义AI工作流,将AI系统与外部数据源连接起来。
5、为什么MCP对AI发展如此重要
MCP很重要是因为它提供了一个通用的开放标准,使人工智能系统访问所需数据变得更简单、更可靠,从而能够更好地扩展连接系统。
6、与传统的集成方式相比,MCP的主要优势是什么
主要优势是 MCP 通过提供单一、标准化的协议消除了为每个新数据源进行自定义实现的需要,从而更容易扩展和维护需要访问多个数据源的 AI 系统。
概念总结
上面问题的回答重复性很高,总结来说,MCP就是由Anthropic公司提出的一套用来实现LLM与外部数据源和工具之间的标准化通讯方式,使得LLM可以与用户需要的上下文信息连接起来
至于用户需要的上下文信息是什么?它可能是figma设计稿数据、gitlab代码数据、内部文档数据、服务器日志数据、或者回答某个特定问题背后所需要的深厚知识背景等等...
MCP的架构模型
先上原图,可以看到也是传统的C/S架构,我们把它分为3个部分来看
第一部分就是我们常用的客户端
Claude、Cursor、Trae等;
第二部分是我们需要配置使用的MCP服务,可以是三方开源的,也可以是自己搭建的,它们与我们的客户端通过MCP协议进行互通;
第三部分是既有的东西,可以是内部的数据源、也可以是公网上的某些远端服务,它们与MCP Server如何连接呢?答案是可以任何方式,比如web api\数据库连接访问\FTP等
-
MCP最终的工作流程:
-
使用MCP回答问题背后发生了什么
*准备工作:客户端(Claude、Cursor)通过连接了MCP Servers, 而MCP Servers通过各自的方式可访问特定的元数据
- 用户将问题发送给客户端(Claude、Cursor)
- 客户端分析可用的MCP Servers并决定使用哪一个
- 客户端执行所选的服务工具,通过MCP获取上下文内容,结合用户问题将context发送给AI模型
- AI模型将回答结果发回给客户端
- 客户端转换为自然语言回应,并将答案显示给用户
寻找一个使用场景
- 给AI一个内部文档地址,让它根据文档内容帮忙实现一个代码需求,但是这个文档需要鉴权才能访问,你可以编写一个MCP服务来帮助LLM读取到文档内容
- 你需要让AI根据某个MySQL数据库的表数据来汇总用户地域分布情况、年龄分布情况等,此时,你可以通过编写MCP Server,为LLM提供该元数据
- 你需要让AI根据figma的某个设计稿生成一个静态页面代码,此时,你可以通过MCP Server让LLM成功获取到figma里的设计稿元数据,并根据你提供的Promats来进行生成
- 你需要搭建一个智能聊天机器人,你想让这个机器人所有的回答都利用某个建设好的知识库内容,此时,你需要使用MCP服务桥接知识库给LLM作为回答的知识背景
- ......
如何开发一个MCP Server
(1)开发前需要储备的知识
- 1、官方是有提供SDK的,目前语言版本有
Python、TS、Java、Kotlin、C# - 2、MCP servers可以提供三种主要的功能类型,分别是:
① Resources(资源) : 客户端可以直接读取的类似文件的数据(例如 API 响应或文件内容)
② Tools(工具) : 经用户批准后,可由 LLM 调用的函数
③ Prompts(提示词):预先编写的提示词模板,帮助用户完成特定任务(有点类似智能体) - 3、MCP servers需要选定传输协议才能和Client通讯,服务器的启动方式取决于所选择的传输协议,TS可选如下2种方式:
① stdio(标准输入输出): 对于命令行工具的执行,可直接集成,适用于可通过脚本完成的任务,优点是无需搭建服务,缺点是需要用户有执行脚本的配置环境,比如node、py,脚本可远程托管到对应的包管理上。
② Streamable HTTP(可流式传输的HTTP):(舍弃了HTTP with SSE方案,见附录)适用于远端的MCP服务,它又分为With Session Management和Without Session Management (Stateless)两种方式,前者是有会话状态管理的,适合复杂的任务交互,可以维护会话的上下文,也支持水平拓展;后者是无会话状态管理的,每个请求都是独立的,适合简单的工具API。
(2)开发一个stdio传输方式的demo
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
async function main() {
const server = new McpServer({
name: "internal-doc-server",
version: "1.0.0",
});
// ... set up server resources, tools, and prompts ...
server.tool(
"get_doc_content",
"获取内部文档内容",
{ doc_url: z.string().describe("文档链接") },
async ({ doc_url }) => {
// 登录获取cookie
const data = new FormData();
const token = process.env.MY_TOKEN || "";
if (token) {
data.append("token", token);
} else {
throw new Error("MY_TOKEN is not set");
}
const loginResp = await fetch(
"https://xxx.com/login",
{
method: "POST",
body: data,
redirect: "manual",
}
);
const loginCookie = loginResp.headers
.get("set-cookie")
.split(";")[0];
// 获取文档内容
const docResp = await fetch(
`${doc_url}`,
{
headers: {
cookie: `${loginCookie}`,
},
body: null,
method: "GET",
}
);
const docData = await docResp.text();
return {
content: [
{
type: "text",
text: docData,
},
],
};
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
}
main();
(3)配置到Cursor上
打开添加MCP,配置如下JSON即可
{
"mcpServers": {
"internal-doc-server-mcp": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"internal-doc-server@1.0.0"
],
"env": {
"MY_TOKEN": "xxx",
}
}
}
}
如何开发一个MCP Client
MCP Client的开发需求较少,它通常是集成在一个具有实际业务意义的客户端里,比如AI Coding的IDE、AI聊天的客户端等,具体开发流程参照官方文档,这里不过多解读 modelcontextprotocol.io/quickstart/…
附录
- mcpservers.org/ 开源的MCP服务hub
- modelcontextprotocol.io/introductio… MCP官方文档
- www.cnblogs.com/xiao9873341… MCP放弃HTTP+SSE,拥抱Streamable HTTP