MCP WhoAmI 服务
这是一个基于Go语言构建的人员信息管理系统,包含业务服务和MCP(Model Context Protocol)服务两个部分。
项目结构
mcp_whoami/
├── business-service/ # 业务服务
│ ├── main.go # 服务入口
│ ├── model/ # 数据模型
│ │ └── person.go
│ ├── storage/ # 存储层
│ │ ├── interface.go # 存储接口(为MySQL预留)
│ │ └── memory.go # 内存存储实现
│ ├── service/ # 业务逻辑层
│ │ └── person_service.go
│ ├── handler/ # HTTP处理器
│ │ ├── frontend.go # 前端API
│ │ └── internal.go # 内部API(供MCP服务调用)
│ └── go.mod
├── mcp-service/ # MCP服务
│ ├── main.go # 服务入口
│ ├── server/ # MCP服务器
│ │ └── mcp_server.go
│ ├── tools/ # MCP工具定义
│ │ └── person_tools.go
│ ├── client/ # 业务服务客户端
│ │ └── business_client.go
│ └── go.mod
└── README.md功能特性
业务服务
业务服务提供完整的人员信息管理功能:
- 数据模型:包含工号、姓名、性别、年龄四个字段
- 内存存储:使用map结构存储数据,支持并发访问(读写锁保护)
- 前端API:提供RESTful接口供前端调用
- 内部API:独立的内部接口供MCP服务调用
- 可扩展设计:存储层采用接口设计,便于后续切换到MySQL
MCP服务
MCP服务实现标准的MCP HTTP协议,为大模型Agent提供工具调用能力:
- 标准协议:遵循MCP协议规范
- 5个工具:创建、查询、列出、更新、删除人员信息
- HTTP通信:通过HTTP与业务服务通信
- JSON格式:所有数据使用JSON格式传输
快速开始
前置要求
- Go 1.21 或更高版本
- 8080端口(业务服务默认端口)和8081端口(MCP服务默认端口)可用,或通过
-p参数指定其他端口
启动业务服务
使用启动脚本:
./start-business.sh或手动启动:
cd business-service
go run main.go业务服务将在 http://localhost:8080 启动(默认端口)
自定义端口:
# 指定端口 9090
go run main.go -p 9090启动MCP服务
使用启动脚本:
./start-mcp.sh或手动启动:
cd mcp-service
go run main.goMCP服务将在 http://localhost:8081 启动(默认端口)
自定义端口:
# 指定端口 9091
go run main.go -p 9091指定业务服务地址:
如果业务服务不在默认地址,可以通过环境变量指定:
BUSINESS_SERVICE_URL=http://your-host:port go run main.go运行测试
项目提供了一个测试脚本 test-api.sh,可以快速测试所有API功能:
# 先确保两个服务都已启动,然后在新终端运行
./test-api.sh测试脚本将执行以下操作:
- 创建多个人员
- 查询人员信息
- 列出所有人员
- 更新人员信息
- 测试MCP工具调用
API文档
业务服务 - 前端接口
基础路径:/api
创建人员
POST /api/person
Content-Type: application/json
{
"workId": "E001",
"name": "张三",
"gender": "男",
"age": 30
}查询人员
GET /api/person/:workId列出所有人员
GET /api/persons更新人员
PUT /api/person/:workId
Content-Type: application/json
{
"name": "李四",
"gender": "女",
"age": 28
}删除人员
DELETE /api/person/:workId业务服务 - 内部接口
基础路径:/internal
接口与前端接口完全相同,只是路径前缀不同。供MCP服务内部调用。
MCP服务接口
初始化
POST /mcp/initialize
Content-Type: application/json
{
"protocolVersion": "2024-11-05",
"clientInfo": {
"name": "client-name",
"version": "1.0.0"
}
}获取工具列表
POST /mcp/tools/list调用工具
POST /mcp/tools/call
Content-Type: application/json
{
"params": {
"name": "get_person",
"arguments": {
"workId": "E001"
}
}
}MCP工具说明
MCP服务提供以下5个工具:
1. create_person
创建新的人员信息
参数:
workId(string, 必需):工号(唯一标识)name(string, 必需):姓名gender(string, 必需):性别age(integer, 必需):年龄
2. get_person
根据工号查询人员信息
参数:
workId(string, 必需):工号(密令)
3. list_persons
列出所有人员信息
参数: 无
4. update_person
更新人员信息
参数:
workId(string, 必需):工号(唯一标识)name(string, 必需):姓名gender(string, 必需):性别age(integer, 必需):年龄
5. delete_person
删除人员信息
参数:
workId(string, 必需):工号(唯一标识)
使用示例
使用curl测试业务服务
创建人员:
curl -X POST http://localhost:8080/api/person \
-H "Content-Type: application/json" \
-d '{"workId":"E001","name":"张三","gender":"男","age":30}'查询人员:
curl http://localhost:8080/api/person/E001使用curl测试MCP服务
获取工具列表:
curl -X POST http://localhost:8081/mcp/tools/list调用get_person工具:
curl -X POST http://localhost:8081/mcp/tools/call \
-H "Content-Type: application/json" \
-d '{"params":{"name":"get_person","arguments":{"workId":"E001"}}}'技术栈
- 语言:Go 1.21+
- Web框架:Gin
- 协议:HTTP, MCP
- 存储:内存存储(可扩展至MySQL)
设计特点
- 分层架构:模型层、存储层、服务层、处理器层清晰分离
- 接口设计:存储层使用接口,便于后续切换数据库
- 并发安全:内存存储使用读写锁保护
- 独立服务:业务服务和MCP服务独立部署和运行
- 标准协议:MCP服务遵循MCP协议规范
Cursor 集成
MCP 服务支持两种模式:
- HTTP 模式(用于测试和调试)
- stdio 模式(用于 Cursor 等 AI 客户端)
在 Cursor 中使用
- 启动业务服务:
./start-business.sh- 配置 Cursor MCP(已自动配置):
配置文件位于 /root/.cursor/mcp.json:
{
"mcpServers": {
"whoami": {
"command": "/root/gitee/mcp_whoami/mcp-service/mcp-service",
"args": ["--stdio"],
"env": {
"BUSINESS_SERVICE_URL": "http://localhost:8080"
}
}
}
}- 重启 Cursor
- 在 Cursor 中使用:
- "帮我创建一个工号为 E001 的员工,叫张三,男,30岁" - "查询工号 E001 的员工信息" - "列出所有员工"
详细说明请参考 CURSOR_INTEGRATION.md
后续扩展
切换到MySQL
- 实现
storage.PersonStorage接口的MySQL版本 - 在
main.go中替换存储实例:
// 替换
personStorage := storage.NewMemoryStorage()
// 为
personStorage := storage.NewMySQLStorage(db)添加更多字段
- 修改
model/person.go添加字段 - 更新对应的存储层和API处理
添加MCP工具
- 在
tools/person_tools.go中添加新工具定义 - 在
CallTool方法中添加处理逻辑 - 在业务服务中添加对应的接口支持
许可证
MIT License
