Skip to main content

OPC-MCP

订单中心数据库 MCP 服务,通过 MCP 协议暴露数据库查询能力,供 AI 助手动态查询和排查订单问题。

功能特性

  • 配置驱动工具 — 在 config.yaml 中定义 SQL 模板,自动生成 MCP 工具
  • run_query — 动态执行任意 SELECT 查询,支持命名参数、LIKE 自动检测、分页
  • query_table_desc — 查询表结构信息(列名、数据类型、注释),表名大小写不敏感
  • PrefabSQL 工具集 — SQL 代码双向溯源(sqlId ↔ 表名)
  • 多连接池 — 支持多个数据库(opc、smc 等),连接池名称大小写不敏感
  • 多驱动支持 — 支持 OceanBase MySQL 模式 (ob_mysql) 和 Oracle 模式 (ob_oracle)
  • 安全防护 — 仅允许 SELECT 语句,拒绝多语句注入,参数化查询

环境要求

驱动模式 依赖要求
ob_mysql Python 3.11+,无需额外依赖
ob_oracle Python 3.11++ Java JDK 9+

⚠️ 重要提示:使用 ob_oracle 驱动连接 OceanBase Oracle 模式租户时,必须安装 Java JDK 9 或更高版本。这是因为 Oracle 模式使用 jaydebeapi + JDBC 驱动,需要 Java 运行环境。

验证 Java 环境

java -version
# 应显示 9 或更高版本,如:openjdk version "11.0.x"

安装

方式一:uvx 直接运行(推荐)

# 直接运行,无需安装;首次运行自动下载并缓存
uvx opc-mcp --config /path/to/config.yaml

方式二:uv tool 安装(需要全局命令时)

# 安装到 uv 工具环境,提供全局 opc-mcp 命令
uv tool install opc-mcp

# 启动服务
opc-mcp --config /path/to/config.yaml

方式三:pip 安装

pip install opc-mcp
opc-mcp --config /path/to/config.yaml

方式四:本地开发安装

git clone https://gitee.com/zhouxinhai/opc-mcp.git
cd opc-mcp
uv sync
uv run opc-mcp --config config.yaml

安装方式对比

安装方式 启动命令 适用场景 对应更新方式(见下节)
uvx uvx opc-mcp 临时运行、快速体验 @latest / ==版本 / --refresh
uv tool opc-mcp 日常使用,全局命令 uv tool upgrade / --force
pip opc-mcp 无 uv 环境 pip install --upgrade
本地开发 uv run opc-mcp 二次开发、调试 git pull + uv sync

注意:uv tool 与 pip 二选一,不要混用

两种方式生成的启动命令相同(都是 opc-mcp),但安装位置不同(uv tool 在 %USERPROFILE%\.local\bin,pip 在 Python 环境的 Scripts 目录)。如果两种方式都安装过,终端里实际执行哪一份取决于 PATH 中目录的先后顺序,可能出现"已升级却仍运行旧版"的问题。确认方法:

# Windows:列出 PATH 中所有 opc-mcp,第一个是实际执行的
where.exe opc-mcp

# Linux / Mac
which opc-mcp

有 uv 环境优先使用 uv tool 安装(依赖完全隔离,不影响其他项目),pip 方式留给没有 uv 的机器。


更新

不同安装方式的更新方法不同,请按你的安装方式选择对应小节。

uvx 方式

uvx 会缓存已解析的运行环境,不会自动升级到新版本。三种控制方式:

# 1. 运行最新版(@latest 每次强制解析最新版本,绕过缓存)
uvx opc-mcp@latest --config /path/to/config.yaml

# 2. 锁定指定版本(推荐在 MCP 客户端配置中使用,避免自动变化引入不兼容)
uvx opc-mcp==0.2.13 --config /path/to/config.yaml

# 3. 强制刷新缓存环境(怀疑缓存异常时使用)
uvx --refresh opc-mcp --config /path/to/config.yaml

