从 0 开发一个 MCP Server:手把手教你构建 AI 工具调用能力(2026)
AI 不够「聪明」,往往不是因为模型弱,而是缺工具——没有实时数据、无法执行操作、上下文无法持久。本文面向 AI 开发者,从 Function Calling 演进到 MCP 协议,用 Python FastMCP 手把手实现 Hello World、Tools/Resources/Prompts 三类能力、HTTP+SSE 远程传输、ChromaDB 知识库实战与 Docker 生产部署;内含 MCP vs Function Calling 对比表、七步 Runbook 与 Cursor/Claude Desktop 调试指南。
目录
引言:AI 不够聪明,因为缺工具
大语言模型再强,也无法直接访问你的数据库、读取本地文件或调用第三方 API——它只有「大脑」,没有「手脚」。2023 年 OpenAI 推出 Function Calling,2024 年 Anthropic 发布 MCP(Model Context Protocol),把「AI 如何发现、选择并正确调用工具」标准化为开放协议。读完本文,你将拥有一套可运行的 MCP Server,并被 Cursor、Claude Desktop 等 Host 直接调用。
核心痛点:自研 AI 工具集成的三个困境
- 工具定义无法复用。 为 ChatGPT 写的 Function Calling Schema,换到 Claude Tool Use 或 Cursor Agent 就要重写;LangChain Tool 与 CrewAI Tool 格式互不兼容,N 个框架 × M 个数据源 = N×M 定制集成。
- 运行时发现缺失。 传统 REST API 不会告诉 AI「我现在能做什么」;硬编码工具列表在业务变更时极易过时,Agent 选错工具或参数格式错误是生产环境最高频故障。
- 本地开发 ≠ 生产就绪。 STDIO 子进程在笔记本合盖即断、WSL2 环境漂移、Docker 增加排障复杂度——验证通过后如何 7×24 常驻,是多数开发者卡在「Demo 到上线」之间的真实瓶颈。
一、什么是 MCP
1.1 诞生背景:Function Calling → Plugins → MCP
2023 年,OpenAI Function Calling 让模型输出结构化 JSON 调用外部函数,但每家模型格式不同。2024 年初 ChatGPT Plugins 尝试标准化,却绑定 OpenAI 生态。2024 年 11 月 Anthropic 开源 MCP,将工具集成层从模型供应商剥离,成为行业公共基础设施——2026 年 OpenAI、Google、Microsoft 均已全面采纳。
1.2 架构:Client / Server 与 Tools / Resources / Prompts
- Tools — 可执行操作(查数据库、发 HTTP 请求、写文件)
- Resources — 只读上下文(文档、配置、日志片段)
- Prompts — 预置多轮对话模板(Code Review、PR 摘要)
1.3 JSON-RPC 2.0 与传输层
MCP 底层使用 JSON-RPC 2.0,核心方法包括 initialize、tools/list、tools/call、resources/list、resources/read、prompts/get。
1.4 传输方式与生命周期
- STDIO — Host 以子进程启动 Server,stdin/stdout 通信;Cursor/Claude Desktop 默认模式
- HTTP + SSE — 远程 Server,Server-Sent Events 推送;适合团队共享与云部署
- 生命周期 —
initialize握手 → 能力协商 → 正常通信 →shutdown优雅退出
1.5 MCP vs Function Calling vs LangChain 对比
| 维度 | Function Calling | LangChain Tools | MCP |
|---|---|---|---|
| 标准化 | 各模型厂商私有格式 | 框架内部抽象 | 开放协议,跨 Host 复用 |
| 工具发现 | 静态 Schema 硬编码 | 运行时注册,不可跨框架 | tools/list 动态发现 |
| 只读资源 | ❌ 无原生支持 | Retrieval 链路过重 | ✅ Resources 一等公民 |
| Prompt 模板 | ❌ | PromptTemplate 非标准 | ✅ Prompts 协议级支持 |
| Host 兼容 | 绑定单一 API | 绑定 LangChain 栈 | Cursor / Claude / VS Code 通用 |
二、开发环境准备
2.1 Python vs TypeScript 选择
| 语言 | SDK | 适合团队 | 上手速度 |
|---|---|---|---|
| Python | mcp + FastMCP | 数据/AI/后端 | ⭐⭐⭐ 最快 |
| TypeScript | @modelcontextprotocol/sdk | 前端/Node/IDE 插件 | ⭐⭐ 中等 |
本文以 Python + FastMCP 为主(代码最少、与 AI 栈一致);TypeScript 版逻辑完全对称。
2.2 环境搭建
2.3 推荐项目结构
2.4 调试工具链
- MCP Inspector —
npx @modelcontextprotocol/inspector可视化调试 tools/list、tools/call - Cursor —
.cursor/mcp.json配置后,Agent 自动发现工具 - Claude Desktop —
~/Library/Application Support/Claude/claude_desktop_config.json
三、Hello World:第一个 MCP Server
3.1 FastMCP say_hello
3.2 用 MCP Inspector 运行
浏览器打开 Inspector UI,点击 Connect → List Tools → 调用 say_hello,输入 {"name": "VPSMAC"} 验证返回。
3.3 Cursor / Claude Desktop 配置
重启 Cursor / Claude Desktop,在 Agent 对话中输入「用 say_hello 向 VPSMAC 问好」验证工具调用。
四、Tools:让 AI 真正「动手」
4.1 Tool 基本结构
FastMCP 用装饰器 @mcp.tool() 注册;函数 docstring 成为工具描述,参数类型自动转为 JSON Schema。
4.2 Pydantic 输入校验
4.3 五个实用工具
4.4 错误处理最佳实践
- 用
raise ValueError(...)返回 Agent 可理解的错误信息,而非裸栈追踪 - 对外部 I/O(HTTP、DB)设置超时与结果大小上限
- 敏感操作(写文件、DELETE)单独工具 + 环境变量开关
- 在 docstring 中明确副作用与参数约束,帮助 Agent 正确选型
五、Resources:为 AI 提供只读上下文
5.1 Resource vs Tool
| 能力 | Tool | Resource |
|---|---|---|
| 操作类型 | 可写、可执行 | 只读 |
| 寻址 | 按名称 + 参数 | 按 URI(file://、db://) |
| 典型场景 | 发请求、改数据 | 读文档、拉配置、看日志 |
5.2 URI 寻址与资源类型
MCP Resource 通过 URI 标识:file:///docs/api.md、config://app/settings、note://kb/001。Host 通过 resources/list 发现,resources/read 拉取内容。
5.3 静态与动态资源代码
5.4 文件系统实战
结合 ALLOWED_DIR 白名单,暴露项目 README、API 文档、CHANGELOG 为 Resource,Agent 在 Code Review 时可自动拉取上下文,无需用户手动粘贴。
六、Prompts:预置多轮对话模板
6.1 MCP Prompt 定义
Prompt 是带参数的多轮消息模板,Host 通过 prompts/get 获取后直接注入对话,保证 Code Review、PR 摘要等场景的一致性。
6.2 code_review_prompt 示例
6.3 多轮对话
Prompt 返回的消息列表可包含 system + user 角色,Host 将其作为对话起点;Agent 随后可调用 Tools 拉取实际 diff、再基于 Prompt 框架输出结构化 Review。
七、HTTP 传输:从本地到云端
7.1 STDIO vs HTTP+SSE 对比
| 传输 | 启动方式 | 网络 | 适用 |
|---|---|---|---|
| STDIO | Host spawn 子进程 | 本地 only | Cursor、Claude Desktop |
| HTTP + SSE | 独立 HTTP 服务 | 跨网络 | 团队共享、云部署、多 Host 接入 |
| Streamable HTTP | 单端点双向流 | 跨网络 | 2025+ 推荐远程模式 |
7.2 Streamable HTTP 代码
7.3 认证与安全
- 生产环境必须启用 Bearer Token 或 OAuth 2.1(MCP 2026 路线图)
- Tools 层做输入校验,Resources 层做路径白名单
- 禁止在日志中输出 Token 与用户数据
- 定期轮换密钥,配合 IP 白名单或 mTLS
八、调试与测试
8.1 MCP Inspector 深度用法
Inspector 支持查看 JSON-RPC 原始报文、模拟 initialize 握手、批量测试 tools/call。开发阶段建议「Inspector 通过 → 再接入 Cursor」的两段式验收。
8.2 pytest 单元测试
8.3 常见错误排查
| 现象 | 原因 | 解决 |
|---|---|---|
| Cursor 看不到工具 | mcp.json 路径错误或 Python 未激活 venv | 检查 command 绝对路径,重启 Cursor |
| tools/call 超时 | HTTP 工具无 timeout、DB 慢查询 | 设置 httpx timeout=10,SQL LIMIT |
| JSON-RPC parse error | stdout 混入 print 调试输出 | 日志写 stderr,禁止 print 到 stdout |
| Permission denied | 文件路径越界 ALLOWED_DIR | 检查 realpath 白名单逻辑 |
| Inspector 连接失败 | 端口占用或 transport 不匹配 | 确认 STDIO vs HTTP 模式一致 |
九、生产部署
9.1 Dockerfile
9.2 部署平台选型
| 平台 | 优势 | 注意 |
|---|---|---|
| Railway / Render | 零配置 PaaS,适合 HTTP+SSE | 冷启动延迟,需健康检查 |
| AWS ECS / Fly.io | 弹性扩展、全球边缘 | 需自行配置 TLS 与 Secret Manager |
| 通用 VPS | 完全控制、成本可控 | 需 systemd/launchd 托管进程 |
9.3 监控与版本管理
- Prometheus — 暴露
/metrics,监控 tools/call P95 延迟与错误率 - Sentry — 捕获未处理异常,区分 Agent 参数错误 vs Server Bug
- 版本管理 — Server 在
initialize响应中声明serverInfo.version;Client 配置锁定 major 版本
十、知识库实战:ChromaDB + 语义搜索
10.1 架构:Embedding + 向量检索
将个人笔记/团队文档索引为 MCP Resource 与 Tool,Agent 通过语义搜索获取相关片段,再基于 Prompt 生成回答——这是 RAG 与 MCP 结合的典型模式。
10.2 ChromaDB 索引与搜索
10.3 Qdrant 替代方案
生产环境数据量 > 100 万向量时,可切换 Qdrant 托管服务;MCP Server 层接口不变,仅替换底层 vector store 实现。
10.4 Cursor 演示场景
在 Cursor Agent 中:「搜索关于 MCP HTTP 传输的笔记」→ 调用 semantic_search → 读取 Top-1 Resource → 基于 code_review_prompt 输出结构化摘要。三步完成 RAG,无需用户手动 @ 文件。
十一、生态展望
11.1 推荐官方与社区 Server
- @modelcontextprotocol/server-filesystem — 安全文件系统访问
- @modelcontextprotocol/server-github — Issue/PR/Code Search
- @modelcontextprotocol/server-brave-search — 实时 Web 搜索
- @modelcontextprotocol/server-postgres — PostgreSQL 只读查询
- @modelcontextprotocol/server-slack — 频道消息与通知
11.2 2026 趋势
- MCP 治理权移交 Linux Foundation AAIF,成为行业公共基础设施
- OAuth 2.1 标准化身份验证列入协议路线图
- Streamable HTTP 取代纯 SSE 成为远程传输默认
- 10,000+ 公开 Server 形成网络效应,写一次到处跑
11.3 学习路径
- 阅读 modelcontextprotocol.io 规范 → 跑通 Hello World
- 实现 3 个 Tools + 1 个 Resource → Inspector 验收
- 接入 Cursor → 构建 ChromaDB 知识库 Server
- 切换 HTTP+SSE → Docker 部署 → 监控告警
- 贡献社区 Server 或企业内部 Server 治理
七步 Runbook:从 0 到生产级 MCP Server
步骤 1 — 环境初始化
创建 venv,pip install "mcp[cli]",初始化项目目录与 ALLOWED_DIR 白名单。
步骤 2 — Hello World 验收
编写 say_hello,npx @modelcontextprotocol/inspector 验证 tools/list 与 tools/call。
步骤 3 — 扩展 Tools/Resources/Prompts
按业务需求实现 5 类工具、URI 资源与 Code Review Prompt;Pydantic 校验所有输入。
步骤 4 — 接入 Cursor / Claude Desktop
配置 mcp.json / claude_desktop_config.json,重启 Host,Agent 对话验证端到端调用。
步骤 5 — 单元测试与错误排查
pytest 覆盖核心工具;对照常见错误表修复 stdout 污染与超时问题。
步骤 6 — HTTP+SSE 云端传输
切换 streamable-http,配置 Bearer Token,部署到 Railway/Render/AWS。
步骤 7 — 监控与 launchd 常驻
接入 Prometheus + Sentry;Mac 云节点用 launchd 托管 STDIO 子进程,设置资源上限与日志轮转。
可引用技术要点(2026)
- 协议核心: MCP 基于 JSON-RPC 2.0,三原语 Tools / Resources / Prompts,区别于 REST 的静态端点硬编码。
- 生态规模: 截至 2026 年 6 月,公开 MCP Server 已超过 10,000 个;OpenAI、Google、Microsoft 均已全面采纳。
- 开发效率: 标准化 MCP 接口后,企业 AI 工具集成开发成本降幅 38–55%(行业调研均值);Server 写一次可被 Cursor、Claude Desktop、VS Code 共用。
- 传输选型: 本地 IDE 集成用 STDIO(零网络依赖);远程团队共享用 Streamable HTTP + Bearer Token 认证。
结语与配套资源
从 Function Calling 到 MCP,AI 工具集成终于有了「USB-C 时刻」——写一次 Server,所有兼容 Host 即插即用。本文覆盖了从 Hello World 到 ChromaDB 知识库、从 STDIO 到 HTTP+SSE 的完整路径;下一步,你可以基于业务需求扩展 Tools,或组合官方 filesystem/github/postgres Server 构建企业级 Agent 工具链。
配套资源:
- 协议规范:modelcontextprotocol.io
- Python SDK:github.com/modelcontextprotocol/python-sdk
- TypeScript SDK:github.com/modelcontextprotocol/typescript-sdk
- 调试工具:MCP Inspector
在笔记本或 WSL2 上跑 STDIO MCP Server 可以完成验证,但合盖断线、环境漂移与无 Apple 工具链会让生产级 Agent 难以 7×24 稳定运行。Docker 方案虽灵活,却增加抽象层与排障复杂度,HTTP+SSE 远程模式还需额外维护 TLS 与进程守护。若你需要 Cursor、Claude Desktop 与 MCP Server 长期同机常驻、原生 macOS 与 launchd 托管,租赁 VPSMAC 的 Mac 云节点通常是更省心、更适合 AI 自动化生产环境的选择——工具层写一次,模型随意换,节点始终在线。