DESIGN.md 24 KB

FranklinWH MCP Server 设计文档

1. 概述

FranklinWH MCP Server (fwh-tools) 是基于 Model Context Protocol 实现的内部工具服务器,为 AI Agent(Kiro CLI)提供对 FranklinWH 内部工具平台数据和服务的结构化访问能力。

项目 说明
服务名 fwh-tools
版本 2.1.0
语言 Go
SDK github.com/mark3labs/mcp-go
传输协议 stdio (JSON-RPC 2.0 over stdin/stdout)
构建产物 单二进制 fwh-mcp-server
调用方 Kiro CLI(通过 ACP 协议启动子进程)

2. 架构设计

2.1 整体架构

┌─────────────────────────────────────────────────────┐
│                   Kiro CLI (AI Agent)                 │
│              通过 ACP 协议管理 MCP Server              │
└────────────────────────┬────────────────────────────┘
                         │ stdio (JSON-RPC 2.0)
                         ▼
┌─────────────────────────────────────────────────────┐
│              fwh-mcp-server (本进程)                  │
│                                                      │
│  ┌────────────────────────────────────────────────┐  │
│  │              MCP Protocol Layer                 │  │
│  │         (mcp-go SDK: 请求路由、序列化)          │  │
│  └─────────────────────┬──────────────────────────┘  │
│                        │                             │
│  ┌─────────┬───────────┼───────────┬─────────────┐  │
│  │service/ │  data/    │  storage/ │    util/     │  │
│  │业务逻辑 │ 数据直查   │ 对象存储  │   辅助工具   │  │
│  └────┬────┴─────┬─────┴─────┬─────┴──────┬──────┘  │
│       │          │           │            │          │
└───────┼──────────┼───────────┼────────────┼──────────┘
        │          │           │            │
        ▼          ▼           ▼            │ (纯函数)
┌──────────┐ ┌──────────────────────┐ ┌──────────┐
│ services/│ │  repositories/       │ │  MinIO   │
│层(复用后 │ │  ├─ mongo (MongoDB)  │ │          │
│端业务代 │ │  ├─ redis (Redis)    │ │          │
│码)       │ │  ├─ pgsql (PgSQL)   │ │          │
│          │ │  ├─ api/fwh_pro     │ │          │
│          │ │  ├─ api/plane_v1+v2 │ │          │
│          │ │  └─ api/sim (SH/AC) │ │          │
└──────────┘ └──────────────────────┘ └──────────┘

2.2 与现有后端的关系

MCP Server 是现有后端 Service 层的另一个入口,不是独立系统:

对比项 HTTP Server (main.go) MCP Server (cmd/mcp/main.go)
入口 Fiber HTTP 路由 stdio JSON-RPC
调用方 前端浏览器 Kiro CLI (AI Agent)
认证 Casdoor JWT 无需(本地 stdio 进程)
复用层 controllers → services → repositories 直接调用 services/repositories
输出格式 JSON HTTP Response MCP Tool Result (text/JSON)

2.3 代码目录结构

service/cmd/mcp/
├── main.go                      # 入口:初始化基础设施 + 创建 MCP Server + 注册工具
├── tools/
│   ├── register.go              # RegisterAll:唯一对外注册入口
│   ├── helper/
│   │   └── helper.go            # 统一响应工具函数
│   ├── service/                 # 业务逻辑层工具
│   │   ├── register.go          # RegisterServiceTools
│   │   ├── site.go              # 站点相关工具
│   │   ├── sim.go               # SIM 卡相关工具
│   │   ├── monitor.go           # 监控统计工具
│   │   └── feedback.go          # 反馈协作工具
│   ├── data/                    # 数据直查层工具
│   │   ├── register.go          # RegisterDataTools
│   │   ├── mongo.go             # MongoDB 通用直查
│   │   ├── redis.go             # Redis 缓存读取
│   │   ├── pgsql.go             # PostgreSQL 直查
│   │   ├── emspara.go           # EMS 参数查询
│   │   ├── fwh_api.go           # FWH Pro API 读操作
│   │   ├── plane_api.go         # Plane API 读操作(工具注册)
│   │   ├── plane_api_handlers.go # Plane API 读操作(handler 实现)
│   │   └── sim_api.go           # SmartHub/Acceleronix SIM 卡 API
│   ├── storage/                 # 对象存储层工具
│   │   ├── register.go          # RegisterStorageTools
│   │   ├── file.go              # 用户上传文件读取
│   │   └── minio.go             # MinIO 对象浏览/读取
│   └── util/                    # 辅助工具层
│       ├── register.go          # RegisterUtilTools
│       └── format.go            # SN 解析等纯函数