stdio 模式提示:MCP 客户端配置中通过 uvx 启动的(见"MCP 客户端配置-stdio 模式"),同样可在 args 中加 @latest==版本号 控制版本,例如 "opc-mcp==0.2.13"

uv tool 方式

普通更新(升级到最新版)

uv tool upgrade opc-mcp

特殊更新(指定版本 + 强制重装)

当需要安装指定版本(如 0.2.13),或普通升级不生效、安装出现异常需要强制重装时,使用 --force

$env:UV_DEFAULT_INDEX="https://pypi.org/simple/"
uv tool install opc-mcp==0.2.13 --force

说明:

  • $env:UV_DEFAULT_INDEX="https://pypi.org/simple/":将包索引切换为官方 PyPI。如果项目 pyproject.toml 或环境默认配置了镜像源(如清华源),镜像源同步可能有延迟,指定官方源可确保第一时间拿到新发布的版本;
  • ==0.2.13:安装指定版本号,替换为你需要的版本;
  • --force:强制重装,即使该版本已安装也会重新创建工具环境。

pip 方式

# 升级到最新版
pip install --upgrade opc-mcp

# 安装指定版本
pip install opc-mcp==0.2.13

验证版本

uv tool 方式:使用 uv tool list 查看已安装的工具及其版本:

uv tool list

输出示例:

opc-mcp v0.2.13
- opc-mcp.exe

确认 opc-mcp 后面显示的版本号与你期望安装的版本一致,即说明更新成功。

uvx 方式:版本由命令中的 @latest / ==版本号 直接决定,无需单独验证;如果运行结果与预期不符,用 --refresh 清缓存后重试。

pip 方式

pip show opc-mcp

注意:当前版本的 opc-mcp 命令本身不支持 --version 参数,请以上述命令显示的版本号为准。

如果版本号显示正确但运行行为异常(如仍报旧版本的错误),可能是 uv tool 与 pip 混装导致执行了另一份程序,用 where.exe opc-mcp(Windows)/ which opc-mcp(Linux/Mac)确认实际执行路径,详见上方"安装方式对比"的注意事项。


配置

创建配置文件

创建 config.yaml 文件:

server:
  host: "0.0.0.0"
  port: 8000

db_connect_info:
  opc:
    host: "10.44.46.76"
    port: 8090
    user: "OC@oboc_test_utf8#bs_test03:100003"
    password: "your_password"
    database: OC
    pool_size: 5
    driver: ob_oracle  # OceanBase Oracle 模式租户

  smc:
    host: "10.44.46.76"
    port: 8999
    user: "SMC@arcdbcs#BS_OB_04_B_Test"
    password: "your_password"
    database: SMC
    pool_size: 5
    driver: ob_mysql   # OceanBase MySQL 模式租户

# PrefabSQL 缓存配置(可选)
prefab_sql:
  enabled: true
  pool: smc
  sql: |
    SELECT SQL_ID, SQL_STATEMENT
    FROM SMC_PREFAB_SQL_STATEMENT
    WHERE upper(sql_jndi) = 'ORDER'
    ORDER BY SQL_ID

tools:
  query_opc_dict_def:
    description: "查询订单中心字典定义表 or_dict_def"
    pool: opc
    sql: |
      SELECT a.DICT_TYPE, a.DICT_TYPE_NAME, a.DICT_CLASS, a.DICT_CLASS_NAME,
             a.DICT_ID, a.DICT_NAME, a.DICT_ALIASES, a.VALUE,
             a.CREATE_DATE, a.REMARK, a.OP_DATE
      FROM or_dict_def a
      WHERE 1=1
        AND a.DICT_TYPE = :dict_type
        AND a.DICT_CLASS = :dict_class
        AND a.DICT_ID = :dict_id
        AND a.DICT_NAME LIKE :dict_name
    params:
      dict_type:
        type: int
        description: "字典类型 NUMBER"
        required: false
      dict_class:
        type: int
        description: "字典类别 NUMBER"
        required: false
      dict_id:
        type: str
        description: "字典项目 VARCHAR2"
        required: false
      dict_name:
        type: str
        description: "字典项目名称 VARCHAR2,支持模糊匹配"
        required: false
        like: true
    limit:
      default: 50
      max: 100
    offset:
      default: 0

