基于 FastMCP v2 框架的腾讯 IMA Copilot MCP (Model Context Protocol) 服务器,使用环境变量配置,简化项目结构,专注于 MCP 协议实现。
- 🚀 极简配置: 仅需两个必需参数即可启动,开箱即用
- 🤖 MCP 协议支持: 完整实现 Model Context Protocol 规范 (基于 FastMCP 2.14.1)
- 🔧 环境变量配置: 通过
.env文件管理所有配置 - 📡 HTTP 传输: 支持 HTTP 传输协议,便于 MCP Inspector 连接
- 🛠️ 增强型 MCP 工具: 提供腾讯 IMA 知识库问答功能,返回结果包含回答文本和结构化参考资料
- 🔄 Token 自动刷新: 智能管理认证 token,自动刷新保持会话有效
- 💪 Tenacity-powered Retries: 集成 tenacity 库,优化重试机制,支持指数退避和针对性错误重试
- 🧯 Code=3 自愈: 对高并发瞬时
Code=3错误执行退避重试并自动恢复 - 🚦 并发限流: 默认串行问答(并发=1),降低请求突发导致的系统错误
- 📝 Loguru-enhanced Logging: 采用 Loguru 提升日志体验,提供更清晰、结构化的日志输出
- ⏱️ 超时保护: 内置请求超时机制,防止长时间阻塞 (已提升至 300 秒)
- 🎯 一键启动: 简化的启动流程,自动环境检查和配置验证
- 🐳 Docker 支持: 提供官方 Docker 镜像,开箱即用
- ✅ 服务器成功运行: 已验证基于 FastMCP 2.14.1 的 HTTP 传输模式正常工作。
- ✅ 修复启动报错: 解决了
AttributeError: 'FastMCP' object has no attribute 'on_shutdown'问题(通过在当前版本中禁用该钩子)。 - ✅ 全流程验证: 验证了从 Token 刷新、会话初始化到 SSE 流式响应解析的完整链路,支持长回复(35秒+响应已验证)。
# 拉取镜像
docker pull highkay/tencent-ima-copilot-mcp:latest
# 运行容器(需要替换以下两个必需的环境变量)
docker run -d \
--name ima-copilot-mcp \
-p 8081:8081 \
-e IMA_X_IMA_COOKIE="your_x_ima_cookie_here" \
-e IMA_X_IMA_BKN="your_x_ima_bkn_here" \
-v $(pwd)/logs:/app/logs \
--restart unless-stopped \
highkay/tencent-ima-copilot-mcp:latest
# 查看日志
docker logs -f ima-copilot-mcp创建 .env 文件(或直接在 shell 中设置环境变量):
# .env 文件
IMA_X_IMA_COOKIE="your_x_ima_cookie_here"
IMA_X_IMA_BKN="your_x_ima_bkn_here"启动服务:
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f# 安装 FastMCP、tenacity、Loguru 和所有依赖
pip install -r requirements.txt# 复制配置文件模板
cp .env.example .env
# 编辑 .env 文件,填入从浏览器获取的 IMA 认证信息
nano .env # 或使用其他编辑器以下环境变量必须正确配置才能使用服务:
IMA_X_IMA_COOKIE: X-Ima-Cookie 请求头值(包含平台信息、token 等)IMA_X_IMA_BKN: X-Ima-Bkn 请求头值(业务密钥)
- 访问 https://ima.qq.com 并登录
- 按 F12 打开开发者工具
- 切换到 Network (网络) 标签页
- 在 IMA 中发送一条消息
- 找到向
/cgi-bin/assistant/qa的 POST 请求 - 查看 Request Headers,复制以下字段:
x-ima-cookie→IMA_X_IMA_COOKIEx-ima-bkn→IMA_X_IMA_BKN
# Windows
start.bat
# 或使用 Python 脚本(跨平台)
python run.pyfastmcp run ima_server_simple.py:mcp --transport http --host 127.0.0.1 --port 8081# 安装 MCP Inspector
npx @modelcontextprotocol/inspector
# 连接到服务器
# 在 Inspector 中输入: http://127.0.0.1:8081/mcp- MCP 协议端点:
http://127.0.0.1:8081/mcp(用于 MCP Inspector 或其他 MCP 客户端) - 日志文件:
logs/debug/ima_server_YYYYMMDD_HHMMSS.log(Loguru 自动生成和管理) - 原始 SSE 日志:
logs/debug/raw/sse_*.log(发生错误时自动保存)
向腾讯 IMA 知识库询问任何问题
参数:
question(必需): 要询问的问题
示例:
问题: "什么是机器学习?"
问题: "如何制作番茄炒蛋?"
特性:
- 自动管理会话,无需手动创建
- 智能 token 刷新,确保认证有效
- 内置并发限流(默认
IMA_ASK_CONCURRENCY_LIMIT=1) - 检测到
Code=3且无文本时自动指数退避重试(最多 2 次) - 300 秒超时保护,防止长时间等待
- 返回内容为
TextContent列表,包含回答文本和格式化后的参考资料
注意:当配置了多个知识库 ID 时,
ask会直接报错并提示改用ask_with_kb。
向指定知识库询问问题(多知识库模式)
参数:
question(必需): 要询问的问题knowledge_base_id(必需): 目标知识库 ID(必须在配置列表中)
示例:
问题: "总结这个知识库的核心内容"
knowledge_base_id: "7305806844290061"
获取当前配置信息(不包含敏感数据)
获取帮助信息
| 变量名 | 说明 | 获取方式 |
|---|---|---|
IMA_X_IMA_COOKIE |
X-Ima-Cookie 请求头 | 从浏览器开发者工具 Network 标签中复制 |
IMA_X_IMA_BKN |
X-Ima-Bkn 请求头 | 从浏览器开发者工具 Network 标签中复制 |
| 变量名 | 说明 | 默认值 |
|---|---|---|
IMA_KNOWLEDGE_BASE_ID / knowledgeBaseId |
单知识库 ID(两者等价) | 无(必须显式配置) |
IMA_KNOWLEDGE_BASE_IDS / knowledgeBaseIds |
多知识库 ID 列表(逗号分隔) | 无 |
IMA_MCP_HOST |
MCP 服务器地址 | 127.0.0.1 |
IMA_MCP_PORT |
MCP 服务器端口 | 8081 |
IMA_MCP_LOG_LEVEL |
日志级别 (支持 DEBUG, INFO, WARNING, ERROR) |
INFO |
IMA_REQUEST_TIMEOUT |
IMA API 请求超时时间(秒) | 30 |
IMA_RETRY_COUNT |
网络/超时类异常重试次数 | 3 |
IMA_ASK_CONCURRENCY_LIMIT |
问答并发上限(建议 1-2) | 1 |
IMA_ROBOT_TYPE |
机器人类型 | 5 |
IMA_SCENE_TYPE |
场景类型 | 1 |
IMA_MODEL_TYPE |
模型类型 | 4 |
- 单知识库模式(兼容旧逻辑):配置
IMA_KNOWLEDGE_BASE_ID(或knowledgeBaseId),使用ask或ask_with_kb均可。 - 多知识库模式:配置
IMA_KNOWLEDGE_BASE_IDS(或knowledgeBaseIds,逗号分隔),必须使用ask_with_kb。 - 同时配置两者时:优先使用
IMA_KNOWLEDGE_BASE_ID(单知识库模式)。 - 启动强校验:若
IMA_KNOWLEDGE_BASE_ID与IMA_KNOWLEDGE_BASE_IDS都未配置,服务将直接退出。
- 只用一个知识库:保持原有
IMA_KNOWLEDGE_BASE_ID=<id>即可,无需改调用方式。 - 需要多个知识库:新增
IMA_KNOWLEDGE_BASE_IDS=id1,id2,...,并把调用从ask(question)改为ask_with_kb(question, knowledge_base_id)。
Q: 认证失败(Token 验证失败)怎么办?
A:
- 检查
.env文件中的IMA_X_IMA_COOKIE和IMA_X_IMA_BKN是否正确 - 确认
IMA_X_IMA_COOKIE中包含IMA-REFRESH-TOKEN字段 - 重新从浏览器获取最新的认证信息
Q: 如何连接特定的知识库?
A:
在 .env 文件中设置 IMA_KNOWLEDGE_BASE_ID(或 knowledgeBaseId)即可。获取方法:
- 在 IMA 网页选择知识库
- 找到
init_session请求 - 查看 Payload 中的
knowledge_base_id
Q: 多知识库怎么配置和调用?
A:
- 在
.env中设置IMA_KNOWLEDGE_BASE_IDS=id1,id2,id3 - 调用工具时使用
ask_with_kb(question, knowledge_base_id) - 若调用
ask,会提示错误并给出可用knowledge_base_id列表
Q: 偶发出现 Code=3 且无文本怎么办?
A:
- 先保持默认并发(
IMA_ASK_CONCURRENCY_LIMIT=1) - 避免同一知识库短时间突发并发请求
- 服务已内置
Code=3退避重试;若仍频繁出现,可适当增加请求间隔
MIT License