引言:为什么需要 MCP?

当我们构建 AI Agent 时,一个核心问题是:大语言模型如何与外部世界安全、标准地交互?

过去,每个 AI 应用都需要自行实现工具调用逻辑 —— 网页搜索、数据库查询、文件操作、API 集成……这些功能在不同框架中重复造轮子,且互不兼容。Anthropic 提出的 Model Context Protocol (MCP) 正是为了解决这个问题:它定义了一套开放标准,让 LLM 能够以统一的方式连接各种数据源和工具。

本文将从协议设计、架构原理到实战部署,带你全面理解 MCP。

一、MCP 协议核心设计理念

1.1 客户端-服务器架构

MCP 采用经典的 Host - Client - Server 三层架构:

  • Host:宿主应用,如 IDE、AI 助手桌面端,负责协调 LLM 与多个 MCP Server 的连接
  • Client:客户端,在 Host 内部维护与 Server 的通信会话
  • Server:服务提供者,暴露特定的工具(Tools)、资源(Resources)和提示(Prompts)

1.2 JSON-RPC 2.0 通信协议

MCP 底层基于 JSON-RPC 2.0 协议,支持两种传输方式:

  • stdio:标准输入输出,适合本地进程间通信
  • SSE (Server-Sent Events):基于 HTTP 的服务器推送,适合远程服务部署

1.3 三大核心原语

MCP 定义了三种核心能力,Agent 通过它们与外部系统交互:

原语说明典型示例
Tools(工具)LLM 可调用的函数搜索网页、执行SQL、发送邮件
Resources(资源)可读取的数据源文件内容、数据库记录、API响应
Prompts(提示)预定义的提示模板代码审查、数据摘要模板

二、MCP 与 Function Calling 的关系

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

简单来说,Function Calling 是 LLM 输出结构化意图的能力,而 MCP 是 意图到执行之间缺失的那一层标准化协议。Function Calling 告诉你"该调用什么",MCP 规定了"怎么找到并调用它"。

打个比方:Function Calling 像是知道"我要打车",MCP 则是网约车平台的统一调度系统 —— 它让不同的"车辆"(工具/服务)以标准化的方式接入。

三、实战:用 Python 构建一个 MCP Server

下面我们动手创建一个简单的天气查询 MCP Server,完整演示开发流程。

3.1 环境准备

pip install mcp httpx

3.2 服务端实现

import httpx
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent

app = Server("weather-mcp")

@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="get_weather",
            description="获取指定城市的实时天气",
            inputSchema={
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "get_weather":
        city = arguments["city"]
        async with httpx.AsyncClient() as client:
            # 调用第三方天气API
            resp = await client.get(
                f"https://wttr.in/{city}?format=j1"
            )
            data = resp.json()
            current = data["current_condition"][0]
            result = f"{city} 当前天气:{current['weatherDesc'][0]['value']},温度 {current['temp_°C']}°C,湿度 {current['humidity']}%"
            return [TextContent(type="text", text=result)]

async def main():
    async with stdio_server() as (read_stream, write_stream):
        await app.run(read_stream, write_stream, app.create_initialization_options())

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

3.3 客户端调用

from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession

async def query_weather():
    async with streamablehttp_client("http://localhost:8000/mcp") as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            
            # 列出可用工具
            tools = await session.list_tools()
            print("可用工具:", [t.name for t in tools.tools])
            
            # 调用工具
            result = await session.call_tool("get_weather", {"city": "北京"})
            print("结果:", result.content[0].text)

四、MCP 的安全考量

MCP 在设计时就高度关注安全性,核心原则包括:

4.1 用户知情同意

任何 Tool 调用都必须经过用户的明确确认,Server 不能擅自执行高风险操作。

4.2 最小权限原则

Server 只暴露必要的能力范围,客户端可以限制资源访问的边界。

4.3 数据隔离

MCP 不要求 LLM 直接访问原始数据,Server 可以在代理层做脱敏和过滤。

4.4 传输安全

生产环境中推荐使用 TLS 加密传输,本地开发可使用 stdio 避免网络暴露。

五、生产环境最佳实践

5.1 Server 设计原则

  • 单一职责:每个 Server 聚焦一类功能(数据库、搜索、通知等)
  • 幂等设计:工具调用应可重复执行而不产生副作用
  • 超时控制:设置合理的超时时间,避免长时间阻塞
  • 错误友好:返回结构化错误信息,让 LLM 能理解和恢复

5.2 性能优化

  • 使用连接池复用外部 API 连接
  • 对高频查询结果做缓存
  • 合理设置 Tool 列表大小,超过 20 个工具时考虑分组加载

5.3 监控与可观测性

  • 记录每次 Tool 调用的耗时、成功率和 token 消耗
  • 设置异常告警(频繁超时、权限错误等)
  • 追踪用户行为模式,优化工具设计

六、MCP 生态现状与未来

截至 2025 年下半年,MCP 生态已初具规模:

  • 官方 SDK:Python、TypeScript、Java、Rust、Go 等多语言实现
  • 主流框架支持:Claude Desktop、Cursor、Windsurf、Cline 等 IDE 已原生集成
  • 开源 Server 仓库:GitHub 上已有 PostgreSQL、Slack、GitHub、Google Drive 等数十种官方和社区的 Server 实现
  • 云服务商:AWS、Google Cloud 均在探索 MCP 的云端托管方案

MCP 正在成为 AI Agent 工具调用的事实标准。随着更多厂商的加入和协议的演进,我们有理由相信,未来的 AI 应用开发将呈现出"写一次 Tool,到处可接入"的理想图景。

七、总结

MCP 协议填补了 LLM 应用生态中工具调用标准化的空白:

  • 它用 JSON-RPC 2.0 定义了统一的通信格式
  • 通过 Host-Client-Server 架构实现了安全的解耦设计
  • 三大原语(Tools、Resources、Prompts)覆盖了 Agent 与外部世界交互的核心需求
  • 开源生态正在快速壮大,主流 IDE 和框架已广泛支持

对于 AI 应用开发者而言,理解并拥抱 MCP 将是构建下一代 Agent 应用的必备技能。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部