MCP(Model Context Protocol)是Anthropic于2024年底提出的开放标准协议,目标是解决AI模型与外部工具和数据源之间的标准化连接问题。到了2026年,MCP已经成为AI工具集成的事实标准。
为什么需要MCP
在MCP出现之前,每个AI应用要连接外部工具,都需要编写专门的适配代码。比如连接GitHub需要一套代码,连接Slack又需要另一套代码。MCP通过定义统一的协议标准,实现了”一次开发,处处连接”。
MCP的核心架构
MCP采用客户端-服务器架构:
- MCP Host(宿主):AI应用程序,如Claude Desktop、Cursor等
- MCP Client(客户端):宿主中负责与服务器通信的组件
- MCP Server(服务器):你开发的工具接口,暴露特定功能给AI
MCP服务器可以提供三种能力:
- Tools(工具):AI可以调用的函数(如搜索、计算、API调用)
- Resources(资源):AI可以读取的数据(如文件、数据库记录)
- Prompts(提示):预定义的交互模板
更多关于MCP协议的基础知识,可以参考MCP协议入门教程和MCP完全指南。
二、Python SDK安装与环境配置
MCP官方提供了Python和TypeScript两种SDK。本文使用Python SDK进行开发。
环境准备
# 创建虚拟环境
python -m venv mcp-env
source mcp-env/bin/activate # Windows: mcp-env\Scripts\activate
# 安装MCP SDK
pip install mcp[cli]
# 验证安装
mcp --version
项目结构
建议按以下结构组织项目:
my-mcp-server/
├── server.py # 主服务器文件
├── tools/ # 工具定义
│ ├── __init__.py
│ ├── search.py
│ └── calculator.py
├── resources/ # 资源定义
│ ├── __init__.py
│ └── data.py
├── requirements.txt
└── mcp_config.json # 客户端配置
三、创建基础MCP服务器
让我们从一个最简单的MCP服务器开始,然后逐步添加功能。
最小可运行服务器
# server.py
from mcp.server.fastmcp import FastMCP
# 创建MCP服务器实例
mcp = FastMCP("my-first-server")
@mcp.tool()
def hello(name: str) -> str:
"""向用户打招呼"""
return f"你好,{name}!欢迎使用MCP服务器。"
@mcp.tool()
def add(a: int, b: int) -> int:
"""计算两个数的和"""
return a + b
if __name__ == "__main__":
mcp.run(transport="stdio")
运行与测试
使用MCP Inspector进行测试:
# 安装Inspector
npx @modelcontextprotocol/inspector python server.py
Inspector会在浏览器中打开一个调试界面,你可以看到所有注册的工具,并手动调用它们查看返回结果。
在Claude Desktop中配置
编辑Claude Desktop的配置文件:
{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
重启Claude Desktop后,AI就能自动发现并使用你定义的工具了。
四、工具定义详解
工具(Tools)是MCP服务器最核心的能力。一个好的工具定义能让AI准确地理解何时以及如何使用它。
工具参数与类型
from mcp.server.fastmcp import FastMCP
from pydantic import BaseModel, Field
from typing import Optional
mcp = FastMCP("advanced-tools-server")
class SearchParams(BaseModel):
query: str = Field(description="搜索关键词")
max_results: int = Field(default=10, description="最大结果数量")
category: Optional[str] = Field(default=None, description="搜索类别")
@mcp.tool()
def search_documents(params: SearchParams) -> str:
"""搜索文档库中的内容。
当用户需要查找特定信息、文档或资料时使用此工具。
支持关键词搜索和类别过滤。
"""
# 实际实现中调用搜索引擎
results = document_search(
query=params.query,
max_results=params.max_results,
category=params.category
)
return format_results(results)
错误处理最佳实践
@mcp.tool()
def fetch_url(url: str) -> str:
"""获取指定URL的网页内容"""
try:
import httpx
async with httpx.AsyncClient() as client:
response = await client.get(url, timeout=10)
response.raise_for_status()
return response.text[:5000] # 限制返回长度
except httpx.TimeoutException:
return "错误:请求超时,请检查URL是否正确"
except httpx.HTTPStatusError as e:
return f"错误:HTTP {e.response.status_code},无法访问该页面"
except Exception as e:
return f"错误:{str(e)}"
工具描述的重要性
工具的描述(docstring)是AI决定是否调用该工具的关键依据。好的描述应该包含:
- 做什么:工具的功能说明
- 何时用:什么情况下应该使用这个工具
- 参数说明:每个参数的含义和格式要求
- 返回值:返回结果的格式和内容
五、资源暴露(Resources)
资源(Resources)让AI能够读取特定的数据,与工具的区别在于资源是只读的、被动提供的数据。
定义静态资源
@mcp.resource("config://app-settings")
def get_app_settings() -> str:
"""获取应用配置信息"""
return json.dumps({
"version": "2.0.0",
"features": ["search", "analytics", "export"],
"limits": {"max_queries": 1000, "max_file_size": "10MB"}
})
定义动态资源
@mcp.resource("data://users/{user_id}/profile")
def get_user_profile(user_id: str) -> str:
"""获取指定用户的个人信息"""
# 从数据库查询用户信息
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
if not user:
return "用户不存在"
return json.dumps({
"name": user.name,
"email": user.email,
"role": user.role
})
资源模板
资源模板允许使用URI参数来动态生成资源内容,非常适合数据库查询类场景:
@mcp.resource("db://table/{table_name}/row/{row_id}")
def get_database_row(table_name: str, row_id: str) -> str:
"""从数据库获取指定行数据"""
allowed_tables = ["users", "orders", "products"]
if table_name not in allowed_tables:
return f"不支持的表名:{table_name}"
row = db.fetch_one(f"SELECT * FROM {table_name} WHERE id = ?", row_id)
return json.dumps(row) if row else "记录不存在"
六、客户端集成
开发完MCP服务器后,需要让各种AI客户端能够连接到它。
与Claude Desktop集成
编辑配置文件 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"my-server": {
"command": "python",
"args": ["/path/to/server.py"],
"env": {
"API_KEY": "your-api-key",
"DATABASE_URL": "sqlite:///data.db"
}
}
}
}
与Cursor集成
在Cursor设置中添加MCP服务器配置:
{
"mcp": {
"servers": {
"my-server": {
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
}
编程方式集成
如果你开发自己的AI应用,可以用MCP客户端SDK连接服务器:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="python",
args=["server.py"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print(f"可用工具: {[t.name for t in tools.tools]}")
# 调用工具
result = await session.call_tool(
"search_documents",
arguments={"query": "MCP协议", "max_results": 5}
)
print(result.content[0].text)
七、MCP与Function Calling对比
很多开发者会问:MCP和OpenAI的Function Calling有什么区别?
核心差异
| 维度 | MCP | Function Calling |
|---|---|---|
| 架构 | 客户端-服务器分离 | 集成在API请求中 |
| 标准化 | 开放标准协议 | 供应商专有 |
| 工具发现 | 自动发现(服务器声明) | 手动定义(每次请求传入) |
| 跨平台 | 支持多种AI客户端 | 仅限特定模型API |
| 持久化 | 服务器长期运行 | 无状态,每次请求重新定义 |
| 资源支持 | 支持资源和提示模板 | 仅支持函数调用 |
| 安全隔离 | 独立进程运行 | 运行在应用进程中 |
何时用MCP,何时用Function Calling
用MCP的场景:
- 需要跨多个AI客户端共享同一套工具
- 工具需要维护状态(如数据库连接、会话)
- 需要暴露数据资源而不仅仅是函数
- 追求工具代码的复用性和可维护性
用Function Calling的场景:
- 简单的单次工具调用
- 工具逻辑与业务紧密耦合
- 不需要跨平台共享
- 追求最低延迟(无进程间通信开销)
八、常见问题解答(FAQ)
Q:MCP服务器支持哪些传输方式?
A:目前MCP支持两种传输方式:1) stdio(标准输入输出)——服务器作为子进程运行,通过stdin/stdout通信,适合本地部署;2) SSE(Server-Sent Events)——通过HTTP传输,适合远程部署和多客户端共享场景。2026年最新的Streamable HTTP传输也在逐步推广中。
Q:如何保证MCP服务器的安全性?
A:几个关键措施:1) 不要在服务器代码中硬编码敏感信息,使用环境变量;2) 对工具参数做严格的类型校验和边界检查;3) 限制资源的访问范围(如只允许查询特定表);4) 使用OAuth 2.1进行远程服务器的身份认证;5) 记录所有工具调用的日志,便于审计。
Q:MCP服务器能用TypeScript开发吗?
A:完全可以。MCP官方同时提供Python和TypeScript SDK。TypeScript版本使用@modelcontextprotocol/sdk包,API设计与Python版本类似。选择哪种语言取决于你的技术栈偏好——如果你的AI应用是Node.js生态,用TypeScript更方便集成。
Q:一个MCP服务器可以暴露多少个工具?
A:技术上没有限制,但建议每个服务器的工具数量控制在10-20个以内。过多的工具会让AI在选择时产生困惑,降低调用准确率。如果功能较多,建议拆分为多个专门的MCP服务器(如搜索服务器、数据库服务器、API服务器),每个服务器职责单一。
总结
MCP协议为AI工具集成提供了优雅而强大的标准化方案。通过本文的实战教程,你已经掌握了从创建基础服务器到定义复杂工具、从暴露数据资源到客户端集成的完整开发流程。
在实际项目中,建议遵循”小而专”的原则——每个MCP服务器专注于一个领域,提供精炼的工具集。这样不仅便于维护,也能让AI更准确地选择和使用工具。更多关于AI开发的技术文章,可以参考AI工具合集2026。