驱动类型说明

驱动 说明 适用场景
ob_mysql 使用 mysql-connector-python 连接 OceanBase MySQL 模式租户
ob_oracle 使用 jaydebeapi + JDBC 连接 OceanBase Oracle 模式租户(需 Java JDK 9+)

错误提示:如果配置了不支持的驱动类型,启动时会报错:

Pool 'xxx': driver 'invalid_driver' 不支持。
支持的驱动类型:
  - ob_mysql:  OceanBase MySQL 模式租户
  - ob_oracle: OceanBase Oracle 模式租户 (使用 jaydebeapi + JDBC, 需 Java JDK 9+)

自定义 JDBC 驱动路径

默认情况下,JDBC 驱动已打包在项目中。如需使用其他版本或自定义路径:

# 方式一:指定具体 jar 文件
export JDBC_JAR_PATH=/path/to/oceanbase-client-2.4.12.jar

# 方式二:指定 jar 目录
export JDBC_JAR_PATH=/path/to/lib/

uvx opc-mcp --config config.yaml

启动服务

启动命令

按安装方式选择对应的启动命令(以 Streamable HTTP 默认模式为例,其他参数各方式通用):

# uvx 方式(无需安装,直接运行)
uvx opc-mcp --config /path/to/config.yaml

# uv tool / pip 方式(已安装,全局命令)
opc-mcp --config /path/to/config.yaml

# 本地开发方式(项目目录下运行)
uv run opc-mcp --config /path/to/config.yaml

其他常用参数:

# SSE 模式
uvx opc-mcp --config /path/to/config.yaml --mode sse

# stdio 模式(本地进程通信)
uvx opc-mcp --config /path/to/config.yaml --mode stdio

# 指定日志级别
uvx opc-mcp --config /path/to/config.yaml --log-level DEBUG

连接地址

模式 连接方式
Streamable HTTP(默认) http://localhost:8000/mcp
SSE http://localhost:8000/sse
stdio 通过 stdin/stdout 通信

MCP 客户端配置

Streamable HTTP 模式(推荐)

先启动服务:

uvx opc-mcp --config /path/to/config.yaml

MCP 配置:

