若你已读过 MCP 协议解读但还没亲手写过一个 Server,本文以 2026 年 6 月 Anthropic 官方 SDK 与 10,000+ 社区 Server 生态为锚,从 Function Calling → Plugins → MCP 演进脉络出发,手把手完成 Hello World → 五类工具 → 资源与提示词 → HTTP 部署 → 生产监控 全链路。与站内 MCP 协议解读文Cursor Agent Skill 文 互补——前者讲「为什么」,本文讲「怎么做」。
01

什么是 MCP:从 Function Calling 到行业标准,以及它解决的核心痛点

🔌 给 AI 接「手脚」的诉求从 2023 年起爆发,但集成方式经历了三代演进——每一代都在解决上一代留下的碎片问题。

01

Function Calling 时代(2023):OpenAI 率先在 API 层引入 tools 参数,模型输出结构化 JSON 调用外部函数。问题是格式绑定 OpenAI,换 Claude 或 Gemini 需重写适配层。

02

Plugins 时代(2023 中):ChatGPT Plugins 用 OpenAPI 描述 REST 端点,用户通过 Plugin Store 安装。问题是仅限 ChatGPT 生态,且每个 Plugin 需单独审核上架。

03

MCP 时代(2024 至今):Anthropic 于 2024 年 11 月开源 Model Context Protocol,定义 Client/Server 双向 JSON-RPC 通信标准。一次编写,Claude Desktop、Cursor、VS Code、Gemini CLI 均可接入——AI 工具集成领域的 USB-C

04

Anthropic 设计 rationale:将「工具发现」「参数校验」「有状态会话」从各 LLM 厂商私有格式中抽离,Server 只关心暴露什么能力,Client 只关心如何路由给模型——解耦 LLM 与工具层

05

三大能力原语:Tools(模型可调用的函数)、Resources(模型可读取的上下文数据)、Prompts(预置多轮对话模板)——三者构成 MCP Server 的完整暴露面。

Client/Server 架构:Host(如 Cursor)内嵌 MCP Client,与每个 MCP Server 维护独立 1:1 会话。Server 封装数据库、文件系统、HTTP API 等外部系统,通过 tools/listresources/listprompts/list 让 AI 在运行时动态发现能力——无需硬编码工具清单。

传输方式通信模型典型场景
stdiostdin/stdout 管道,JSON-RPC 2.0 帧Claude Desktop、Cursor 本地子进程
HTTP + SSEHTTP POST 发请求,SSE 流式收响应远程云端 Server、多客户端共享
Streamable HTTP单一 HTTP 端点双向流(2025 规范更新)简化部署、兼容 Serverless

生命周期:Client 发起 initialize 握手 → Server 返回能力清单 → Client 发 initialized 通知 → 进入正常工作流(tools/callresources/read 等)→ 会话结束或 Client 断开。全程基于 JSON-RPC 2.0,请求/响应一一对应,通知无需响应。

维度MCPOpenAI FCLangChain Tools
标准化程度开放规范,跨厂商OpenAI 私有格式框架内部抽象,无统一 wire 协议
工具发现运行时 tools/list 动态获取编译时写入 system prompt代码注册,需重启
资源读取原生 Resources 原语无,需自定义 RetrievalRetrieval 链,非标准
提示词模板原生 Prompts 原语PromptTemplate,框架绑定
传输层stdio / HTTP+SSE / Streamable HTTPHTTPS API 内嵌进程内调用
换 LLM 成本Server 零改动重写 tools 格式重写 Tool 包装层

MCP 不是替代 Function Calling,而是把 FC 从「各家 LLM 私有方言」升级为「AI 工具集成的 HTTP」——Server 写一次,Client 到处接。

02

环境准备与 Hello World:Python FastMCP 从零到 Inspector 验证

🛠️ 2026 年 MCP 官方 SDK 已覆盖 Python 与 TypeScript 两大生态。本文以 Python FastMCP 为主(代码更短),TypeScript 对照见文末说明。

语言SDK 包特点
Pythonmcp(含 FastMCP)装饰器注册工具,Pydantic 自动校验,async 原生
TypeScript@modelcontextprotocol/sdk与 Node/IDE 插件同栈,类型安全
01

创建虚拟环境:python3 -m venv .venv && source .venv/bin/activate(Windows 用 .venv\Scripts\activate)。Python 建议 3.10+

02

安装依赖:pip install "mcp[cli]"——含 FastMCP 框架与 MCP Inspector 启动器。

03

项目结构:

