|
| 1 | +# MCP 服务器 - Oracle 数据库上下文 |
| 2 | + |
| 3 | +一个强大的模型上下文协议(MCP)服务器,为大型 Oracle 数据库提供上下文数据库模式信息,使 AI 助手能够理解和操作包含数千张表的数据库。 |
| 4 | + |
| 5 | +## 目录 |
| 6 | +- [概述](#概述) |
| 7 | +- [功能](#功能) |
| 8 | +- [使用方法](#使用方法) |
| 9 | + - [在 VSCode Insiders 中集成 GitHub Copilot](#在-vscode-insiders-中集成-github-copilot) |
| 10 | + - [选项 1:使用 Docker(推荐)](#选项-1使用-docker推荐) |
| 11 | + - [选项 2:使用 UV(本地安装)](#选项-2使用-uv本地安装) |
| 12 | + - [本地启动服务器](#本地启动服务器) |
| 13 | + - [可用工具](#可用工具) |
| 14 | +- [架构](#架构) |
| 15 | +- [连接模式](#连接模式) |
| 16 | + - [Thin 模式(默认)](#thin-模式默认) |
| 17 | + - [Thick 模式](#thick-模式) |
| 18 | +- [系统要求](#系统要求) |
| 19 | +- [性能注意事项](#性能注意事项) |
| 20 | +- [贡献](#贡献) |
| 21 | +- [许可证](#许可证) |
| 22 | +- [支持](#支持) |
| 23 | + |
| 24 | +## 概述 |
| 25 | + |
| 26 | +MCP Oracle DB Context 服务器解决了在处理超大型 Oracle 数据库时的一个关键难题:如何为 AI 模型提供准确、相关的数据库模式信息,而不会因成千上万的表和关系而使其不堪重负。 |
| 27 | + |
| 28 | +通过智能缓存和提供数据库模式信息,该服务器允许 AI 助手: |
| 29 | +- 按需查找特定表的结构 |
| 30 | +- 按模式搜索表 |
| 31 | +- 理解表之间的关系和外键 |
| 32 | +- 获取数据库厂商信息 |
| 33 | + |
| 34 | +## 功能 |
| 35 | + |
| 36 | +- **智能模式缓存**:构建并维护本地数据库模式缓存,减少数据库查询 |
| 37 | +- **有针对性的结构查找**:无需加载整个数据库结构即可检索特定表的结构 |
| 38 | +- **表搜索**:通过名称模式匹配查找表 |
| 39 | +- **关系映射**:理解表之间的外键关系 |
| 40 | +- **Oracle 数据库支持**:专为 Oracle 数据库设计 |
| 41 | +- **MCP 集成**:可与 VSCode、Claude、ChatGPT 等支持 MCP 的 AI 助手无缝协作 |
| 42 | + |
| 43 | +## 使用方法 |
| 44 | + |
| 45 | +### 在 VSCode Insiders 中集成 GitHub Copilot |
| 46 | + |
| 47 | +要在 VSCode Insiders 中将此 MCP 服务器与 GitHub Copilot 一起使用,请按照以下步骤操作: |
| 48 | + |
| 49 | +1. **安装 VSCode Insiders** |
| 50 | + - 下载并安装最新版本的 [VSCode Insiders](https://code.visualstudio.com/insiders/) |
| 51 | + |
| 52 | +2. **安装 GitHub Copilot 扩展** |
| 53 | + - 打开 VSCode Insiders |
| 54 | + - 进入扩展市场 |
| 55 | + - 搜索并安装"GitHub Copilot" |
| 56 | + |
| 57 | +3. **配置 MCP 服务器** |
| 58 | + - **推荐:[使用 Docker](#选项-1使用-docker推荐)** |
| 59 | + - 备选:[使用 UV](#选项-2使用-uv本地安装) |
| 60 | + |
| 61 | +4. **启用 Agent 模式** |
| 62 | + - 在 VSCode Insiders 中打开 Copilot 聊天 |
| 63 | + - 点击"Copilot Edits" |
| 64 | + - 选择"Agent mode" |
| 65 | + - 在聊天输入框点击刷新按钮以加载可用工具 |
| 66 | + |
| 67 | +完成上述步骤后,您将可以通过 GitHub Copilot 聊天界面访问所有数据库上下文工具。 |
| 68 | + |
| 69 | +#### 选项 1:使用 Docker(推荐) |
| 70 | + |
| 71 | +在 VSCode Insiders 的用户或工作区 `settings.json` 文件中添加如下内容: |
| 72 | + |
| 73 | + ```json |
| 74 | + "mcp": { |
| 75 | + "inputs": [ |
| 76 | + { |
| 77 | + "id": "db-password", |
| 78 | + "type": "promptString", |
| 79 | + "description": "Oracle DB Password", |
| 80 | + "password": true, |
| 81 | + } |
| 82 | + ], |
| 83 | + "servers": { |
| 84 | + "oracle": { |
| 85 | + "command": "docker", |
| 86 | + "args": [ |
| 87 | + "run", |
| 88 | + "-i", |
| 89 | + "--rm", |
| 90 | + "-e", |
| 91 | + "ORACLE_CONNECTION_STRING", |
| 92 | + "-e", |
| 93 | + "TARGET_SCHEMA", |
| 94 | + "-e", |
| 95 | + "CACHE_DIR", |
| 96 | + "-e", |
| 97 | + "THICK_MODE", |
| 98 | + "dmeppiel/oracle-mcp-server" |
| 99 | + ], |
| 100 | + "env": { |
| 101 | + "ORACLE_CONNECTION_STRING":"<db-username>/${input:db-password}@<host>:1521/<service-name>", |
| 102 | + "TARGET_SCHEMA":"", |
| 103 | + "CACHE_DIR":".cache", |
| 104 | + "THICK_MODE":"" // 可选:设置为 "1" 以启用 thick 模式 |
| 105 | + } |
| 106 | + } |
| 107 | + } |
| 108 | + } |
| 109 | + ``` |
| 110 | + |
| 111 | + 使用 Docker(推荐方式): |
| 112 | + - 所有依赖项都包含在容器中 |
| 113 | + - 如需启用 thick 模式,在环境变量中设置 `THICK_MODE=1` |
| 114 | + |
| 115 | +#### 选项 2:使用 UV(本地安装) |
| 116 | + |
| 117 | + 此选项需要在本地安装和设置项目: |
| 118 | + |
| 119 | + 1. **前置条件** |
| 120 | + - Python 3.12 或更高版本 |
| 121 | + - Oracle 数据库访问权限 |
| 122 | + - Oracle instant client(`oracledb` Python 包所需) |
| 123 | + |
| 124 | + 2. **安装 UV** |
| 125 | + ```bash |
| 126 | + # 使用 curl 安装 uv(macOS/Linux) |
| 127 | + curl -LsSf https://astral.sh/uv/install.sh | sh |
| 128 | + |
| 129 | + # 或使用 PowerShell(Windows) |
| 130 | + irm https://astral.sh/uv/install.ps1 | iex |
| 131 | + ``` |
| 132 | + 安装 uv 后请重启终端。 |
| 133 | + |
| 134 | + 3. **项目设置** |
| 135 | + ```bash |
| 136 | + # 克隆仓库 |
| 137 | + git clone https://github.com/yourusername/oracle-mcp-server.git |
| 138 | + cd oracle-mcp-server |
| 139 | +
|
| 140 | + # 创建并激活虚拟环境 |
| 141 | + uv venv |
| 142 | + |
| 143 | + # 激活(Unix/macOS) |
| 144 | + source .venv/bin/activate |
| 145 | + |
| 146 | + # 激活(Windows) |
| 147 | + .venv\Scripts\activate |
| 148 | +
|
| 149 | + # 安装依赖 |
| 150 | + uv pip install -e . |
| 151 | + ``` |
| 152 | + |
| 153 | + 4. **配置 VSCode 设置** |
| 154 | + ```json |
| 155 | + "mcp": { |
| 156 | + "inputs": [ |
| 157 | + { |
| 158 | + "id": "db-password", |
| 159 | + "type": "promptString", |
| 160 | + "description": "Oracle DB Password", |
| 161 | + "password": true, |
| 162 | + } |
| 163 | + ], |
| 164 | + "servers": { |
| 165 | + "oracle": { |
| 166 | + "command": "/path/to/your/.local/bin/uv", |
| 167 | + "args": [ |
| 168 | + "--directory", |
| 169 | + "/path/to/your/oracle-mcp-server", |
| 170 | + "run", |
| 171 | + "main.py" |
| 172 | + ], |
| 173 | + "env": { |
| 174 | + "ORACLE_CONNECTION_STRING":"<db-username>/${input:db-password}@<host>:1521/<service-name>", |
| 175 | + "TARGET_SCHEMA":"", |
| 176 | + "CACHE_DIR":".cache", |
| 177 | + "THICK_MODE":"" // 可选:设置为 "1" 以启用 thick 模式 |
| 178 | + } |
| 179 | + } |
| 180 | + } |
| 181 | + } |
| 182 | + ``` |
| 183 | + - 请将路径替换为实际的 uv 可执行文件路径和 oracle-mcp-server 目录路径 |
| 184 | + |
| 185 | +两种方式均需: |
| 186 | +- 将 `ORACLE_CONNECTION_STRING` 替换为实际的数据库连接字符串 |
| 187 | +- `TARGET_SCHEMA` 可选,默认为当前用户的 schema |
| 188 | +- `CACHE_DIR` 可选,默认为 MCP 服务器根目录下的 `.cache` |
| 189 | + |
| 190 | +### 本地启动服务器 |
| 191 | + |
| 192 | +直接运行 MCP 服务器: |
| 193 | + |
| 194 | +```bash |
| 195 | +uv run main.py |
| 196 | +# Reference: uv run --python D:\oracle-mcp-server\.venv\Scripts\python.exe --with mcp[cli] mcp run D:\oracle-mcp-server\main.py |
| 197 | +# Reference By Supergateway: npx -y supergateway --stdio "uv run main.py" --port 8000 --baseUrl http://localhost:8000 --ssePath /sse --messagePath /message (Subscribe to events: GET http://localhost:8000/sse;Send messages: POST http://localhost:8000/message) |
| 198 | +``` |
| 199 | + |
| 200 | +开发和测试: |
| 201 | + |
| 202 | +```bash |
| 203 | +# 安装 MCP Inspector |
| 204 | +uv pip install mcp-cli |
| 205 | +
|
| 206 | +# 使用 MCP Inspector 测试 |
| 207 | +mcp dev main.py |
| 208 | +
|
| 209 | +# 或安装到 Claude Desktop |
| 210 | +mcp install main.py |
| 211 | +``` |
| 212 | + |
| 213 | +### 可用工具 |
| 214 | + |
| 215 | +当通过 VSCode Insiders、Claude 等 AI 助手连接时,以下工具可用: |
| 216 | + |
| 217 | +#### `get_table_schema` |
| 218 | +获取指定表的详细结构信息,包括列、数据类型、可空性和关系。 |
| 219 | +示例: |
| 220 | +``` |
| 221 | +请展示 EMPLOYEES 表的结构。 |
| 222 | +``` |
| 223 | +
|
| 224 | +#### `get_tables_schema` |
| 225 | +一次获取多个表的结构信息。比多次调用 get_table_schema 更高效。 |
| 226 | +示例: |
| 227 | +``` |
| 228 | +请同时提供 EMPLOYEES 和 DEPARTMENTS 两个表的结构。 |
| 229 | +``` |
| 230 | +
|
| 231 | +#### `search_tables_schema` |
| 232 | +按名称模式搜索表并获取其结构。 |
| 233 | +示例: |
| 234 | +``` |
| 235 | +查找所有可能与客户相关的表并展示其结构。 |
| 236 | +``` |
| 237 | +
|
| 238 | +#### `rebuild_schema_cache` |
| 239 | +强制重建结构缓存。请谨慎使用,此操作资源消耗较大。 |
| 240 | +示例: |
| 241 | +``` |
| 242 | +数据库结构已更改。请重建结构缓存。 |
| 243 | +``` |
| 244 | +
|
| 245 | +#### `get_database_vendor_info` |
| 246 | +获取已连接 Oracle 数据库的版本和 schema 信息。 |
| 247 | +示例: |
| 248 | +``` |
| 249 | +我们正在运行哪个版本的 Oracle 数据库? |
| 250 | +``` |
| 251 | +
|
| 252 | +#### `search_columns` |
| 253 | +查找包含特定字段的表。当你知道需要的数据但不确定在哪些表时很有用。 |
| 254 | +示例: |
| 255 | +``` |
| 256 | +哪些表包含 customer_id 相关的字段? |
| 257 | +``` |
| 258 | +
|
| 259 | +#### `get_pl_sql_objects` |
| 260 | +获取 PL/SQL 对象(如过程、函数、包、触发器等)信息。 |
| 261 | +示例: |
| 262 | +``` |
| 263 | +展示所有以 'CUSTOMER_' 开头的存储过程。 |
| 264 | +``` |
| 265 | +
|
| 266 | +#### `get_object_source` |
| 267 | +获取 PL/SQL 对象的源代码。便于调试和理解数据库逻辑。 |
| 268 | +示例: |
| 269 | +``` |
| 270 | +请展示 CUSTOMER_UPDATE_PROC 过程的源代码。 |
| 271 | +``` |
| 272 | +
|
| 273 | +#### `get_table_constraints` |
| 274 | +获取表的所有约束(主键、外键、唯一约束、检查约束等)。 |
| 275 | +示例: |
| 276 | +``` |
| 277 | +ORDERS 表定义了哪些约束? |
| 278 | +``` |
| 279 | +
|
| 280 | +#### `get_table_indexes` |
| 281 | +获取表的所有索引,有助于查询优化。 |
| 282 | +示例: |
| 283 | +``` |
| 284 | +请展示 CUSTOMERS 表的所有索引。 |
| 285 | +``` |
| 286 | +
|
| 287 | +#### `get_dependent_objects` |
| 288 | +查找所有依赖于指定数据库对象的对象。 |
| 289 | +示例: |
| 290 | +``` |
| 291 | +哪些对象依赖于 CUSTOMER_VIEW 视图? |
| 292 | +``` |
| 293 | +
|
| 294 | +#### `get_user_defined_types` |
| 295 | +获取数据库中用户自定义类型的信息。 |
| 296 | +示例: |
| 297 | +``` |
| 298 | +请展示 schema 中所有自定义类型。 |
| 299 | +``` |
| 300 | +
|
| 301 | +#### `get_related_tables` |
| 302 | +获取通过外键与指定表相关的所有表,显示入向和出向关系。 |
| 303 | +示例: |
| 304 | +``` |
| 305 | +ORDERS 表与哪些表有关联? |
| 306 | +``` |
| 307 | +
|
| 308 | +## 架构 |
| 309 | +
|
| 310 | +本 MCP 服务器采用三层架构,针对大型 Oracle 数据库进行了优化: |
| 311 | +
|
| 312 | +1. **DatabaseConnector 层** |
| 313 | + - 管理 Oracle 数据库连接和查询执行 |
| 314 | + - 实现连接池和重试逻辑 |
| 315 | + - 处理原始 SQL 操作 |
| 316 | +
|
| 317 | +2. **SchemaManager 层** |
| 318 | + - 实现智能结构缓存 |
| 319 | + - 提供优化的结构查找和搜索 |
| 320 | + - 管理磁盘上的持久缓存 |
| 321 | +
|
| 322 | +3. **DatabaseContext 层** |
| 323 | + - 暴露高层 MCP 工具和接口 |
| 324 | + - 处理授权和访问控制 |
| 325 | + - 为 AI 消费优化结构信息 |
| 326 | +
|
| 327 | +## 连接模式 |
| 328 | +
|
| 329 | +数据库连接器支持两种连接模式: |
| 330 | +
|
| 331 | +### Thin 模式(默认) |
| 332 | +默认使用 Oracle 的 thin 模式(纯 Python 实现)。该模式: |
| 333 | +- 更易于设置和部署 |
| 334 | +- 足以满足大多数基本数据库操作 |
| 335 | +- 跨不同环境更具可移植性 |
| 336 | +
|
| 337 | +### Thick 模式 |
| 338 | +如需高级 Oracle 功能或更高性能,可启用 thick 模式: |
| 339 | +- 使用 Docker(推荐):在 Docker 环境变量中设置 `THICK_MODE=1` |
| 340 | +- 本地安装时:导出 `THICK_MODE=1` 环境变量,并确保已安装与系统架构和数据库版本兼容的 Oracle Client 库 |
| 341 | +
|
| 342 | +注意:使用 Docker 时无需担心 Oracle Client 库的安装,容器已包含(Oracle Instant Client v23.7)。该容器支持 19c 至 23ai 版本的 Oracle 数据库,兼容 linux/arm64 和 linux/amd64 架构。 |
| 343 | +
|
| 344 | +## 系统要求 |
| 345 | +
|
| 346 | +- **Python**:3.12 或更高版本(为获得最佳性能) |
| 347 | +- **内存**:大型数据库(1 万+表)建议 4GB 以上可用内存 |
| 348 | +- **磁盘**:结构缓存至少需 500MB 可用空间 |
| 349 | +- **Oracle**:兼容 Oracle Database 11g 及以上 |
| 350 | +- **网络**:与 Oracle 数据库服务器的稳定连接 |
| 351 | +
|
| 352 | +## 性能注意事项 |
| 353 | +
|
| 354 | +- 初次构建缓存对于超大型数据库可能需要 5-10 分钟 |
| 355 | +- 后续启动通常少于 30 秒 |
| 356 | +- 缓存后结构查找通常为亚秒级 |
| 357 | +- 内存使用量随活跃结构规模增长 |
| 358 | +
|
| 359 | +## 贡献 |
| 360 | +
|
| 361 | +欢迎贡献!详情请参阅我们的 [贡献指南](CONTRIBUTING.md)。 |
| 362 | +
|
| 363 | +## 许可证 |
| 364 | +
|
| 365 | +本项目采用 MIT 许可证,详见 [LICENSE](LICENSE) 文件。 |
| 366 | +
|
| 367 | +## 支持 |
| 368 | +
|
| 369 | +如有问题和疑问: |
| 370 | +- 请在本 GitHub 仓库创建 issue |
0 commit comments