知识库
知识wiki
MCP Server开发详解:从零构建自定义服务端

核心概念
MCP Server(Model Context Protocol Server)是遵循 MCP 协议的服务器端实现,为 AI Agent 提供标准化工具、资源和提示词能力。MCP Server 屏蔽底层业务复杂性,通过统一协议暴露可调用的工具接口、可读取的资源内容和可填充的提示模板。
| 术语 | 定义 |
|---|---|
| Transport | 通信传输层,支持 stdio(进程间管道)和 Streamable HTTP(长连接 HTTP) |
| Tool | 由 Server 声明、Client 调用的可执行功能,类似 RPC 方法 |
| Resource | Server 暴露的只读数据源,通过 URI 寻址 |
| Prompt | 预定义的提示模板,可带参数插入 |
| Lifecycle | 初始化 → 能力协商 → 运行 → 关闭的四阶段生命周期 |
| Capability | Server 声明的能力集合(tools/resources/prompts/roots/sampling) |
传输层选择
MCP 定义两种传输层,开发者根据部署场景选择:
| 传输方式 | 通信机制 | 适用场景 | 示例 |
|---|---|---|---|
| stdio | stdin/stdout JSON-RPC | 本地 Agent 集成、CLI 工具 | Claude Desktop 本地插件 |
| Streamable HTTP | HTTP POST SSE 流 | 远程服务、在线平台集成 | 瑞幸咖啡 MCP API |
协议生命周期
一个 MCP Server 从启动到关闭经历 4 个阶段:
- 初始化(Initialize):Client 发送
initialize请求,Server 回复协议版本、能力声明(ServerCapabilities)。 - 协商(Initialized):Client 发送
initialized通知,双方确认能力。Server 可在此阶段声明支持的工具列表。 - 运行(Operation):Client 调用
tools/call、resources/read、prompts/get等请求;Server 响应结果或错误。 - 关闭(Shutdown):任意方断开连接,Server 清理资源。
所有通信基于 JSON-RPC 2.0 协议,请求体包含 jsonrpc、id、method、params 四个字段:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": {
"city": "Beijing"
}
}
}
核心能力实现
Tools 工具
Tools 是 MCP Server 最常用的能力。Server 声明工具列表(含名称、描述、输入 JSON Schema),Client 按需调用。每次调用是独立的——Server 不保存状态,Client 决定何时调用。
工具声明示例:
{
"name": "search_products",
"description": "搜索商品列表,支持关键词和价格筛选",
"inputSchema": {
"type": "object",
"properties": {
"keyword": {"type": "string", "description": "搜索关键词"},
"maxPrice": {"type": "number", "description": "最高价格过滤"}
},
"required": ["keyword"]
}
}
Resources 资源
Resources 提供统一的只读数据接口。每个 Resource 有一个 URI 和 MIME 类型。支持 resources/list 枚举和 resources/read 读取。URI 可按业务逻辑分层,如 file:///logs/app.log、db://users/123。
Prompts 提示
Prompts 是带参数的模板化提示。Server 声明 Prompt 名称、参数列表和描述,Client 获取后填充参数使用。适合封装业务场景下的固定提示模式。
安全与认证
| 安全维度 | 措施 | 说明 |
|---|---|---|
| 认证 | Bearer Token / API Key | HTTP Header 传入,Server 验证 |
| 速率控制 | QPS 限制 + 超时 | 防止单一客户端滥用 |
| 输入校验 | JSON Schema 校验 | 拒绝非法参数,防注入 |
| 资源隔离 | 用户级沙箱 | 每个 Session 独立上下文 |
开发要点
- 错误处理:工具调用失败返回标准 JSON-RPC 错误码(-32600 参数错误、-32603 内部错误),不要抛未捕获异常
- 异步设计:耗时的工具操作应异步执行,立即返回 taskId,通过资源轮询获取结果
- 幂等性:读操作天然幂等;写操作(下单、转账)建议设计幂等键防重复
- 资源清理:shutdown 阶段关闭数据库连接、释放临时文件
- 可观测性:记录每个请求的耗时、方法、参数大小,便于排障
- 版本声明:在 initialize 响应中声明协议版本(当前 v1)和自定义能力
常见部署模式
| 模式 | 架构 | 典型场景 |
|---|---|---|
| 单体 | 一个进程暴露所有能力 | 小型业务、内部工具 |
| 网关聚合 | Gateway 分发到多个子服务 | 大型平台、多业务线 |
| 容器化 | Kubernetes / Docker 部署 | 高可用、动态扩缩容 |


黑公网安备 23010302001359号