一个基于 MCP(Model Control Protocol)协议的智能对话系统,作为 LLM 与外部服务之间的中介,实现动态工具调用和知识检索增强生成(RAG)功能。
📚 详细文档
本项目是一个 MCP Client,核心功能是作为 LLM 与外部服务之间的中介,根据 LLM 输出决定是否调用 MCP Server。系统支持动态工具集成、知识库检索和流式对话等功能。
- 工具列表获取:从用户预配置的 MCP Server 获取可用工具元数据(如
get_weather),并通过tools/list接口动态拉取描述信息 - 调用决策判断:
- 方案一(OpenAI 规范):将工具列表传入支持
tools字段的 LLM(如 Qwen-Plus),由模型返回tool_calls指令 - 方案二(XML 包裹):对不支持原生工具调用的模型,通过 System Prompt 注入 XML 格式规则,引导模型输出
<function_calls>标签
- 方案一(OpenAI 规范):将工具列表传入支持
- 执行调用并返回结果:解析模型输出后,调用对应 Server 的
tools/call接口,获取结果并交还给 LLM 生成最终回答
- 解耦设计:Host 负责交互,Client 负责通信,LLM 负责决策
- 安全控制:通过环境变量或配置限制仅访问授权 Server
- 扩展性强:支持多Server、多工具动态集成
- RAG 增强:集成向量检索和知识库管理功能
- 支持流式和非流式对话模式
- 集成多种 LLM 提供商(OpenAI、DeepSeek、豆包等)
- 上下文管理和多轮对话
- 动态工具发现和注册
- 支持计算器、时间查询、快快窝等工具
- 自动工具调用决策
- 文档向量化存储
- 基于 Redis 的向量检索
- 知识库管理(添加、删除、搜索)
- React + TypeScript 单页应用
- 实时消息流式展示
- 对话历史管理
- 响应式设计
- 语言:Go 1.24.0
- Web 框架:Gin
- AI 组件:CloudWeGo Eino 系列
- 存储:Redis(向量存储 + 缓存)
- 协议:MCP (Model Control Protocol)
- 配置管理:godotenv
- 框架:React 18.2
- 语言:TypeScript 5.9
- 构建工具:Vite 4.4
- UI:原生 CSS
github.com/gin-gonic/gin # Web 框架
github.com/cloudwego/eino # AI 编排引擎
github.com/cloudwego/eino-ext/components/model/openai # OpenAI 模型组件
github.com/cloudwego/eino-ext/components/tool/mcp # MCP 工具组件
github.com/redis/go-redis/v9 # Redis 客户端
github.com/mark3labs/mcp-go # MCP 协议实现
┌──────────────────────────────────────────────────────────┐
│ 前端(Web) │
│ React + TypeScript │
└──────────────────────┬───────────────────────────────────┘
│ HTTP/SSE
┌──────────────────────▼──────────────────────────────────┐
│ 后端服务(Go) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Handler │ │ Service │ │ Agent │ │
│ │ (路由层) │ │ (业务层) │ │ (AI编排) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Store │ │ Embedder │ │ MCP Client │ │
│ │ (存储层) │ │ (向量化) │ │ (工具调用) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└──────────────────────┬────────────┬────────────────────┘
│ │
┌────────────▼────┐ ┌───▼────────────┐
│ Redis │ │ MCP Server │
│ (向量存储) │ │ (工具服务) │
└───────────────┘ └──────────────┘
- Go 1.24+
- Node.js 16+
- Redis 6+
- Git
git clone <repository-url>
cd chat_message复制并编辑 .env 文件:
# OpenAI 配置(选择一个提供商)
OPENAI_API_KEY=your-api-key
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-3.5-turbo
# MCP 配置
MCP_SERVER_PATH=/path/to/your/mcp/server
MCP_TIMEOUT=30
MCP_ENABLED=true
# 服务器配置
SERVER_PORT=8080
SERVER_HOST=0.0.0.0
# Redis 配置
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=your-redis-password
REDIS_DB=0
REDIS_KEY_PREFIX=rag_demo# 使用 Docker
docker run -d --name redis -p 6379:6379 redis:latest
# 或使用系统服务
sudo systemctl start redisgo mod download# 开发模式
go run main.go
# 或构建后运行
go build -o rag_demo
./rag_demo后端服务将在 http://localhost:8080 启动。
cd web
npm install
npm run dev前端服务将在 http://localhost:5173 启动。
在浏览器中打开 http://localhost:5173,即可开始使用!
详细部署教程请参考 DEPLOYMENT.md 文件。
# 使用 docker-compose 一键部署
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down| 变量名 | 说明 | 默认值 | 必填 |
|---|---|---|---|
OPENAI_API_KEY |
OpenAI API 密钥 | - | ✅ |
OPENAI_BASE_URL |
OpenAI API 地址 | https://api.openai.com/v1 |
❌ |
OPENAI_MODEL |
使用的模型 | gpt-3.5-turbo |
❌ |
SERVER_HOST |
服务器监听地址 | 0.0.0.0 |
❌ |
SERVER_PORT |
服务器端口 | 8080 |
❌ |
REDIS_HOST |
Redis 地址 | localhost |
✅ |
REDIS_PORT |
Redis 端口 | 6379 |
❌ |
REDIS_PASSWORD |
Redis 密码 | - | ❌ |
REDIS_DB |
Redis 数据库 | 0 |
❌ |
REDIS_KEY_PREFIX |
Redis 键前缀 | rag_demo |
❌ |
MCP_SERVER_PATH |
MCP Server 路径 | ./mcp_server |
❌ |
MCP_TIMEOUT |
MCP 超时时间(秒) | 30 |
❌ |
MCP_ENABLED |
是否启用 MCP | false |
❌ |
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.deepseek.com
OPENAI_MODEL=deepseek-chatOPENAI_API_KEY=your-key
OPENAI_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
OPENAI_MODEL=doubao-seed-1-6-250615POST /api/chat
请求体:
{
"question": "你好,介绍一下你自己",
"conversation_id": "optional-uuid",
"stream": false
}响应:
{
"code": 0,
"message": "success",
"data": {
"answer": "你好!我是一个智能助手...",
"conversation_id": "uuid",
"message_id": "uuid"
}
}POST /api/chat/stream
请求体同上,响应为 SSE 流:
data: {"type":"content","content":"你"}
data: {"type":"content","content":"好"}
data: {"type":"done","conversation_id":"uuid"}
更多 API 文档请参考 ARCHITECTURE.md
详细开发指南请参考 CONTRIBUTING.md
# 运行所有测试
go test ./...
# 运行特定包的测试
go test ./internal/store
# 运行测试并显示覆盖率
go test -cover ./...问题:启动时报错 Failed to connect to Redis
解决方案:
- 确认 Redis 服务已启动:
systemctl status redis - 检查 Redis 配置是否正确
- 验证防火墙设置
问题:工具调用返回错误
解决方案:
- 检查
MCP_SERVER_PATH配置是否正确 - 确认 MCP Server 可执行权限
- 查看日志了解详细错误信息
- ✨ 初始版本发布
- ✅ 支持多 LLM 提供商
- ✅ 实现 MCP 工具调用
- ✅ 集成 RAG 知识检索
- ✅ 提供 Web 交互界面
MIT License
欢迎提交 Issue 和 Pull Request!