1. MCP协议在企业系统集成中的实战应用
最近在技术社区看到不少关于MCP协议的讨论,作为在企业内部系统集成领域摸爬滚打多年的开发者,我意识到这可能是一个改变游戏规则的协议。经过两周的实践验证,我们成功将MCP协议应用于公司ERP系统与本地部署的大模型集成,实现了通过自然语言操作后台系统的功能。下面分享这个项目的完整实现过程。
1.1 为什么选择MCP协议
在传统企业系统中,我们通常需要开发专门的API接口来实现系统间的数据交互。但随着大模型技术的普及,这种固定接口的模式越来越难以满足灵活交互的需求。MCP(Model Context Protocol)协议的出现正好解决了这个问题,它提供了一套标准化的方式,让大模型能够理解并操作系统提供的各种功能。
我们选择MCP协议主要基于以下考虑:
- 协议标准化:MCP定义了清晰的通信规范,避免了每次集成都要重新设计协议
- 双向通信:支持SSE(Server-Sent Events)和HTTP POST组合,实现实时交互
- 工具自动发现:客户端可以动态获取系统提供的功能列表
- 自然语言适配:协议设计考虑了大模型的输入输出特点
1.2 项目背景与目标
我们公司的技术架构包含以下关键组件:
- 模型服务器:基于Ollama部署的通义千问7B开源模型,提供本地化的大模型服务
- ERP系统:Java开发的内部管理系统,包含用户管理、审批流程等核心业务功能
- 客户端:使用CherryStudio作为测试客户端,后期计划扩展到移动设备
项目目标是让用户能够通过自然语言指令直接操作系统功能,比如"禁用张三的账号"或"查询上季度销售数据"。这需要建立ERP系统与大模型之间的可靠通信渠道。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MCP协议架构深度解析
2.1 核心通信流程
MCP协议采用SSE+HTTP POST的组合通信方式,这是经过实践验证的高效方案。整个交互过程可以分为以下几个阶段:
- 连接建立:客户端通过SSE连接到服务器,服务器返回POST接口地址
- 初始化握手:客户端发送初始化请求,交换双方的能力信息
- 工具发现:客户端获取系统提供的功能列表
- 工具执行:客户端发起功能调用请求,服务器执行并返回结果
mermaid复制sequenceDiagram
participant Client
participant Server
Client->>Server: SSE连接请求
Server->>Client: 返回POST端点(endpoint)
Client->>Server: POST初始化请求(initialize)
Server->>Client: SSE返回服务信息(serverInfo)
Client->>Server: POST工具列表请求(tools/list)
Server->>Client: SSE返回可用工具列表(tools)
Client->>Server: POST工具调用请求(tools/call)
Server->>Client: SSE返回执行结果(result)
2.2 关键数据结构设计
MCP协议基于JSON-RPC 2.0规范,所有消息都遵循特定的格式要求。理解这些数据结构对实现协议至关重要。
2.2.1 基础消息结构
所有MCP消息都包含以下基础字段:
json复制{
"id": 123,
"jsonrpc": "2.0"
}
id:请求/响应的唯一标识,用于匹配请求和响应jsonrpc:固定为"2.0",表明协议版本
2.2.2 请求消息扩展
客户端发起的请求消息额外包含:
typescript复制interface Request {
method: string;
params?: object;
}
method:请求的方法名,如"initialize"、"tools/list"等params:可选的参数对象,内容取决于具体方法
2.2.3 响应消息扩展
服务器返回的响应消息额外包含:
typescript复制interface Response {
result?: object;
error?: {
code: number;
message: string;
data?: any;
};
}
result:成功时的返回结果error:失败时的错误信息
2.3 协议状态机
理解MCP协议的状态流转对正确实现协议非常重要。以下是简化的状态转换图:
- 未连接 → 已连接:SSE连接建立成功
- 已连接 → 已初始化:完成initialize握手
- 已初始化 → 工具就绪:获取tools/list成功
- 工具就绪 → 执行中:发起tools/call请求
- *执行中