{
  "mcpServers": {
    "opc-mcp": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

SSE 模式

先启动服务:

uvx opc-mcp --config /path/to/config.yaml --mode sse

MCP 配置:

{
  "mcpServers": {
    "opc-mcp": {
      "type": "sse",
      "url": "http://localhost:8000/sse"
    }
  }
}

stdio 模式(无需预先启动)

MCP 配置(智能体自动启动服务):

{
  "mcpServers": {
    "opc-mcp-stdio": {
      "command": "uvx",
      "args": [
        "opc-mcp",
        "--config", "/path/to/config.yaml",
        "--mode", "stdio"
      ]
    }
  }
}

说明:stdio 模式下,智能体会在调用时自动启动 opc-mcp 进程,无需手动运行服务。


MCP 工具说明

run_query

动态执行 SELECT 查询,支持命名参数和分页。

参数:

参数 类型 必填 说明
sql string SELECT SQL,使用 :param_name 占位符
params object 命名参数,key 大小写不敏感
pool string 连接池名称,默认 opc
limit integer 返回行数限制,默认 50,最大 200
offset integer 分页偏移量,默认 0

示例:

{
  "sql": "SELECT * FROM or_dict_def WHERE dict_type = :dict_type AND dict_class = :dict_class",
  "params": {"dict_type": 18, "dict_class": 1},
  "pool": "opc"
}

支持 JOIN、GROUP BY、子查询、UNION、聚合等复杂查询。LIKE 条件自动检测并包裹 %

query_table_desc

查询表的列结构信息。

参数:

参数 类型 必填 说明
table_name string 表名,大小写不敏感
pool string 连接池名称

示例:

{
  "table_name": "or_dict_def",
  "pool": "opc"
}

返回:

{
  "table_name": "OR_DICT_DEF",
  "count": 5,
  "columns": [
    {"table_name": "OR_DICT_DEF", "column_name": "DICT_TYPE", "data_type": "NUMBER", "comments": "字典类型"},
    {"table_name": "OR_DICT_DEF", "column_name": "DICT_NAME", "data_type": "VARCHAR2", "comments": "字典名称"}
  ]
}

PrefabSQL 工具集

用于 SQL 代码双向溯源的工具集。从数据库加载 SQL 配置到本地 SQLite 缓存,支持:

  • 正向追踪:sqlId → SQL 语句 → 操作类型 → 涉及的表
  • 反向溯源:表名 → 相关 sqlId 列表
  • 数据流向分析:每张表带表级操作类型(如 INSERT...SELECT 语句中目标表 op=INSERT、来源表 op=SELECT),可按"读/写"过滤

缓存结构

缓存文件位于 ~/.prefab-sql/cache.db(SQLite),表结构:

CREATE TABLE sql_statements (
    sql_id          TEXT PRIMARY KEY,   -- SQL ID
    sql_statement   TEXT NOT NULL,      -- 原始 SQL 语句
    operation_type  TEXT,               -- 语句主操作类型(INSERT/UPDATE/DELETE/SELECT/MERGE/UNKNOWN)
    tables_involved TEXT                -- 表明细 JSON 数组,如
                                       -- [{"table":"A_TABLE","op":"INSERT"},{"table":"B_TABLE","op":"SELECT"}]
);

operation_type语句主类型(供统计使用);表级操作类型记录在 tables_involved 中每个对象的 op 字段,区分主表操作(INSERT 目标 / UPDATE 对象 / DELETE 对象 / MERGE 目标) 与来源表(子查询 FROM/JOIN/USING,op=SELECT)。

元数据文件 ~/.prefab-sql/metadata.jsonschema_version 字段(当前为 2)。 缓存结构升级后旧缓存(v1)会被查询接口拒绝,需 force_refresh=true 重建。

create_prefab_sql_cache

创建或刷新本地 SQLite 缓存。

参数:

参数 类型 必填 说明
force_refresh boolean 强制刷新缓存,默认 false

返回:

{"status": "success", "count": 1234, "cache_path": "~/.prefab-sql/cache.db"}

query_sql_by_id

根据 sqlId 查询 SQL 语句。

参数:

参数 类型 必填 说明
sql_id string SQL ID(如 10511206)

返回示例tables 为表名列表,table_details 为表级操作类型明细):

{
  "status": "found",
  "data": {
    "sql_id": "10511206",
    "sql_statement": "insert into\n  or_message_delay_req(\n    delay_message_id,\n    opt_type,\n    message_type,\n    comb_order_id,\n    sub_order_id,\n    order_line_id,\n    stage_id,\n    operation_id,\n    message_content,\n    topic_name_id,\n    create_date,\n    delay_time,\n    status,\n    delay_cause_code,\n    delay_cause_desc,\n\torder_id,\n    OP_DATE\n  )\nvalues(\n    :delay_message_id,\n    :opt_type,\n    :message_type,\n    :comb_order_id,\n    :sub_order_id,\n    :order_line_id,\n    :stage_id,\n    :operation_id,\n    :message_content,\n    :topic_name_id,\n    sysdate,\n    :delay_time,\n    0,\n    :delay_cause_code,\n    :delay_cause_desc,\n\t:order_id,\n    SYSDATE\n  );",
    "operation_type": "INSERT",
    "tables": [
      "OR_MESSAGE_DELAY_REQ"
    ],
    "table_details": [
      {"table": "OR_MESSAGE_DELAY_REQ", "op": "INSERT"}
    ]
  }
}

find_sql_by_table

根据表名查找相关的 sqlId。

参数:

参数 类型 必填 说明
table_name string 表名(精确匹配,大小写不敏感)
limit integer 返回数量限制,默认 100
operation string 表级操作类型过滤:INSERT/UPDATE/DELETE/SELECT/MERGE。如 SELECT 只返回读取该表的语句,不传则返回全部

返回示例table_details 只保留匹配该表名的条目,tables 为该语句的全量表名列表):

