MCP 协议与 AI 工具生态

什么是 MCP?

MCP(Model Context Protocol)是 Anthropic 在 2024 年底推出的一个开放标准协议,目标是让 AI 模型能够以统一的方式连接各种外部数据源和工具。

可以把 MCP 理解为 AI 世界的”USB 接口”——有了这个统一标准,任何工具只需实现一次 MCP 接口,就能被所有支持 MCP 的 AI 客户端(Claude、Cursor、Zed 等)直接使用,不需要为每个 AI 应用单独开发适配层。


MCP 架构

┌─────────────────────────────────────────┐
│ MCP 架构 │
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ AI 应用 │◄──────►│ MCP Server │ │
│ │(Claude等) │ MCP │ (工具提供方) │ │
│ └──────────┘ 协议 └──────────────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ 外部资源 │ │
│ │ 数据库/API │ │
│ │ 文件系统 │ │
│ └────────────┘ │
└─────────────────────────────────────────┘

三个核心角色:

  • MCP Host:AI 应用程序(如 Claude Desktop、Cursor)
  • MCP Client:内嵌在 Host 中,负责与 Server 通信
  • MCP Server:工具/数据提供方,暴露资源和能力

MCP 提供的三类能力

1. Tools(工具)

AI 可以主动调用的函数,例如执行代码、发送请求:

# MCP Server 定义一个工具
@server.tool("run_python")
async def run_python(code: str) -> str:
"""执行 Python 代码并返回结果"""
result = subprocess.run(
["python", "-c", code],
capture_output=True, text=True
)
return result.stdout or result.stderr

2. Resources(资源)

AI 可以读取的数据,类似于”只读文件”:

# 暴露一个资源:当前项目的文件列表
@server.resource("file://project/structure")
async def get_project_structure() -> str:
return json.dumps(get_all_files("./src"))

3. Prompts(提示词模板)

预定义的提示词,可以被 AI 应用调用:

@server.prompt("code_review")
async def code_review_prompt(code: str) -> str:
return f"""请对以下代码进行专业的代码审查:
- 检查潜在的 bug
- 评估代码可读性
- 提出优化建议

代码内容:
{code}"""

搭建一个简单的 MCP Server

使用官方 Python SDK:

pip install mcp
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types

server = Server("my-tools")

@server.list_tools()
async def list_tools():
return [
types.Tool(
name="get_time",
description="获取当前时间",
inputSchema={
"type": "object",
"properties": {
"timezone": {
"type": "string",
"description": "时区,如 Asia/Shanghai"
}
}
}
)
]

@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "get_time":
from datetime import datetime
import pytz
tz = pytz.timezone(arguments.get("timezone", "Asia/Shanghai"))
now = datetime.now(tz)
return [types.TextContent(
type="text",
text=f"当前时间:{now.strftime('%Y-%m-%d %H:%M:%S %Z')}"
)]

if __name__ == "__main__":
import asyncio
asyncio.run(stdio_server(server))

在 Claude Desktop 中配置:

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json

{
"mcpServers": {
"my-tools": {
"command": "python",
"args": ["/path/to/my_server.py"]
}
}
}

主流 MCP Server 生态

官方和社区已经提供了大量现成的 MCP Server:

MCP Server 功能
filesystem 读写本地文件
github 操作 GitHub 仓库、Issues、PR
postgres 查询 PostgreSQL 数据库
brave-search 调用 Brave 搜索引擎
slack 收发 Slack 消息
puppeteer 控制浏览器自动化
memory 持久化的 KV 记忆存储

MCP vs Function Calling

很多人会问 MCP 和 OpenAI 的 Function Calling 有什么区别:

对比项 Function Calling MCP
定义方式 每次请求内嵌工具定义 独立 Server,复用性强
适用范围 单个模型/API 跨模型、跨应用
工具发现 手动维护 动态发现
状态管理 无状态 支持有状态连接
生态 OpenAI 生态 开放标准,多方参与

MCP 更像是工具的平台化,一次接入,处处可用。


实际使用体验

目前在 Cursor 里配合 MCP 使用效果很好,配置了以下几个 Server:

  1. filesystem — 让 AI 直接读写项目文件,不用反复粘贴代码
  2. github — 直接查看 PR、Issue,省去来回切换窗口
  3. memory — 跨对话保持上下文,记住项目的关键约定

整体感受是:MCP 让 AI 从”聊天工具”变成了真正能”干活”的助手。期待生态继续丰富,特别是企业内网数据源的接入方案。