Command Palette

Search for a command to run...

UnylyUnyly
Весь каталог

Agent Gateway

БесплатноНе проверен

A ready-to-run MCP gateway and multi-agent scheduling system with 14 built-in tools and 3-layer performance optimization, reducing latency by 65%.

GitHubEmbed

Описание

A ready-to-run MCP gateway and multi-agent scheduling system with 14 built-in tools and 3-layer performance optimization, reducing latency by 65%.

README

统一 JSON-RPC 协议内核 · 传输层薄适配 · 可插拔中间件管道
让 AI Agent(Trae / Dify / Cursor)安全操控本地环境的 MCP 网关


目录


快速开始

git clone https://github.com/wuwo1979/agent.git && cd agent
pip install -r requirements/runtime.txt
python main.py                                    # 启动 HTTP 网关(端口 9090)

验证服务:

# 健康检查
curl.exe -s http://localhost:9090/api/v1/health

# 列出工具
curl.exe -X POST http://localhost:9090/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list","params":{}}'
预期返回(点击展开)

健康检查:

{
  "status": "healthy",
  "server": "MCP 本地工具网关",
  "version": "2.0.0",
  "protocol_handlers": 11,
  "tools": 17,
  "providers": 5,
  "active_sessions": 0
}

工具列表(部分):

{
  "result": {
    "tools": [
      {"name": "read_file",    "description": "读取指定文件内容"},
      {"name": "write_file",   "description": "写入内容到指定文件"},
      {"name": "run_command",  "description": "在终端中执行命令(沙箱保护)"},
      {"name": "query",        "description": "执行数据库查询"},
      {"name": "web_fetch",    "description": "获取网页或 API 内容"},
      {"name": "llm_call",     "description": "调用本地大模型(Ollama)"}
    ]
  }
}

项目背景

MCP Agent Gateway 是一个基于 MCP (Model Context Protocol) 协议的工具网关。

它实现了 MCP 协议的 JSON-RPC 内核,将本地工具(文件读写、终端命令、数据库查询、网页抓取、Ollama 推理)封装为 MCP 工具接口,通过 STDIO 或 HTTP 传输层暴露给 AI Agent 调用。

并不会替代 Agent 本身的能力,而是作为一个可选的本地工具后端,在您需要 Agent 操控本地环境时提供安全可控的工具接口。

适用场景

  • 在 Trae / Cursor 中通过 MCP STDIO 接入,让 Agent 调用本地文件、终端、数据库等工具
  • 在 Dify 中通过 HTTP + OpenAPI Schema 导入,作为自定义工具节点使用
  • 需要为本地工具调用添加安全管控(路径沙箱、命令注入拦截、权限隔离)时
  • 需要统一的日志追踪和审计能力时

核心特点

特点 说明
统一协议层 单 JSON-RPC 协议内核,STDIO 和 HTTP 共享同一套逻辑,仅传输层不同
17 个内置工具 文件读写/搜索、终端命令执行、数据库查询、网页抓取、Ollama 推理
安全管控 路径沙箱、shell 注入拦截、API Key 认证、多租户隔离
可观测性 结构化 JSON 日志 + request_id 全链路追踪
可插拔中间件 认证 → 限流 → 审计 → 缓存管道,可自由组合

生态适配关系

