Skip to main content

Connection Issues

Oracle Connection Errors

Cause: The Oracle server is unreachable or a firewall is blocking the connection.Solutions:
  1. Verify the Oracle server is running:
    # Check if Oracle listener is active
    lsnrctl status
    
  2. Test network connectivity:
    # Test from Docker container
    docker run --rm -it alpine nc -zv host.docker.internal 1521
    
  3. Check firewall rules:
    # Allow Oracle port
    sudo ufw allow 1521/tcp
    
  4. On macOS with Docker, use host.docker.internal instead of localhost:
    {
      "args": ["mochoa/mcp-oracle", "host.docker.internal:1521/freepdb1"]
    }
    
Cause: The Oracle listener is not running or not configured correctly.Solutions:
  1. Start the Oracle listener:
    lsnrctl start
    
  2. Verify listener configuration in listener.ora:
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
        )
      )
    
  3. Check if the correct port is being used:
    lsnrctl status | grep PORT
    
Cause: Incorrect credentials or user doesn’t exist.Solutions:
  1. Verify credentials are correct
  2. Check if user exists:
    SELECT username FROM dba_users WHERE username = 'MCP_READONLY';
    
  3. Ensure password is set correctly:
    ALTER USER mcp_readonly IDENTIFIED BY new_password;
    
  4. Check environment variables:
    docker run -i --rm \
      -e ORACLE_USER=correct_user \
      -e ORACLE_PASSWORD=correct_password \
      mochoa/mcp-oracle
    

MySQL Connection Errors

Cause: MySQL server is not running or not accessible.Solutions:
  1. Verify MySQL is running:
    sudo systemctl status mysql
    # or
    sudo service mysql status
    
  2. Check MySQL is listening on the correct port:
    sudo netstat -tlnp | grep 3306
    
  3. Ensure MySQL is bound to the correct interface in my.cnf:
    [mysqld]
    bind-address = 0.0.0.0
    
  4. Use host.docker.internal on macOS/Windows:
    docker run -i --rm \
      -e MYSQL_USER=root \
      -e MYSQL_PASSWORD=pass \
      mochoa/mcp-mysql \
      host.docker.internal:3306/mydb
    
Cause: Invalid credentials or insufficient host permissions.Solutions:
  1. Verify credentials:
    mysql -u mcp_readonly -p -h localhost
    
  2. Check user host permissions:
    SELECT user, host FROM mysql.user WHERE user = 'mcp_readonly';
    
  3. Grant access from Docker network:
    CREATE USER 'mcp_readonly'@'%' IDENTIFIED BY 'password';
    GRANT SELECT ON mydb.* TO 'mcp_readonly'@'%';
    FLUSH PRIVILEGES;
    
  4. Verify environment variables are set correctly:
    {
      "env": {
        "MYSQL_USER": "mcp_readonly",
        "MYSQL_PASSWORD": "correct_password"
      }
    }
    
Cause: The specified database doesn’t exist.Solutions:
  1. List available databases:
    SHOW DATABASES;
    
  2. Create the database:
    CREATE DATABASE mydb;
    
  3. Verify connection string:
    # Correct format
    host.docker.internal:3306/existing_db
    

MikroTik Connection Errors

Cause: MikroTik API service is disabled or router is unreachable.Solutions:
  1. Enable API service on MikroTik:
    /ip service enable api
    /ip service set api address=0.0.0.0/0
    
  2. For SSL connections, enable API-SSL:
    /ip service enable api-ssl
    
  3. Test connectivity:
    nc -zv 192.168.88.1 8728
    # For SSL
    nc -zv 192.168.88.1 8729
    
  4. Check firewall rules on MikroTik:
    /ip firewall filter print where dst-port=8728
    
Cause: Invalid credentials or user doesn’t have API access.Solutions:
  1. Verify user exists:
    /user print
    
  2. Ensure user has correct group:
    /user set [find name=mcp_user] group=read
    
  3. Test credentials manually:
    # Use MikroTik API test tool or Winbox
    
  4. Check environment variables:
    docker run -i --rm \
      -e MK_USER=correct_user \
      -e MK_PASSWORD=correct_password \
      mochoa/mcp-mikrotik 192.168.88.1
    

Permission Errors

Oracle Permission Issues

Cause: User doesn’t have SELECT permission on the table.Solutions:
  1. Grant SELECT permission:
    GRANT SELECT ON schema.table_name TO mcp_readonly;
    
  2. Grant SELECT on entire schema:
    BEGIN
      FOR t IN (SELECT table_name FROM dba_tables WHERE owner = 'SCHEMA_NAME') LOOP
        EXECUTE IMMEDIATE 'GRANT SELECT ON SCHEMA_NAME.' || t.table_name || ' TO mcp_readonly';
      END LOOP;
    END;
    /
    
Cause: User lacks SELECT_CATALOG_ROLE for explain plans.Solution:
GRANT SELECT_CATALOG_ROLE TO mcp_readonly;
Cause: User lacks privileges for AWR package.Solution:
GRANT SELECT_CATALOG_ROLE TO mcp_readonly;
GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY TO mcp_readonly;

MySQL Permission Issues

Cause: User doesn’t have SELECT privilege.Solutions:
  1. Grant SELECT on specific tables:
    GRANT SELECT ON mydb.users TO 'mcp_readonly'@'%';
    
  2. Grant SELECT on entire database:
    GRANT SELECT ON mydb.* TO 'mcp_readonly'@'%';
    FLUSH PRIVILEGES;
    
