AgentGate 是一个与外部 Agent 解耦的 MCP 能力网关和策略/审批 Broker。Agent 只拿 AgentGate Access Key;Kubernetes、Elasticsearch、Prometheus 或其他目标系统凭据留在平台执行侧。
External Agent
-> POST /mcp
-> stable Operation Tool + profileRef
-> PolicyService
-> read execution | ActionPlan -> Web/Feishu approval -> write execution
-> controlled target executor
AgentGate 不保存模型、会话、记忆、提示词或 Agent 工作流,也不要求外部调用方安装专用 SDK。支持 MCP 的 Agent 直接连接 /mcp;不支持 MCP 的 Host 可以使用自动生成的 Guide/OpenAPI 或仓库内的可选 Skill。
Department
-> API Consumer
-> Access Key
-> Capability Grant
-> Execution Profile (Capability Instance)
-> immutable Definition Version
-> Target Profile -> deployment-side connectorRef
-> scope + approval policy
- Operation 表示“能做什么”,按定义和版本稳定发布,例如
platform.elasticsearch.search.v1_0_0。 profileRef表示“以哪份授权配置执行”,固定目标集群/数据源、环境、Scope、Grant 和审批策略。- 同一个 ES 查询定义即使绑定十个集群,MCP 仍只有一个 Tool,Agent 从目录或 Resources 中选择获授权的 Profile。
tools/list、MCP Resources、Runtime Guide、Catalog、OpenAPI 和真实执行都读取同一个 Key-scoped 目录与 PolicyService。
- 官方 MCP TypeScript SDK v2,兼容 MCP
2026-07-28和 2025-era Stateless Streamable HTTP 客户端。 - 稳定 operation Tools、低基数 Catalog/Profile/Target Resources、分页
agentgate_catalog_search与agentgate_resources_search。 - HMAC 签名游标,绑定 Access Key、目录版本、查询条件和有效期。
- API Consumer、可轮换/撤销 Access Key、Capability Grant、多 Target Profile 和部门隔离。
- Kubernetes、Prometheus、Elasticsearch、SSH 演示 Operation 和
demo:*数据,以及可由外部 AI 声明的受控HttpOperation;资源发现支持parentRef层级约束。 - Python 3.11/3.12、Bash Base Runtime;Runtime 环境、不可变版本、uv wheel-only 构建、hash lock、SBOM、内容寻址 artifact、发布/弃用和引用统计。
- Python、Shell、OCI Manifest;单文件或 ZIP 上传、Runtime Version 绑定、扫描、固定版本、权限子集评审、发布和沙箱 ABI。
- 单机 Linux
runnerd:API 只提交签名 invocation ID,runnerd 从只读 SQLite 恢复固定版本;rootless Docker/Podman 一次性执行、默认断网、只读挂载、非 root、cgroup/ulimit/output/timeout 限制和遗留容器清理。 - 内网
Site Connector:同时支持资源侧主动回连的 Reverse,以及 AgentGate 主动连接统一网关的 Forward;使用 HMAC Token 或 Ed25519 单次 lease、CIDR/DNS 校验、连接/时长/流量上限,平台自动生成 Docker Run、Compose 和 Kubernetes YAML。受控 HTTP/ES/Prometheus/K8s API 可经站点隧道执行。 - 大结果 Job/Artifact:能力调用先返回可轮询 Job,Runner 通过单文件 ABI 暂存结果,API 校验摘要后持久化;Agent 使用有界文本分块或带认证的 HTTP Range 下载,不把大文件塞进 MCP 上下文。
- 写
ActionPlan、SHA-256 摘要、幂等、Web/飞书审批、Outbox、执行前完整重新授权和验证。 - 飞书群聊/私聊投递、审批人
@、callback token、timestamp/nonce/signature、事件去重和身份映射。 0.0.0.0监听,并对 MCP 强制 Host/Origin 白名单以防 DNS rebinding。- 管理端:AI 委托授权、Consumer/Key、内网站点及部署内容、Target、能力/Grant、能力包、审批、Key-scoped 目录、MCP Console 和审计。
- “AI 委托授权”由人员管理员创建受限 Automation Principal 和限时
agc_Key,并生成带当前发现链接的 Skill 迁移提示词;明文 Key 一次性单独显示,不进入提示词。
当前仓库中的 demo:* 执行器只操作 SQLite 演示数据,不会访问真实生产系统,也不是要求平台后续逐个内置 Provider Connector 的路线图。生产能力默认由外部 AI 生成受控 HttpOperation;目标可由 API 直接访问,也可通过 Site Connector 访问内网。独立 Linux runnerd 继续执行无网络、无 Secret 的 Python/Shell 能力包。Site Tunnel 虽承载任意 TCP 字节,但当前真实接通的协议执行器是受控 HTTP;生产 SSH/数据库仍需要对应 typed adapter,不能把 demo SSH 描述为已可用。需要网络和 Secret 的任意非 HTTP 上传代码仍由认证 OCI 路线处理,当前 MVP 会拒绝其发布/执行。
要求 Node.js 24+。本地构建 Python Runtime 还需要已安装的 uv 和对应 Python 版本;不使用上传能力时可不安装。
npm install
cp .env.example .env
# 编辑 .env,为 LOCAL_ADMIN_PASSWORD 设置唯一的长密码
npm run dev默认监听:
- 管理台:http://127.0.0.1:5173
- API/MCP:http://127.0.0.1:4310
- MCP endpoint:http://127.0.0.1:4310/mcp
- Health:http://127.0.0.1:4310/api/health
- Key-scoped Guide:http://127.0.0.1:4310/api/runtime/v1/guide.md
API 和 Web 都绑定 0.0.0.0,局域网设备可用宿主机 IP 访问。MCP 开发环境自动允许本机接口地址;生产通过 MCP_ALLOWED_HOSTS 和 MCP_ALLOWED_ORIGINS 明确配置公开域名。
首次启动会把 LOCAL_ADMIN_USERNAME 和 LOCAL_ADMIN_PASSWORD 写成不可逆的本地账号密码验证记录;登录成功后浏览器使用服务端持久 Session。确认可以登录后,从 .env 删除 LOCAL_ADMIN_PASSWORD 并重启,已有账号不会被重置。
生产安装的 canonical 入口是 Linux Runner 部署手册。不要让部署 AI 仅根据 README 猜测安装步骤,也不要在生产机器上用 npm run dev 代替 API + 独立 runnerd 拓扑。
将下面这些文件一起提供给部署 AI:
- 完整安装、验收与回滚步骤
- Docker Compose 拓扑
- Docker Compose 环境变量
- Podman Compose 拓扑
- Podman Compose 环境变量
- API 环境变量
- runnerd 环境变量
- 内网 Site Connector 部署与验收
部署 AI 必须先检测现有容器引擎,再决定安装路径:
| 主机现状 | 处理方式 |
|---|---|
| 当前部署用户可使用 rootless Docker | 直接选择 Docker,不安装 Podman;使用默认 Docker Compose 完整拓扑,或宿主 systemd runnerd |
| 当前部署用户可使用 rootless Podman | 使用 Podman;使用独立 Podman Compose 拓扑,或宿主 systemd runnerd |
| 只有普通 rootful Docker,或当前用户无 daemon 权限 | 不能把用户加入 docker 组后直接继续;安装 rootless Docker/Podman,或更换专用隔离 Runner 主机 |
| 两者都没有 | 按组织运维标准选择一种 rootless 引擎,并使用与该 Engine 匹配的 Compose 文件 |
容器化 API/Runtime 镜像已经携带所需 Python 和 uv,因此宿主 Python 3.10 而非 3.12、宿主未安装 uv,都不是容器化生产部署的阻塞项。只有直接在宿主运行 API 并启用 RUNTIME_BUILDER=local_uv 时,宿主才需要匹配的 Python 与 uv。
可以直接使用以下提示词:
请严格按照 docs/deploy/linux-runner.md 将 AgentGate 部署到这台 Linux 主机。
先读取该文档及其引用的 compose/env/Containerfile,不要自行简化安全拓扑。
先检测当前部署用户能否使用 rootless Docker 或 rootless Podman。已有可用的 rootless
Docker 时直接选择 CAPABILITY_CONTAINER_ENGINE=docker,不要额外安装 Podman。compose.yaml 与
compose.env.example 是完整 Docker Compose 路径;Podman 必须改用 compose.podman.yaml 与
compose.podman.env.example,不得混用两套 runnerd 镜像、socket 或 user namespace 配置。
普通 rootful Docker socket 或加入 docker 组不算通过安全 preflight。
部署前先执行 preflight,并向我报告缺失的主机条件和必须由我提供的域名、
本地管理员初始密码(或可信身份网关)、镜像仓库 digest、UID/GID 与可选飞书配置;遇到缺失输入时停下来询问我,
不要编造占位值。API 不得挂 Docker/Podman/containerd/CRI socket;API 与 runnerd
必须使用相同绝对 RUNTIME_RESULT_STAGING_PATH,持久 runtime-results 只挂给 API。
采用容器化 API/Runtime 时,不要把宿主 Python 3.12 或 uv 当作必需条件。
完成后执行健康检查、MCP 连接、真实 Python/Shell 单文件 Artifact、权限撤销、
Range/分块读取和受控写审批 smoke test,并输出脱敏的验收结果与回滚命令。
只有类型检查或单元测试通过不代表 Linux 执行环境已验收。部署 AI 必须在目标主机上完成文档中的 rootless Docker/Podman、cgroup v2、固定 digest 镜像和真实能力 smoke test,才能报告生产安装完成。
给 Agent Host 配置两项运行时 Secret:
MCP URL: https://agentgate.example.com/mcp
Authorization: Bearer agk_<key-id>.<secret>
推荐流程:
tools/list + resources/list
-> agentgate_catalog_search (目录很大时)
-> agentgate_resources_search(profileRef, kind, query)
-> <stable-operation-tool>(profileRef, arguments, _context)
read -> succeeded | failed
large read -> delivery: task -> agentgate_jobs_get
-> delivery: artifact -> agentgate_artifacts_read
write -> awaiting_approval + request id + digest
-> agentgate_requests_get(requestId)
例如 K8s 读取工具:
{
"name": "platform.kubernetes.workload.get.v1_0_0",
"arguments": {
"profileRef": "profile:cap-k8s-get",
"environment": "production",
"namespace": "payments",
"workload": "checkout-api",
"_context": {
"reason": "Inspect current workload health",
"idempotencyKey": "incident-42-read-1"
}
}
}Agent 不应永久缓存集群、namespace、索引或指标清单,也不能猜 profileRef。Grant 或 Target 被停用后,下一次发现和执行立即反映撤权。
| 面 | Canonical path | 调用者 |
|---|---|---|
| MCP runtime | POST /mcp |
MCP Agent/Host |
| HTTP runtime | /api/runtime/v1/* |
不支持 MCP 的机器客户端 |
| Control plane | /api/control/v1/* |
管理端和可信人员 |
| Feishu webhook | POST /hooks/feishu/events |
飞书开放平台 |
Runtime 入口:
GET /api/runtime/v1/identity
GET /api/runtime/v1/catalog
POST /api/runtime/v1/catalog/search
POST /api/runtime/v1/resources/search
GET /api/runtime/v1/guide.md
GET /api/runtime/v1/openapi.json
POST /api/runtime/v1/invocations
GET /api/runtime/v1/invocations/{request_id}
GET /api/runtime/v1/jobs?limit=50
GET /api/runtime/v1/jobs/{job_id}
POST /api/runtime/v1/jobs/{job_id}/cancel
GET /api/runtime/v1/artifacts?limit=50
GET /api/runtime/v1/artifacts/{artifact_id}
POST /api/runtime/v1/artifacts/{artifact_id}/read
GET /api/runtime/v1/artifacts/{artifact_id}/content
所有目录和 Guide 响应都按当前 Access Key 动态生成,使用 Cache-Control: private, no-store,且不包含 Access Key、connectorRef 或目标凭据。项目不提供 /apis/* 或 /api/admin/* 迁移别名。
AgentGate 不内置 Skill 分析器或转换器。外部 AI 自己读取旧 Skill/脚本,完成能力拆分、JSON Schema、迁移编排以及受控 HTTP、Python、Shell 或 OCI 实现;它先从 /.well-known/agentgate、/api/control/v1/openapi.json、Schemas、Providers 和当前 export 获取实时标准,再生成 agentgate.dev/v1alpha1 Bundle 与所需能力包。默认路径是新建受控 HttpOperation 或能力包;只有实时 Catalog 中已有完全同义的 Operation 时才选择复用。
平台不可外包的职责是 Secret write-only 保管与注入、Schema/引用校验、Runtime 隔离、Policy/Scope/Grant、ChangePlan 与并发控制、生产写审批、审计,以及统一 MCP projection。控制面使用独立 agc_ Token;资源按 Bundle -> ChangePlan -> exact planDigest apply 写入,Credential 通过 write-only action 单独创建。应用配置后,为 Consumer 一次性签发独立 agk_,业务 Agent 再通过 /mcp 发现和调用被 Grant 的能力。控制面 AI 不能批准目标系统写操作。
管理员可以直接在管理台“AI 委托授权”完成两步操作:先选择 Scope 创建委托身份,再签发限时 agc_。结果页自动把当前部署的 /.well-known/agentgate 和 /api/control/v1/authoring.md 完整地址写入迁移提示词,用户只需补充“将 xxx Skill 迁移到此平台”等实际任务。Key 应通过 AGENTGATE_AUTHOR_KEY 或 AGENTGATE_AUTHOR_KEY_FILE 注入运行 AI 的环境,不能粘进提示词;迁移完成后应撤销或轮换。
当前受控 HTTP 执行器支持固定 endpoint、method/path template、输入/输出 Schema、响应上限、禁止重定向以及服务端 Credential Header 注入。普通 Python/Shell 仍默认断网且无 Secret,只能纯计算或生成 Broker plan;不要把 Manifest 中尚未可发布的 OCI/network/secrets 字段误解为当前已有的直通能力。
完整协议和多 ES/K8s 示例见 外部 AI Authoring 标准,可选薄客户端位于 skills/agentgate-author。
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=xxx
FEISHU_CHAT_ID=oc_xxx
FEISHU_CALLBACK_TOKEN=xxx
FEISHU_ENCRYPT_KEY=xxx
FEISHU_NOTIFY_MODE=group_and_direct回调地址:
https://agentgate.example.com/hooks/feishu/events
飞书只是交互入口,AgentGate 数据库是审批唯一事实源。批准绑定精确 ActionPlan digest;执行前再次检查 Key、Consumer、Grant、定义版本、Profile、目标、参数范围、审批策略和有效期。未配置飞书应用凭据时保存 preview 投递,Web 审批仍可测试。
OIDC 可不开启。HUMAN_AUTH_MODE 支持:
local:默认模式,本地账号密码登录;密码使用带 Pepper 的scrypt哈希,浏览器使用HttpOnly + SameSite=Strict服务端 Session,写请求需要 CSRF Token。demo:仅本地开发,使用演示人员。trusted_proxy:生产由现有 SSO、飞书登录网关或内网身份网关注入x-agentgate-user-id。
生产环境拒绝 demo。API 和 Web 可以继续监听 0.0.0.0;HTTP 内网部署可直接登录,WEB_ORIGIN 为 HTTPS 时 Session Cookie 会自动增加 Secure 和 __Host- 约束。HTTP 不提供传输加密,只应放在受信任私网;跨共享或不可信网络时建议启用 TLS。Access Key 是机器身份,与人员登录/OIDC 相互独立。
先在“Runtime 环境”创建环境和不可变版本,完成构建并发布;上传 .py 或 .sh 时选择一个语言匹配的已发布 Runtime Version。版本弃用后禁止新能力绑定,但已经固定到该版本的能力继续运行,避免弃用被误用成紧急撤权。
普通 Python/Shell 包默认没有网络和 Secret:
| Tier | 能力包可以做什么 |
|---|---|
compute |
无网络纯计算 |
brokered_read |
生成受限 read plan,由平台 Broker 读取 |
brokered_write_plan |
生成 ActionPlan,人工批准后由 Broker 写入 |
certified_connector |
外部交付的固定 digest 认证 OCI;当前 MVP 只接受声明/扫描,拒绝发布和执行 |
compute 能力需要返回较大结果时,可在 Manifest 的 limits.artifactOutput 中声明最大字节数和允许的媒体类型。平台向 Python/Shell 注入 AGENTGATE_OUTPUT_FILE=/work/artifact;程序只向该路径写一个普通文件,同时 stdout 仍只返回一个有界 JSON envelope,并用至多一项 artifacts: [{"filename":"result.ndjson","mediaType":"application/x-ndjson"}] 声明它。文件字节不经过 stdout 或 base64;Agent 收到 delivery: "task" 后轮询 Job,再按需分块读取或下载运行时 Artifact。
本地开发默认启用 uv Runtime Builder;生产默认关闭,单一可信管理员的首版部署可显式设置 RUNTIME_BUILDER=local_uv,但 Builder 必须运行在与 Base Runtime 匹配的系统 Python/OS/架构中。macOS sandbox_exec 只用于本地 ABI 验证。Linux 单机生产使用独立 runnerd,API 容器绝不挂 Docker/Podman socket;runnerd 启动前强制检查 rootless、cgroup v2/systemd controllers、seccomp 和本地 digest 镜像。多节点或更高隔离要求再使用 Kubernetes Job + gVisor/Kata。详见 Linux Runner 部署 和 能力包契约。
npm run typecheck
npm test
npm run build详细文档:
skills/agentgate-ops 是不支持 MCP 的 Host 使用的可选 HTTP Skill,不是 AgentGate 的 SDK,也不是接入前置条件。