┌─────────────────────────────────────────────────────────────────┐
│                         AI Agent 生态                            │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌───────┐ │
│  │  Trae   │  │  Cursor │  │ VS Code │  │  Dify   │  │Ollama │ │
│  │ (STDIO) │  │ (STDIO) │  │ (STDIO) │  │ (HTTP)  │  │(HTTP) │ │
│  └────┬────┘  └────┬────┘  └────┬────┘  └────┬────┘  └───┬───┘ │
│       └────────────┴────────────┴────────────┴────────────┘     │
│                              │                                  │
│                     ┌────────▼────────┐                        │
│                     │  MCP Agent      │                        │
│                     │  Gateway        │                        │
│                     │  (统一协议内核)  │                        │
│                     └────────┬────────┘                        │
│                              │                                  │
│                     ┌────────▼────────┐                        │
│                     │  本地资源        │                        │
│                     │  文件·终端·DB   │                        │
│                     └─────────────────┘                        │
└─────────────────────────────────────────────────────────────────┘
  • Trae / Cursor / VS Code: 通过 MCP STDIO 协议接入,网关作为 MCP Server 运行
  • Dify: 通过 HTTP REST + OpenAPI Schema 导入工具
  • Ollama: 作为后端推理服务,网关转发 LLM 请求并添加故障隔离

架构说明

调用链路架构

                    AI Agent (Trae / Dify / Cursor)
                            │
                    ┌───────▼────────────────────────────┐
                    │  传输层 Transport (薄适配)           │
                    │  STDIOTransport · HTTPTransport     │
                    │  职责:协议解析 + 会话管理          │
                    └───────┬────────────────────────────┘
                            │ JSONRPCRequest
                    ┌───────▼────────────────────────────┐
                    │  MCPProtocolHandler (唯一执行入口)   │
                    │                                    │
                    │  ┌─ Middleware Pipeline ──────────┐ │
                    │  │  [Auth] → [RateLimit] →       │ │
                    │  │  [Audit] → [Cache]            │ │
                    │  └───────────────────────────────┘ │
                    │                                    │
                    │  ToolRegistry (17 tools)           │
                    │  5 providers: filesystem/terminal/ │
                    │  database/web/llm                  │
                    └───────┬────────────────────────────┘
                            │
                    ┌───────▼────────────────────────────┐
                    │  本地资源 (沙箱安全)                 │
                    │  文件系统 · 终端 · SQLite/MySQL ·   │
                    │  Ollama 推理                        │
                    └────────────────────────────────────┘

架构特点:

  1. 唯一入口:所有请求(无论 STDIO 还是 HTTP)最终汇聚到 MCPProtocolHandler
  2. 中间件管道:认证 → 限流 → 审计 → 缓存,请求经过管道后执行工具
  3. 传输层薄适配:传输层只做协议解析,不含业务逻辑,新增传输方式只需实现接口
  4. 沙箱隔离:工具层对本地资源的访问受路径白名单、命令黑名单、参数化查询保护

网关架构分层图
图:网关架构分层图 — Agent → 传输层 → 协议内核 → 中间件管道 → 工具层 → 本地资源

项目目录结构

