使用说明
🐛 自动Bug路由器——代理MCP网关
一个使用人工智能动态规划和执行跨平台任务的智能工作流自动化系统。特性 身份验证+RBAC 用于安全的多租户访问控制。
它做什么
您键入一个简单的英文命令:
Read ticket BUG-12 and post it to the dev channel
幕后:
- 快速API 从4台MCP服务器中发现可用工具
- 双子座 在运行时动态构建JSON执行计划(DAG)
- 基于角色的访问控制 在AI看到之前,根据用户角色过滤工具
- FastAPI执行DAG:调用Jira MCP→ 注入结果→ 呼叫Slack MCP
- WRITE工具暂停以获得Human In The Loop(HITL)批准
- 每一步都通过SSE流式传输到浏览器中的实时终端
建筑
Browser (Next.js :3000)
│
│ POST /execute (natural-language command + JWT)
│ ◀─── SSE stream (logs, DAG, step events, RBAC events)
▼
FastAPI Orchestrator (:8000)
│
├── MCP SSE client ──▶ Jira Mock MCP (:8081)
│ • jira_get_ticket
│ • jira_list_open_tickets
│
├── MCP SSE client ──▶ Slack Mock MCP (:8082)
│ • slack_post_message
│
├── MCP SSE client ──▶ GitHub Mock MCP (:8083)
│ • github_list_pull_requests
│ • github_get_pull_request
│ • github_create_issue
│
└── MCP SSE client ──▶ Sheets Mock MCP (:8084)
• sheets_read_range
• sheets_list_spreadsheets
• sheets_append_row
Auth+RBAC系统
角色和权限
| 角色 | 可以访问 |
|---|---|
| 实习生 | Jira只读(jira_get_ticket, jira_list_open_tickets) |
| 工程师 | 实习生工具+Slack帖子+GitHub阅读 |
| 高级的 | 工程师工具+表格(读/写) |
| 管理员 | 所有工具+用户管理 |
RBAC流
POST /execute { command, Authorization: Bearer <JWT> }
│
▼ [JWT Middleware extracts user_id, role, tenant_id]
│
▼ Phase 1: Discover ALL tools from MCP servers
│
▼ [RBAC Check 1] Filter tools by role
│ Intern sees only 2/9 tools → Slack/GitHub/Sheets hidden from Gemini
│
▼ Phase 2: Gemini generates DAG using FILTERED tools
│
▼ Phase 3: Execute DAG steps
│ ├── [RBAC Check 2] is_tool_allowed(tool, role)?
│ │ NO → log violation, reject, return
│ │
│ ├── [HITL Gate] WRITE tool? → wait for human approval
│ │
│ └── invoke_tool() → result
快速开始
先决条件
-
Docker 桌面版 已安装并正在运行
-
A. Gemini API密钥 --自由层作品
-
Docker+Docker组合
-
Google Gemini API密钥
1.配置
cd AgenticMcp
# Edit .env and set:
GEMINI_API_KEY=your-gemini-key
JWT_SECRET=any-random-string-for-jwt-signing
2.启动所有服务
docker compose up --build
3.打开控制室
http://localhost:3000
- 注册 创建帐户(默认角色:实习生)
- 登录 使用您的凭据
- 键入命令并单击 执行→
测试用户
| 电子邮件 | 密码 | 角色 |
|---|---|---|
admin@test.com |
password |
管理员(所有工具) |
engineer@test.com |
password |
工程师 |
senior@test.com |
password 高级的 |
|
| (注册新) | 任何 | 实习生 |
API终点
认证
| 方法 | 端点 | 描述 |
|---|---|---|
| 职位 | /auth/signup |
创建新帐户 |
| 职位 | /auth/login |
登录→ 获取JWT令牌 |
| 得到 | /auth/me |
获取当前用户信息 |
管理员(仅限管理员)
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /admin/users |
列出所有用户 |
| 补丁 | /admin/users/{id}/role |
更新用户角色 |
审核(仅限管理员)
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /audit/rbac |
RBAC权限日志 |
| 得到 | /audit/logins |
登录尝试日志 |
执行
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /tools |
发现所有MCP工具 |
| 职位 | /execute |
执行自然语言命令 |
人在回路
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /hitl/pending |
列出待批准事项 |
| 职位 | /hitl/{exec_id}/approve |
批准一个步骤 |
| 职位 | /hitl/{exec_id}/reject |
拒绝步骤 |
| 得到 | /hitl/audit |
HITL决策历史 |
调试
| URL | 您将看到什么 |
|---|---|
http://localhost:8081/health |
Jira模拟状态 |
http://localhost:8082/health |
松弛模拟状态 |
http://localhost:8082/inbox |
所有Slack消息 |
http://localhost:8083/health |
GitHub模拟状态 |
http://localhost:8084/health |
表格模拟状态 |
http://localhost:8000/health |
后端活性 |
SSE事件类型
type |
有效载荷 | UI效果 |
|---|---|---|
log |
level, message |
终端输出 |
dag |
dag (JSON计划) |
流程图渲染 |
rbac_filter |
role, visible_count, total_count |
显示筛选工具 |
rbac_block |
tool, role |
刀具堵塞警报 |
step_start |
step_id, tool |
卡片突出显示琥珀色 |
step_complete |
step_id, output_key, result |
卡片变绿 |
pending_approval |
execution_id, step_id, ... |
HITL模式 |
approved |
execution_id, step_id |
继续执行 |
rejected |
execution_id, step_id |
停止执行 |
error |
message |
错误警报 |
complete |
outputs |
工作流完成 |
预加载演示数据
Jira模拟门票:
| ID | 标题 | 状态 | 优先级 |
|---|---|---|---|
| BUG-12 | 数据库超时问题 | 打开 | 高 |
| BUG-13 | 移动设备上的登录重定向循环 | 正在进行中 | 中等 |
命令示例:
Read ticket BUG-12 and post it to the #dev channel
List all open Jira tickets and notify #alerts on Slack
Get pull request #47 from acme-corp/backend and log to Sheets
文件结构
AgenticMcp/
├── docker-compose.yml
├── .env
├── README.md
│
├── backend/
│ ├── main.py # FastAPI: Auth + RBAC + Execution
│ ├── requirements.txt
│ └── Dockerfile
│
├── frontend/
│ ├── app/
│ │ ├── page.tsx # UI + Auth + DAG viewer
│ │ ├── layout.tsx
│ │ └── globals.css
│ ├── package.json
│ └── Dockerfile
│
├── jira-mock/
│ ├── server.py
│ └── requirements.txt
│
├── slack-mock/
│ ├── server.py
│ └── requirements.txt
│
├── github-mock/
│ ├── server.py
│ └── requirements.txt
│
└── sheets-mock/
├── server.py
└── requirements.txt
不使用Docker运行
模拟MCP服务器
# Terminal 1
cd jira-mock && pip install -r requirements.txt && python server.py
# Terminal 2
cd slack-mock && pip install -r requirements.txt && python server.py
# Terminal 3
cd github-mock && pip install -r requirements.txt && python server.py
# Terminal 4
cd sheets-mock && pip install -r requirements.txt && python server.py
后端
cd backend
pip install -r requirements.txt
JIRA_MCP_URL=http://localhost:8081/sse \
SLACK_MCP_URL=http://localhost:8082/sse \
GITHUB_MCP_URL=http://localhost:8083/sse \
SHEETS_MCP_URL=http://localhost:8084/sse \
GEMINI_API_KEY=your-key \
JWT_SECRET=your-secret \
python main.py
# Tab 4 — Frontend
cd frontend && npm install
NEXT_PUBLIC_API_URL=http://localhost:8000 npm run dev
关键谈话要点
“注意,我们从来没有写过
if 'BUG' in command: call_jira(). LLM读取工具列表,并将逻辑本身以JSON的形式实时写入。 更改命令→ 计划改变了。添加工具→ 它被使用了。"
“我们添加了具有两个强制点的Auth+RBAC:
- 工具发现-在Gemini看到之前过滤工具
- 执行门-在运行时阻止禁用工具 实习生只能阅读Jira——他们甚至从未将Slack视为一种选择!"
“WRITE工具(如发布到Slack)会触发HITL批准。 在执行操作之前,必须得到人类的明确批准。 每次权限检查都会记录到SQLite中进行审核。"