3. 工具分层架构

采用四层分类设计,按访问层级递进:

┌───────────────────────────────────────────────────┐
│  Layer 1: service_*  — 业务逻辑层(优先使用)        │
│  调用后端 Service 层函数,包含业务校验和数据聚合      │
├───────────────────────────────────────────────────┤
│  Layer 2: data_*     — 数据直查层(灵活查询)        │
│  直接调用 repositories 层,跳过业务逻辑,仅限只读     │
│  覆盖: DB(Mongo/Redis/PgSQL) + 外部API(FWH/Plane/SIM) │
├───────────────────────────────────────────────────┤
│  Layer 3: storage_*  — 对象存储层(文件操作)        │
│  file_* 支持读写,minio_* 仅只读浏览和读取           │
├───────────────────────────────────────────────────┤
│  Layer 4: util_*     — 辅助工具层(纯函数)          │
│  格式解析等不涉及数据持久化的工具                     │
└───────────────────────────────────────────────────┘

命名规范: {layer}_{domain}_{action}

示例:service_site_query_info、data_fwh_query_site_alarm_list、data_plane_list_work_items、storage_minio_list_objects、util_parse_sn


4. 工具清单

4.1 Service 层(业务逻辑)

工具名 说明 参数
service_site_query_info 查询站点设备详情 sn (必填)
service_site_search 搜索站点列表 page, size, keyword
service_site_power_flow 查询功率流数据 sn (必填), date (必填, yyyy-MM-dd)
service_sim_query 查询 SIM 卡详情 giccid (必填)
service_sim_search 搜索 SIM 卡列表 page, size, search, status, platform
service_monitor_alarm_stats 查询告警统计 date
service_monitor_shutdown_stats 查询停机统计 date
service_feedback_create 创建 Plane Intake Issue title (必填), type (必填), priority, description, category
service_feedback_history 查询反馈历史 (无参数)

4.2 Data 层(数据直查)

4.2.1 通用数据库直查

工具名 说明 参数
data_mongo_find MongoDB 集合查询 collection (必填), filter, limit, skip, sort
data_mongo_count MongoDB 文档计数 collection (必填), filter
data_redis_get 读取 Redis key key (必填), type
data_redis_exists 检查 key 存在性及 TTL key (必填)
data_pgsql_query_snapshot_file_record 查询快照文件解析记录 file_name (必填)
data_pgsql_query_snapshot_data 查询告警快照数据 sn (必填), date (必填)
data_emspara_vid_info 查询 EMS VID 参数信息 id (必填)
data_emspara_pid_info 查询 EMS PID 参数信息 id (必填)

4.2.2 FWH Pro API 直查

工具名 说明 参数
data_fwh_query_site_base_info_list 查询站点基本信息列表 sn, page, size
data_fwh_query_site_list 查询站点列表 sn, page, size
data_fwh_query_site_mode_info 查询站点工作模式 sn (必填)
data_fwh_query_site_power_flow 查询站点功率流 sn (必填), date (必填)
data_fwh_query_site_alarm_list 查询站点告警列表 sn (必填)
data_fwh_query_event_alarm_list 查询事件/告警日志 sn (必填), start_time (必填), end_time (必填), type
data_fwh_query_alarm_snapshot 查询告警快照 sn (必填), date (必填)
data_fwh_query_alarm_statistics 查询实时告警统计 country, page
data_fwh_query_alarm_statistics_from_code 按告警码查询站点 alarm_code (必填), country, page
data_fwh_query_mqtt_log_list 查询 MQTT 日志 sn (必填), cmd_type (必填), start_time (必填), end_time (必填)
data_fwh_query_shutdown_list 查询停机站点列表 date (必填), country
data_fwh_query_ems_log_record 查询 EMS 日志记录 sn (必填)
data_fwh_query_fault_record_list 查询故障录波列表 sn (必填), start_time (必填), end_time (必填)
data_fwh_query_fault_record_callable_list 查询可召唤故障录波 sn (必填), dev_type
data_fwh_query_fault_record_call_record_list 查询录波召唤记录 (无参数)
data_fwh_query_fault_record_sub_list 查询录波子记录 fault_id (必填)
data_fwh_query_system_update_log 查询系统升级记录 sn (必填)
data_fwh_query_system_update_log_detail 查询升级记录详情 order_id (必填)
data_fwh_query_ahub_update_log 查询 aHub 升级记录 sn (必填)
data_fwh_query_tou_template_list 查询 TOU 模板列表 search, page, size
data_fwh_query_tou_template_detail 查询 TOU 模板详情 id (必填)

