在过去两年里,AI 应用生态饱受“工具碎片化”之苦:OpenAI 推出一套 Function Calling 规范,LangChain 有一套 Tools 封装,各个 IDE 和开源框架也各自维护私有插件机制。开发者为同一个内部数据库查询功能,常常需要编写四五套不同格式的适配器。 Model Context Protocol(MCP) 的诞生正是为了终结这一乱局——它被称为大模型时代的 “Type-C 统一通信接口”。本文带您从底层通信报文协议到自建企业 Server 展开深度实操。
01 MCP 核心三元角色模型
MCP 借鉴了 LSP(Language Server Protocol,语言服务器协议)的成熟分层思想,定义了清晰的三元协作架构:
- Host(宿主应用):发起协调的客户端,如 Claude Desktop、Cursor、Zed 编辑器或自建终端 Agent;
- Client(客户端协议桩):运行在 Host 内部,负责管理连接生命周期、协议握手与上下文转发;
- Server(MCP 服务器):暴露标准化能力的独立服务进程,连接真实世界的物理资源(数据库、Git 仓库、Slack、云原生集群等)。
02 三大核心能力原语:Resources vs Prompts vs Tools
MCP 将大模型与外部世界的交互能力高度抽象为三大正交原语:
03 实战:用 Python FastMCP 10 分钟自建企业数据源插件
得益于官方推出的 FastMCP 高层封装库,开发者不再需要手动解析原始的 JSON-RPC 2.0 报文协议,使用简单的 Python 装饰器即可定义高质量的 MCP Server:
from mcp.server.fastmcp import FastMCP
# 初始化 MCP 服务器实例
mcp = FastMCP("Enterprise-DB-Explorer")
# 注册一个只读安全工具
@mcp.tool()
def query_order_status(order_id: str) -> dict:
"""根据订单编号安全查询当前的履约进度与物流状态"""
# 内部逻辑连接企业私有数据库并执行只读查询
return {"order_id": order_id, "status": "SHIPPED", "tracking_no": "SF100234912"}
if __name__ == "__main__":
mcp.run(transport="stdio")
# 初始化 MCP 服务器实例
mcp = FastMCP("Enterprise-DB-Explorer")
# 注册一个只读安全工具
@mcp.tool()
def query_order_status(order_id: str) -> dict:
"""根据订单编号安全查询当前的履约进度与物流状态"""
# 内部逻辑连接企业私有数据库并执行只读查询
return {"order_id": order_id, "status": "SHIPPED", "tracking_no": "SF100234912"}
if __name__ == "__main__":
mcp.run(transport="stdio")
04 企业级安全隔离考量
在企业内部推广 MCP 时,必须警惕“任意代码执行”与“越权访问”风险:
- 传输通道加固:本地进程交互优先使用
stdio通道,避免在局域网暴露未鉴权的 HTTP/SSE 端口; - 细粒度权限管控:在企业网关层配置鉴权中间件,记录每一笔 Tool 调用传参及执行耗时,并对写操作(Write/Delete)强制执行人机复核。