Oracle MCP服务器(Go)
这是一个用Go编写的用于Oracle数据库的模型上下文协议(MCP)服务器。它允许LLM(如Claude)与Oracle数据库交互,以检查模式、查看PL/SQL源代码和执行 只读 查询。
它使用标准 工作室 传输,这意味着它被设计为由MCP客户端(如Claude Desktop或启用MCP的IDE扩展)直接运行。
🔒 安全说明
此服务器严格为只读。 它的设计将数据安全作为首要任务。
✅ 此服务器可以做什么:
- 执行
SELECT 查询您的数据 - 阅读Oracle的数据字典视图(
ALL_*, DBA_*, V$*) - 查看PL/SQL源代码
ALL_SOURCE - 使用以下命令检索DDL脚本
DBMS_METADATA.GET_DDL - 生成执行计划(将临时数据存储在
PLAN_TABLE,然后清理)
❌ 此服务器不能执行的操作:
- 无插入、更新、删除 --无法修改任何表数据
- 没有CREATE、ALTER、DROP --无法更改数据库架构
- 不执行 --无法运行存储过程或函数
- 不同意,雷沃基 --无法更改权限
- 没有真相,梅尔奇 --无法执行任何数据操作
🛡️ 我们如何确保只读安全:
- 查询验证:The
sql-select 该工具明确验证查询是否以开头 SELECT 或 WITH 执行前 - 仅字典视图:所有其他工具都查询Oracle的只读数据字典视图
- 无DDL执行:DDL仅 *检索到的* 作为文本,从未执行
- 临时数据清理:任何临时数据(如执行计划)在使用后立即删除
备注:为了提高安全性,您可以与仅具有以下条件的数据库用户连接 SELECT 所需词典视图的权限。这在数据库级别提供了深度防御。
特性
📊 表和模式工具
| 工具 | 说明 |
|---|
sql-select | 执行任意 SELECT 或 WITH 查询(限制为1000行) |
list-tables | 列出所有可访问的表(不包括系统架构) |
get-table-schema | 获取特定表的列定义 |
list-constraints | 列出表的所有约束(PK、FK、唯一、检查) |
get-constraint-columns | 获取构成约束的列 |
🔧 PL/SQL对象工具
| 工具 | 说明 |
|---|
list-objects | 按类型列出Oracle对象(过程、函数、包、类型等) |
get-object-source | 获取过程、函数、包、类型、触发器的PL/SQL源代码 |
describe-object | 获取有关任何Oracle对象的全面信息(如SQL\*Plus DESCRIBE) |
📅 计划程序作业工具
| 工具 | 说明 |
|---|
list-jobs | 列出所有Oracle计划程序作业 |
get-job-details | 获取特定工作的详细信息 |
🔗 依赖关系工具
| 工具 | 说明 |
|---|
list-dependencies | 列出给定对象所依赖或使用的对象 |
👁️ 查看工具
| 工具 | 说明 |
|---|
list-views | 列出当前用户可访问的所有视图 |
get-view-definition | 获取视图的SQL定义 |
📇 索引工具
| 工具 | 说明 |
|---|
list-indexes | 列出所有索引,可选择按表筛选 |
get-index-columns | 获取构成索引的列 |
🔢 序列工具
| 工具 | 说明 |
|---|
list-sequences | 列出当前用户可访问的所有序列 |
⚡ 触发工具
| 工具 | 说明 |
|---|
list-triggers | 列出所有触发器,可选择按表筛选 |
🏷️ 类型工具
| 工具 | 说明 |
|---|
list-types | 列出所有用户定义的类型(对象类型、集合类型) |
get-type-attributes | 获取用户定义类型的属性(字段) |
🔄 同义词工具
| 工具 | 说明 |
|---|
list-synonyms | 列出当前用户可访问的所有同义词 |
🔍 搜索和分析工具
| 工具 | 说明 |
|---|
search-source | 在PL/SQL源代码中搜索文本,以查找表、列或变量的使用位置 |
search-columns | 在所有表中搜索列名(查找具有特定列的所有表) |
get-ddl | 使用DBMS_METADATA获取任何对象的完整SQL CREATE脚本(DDL) |
explain-plan | 获取SQL查询的执行计划以分析性能 |
get-table-stats | 获取表的优化器统计信息(行数、上次分析时间、大小) |
list-invalid-objects | 列出所有状态为INVALID、需要重新编译的数据库对象 |
📝 文档工具
| 工具 | 说明 |
|---|
get-table-comments | 获取表及其列的注释/文档 |
get-table-relationships | 获取表的所有外键关系(传入和传出) |
📊 监视工具
| 工具 | 说明 |
|---|
list-sessions | 列出活动数据库会话(需要V$SESSION权限) |
get-job-run-history | 获取调度程序作业的执行历史记录(状态、持续时间、错误) |
先决条件
- 前进(1.18+): 构建应用程序。
- Oracle数据库: 访问Oracle实例。
- 无需即时客户端: 用途
go-ora,一个纯粹的围棋手。
配置
应用程序需要以下环境变量:
ORACLE_USER:数据库用户名。ORACLE_PASSWORD:数据库密码。ORACLE_CONNECT_STRING: host:port/service_name.
建筑
快速生成
go build -o mcp_oracle.exe .
构建并发布到GitHub
要创建一个新版本,并将可执行文件上传到GitHub:
# Interactive mode - prompts for version
.\release.ps1
# Specify version directly
.\release.ps1 -Version "v1.2.0"
# Create as draft release
.\release.ps1 -Version "v1.2.0" -Draft
发布的先决条件:
- (
gh)已安装并验证 - 跑
gh auth login 如果尚未通过身份验证
使用Claude Desktop
要将其与Claude Desktop应用程序一起使用,请将以下内容添加到配置文件中(通常 %APPDATA%\Claude\claude_desktop_config.json 在Windows上):
{
"mcpServers": {
"oracle-db": {
"command": "c:/path/to/your/mcp_oracle.exe",
"args": [],
"env": {
"ORACLE_USER": "your_user",
"ORACLE_PASSWORD": "your_password",
"ORACLE_CONNECT_STRING": "localhost:1521/XEPDB1"
},
"disabled": false,
"autoApprove": [
"sql-select",
"list-tables",
"get-table-schema",
"list-constraints",
"get-constraint-columns",
"list-objects",
"get-object-source",
"describe-object",
"list-jobs",
"get-job-details",
"list-dependencies",
"list-views",
"get-view-definition",
"list-indexes",
"get-index-columns",
"list-sequences",
"list-triggers",
"list-types",
"get-type-attributes",
"list-synonyms",
"search-source",
"search-columns",
"get-ddl",
"explain-plan",
"get-table-stats",
"list-invalid-objects",
"get-table-comments",
"get-table-relationships",
"list-sessions",
"get-job-run-history"
]
}
}
}
确保用实际值替换路径和凭据。
使用VS代码(扩展名)
如果您正在开发一个充当MCP客户端的VS Code扩展:
- 产卵
mcp_oracle.exe 过程。 - 在流程选项中设置环境变量。
- 通过以下方式进行沟通
stdin 和 stdout 使用MCP JSON-RPC协议。
工具示例
查询数据
Tool: sql-select
Arguments: {"query": "SELECT * FROM employees WHERE department_id = 10"}
列出所有程序
Tool: list-objects
Arguments: {"object_type": "PROCEDURE", "owner": "HR"}
获取源代码
Tool: get-object-source
Arguments: {"object_name": "CALCULATE_SALARY", "object_type": "PROCEDURE", "owner": "HR"}
列出工作
Tool: list-jobs
Arguments: {"owner": "MYSCHEMA"}
查找依赖关系
Tool: list-dependencies
Arguments: {"object_name": "MY_PACKAGE", "direction": "used_by"}
获取表约束
Tool: list-constraints
Arguments: {"table_name": "EMPLOYEES", "owner": "HR"}
手动测试(CLI)
您可以通过运行服务器来验证服务器是否启动,但它将挂起等待stdin上的JSON-RPC输入。
$env:ORACLE_USER="user"
$env:ORACLE_PASSWORD="password"
$env:ORACLE_CONNECT_STRING="localhost:1521/xe"
.\mcp_oracle.exe
MCP协议
此服务器实现了模型上下文协议(MCP)规范:
- 运输:Stdio(标准输入/标准输出)
- 协议:JSON-RPC 2.0
- 发现:支持
tools/list 用于自动工具发现 - 执行:支持
tools/call 用于工具执行
当AI代理连接时,它将通过 tools/list 方法。