# SQL MCP Server
The **SQL MCP Server** is a unified agentic interface that allows AI models (like Claude) to inspect, query, and interact with multiple types of databases through a single, standardized set of tools.
Instead of installing and configuring separate servers for MySQL, SQL Server, Oracle, etc., this single package handles them all by dynamically loading the correct "adapter" based on your configuration.
## 🚀 Features
- **Standardized Toolset**: The AI always sees the same tools (`execute_query`, `describe_table`, `get_db_version`), no matter if it's talking to Oracle or MySQL. This reduces hallucinations and improves query accuracy.
- **Resources**: Automatically exposes database tables as MCP Resources for easy inspection.
- **Smart Adapters**:
- ✅ **MySQL**: Uses `mysql-connector-python` with connection pooling.
- ✅ **MSSQL**: Uses `pymssql` and auto-detects schema names (e.g., `dbo.Users`).
- ✅ **Sybase / SAP IQ**: Uses `pyodbc` and intelligently handles `dba.` prefixes and server names.
- ✅ **Oracle**: Uses `oracledb` (Thin mode) for easy connectivity without complex driver installs.
- **Unicode Ready**: All connections default to UTF-8 to handle special characters seamlessly.
## 🛠️ Installation
1. **Clone the repository**:
```bash
git clone https://github.com/BryR0/sql-mcp.git
cd sql-mcp
```
2. **Create a virtual environment**:
```bash
python -m venv venv
source venv/bin/activate # On Windows: .\venv\Scripts\activate
```
3. **Install dependencies**:
```bash
pip install -e .
```
## ⚙️ Configuration
You define which database to use via the `DB_TYPE` environment variable.
### Supported Environment Variables
| Variable | Description | Required | Default |
|----------|-------------|----------|---------|
| `DB_TYPE` | Type of DB: `mysql`, `mssql`, `sybase`, `oracle` | **Yes** | `mysql` |
| `DB_HOST` | Hostname or IP address | **Yes** | `localhost` |
| `DB_USER` | Database username | **Yes** | `root` |
| `DB_PASSWORD` | Database password | **Yes** | (empty) |
| `DB_DATABASE` | Database name | **Yes** | `test` |
| `DB_PORT` | Port number | No | Auto (3306, 1433, etc.) |
| `DB_DSN` | Connection string (Oracle/Sybase advanced) | No | (empty) |
| `DB_SERVER_NAME` | Explicit Server Name (Sybase only) | No | (empty) |
### Claude Desktop Config Example
Add this to your `claude_desktop_config.json`. Note that `DB_PORT` is optional and will default to the standard port for the chosen DB type if omitted.
```json
{
"mcpServers": {
"sql_mcp_mysql": {
"command": "C:\\path\\to\\venv\\python.exe",
"args": ["-m", "sql_mcp"],
"env": {
"DB_TYPE": "mysql",
"DB_HOST": "localhost",
"DB_USER": "root",
"DB_PASSWORD": "password",
"DB_DATABASE": "my_db"
}
},
"sql_mcp_mssql": {
"command": "C:\\path\\to\\venv\\python.exe",
"args": ["-m", "sql_mcp"],
"env": {
"DB_TYPE": "mssql",
"DB_HOST": "192.168.1.50",
"DB_USER": "sa",
"DB_PASSWORD": "password",
"DB_DATABASE": "DataWarehouse"
}
}
}
}
```
## 🏗️ Architecture
The project uses an **Adapter Pattern**:
1. **Server** receives a request (e.g., `execute_query`).
2. **Factory** checks `DB_TYPE` and instantiates the correct class (e.g., `MSSQLAdapter`).
3. **Adapter** translates the generic request into specific driver calls (`pymssql`, `pyodbc`, etc.).
4. **Response** is formatted back to a standard JSON structure for the AI.
This means you can switch databases just by changing the config, without changing the AI's prompts or logic.
## 📄 License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.