bash
my-mcp-server/
├── pyproject.toml
├── server.py
├── tools/
│   ├── __init__.py
│   └── calculator.py
└── tests/
    └── test_tools.py
04

FastMCP Hello World:最小可运行 Server,暴露一个 greet 工具。

Python
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-mcp")

@mcp.tool()
def greet(name: str) -> str:
    return f"Hello, {name}! MCP Server is running."

if __name__ == "__main__":
    mcp.run()
05

MCP Inspector 调试:终端运行 npx @modelcontextprotocol/inspector python server.py,浏览器打开 Inspector UI,可手动调用 tools/listtools/call,无需接 Claude。

06

Claude Desktop 配置:编辑 ~/Library/Application Support/Claude/claude_desktop_config.json

JSON
{
  "mcpServers": {
    "hello-mcp": {
      "command": "python",
      "args": ["/absolute/path/to/server.py"]
    }
  }
}
07

Cursor 配置:Settings → MCP → 添加上述 JSON 片段(Cursor 与 Claude Desktop 共用 mcpServers 格式)。重启 IDE 后在 Agent 模式输入「用 greet 工具向 KVMNODE 问好」验证。

提示:路径必须用绝对路径;虚拟环境的 python 也需写全路径(如 /path/.venv/bin/python),否则 Claude Desktop 找不到依赖。

03

Tools、Resources 与 Prompts:五类实战工具与知识库原语

⚡ MCP Server 的价值在于暴露真实业务能力。下面从工具结构出发,实现五类常见工具,再扩展到 Resources 与 Prompts。

Tool 结构:每个工具包含 namedescription(供 LLM 理解何时调用)、inputSchema(JSON Schema 描述参数)。FastMCP 用 Python 类型注解 + Pydantic 自动生成 Schema——参数类型错误在 Server 端即被拦截,不会浪费 Token。

Python
from pydantic import Field
import httpx
import sqlite3
from datetime import datetime, timezone

@mcp.tool()
def calculator(expression: str) -> str:
    allowed = set("0123456789+-*/(). ")
    if not all(c in allowed for c in expression):
        raise ValueError("Invalid characters in expression")
    return str(eval(expression))

@mcp.tool()
def read_file(path: str) -> str:
    with open(path, "r", encoding="utf-8") as f:
        return f.read()

@mcp.tool()
def write_file(path: str, content: str) -> str:
    with open(path, "w", encoding="utf-8") as f:
        f.write(content)
    return f"Written {len(content)} chars to {path}"

@mcp.tool()
async def fetch_url(url: str) -> str:
    async with httpx.AsyncClient(timeout=30) as client:
        resp = await client.get(url)
        resp.raise_for_status()
        return resp.text[:8000]

@mcp.tool()
def query_db(sql: str, db_path: str = "data.db") -> str:
    if not sql.strip().upper().startswith("SELECT"):
        raise ValueError("Only SELECT queries allowed")
    conn = sqlite3.connect(db_path)
    rows = conn.execute(sql).fetchall()
    conn.close()
    return str(rows)

@mcp.tool()
def current_time(tz: str = "UTC") -> str:
    return datetime.now(timezone.utc).isoformat()
工具类型关键设计点
calculator同步白名单字符校验,防注入
read_file / write_file同步 I/O路径沙箱建议限制在 workspace 目录
fetch_urlasync + httpx超时 30s,截断 8000 字符防 Token 爆炸
query_db同步仅允许 SELECT,防删库
current_time同步解决 LLM 训练数据截止问题

错误处理:工具内 raise ValueError(...)raise httpx.HTTPStatusError,FastMCP 自动包装为 JSON-RPC error 返回 Client——LLM 收到错误描述后可修正参数重试。生产环境建议统一错误码映射,避免泄露内部路径。

Resources(资源):与 Tools 不同,Resources 是只读上下文,AI 通过 resources/read 拉取内容注入对话。分静态与动态两类:

类型URI 示例说明
静态file:///docs/api-guide.md启动时注册,内容不变
动态metrics://cpu/current每次 read 实时生成
模板 URIdb://tables/{name}/schema参数化,Client 填占位符
Python
@mcp.resource("config://app/settings")
def app_settings() -> str:
    return open("settings.json").read()

@mcp.resource("logs://recent/{lines}")
def recent_logs(lines: str) -> str:
    n = min(int(lines), 500)
    with open("/var/log/app.log") as f:
        return "".join(f.readlines()[-n:])

