原理

MCP(Model Context Protocol(模型上下文协议))是由Anthropic开发的一个标准化协议,用于让AI模型和应用程序与外部系统进行安全、高效的通信。

MCP 采用”主机-客户端-服务端”的三层架构

组件 核心职责 典型示例
MCP 主机端(Host) 发起请求的”需求方”,即需要调用外部资源的 AI 应用或程序,负责整合模型输出与外部工具结果 Claude 桌面应用、AI 开发 IDE(如 VS Code 插件)、企业内部 AI 助手系统
MCP 客户端(Client) 协议的”传输中介”,与服务端建立一对一专属连接,负责将主机端的请求标准化,同时将服务端的响应解析后返回主机端 遵循 MCP 协议开发的轻量级客户端程序、嵌入 AI 应用的协议模块
MCP 服务端(Server) 提供具体功能的”资源方”,通过 MCP 协议暴露特定能力,接收标准化请求后执行操作并返回结果 实时数据查询服务器、文件解析服务、第三方工具 API 适配服务(如地图、支付工具)

mcp之前

每个AI应用有自己的工具实现方式

  • OpenAI 方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 开发者需要为 OpenAI 编写
functions = [
{
"name": "get_weather",
"description": "获取天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
}
}
}
]

# 每次调用 API 都要传递
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[...],
functions=functions # 每次都要定义
)
  • Claude 方式(Anthropic)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 开发者需要为 Claude 编写不同的格式
tools = [
{
"name": "get_weather",
"description": "获取天气信息",
"input_schema": { # 注意:叫 input_schema,不是 parameters
"type": "object",
"properties": {
"location": {"type": "string"}
}
}
}
]

response = anthropic.messages.create(
model="claude-3",
messages=[...],
tools=tools # 不同的参数名
)

即用户前端用自然语言与AI交互:告诉我今天的天气情况。AI通过调用api拿到json格式的天气信息,整理后返还给用户。问题在于不同AI应用的代码配置不一样

mcp的解决方案

以github为例,它只需要开发一个mcp服务器@modelcontextprotocol/server-github

1
2
3
4
5
6
7
8
9
10
11
12
// @modelcontextprotocol/server-github
// 这个服务器可以被任何 AI 使用

server.setRequestHandler(CallToolRequestSchema, async (request) => {
switch (request.params.name) {
case "create_issue":
return await github.createIssue(request.params.arguments);
case "create_pr":
return await github.createPR(request.params.arguments);
// ... 其他工具
}
});

在任何支持mcp的AI中,配置都相同

1
2
3
4
5
6
7
8
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
}
}
}

在Cursor+github-mcp方案中,各自的角色扮演如下:

  • Host

Cursor IDE

用户通过聊天框与 AI(claude) 交互,claude 决定将要调用的 github 工具

  • Client

Cursor内置MCP模块

读取mcp.json​配置文件,建立与Github MCP服务器的连接,并将AI对工具的请求(从mcpServers​列表里匹配)转换为JSON-RPC​格式:

1
{"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "get_me"}}

发送请求,接受服务端响应并格式化为MCP 响应(JSON-RPC 响应格式)

  • Server

GitHub MCP Server:https://api.githubcopilot.com

根据请求调用对应的API,并返回数据

因此,可以直接在 cmd 里调远程api,mcp里面的配置只是在辅助拼凑这种命令(id用于让Host 知道 Server 返回的 Response 对应的是哪一个 Request)

1
echo {"jsonrpc": "2.0", "method": "tools/call", "params": {"name": "search_repositories", "arguments": {"query": "user:Q7h2q9"}}, "id": 2} | cmd /c "npx -y @modelcontextprotocol/server-github"

应用

关于Github-MCP

有本地和远程服务器两种方案,各自的配置如下:(可能会有冲突)

本地(Stdio)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"github.com/modelcontextprotocol/servers/tree/main/src/github": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "token"
},
"disabled": false,
"autoApprove": []
}

远程(SSE)

1
2
3
4
5
6
7
"github_remote": {
"url": "https://api.githubcopilot.com/mcp/",
"headers": {
"Authorization": "token"
},
"disabled": false
}

browser_tools-MCP

主要是获取浏览界面信息(截图)、控制台输出、网络请求、调试等日志信息,不能执行控制台命令。 感觉用来读文章、翻译会好一些

项目地址:https://github.com/AgentDeskAI/browser-tools-mcp

AI读取调用插件api获取浏览器界面信息,处理后返还给客户

浏览器安装插件

v1.2.0 BrowserToolsMCP Chrome Extension

mcp配置

1
2
3
4
5
6
7
8
9
10
11
12
13
"browser_tools_mcp": {
"command": "cmd",
"args": [
"/c",
"npx",
"-y",
"@agentdeskai/browser-tools-mcp@latest"
],
"env": {
"SCREENSHOT_PATH": "D:\\AI\\mcp\\Chrome-BrowserTools\\save_file" //自定义截屏图片存储地址
},
"disabled": false
}

运行:

1
npx @agentdeskai/browser-tools-server@latest

总结

MCP 的三大能力要素是Resources (资源)、Prompts (提示词模板)、Tools(工具)

架构采用 Host-Client-Server 三端架构

参考资料

大语言模型实战(八)——MCP(Model Context Protocol):AI 与外部世界交互的标准化协议 - 技术栈

一个mcp聚合网站:Smithery - Turn scattered context into skills for AI