Oracle数据库SQL执行服务

为Sankhya ERP Oracle数据库提供安全的SQL执行服务,支持多连接动态配置和AI代理访问。

  • by delt4d
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 delt4d/SankhyaMCP

使用说明

SankyaMCP

用于Sankhya ERP Oracle数据库的MCP(模型上下文协议)服务器。通过MCP协议将多个命名Oracle连接上的安全SQL执行暴露给AI代理。

概述

  • 动态多连接Oracle支持——通过环境变量定义任意数量的命名连接
  • 只读工具(execute_query)仅强制执行SELECT/WITH/EXPLAIN
  • 可书写工具(execute_unsafe_query)对于DML/DDL--在只读连接上被阻止
  • SELECT查询的CSV输出;DML/DDL成功消息
  • Never raises--所有错误返回为 "Erro[...]: ..." 字符串
  • 内置于 FastMCP 并用 紫外线

先决条件

  • Python 3.11+
  • uv — 安装指南
  • 无需Oracle客户端(使用 oracledb 薄模式)
  • 可从运行服务器的计算机访问Oracle数据库

设置

  1. 克隆存储库并安装依赖项:
uv sync
  1. 在中配置环境变量 .vscode/mcp.json (从该仓库中的模板复制——该文件被git忽略):
{
  "servers": {
    "sankhya-mcp": {
      "type": "stdio",
      "command": "${workspaceFolder}/.venv/Scripts/python.exe",
      "args": ["${workspaceFolder}/mcp_server.py"],
      "env": {
        "ORACLE_CONNECTIONS": "teste,producao",
        "ORACLE_TESTE_USER": "your_user",
        "ORACLE_TESTE_PASSWORD": "your_password",
        "ORACLE_TESTE_DSN": "host:port/service_name",
        "ORACLE_PRODUCAO_USER": "your_user",
        "ORACLE_PRODUCAO_PASSWORD": "your_password",
        "ORACLE_PRODUCAO_DSN": "host:port/service_name",
        "ORACLE_PRODUCAO_READONLY": "true",
        "ORACLE_DEFAULT_CONNECTION": "teste"
      }
    }
  }
}
  1. 在VS Code中打开项目——MCP面板将自动检测服务器。

配置连接

连接完全通过环境变量定义,不需要更改代码。

1.声明连接名称

ORACLE_CONNECTIONS=teste,producao,SUP

以逗号分隔的名称列表。如果省略,服务器将恢复为内置默认值(teste 和 producao).

2.为每个连接定义凭据

对于每个名字 {NAME} 如上所述,设置:

变量 必填 描述
ORACLE_{NAME}_USER 是 Oracle用户名
ORACLE_{NAME}_PASSWORD 是 Oracle密码
ORACLE_{NAME}_DSN 是的 host:port/service_name
ORACLE_{NAME}_SCHEMA 否 的架构前缀 ALTER SESSION SET CURRENT_SCHEMA (默认值: {NAME} 上壳)
ORACLE_{NAME}_DESCRIPTION 否 中显示了人类可读的描述 list_schemas
ORACLE_{NAME}_READONLY 否 设置 "true" 阻止此连接上的DML/DDL

3.设置默认连接(可选)

ORACLE_DEFAULT_CONNECTION=SUP

如果省略,则中的第一个连接 ORACLE_CONNECTIONS 使用。

完整示例(mcp.json env块)

"env": {
  "ORACLE_CONNECTIONS": "teste,SUP",
  "ORACLE_TESTE_USER": "user_teste",
  "ORACLE_TESTE_PASSWORD": "pass_teste",
  "ORACLE_TESTE_DSN": "host:1521/ORCL",
  "ORACLE_TESTE_SCHEMA": "TESTE",
  "ORACLE_TESTE_DESCRIPTION": "Base de teste",
  "ORACLE_SUP_USER": "user_sup",
  "ORACLE_SUP_PASSWORD": "pass_sup",
  "ORACLE_SUP_DSN": "host:1521/SUPORTE",
  "ORACLE_SUP_SCHEMA": "SUPORTE",
  "ORACLE_SUP_DESCRIPTION": "Base de suporte",
  "ORACLE_SUP_READONLY": "true",
  "ORACLE_DEFAULT_CONNECTION": "teste"
}

可用的MCP工具

list_schemas

列出所有可用的Oracle连接。没有参数。返回CSV。

柱: name, schema, description, readonly, is_default

示例响应:

name,schema,description,readonly,is_default
teste,TESTE,Base de teste,False,True
producao,SANKHYA,Base de produção,True,False

execute_query

执行a 只读 SQL查询(SELECT、CTE、EXPLAIN PLAN)。DML/DDL被拒绝。

参数 类型 默认值 说明
query str 必需的 SQL语句(SELECT/WITH/EXPLAIN PLAN)
connection str null 连接名称来自 list_schemas,或 null 默认
params dict null 绑定参数(:name 风格)
max_rows int 500 返回的最大行数
offset int 0 返回结果前要跳过的行

为SELECT查询返回CSV(带标题行)。退货 "Erro[...]: ..." 失败。

execute_unsafe_query

执行任何SQL,包括INSERT、UPDATE、DELETE、DDL和PL/SQL块。连接受阻 readonly=True.

参数与 execute_query。使用前需要明确的用户确认。

退货 "Sucesso: Comando executado (sem retorno)." 对于没有结果集的DML/DDL,或者如果语句返回行,则使用CSV。

查询示例

始终使用连接的架构作为表名的前缀(或依赖于 ALTER SESSION SET CURRENT_SCHEMA):

-- List recent sales orders
SELECT NUNOTA, DTNEG, CODPARC, VLRNOTA
FROM TGFCAB
WHERE DTNEG >= SYSDATE - 30
ORDER BY DTNEG DESC

-- Check a partner with bind param
SELECT CODPARC, NOMEPARC, CGC_CPF
FROM TGFPAR
WHERE CODPARC = :codparc

使用MCP工具:

list_schemas                                        → discover connections
execute_query("SELECT ...", "teste")                → read from test DB
execute_query("SELECT ...", "teste", offset=500)    → paginate results
execute_unsafe_query("INSERT ...", "teste")         → write to test DB

项目结构

mcp_server.py       # FastMCP entry point
src/
  oracle/
    config.py       # ConnectionConfig dataclass + env loading
    query.py        # execute_query() + _is_safe_query() guard
    schemas.py      # list_schemas_info() + list_schemas_csv()
    tools.py        # register_tools(mcp) — wires MCP tools
    __init__.py     # re-exports
tests/
  test_oracle.py    # pytest unit tests

备注

  • Referencias/ 包含开发过程中使用的参考实现。它被git忽略,不属于此项目。
  • DML/DDL应仅针对可写连接(readonly=false).
  • 对于大型结果集,请使用 offset + max_rows 分页。