Skip to main content

A Model Context Protocol (MCP) server that enables secure interaction with MySQL/MariaDB/TiDB/AWS OceanBase/RDS/Aurora MySQL DataBases.

Project description

Multi-Database MCP Client

A Model Context Protocol (MCP) server that enables secure interaction with multiple database types including MySQL, MariaDB, TiDB, OceanBase, and AWS RDS/Aurora MySQL. This server exposes database operations as MCP tools and resources while proxying actual SQL execution to a remote HTTP service.

๐Ÿš€ Features

  • Universal SQL Execution: Execute any SQL statement (SELECT, INSERT, UPDATE, DELETE, DDL) through a single tool
  • Multi-Database Support: Works with MySQL, MariaDB, TiDB, OceanBase, and compatible cloud databases
  • HTTP Proxy Architecture: Decouples MCP interface from database connections via HTTP forwarding
  • Schema Introspection: Get table structures and database metadata as MCP resources
  • Test Data Generation: Built-in tool for generating development test data
  • Flexible Configuration: Support for multiple database instances with runtime switching
  • Async I/O: Full asynchronous operation using aiohttp and asyncio
  • Structured Logging: Comprehensive logging with loguru to both stderr and rotating files

๐Ÿ—๏ธ Architecture

The system follows a proxy pattern where the MCP server acts as a client-side interface:

MCP Client โ†’ FastMCP Tools/Resources โ†’ HTTP POST โ†’ Remote DB Server โ†’ Database

Key Components

  • src/server.py: MCP server with FastMCP framework, tool/resource definitions
  • src/utils/db_operate.py: HTTP-proxied SQL execution engine
  • src/utils/db_config.py: Singleton configuration loader with multi-instance support
  • src/resources/db_resources.py: Database metadata and configuration resource builders
  • src/tools/db_tool.py: Test data generation utilities
  • src/utils/http_util.py: Async HTTP client helpers
  • src/utils/logger_util.py: Logging setup and configuration path resolution

๐Ÿ“‹ Requirements

  • Python 3.12+
  • A remote database server accessible via the configured multiDBServer endpoint

๐Ÿ”ง Installation

# Clone the repository
git clone https://github.com/j00131120/mcp_database_server.git
cd mcp_database_server/multidb_mcp_client

# Create virtual environment
python3.12 -m venv .venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

# Install dependencies
pip install -U pip
pip install -e .

โš™๏ธ Configuration

Configuration File

The server reads configuration from dbconfig.json (default) or a custom path via the config_file environment variable:

export config_file="/absolute/path/to/your/dbconfig.json"

Example Configuration

{
  "dbType-Comment": "Supported types: mysql, xesql, ubisql, rasesql, oceanbase, tidb",
  "dbList": [
    {
      "dbInstanceId": "primary_oceanbase",
      "dbHost": "localhost",
      "dbPort": 2281,
      "dbDatabase": "production_db",
      "dbUsername": "app_user",
      "dbPassword": "secure_password",
      "dbType": "OceanBase",
      "dbVersion": "V4.0.0",
      "dbActive": true
    },
    {
      "dbInstanceId": "backup_mysql",
      "dbHost": "backup.example.com",
      "dbPort": 3306,
      "dbDatabase": "backup_db",
      "dbUsername": "backup_user",
      "dbPassword": "backup_password",
      "dbType": "MySQL",
      "dbVersion": "8.0",
      "dbActive": false
    }
  ],
  "multiDBServer": "http://127.0.0.1:8080/mcp/executeQuery",
  "logPath": "/var/log/mcp-client",
  "logLevel": "INFO"
}

Configuration Properties

  • dbList: Array of database instance configurations
    • dbActive: Exactly one instance must be true (the active database)
    • dbType: Supported values include MySQL, OceanBase, TiDB, etc.
  • multiDBServer: HTTP endpoint that accepts SQL execution requests
  • logPath: Directory for log files (auto-creates if missing)
  • logLevel: One of TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL

