jinto/fastmcp-mysql
If you are the rightful owner of fastmcp-mysql and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
FastMCP MySQL Server is a high-performance server implementation designed for secure and efficient access to MySQL databases, specifically tailored for LLM applications.
mysql_query
Execute SQL queries against the configured MySQL database.
FastMCP MySQL Server
A FastMCP server implementation for MySQL database operations, providing secure and efficient access to MySQL databases for LLM applications.
Features
- š Secure by Default: Read-only access with optional write permissions
- ā” High Performance: Connection pooling and async operations
- š”ļø SQL Injection Protection: Built-in query validation and prepared statements
- š Comprehensive Monitoring: Structured JSON logging
- š§ Flexible Configuration: Environment variable based configuration
- š Easy Deployment: Install and run with
uvx
Installation
Using uvx (Recommended)
# Run directly with uvx
uvx fastmcp-mysql
# With environment variables
MYSQL_HOST=localhost MYSQL_USER=myuser MYSQL_PASSWORD=mypass MYSQL_DB=mydb uvx fastmcp-mysql
Using pip
pip install fastmcp-mysql
From source
git clone https://github.com/jinto/fastmcp-mysql
cd fastmcp-mysql
uv sync --all-extras
Configuration
Configure the server using environment variables:
Required Variables
Variable | Description | Default |
---|---|---|
MYSQL_USER | Database username | - |
MYSQL_PASSWORD | Database password | - |
Optional Variables
Variable | Description | Default |
---|---|---|
MYSQL_HOST | Database host | "127.0.0.1" |
MYSQL_PORT | Database port | "3306" |
MYSQL_DB | Database name (optional) | None |
MYSQL_ALLOW_INSERT | Enable INSERT queries | false |
MYSQL_ALLOW_UPDATE | Enable UPDATE queries | false |
MYSQL_ALLOW_DELETE | Enable DELETE queries | false |
MYSQL_POOL_SIZE | Connection pool size | 10 |
MYSQL_QUERY_TIMEOUT | Query timeout (ms) | 30000 |
MYSQL_LOG_LEVEL | Log level (DEBUG, INFO, WARNING, ERROR) | INFO |
MYSQL_CACHE_ENABLED | Enable query result caching | true |
MYSQL_CACHE_MAX_SIZE | Maximum cache entries | 1000 |
MYSQL_CACHE_TTL | Cache TTL (ms) | 60000 |
MYSQL_CACHE_EVICTION_POLICY | Cache eviction policy (lru/ttl/fifo) | lru |
MYSQL_CACHE_CLEANUP_INTERVAL | Cache cleanup interval (seconds) | 60.0 |
MYSQL_CACHE_INVALIDATION_MODE | Cache invalidation strategy | aggressive |
MYSQL_STREAMING_CHUNK_SIZE | Streaming query chunk size | 1000 |
MYSQL_PAGINATION_DEFAULT_SIZE | Default page size | 10 |
MYSQL_PAGINATION_MAX_SIZE | Maximum page size | 1000 |
Usage
Claude Desktop Configuration
Using Claude MCP CLI (Recommended)
# Install from PyPI (when published)
claude mcp add fastmcp-mysql \
-e MYSQL_HOST="127.0.0.1" \
-e MYSQL_PORT="3306" \
-e MYSQL_USER="your_username" \
-e MYSQL_PASSWORD="your_password" \
-e MYSQL_DB="your_database" \
-- uvx fastmcp-mysql
# Without specifying a database (use USE command)
claude mcp add fastmcp-mysql \
-e MYSQL_HOST="127.0.0.1" \
-e MYSQL_USER="your_username" \
-e MYSQL_PASSWORD="your_password" \
-- uvx fastmcp-mysql
# For local development
claude mcp add fastmcp-mysql \
-e MYSQL_HOST="127.0.0.1" \
-e MYSQL_PORT="3306" \
-e MYSQL_USER="your_username" \
-e MYSQL_PASSWORD="your_password" \
-e MYSQL_DB="your_database" \
-- uv run --project /path/to/fastmcp-mysql fastmcp-mysql
Manual Configuration
Add to your Claude Desktop configuration file:
{
"mcpServers": {
"mysql": {
"command": "uvx",
"args": ["fastmcp-mysql"],
"env": {
"MYSQL_HOST": "localhost",
"MYSQL_PORT": "3306",
"MYSQL_USER": "your_username",
"MYSQL_PASSWORD": "your_password",
"MYSQL_DB": "your_database",
"MYSQL_ENABLE_SECURITY": "true",
"MYSQL_RATE_LIMIT_RPM": "60",
"MYSQL_RATE_LIMIT_BURST": "10"
}
}
}
}
Available Tools
mysql_query
Execute SQL queries against the configured MySQL database.
Parameters:
query
(string, required): The SQL query to executeparams
(array, optional): Query parameters for prepared statementsdatabase
(string, optional): Target database (for multi-db mode)
Example:
# Simple query
result = await mysql_query("SELECT * FROM users WHERE active = 1")
# With parameters (SQL injection safe)
result = await mysql_query(
"SELECT * FROM users WHERE age > %s AND city = %s",
params=[18, "New York"]
)
# When no database is specified initially
result = await mysql_query("USE mydb")
result = await mysql_query("SHOW TABLES")
result = await mysql_query("SHOW DATABASES")
Security
Default Security Features
FastMCP MySQL includes comprehensive security features:
- Read-only by default: Write operations must be explicitly enabled
- SQL injection prevention:
- Advanced pattern detection for SQL injection attempts
- Parameter validation for all queries
- Detection of encoded injection attempts (URL, Unicode, Hex)
- Query filtering:
- Blacklist mode: Blocks dangerous operations (DDL, system tables, file operations)
- Whitelist mode: Only allows explicitly approved query patterns
- Customizable filtering rules
- Rate limiting:
- Per-user request throttling
- Configurable algorithms (Token Bucket, Sliding Window, Fixed Window)
- Burst protection
Security Configuration
Configure security features via environment variables:
Variable | Description | Default |
---|---|---|
MYSQL_ENABLE_SECURITY | Enable all security features | true |
MYSQL_ENABLE_INJECTION_DETECTION | Enable SQL injection detection | true |
MYSQL_ENABLE_RATE_LIMITING | Enable rate limiting | true |
MYSQL_FILTER_MODE | Filter mode (blacklist/whitelist/combined) | blacklist |
MYSQL_RATE_LIMIT_RPM | Rate limit requests per minute | 60 |
MYSQL_RATE_LIMIT_BURST | Burst size for rate limiting | 10 |
MYSQL_RATE_LIMIT_ALGORITHM | Rate limiting algorithm (token_bucket/sliding_window/fixed_window) | token_bucket |
MYSQL_MAX_QUERY_LENGTH | Maximum query length in characters | 10000 |
MYSQL_MAX_PARAMETER_LENGTH | Maximum parameter length | 1000 |
MYSQL_LOG_SECURITY_EVENTS | Log security violations | true |
MYSQL_LOG_REJECTED_QUERIES | Log rejected queries | true |
MYSQL_AUDIT_ALL_QUERIES | Audit all queries (performance impact) | false |
Enabling Write Operations
Write operations are disabled by default. Enable them with caution:
# Enable specific write operations
MYSQL_ALLOW_INSERT=true \
MYSQL_ALLOW_UPDATE=true \
MYSQL_ALLOW_DELETE=true \
uvx fastmcp-mysql
Security Best Practices
- Use Prepared Statements: Always use parameters instead of string concatenation
- Principle of Least Privilege: Only enable write operations when necessary
- Monitor Security Events: Check logs for security violations
- Rate Limiting: Adjust limits based on your application needs
- Whitelist Mode: Use whitelist mode for production environments when possible
Development
Setup Development Environment
# Clone the repository
git clone https://github.com/jinto/fastmcp-mysql
cd fastmcp-mysql
# Create virtual environment with uv
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
uv sync --all-extras
# Install pre-commit hooks
pre-commit install
Running Tests
# Run all tests
uv run pytest tests/
# Run with coverage
uv run pytest tests/ --cov=fastmcp_mysql
# Run specific test file
uv run pytest tests/unit/test_query.py
# Run integration tests only
uv run pytest tests/integration/
Code Quality
# Format code
uv run black src tests
# Lint code
uv run ruff check src tests
# Type checking
uv run mypy src
Architecture
The server follows Clean Architecture principles:
src/fastmcp_mysql/
āāā __init__.py # Package initialization
āāā __main__.py # Entry point for uvx
āāā config.py # Configuration management
āāā server.py # FastMCP server setup
āāā connection.py # Database connection management
āāā security/ # Security module (Clean Architecture)
ā āāā __init__.py
ā āāā manager.py # Security orchestration
ā āāā config.py # Security configuration
ā āāā exceptions.py # Security exceptions
ā āāā interfaces/ # Abstract interfaces
ā ā āāā injection_detector.py
ā ā āāā query_filter.py
ā ā āāā rate_limiter.py
ā āāā injection/ # SQL injection detection
ā ā āāā detector.py
ā ā āāā patterns.py
ā āāā filtering/ # Query filtering
ā ā āāā blacklist.py
ā ā āāā whitelist.py
ā ā āāā combined.py
ā āāā rate_limiting/ # Rate limiting
ā āāā token_bucket.py
ā āāā sliding_window.py
ā āāā fixed_window.py
ā āāā factory.py
āāā tools/ # MCP tools
āāā __init__.py
āāā query.py # Query execution tool
Contributing
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
Please ensure:
- All tests pass
- Code is formatted with black
- Type hints are added
- Documentation is updated
License
This project is licensed under the MIT License - see the file for details.
Acknowledgments
- Based on the MCP Server MySQL Node.js implementation
- Built with FastMCP framework
- MySQL connectivity via aiomysql
Support
- š Documentation
- š Issue Tracker
- š¬ Discussions