MCP Server for Oracle
# MCP Server for Oracle
[](https://smithery.ai/server/@zhengyun1008/mcp-server-oracle)
A Model Context Protocol server that provides access to Oracle databases with fine-grained access control. Supports **multiple databases**, **access modes**, and **table-level permissions**.
## Features
- **Multi-database support**: Connect to multiple Oracle databases simultaneously
- **Access control**: `readonly`, `readwrite`, `full` modes per database
- **Table-level permissions**: Whitelist/blacklist with wildcards and regex
- **Read-only transaction protection**: Database-level safety for readonly mode
- **Backward compatible**: Works with single database environment variables
## Components
### Tools
| Tool | Description |
|------|-------------|
| `oracle_query` | Read-only SELECT queries (always available) |
| `oracle_execute` | Write operations (only visible when writable databases exist) |
### Resources
- **oracle://connections**: List of database connections with access modes
- **oracle://{db}/tables/{table}/schema**: Table schema
### Prompts
- **oracle_usage_guide**: Dynamic guide based on configured databases
## Configuration
### Config File
Create `~/.mcp_oracle/databases.json`:
```json
{
"databases": [
{
"name": "prod",
"user": "...",
"password": "...",
"connectString": "...",
"accessMode": "readonly"
},
{
"name": "dev",
"user": "...",
"password": "...",
"connectString": "...",
"accessMode": "readwrite",
"allowedTables": ["LOG_*", "TMP_*", "/^TEST_.*/"]
}
]
}
```
### Access Modes
| Mode | SELECT | INSERT/UPDATE/DELETE | DDL |
|------|--------|---------------------|-----|
| `readonly` (default) | ✅ | ❌ | ❌ |
| `readwrite` | ✅ | ✅ | ❌ |
| `full` | ✅ | ✅ | ✅ |
### Table Patterns
| Format | Example | Matches |
|--------|---------|---------|
| Exact | `LOG_TABLE` | Only `LOG_TABLE` |
| Wildcard | `LOG_*` | `LOG_` prefix |
| Regex | `/^TEST_\d+$/` | `TEST_` + digits |
### Environment Variables
| Variable | Description |
|----------|-------------|
| `ORACLE_CONFIG_PATH` | Custom config file path |
| `ORACLE_USER` | Legacy single-database user |
| `ORACLE_PASS` | Legacy single-database password |
| `ORACLE_CONNECTION_STRING` | Legacy connection string |
| `ORACLE_HOME` | Oracle client library path |
| `TNS_ADMIN` | TNS admin directory |
## Usage Example
```
User: "查询 prod 库中的用户表"
→ oracle_query(database="prod", sql="SELECT * FROM users")
User: "在 dev 库的 LOG_TEST 表插入一条记录"
→ oracle_execute(database="dev", sql="INSERT INTO LOG_TEST ...", confirm=true)
```
## Security
- **readonly mode**: Uses `SET TRANSACTION READ ONLY` for database-level protection
- **SQL validation**: Validates statement type before execution
- **Table validation**: Checks whitelist/blacklist before write operations
- **Confirmation required**: Write operations require `confirm=true`
## License
MIT License
TDQS
Scored across 1 tool
With only one tool, there is no possibility of ambiguity or overlap between tools. The tool's purpose is clearly defined as running read-only SELECT queries on an Oracle database, making it distinct by default.
The single tool name 'oracle_query' follows a clear and consistent verb_noun pattern (query as the action, oracle as the domain). With only one tool, there is no inconsistency to evaluate, so it scores perfectly.
One tool is too few for a database server's apparent scope, which typically requires operations like insert, update, delete, schema inspection, or transaction management. This minimal set severely limits functionality and will likely cause agent failures in complex tasks.
The tool surface is severely incomplete for an Oracle database server. It only supports read-only SELECT queries, missing essential CRUD operations (create, update, delete), schema exploration, connection management, and other database interactions, making it inadequate for typical database workflows.