[Huawei] 添加 AgentGIS Agent 集成层架构规划与迭代路线

This commit is contained in:
2026-07-21 02:28:54 +00:00
parent a1c8935cbd
commit 6465e27d22
@@ -0,0 +1,916 @@
# 🏗️ AgentGIS Cloud Platform — Agent 集成层架构规划与迭代路线
> **编制**: Huawei | **日期**: 2026-07-21
> **基于**: CARTO for Agents 架构研究 + AgentGIS 平台现状
> **定位**: 平台下一阶段架构升级的决策参考
---
## 目录
1. [现状快照](#一现状快照)
2. [目标架构蓝图](#二目标架构蓝图)
3. [差距分析](#三差距分析)
4. [迭代路线](#四迭代路线)
5. [Phase 1 详设:Skill 目录 + CLI 扩展](#五phase-1-详设skill-目录--cli-扩展)
6. [Phase 2 详设:MCP Server](#六phase-2-详设mcp-server)
7. [Phase 3 详设:Suite as Tool](#七phase-3-详设suite-as-tool)
8. [Phase 4 展望:语义模型与 Agent 自动化](#八phase-4-展望语义模型与-agent-自动化)
9. [附录](#九附录)
---
## 一、现状快照
### 1.1 我们有什么
```
用户 / AI Agent
├── mk_ API Key → suites.mercator.cn REST API ← 当前主要 Agent 接入方式
└── agc CLI(仅 run + config 子命令)
├── agc run <dir> --suite-id <id> --input k=v
├── agc config set/get/list
└── agc config set api-key <key>
```
**平台核心:**
| 组件 | 状态 | 说明 |
|------|------|------|
| `auth-center` | ✅ 运行中 | 认证 + API Key + OIDC + OAuth2/OIDC 服务端 |
| `suite-market` | ✅ 运行中 | 套件 CRUD、发布、合规检测、搜索 |
| `discussions` | ✅ 运行中 | 社区讨论、故障自动报告 |
| `gis-actions` (`agc`) | ✅ 运行中 | CLI 本地执行器,当前只有 `run``config` |
| `Agent Profiles` | ✅ 运行中 | SuiteHub/agent-profiles 仓库,多角色认知文件 |
| 合规检测 | ✅ 有 | `POST /api/v1/compliance/check` |
| 参数校验 | ✅ 有 | `POST /api/v1/parameters/validate` |
### 1.2 我们缺什么
| 能力 | 状态 | 差距 |
|------|------|------|
| **CLI 全平台覆盖** | ❌ 仅 `run` + `config` | 无搜索、无认证管理、无数据操作、无查看健康状态 |
| **CLI JSON 输出** | ❌ | 当前输出是自由文本,Agent 无法可靠解析 |
| **Agent Skill 目录** | ❌ 无 | Agent Profiles 是静态认知文件,不是可加载的 playbook |
| **MCP Server** | ❌ 无 | Agent 接入面窄,只有 REST API |
| **Workflow as Tool** | ❌ 无 | 套件 = 流程,但不可被 Agent 直接调用 |
| **语义模型** | ❌ 无 | Agent 不理解数据含义,依赖人填参数 |
| **Agent 审计追踪** | ❌ 无 | 无法追踪"哪个 Agent 做了什么操作" |
---
## 二、目标架构蓝图
### 2.1 两层架构 → 四层架构
```
当前(两层) 目标(四层)
Agent ──REST──→ suite-market Agent ──MCP──→ MCP Server
CLI ├── Platform Tools(内置)
│ ├── Interactive Tools(未来)
│ └── Suite Tools(动态注册)
agc ──→ 本地执行
Agent Skill 目录
Utility → Platform → Use-case
agc CLI(扩展)
suite-market REST API(不变)
```
### 2.2 目标架构总图
```
┌──────────────────────────────────────────────────────────────────────────┐
│ Agent 集成层(新建/扩展) │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────┐ ┌────────────────────────┐ │
│ │ MCP Server(新建) │ │ Agent Skills(新建) │ │
│ │ agentgis-mcp-server:8100 │ │ │ │
│ │ │ │ Use-case Tier │ │
│ │ Platform Tools(内置): │ │ ├─ 围栏分析 │ │
│ │ ├─ list_suites │ │ ├─ POI 叠加 │ │
│ │ ├─ inspect_suite │ │ ├─ 热点分析 │ │
│ │ ├─ run_suite │ │ ├─ 数据质量报告 │ │
│ │ ├─ run_suite_async │ │ └─ arcgis-迁移(远期) │ │
│ │ ├─ get_run_status │ │ ↑ 依赖 │ │
│ │ ├─ get_run_results │ │ Platform Tier │ │
│ │ ├─ check_compliance │ │ ├─ 套件搜索与运行 │ │
│ │ ├─ search_data │ │ ├─ 合规检测流程 │ │
│ │ └─ get_org_stats │ │ ├─ 数据导入导出 │ │
│ │ │ │ └─ 平台健康检查 │ │
│ │ Suite Tools(动态注册): │ │ ↑ 依赖 │ │
│ │ 每个标记为 mcp_enabled=True 的套件 │ │ Utility Tier │ │
│ │ 自动注册为一个 tool │ │ ├─ 安装与认证 │ │
│ │ │ │ ├─ agc 基础命令 │ │
│ │ 认证:API Key / OAuth(未来) │ │ ├─ Docker 执行模型 │ │
│ └─────────────────────────────────────────┘ │ └─ Gitea 包下载 │ │
│ └────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ agc CLI(扩展) 人类 + Agent 通用 │ │
│ │ agc auth login|token|logout │ │
│ │ agc suite search|inspect|run|list-status │ │
│ │ agc data import|export|list │ │
│ │ agc compliance check │ │
│ │ agc org stats │ │
│ │ agc mcp start|stop|status ← 新增:MCP 本地代理 │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────┐
│ 平台服务层(现有,小幅修改) │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ suite-market+ mcp_enabled 字段 + 审计 API
│ auth-center+ M2M OAuth 支持,远期) │
│ discussions+ Agent 操作审计话题) │
│ │
└──────────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────────┐
│ 本地执行层(不变) │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ agc run → 下载 → 解压 → 拓扑序执行 → 结果保留本地 │
│ │
└──────────────────────────────────────────────────────────────────────────┘
```
### 2.3 Agent 交互流程(目标态)
```
场景 A:人类在终端用
用户 → agc suite search --keyword 围栏 → JSON 结果
场景 BClaude Code 通过 CLI 操作
Claude Code → shell: agc suite search --keyword 围栏 --format json
→ 解析 JSON → 决定调用哪个套件
→ shell: agc suite run --suite-id geofence --input center=POINT(116 40)
场景 CChatGPT 通过 MCP 操作
ChatGPT → MCP list_suites(keyword="围栏")
→ MCP run_suite(suite_id="geofence", inputs={"center": "POINT(116 40)"})
→ MCP Server → 调用 suite-market API → 触发 agc run(本地或返回执行指令)
场景 D:自研 Agent 通过 Skill Playbook 操作
Agent 收到请求:{"type": "geofence", "params": {...}}
→ 匹配 trigger 关键词 → 加载 geofence-analysis skill
→ 按 skill steps 执行:agc suite search → agc suite run → agc suite list-status
```
---
## 三、差距分析
### 3.1 能力对照矩阵
| 能力 | CARTO | AgentGIS 现状 | 差距等级 | 参考实现 |
|------|-------|--------------|---------|---------|
| **CLI 安装** | `npm install -g @carto/carto-cli` | `pip install gis-actions` | 等效 | 无需改动 |
| **CLI 命令覆盖** | 30+ 子命令(auth/credentials/maps/workflows/import/export/org | 2 子命令(run/config | 🔴 严重 | [Phase 1](#五phase-1-详设skill-目录--cli-扩展) |
| **CLI JSON 输出** | 默认 JSON | 文本格式,需解析 | 🟡 中等 | `--format json` 全局参数 |
| **CLI 认证集成** | `carto auth login` OAuth 交互式 | `agc config set api-key` 手动配 | 🟡 中等 | `agc auth login` + OAuth 设备码流 |
| **Agent Skills** | 三层 15+ skillGitHub 公开仓库 | 无 | 🔴 严重 | [Phase 1](#五phase-1-详设skill-目录--cli-扩展) |
| **MCP Server** | 托管式,OAuth/Token 认证 | 无 | 🔴 严重 | [Phase 2](#六phase-2-详设mcp-server) |
| **Workflow as Tool** | 一键 MCP publish | 无 | 🔴 严重 | [Phase 3](#七phase-3-详设suite-as-tool) |
| **平台工具(内置)** | list_connections, browse_tables, describe_table... | 无 | 🔴 严重 | Phase 2 内置 |
| **交互式地图** | view_mapMCP Apps 内联渲染) | 不需要 | 不适用 | 无计划 |
| **语义模型** | Apache Ossie + CARTO 空间扩展 | 无 | 🟡 中等 | Phase 4 |
| **Agent 审计** | CARTO AI Analytics 面板 | 无 | 🟡 中等 | Phase 3+ |
| **迁移工具** | carto-arcgis-migration | 无 | 🟢 低 | 按需 |
| **In-product Agent** | Builder 内嵌聊天 | 暂不考虑 | 不适用 | 排除 |
### 3.2 技术债评估
| 项目 | 影响 | 建议 |
|------|------|------|
| `agc` 无统一输出格式 | Agent 无法可靠解析 | 加全局 `--format json|text` |
| suite-market 无 MCP 相关 API | 无法注册和查询 mcp_enabled 套件 | 后端加字段 + API |
| 无 Agent 操作审计 | 无法追踪谁做了什么 | PostgreSQL + Redis 写审计流 |
| 无隔离的 MCP Server 容器 | 需要新容器 | Docker + NPM 反代 |
| Agent Profiles 是静态文件 | 不能程序化加载 | 独立出 skills 目录结构 |
---
## 四、迭代路线
### 总览
```
Phase 1 Phase 2 Phase 3 Phase 4
2026-07-21 2026-08-01 2026-09-01 2026-Q4
───────── ───────── ───────── ────────
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Skill 目录 │ │ MCP Server │ │ Suite as Tool │ │ 语义模型 │
│ CLI 扩展 │ ───► │ (基础版) │ ───► │ (动态注册) │ ───► │ Agent 自决 │
│ 审计埋点 │ │ Claude 对接 │ │ AI Analytics │ │ 策 + 优化 │
└──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘
2-3 周 3-4 周 3-4 周 远期持续
```
### Phase 1:地基(2026-07-21 起,预计 2-3 周)
**目标:让 AI 编码 Agent 能正确操作 AgentGIS 平台**
| 工作项 | 交付物 | 负责人 |
|--------|--------|--------|
| **1a. 设计 Skill 目录结构** | `agent-skills/` 目录 + 仓库 | Huawei(开 Issue |
| **1b. 编写 Utility Skill3 个)** | install-auth.md, basic-commands.md, execution-model.md | Huawei(开 Issue |
| **1c. 编写 Platform Skill2 个)** | suite-search-run.md, compliance-check.md | Huawei(开 Issue |
| **1d. 编写 Use-case Skill1 个)** | geofence-analysis.md | Huawei(开 Issue |
| **1e. 扩展 `agc` CLI** | 添加 auth/search/list-status/stats 子命令 + `--format json` | Admin(编码) |
| **1f. 审计埋点** | `suite-market` 后端添加 `agent_action` 审计表 | Admin(编码) |
**验收标准:**
- ✅ Claude Code 通过 skill 引导,能用 `agc` CLI 完成"搜索套件→查看详情→运行"
-`agc suite search --format json` 返回可解析 JSON
- ✅ 所有 Agent 操作写入审计日志
### Phase 2:标准协议接入(2026-08-01 起,预计 3-4 周)
**目标:让任意 MCP 兼容的 AI 客户端能直接调用 AgentGIS 平台**
| 工作项 | 交付物 | 负责人 |
|--------|--------|--------|
| **2a. 搭建 MCP Server 容器** | Docker 镜像 + NPM 反代 (mcp.mercator.cn) | Huawei(运维) |
| **2b. 实现核心 Platform Tools** | list_suites, inspect_suite, run_suite, run_suite_async, get_run_status, get_run_results, check_compliance | Admin(编码) |
| **2c. API Key 认证集成** | MCP Server 验证 `mk_` 前缀 API Key | Admin(编码) |
| **2d. 对接 Claude Desktop 测试** | 配置 MCP Server URL,端到端验证 | Huawei(测试) |
| **2e. 对接 ChatGPT 测试** | ChatGPT 自定义 MCP 测试 | Huawei(测试) |
| **2f. 编写 MCP 使用文档** | 开发者指南 + 用户指南 | Huawei(文档) |
**验收标准:**
- ✅ ChatGPT 直接聊天:搜索套件→查看详情→运行→查状态→获取结果
- ✅ Claude Desktop 同样可用
- ✅ 认证正确,非法 API Key 被拒绝
-`mcp.mercator.cn` 稳定运行
### Phase 3:动态套件工具(2026-09-01 起,预计 3-4 周)
**目标:经合规检测的套件自动变为可 MCP 调用的工具**
| 工作项 | 交付物 | 负责人 |
|--------|--------|--------|
| **3a. suite-market 增加 mcp_enabled 字段** | 模型迁移 + API 更新 + 前端 UI | Admin(编码) |
| **3b. 合规通过后自动标记** | 合规检测流程末尾增加自动标记逻辑 | Admin(编码) |
| **3c. MCP Server 动态注册** | MCP Server 读取可调用套件列表,自动注入 tools | Admin(编码) |
| **3d. 异步执行支持强化** | 执行状态回调 / 轮询 + 超时机制 | Admin(编码) |
| **3e. AI Analytics 面板** | 审计数据 → 可视化面板(操作排行、成功/失败率) | Admin(编码) |
| **3f. 完善 Use-case Skill 目录** | 再写 3 个 Use-case skill | Huawei(文档) |
**验收标准:**
- ✅ 发布一个合规套件 → 自动在 MCP Server 上出现为可调用 tool
- ✅ Agent 直接调 `run_geofence_analysis(inputs={...})` → 执行 → 返回结果
- ✅ 管理员看到 Agent 操作统计面板
- ✅ Skill 目录达到 5+ 个 Use-case skill
### Phase 4:智能 Agent 层(2026-Q4,远期)
**目标:Agent 能理解数据含义,自动选择并填充参数执行套件**
| 工作项 | 说明 |
|--------|------|
| 4a. **语义模型设计** | 基于 Apache Ossie 标准,定义数据集、字段、关系、指标 |
| 4b. **语义模型存储** | suite-market 扩展,支持套件关联语义模型 |
| 4c. **Agent 自决策** | Agent 根据用户自然语言描述 + 语义模型,自动匹配套件并填充参数 |
| 4d. **M2M OAuth** | 为微服务和自动化 Agent 提供机器间认证 |
| 4e. **迁移工具(按需)** | 如出现迁移需求,实现 agentgis-arcgis-migration skill |
---
## 五、Phase 1 详设:Skill 目录 + CLI 扩展
### 5.1 Skill 目录结构
**仓库位置:** `SuiteHub/agent-profiles`(已有仓库,新增 `agent-skills/` 目录)
```
SuiteHub/agent-profiles/agent-skills/
├── catalog.json ← 技能清单(供 Agent 程序化加载)
├── ARCHITECTURE.md ← 架构说明 + 加载规则
├── utility/
│ ├── install-and-auth.md ← 安装 agc + 配置 API Key
│ ├── basic-commands.md ← agc 基础命令参考
│ ├── execution-model.md ← Docker 隔离执行模型说明
│ └── gitea-packages.md ← Gitea Packages 下载模式
├── platform/
│ ├── suite-search-and-run.md ← 搜索套件 + 查看详情 + 运行
│ ├── compliance-check.md ← 合规检测流程
│ ├── data-import-export.md ← 数据导入导出(配合 CLI)
│ └── platform-health.md ← 平台健康检查
└── use-case/
├── geofence-analysis.md ← 地理围栏分析
├── poi-overlay-analysis.md ← POI 叠加分析(Phase 3+
├── spatial-statistics.md ← 空间统计(Phase 3+
└── data-quality-report.md ← 数据质量报告(Phase 3+)
```
### 5.2 Skill 文件模板
每个 `.md` 文件遵循统一格式,Agent 可程序化解析:
```markdown
# Skill: <名称>
> 层级: utility | platform | use-case
> 触发词: keyword1, keyword2, keyword3
> 依赖: [utility/install-and-auth, ...]
## 适用场景
(用自然语言描述什么情况下 Agent 应该加载这个 skill
## 前置条件
(需要在加载这个 skill 之前已满足的条件)
## 步骤
### 步骤 1xxxx
```bash
agc <command> <args> --format json
```
输出示例:
```json
{...}
```
解析指引:Agent 应该关注哪个字段、如何判断下一步...
### 步骤 2xxxx
...
## 完整示例
一个端到端的对话或脚本示例
## 常见错误
(Agent 可能遇到的错误及处理方法)
```
### 5.3 Skill 加载规则(`catalog.json`
```json
{
"version": "1.0",
"skills": [
{
"id": "install-and-auth",
"tier": "utility",
"triggers": ["install", "setup", "auth", "api key", "login"],
"dependencies": [],
"file": "utility/install-and-auth.md"
},
{
"id": "basic-commands",
"tier": "utility",
"triggers": ["agc", "cli", "command"],
"dependencies": ["install-and-auth"],
"file": "utility/basic-commands.md"
},
{
"id": "suite-search-and-run",
"tier": "platform",
"triggers": ["search suite", "run suite", "execute", "find suite"],
"dependencies": ["install-and-auth", "basic-commands"],
"file": "platform/suite-search-and-run.md"
},
{
"id": "geofence-analysis",
"tier": "use-case",
"triggers": ["geofence", "fence", "buffer", "围栏", "缓冲区"],
"dependencies": ["suite-search-and-run", "execution-model"],
"file": "use-case/geofence-analysis.md"
}
]
}
```
**Agent 加载逻辑:**
1. 解析用户请求 → 提取关键词
2. 匹配 `catalog.json` 中 skills[].triggers → 收集匹配的 skill ID
3. 去重、按 tier 排序(utility → platform → use-case
4. 递归加载 dependencies
5. 按加载顺序读取所有 `.md` 文件注入 Agent 上下文
### 5.4 `agc` CLI 扩展设计
**新增子命令:**
```
agc
├── auth
│ ├── login # OAuth 设备码流(远期)
│ ├── token set <key> # 当前 config set api-key 的改版
│ ├── token show # 显示当前 API Key(掩码)
│ └── token test # 测试 API Key 有效性
├── suite
│ ├── search <keyword> # 搜索套件(封装 GET /api/v1/suites/search
│ ├── inspect <suite-id> # 查看套件详情
│ ├── run <suite-id> --input k=v # 当前 run 的精简版
│ └── list-status # 查看历史执行状态(新增功能)
├── data
│ ├── list # 列出已连接的数据源(远期)
│ ├── import <file> # 导入数据(远期)
│ └── export <suite-id> <fmt> # 导出结果(远期)
├── compliance
│ └── check <suite-id> # 触发合规检测
├── org
│ └── stats # 组织统计
├── mcp
│ ├── start # 启动本地 MCP 代理(远期)
│ └── status # 查看 MCP 连接状态
└── config (现有)
├── set <key> <value>
├── get <key>
└── list
```
**全局标志:**
- `--format json|text` — 控制输出格式。默认 `text`(人类友好),`json`Agent 友好)
- `--quiet` — 只输出结果数据,无 banner/提示信息
- `--timeout <seconds>` — 执行超时
**JSON 输出格式约定:**
所有返回 JSON 的子命令遵循统一 schema
```json
{
"status": "ok" | "error",
"data": { ... },
"error": { "code": "ERROR_CODE", "message": "Human readable" }
}
```
### 5.5 审计埋点设计
**新表 `agent_action_log``suite_market_db`):**
```sql
CREATE TABLE agent_action_log (
id BIGSERIAL PRIMARY KEY,
api_key_id VARCHAR(64) NOT NULL, -- 哪个 API Key 执行的操作
agent_name VARCHAR(128) DEFAULT '', -- Agent 标识(如 "claude-code"
action VARCHAR(64) NOT NULL, -- 操作类型
target_type VARCHAR(32), -- 操作对象类型(suite/data/...
target_id VARCHAR(128), -- 操作对象 ID
request JSONB, -- 请求参数
response_summary VARCHAR(256), -- 响应摘要
status VARCHAR(16) DEFAULT 'success', -- success/failure
duration_ms INTEGER, -- 耗时
ip_address INET,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX idx_agent_action_log_api_key ON agent_action_log(api_key_id);
CREATE INDEX idx_agent_action_log_created ON agent_action_log(created_at);
```
**采集点:**
- 所有 REST API 入口(通过 FastAPI middleware
- `agc` CLI 所有子命令(通过请求头 `X-Agent-Name`
- 未来 MCP Server 所有调用
---
## 六、Phase 2 详设:MCP Server
### 6.1 架构
```
Claude.ai / ChatGPT / 自研 Agent
│ MCP Protocol (SSE / Streamable HTTP)
┌──────────────────────────────────────┐
│ agentgis-mcp-server:8100 │
│ │
│ Python (FastAPI) + mcp-python-sdk │
│ │
│ Auth Middleware: 验证 mk_ API Key │
│ │
│ ┌────────────────────────────────┐ │
│ │ Tool Registry │ │
│ │ ├── Built-in Tools (静态) │ │
│ │ │ ├── list_suites │ │
│ │ │ ├── inspect_suite │ │
│ │ │ ├── run_suite │ │
│ │ │ ├── run_suite_async │ │
│ │ │ ├── get_run_status │ │
│ │ │ ├── get_run_results │ │
│ │ │ ├── check_compliance │ │
│ │ │ ├── search_data │ │
│ │ │ └── get_org_stats │ │
│ │ └── Suite Tools (动态) │ │
│ │ └── Phase 3 启用 │ │
│ └────────────────────────────────┘ │
│ │
│ Backend Calls: │
│ └─→ suites.mercator.cn REST API │
│ └─→ auth.mercator.cn 验证 API Key │
└──────────────────────────────────────┘
Nginx Proxy Manager
mcp.mercator.cn → agentgis-mcp-server:8100
```
### 6.2 核心 Tool 定义
每个 tool 用 JSON Schema 定义参数和返回:
#### `list_suites`
```json
{
"name": "list_suites",
"description": "搜索可用套件。从关键词搜索或按分类浏览所有已发布套件。",
"inputSchema": {
"type": "object",
"properties": {
"keyword": { "type": "string", "description": "搜索关键词,支持模糊匹配" },
"category": { "type": "string", "description": "分类过滤" },
"page": { "type": "integer", "description": "页码,默认 1" },
"page_size": { "type": "integer", "description": "每页数量,默认 10" }
}
}
}
```
#### `inspect_suite`
```json
{
"name": "inspect_suite",
"description": "查看套件的详细信息,包括参数说明、版本历史、使用说明。Agent 在决定运行前应该先 inspect。",
"inputSchema": {
"type": "object",
"properties": {
"suite_id": { "type": "string", "description": "套件 ID" },
"version": { "type": "string", "description": "可选,指定版本" }
},
"required": ["suite_id"]
}
}
```
#### `run_suite`
```json
{
"name": "run_suite",
"description": "运行套件。参数必须匹配 inspect_suite 返回的 parameter_schema。同步执行,等待结果返回。",
"inputSchema": {
"type": "object",
"properties": {
"suite_id": { "type": "string", "description": "套件 ID" },
"version": { "type": "string", "description": "可选,指定版本" },
"inputs": {
"type": "object",
"description": "参数键值对,格式由套件的 parameter_schema 定义",
"additionalProperties": { "type": "string" }
}
},
"required": ["suite_id", "inputs"]
}
}
```
#### `run_suite_async`
`run_suite` 相同参数,但立即返回 `run_id`Agent 用 `get_run_status` / `get_run_results` 轮询。
#### `check_compliance`
```json
{
"name": "check_compliance",
"description": "对套件的脚本内容触发合规检测。返回合规评分和检测报告。",
"inputSchema": {
"type": "object",
"properties": {
"suite_id": { "type": "string", "description": "套件 ID" },
"version": { "type": "string", "description": "可选,指定版本" }
},
"required": ["suite_id"]
}
}
```
### 6.3 认证实现
```
Client Request Header:
Authorization: Bearer mk_8e8oJPtslcrwWMdbveIYF6JTj2DdVWmip1YuXDywQsY
MCP Server:
1. 提取 Bearer Token
2. 调 auth.mercator.cn/api/v1/apikeys/verify
POST { "api_key": "mk_..." }
← { "valid": true, "user_id": "...", "scopes": ["suite:read", "suite:run"] }
3. 缓存验证结果(5 分钟 TTLRedis)
4. 在 tool 执行时检查 scope 是否匹配
```
### 6.4 部署配置
```dockerfile
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY src/ ./src/
ENV PYTHONPATH=/app/src
EXPOSE 8100
CMD ["uvicorn", "src.main:app", "--host", "0.0.0.0", "--port", "8100"]
```
```yaml
# docker-compose 新增服务
agentgis-mcp-server:
build: ./agentgis-mcp-server
container_name: agentgis-mcp-server
networks:
- mercator-net
environment:
- SUITE_MARKET_URL=http://suite-market-backend:8001
- AUTH_CENTER_URL=http://auth-center-backend:8000
- REDIS_URL=redis://mercator-redis:6379/1
- MCP_SERVER_PORT=8100
- LOG_LEVEL=info
restart: unless-stopped
```
```
NPM 配置:
Domain: mcp.mercator.cn
Forward: http://agentgis-mcp-server:8100
SSL: Let's Encrypt
WebSocket Support: ✅ OnMCP 需要 SSE
```
### 6.5 测试清单
| 测试项 | 方法 | 预期 |
|--------|------|------|
| API Key 正确 | curl -H "Authorization: Bearer mk_..." | 返回正常结果 |
| API Key 错误 | curl -H "Authorization: Bearer mk_wrong" | 401 Unauthorized |
| API Key 过期 | 使用已过期 Key | 401 |
| 无 API Key | curl 无 Authorization | 401 |
| MCP Inspector 连接 | npm install -g @modelcontextprotocol/inspector | 列出的 tools 正确 |
| Claude Desktop 连接 | claude_desktop_config.json 配置 | 工具正常调用 |
| run_suite 同步 | 短套件 | 等待完成后返回结果 |
| run_suite_async | 长套件 | 立即返回 run_id,轮询获取结果 |
| 并发调用 | 同时 5 个请求 | 各请求独立处理 |
---
## 七、Phase 3 详设:Suite as Tool
### 7.1 数据库模型变更
`suite_suites` 表新增字段:
```python
# suite_market 模型
class Suite(Base):
__tablename__ = "suite_suites"
# 现有字段...
id: str
name: str
# ...
# Phase 3 新增
mcp_enabled: bool = False # 是否可作为 MCP Tool 调用
mcp_tool_name: str | None = None # 自定义 tool 名,默认用 suite_id
mcp_description: str | None = None # 自定义 tool 描述,默认用 suite description
mcp_approved_at: datetime | None # 批准时间
mcp_approved_by: str | None # 批准人
mcp_call_count: int = 0 # 累计 MCP 调用次数
```
### 7.2 发布流程变更
```
开发者打包 workflow.yaml + scripts/ → .tar.gz
→ POST /publish/upload(需 API Key + Gitea Token
→ 合规检测
→ 参数校验
→ 上传脚本包到 Gitea Packages
→ 写入 suite_suites
→ [新增] 如果合规通过 → mcp_enabled = True
→ [新增] MCP Server 重新加载 tool 列表
```
### 7.3 MCP Server 动态注册逻辑
```python
# mcp-server 启动时 + 定时刷新(每 5 分钟)
async def refresh_suite_tools():
"""从 suite-market 拉取所有 mcp_enabled=True 的套件,注册为 tool"""
async with httpx.AsyncClient() as client:
resp = await client.get(
f"{SUITE_MARKET_URL}/api/v1/suites",
params={"mcp_enabled": True},
headers={"Authorization": f"Bearer {INTERNAL_TOKEN}"}
)
suites = resp.json()
# 清空旧的 suite tools
suite_tools.clear()
for suite in suites:
# 生成 tool schema
tool_def = {
"name": suite.get("mcp_tool_name") or slugify(suite["id"]),
"description": suite.get("mcp_description") or suite.get("description", ""),
"inputSchema": {
"type": "object",
"properties": {},
"required": []
}
}
# 从 parameter_schema 转换参数定义
for param in suite.get("parameter_schema", []):
tool_def["inputSchema"]["properties"][param["name"]] = {
"type": param.get("json_type", "string"),
"description": param.get("description", "")
}
if param.get("required"):
tool_def["inputSchema"]["required"].append(param["name"])
suite_tools[suite["id"]] = tool_def
```
### 7.4 AI Analytics 面板
**数据源:** `agent_action_log`
**面板内容(可以用简单 K/V 展示或选型 Grafana):**
| 指标 | SQL |
|------|-----|
| 今日活跃 Agent 数 | `SELECT COUNT(DISTINCT api_key_id) FROM agent_action_log WHERE created_at > today()` |
| 操作 Top 5 | `SELECT action, COUNT(*) FROM agent_action_log GROUP BY action ORDER BY 2 DESC LIMIT 5` |
| 成功/失败率 | `SELECT status, COUNT(*) FROM agent_action_log GROUP BY status` |
| 最活跃套件 Top 5 | `SELECT target_id, COUNT(*) FROM agent_action_log WHERE target_type='suite' GROUP BY target_id` |
| 操作趋势(最近 7 天) | `SELECT DATE(created_at), COUNT(*) FROM agent_action_log WHERE created_at > 7days GROUP BY 1` |
**前端集成:** suite-market 前端 Settings → AI Analytics 页
---
## 八、Phase 4 展望:语义模型与 Agent 自动化
> 这部分是远期方向,写在这里作为技术储备,不纳入近期迭代。
### 8.1 语义模型适配
基于 Apache Ossie 扩展空间语义:
```yaml
version: "0.1.1"
semantic_model:
- name: "土地利用分析套件"
description: "基于遥感影像的土地利用分类与分析"
datasets:
- name: "land_use_parcels"
fields:
- name: "geom"
description: "地块边界(Polygon, EPSG:4326"
custom_extensions:
- vendor_name: AgentGIS
data: '{"spatial_data": {"type": "polygon", "srid": 4326}}'
- name: "land_type"
description: "土地利用类型编码"
- name: "area_sqkm"
description: "面积(平方公里)"
metrics:
- name: "各类型占比"
expression: "COUNT(*) * 1.0 / SUM(COUNT(*)) OVER()"
```
### 8.2 Agent 自决策流程
```
用户输入: "帮我分析北京五环内的商业用地分布"
├── (Phase 4) Agent 读取语义模型 → 匹配到 land_use_parcels
├── (Phase 4) Agent 自动选择"围栏 + 分类统计"套件组合
├── (Phase 4) 自动填充参数:center=北京市中心, radius=五环半径
├── (Phase 3) MCP Server → run_suite("geofence-analysis", inputs={...})
└── (Phase 2) 执行 → 返回结果 → Agent 解读输出
```
---
## 九、附录
### A. 工作量估算汇总
| Phase | 工作项 | 类型 | 估计人天 | 优先 |
|-------|--------|------|---------|------|
| P1 | Skill 目录结构搭建 | 文档 | 0.5 | 🔴 |
| P1 | Utility Skill × 3 | 文档 | 1 | 🔴 |
| P1 | Platform Skill × 2 | 文档 | 1 | 🔴 |
| P1 | Use-case Skill × 1 | 文档 | 1 | 🔴 |
| P1 | CLI 扩展(auth/suite/search/stats | 编码 | 3 | 🔴 |
| P1 | CLI JSON 输出格式化 | 编码 | 1 | 🔴 |
| P1 | 审计表 + middleware | 编码 | 2 | 🟡 |
| **P1 小计** | | | **9.5** | |
| P2 | MCP Server 容器搭建 + 部署 | 运维 | 1 | 🔴 |
| P2 | 5 个核心 tool 实现 | 编码 | 4 | 🔴 |
| P2 | API Key 认证中间件 | 编码 | 1 | 🔴 |
| P2 | 测试对接 + 调试 | 测试 | 2 | 🔴 |
| P2 | MCP 使用文档 | 文档 | 1 | 🟡 |
| **P2 小计** | | | **9** | |
| P3 | suite-market 模型变更 | 编码 | 1 | 🔴 |
| P3 | 发布流程修改 | 编码 | 2 | 🔴 |
| P3 | MCP 动态注册 | 编码 | 2 | 🔴 |
| P3 | 异步执行增强 | 编码 | 2 | 🟡 |
| P3 | Analytics 面板前端 | 编码 | 3 | 🟡 |
| P3 | Use-case Skill × 3 | 文档 | 2 | 🟡 |
| **P3 小计** | | | **12** | |
**总计:约 30 人天**(分 3 个阶段执行)
### B. Issue 创建模板
Boss 批准后,按以下模板开 Issue:
```markdown
## 标题
[Agent集成] Phase X: <工作项名称>
## 背景
(为什么做、参考了 CARTO for Agents 的什么设计)
## 需求描述
(具体做什么,验收条件)
## 技术参考
- 架构文档: research/carto-for-agents-architecture-notes.md
- 相关 API: (如有)
- 需要修改的仓库: suite-market / gis-actions / agent-profiles
## 验收条件
- [ ] 条件 1
- [ ] 条件 2
## 指派
@Admin
```
### C. 决策记录
| 决策 | 选择 | 理由 |
|------|------|------|
| MCP 协议版本 | 2025-06-18(最新稳定版) | 客户端支持最广 |
| MCP Server 语言 | Python (FastAPI) | 与现有技术栈一致,mcp-python-sdk 成熟 |
| MCP 传输方式 | SSEServer-Sent Events | 兼容性最好,NPM 支持 WebSocket |
| Agent Skill 格式 | Markdown + JSON catalog | 人类可读,Agent 可解析,无需新工具 |
| CLI JSON 输出 | 全局 --format 参数 | 不影响现有 text 输出兼容性 |
| 审计存储 | PostgreSQLsuite_market_db | 与现有数据库一致,避免引入新存储 |
| 容器网络 | 加入现有 mercator-net | 统一网络管理 |
---
*文档版本: v1.0*
*下次评审: Phase 1 完成后*