LLM/
├── main.py                    # 入口,支持 --mode stdio / --demo / --status
├── mcp_gateway/               # 核心网关
│   ├── server.py              # 服务装配 + 中间件初始化
│   ├── protocol.py            # 协议内核 + 中间件管道(唯一执行入口)
│   ├── transport.py           # 传输层(STDIO/HTTP 薄适配)
│   ├── api.py                 # REST → JSON-RPC 适配器(Dify 专用)
│   ├── security.py            # 认证 / 限流 / 策略引擎
│   ├── audit.py               # 审计日志
│   ├── tenancy.py             # 多租户管理
│   └── tools/                 # 5 个工具提供者,共 17 个工具
│       ├── filesystem.py      # ✅ 已实现
│       ├── terminal.py        # ✅ 已实现
│       ├── database.py        # ✅ 已实现
│       ├── web.py             # ✅ 已实现
│       └── llm.py             # ✅ 已实现
├── core/                      # 基础设施
│   ├── types.py               # JSON-RPC 类型定义
│   ├── exceptions.py          # 统一异常体系
│   └── structured_log.py      # 结构化 JSON 日志 + request_id 追踪
├── config/                    # YAML 配置(default.yaml + config.example.yaml)
│   ├── default.yaml           # 默认配置(无需修改即可运行)
│   ├── config.example.yaml    # 带注释的完整配置模板
│   └── loader.py              # 配置加载器(YAML + 环境变量合并)
├── docker/                    # Docker 部署
│   ├── Dockerfile             # 多阶段构建,基于 python:3.11-slim
│   └── docker-compose.yml     # 网关 + Ollama + ChromaDB 编排
├── tests/                     # 162 个测试
│   ├── test_mcp.py            # MCP 协议单元测试(pytest 自动发现)
│   ├── test_integration.py    # 集成测试(pytest 自动发现)
│   ├── test_security.py       # 56 项安全专项测试(pytest 自动发现)
│   ├── test_agent.py          # 调度测试(pytest 自动发现)
│   ├── test_scenarios.py      # 端到端场景测试(独立运行: python tests/test_scenarios.py --all)
│   └── benchmark.py           # 性能基准(独立运行)
├── docs/                      # 文档 + 截图 + 架构图 + 性能图表
│   ├── assets/                # 架构图 SVG + 性能图表 PNG
│   ├── screenshots/           # 实机运行截图
│   ├── 错误码对照表.md         # JSON-RPC 错误码定义
│   └── smoke_test.py          # 冒烟测试(独立运行)
├── scripts/                   # 辅助脚本
│   ├── setup_mcp.py           # 一键配置 Trae / Cursor / VS Code
│   └── gen_perf_chart.py      # 性能图表生成(matplotlib)
└── requirements/
    ├── runtime.txt            # 运行时依赖(pip install)
    └── dev.txt                # 开发依赖(测试 + 代码风格)

内置工具

Provider 工具 说明
filesystem read_file write_file list_dir search_files file_stat 读写项目文件、搜索代码;路径沙箱 + mtime 缓存
terminal run_command sysinfo 编译测试、系统信息;禁用 shell + 危险语法拦截 + 进程树清理
database query execute list_tables describe_table 数据库查询与迁移;参数化查询防 SQL 注入
web web_fetch web_api json_query 爬取网页、调用 API、解析 JSON;URL 校验 + 超时控制
llm llm_call llm_ping llm_list_models 本地推理(Ollama);故障隔离 + 熔断降级

体验全部工具:python main.py --demo


运行模式

模式 命令 用途
HTTP python main.py 供 Dify / curl / 浏览器调用,默认端口 9090
STDIO python main.py --mode stdio 供 Trae / Cursor / VS Code 调用
演示 python main.py --demo 全自动演示:启动 → 调用全部工具 → 输出结果
状态 python main.py --status 一键输出服务健康、端口、工具数量、缓存状态

高级启动选项:

python main.py --host 0.0.0.0 --port 9090          # 自定义监听地址
python main.py --config config/myconfig.yaml        # 自定义配置文件
python main.py --mode stdio 2>gateway.log           # STDIO 模式,日志重定向

平台接入

Trae / Cursor 接入

在 MCP 设置中添加:

{
  "mcpServers": {
    "agent-mcp-gateway": {
      "command": "python",
      "args": ["F:/项目路径/main.py", "--mode", "stdio"],
      "env": {
        "MCP_API_KEY": "your-api-key",
        "MCP_WORKSPACE": "F:/项目路径"
      }
    }
  }
}

一键配置脚本:python scripts/setup_mcp.py

Dify 接入

在「自定义工具」中导入 OpenAPI Schema:

  • Schema URL:http://localhost:9090/api/v1/openapi.json
  • 认证方式:X-API-Key 请求头

Dify OpenAPI Schema 导入
图:Dify 自定义工具 — 导入 OpenAPI Schema

实测运行截图:

状态仪表盘 Trae 工具列表
图左:状态仪表盘 · 图右:Trae MCP 工具列表


配置说明

默认配置位置

配置文件位于 config/ 目录:

config/
├── default.yaml            # 默认配置(无需修改即可运行)
└── config.example.yaml     # 带注释的完整配置模板(自定义时参考)

配置优先级

