Skip to content

Commit 1a77060

Browse files
Merge pull request #14 from crazyyanchao/main
Fix bug on -Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production && Enhance Configuration && Optimize Test Command
2 parents 366b105 + d546a70 commit 1a77060

File tree

6 files changed

+386
-6
lines changed

6 files changed

+386
-6
lines changed

.env.example

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ ORACLE_CONNECTION_STRING=user/pass@localhost:1521/mydb
66
# TARGET_SCHEMA=
77

88
# Optional: Cache directory for schema information (defaults to .cache)
9-
CACHE_DIR=.cache
9+
CACHE_DIR=.cache
10+
11+
# Optional: oracle client lib dir.
12+
ORACLE_CLIENT_LIB_DIR=E:\..

README-zh.md

Lines changed: 370 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,370 @@
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

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ To run the MCP server directly:
193193
194194
```bash
195195
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)
196198
```
197199
198200
For development and testing:

0 commit comments

Comments
 (0)