{
  "status": "success",
  "table_name": "or_cust_order",
  "count": 2,
  "data": [
    {
      "sql_id": "10510327",
      "sql_statement": "  SELECT\n    co.ORDER_ID ,\n    so.SUB_ORDER_ID ,\n    oio.OBJ_NUMBER ,\n    oio.OBJ_TYPE ,\n    co.REGION_CODE \nFROM\n    OR_ORDER_ITEM_OBJECT oio\nINNER JOIN OR_ORDER_ITEM oi\n    ON oio.ORDER_ITEM_ID = oi.ORDER_ITEM_ID\nINNER JOIN OR_CUST_ORDER co\n    ON oi.ORDER_ID = co.ORDER_ID and  co.STATUS NOT IN (4, 5)  and co.ORDER_TYPE = 1 \nINNER JOIN OR_SUB_ORDER so\n    ON so.SUB_ORDER_ID = oi.BUSI_ORDER_ID AND so.STATUS NOT IN (2, 3)     \nWHERE\n    oio.OBJ_NUMBER = :objNumber \n    AND (oio.OBJ_TYPE = :objType)            \n    AND co.REGION_CODE = :regionCode       \nGROUP BY\n    co.ORDER_ID,\n    so.SUB_ORDER_ID,\n    oio.OBJ_NUMBER,\n    oio.OBJ_TYPE,\n    co.REGION_CODE",
      "operation_type": "SELECT",
      "tables": [
        "OR_SUB_ORDER",
        "OR_CUST_ORDER",
        "OR_ORDER_ITEM"
      ],
      "table_details": [
        {"table": "OR_CUST_ORDER", "op": "SELECT"}
      ]
    },
    {
      "sql_id": "10511007",
      "sql_statement": "select ORDER_ID,STATUS,to_char(STATUS_DATE,'yyyymmddhh24miss') as STATUS_DATE,INTACT_ID,PRE_ORDER_ID,ORDER_TEAM_ID,CUST_ID,BUSI_TYPE_CODE,CHANNEL_ID,DEAL_PRIORITY,CANCEL_ORDER_ID,CANCEL_REASON,to_char(CREATE_DATE,'yyyymmddhh24miss') as CREATE_DATE,CREATE_OPRT_ID,CREATE_ORG_ID,to_char(OP_DATE,'yyyymmddhh24miss') as OP_DATE,OPRT_ID,ORG_ID,SERVICE_NUMBER,SUBS_ID,REGION_CODE,OPRT_REGION_CODE,ORDER_TYPE,REMARK,SALES_ID,SALES_ROLE_TYPE,ORDER_SRC_TYPE,FORM_NUMBER,THIRD_SN,SRC_SYS,IS_NOTIFY,MGMT_REGION_CODE,MGMT_COUNTY_CODE,OP_SN,BATCH_ID from OR_CUST_ORDER where ORDER_ID = :orderId",
      "operation_type": "SELECT",
      "tables": [
        "OR_CUST_ORDER"
      ],
      "table_details": [
        {"table": "OR_CUST_ORDER", "op": "SELECT"}
      ]
    }
  ]
}

prefab_sql_stats

获取缓存统计信息。

返回示例:

{
  "status": "success",
  "stats": {
    "total_count": 2774,
    "by_operation_type": {
      "SELECT": 1320,
      "INSERT": 596,
      "DELETE": 361,
      "UPDATE": 361,
      "UNKNOWN": 136
    },
    "cache_path": "C:\\Users\\admin\\.prefab-sql\\cache.db",
    "metadata": {
      "schema_version": 2,
      "last_update": "2026-05-26T16:16:34.117190",
      "record_count": 2774,
      "cache_path": "C:\\Users\\admin\\.prefab-sql\\cache.db"
    }
  }
}