4.2.3 Plane API 直查

工具名 说明 参数
data_plane_list_projects 列出项目 (无参数)
data_plane_get_project 获取项目详情 project_id (必填)
data_plane_get_project_summary 获取项目摘要 project_id (必填), fields
data_plane_list_work_items 列出工作项 state, priority, assignee, label
data_plane_get_work_item 获取工作项详情 work_item_id (必填)
data_plane_get_work_item_by_identifier 通过标识符获取工作项 identifier (必填), sequence_id (必填)
data_plane_search_work_items 搜索工作项 query (必填), limit
data_plane_list_cycles 列出迭代 (无参数)
data_plane_get_cycle 获取迭代详情 cycle_id (必填)
data_plane_list_cycle_issues 列出迭代工作项 cycle_id (必填)
data_plane_list_modules 列出模块 (无参数)
data_plane_get_module 获取模块详情 module_id (必填)
data_plane_list_module_issues 列出模块工作项 module_id (必填)
data_plane_list_states 列出状态 (无参数)
data_plane_list_labels 列出标签 (无参数)
data_plane_list_workspace_members 列出工作空间成员 (无参数)
data_plane_list_project_members 列出项目成员 (无参数)
data_plane_list_work_item_comments 列出评论 work_item_id (必填)
data_plane_list_work_item_activities 列出活动历史 work_item_id (必填)
data_plane_list_work_item_links 列出链接 work_item_id (必填)
data_plane_list_work_item_attachments 列出附件 work_item_id (必填)
data_plane_list_work_item_relations 列出关系 work_item_id (必填)
data_plane_get_intake_issue_list 查询 Intake 列表 (无参数)
data_plane_get_intake_issue_detail 获取 Intake 详情 intake_id (必填)
data_plane_list_pages 列出页面 (V2) (无参数)
data_plane_get_page 获取页面详情 (V2) page_id (必填)
data_plane_get_page_description 获取页面描述 (V2) page_id (必填)

4.2.4 SIM 卡 API 直查

工具名 说明 参数
data_sim_smarthub_batch_info SmartHub 批量查询 SIM 卡 page, size
data_sim_smarthub_card_info SmartHub 单卡详情 giccid (必填)
data_sim_acceleronix_card_list Acceleronix SIM 卡列表 page, size
data_sim_acceleronix_card_info Acceleronix 单卡详情 iccid (必填)
data_sim_acceleronix_batch_data_info Acceleronix 批量数据用量 iccid_list (必填), month (必填)
data_sim_acceleronix_data_pool_list Acceleronix 流量池列表 page, size
data_sim_acceleronix_data_pool_sim_info Acceleronix 流量池 SIM 详情 data_pool_id (必填), page, size

4.3 Storage 层(对象存储)

工具名 说明 参数 读写
storage_file_read 读取用户上传文件 path (必填) 读
storage_file_write 写入文件到存储 path (必填), content (必填) 写
storage_file_list 列出用户上传文件 (无参数) 读
storage_minio_list_objects 列出 MinIO 对象 bucket (必填), prefix, limit 读
storage_minio_read_object 读取 MinIO 文本文件 bucket (必填), key (必填) 读

4.4 Util 层(辅助工具)

工具名 说明 参数
util_parse_sn 解析设备 SN 序列号含义 sn (必填)

5. 安全设计

5.1 访问控制

机制 说明
传输层 stdio 本地进程通信,无网络暴露
认证 无需(由 ACP 管理器控制进程生命周期)
Collection 白名单 MongoDB 查询限制在指定集合内
Bucket 白名单 MinIO 访问限制在指定 bucket 内
只读限制 data_* 层所有操作均为只读(排除写、更新操作)
外部 API datafwh*、dataplane、datasim 仅暴露查询接口,不暴露写操作
文件大小限制 MinIO 读取限制 1MB,用户上传限制 2MB
查询结果限制 MongoDB 单次最多返回 100 条
Redis 安全 不支持通配符 key,防止 KEYS * 类操作
SIM 卡批量限制 Acceleronix 批量查询最多 50 个 ICCID

5.2 白名单配置

MongoDB Collections:

var mongoAllowedCollections = []string{
    "SiteInfoManageData",
    "SiteInfoManageRecord",
    "SimCardManage",
    "SimCardMonthlyData",
    "BatchDownloadConfig",
    "SiteAnalysisConfig",
    "StatisticsShutdown",
    "StatisticsAlarm",
    "SiteMonitorConfig",
    "UserInfo",
    "AutoUpdateConfigOption",
    "AutoUpdateConfig",
    "AiChatSessions",
}

