手把手调试MCP Server,RTFM!
MCP协议的Calling Convention
MCP协议的实现需要三个部分: Server和Client,以及Host
我们这里介绍MCP Server的原理, Host可以是任何支持MCP协议的应用程序(一般包含Client服务)。
例如:Cline、Cursor等 参考这篇文章MCP到底是什么,原理是啥?
MCP的三个基础能力
- Resources:提供资源访问,如文件读取或 API 响应内容
- Tools:提供工具函数功能,或者第三方服务的调用
- Prompts:提供预定义的提示词模板,用于完成特定任务
工作流程
flowchart LR
Client[客户端应用] <--> Protocol{MCP 协议}
Protocol <--> Server[MCP 服务器]
Server --> Resources[资源访问]
Server --> Tools[工具功能]
Server --> Prompts[提示词模板]
Resources --> Files[(文件系统)]
Resources --> APIs[(外部 API)]
Tools --> Functions[函数执行]
Tools --> Services[第三方服务]
Prompts --> Templates[(任务模板)]
MCP Server 接收数据
- 开发参考:快速上手 | MCP SDK
- 请求格式:MCP Server 采用
JSON-RPC 2.0
协议接收数据。 - 通信方式:支持通过
stdio
(标准输入输出)和sse
(Server-Sent Events)进行通信。
调试工具
官方提供了一个调试工具,方便开发者测试和调试 MCP Server:
npx @modelcontextprotocol/inspector node .\server.js
请求示例
客户端向 MCP Server 发送请求的格式如下:
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/list",
"params": {}
}
jsonrpc
: 协议版本,固定为"2.0"
id
: 请求唯一标识符method
: 调用的方法名params
: 方法参数(对象或数组)
命令行调用示例
可以通过命令行直接向 MCP Server 发送请求:
$ echo '{"jsonrpc":"2.0","id":1,"method":"resources/list","params":{}}' | node path\to\mcp_server\index.js
> {"jsonrpc":"2.0","id":1,"result":{"resources":[{"uri":"useful://system-info","name":"系统信息","description":"提供系统相关的基本信息"},{"uri":"useful://date-time","name":"日期和时间","description":"提供当前的日期和时间信息"}]}}
响应示例
MCP Server 返回的响应格式如下:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resources": [
{
"uri": "useful://system-info",
"name": "系统信息",
"description": "提供系统相关的基本信息"
},
{
"uri": "useful://date-time",
"name": "日期和时间",
"description": "提供当前的日期和时间信息"
}
]
}
}
result
: 方法调用的返回结果resources
: 资源列表,每个资源包含uri
、name
和description
错误响应示例
当请求出错时,MCP Server 会返回如下格式的错误信息:
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32601,
"message": "Method not found"
}
}
error.code
: 错误码,遵循 JSON-RPC 规范error.message
: 错误描述
常见方法
方法名 | 说明 | 参数 | 返回值说明 |
---|---|---|---|
resources/list |
获取资源列表 | - | 资源数组 |
resources/read |
获取指定资源详情 | uri |
资源对象 |
tools/list |
获取可用工具列表 | - | 工具数组 |
tools/call |
调用指定工具方法 | name , arguments |
方法调用结果 |
prompts/list |
获取可用提示词模板 | - | 提示词模板数组 |
prompts/get |
获取指定提示词模板 | name |
提示词模板对象 |