A secure and feature-rich MySQL Model Context Protocol (MCP) server that enables AI agents and applications to interact with MySQL databases through a standardized interface.
- SQL Injection Prevention: Comprehensive input validation and sanitization
- Identifier Validation: Strict validation of table and column names
- Query Whitelisting: Read-only operations by default, write operations require explicit permission
- Connection Pooling: Secure connection management with timeout controls
- Error Handling: Secure error messages that don't expose sensitive information
- List: Browse tables and view table structures
- Read: Query data with filtering, pagination, and sorting
- Create: Insert new records with validation
- Add Column: Add new columns to existing tables with full type and constraint support
- Drop Column: Remove columns from tables with safety checks
- Modify Column: Change column definitions (type, constraints, defaults)
- Rename Column: Rename existing columns while preserving data
- Rename Table: Rename tables with safety validation
- Add Index: Create indexes (BTREE, HASH, FULLTEXT, SPATIAL) with unique constraints
- Drop Index: Remove indexes from tables
- Bulk Insert: Efficiently insert multiple records in a single operation
- Update: Modify existing records safely
- Delete: Remove records with mandatory WHERE clauses
- Execute: Run custom SQL queries with security restrictions
- DDL: Execute Data Definition Language statements
- Transaction: Execute multiple operations atomically
- Utility: Database health checks and metadata operations
- Connection String: Standard MySQL connection format
- Tool Selection: Enable only the tools you need
- Connection Pooling: Configurable pool settings
- Timeout Controls: Connection and query timeouts
For most use cases, we recommend enabling all tools by using "all" as the tool parameter. This provides:
- Full Functionality: Access to all database operations including DDL, transactions, and advanced features
- AI Agent Compatibility: Ensures AI agents can see and use all available tools
- Future-Proof: Automatically includes new tools as they're added
- Simplified Configuration: No need to manually list specific tools
# Recommended: Enable all tools
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb" "all"Use manual tool selection only when you need to restrict access for security or compliance reasons:
Perfect for reporting, analytics, or read-only AI agents:
npx katcoder-mysql-mcp "mysql://readonly:password@localhost:3306/mydb" "list,read,utility"Available tools: list, read, utility
- list: Browse tables and schema
- read: Query data with filtering and pagination
- utility: Database health checks and metadata
For applications that need to modify data but not schema:
npx katcoder-mysql-mcp "mysql://writer:password@localhost:3306/mydb" "list,read,create,update,delete,utility"Available tools: list, read, create, update, delete, utility
- Includes all read-only tools plus:
- create: Insert new records
- update: Modify existing records
- delete: Remove records (with mandatory WHERE clauses)
For database administrators and development environments:
npx katcoder-mysql-mcp "mysql://admin:password@localhost:3306/mydb" "all"All available tools: list, read, create, update, delete, execute, ddl, transaction, bulk_insert, utility, add_column, drop_column, modify_column, rename_column, rename_table, add_index, drop_index, show_table_data
Always use MySQL user accounts with appropriate privileges:
-- Read-only user
CREATE USER 'readonly'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
-- Write user (no DDL)
CREATE USER 'writer'@'%' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'writer'@'%';
-- Admin user (full access)
CREATE USER 'admin'@'%' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'%';
FLUSH PRIVILEGES;- Tool-level restrictions limit what operations the MCP server can perform
- Database-level permissions provide the ultimate security boundary
- Best practice: Use both layers for defense in depth
- Use specific database users with minimal required privileges
- Enable only necessary tools for production environments
- Use read-only connections for reporting and analytics
- Monitor database access and audit tool usage
- Use environment variables for connection strings (never hardcode passwords)
| Use Case | Recommended Tools | Security Level |
|---|---|---|
| AI Development | "all" |
Medium (use dev database) |
| Production AI | "all" |
High (restricted DB user) |
| Reporting/Analytics | "list,read,utility" |
High |
| Data Entry Apps | "list,read,create,update,delete,utility" |
Medium |
| Database Admin | "all" |
Low (trusted environment) |
| CI/CD Pipelines | "all" |
Medium (isolated environment) |
Note: This package is currently in development and not yet published to npm. Use the development installation method below.
git clone https://github.com/katkoder/katcoder-mysql-mcp.git
cd katcoder-mysql-mcp
npm install
npm run buildOnce published to npm, you will be able to install globally:
# This will be available after publication
npm install -g katcoder-mysql-mcp# This will be available after publication
npm install katcoder-mysql-mcp# After building the project (npm run build)
# Basic usage with all tools enabled
node dist/cli.js "mysql://user:password@localhost:3306/database_name"
# With all tools enabled (recommended)
node dist/cli.js "mysql://user:password@localhost:3306/database_name" "all"
# With specific tools enabled (if you need to limit access)
node dist/cli.js "mysql://user:password@localhost:3306/database_name" "list,read,utility"
# With verbose logging
node dist/cli.js "mysql://user:password@localhost:3306/database_name" "all" --verbose# Basic usage with all tools enabled
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/database_name"
# With all tools enabled (recommended)
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/database_name" "all"
# With specific tools enabled (if you need to limit access)
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/database_name" "list,read,utility"
# With verbose logging
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/database_name" "all" --verboseClaude Desktop Configuration: Add this configuration to your Claude Desktop configuration file:
{
"mcpServers": {
"katkoder_mysql": {
"command": "node",
"args": [
"/path/to/katcoder-mysql-mcp/dist/cli.js",
"mysql://root:password@localhost:3306/production_db",
"all"
],
"cwd": "/path/to/katcoder-mysql-mcp"
}
}
}Cursor IDE Configuration: For Cursor IDE, add to your settings:
{
"mcp.servers": {
"katkoder_mysql": {
"command": "node",
"args": [
"/path/to/katcoder-mysql-mcp/dist/cli.js",
"mysql://user:password@localhost:3306/development_db",
"all"
],
"cwd": "/path/to/katcoder-mysql-mcp"
}
}
}Claude Desktop Configuration:
{
"mcpServers": {
"katkoder_mysql": {
"command": "npx",
"args": [
"-y",
"katcoder-mysql-mcp",
"mysql://root:password@localhost:3306/production_db",
"all"
]
}
}
}Cursor IDE Configuration:
{
"mcp.servers": {
"katkoder_mysql": {
"command": "npx",
"args": [
"-y",
"katcoder-mysql-mcp",
"mysql://user:password@localhost:3306/development_db",
"all"
]
}
}
}mysql://[user[:password]@]host[:port]/database
mysql://root@localhost:3306/mydb- Local database without passwordmysql://user:password@localhost:3306/mydb- Local database with passwordmysql://user:password@192.168.1.100:3306/mydb- Remote database
mysql://user:password@db.example.com:3306/production?ssl=true- Remote database with SSLmysql://root:password@mysql-container:3306/docker_db- Docker databasemysql://user:password@localhost:3307/alternative_port- Different port
Browse database structure and table information.
Parameters:
table(optional): Specific table name to get column information
Examples:
{
"name": "list",
"arguments": {}
}
{
"name": "list",
"arguments": {
"table": "users"
}
}Practical Usage Scenarios:
- Database Discovery: When connecting to a new database, use the list tool without parameters to see all available tables
- Schema Exploration: Use with a table name to understand the structure before writing queries
- Data Modeling: Examine relationships between tables by checking foreign key constraints
- Migration Planning: Understand existing schema before making changes
Query data from tables with filtering and pagination.
Parameters:
table(required): Table name to querycolumns(optional): Array of specific columns to selectwhere(optional): Object with filter conditionslimit(optional): Maximum number of rows (max: 10,000)offset(optional): Number of rows to skiporderBy(optional): Order by clause
Basic Examples:
{
"name": "read",
"arguments": {
"table": "users",
"columns": ["id", "name", "email"],
"where": {"status": "active"},
"limit": 10,
"orderBy": "created_at DESC"
}
}
{
"name": "read",
"arguments": {
"table": "products",
"where": {"category": "electronics", "price": {"$gt": 100}},
"limit": 50
}
}Advanced Filtering Examples:
{
"name": "read",
"arguments": {
"table": "users",
"columns": ["id", "email", "created_at"],
"where": {"status": "active", "created_at": {"$gte": "2024-01-01"}},
"limit": 25,
"offset": 50,
"orderBy": "last_login DESC"
}
}Efficiently insert multiple records into a table in a single operation.
Parameters:
table(required): Target table namedata(required): Array of objects with identical column-value pairs
Examples:
{
"name": "bulk_insert",
"arguments": {
"table": "users",
"data": [
{
"name": "John Doe",
"email": "john@example.com",
"age": 30,
"status": "active"
},
{
"name": "Jane Smith",
"email": "jane@example.com",
"age": 25,
"status": "active"
},
{
"name": "Bob Wilson",
"email": "bob@example.com",
"age": 35,
"status": "inactive"
}
]
}
}Usage in Transactions:
{
"name": "transaction",
"arguments": {
"operations": [
{
"type": "bulk_insert",
"table": "users",
"data": [
{
"name": "Alice Brown",
"email": "alice@example.com",
"age": 28,
"status": "active"
}
]
},
{
"type": "update",
"table": "user_stats",
"data": { "total_users": 1 },
"where": { "id": 1 }
}
]
}
}Response Format:
{
"success": true,
"table": "users",
"recordCount": 3,
"affectedRows": 3,
"insertedId": 1,
"message": "Successfully inserted 3 records into users"
}Insert new records into tables.
Parameters:
table(required): Target table namedata(required): Object with column-value pairs
Examples:
{
"name": "create",
"arguments": {
"table": "users",
"data": {
"name": "John Doe",
"email": "john@example.com",
"status": "active"
}
}
}Modify existing records safely.
Parameters:
table(required): Target table namedata(required): Object with column-value pairs to updatewhere(required): Object with filter conditions
Examples:
{
"name": "update",
"arguments": {
"table": "users",
"data": {
"status": "inactive",
"updated_at": "2024-01-01 12:00:00"
},
"where": {"id": 123}
}
}Remove records with mandatory WHERE clauses.
Parameters:
table(required): Target table namewhere(required): Object with filter conditions
Examples:
{
"name": "delete",
"arguments": {
"table": "sessions",
"where": {"expired": true}
}
}Run custom SQL queries with security restrictions.
Parameters:
query(required): SQL query stringparams(optional): Array of query parametersallowWrite(optional): Boolean to allow write operations
Basic Examples:
{
"name": "execute",
"arguments": {
"query": "SELECT COUNT(*) as total FROM users WHERE created_at > ?",
"params": ["2024-01-01"]
}
}
{
"name": "execute",
"arguments": {
"query": "UPDATE users SET last_login = NOW() WHERE id = ?",
"params": [123],
"allowWrite": true
}
}Complex Query Examples:
{
"name": "execute",
"arguments": {
"query": "SELECT u.email, COUNT(o.id) as order_count FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id HAVING order_count > 5"
}
}
{
"name": "execute",
"arguments": {
"query": "SELECT DATE(created_at) as date, COUNT(*) as daily_signups FROM users WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY DATE(created_at) ORDER BY date",
"params": []
}
}Execute Data Definition Language statements.
Parameters:
statement(required): DDL statement
Examples:
{
"name": "ddl",
"arguments": {
"statement": "CREATE INDEX idx_email ON users(email)"
}
}Add new columns to existing tables with comprehensive type and constraint support.
Parameters:
table(required): Target table namecolumn(required): Object with column definitionname(required): New column nametype(required): Column data type (e.g., VARCHAR(255), INT, DATETIME)nullable(optional): Whether column can contain NULL valuesdefault(optional): Default value for the columnautoIncrement(optional): Whether column should auto-incrementcomment(optional): Column comment
position(optional): Object specifying column positionafter(optional): Place column after this existing columnfirst(optional): Place column as the first column
Examples:
{
"name": "add_column",
"arguments": {
"table": "users",
"column": {
"name": "email",
"type": "VARCHAR(255)",
"nullable": false,
"default": "no-email@example.com"
},
"position": {
"after": "name"
}
}
}{
"name": "add_column",
"arguments": {
"table": "products",
"column": {
"name": "is_active",
"type": "BOOLEAN",
"default": true,
"comment": "Product availability status"
}
}
}Remove columns from tables with safety validation.
Parameters:
table(required): Table name to remove column fromcolumn(required): Column name to drop
Examples:
{
"name": "drop_column",
"arguments": {
"table": "users",
"column": "old_field"
}
}Change existing column definitions including type, constraints, and defaults.
Parameters:
table(required): Table name containing the columncolumn(required): Column name to modifynewDefinition(required): Object with new column definitiontype(required): New column data typenullable(optional): Whether column can contain NULL valuesdefault(optional): New default valuecomment(optional): Column comment
Examples:
{
"name": "modify_column",
"arguments": {
"table": "users",
"column": "age",
"newDefinition": {
"type": "INT",
"nullable": true,
"default": null
}
}
}Rename existing columns while preserving data.
Parameters:
table(required): Table name containing the columnoldName(required): Current column namenewName(required): New column namenewDefinition(optional): Column definition for the renamed column
Examples:
{
"name": "rename_column",
"arguments": {
"table": "users",
"oldName": "user_name",
"newName": "username"
}
}Rename tables with safety validation.
Parameters:
oldName(required): Current table namenewName(required): New table name
Examples:
{
"name": "rename_table",
"arguments": {
"oldName": "user_profiles",
"newName": "user_settings"
}
}Create indexes on tables for improved query performance.
Parameters:
table(required): Table name to add index toname(required): Index namecolumns(required): Array of column names to include in the indextype(optional): Index type (BTREE, HASH, FULLTEXT, SPATIAL)unique(optional): Whether the index should be unique
Examples:
{
"name": "add_index",
"arguments": {
"table": "users",
"name": "idx_email",
"columns": ["email"],
"unique": true
}
}{
"name": "add_index",
"arguments": {
"table": "products",
"name": "idx_category_price",
"columns": ["category_id", "price"],
"type": "BTREE"
}
}Remove indexes from tables.
Parameters:
table(required): Table name containing the indexname(required): Index name to drop
Examples:
{
"name": "drop_index",
"arguments": {
"table": "users",
"name": "idx_temp"
}
}Execute multiple operations atomically.
Parameters:
operations(required): Array of operations to execute in transaction
Basic Examples:
{
"name": "transaction",
"arguments": [
{
"type": "create",
"table": "orders",
"data": {"user_id": 123, "total": 99.99}
},
{
"type": "update",
"table": "users",
"data": {"last_order_date": "2024-01-01"},
"where": {"id": 123}
}
]
}Advanced Transaction Examples with Schema Changes:
{
"name": "transaction",
"arguments": {
"operations": [
{
"type": "add_column",
"table": "users",
"column": {
"name": "phone",
"type": "VARCHAR(20)",
"nullable": true
}
},
{
"type": "add_index",
"table": "users",
"name": "idx_phone",
"columns": ["phone"],
"unique": true
},
{
"type": "update",
"table": "users",
"data": {"phone": "+1234567890"},
"where": {"id": 1}
}
]
}
}Response Format:
{
"success": true,
"operations": 3,
"results": [
{
"description": "Add column 'phone' to table 'users'",
### v1.1.0 (Latest)
- **New Feature**: Added Comprehensive Schema Modification Tools
- Implemented `add_column` tool for adding new columns with full type and constraint support
- Implemented `drop_column` tool for safely removing columns from tables
- Implemented `modify_column` tool for changing column definitions
- Implemented `rename_column` tool for renaming existing columns
- Implemented `rename_table` tool for renaming tables
- Implemented `add_index` tool for creating various types of indexes
- Implemented `drop_index` tool for removing indexes from tables
- Added comprehensive schema validation and security measures
- Enhanced transaction support for schema operations with rollback mechanisms
- Added detailed documentation with examples and usage scenarios
### v1.0.1
- **New Feature**: Added Bulk Insert Tool for efficient multi-record insertion
- Implemented `bulk_insert` tool for batch data imports
- Supports inserting multiple records in a single database operation
- Includes comprehensive validation and error handling
- Can be used within transactions for atomic operations
- Added detailed documentation with examples and usage scenarios
### v1.0.0
- Initial release
- All database operations implemented
- Comprehensive security features
- Full documentation
"affectedRows": 0
},
{
"description": "Create unique index 'idx_phone' on table 'users'",
"affectedRows": 0
},
{
"description": "Update user record with phone number",
"affectedRows": 1
}
]
}{ "name": "ddl", "arguments": { "statement": "ALTER TABLE users ADD COLUMN phone VARCHAR(20)" } }
### 8. Transaction Tool
Execute multiple operations atomically.
**Parameters:**
- `operations` (required): Array of operations to execute
**Basic Examples:**
```json
{
"name": "transaction",
"arguments": {
"operations": [
{
"type": "create",
"table": "orders",
"data": {"user_id": 123, "total": 99.99}
},
{
"type": "update",
"table": "users",
"data": {"last_order_date": "2024-01-01"},
"where": {"id": 123}
}
]
}
}
Advanced Transaction Examples:
{
"name": "transaction",
"arguments": {
"operations": [
{
"type": "create",
"table": "orders",
"data": {"user_id": 123, "total": 99.99, "status": "pending"}
},
{
"type": "update",
"table": "users",
"data": {"last_order_date": "2024-01-01"},
"where": {"id": 123}
},
{
"type": "create",
"table": "order_items",
"data": {"order_id": "LAST_INSERT_ID()", "product_id": 456, "quantity": 2}
}
]
}
}Database health checks and metadata operations.
Parameters:
action(required): Utility action (ping, version, stats, describe_table)table(optional): Table name (required for describe_table)
Examples:
{
"name": "utility",
"arguments": {
"action": "ping"
}
}
{
"name": "utility",
"arguments": {
"action": "stats"
}
}
{
"name": "utility",
"arguments": {
"action": "describe_table",
"table": "users"
}
}Display table data with advanced formatting, pagination, and schema information.
Parameters:
table(required): Table name to display data fromlimit(optional): Maximum number of rows to display (default: 50, max: 1000)offset(optional): Number of rows to skip for pagination (default: 0)columns(optional): Array of specific columns to display (default: all columns)where(optional): Object with filter conditions (same format as read tool)orderBy(optional): Column name to sort by (defaults to primary key or first column)orderDirection(optional): Sort direction - 'ASC' or 'DESC' (default: 'ASC')showSchema(optional): Include table schema information (default: true)format(optional): Output format - 'table', 'json', or 'csv' (default: 'table')
Basic Examples:
{
"name": "show_table_data",
"arguments": {
"table": "users"
}
}
{
"name": "show_table_data",
"arguments": {
"table": "products",
"limit": 25,
"columns": ["id", "name", "price", "category"],
"orderBy": "price",
"orderDirection": "DESC"
}
}Advanced Examples:
{
"name": "show_table_data",
"arguments": {
"table": "orders",
"where": {"status": "pending", "created_at": {"$gte": "2024-01-01"}},
"limit": 100,
"offset": 50,
"format": "csv",
"showSchema": false
}
}
{
"name": "show_table_data",
"arguments": {
"table": "users",
"columns": ["id", "email", "last_login"],
"where": {"status": "active"},
"orderBy": "last_login",
"orderDirection": "DESC",
"format": "json"
}
}Response Format:
{
"success": true,
"table": "users",
"format": "table",
"pagination": {
"currentPage": 1,
"totalPages": 5,
"limit": 50,
"offset": 0,
"totalRows": 247,
"hasMore": true,
"showing": "1-50 of 247"
},
"data": [...],
"displayInfo": "formatted table string (for table format)",
"count": 50,
"schema": {
"columns": [...],
"totalColumns": 8
}
}Practical Usage Scenarios:
- Data Exploration: Quickly browse table contents with automatic formatting
- Data Export: Export table data in CSV format for external analysis
- Debugging: View specific rows with filtering and pagination
- Schema Analysis: Examine table structure alongside data
- Report Generation: Generate formatted data displays for documentation
- Input Sanitization: All table and column names are sanitized
- Parameter Binding: All queries use parameterized statements
- Query Validation: Dangerous SQL patterns are blocked
- Write Operation Protection: Write operations require explicit permission
- Table Names: Only alphanumeric characters and underscores allowed
- Column Names: Validated against SQL injection patterns
- Where Conditions: Values are checked for dangerous content
- Connection Pooling: Secure connection management
- Timeout Controls: Prevents hanging connections
- Error Handling: Secure error messages without sensitive data
Best practice for production and AI agents:
-- Create user with appropriate database-level permissions
CREATE USER 'mcp_ai_agent'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON myapp.* TO 'mcp_ai_agent'@'localhost';
FLUSH PRIVILEGES;# Enable all tools - database permissions provide the security boundary
npx katcoder-mysql-mcp "mysql://mcp_ai_agent:secure_password@localhost:3306/myapp" "all"Why this approach works:
- ✅ AI agents can see and use all available tools
- ✅ Database user permissions control actual access
- ✅ Future-proof as new tools are automatically available
- ✅ Simplified configuration management
CREATE USER 'mcp_readonly'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT ON myapp.* TO 'mcp_readonly'@'localhost';
FLUSH PRIVILEGES;# Restrict tools to read-only operations
npx katcoder-mysql-mcp "mysql://mcp_readonly:secure_password@localhost:3306/myapp" "list,read,utility"CREATE USER 'mcp_writer'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'mcp_writer'@'localhost';
FLUSH PRIVILEGES;# Allow data operations but restrict DDL tools
npx katcoder-mysql-mcp "mysql://mcp_writer:secure_password@localhost:3306/myapp" "list,read,create,update,delete,bulk_insert,utility"# Development: Use all tools with admin user
npx katcoder-mysql-mcp "mysql://root:password@localhost:3306/dev_db" "all"# Set connection string as environment variable
export MYSQL_URL="mysql://mcp_ai_agent:secure_password@localhost:3306/myapp"
# Use with all tools enabled
npx katcoder-mysql-mcp "$MYSQL_URL" "all"
# Or with specific tools for restricted access
npx katcoder-mysql-mcp "$MYSQL_URL" "list,read,utility"# Using Docker secrets or environment variables
export MYSQL_URL="mysql://mcp_user:${DB_PASSWORD}@mysql-container:3306/production_db"
npx katcoder-mysql-mcp "$MYSQL_URL" "all"| Use Case | Recommended Tools | Database Permissions | Security Level |
|---|---|---|---|
| AI Development & Prototyping | "all" |
Full admin access | Low (dev only) |
| Production AI Agent | "all" |
Limited to specific database/schema | High ⭐ |
| Read-only Analytics | "list,read,utility" |
SELECT only | High |
| Data Entry App | "list,read,create,update,delete,bulk_insert,utility" |
No DDL permissions | Medium |
| Schema Migration Tool | "all" |
DDL permissions required | Medium |
| Reporting Dashboard | "list,read,utility" |
SELECT only | High |
# 1. Create restricted database user
CREATE USER 'mcp_agent'@'localhost' IDENTIFIED BY 'secure_password';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, DROP ON your_app.* TO 'mcp_agent'@'localhost';
# 2. Use all tools - security handled by database permissions
npx katcoder-mysql-mcp "mysql://mcp_agent:secure_password@localhost:3306/your_app" "all"Why this works: Database permissions provide the real security boundary, while "all" tools ensure AI agents can see and use all available functionality.
The server provides detailed error messages while maintaining security:
{
"error": true,
"message": "Table 'nonexistent_table' does not exist",
"details": "Check the table name and try again"
}npm run buildnpm run devnpm testLOG_LEVEL: Set logging level (debug, info, warn, error)NODE_ENV: Set environment (development, production)
- Verify MySQL server is running
- Check connection string format
- Ensure database exists
- Verify user permissions
# Test with all tools enabled
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb" "all"
# Then use: {"name": "utility", "arguments": {"action": "ping"}}npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb" "all"
# Then use: {"name": "utility", "arguments": {"action": "version"}}- Check MySQL user privileges
- Ensure database access is granted
- Verify table-level permissions
- Monitor connection pool usage
- Check query execution times
- Optimize database indexes
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb" "all"
# Then use: {"name": "utility", "arguments": {"action": "stats"}}# Environment variables for connection tuning
export MYSQL_CONNECTION_LIMIT=20
export MYSQL_ACQUIRE_TIMEOUT=30000
export MYSQL_TIMEOUT=45000
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb"# Enable debug logging
export LOG_LEVEL=debug
# Enable verbose output
npx katcoder-mysql-mcp "mysql://user:password@localhost:3306/mydb" "all" --verbose- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
MIT License - see LICENSE file for details.
For issues and questions:
- GitHub Issues: https://github.com/katkoder/katcoder-mysql-mcp/issues
- Documentation: https://github.com/katkoder/katcoder-mysql-mcp/wiki
- New Feature: Added Bulk Insert Tool for efficient multi-record insertion
- Implemented
bulk_inserttool for batch data imports - Supports inserting multiple records in a single database operation
- Includes comprehensive validation and error handling
- Can be used within transactions for atomic operations
- Added detailed documentation with examples and usage scenarios
- Implemented
- Initial release
- All database operations implemented
- Comprehensive security features
- Full documentation