ApiGo v6.0:把数据库接口发布与 AI 办公 MCP 接入放进同一条链路

2026-09-15 37 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

ApiGo v6.0 的关键变化,是在原有接口开发、SQL2API、动态数据源和数据预览能力之上,加入面向 AI 办公平台的 MCP 接入。企业可以把数据库查询封装成受控接口,再将这些能力提供给 WorkBuddy、千问办公、Trea Work、豆包等支持场景中的 AI 助手,让“查业务数据”从人工切换系统,变成模型调用明确工具。

从 SQL2API 到 MCP 工具

传统 SQL2API 解决的是“如何快速把查询发布成 HTTP 接口”。MCP 接入进一步解决“AI 助手如何发现、理解并调用这些业务能力”。

一条典型链路可以拆成四层:

  1. 数据源层:连接 MySQL、Oracle、达梦、TiDB、DolphinDB、Hive、DuckDB 等 SQL 或 NoSQL 数据源。
  2. 查询层:通过动态 SQL、参数和标签组织业务查询。
  3. 接口层:把查询发布为可鉴权、可测试的接口。
  4. AI 工具层:通过 MCP 向办公 AI 暴露工具名称、参数说明和返回结构。

这类组合的价值并不只是少写一个 Controller。更重要的是,数据库结构、业务接口和 AI 工具之间形成了清晰边界:模型负责理解用户意图,ApiGo 负责参数接收与能力发布,数据库仍然只执行预先约束的查询。

例如,“查询某个部门本月已支付订单总额”适合定义成固定工具;“执行用户输入的任意 SQL”则不适合作为办公 AI 能力开放。前者权限边界明确,后者很容易带来数据泄露、越权查询和高负载扫描。

动态数据源适合哪些场景

动态数据源并不意味着每次请求都允许调用方任意选择数据库。更稳妥的用法,是由服务端根据租户、环境或业务标签映射到已经登记的数据源。

常见场景包括:

  • SaaS 系统按租户隔离数据库。
  • 开发、测试和生产环境使用相同接口定义,但绑定不同数据源。
  • 同一指标分别来自 MySQL、TiDB 或 Hive,需要通过统一接口暴露。
  • 使用 DuckDB 做本地文件分析,再把聚合结果提供给内部助手。

标签可以参与接口治理。例如给工具增加 financereadonlytenant-aware 等标签,便于在接入 MCP 客户端时筛选能力。不过标签不能代替真正的授权检查,服务端仍需验证调用者身份、租户范围和字段访问权限。

一个可改造的 SQL2API 示例

下面示例假设存在 orders 表,并希望发布一个只读的部门月度汇总接口。字段名、动态 SQL 语法以及发布路径需要按实际部署的 ApiGo v6.0 配置调整。

CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    department_id BIGINT NOT NULL,
    amount DECIMAL(12, 2) NOT NULL,
    status VARCHAR(32) NOT NULL,
    paid_at TIMESTAMP NULL
);

SELECT
    department_id,
    COUNT(*) AS order_count,
    COALESCE(SUM(amount), 0) AS paid_amount
FROM orders
WHERE department_id = :department_id
  AND status = 'PAID'
  AND paid_at >= :start_time
  AND paid_at < :end_time
GROUP BY department_id;

这里使用命名参数,而不是把用户输入拼接进 SQL。发布后,可以用类似下面的命令验证接口。示例中的 URL、令牌和路径是假设值,运行前需要替换成实际环境配置:

export APIGO_BASE_URL="http://127.0.0.1:8080"
export APIGO_TOKEN="replace-with-your-token"

curl --fail-with-body \
  --request POST \
  "$APIGO_BASE_URL/api/report/department-paid-orders" \
  --header "Authorization: Bearer $APIGO_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "department_id": 42,
    "start_time": "2025-01-01T00:00:00Z",
    "end_time": "2025-02-01T00:00:00Z"
  }'

理想的响应应保持结构稳定,避免模型依赖自然语言文本:

{
  "department_id": 42,
  "order_count": 128,
  "paid_amount": 356420.50,
  "currency": "CNY"
}

currency 如果不是数据库字段,可以在接口层补充。对 AI 工具来说,稳定的字段名、类型和单位说明,通常比一段“查询成功”的描述更有价值。

MCP 客户端配置可以怎样组织

来源摘要没有给出 ApiGo v6.0 的具体 MCP 端点、传输模式和客户端字段,因此下面只是一个可改造的配置骨架,不代表产品的固定配置格式。实际使用时,应根据 ApiGo 部署文档以及目标办公平台支持的 MCP 传输方式修改。

假设部署提供基于 HTTP 的 MCP 服务,客户端配置可以表达为:

{
  "mcpServers": {
    "company-data": {
      "transport": "streamable-http",
      "url": "https://api.example.com/mcp",
      "headers": {
        "Authorization": "Bearer ${APIGO_MCP_TOKEN}"
      }
    }
  }
}

接入后,一个面向模型的工具定义至少要明确用途、参数约束和返回语义。例如可以按下面的思路设计:

name: get_department_paid_orders
description: 查询指定部门在给定时间范围内的已支付订单汇总,只返回调用者有权访问的部门数据。
input:
  type: object
  required:
    - department_id
    - start_time
    - end_time
  properties:
    department_id:
      type: integer
      minimum: 1
    start_time:
      type: string
      format: date-time
    end_time:
      type: string
      format: date-time
output:
  type: object
  properties:
    department_id:
      type: integer
    order_count:
      type: integer
    paid_amount:
      type: number
    currency:
      type: string

工具描述中应避免“查询所有信息”这类宽泛表述。名称越具体,参数范围越窄,模型越容易在正确时机调用,也越方便平台记录审计日志。

上线前不要忽略治理

AI 接入会放大接口易用性,也会放大接口本身的风险。上线前至少检查以下项目:

  • 数据库账号是否只拥有必要的只读权限。
  • 是否使用参数绑定,并禁止直接执行模型生成的原始 SQL。
  • 租户和部门权限是否在服务端验证,而非依赖提示词约束。
  • 是否限制时间跨度、分页大小、并发数和查询超时。
  • 返回结果是否过滤手机号、身份证号、密钥等敏感字段。
  • MCP 调用是否记录用户、工具、参数摘要、耗时和结果状态。
  • 写操作是否需要人工确认、幂等键和独立授权。

ApiGo v6.0 适合从低风险、只读、结果可校验的查询开始,例如库存汇总、项目状态和部门统计。等权限模型、审计和限流稳定后,再逐步开放复杂分析或写入能力。MCP 让接口更容易被 AI 使用,但真正决定生产可用性的,仍是接口契约和数据治理。


相关推荐