Cause: User lacks access to performance_schema (needed for AWR).Solution:
GRANT SELECT ON performance_schema.* TO 'mcp_readonly'@'%';
FLUSH PRIVILEGES;

Docker Issues

Cause: Docker is not installed or not in PATH.Solutions:
  1. Install Docker Desktop (macOS/Windows) or Docker Engine (Linux)
  2. Verify installation:
    docker --version
    
  3. Ensure Docker daemon is running:
    sudo systemctl start docker
    
Cause: Docker daemon is not running or user lacks permissions.Solutions:
  1. Start Docker daemon:
    sudo systemctl start docker
    
  2. Add user to docker group:
    sudo usermod -aG docker $USER
    # Log out and back in
    
  3. Test Docker access:
    docker ps
    
Cause: Network issues or image doesn’t exist.Solutions:
  1. Pull image manually:
    docker pull mochoa/mcp-mysql
    
  2. Check Docker Hub for image availability
  3. Build image locally if needed:
    docker build -t mochoa/mcp-mysql -f src/mysql/Dockerfile .
    

Client Configuration Issues

Claude Desktop

Cause: Configuration syntax error or file location issue.Solutions:
  1. Verify JSON syntax:
    # Use a JSON validator
    cat ~/Library/Application\ Support/Claude/claude_desktop_config.json | jq .
    
  2. Check file location:
    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
    • Windows: %APPDATA%\Claude\claude_desktop_config.json
  3. Restart Claude Desktop after configuration changes
  4. Check Claude logs for errors:
    • macOS: ~/Library/Logs/Claude/
Cause: Incorrect syntax in configuration.Solution:
{
  "mcpServers": {
    "mysql": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MYSQL_USER=myuser",
        "-e", "MYSQL_PASSWORD=mypass",
        "mochoa/mcp-mysql"
      ]
    }
  }
}
Note: Use -e flag for each environment variable.

VS Code

Cause: Incorrect input configuration.Solutions:
  1. Verify input syntax:
    {
      "mcp": {
        "inputs": [
          {
            "type": "promptString",
            "id": "mysql_user",
            "description": "MySQL username"
          }
        ]
      }
    }
    
  2. Reload VS Code window: Ctrl+Shift+P → “Developer: Reload Window”
Cause: Configuration not in correct location.Solutions:
  1. Place in User Settings (JSON) or .vscode/mcp.json
  2. Remove mcp key when using .vscode/mcp.json:
    {
      "servers": {
        "mysql": { ... }
      }
    }
    

Debugging Tips

Enable Verbose Logging

1

Docker Container Logs

View real-time logs from MCP server containers:
docker logs -f <container-id>
2

Database Query Logs

MySQL:
SET GLOBAL general_log = 'ON';
SET GLOBAL log_output = 'TABLE';
SELECT * FROM mysql.general_log ORDER BY event_time DESC LIMIT 20;
Oracle:
ALTER SESSION SET SQL_TRACE = TRUE;
3

Network Traffic Analysis

Use tcpdump to inspect network traffic:
# MySQL
sudo tcpdump -i any -A 'port 3306'

# Oracle
sudo tcpdump -i any -A 'port 1521'

# MikroTik
sudo tcpdump -i any -A 'port 8728 or port 8729'

Testing Connection Manually

sqlplus mcp_readonly/[email protected]:1521/freepdb1
mysql -h host.docker.internal -P 3306 -u mcp_readonly -p mydb
Use a MikroTik API testing tool or Python script:
import routeros_api

connection = routeros_api.RouterOsApiPool(
    '192.168.88.1',
    username='admin',
    password='password',
    plaintext_login=True
)
api = connection.get_api()
list_resource = api.get_resource('/interface')
print(list_resource.get())

Common Error Messages

ErrorLikely CauseQuick Fix
ECONNREFUSEDService not runningStart database/router service
ETIMEDOUTFirewall blockingCheck firewall rules
Authentication failedWrong credentialsVerify username/password
Permission deniedInsufficient privilegesGrant required permissions
Unknown databaseDatabase doesn’t existCreate database or fix name
Table doesn't existNo SELECT grantGrant SELECT permission

Performance Issues

Causes:
  • Missing indexes
  • Large result sets
  • Network latency
Solutions:
  1. Use EXPLAIN to analyze queries:
    mysql-explain SELECT * FROM large_table WHERE column = 'value'
    
  2. Add indexes:
    CREATE INDEX idx_column ON large_table(column);
    
  3. Limit result sets:
    SELECT * FROM large_table LIMIT 100;
    
Cause: Large performance schema data or slow database.Solutions:
  1. Increase query timeout (if supported)
  2. Optimize Performance Schema configuration:
    -- Reduce history retention
    UPDATE performance_schema.setup_consumers 
    SET ENABLED = 'NO' 
    WHERE NAME LIKE '%history%';
    

Getting Help

If you encounter issues not covered in this guide:
  1. Check the GitHub repository for similar issues
  2. Review server-specific documentation:
  3. Check MCP protocol documentation at modelcontextprotocol.io
  4. Open a GitHub issue with:
    • Error messages
    • Configuration (redact credentials)
    • Steps to reproduce
    • Environment details (OS, Docker version, etc.)

Build docs developers (and LLMs) love