MCP Database Tools Server
An MCP server designed to automate Django database setup and management, including PostgreSQL database creation and extension configuration. It enables users to update environment files and execute Django management commands through integrated tools like VS Code Copilot.
README
MCP Database Tools Server
π Table of Contents
- Overview
- Architecture
- Project Structure
- Component Flow
- Installation & Setup
- Usage
- Configuration
- Troubleshooting
π― Overview
This project is a Model Context Protocol (MCP) Server that automates Django database setup and management tasks. It provides tools to:
- Create PostgreSQL databases
- Enable PostgreSQL extensions (hstore)
- Update Django .env configuration files
- Execute Django management commands
The server integrates with VS Code Copilot and can be accessed via:
- VS Code MCP integration
- Automated workflow scripts
ποΈ Architecture
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Client Layer β
β ββββββββββββββββ ββββββββββββββββ β
β β VS Code β β Workflow β β
β β Copilot β β Scripts β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
βββββββββββΌβββββββββββββββββββΌβββββββββββββββββββΌβββββββββββββββββββ
β β β
ββββββββββββββββββββΌβββββββββββββββββββ
β
ββββββββββΌβββββββββ
β MCP Server β
β (server.py) β
β β
β - list_tools() β
β - call_tool() β
ββββββββββ¬βββββββββ
β
ββββββββββββββββββββΌβββββββββββββββββββ
β β β
βββββββΌββββββ βββββββΌββββββ βββββββΌββββββ
βPostgreSQL β β Django β β .env β
β Database β β Backend β β File β
βββββββββββββ βββββββββββββ βββββββββββββ
π Project Structure
MCP_project/
β
βββ server.py # Main MCP server implementation
βββ mcp.json # MCP server metadata
βββ requirements.txt # Python dependencies
β
* Web and CLI clients removed: The project no longer includes web_client.py or test_client.py files.
βββ run_workflow.py # Automated workflow executor
β
βββ tools/ # Utility modules (legacy/reference)
β βββ __init__.py
β βββ db_tools.py # PostgreSQL database operations
β βββ env_tools.py # Environment file management
β βββ django_tools.py # Django command execution
β
βββ templates/ # Web UI templates
β βββ index.html # Main web interface
β
βββ venv/ # Python virtual environment
π Component Flow
1. Core Server (server.py)
The heart of the system, implementing the MCP protocol:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β server.py β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Configuration: β
β ββ PG_USER, PG_PASSWORD, PG_HOST β
β ββ DB_NAME (default: sample_project_db) β
β ββ ENV_PATH (Django .env location) β
β ββ MANAGE_PY (Django manage.py location) β
β ββ PYTHON_EXEC (Virtual environment Python) β
β β
β MCP Server Decorators: β
β ββ @server.list_tools() β Returns available tools β
β ββ @server.call_tool() β Executes tool operations β
β β
β Tools Implemented: β
β ββ create_database(db_name) β
β ββ enable_hstore(db_name) β
β ββ update_env(db_name) β
β ββ django(cmd) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Key Features:
- Async/await architecture for MCP protocol compliance
- stdio communication (not HTTP) for MCP client integration
- Automatic lowercase conversion for PostgreSQL database names
- Environment variable loading from .env files for Django commands
- Virtual environment Python execution to ensure dependencies
2. Tool: create_database
Input: { db_name: "mydb" }
β
ββ Converts db_name to lowercase ("mydb")
β
ββ Connects to PostgreSQL server (postgres database)
β ββ Uses: PG_USER, PG_PASSWORD, PG_HOST
β
ββ Executes: CREATE DATABASE mydb;
β
ββ Returns: "Database mydb created."
PostgreSQL Connection:
psycopg2.connect(
dbname="postgres",
user=PG_USER,
password=PG_PASSWORD,
host=PG_HOST
)
3. Tool: enable_hstore
Input: { db_name: "mydb" }
β
ββ Converts db_name to lowercase
β
ββ Connects to the specified database
β
ββ Executes: CREATE EXTENSION IF NOT EXISTS hstore;
β
ββ Returns: "hstore extension enabled in mydb."
Purpose: Enables PostgreSQL's hstore extension for key-value pair storage.
4. Tool: update_env
Input: { db_name: "mydb" }
β
ββ Converts db_name to lowercase
β
ββ Reads ENV_PATH file
β
ββ Finds line: POSTGRES_DB_NAME=old_value
β ββ Skips commented lines (#)
β
ββ Replaces with: POSTGRES_DB_NAME=mydb
β
ββ Returns: ".env updated: POSTGRES_DB_NAME=mydb"
File Operations:
- Preserves all other .env content
- Only updates non-commented POSTGRES_DB_NAME lines
- Maintains file structure and formatting
5. Tool: django
Input: { cmd: "migrate" }
β
ββ Loads environment from ENV_PATH using dotenv
β ββ Merges with os.environ
β
ββ Executes: PYTHON_EXEC MANAGE_PY migrate
β ββ In working directory: dirname(MANAGE_PY)
β ββ With loaded environment variables
β
ββ Captures stdout and stderr
β
ββ Returns: Command output with exit code
Execution Flow:
subprocess.run(
[PYTHON_EXEC, MANAGE_PY] + cmd.split(),
cwd=workdir,
env=env, # Loaded from .env
capture_output=True,
text=True
)
Why Virtual Environment Python?
- Django and dependencies installed in virtual environment
- System Python lacks required packages
- Ensures consistent execution environment
Client Interfaces
Access to the server is primarily via VS Code MCP integration and the automated workflow script.
C. Workflow Automation (run_workflow.py)
Complete Database Setup Workflow
βββββββββββββββββββββββββββββββββββββββββββ
β Step 1: Create database β
β Step 2: Enable hstore extension β
β Step 3: Update .env file β
β Step 4: Run create_text_search_config β
β Step 5: Run migrations β
β Step 6: Run update_fixtures β
βββββββββββββββββββββββββββββββββββββββββββ
Usage:
python run_workflow.py mydb
What It Does:
- Creates PostgreSQL database "mydb"
- Enables hstore extension
- Updates .env with POSTGRES_DB_NAME=mydb
- Runs Django setup commands in sequence
- Reports success/failure for each step
π οΈ Installation & Setup
Prerequisites
- Python 3.12+
- PostgreSQL server running
- Django project (optional, for Django commands)
Step 1: Clone/Setup Project
cd /home/chaitanyaphani/MCP_project
Step 2: Create Virtual Environment
python3 -m venv venv
source venv/bin/activate # Linux/Mac
# or
venv\Scripts\activate # Windows
Step 3: Install Dependencies
pip install -r requirements.txt
Dependencies:
mcp- Model Context Protocol SDKFlask- Web UI frameworkpsycopg2-binary- PostgreSQL adapterpython-dotenv- Environment file support
Step 4: Configure PostgreSQL
Edit server.py:
PG_USER = "postgres"
PG_PASSWORD = "your_password" # Update this!
PG_HOST = "localhost"
Step 5: Configure Django Paths
Edit server.py:
ENV_PATH = "/path/to/your/django/.env"
MANAGE_PY = "/path/to/your/django/manage.py"
PYTHON_EXEC = "/path/to/your/django/venv/bin/python"
Step 6: Configure VS Code (Optional)
Edit VS Code settings (settings.json):
{
"mcpServers": {
"dbtools": {
"command": "python",
"args": ["server.py"],
"cwd": "/home/chaitanyaphani/MCP_project"
}
}
}
π Usage
Method 1: Automated Workflow
python run_workflow.py database_name
Method 2: VS Code Copilot
Once configured, simply ask: Once configured, simply ask:
"Create a database named myproject, enable hstore,
update the .env file, and run migrations"
βοΈ Configuration
Environment Variables
The server uses these configuration constants:
| Variable | Purpose | Default |
|---|---|---|
PG_USER |
PostgreSQL username | postgres |
PG_PASSWORD |
PostgreSQL password | root |
PG_HOST |
PostgreSQL host | localhost |
PG_PORT |
PostgreSQL port | 5432 |
DB_NAME |
Default database name | sample_project_db |
ENV_PATH |
Django .env file path | /path/to/.env |
MANAGE_PY |
Django manage.py path | /path/to/manage.py |
PYTHON_EXEC |
Virtual env Python | /path/to/venv/bin/python |
Django .env File Format
Expected format:
POSTGRES_DB_HOST=localhost
POSTGRES_DB_PORT=5432
POSTGRES_DB_NAME=mydb
POSTGRES_DB_USER=postgres
POSTGRES_DB_PASSWORD=password
π Troubleshooting
Issue 1: "AttributeError: 'Server' object has no attribute 'define_tool'"
Cause: Using incorrect MCP decorator syntax.
Solution: Use @server.list_tools() and @server.call_tool() instead of @server.define_tool.
Issue 2: "password authentication failed for user 'postgres'"
Cause: Incorrect PostgreSQL password.
Solution: Update PG_PASSWORD in server.py with your actual PostgreSQL password.
Issue 3: "ModuleNotFoundError: No module named 'django'"
Cause: Using system Python instead of virtual environment Python.
Solution: Ensure PYTHON_EXEC points to your Django project's virtual environment Python.
Issue 4: "database 'XX' does not exist" (uppercase names)
Cause: PostgreSQL converts unquoted identifiers to lowercase.
Solution: Server now automatically converts database names to lowercase.
Issue 5: ".env updated but database name not changed"
Cause: Looking for wrong variable name in .env file.
Solution: Ensure your .env uses POSTGRES_DB_NAME= (not POSTGRES_DB=).
Issue 6: "Tables not created after migrate"
Cause: Environment variables not loaded, or wrong Python executable.
Solutions:
- Verify
PYTHON_EXECpoints to correct virtual environment - Check
.envfile is loaded and contains correct database name - Run migrate manually to see detailed errors
π Data Flow Diagram
Complete Workflow Example
User Request: "Create database 'myapp'"
β
ββ VS Code Copilot/Web UI/CLI
β ββ Sends MCP request to server.py
β
ββ server.py receives call_tool("create_database", {"db_name": "myapp"})
β β
β ββ Step 1: create_database
β β ββ Convert "myapp" β "myapp" (lowercase)
β β ββ Connect to PostgreSQL
β β ββ Execute: CREATE DATABASE myapp;
β β ββ Return: "Database myapp created."
β β
β ββ Step 2: enable_hstore
β β ββ Connect to "myapp" database
β β ββ Execute: CREATE EXTENSION IF NOT EXISTS hstore;
β β ββ Return: "hstore extension enabled in myapp."
β β
β ββ Step 3: update_env
β β ββ Read /path/to/.env
β β ββ Find: POSTGRES_DB_NAME=olddb
β β ββ Replace with: POSTGRES_DB_NAME=myapp
β β ββ Write back to file
β β ββ Return: ".env updated: POSTGRES_DB_NAME=myapp"
β β
β ββ Step 4: django("migrate")
β ββ Load .env into environment
β ββ Execute: /venv/bin/python manage.py migrate
β β ββ Django reads POSTGRES_DB_NAME=myapp from env
β β ββ Connects to "myapp" database
β β ββ Applies migrations
β ββ Return: Migration output
β
ββ Result returned to user
π Key Concepts
Model Context Protocol (MCP)
- Protocol for AI assistants to interact with tools
- stdio-based communication (not HTTP)
- Async/await pattern required
- Tool registration via
list_tools() - Tool execution via
call_tool()
Why This Architecture?
- Separation of Concerns: Server logic separate from client interfaces
- Multiple Interfaces: Same server, different access methods
- Type Safety: MCP protocol with schema validation
- Error Handling: Comprehensive error reporting
- Environment Isolation: Uses virtual environment Python
PostgreSQL Naming Rules
- Unquoted identifiers converted to lowercase
CREATE DATABASE MyDBcreatesmydb- Server automatically handles this conversion
π Tool Reference
create_database
{
"name": "create_database",
"arguments": {
"db_name": "string (optional, default: sample_project_db)"
},
"returns": "Database {db_name} created."
}
enable_hstore
{
"name": "enable_hstore",
"arguments": {
"db_name": "string (optional, default: sample_project_db)"
},
"returns": "hstore extension enabled in {db_name}."
}
update_env
{
"name": "update_env",
"arguments": {
"db_name": "string (optional, default: sample_project_db)"
},
"returns": ".env updated: POSTGRES_DB_NAME={db_name}"
}
django
{
"name": "django",
"arguments": {
"cmd": "string (required) - Django management command"
},
"returns": "Command output (stdout/stderr)"
}
Common Django Commands:
migrate- Apply database migrationsmakemigrations- Create new migrationscreate_text_search_config- Custom commandupdate_fixtures- Custom fixture managementrunserver- Start development server
π€ Contributing
To extend this server with new tools:
- Add tool definition in
list_tools():
Tool(
name="my_new_tool",
description="What it does",
inputSchema={
"type": "object",
"properties": {
"param1": {"type": "string", "description": "..."}
},
"required": ["param1"]
}
)
- Add tool implementation in
call_tool():
elif name == "my_new_tool":
param1 = arguments.get("param1")
# Your logic here
return [TextContent(type="text", text="Result")]
π Support
For issues or questions:
- Check the Troubleshooting section
- Verify configuration in
server.py - Test with
run_workflow.pyfor debugging/automation - Check PostgreSQL logs for database issues
- Check Django logs for Django command issues
π License
This project is part of the Altiushub backend infrastructure.
Last Updated: December 12, 2025
Version: 1.0.0
MCP Protocol Version: Compatible with MCP SDK latest
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.