MinIO Buckets:

var minioAllowedBuckets = []string{
    "fwh-toolbox-batch-download",
    "fwh-toolbox-ai-file",
}

5.3 写操作控制

层级 写操作 说明
service service_feedback_create 创建 Plane Intake Issue
data 无 全部只读
storage storage_file_write 写入文件到 MCP FileStore(MinIO),最大 2MB
storage storage_minio_* 仅只读(列出、读取),不支持写入
util 无 纯函数

6. 文件存储设计

6.1 FileStore 架构

MinIO Bucket: fwh-toolbox-ai-file
├── upload/                        ← 用户上传的文件
│   └── {userId}/{sessionId}/{uuid}_{fileName}
│
└── download/                      ← AI 生成的下载文件
    └── {userId}/{sessionId}/{uuid}_{fileName}

6.2 文件生命周期

阶段 操作 说明
上传 POST /ai/files/upload 前端上传 → 后端存入 MinIO(prefix=acp)
读取 Agent readTextFile 或 storage_file_read AI 请求读取 → FileStore 从 MinIO 获取
过期 自动清理 文件设置 7 天过期

6.3 共享模块

通用 FileStore 位于 service/utils/filestore/filestore.go,ACP 和 MCP 通过不同 prefix 实例化:

// ACP 使用
acpFS := filestore.NewFileStore("acp")

// MCP 使用
mcpFS := filestore.NewFileStore("download")

7. 响应格式

7.1 统一响应工具 (helper/helper.go)

函数 用途 返回类型
JSONResult(data) 序列化为格式化 JSON CallToolResult (text)
TextResult(text) 直接返回文本 CallToolResult (text)
ParamError(name) 参数缺失错误 CallToolResult (error)
ParamInvalidError(name, detail) 参数格式错误 CallToolResult (error)
ServiceError(action, err) 业务调用失败 CallToolResult (error)
EmptyResult(msg) 空结果提示 CallToolResult (text)

7.2 错误响应格式

参数 {name} 必填
参数 {name} 格式错误: {detail}
{action}失败: {error}

8. 初始化流程

func main() {
    // 1. 加载配置(与 HTTP Server 共享)
    cfg := config.LoadConfig()

    // 2. 初始化基础设施
    logger.Init(cfg.App.AppEnv)
    database.Init(&cfg.App)          // MongoDB
    cache.Init(cfg.App.RedisAddr)    // Redis
    repositories.PlaneWebHttpInit()  // Plane API

    // 3. 初始化 MCP FileStore (prefix="download")
    mcpFS := filestore.NewFileStore("download")
    storage.InitFileStore(mcpFS)

    // 4. 创建 MCP Server
    s := server.NewMCPServer("fwh-tools", "2.0.0",
        server.WithToolCapabilities(false),
        server.WithRecovery(),
        server.WithInstructions(serverInstructions),
    )

    // 5. 注册所有 Tools(单一入口)
    tools.RegisterAll(s)

    // 6. 启动 stdio 通信
    server.ServeStdio(s)
}

9. 部署配置

9.1 构建

cd service
go build -o fwh-mcp-server ./cmd/mcp

9.2 Kiro MCP 配置

文件:service/.kiro/settings/mcp.json

{
  "mcpServers": {
    "fwh-tools": {
      "command": "./fwh-mcp-server",
      "args": [],
      "env": {
        "MONGO_DSN": "${MONGO_DSN}",
        "REDIS_ADDR": "${REDIS_ADDR}",
        "MINIO_ENDPOINT": "${MINIO_ENDPOINT}",
        "MINIO_ACCESS_KEY": "${MINIO_ACCESS_KEY}",
        "MINIO_SECRET_KEY": "${MINIO_SECRET_KEY}",
        "PLANE_WEB_HOST": "${PLANE_WEB_HOST}",
        "PLANE_WEB_EMAIL": "${PLANE_WEB_EMAIL}",
        "PLANE_WEB_PASSWORD": "${PLANE_WEB_PASSWORD}",
        "PLANE_WEB_WORKSPACE_SLUG": "${PLANE_WEB_WORKSPACE_SLUG}",
        "PLANE_WEB_PROJECT_ID": "${PLANE_WEB_PROJECT_ID}"
      }
    }
  }
}

9.3 部署目录

