A Model Context Protocol server that provides tools for connecting to and interacting with various database systems (SQLite, PostgreSQL, MySQL/MariaDB, SQL Server) through a unified interface.
A Model Context Protocol (MCP) server that provides tools for connecting to and interacting with various database systems.
psycopg2-binary
mysql-connector-python
pyodbc
# Clone the repository git clone # Install the package pip install -e .
The server can be configured using environment variables, a configuration file, or by providing connection details at runtime.
DB_CONFIG_PATH
: Path to a JSON configuration fileDB_CONNECTIONS
: A comma-separated list of connection IDs or a JSON string with connection details{ "connections": { "sqlite_conn": { "type": "sqlite", "db_path": "/path/to/database.db" }, "postgres_conn": { "type": "postgres", "host": "localhost", "port": 5432, "database": "mydatabase", "user": "myuser", "password": "mypassword" } } }
# Run with default settings python -m db_mcp_server # Specify a configuration file python -m db_mcp_server --config /path/to/config.json # Set logging level python -m db_mcp_server --log-level DEBUG
# Run as a web server python -m db_mcp_server.web_server # Specify host and port python -m db_mcp_server.web_server --host 0.0.0.0 --port 8000 # Specify configuration file and logging level python -m db_mcp_server.web_server --config /path/to/config.json --log-level DEBUG
add_connection
: Add a new database connectiontest_connection
: Test a database connectionlist_connections
: List all database connectionsremove_connection
: Remove a database connectionexecute_query
: Execute a SQL queryget_records
: Get records from a tableinsert_record
: Insert a record into a tableupdate_record
: Update records in a tabledelete_record
: Delete records from a tablelist_tables
: List all tables in a databaseget_table_schema
: Get the schema for a tablecreate_table
: Create a new tabledrop_table
: Drop a tablecreate_index
: Create an index on a tabledrop_index
: Drop an indexalter_table
: Alter a table structurebegin_transaction
: Begin a transactioncommit_transaction
: Commit a transactionrollback_transaction
: Rollback a transaction{ "connection_id": "my_sqlite_db", "type": "sqlite", "db_path": "/path/to/database.db" }
{ "connection_id": "my_sqlite_db", "query": "SELECT * FROM users WHERE age > ?", "params": [21] }
{ "connection_id": "my_sqlite_db", "table": "users", "columns": [ { "name": "id", "type": "INTEGER", "primary_key": true, "nullable": false }, { "name": "name", "type": "TEXT", "nullable": false }, { "name": "email", "type": "TEXT", "nullable": true } ] }
{ "connection_id": "my_sqlite_db", "table": "users", "data": { "name": "John Doe", "email": "john@example.com" } }
# Run all tests python -m unittest discover # Run specific test file python -m unittest tests.test_sqlite
When running as a standalone web server, other LLMs (like Llama 3) can connect to the database MCP server via HTTP. The server exposes the following endpoints:
/list_tools
- GET or POST: Returns a list of all available tools with their descriptions and input schemas/call_tool
- POST: Execute a specific database toolTo use this server with another LLM, have the LLM generate HTTP requests to the server. Here's an example of how you could structure the prompt for an LLM like Llama 3:
You can interact with a database by making HTTP requests to a database service at http://localhost:8000.
The service provides the following endpoints:
1. To get a list of available tools:
Make a POST request to: http://localhost:8000/list_tools
2. To execute a database tool:
Make a POST request to: http://localhost:8000/call_tool
with a JSON body like:
{
"name": "tool_name",
"arguments": {
"param1": "value1",
"param2": "value2"
}
}
For example, to execute a SQL query, you would make a request like:
POST http://localhost:8000/call_tool
Content-Type: application/json
{
"name": "execute_query",
"arguments": {
"connection_id": "my_db",
"query": "SELECT * FROM users"
}
}
import requests import json # Base URL of the database MCP server BASE_URL = "http://localhost:8000" # List available tools def list_tools(): response = requests.post(f"{BASE_URL}/list_tools") return response.json() # Execute a database tool def call_tool(tool_name, arguments): payload = { "name": tool_name, "arguments": arguments } response = requests.post(f"{BASE_URL}/call_tool", json=payload) return response.json() # Example: List tables in a database def list_tables(connection_id): return call_tool("list_tables", {"connection_id": connection_id}) # Example: Execute a SQL query def execute_query(connection_id, query, params=None): return call_tool("execute_query", { "connection_id": connection_id, "query": query, "params": params }) # Example: Add a new connection def add_connection(connection_id, db_type, **kwargs): args = {"connection_id": connection_id, "type": db_type} args.update(kwargs) return call_tool("add_connection", args)
Discover shared experiences
Shared threads will appear here, showcasing real-world applications and insights from the community. Check back soon for updates!