社区 @modelcontextprotocol/server-filesystem 是 Resources 最佳实践——按目录树暴露文件,Client 先 resources/list 浏览再 resources/read 按需加载,比一次性塞全文进 prompt 省 Token。

Prompts(提示词模板):预置多轮 PromptMessage 序列,Client 通过 prompts/get 获取后直接注入对话——适合标准化工作流(代码审查、SQL 生成、Incident 报告)。

Python
from mcp.types import PromptMessage, TextContent

@mcp.prompt()
def code_review(language: str, focus: str = "security") -> list[PromptMessage]:
    return [
        PromptMessage(role="user", content=TextContent(
            type="text",
            text=f"Review this {language} code focusing on {focus}. "
                 f"Use read_file tool to load the target, then list issues by severity."
        )),
        PromptMessage(role="assistant", content=TextContent(
            type="text",
            text=f"I'll review the {language} code with emphasis on {focus}. "
                 f"Please provide the file path."
        )),
    ]
04

HTTP 传输、鉴权、调试与单元测试

🌐 本地 stdio 验证通过后,上线需切换到 HTTP 传输以支持远程 Client、多实例与鉴权。

维度stdioHTTP + SSEStreamable HTTP
部署复杂度零配置需 Web 服务器 + SSE 端点单端点,更简单
网络可达仅本机子进程跨网络跨网络
鉴权进程隔离即安全边界Bearer Token / API Key同左
水平扩展不支持支持负载均衡支持
适用阶段开发调试生产(传统)生产(2025+ 推荐)
Python
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my-server", host="0.0.0.0", port=8080)

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

鉴权与安全:生产 HTTP Server 必须加防护层——

01

Bearer Token:Client 请求头 Authorization: Bearer <token>,Server middleware 校验 JWT 或静态 Token。

02

API Key:Header X-API-Key 或 query param,适合服务间调用。

03

CORS:若 Browser-based Client 直连,配置 Access-Control-Allow-Origin 白名单。

04

Rate Limit:nginx 或 middleware 限制每 IP/Token 每分钟请求数,防 LLM 循环调用打爆后端。

MCP Inspector 调试技巧:① 先用 Inspector 单独测 Server,确认 tools/list 返回预期;② 检查 inputSchema 是否与函数签名一致;③ 用 Inspector 的 Notifications 面板观察 Server 主动推送;④ 对比 Claude Desktop 日志(~/Library/Logs/Claude/)定位连接失败。

Python
import pytest
from server import calculator

def test_calculator_basic():
    assert calculator("2 + 3") == "5"

def test_calculator_rejects_injection():
    with pytest.raises(ValueError):
        calculator("__import__('os').system('rm -rf /')")

def test_calculator_division():
    assert calculator("10 / 4") == "2.5"
常见错误原因解决方案
Server 启动后立即退出未调用 mcp.run() 或 import 报错终端直接 python server.py 看 stderr
Claude Desktop 看不到工具config.json 路径错误或 JSON 语法错校验绝对路径;重启 Claude
tools/call 返回 schema 错误参数类型与注解不匹配Inspector 查看 inputSchema vs 实际传参
HTTP 502 / 连接超时端口未暴露或防火墙拦截curl localhost:8080/mcp 先测连通
Permission denied 读文件进程用户无权限调整文件权限或限制 sandbox 目录
Token 超限工具返回过大 payload截断输出(如 fetch_url 限 8000 字符)
05

生产部署、个人知识库 MCP 与 2026 生态展望

🚀 从 Hello World 到生产级 Server,差距在可靠性、观测性与安全边界。下面给出 Docker 化部署、监控方案、知识库实战项目与生态推荐。

部署平台适合场景注意事项
Docker + VPS完全掌控、内网访问自行管理 TLS 与备份
Railway / Render快速上线、按量计费冷启动延迟、无持久卷
AWS ECS / GCP Cloud Run企业级 SLA配置复杂,适合已有云账号团队
KVMNODE 云 MacApple 生态工具 + MCP 同池独占节点、7×24、快照回滚

监控四件套:结构化日志(JSON Lines + 请求 ID)、Prometheus metrics(tools_call_totaltools_call_duration_seconds)、Sentry 异常追踪、/health 端点供负载均衡探活。

版本管理:Server 版本号写入 initialize 响应的 serverInfo.version;Breaking change 时递增 major,Client 可据此决定是否兼容。Git tag 与 Docker image tag 对齐。

实战项目:个人知识库 MCP 🧠——将本地 Markdown/代码库向量化,暴露 searchindexwrite 三个工具,让 Cursor Agent 直接检索你的私有文档。

