本文将深入解析MCP的架构设计、核心概念、开发实践和生态现状,帮助你理解这项技术并开始构建自己的MCP服务器。
MCP是什么?
定义与定位
MCP(Model Context Protocol)是一个开放协议,旨在标准化AI模型(LLM)与外部数据源、工具之间的连接方式。可以把它类比为AI领域的"USB-C接口"——不管是什么模型、什么工具,只要支持MCP协议,就能即插即用。
解决的核心问题
在MCP出现之前,每个AI应用都需要为不同的工具编写特定的集成代码:
这导致了大量的重复开发。MCP将这些集成统一为一套标准协议,开发者只需编写一次MCP服务器,所有支持MCP的AI客户端都能使用。
架构设计
核心组件
MCP采用客户端-服务器架构:
AI客户端(Cursor/Claude/ChatGPT)
↕ MCP协议(JSON-RPC over stdio/SSE)
MCP客户端(内置于AI应用中)
↕
MCP服务器(你开发的工具集成)
↕
外部系统(数据库/API/文件系统)三种能力类型
MCP服务器可以提供三种类型的能力:
1. Tools(工具)
让AI能够执行操作,如查询数据库、调用API、操作文件:
{
"name": "query_database",
"description": "执行SQL查询并返回结果",
"inputSchema": {
"type": "object",
"properties": {
"sql": {"type": "string", "description": "SQL查询语句"}
},
"required": ["sql"]
}
}2. Resources(资源)
让AI能够读取数据,如文件内容、API响应、数据库记录:
{
"uri": "file:///project/src/main.ts",
"name": "main.ts",
"description": "项目主入口文件",
"mimeType": "text/typescript"
}3. Prompts(提示模板)
预定义的提示词模板,帮助用户快速发起特定任务:
{
"name": "code_review",
"description": "代码审查提示模板",
"arguments": [
{"name": "language", "description": "编程语言"}
]
}开发实战
使用TypeScript开发MCP服务器
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server(
{ name: "my-mcp-server", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// 注册工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "get_weather",
description: "获取指定城市的天气信息",
inputSchema: {
type: "object",
properties: {
city: { type: "string", description: "城市名称" }
},
required: ["city"]
}
}
]
}));
// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
if (name === "get_weather") {
const city = args.city;
// 实际调用天气API
const weather = await fetchWeather(city);
return {
content: [{ type: "text", text: JSON.stringify(weather) }]
};
}
});
// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);使用Python开发MCP服务器
from mcp import Server
from mcp.types import Tool, TextContent
server = Server("my-mcp-server")
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="search_docs",
description="搜索技术文档",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string", "description": "搜索关键词"}
},
"required": ["query"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "search_docs":
results = await search_documents(arguments["query"])
return [TextContent(type="text", text=json.dumps(results))]
if __name__ == "__main__":
import asyncio
from mcp.server.stdio import stdio_server
async def main():
async with stdio_server() as (read, write):
await server.run(read, write)
asyncio.run(main())MCP生态现状
主要客户端
| 客户端 | 支持状态 | 特色 |
|--------|---------|------|
| Claude Desktop | 原生支持 | 首个支持MCP的客户端 |
| Cursor | 原生支持 | 编程场景深度集成 |
| TRAE | 原生支持 | 支持远程MCP和技能系统 |
| Windsurf | 原生支持 | AI编程IDE |
| ChatGPT | 支持中 | OpenAI宣布采纳MCP |
| Gemini | 支持中 | Google宣布采纳MCP |
热门MCP服务器
| 服务器 | 功能 | Stars |
|--------|------|-------|
| filesystem | 文件系统读写 | 15K+ |
| github | GitHub仓库操作 | 12K+ |
| postgres | PostgreSQL查询 | 8K+ |
| puppeteer | 浏览器自动化 | 7K+ |
| slack | Slack消息管理 | 5K+ |
| sqlite | SQLite数据库 | 4K+ |
远程MCP(2026年新特性)
2026年,MCP引入了远程服务器支持,不再局限于本地stdio传输:
最佳实践
1. 工具设计原则
2. 安全考虑
3. 性能优化
MCP vs Function Calling
很多人会问:MCP和Function Calling有什么区别?
| 维度 | Function Calling | MCP |
|------|-----------------|-----|
| 定义方式 | 在API请求中定义 | 在独立服务器中定义 |
| 复用性 | 每个应用单独定义 | 一次定义,处处可用 |
| 运行环境 | 在AI服务端执行 | 在本地或远程服务器执行 |
| 交互方式 | 一次性调用 | 持久连接,支持流式 |
| 生态 | 各厂商私有 | 开放标准 |
简单来说,Function Calling是MCP的子集——MCP提供了更标准、更可复用、更安全的方式来连接AI和工具。
总结
MCP正在成为AI应用开发的基础设施层。它通过标准化的协议,解决了AI模型与外部系统连接的碎片化问题。对于开发者来说,掌握MCP开发技能将成为2026年AI开发者的核心竞争力之一。
推荐学习路径:
官方资源:
💬 评论区 (0)
暂无评论,快来抢沙发吧!