# apiForge-mcp **Repository Path**: feng-kailong/api-forge-mcp ## Basic Information - **Project Name**: apiForge-mcp - **Description**: 一个基于 Model Context Protocol (MCP) 的 Java 服务,主要用于:通过查询项目数据库自动生成 Apifox 测试接口。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-11 - **Last Updated**: 2026-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # apiForge-mcp **简体中文** | [English](README_EN.md) 一个基于 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 的 Java 服务,主要用于: > **通过查询项目数据库自动生成 Apifox 测试接口。** AI 客户端可通过 MCP 协议调用本服务,先用 SQL 查询业务库结构 / 字段 / 样例数据,再把整理出的接口信息以 OpenAPI 3.0 格式提交给 Apifox,从而快速产出可用于联调和测试的接口定义。 --- ## 功能特性 - 支持 **STDIO** 与 **HTTP** 两种 MCP 传输模式,默认推荐 STDIO(与 Claude Desktop / Qoder / Cursor 等客户端零网络对接)。 - 内置 3 个 MCP 工具: - `createApi`:将一段 OpenAPI 3.0 文档导入到指定 Apifox 项目; - `dataSourceSelect`:执行只读 SQL(仅 `SELECT` / `WITH`)查询业务数据库,返回 JSON 结果; - `getSwaggerContentExample`:返回一份最小可用的 OpenAPI 3.0 示例,供 AI 在不熟悉格式时参考。 - 通过策略枚举内聚多数据库方言,开箱支持 **MySQL / PostgreSQL / Oracle / SQL Server / MariaDB / SQLite** 6 种数据库。 - 启动时自动建表 `api_forge_record`,对每次 `createApi` 调用做审计记录(可通过 `ENABLE_RECORD=0` 关闭)。 - HikariCP 懒加载共享连接池,业务侧调用 `dataSourceSelect` 与审计写入复用同一个池子。 --- ## 技术栈 | 组件 | 版本 | | --- | --- | | Java | 17 | | Spring Boot | 3.2.x | | MCP Java SDK | 1.1.1(mcp-core + mcp-json-jackson2) | | 连接池 | HikariCP | | JSON | fastjson2、Jackson | | 日志 | logback(STDIO 模式下重定向到 stderr,避免污染 JSON-RPC) | | 构建 | Maven,`spring-boot-maven-plugin` + `ZIP`(启用 PropertiesLauncher) | --- ## 快速开始 ### 1. 构建可执行 jar ```bash mvn -DskipTests clean package ``` 产物:`target/apiForge-mcp-1.0.0.jar` ### 2. 在 MCP 客户端注册(STDIO 模式,推荐) 在客户端的 MCP 配置文件(如 `mcp-server-config.json`)的 `mcpServers` 段添加: ```json { "apiForge": { "command": "java", "args": [ "-Dloader.main=io.github.nbutfkl.apiforge.mcp.stdio.StdioMcpServerLauncher", "-jar", "D:/application/my/apiForge-mcp/apiForge/target/apiForge-mcp-1.0.0.jar" ], "env": { "APIFOX_ACCESS_TOKEN": "access_token", "APIFOX_PROJECT_ID": "project_id", "ENABLE_RECORD": "1", "DATASOURCE_TYPE": "mysql", "DATASOURCE_HOST": "localhost", "DATASOURCE_PORT": "3306", "DATASOURCE_USER": "username", "DATASOURCE_PASSWORD": "password", "DATASOURCE_DATABASE": "database" } } } ``` > ⚠️ `args` 顺序很重要:`-Dloader.main=...` 必须在 `-jar` **之前**。否则会被 JVM 当作程序参数透传,导致默认走 HTTP 启动入口,客户端表现为 “Loading tools” 卡死。 ### 3. 在客户端中使用 注册成功后,AI 即可调用以下工具: ``` getSwaggerContentExample → 拿到 openapi 3.0 模板 dataSourceSelect → 查表结构 / 字段说明 / 样例数据 createApi → 拼成 openapi 3.0 文档导入到 Apifox ``` --- ## 环境变量 | 变量 | 必填 | 说明 | | --- | :---: | --- | | `APIFOX_ACCESS_TOKEN` | ✅ | Apifox 个人访问令牌,用作 `Authorization: Bearer ` | | `APIFOX_PROJECT_ID` | ✅ | 目标 Apifox 项目 ID,导入接口时使用 | | `DATASOURCE_TYPE` | ✅ | 数据库类型,可选:`mysql` / `postgresql` / `oracle` / `sqlserver` / `mariadb` / `sqlite` | | `DATASOURCE_HOST` | ✅ | 数据库主机;SQLite 此项随意(不会用) | | `DATASOURCE_PORT` | ⭕ | 数据库端口;SQLite 不需要 | | `DATASOURCE_USER` | ✅ | 数据库账号 | | `DATASOURCE_PASSWORD` | ⭕ | 数据库密码 | | `DATASOURCE_DATABASE` | ✅ | 数据库名;**SQLite 此处填 `.db` 文件路径** | | `ENABLE_RECORD` | ⭕ | 是否记录每次 `createApi` 调用,`0` 关闭,默认开启 | --- ## MCP 工具说明 ### `createApi` - **作用**:把 OpenAPI 3.0 格式的 JSON 文档导入到 `APIFOX_PROJECT_ID` 对应的项目。 - **参数**: - `swaggerContent` *(string, 必填)*:OpenAPI 3.0 文档内容。 - **典型调用流程**: 1. AI 先调 `dataSourceSelect` 查表结构; 2. 不熟悉格式时调 `getSwaggerContentExample` 拿模板; 3. 拼装好后调 `createApi` 导入。 ### `dataSourceSelect` - **作用**:在配置的业务库上执行**只读** SQL,返回 JSON 数组结果(最多 100 行,超出截断)。 - **参数**: - `sql` *(string, 必填)*:以 `SELECT` 或 `WITH` 开头的查询语句。其它语句会被拒绝。 - **安全说明**:服务侧用关键字前缀做硬校验,避免 AI 误发 DML/DDL。 ### `getSwaggerContentExample` - **作用**:返回一份最小可用的 OpenAPI 3.0 JSON 示例。 - **参数**:无。 --- ## 操作记录表 `api_forge_record` 启动时按 `DATASOURCE_TYPE` 自动建表(若不存在),结构如下: | 字段 | 类型 | 说明 | | --- | --- | --- | | `id` | bigint / bigserial / NUMBER 等 | 自增主键 | | `content` | text / CLOB / NVARCHAR(MAX) | 调用 `createApi` 时提交的请求体(JSON) | | `result` | text / CLOB / NVARCHAR(MAX) | Apifox 返回的响应或异常信息 | | `status` | int | `1` 成功 / `0` 失败 | | `create_time` | datetime / timestamp | 调用时间 | 如不需要审计写入,把 `ENABLE_RECORD` 置为 `0` 即可。 --- ## 启动模式 ### STDIO 模式(默认推荐) 入口类:`io.github.nbutfkl.apiforge.mcp.stdio.StdioMcpServerLauncher` 通过 `-Dloader.main` 指定,PropertiesLauncher 会在 fat-jar 内查找该类并加载。 ### HTTP 模式 直接 `java -jar apiForge-mcp-1.0.0.jar` 即可,默认监听 `http://localhost:7999/mcp`。 客户端配置改为: ```json { "apiForge": { "url": "http://localhost:7999/mcp" } } ``` 可在 [`application.yml`](src/main/resources/application.yml) 中调整端口与 endpoint。 --- ## 多数据库适配 所有方言相关信息(驱动类、URL 模板、建表 DDL、INSERT SQL)集中在 [`DataSourceTypeEnums`](src/main/java/io/github/nbutfkl/apiforge/mcp/service/enums/DataSourceTypeEnums.java)。 新增数据库只需要: 1. 在该枚举中加一个值; 2. 在 [`pom.xml`](pom.xml) 引入对应 JDBC 驱动; 3. 业务代码无需任何 if-else。 --- ## 常见问题 **Q1:客户端一直显示 “Loading tools”?** A:99% 是 `args` 没加 `-Dloader.main=...` 或顺序错了。STDIO 入口必须显式指定,详见上面 [快速开始 §2](#2-在-mcp-客户端注册stdio-模式推荐)。 **Q2:`MCP error -32603: Failed to obtain JDBC Connection`?** A:方言策略要求 `DATASOURCE_TYPE` 必填;同时检查白名单 / 网络 / 账号密码。日志在 stderr,可在客户端面板查看或本地用 `2> mcp.err.log` 重定向。 **Q3:`api_forge_record` 表没有写入?** A:先确认 `ENABLE_RECORD != 0`,再去 stderr 看 `写入 api_forge_record 失败` 的完整堆栈(已经带 `Caused by`),通常是表结构不一致或权限不足。 **Q4:能否禁用日志写到 stderr?** A:STDIO 协议要求 stdout 严格只走 JSON-RPC,所以日志只能走 stderr,不可改。如需关闭日志,调低 `logging.level` 即可。 --- ## 许可证 本项目尚未指定开源协议,使用前请与作者确认。