Python
import chromadb
from watchfiles import awatch
from sentence_transformers import SentenceTransformer

client = chromadb.PersistentClient(path="./chroma_db")
collection = client.get_or_create_collection("knowledge")
embedder = SentenceTransformer("all-MiniLM-L6-v2")

@mcp.tool()
def search_knowledge(query: str, top_k: int = 5) -> str:
    embedding = embedder.encode(query).tolist()
    results = collection.query(query_embeddings=[embedding], n_results=top_k)
    return str(results["documents"])

@mcp.tool()
def index_document(path: str) -> str:
    content = open(path).read()
    doc_id = path.replace("/", "_")
    collection.upsert(
        ids=[doc_id],
        documents=[content],
        embeddings=[embedder.encode(content).tolist()],
    )
    return f"Indexed {path} ({len(content)} chars)"

async def watch_and_reindex(directory: str):
    async for changes in awatch(directory):
        for change in changes:
            if change[1].endswith((".md", ".py", ".ts")):
                index_document(change[1])

向量库可选 ChromaDB(嵌入式、零运维)或 Qdrant(分布式、高性能)。watchfiles 监听目录变更自动 re-index——Agent 写入新文档后立即可搜。

2026 推荐 MCP Server 清单:

Server能力场景
@modelcontextprotocol/server-filesystem文件读写本地代码库操作
@modelcontextprotocol/server-githubPR/Issue/RepoDevOps 自动化
@modelcontextprotocol/server-brave-searchWeb 搜索实时信息检索
@modelcontextprotocol/server-postgresSQL 查询数据分析 Agent
@modelcontextprotocol/server-slack消息发送团队通知 Bot

2026 趋势:MCP Marketplace(Anthropic 与社区目录已收录 10,000+ Server)、企业 SSO + RBAC 鉴权层、Streamable HTTP 成为默认远程传输、Multi-server orchestration(一个 Agent 同时连 GitHub + Postgres + 自研 Server)。

01

容器化打包:编写 Dockerfile,pip install 依赖,CMD ["python", "server.py"],本地 docker build && docker run -p 8080:8080 验证。

02

切换 Streamable HTTP:mcp.run(transport="streamable-http"),配置 host="0.0.0.0" 监听所有接口。

03

加鉴权中间件:部署前接入 Bearer Token 校验与 Rate Limit,拒绝未授权 tools/call

04

部署到目标平台:Railway/Render 一键 Docker 部署;企业内网上 VPS 或 KVMNODE 云 Mac,配置 TLS 反向代理(Caddy/nginx)。

05

接入监控:挂载 Prometheus exporter、Sentry DSN、结构化日志输出;配置 /health 探活。

06

Client 配置与灰度:Claude Desktop / Cursor MCP 配置改为 HTTP URL;先小流量验证 tools/list 与核心工具,再全量切换。操作细节见 帮助中心

A

MCP 生态规模(2026 年 6 月):社区目录已收录 10,000+ MCP Server,覆盖文件、数据库、搜索、DevOps 等 200+ 类别(来源:modelcontextprotocol.io / PulseMCP 2026-06)。

B

四大厂商全面入局:Anthropic 开源规范、OpenAI 2025 年 3 月宣布 Agents SDK 原生支持 MCP、Google Gemini CLI 内置 MCP Client、Microsoft Copilot Studio 2025 Q4 接入——N×M 困境正式进入收敛期(来源:各厂商官方博客 2025–2026)。

C

企业安全要求:Gartner 2026 预测 40% 的企业 AI Agent 部署将在 Q4 前引入 MCP 标准化工具层,同时 80% 的企业 IT 部门将 MCP Server 纳入零信任审计范围(来源:Gartner AI Infrastructure 2026 展望)。

摊开替代方案:在笔记本上 7×24 跑 MCP Server 合盖即断、系统更新中断会话;Serverless 冷启动 导致 Agent 首次工具调用延迟 5–15 秒;与 iOS CI 共用一台 Mac 端口与依赖冲突风险高。对需要 Apple Silicon 宿主、内网资源访问、以及把 MCP Server 与 Cursor Agent / Xcode CI 分开的团队,在 KVMNODE 租赁独占 Mac Mini M4 / M4 Pro 往往是更优解:Docker 化 Server 跑在独占节点,按天/周/月弹性、快照回滚。档位见 定价页订购入口 可在本周把 MCP 实验环境从个人笔记本迁出。