diagnose 技能(可选)

opc-mcp 提供配套的 diagnose 技能,用于订单中心数据库排障诊断。

安装技能

将 diagnose 技能目录复制到智能体的技能目录:

.claude/skills/diagnose/
  SKILL.md          # 技能定义
  examples/         # 示例规则文件

使用技能

/diagnose @<规则文件路径> <入口参数值>

示例:

/diagnose @.claude/skills/diagnose/examples/运维排查_test1.md 客户订单id是`OD5910002026051817511027690041`

发布到 PyPI

构建

uv run python -m build

上传

uv run twine upload dist/*

常见问题

Q1:ob_oracle 模式启动报错?

确保已安装 Java JDK 9+:

java -version
# 应显示 9 或更高版本

Q2:MCP 连接失败?

  • Streamable HTTP/SSE 模式:确认服务已启动
  • stdio 模式:检查 config.yaml 路径是否正确(使用绝对路径)

Q3:数据库查询报错?

  • 检查 config.yaml 中的数据库连接信息
  • 确认表名、字段名是否正确(Oracle 字段名大小写不敏感)

项目结构

opc-mcp/
├── lib/                          # JDBC 驱动(打包时包含)
│   └── oceanbase-client-*.jar
├── src/opc_mcp/
│   ├── main.py                   # 入口,服务创建与启动
│   ├── config.py                 # 配置模型
│   ├── pool_manager.py           # 连接池管理
│   ├── handlers.py               # 工具执行逻辑
│   ├── register.py               # MCP 工具注册
│   ├── tools.py                  # SQL 校验、参数绑定
│   ├── prefab_sql_cache.py       # PrefabSQL 缓存
│   └── sql_parser.py             # SQL 解析
├── config.yaml                   # 配置示例
├── pyproject.toml                # 项目配置
└── README.md                     # 本文档

版本历史

版本 变更
0.2.13 PrefabSQL 缓存支持表级操作类型(来源表提取、operation 过滤);依赖 mcp 锁定 <2(兼容 mcp 1.x API)
0.2.0 支持多驱动模式 (ob_mysql/ob_oracle),JDBC 驱动打包
0.1.2 新增 PrefabSQL 工具集
0.1.1 初始版本

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opc_mcp-0.2.14.tar.gz (5.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opc_mcp-0.2.14-py3-none-any.whl (5.0 MB view details)

Uploaded Python 3

File details

Details for the file opc_mcp-0.2.14.tar.gz.

File metadata

  • Download URL: opc_mcp-0.2.14.tar.gz
  • Upload date:
  • Size: 5.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.3

File hashes

Hashes for opc_mcp-0.2.14.tar.gz
Algorithm Hash digest
SHA256 c29534e052e07044b5f5a1158d146c5b7c84a251f0d38d1e821b82f6b813d62a
MD5 90ab9fa65c624bface07585c17856bff
BLAKE2b-256 6bf6ff05949a2987ab74f86da8a602da38247871910aa3a4681ec8672ab382b1

See more details on using hashes here.

File details

Details for the file opc_mcp-0.2.14-py3-none-any.whl.

File metadata

  • Download URL: opc_mcp-0.2.14-py3-none-any.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.3

File hashes

Hashes for opc_mcp-0.2.14-py3-none-any.whl
Algorithm Hash digest
SHA256 e5af4fbbe03d1124b09957d3b6048c5d4476b4db457e9ac02a2c401506b98a6a
MD5 ed89cb8880b52c6a4d1997990d77f16d
BLAKE2b-256 8267dd9d9362bfa4d87c31d6f4e9e3e41b4939301f2c4c58509aef2f141904c0

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.14 This release

2 files

0.2.13

2 files

0.2.11

2 files

0.2.10

2 files

0.2.9

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page