Remote Server Contract

The multiDBServer endpoint must accept POST requests with this payload:

{
  "sql": "SELECT * FROM users WHERE id = ?",
  "params": [123],
  "databaseInstance": {
    "dbInstanceId": "primary_oceanbase",
    "dbHost": "localhost",
    "dbPort": 2281,
    "dbDatabase": "production_db",
    "dbUsername": "app_user",
    "dbPassword": "secure_password",
    "dbType": "OceanBase",
    "dbActive": true
  }
}

And return responses like:

{
  "result": [
    {"id": 123, "name": "John Doe", "email": "john@example.com"}
  ]
}

๐Ÿš€ Running the Server

Command Line

After installation, use the provided CLI command:

multidb-mcp-client

This starts the MCP server over stdio for consumption by MCP-compatible clients.

FastMCP CLI (Alternative)

# List available MCP servers
fastmcp servers list

# Run via entry point (defined in pyproject.toml)
fastmcp run mysql

Environment Variables

  • config_file: Override default config file path
  • Standard logging environment variables supported by loguru

๐Ÿ› ๏ธ MCP Tools

sql_exec(sql: str)

Execute any SQL statement with automatic transaction handling.

Parameters:

  • sql (string): SQL statement to execute

Returns:

{
  "success": true,
  "result": [...],  // Query results or affected row count
  "message": "SQL executed successfully"
}

Usage Examples:

# Query data
await sql_exec("SELECT * FROM users WHERE age > 18")

# Insert data
await sql_exec("INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com')")

# Update records
await sql_exec("UPDATE users SET email = 'newemail@example.com' WHERE id = 1")

# DDL operations
await sql_exec("CREATE TABLE products (id INT PRIMARY KEY, name VARCHAR(100))")

describe_table(table_name: str)

Get detailed table structure information.

Parameters:

  • table_name (string): Name of the table (supports database.table format)

Returns: Same format as sql_exec, with result containing column metadata.

Usage Examples:

await describe_table("users")
await describe_table("inventory.products")

generate_demo_data(table_name: str, columns_name: List[str], num: int)

Generate test data for development and testing.

Parameters:

  • table_name (string): Target table name
  • columns_name (array): List of column names to populate
  • num (integer): Number of test records to generate

Usage Examples:

# Generate 100 test users
await generate_demo_data("users", ["name", "email", "phone"], 100)

# Generate 50 test products
await generate_demo_data("products", ["product_name", "category", "description"], 50)

๐Ÿ“Š MCP Resources

database://tables

Provides comprehensive metadata for all database tables.

Returns:

{
  "uri": "database://tables",
  "mimeType": "application/json",
  "text": "[{\"name\": \"users\", \"columns\": [...], \"record_count\": 1250}, ...]"
}

Use Cases:

  • Schema exploration and documentation
  • Database monitoring and statistics
  • Query planning and optimization

database://config

Provides current database configuration (with sensitive data masked).

Returns:

{
  "uri": "database://config", 
  "mimeType": "application/json",
  "text": "{\"dbInstanceId\": \"primary_oceanbase\", \"dbHost\": \"localhost\", \"dbPassword\": \"***hidden***\", ...}"
}

๐Ÿ“ Logging

The system provides comprehensive logging:

  • Console Output: Logs to stderr for MCP client visibility
  • File Logging: Rotating log files (10MB max, 7-day retention)
  • Structured Format: Timestamp, level, function, line number, and message
  • Configurable Levels: TRACE through CRITICAL

Log files are stored in:

  • Configured logPath directory
  • Default: <project_root>/logs/mcp_server.log

๐Ÿ”’ Security Considerations

Current Security Features

  • Password Masking: Sensitive data hidden in resource responses
  • HTTP Client: Supports custom headers for authentication
  • Configuration Isolation: Only active database config exposed