高  环境变量 ${VAR_NAME}          (如 export MCP_SERVER_PORT=8080)
 ↓  自定义配置文件 --config path   (如 python main.py --config config/myconfig.yaml)
低  默认配置文件 default.yaml     (无需修改)

关键配置项速查

配置项 环境变量 默认值 说明
server.port MCP_SERVER_PORT 9090 HTTP 监听端口
server.host - 0.0.0.0 监听地址
server.mode - http 运行模式:http/stdio
mcp.server_version - 2.0.0 协议版本号
cache.max_entries MCP_CACHE_MAX_ENTRIES 1000 缓存最大条目
cache.ttl_seconds - 0 缓存 TTL(0=永不过期)
performance.max_concurrency MCP_MAX_CONCURRENCY 5 并行调度最大并发数
workspace.allowed_dirs MCP_FS_SAFE_ROOTS ["."] 文件沙箱根路径
security.auth.api_keys MCP_API_KEYS [...] API 密钥列表
security.rate_limit.max_requests_per_minute MCP_RATE_LIMIT 60 每分钟最大请求数

自定义配置步骤

# 1. 复制模板
cp config/config.example.yaml config/myconfig.yaml

# 2. 修改配置(编辑文件)
# 3. 使用自定义配置启动
python main.py --config config/myconfig.yaml

多租户

网关内置多租户能力,不同接入端使用不同的 API Key 隔离资源。

默认租户

租户 ID 标签 API Key 权限范围
admin 管理员(全部权限) admin-key-001 允许所有工具,访问所有文件
dify_default Dify 默认租户 dify-key-001 允许系统信息、文件读写、Web 抓取、LLM 调用(不含数据库和终端)
ollama_local Ollama 本地推理 ollama-key-001 允许 LLM 调用、系统信息、文件读取、Web 抓取

使用方式

HTTP 请求时在 Header 中传入 API Key:

# 使用 admin 权限
curl.exe -X POST http://localhost:9090/mcp \
  -H "Content-Type: application/json" \
  -H "X-API-Key: admin-key-001" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list","params":{}}'

# 使用 ollama 租户
curl.exe -X POST http://localhost:9090/api/v1/tools/call \
  -H "Content-Type: application/json" \
  -H "X-API-Key: ollama-key-001" \
  -d '{"tool":"llm_call","params":{"prompt":"hello"}}'

自定义租户

编辑 config/config.example.yaml 中的 tenancy 段:

tenancy:
  enabled: true
  tenants:
    - id: "my_tenant"
      label: "自定义租户"
      api_keys: ["my-custom-key"]
      file_whitelist: ["/my/project/path"]
      allowed_tools: ["read_file", "write_file", "run_command"]

支持租户列表查询:

curl.exe -s http://localhost:9090/api/v1/tenants -H "X-API-Key: admin-key-001"

Docker 部署

构建镜像

docker build -t mcp-gateway -f docker/Dockerfile .

使用 docker-compose 启动

# 启动网关 + Ollama + ChromaDB
cd docker
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看网关日志
docker-compose logs -f mcp-tool-gateway

访问服务

  • 网关:http://localhost:9090
  • Ollama:http://localhost:11434
  • ChromaDB:http://localhost:8000

验证部署

# 健康检查
curl.exe -s http://localhost:9090/api/v1/health

# 工具列表
curl.exe -X POST http://localhost:9090/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/list","params":{}}'

docker-compose 服务说明

服务 镜像 端口 说明
mcp-tool-gateway 本地构建 9090 MCP 网关
ollama ollama/ollama:latest 11434 本地大模型推理
chroma chromadb/chroma:latest 8000 向量数据库
milvus milvusdb/milvus:latest 19530 备用向量数据库

安全设计

网关内置三层安全防护:

