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.json 含 schema_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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c29534e052e07044b5f5a1158d146c5b7c84a251f0d38d1e821b82f6b813d62a
|
|
| MD5 |
90ab9fa65c624bface07585c17856bff
|
|
| BLAKE2b-256 |
6bf6ff05949a2987ab74f86da8a602da38247871910aa3a4681ec8672ab382b1
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e5af4fbbe03d1124b09957d3b6048c5d4476b4db457e9ac02a2c401506b98a6a
|
|
| MD5 |
ed89cb8880b52c6a4d1997990d77f16d
|
|
| BLAKE2b-256 |
8267dd9d9362bfa4d87c31d6f4e9e3e41b4939301f2c4c58509aef2f141904c0
|