/var/www/fwh-toolbox/server/
├── fwh-toolbox-server         # HTTP Server
├── fwh-mcp-server             # MCP Server
├── .kiro/
│   ├── settings/mcp.json      # MCP 配置
│   ├── agents/                # Agent 配置
│   └── steering/              # Steering 文件
└── .env                       # 环境变量

10. Instructions 系统提示

MCP Server 通过 server.WithInstructions() 向 AI Agent 提供使用指南:

FranklinWH 工具箱 MCP Server — 内部工具平台的 AI 接口层。

使用原则:
1. 优先使用 service_* 工具,它们包含完整的业务逻辑
2. 仅当 service 层无法满足时才使用 data_* 直查
3. data_* 层覆盖 repositories 全部只读操作(DB + 外部 API)
4. 所有 data_* 和 storage_* 工具仅支持只读操作
5. 查询 MongoDB 时注意 collection 白名单限制

11. 扩展指南

11.1 添加新的 Service 层工具

  1. 在 tools/service/ 下创建新文件(如 newdomain.go)
  2. 实现 registerXxxTools(s *server.MCPServer) 函数
  3. 在 tools/service/register.go 的 RegisterServiceTools 中调用
  4. 工具命名遵循 service_{domain}_{action} 格式

    // tools/service/newdomain.go
    package service
    
    func registerNewDomainTools(s *server.MCPServer) {
    s.AddTool(
        mcp.NewTool("service_newdomain_query",
            mcp.WithDescription("..."),
            mcp.WithString("id", mcp.Required(), mcp.Description("...")),
        ),
        handleNewDomainQuery,
    )
    }
    
    func handleNewDomainQuery(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
    id, err := req.RequireString("id")
    if err != nil {
        return helper.ParamError("id"), nil
    }
    data, err := services.GetSomething(id)
    if err != nil {
        return helper.ServiceError("查询", err), nil
    }
    return helper.JSONResult(data), nil
    }
    

11.2 添加新的 MongoDB Collection 访问

在 tools/data/mongo.go 的 mongoAllowedCollections 白名单中添加新集合名:

var mongoAllowedCollections = []string{
    // ... 现有集合
    "new_collection_name",  // ← 添加这一行
}

11.3 添加新的 MinIO Bucket 访问

在 tools/storage/minio.go 的 minioAllowedBuckets 白名单中添加:

var minioAllowedBuckets = []string{
    // ... 现有 bucket
    "new-bucket-name",  // ← 添加这一行
}

12. 测试

12.1 本地测试

# 构建
cd service && go build -o fwh-mcp-server ./cmd/mcp

# 测试 tools/list
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | ./fwh-mcp-server

# 测试单个工具调用
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"util_parse_sn","arguments":{"sn":"10060006A03X25310091"}}}' | ./fwh-mcp-server

12.2 通过 Kiro CLI 测试

# 在 service/ 目录下(含 .kiro/ 配置)
kiro-cli chat

# 对话中使用工具
> 帮我查一下 SN 为 10060006A03X25310091 的站点信息
> 统计一下 site_info 集合中有多少条记录
> 解析一下这个 SN: 10050004B02X24450023

13. 依赖关系

依赖 版本 用途
github.com/mark3labs/mcp-go latest MCP 协议 SDK
go.mongodb.org/mongo-driver - MongoDB 驱动
github.com/minio/minio-go/v7 - MinIO 客户端
github.com/google/uuid - UUID 生成
go.uber.org/zap - 日志

共享后端模块:

  • fwh-toolbox-server/services — 业务逻辑层
  • fwh-toolbox-server/database — 数据库连接
  • fwh-toolbox-server/cache — Redis 缓存
  • fwh-toolbox-server/repositories — 数据访问层(Mongo/Redis/PgSQL/API)
  • fwh-toolbox-server/domain — 领域对象定义
  • fwh-toolbox-server/utils/filestore — 文件存储
  • fwh-toolbox-server/utils/minio — MinIO 客户端
  • fwh-toolbox-server/config — 配置加载
  • fwh-toolbox-server/dto — 数据传输对象

14. 变更历史

版本 日期 变更内容
1.0.0 2026-08-03 初版:6 个 service 层工具(site/sim/alarm/shutdown/plane)
2.0.0 2026-08-06 重构为四层架构,新增 data/storage/util 层,命名规范化
2.1.0 2026-08-10 data 层全面覆盖 repositories 只读操作:新增 fwh_api(21)、plane_api(25)、sim_api(7)、pgsql(2)、emspara(2) 共 57 个工具;修正 MongoDB 白名单为实际集合名