防护层 机制 覆盖的攻击手段
认证 & 鉴权 API Key + 多租户策略,不同接入端隔离资源 未授权访问、跨租户越权
路径隔离 路径规范化 + 白名单前缀匹配,禁止符号链接 / UNC / 设备路径 ../ 穿越、Windows 8.3 短文件名、大小写变形、空字节注入
命令管控 禁用 shell 执行(create_subprocess_exec)+ 危险语法模式拦截 + 命令白名单 && ; `

安全能力通过 56 项专项测试量化验证:

安全测试覆盖明细(点击展开)
  • 路径穿越(6 项):多级 ../、混合分隔符、深层嵌套、URL 编码绕过
  • Windows 绕过(4 项):大小写变形、UNC 路径、设备名路径(CON/NUL/COM1)、符号链接
  • 命令注入(9 项); | && $() 等 shell 连接符、重定向、命令替换
  • 命令黑名单(8 项)rm -rfshutdownwgetcurl 等危险命令
  • 交互命令拦截(5 项)vimnanotophtoptail -f
  • 边界极值(7 项):超长路径/参数、敏感系统路径、空字节注入、非法参数类型
  • 沙箱逃逸(2 项):工作目录越界、白名单外命令

运行安全测试:python -m pytest tests/test_security.py -v


结构化日志

所有日志统一输出 JSON 格式到 stderr,每个请求自动分配唯一 request_id 贯穿全链路:

{"t": "2026-06-27T10:30:00.123", "rid": "abc123", "mod": "mcp_gateway.server",
 "lvl": "INFO", "msg": "收到请求 tools/list", "dur": "0.5ms", "err": ""}

{"t": "2026-06-27T10:30:00.456", "rid": "abc123", "mod": "mcp_gateway.protocol",
 "lvl": "INFO", "msg": "中间件管道执行完成", "dur": "0.3ms", "err": ""}

{"t": "2026-06-27T10:30:01.234", "rid": "def456", "mod": "mcp_gateway.tools.filesystem",
 "lvl": "WARN", "msg": "路径穿越拦截: ../../../etc/passwd", "dur": "0.1ms",
 "err": "-32001"}

日志字段说明:

字段 含义
t ISO 8601 时间戳(毫秒精度)
rid 请求追踪 ID,同一次请求所有日志共享
mod 模块路径,快速定位代码位置
lvl DEBUG / INFO / WARN / ERROR
msg 日志消息
dur 该模块处理耗时(毫秒)
err 错误码(无错误为空)

典型排查流程:

# 启动网关,日志重定向到文件
python main.py 2>gateway.log

# 按 request_id 追踪一次完整调用(PowerShell)
cat gateway.log | Select-String '"rid":"abc123"' | python -m json.tool

# 统计各模块耗时
cat gateway.log | python -c "
import sys, json
for line in sys.stdin:
    try:
        e = json.loads(line)
        print(f'{e[\"rid\"]} {e[\"mod\"]} {e[\"dur\"]} {e[\"msg\"]}')
    except: pass
"

测试指南

测试入口说明

测试类型 运行方式 说明
单元测试 pytest 自动发现所有 test_*.py 文件(test_scenarios.py 排除
单元测试(带覆盖率) pytest --cov=. 输出每个模块的覆盖率
安全专项测试 pytest tests/test_security.py -v 56 项安全测试,逐条验证
端到端场景测试 python tests/test_scenarios.py --all 模拟真实 STDIO + HTTP 调用,需独立进程
性能基准 python tests/benchmark.py 测量缓存命中率、并行吞吐、压缩率
冒烟测试 python docs/smoke_test.py 快速验证服务是否正常运行

为什么 test_scenarios.py 不通过 pytest 运行? 端到端场景测试需要启动子进程(模拟 Trae STDIO 客户端和 Dify HTTP 客户端),在 CI 环境中子进程可能因端口占用或网络问题超时。因此标记为 __test__ = False,用 python 直接运行。

运行全部测试

# 1. 运行 pytest 测试(161 项)
python -m pytest tests/ -v --tb=short

# 2. 运行端到端场景测试(独立进程)
python tests/test_scenarios.py --all

# 3. 检查代码风格
ruff check . --select=E,F,W --ignore=E501

测试样例:缓存命中率

python main.py --status 默认显示缓存命中率为 0.0%(刚启动,无缓存)。以下演示缓存生效过程:

场景:重复读取同一文件

# 第一次请求(缓存未命中):
# curl 调用 read_file → 缓存中没有 → 读取磁盘 → 写入缓存
curl.exe -X POST http://localhost:9090/mcp \
  -H "Content-Type: application/json" \
  -H "X-API-Key: admin-key-001" \
  -d '{"jsonrpc":"2.0","id":"1","method":"tools/call","params":{"name":"read_file","arguments":{"path":"main.py"}}}'

# 第二次请求(缓存命中):
# curl 再次调用 read_file → 缓存中有 → 直接返回,不读磁盘
curl.exe -X POST http://localhost:9090/mcp \
  -H "Content-Type: application/json" \
  -H "X-API-Key: admin-key-001" \
  -d '{"jsonrpc":"2.0","id":"2","method":"tools/call","params":{"name":"read_file","arguments":{"path":"main.py"}}}'

# 查看状态(观察缓存命中率上升)
python main.py --status

使用 --demo 模式观察缓存效果

python main.py --demo
# 输出中会显示缓存统计:
#   → Cache hit rate: xx.x%
#   → Tokens saved: xxx
#   → Token save rate: xx.x%

性能基准数据
图:性能基准 — 缓存命中率 42.9% / 并行吞吐 2.8x / 错误码覆盖 100%(benchmark.py 实测)


质量保障

  • 全部测试:pytest(161 passed, 1 skipped — Windows 符号链接专用)
  • 安全专项:pytest tests/test_security.py -v(56 passed)
  • 端到端验证:python tests/test_scenarios.py --all
  • 代码风格:ruff check .(0 errors)
  • 冒烟测试:python docs/smoke_test.py

文档体系

文档 位置 说明
Trae 接入指南 docs/ Trae IDE MCP 配置步骤
Dify 接入指南 docs/ Dify 自定义工具节点配置
架构设计 docs/ 分层架构详解与核心流程
设计决策 docs/ 技术选型决策记录
错误码对照表 docs/错误码对照表.md 完整的 JSON-RPC 错误码定义
性能优化 docs/ 缓存 + 并行调度指标

版本演进

版本 核心变更
v1.0 MCP 协议基础 + HTTP REST 双路径
v1.3 多租户、审计日志、路径沙箱、权限控制、OpenAPI Schema
v2.0 协议内核统一 + 中间件管道 + Ollama 故障隔离 + Dify OpenAPI Schema + 统一错误码 + 结构化日志 + 56 项安全测试 + Docker 部署 + --demo 模式
v2.1 README 重构:补充目录导航、Docker/配置/多租户说明、缓存测试样例、架构图纵向分层;CI 跨平台兼容修复

License

MIT

from github.com/wuwo1979/agent

Установка Agent Gateway

У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.

▸ github.com/wuwo1979/agent

FAQ

Agent Gateway MCP бесплатный?

Да, Agent Gateway MCP бесплатный — установка в пару кликов через Unyly без оплаты.

Нужен ли API-ключ для Agent Gateway?

Нет, Agent Gateway работает без API-ключей и переменных окружения.

Agent Gateway — hosted или self-hosted?

Доступен hosted-вариант: Unyly запускает сервер в облаке, локальная установка не обязательна.

Как установить Agent Gateway в Claude Desktop, Claude Code или Cursor?

Открой Agent Gateway на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.

Похожие MCP

Compare Agent Gateway with

Не уверен что выбрать?

Найди свой стек за 60 секунд

Автор?

Embed-бейдж для README

Похожее

Все в категории ai