多代理客户服务平台(MCP+A2A)
一个生产风格、可复制的参考项目,演示如何构建一个 多代理客户服务系统 与:
- MCP JSON-RPC服务器 公开数据库工具(
tools/list,tools/call) - 三个独立的A2A代理商 (路由器、数据、支持)
/card和/a2a/call - 端到端测试 涵盖五种任务场景
- LangGraph演示 基于顺序和路由器的多代理模式
- MCP检查员 说明和屏幕截图
______________________________________________________________________
为什么这个项目
此存储库旨在 招聘人员友好 并且易于评估。它提供:
- A. 清晰的架构 用于代理编排和工具调用
- 可读、可运行 Python服务和测试套件
- 重复的结果 使用一个命令启动和确定性夹具
目的及其工作原理
此项目的存在是为了显示 为什么多代理客户支持很重要 和 如何构建它 端到端。它作为一个具体的、可运行的示例,将客户请求路由到合适的专业代理,调用工具获取或更新数据,并返回反映真实帮助台工作流程的统一答案。
从a 业务 从角度来看,它展示了更快的分辨率(更好的路由和更少的切换)、一致的答案(共享工具和数据)和更低的运营成本(日常查找和工单创建的自动化)。来自A 人工智能 从角度来看,它展示了模型如何规划、选择正确的工具,并在责任明确的代理之间进行协作,而不会混淆问题或失去可追溯性。
从高层次上讲,该系统的工作原理如下:
- 这 路由器代理 接收传入的任务,并决定由哪个代理处理它。
- 这 数据代理 调用MCP服务器的工具(JSON-RPC)来读取或更新客户数据。
- 这 支持代理 使用这些结果起草响应或创建工单。
- 这 MCP服务器 提供了一个稳定的工具API,并位于代理和数据库之间。
目的是证明 编排、工具使用和可重复测试 在单个仓库中,您可以快速评估架构、重用模式或扩展系统以用于真实的客户服务用例。
______________________________________________________________________
项目结构
mcp-project/
├─ mcp_server.py # MCP JSON-RPC server (tools/list, tools/call, /healthz)
├─ database_setup.py # Creates and seeds SQLite DB (support.db)
├─ agents/
│ ├─ router_agent.py # /card, /a2a/call (port 9201)
│ ├─ data_agent.py # /card, /a2a/call (port 9102) - calls MCP tools
│ └─ support_agent.py # /card, /a2a/call (port 9103)
├─ demos/
│ ├─ sequential_demo.py # LangGraph sequential pattern demo
│ └─ router_demo.py # LangGraph router pattern demo
├─ tests/
│ └─ run_tests.py # Runs 5 assignment scenarios and prints logs/results
├─ result/
├─ requirements.txt
└─ README.md______________________________________________________________________
需求
- Python 3.10+
- macOS/Linux/Windows(Windows上建议使用WSL)
- (可选) MCP检查员 (需要Node.js):
npx @modelcontextprotocol/inspector
______________________________________________________________________
快速开始
1) 创建并激活虚拟环境
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
python -m pip install --upgrade pip
pip install -r requirements.txt2) 初始化数据库
python database_setup.py
# This creates/overwrites support.db with seed customers + tickets3) 启动所有服务(推荐)
bash run_all.sh它启动:
- MCP服务器已打开http://127.0.0.1:9010
- 数据代理打开http://127.0.0.1:9102
- 支持代理已打开http://127.0.0.1:9103
- 路由器代理已打开http://127.0.0.1:9201
更喜欢单独的终端?从以下内容开始:
uvicorn mcp_server:app --host 0.0.0.0 --port 9010
uvicorn agents.data_agent:app --host 0.0.0.0 --port 9102
uvicorn agents.support_agent:app --host 0.0.0.0 --port 9103
uvicorn agents.router_agent:app --host 0.0.0.0 --port 9201______________________________________________________________________
健全性检查
MCP健康状况
curl -s http://127.0.0.1:9010/healthz
# {"ok": true}MCP工具/列表(JSON-RPC)
curl -s -X POST http://127.0.0.1:9010/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":"x","method":"tools/list"}' | jq .您应该看到带有以下内容的工具条目 inputSchema 用于: get_customer, list_customers, update_customer, get_customer_history, create_ticket.
MCP工具/调用示例
curl -s -X POST http://127.0.0.1:9010/mcp \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc":"2.0",
"id":"call1",
"method":"tools/call",
"params":{
"tool":"get_customer",
"arguments":{"customer_id":5}
}
}' | jq .A2A代理检查
每个代理暴露:
GET /card→ 代理卡(id、姓名、功能)POST /a2a/call→ 类似JSON RPC的调用
有效载荷示例:
{ "tool": "", "arguments": { ... } }数据代理
curl -s http://127.0.0.1:9102/card | jq .
curl -s -X POST http://127.0.0.1:9102/a2a/call \
-H 'Content-Type: application/json' \
-d '{"tool":"get_customer","arguments":{"customer_id":5}}' | jq .支持代理
curl -s http://127.0.0.1:9103/card | jq .
curl -s -X POST http://127.0.0.1:9103/a2a/call \
-H 'Content-Type: application/json' \
-d '{"tool":"create_ticket","arguments":{"customer_id":1,"issue":"cannot login","priority":"high"}}' | jq .路由器代理
curl -s http://127.0.0.1:9201/card | jq .
curl -s -X POST http://127.0.0.1:9201/a2a/call \
-H 'Content-Type: application/json' \
-d '{"task":"route","text":"create ticket for customer 1: cannot pay",
"args":{"customer_id":1,"issue":"cannot pay","priority":"high"}}' | jq .______________________________________________________________________
MCP检查员(独立客户)
保持MCP服务器在上运行 :9010,然后在新终端中:
npx @modelcontextprotocol/inspector在检查器UI中:
- 运输: 可流式传输的HTTP
- 网址:
http://127.0.0.1:9010/mcp
点击 连接→ 初始化那么 工具 查看列表。尝试 tools/call 与:
{
"tool": "get_customer",
"arguments": { "customer_id": 5 }
}将截图保存到 docs/:
docs/inspector-tools-list.pngdocs/inspector-tools-call.png
______________________________________________________________________
运行端到端测试(5个场景)
python tests/run_tests.py预期:五个区块(简单、协调、复杂、升级、多意图),包括路线、日志和最终答案。
______________________________________________________________________
LangGraph演示(可选)
顺序模式:
python demos/sequential_demo.py路由器模式:
python demos/router_demo.py两个演示都需要 OPENAI_API_KEY 如果他们打电话给LLM。如果您不想调用外部模型,可以使用模拟工具逻辑运行它们。
______________________________________________________________________
故障排除
端口已在使用中
lsof -i :9010
kill -9
MCP检查员“422不可处理实体”
- 确保JSON-RPC包括
"jsonrpc":"2.0",一根绳子id,以及正确的method. tools/list必须返回inputSchema每一个工具。
读取超时/连接被拒绝
- 首先启动MCP,然后是数据、支持,然后是路由器。
- 确认
/healthz回报{"ok":true}.
DB在测试时变得混乱
rm -f support.db
python database_setup.py______________________________________________________________________
环境和版本
看 requirements.txt。如果更改版本,请确保项目仍然通过:
tools/list显示inputSchematools/call适用于所有工具/card和/a2a/call在所有代理上工作tests/run_tests.py打印五个传球场景
______________________________________________________________________
建议简历/作品集标题
多代理客户服务平台(MCP+A2A+LangGraph)