Security Recommendations

  1. Credential Management: Store database passwords in environment variables or secure vaults
  2. Network Security: Use HTTPS for multiDBServer endpoint with proper authentication
  3. Access Control: Restrict sql_exec tool usage to trusted environments
  4. File Permissions: Secure dbconfig.json with appropriate file system permissions
  5. Network Isolation: Deploy multiDBServer in a secured network segment

Production Deployment

# Use environment variables for sensitive data
export DB_PASSWORD="your_secure_password"
export MULTIDB_SERVER_URL="https://secure-db-proxy.internal.com/api/v1/execute"

# Restrict config file permissions
chmod 600 dbconfig.json

# Run with non-root user
useradd -r mcp-client
sudo -u mcp-client multidb-mcp-client

๐Ÿงช Development

Project Structure

multidb_mcp_client/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ server.py              # MCP server and tool definitions
โ”‚   โ”œโ”€โ”€ resources/
โ”‚   โ”‚   โ””โ”€โ”€ db_resources.py    # Resource data builders
โ”‚   โ”œโ”€โ”€ tools/
โ”‚   โ”‚   โ””โ”€โ”€ db_tool.py         # Tool implementations
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ”œโ”€โ”€ db_config.py       # Configuration management
โ”‚       โ”œโ”€โ”€ db_operate.py      # SQL execution via HTTP
โ”‚       โ”œโ”€โ”€ http_util.py       # HTTP client utilities
โ”‚       โ””โ”€โ”€ logger_util.py     # Logging configuration
โ”œโ”€โ”€ dbconfig.json              # Database configuration
โ”œโ”€โ”€ pyproject.toml             # Project metadata and dependencies
โ””โ”€โ”€ logs/                      # Log output directory

Code Style

  • Explicit naming: Clear, descriptive function and variable names
  • Early returns: Reduce nesting with guard clauses
  • Type annotations: Public APIs include type hints
  • Error handling: Comprehensive exception handling with logging
  • Async/await: Proper async patterns throughout

Key Dependencies

  • fastmcp: MCP framework and protocol implementation
  • aiohttp: Async HTTP client for database proxy calls
  • loguru: Structured logging with rotation and formatting
  • mcp[cli]: MCP command-line tools

๐Ÿ“„ License

MIT License - see the LICENSE file for details.

๐Ÿ”— Links

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

๐Ÿ“ž Support

For questions, issues, or contributions:

  • Author: Frank Jin (j00131120@163.com)
  • GitHub Issues: Use the issue tracker for bug reports and feature requests
  • Documentation: Check the repository wiki for additional documentation

Note: This MCP server requires a compatible remote database service running at the configured multiDBServer endpoint. Ensure your remote service implements the expected HTTP API contract before running the client.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

multidb_mcp_client-0.1.0.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

multidb_mcp_client-0.1.0-py3-none-any.whl (17.3 kB view details)

Uploaded Python 3

File details

Details for the file multidb_mcp_client-0.1.0.tar.gz.

File metadata

  • Download URL: multidb_mcp_client-0.1.0.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.5

File hashes

Hashes for multidb_mcp_client-0.1.0.tar.gz
Algorithm Hash digest
SHA256 e10c98bc4b4ec54cc5b7c1e0982292d82e8986a31b0b4a332b58cec2f270aa02
MD5 c935d695fd4e9862f055a6b081773e69
BLAKE2b-256 5d2a6833ebca8c4564a326233df356c7e8ab384e52b756f50530270e9eb4f680

See more details on using hashes here.

File details

Details for the file multidb_mcp_client-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for multidb_mcp_client-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e5091679d94dbae456b542604a62e0a15ea7fa3550d7cb8252b57cb31b0f4933
MD5 e8ca76f8a8692283e8922d202bceac34
BLAKE2b-256 f728f7d9a6445d51fc5a67140eff98afd22d1a64da6c592891402fbc73eb12e9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page