Community edition generated from private repo via sync pipeline. Includes 9 plugins (WordPress, WooCommerce, WP Advanced, Gitea, n8n, Supabase, OpenPanel, Appwrite, Directus) with ~587 tools. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
677 lines
13 KiB
Markdown
677 lines
13 KiB
Markdown
# 🔧 Troubleshooting Guide
|
|
|
|
---
|
|
|
|
## Table of Contents
|
|
|
|
1. [Common Errors](#common-errors)
|
|
2. [Connection Issues](#connection-issues)
|
|
3. [Authentication Problems](#authentication-problems)
|
|
4. [Rate Limiting Issues](#rate-limiting-issues)
|
|
5. [Docker Problems](#docker-problems)
|
|
6. [Performance Issues](#performance-issues)
|
|
7. [Tool Registration Issues](#tool-registration-issues)
|
|
8. [Logging and Debugging](#logging-and-debugging)
|
|
9. [Getting Help](#getting-help)
|
|
|
|
---
|
|
|
|
## Common Errors
|
|
|
|
### Error: "No module named 'fastmcp'"
|
|
|
|
**Cause**: Dependencies not installed or virtual environment not activated.
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Activate virtual environment
|
|
source venv/bin/activate # Linux/Mac
|
|
.\venv\Scripts\Activate.ps1 # Windows
|
|
|
|
# Install dependencies
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### Error: "KeyError: 'WORDPRESS_SITE1_URL'"
|
|
|
|
**Cause**: Environment variables not configured.
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Check if .env file exists
|
|
ls -la .env
|
|
|
|
# If not, create from template
|
|
cp .env.example .env
|
|
|
|
# Edit with your credentials
|
|
nano .env # Linux/Mac
|
|
notepad .env # Windows
|
|
```
|
|
|
|
### Error: "ModuleNotFoundError: No module named 'core'"
|
|
|
|
**Cause**: Running from wrong directory or Python path issue.
|
|
|
|
**Solution**:
|
|
```bash
|
|
# Make sure you're in project root
|
|
cd /path/to/mcphub
|
|
|
|
# Run the server directly
|
|
python server.py
|
|
|
|
# Or add to .env
|
|
echo "PYTHONPATH=." >> .env
|
|
```
|
|
|
|
---
|
|
|
|
## Connection Issues
|
|
|
|
### WordPress Site Not Accessible
|
|
|
|
**Symptoms**: `Connection timeout`, `Connection refused`, `Name or service not known`
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# Test site accessibility
|
|
curl -I https://your-wordpress-site.com
|
|
|
|
# Check DNS resolution
|
|
nslocalhost your-wordpress-site.com
|
|
|
|
# Test with timeout
|
|
timeout 5 curl https://your-wordpress-site.com
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check URL format**:
|
|
```bash
|
|
# Correct
|
|
WORDPRESS_SITE1_URL=https://example.com
|
|
|
|
# Incorrect
|
|
WORDPRESS_SITE1_URL=example.com # Missing https://
|
|
WORDPRESS_SITE1_URL=https://example.com/ # Extra trailing slash
|
|
```
|
|
|
|
2. **Verify HTTPS certificate**:
|
|
```bash
|
|
curl -v https://your-site.com 2>&1 | grep SSL
|
|
```
|
|
|
|
3. **Check firewall rules**:
|
|
- Ensure port 443 (HTTPS) is open
|
|
- Check if IP is whitelisted (if using server firewall)
|
|
|
|
4. **Test from different network**:
|
|
- Try from different IP address
|
|
- Check if WordPress site blocks data center IPs
|
|
|
|
### WordPress REST API Not Available
|
|
|
|
**Symptoms**: `404 Not Found` on `/wp-json/`
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
curl https://your-site.com/wp-json/
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check permalink settings**:
|
|
- Go to: WordPress Admin → Settings → Permalinks
|
|
- Select any option except "Plain"
|
|
- Click "Save Changes"
|
|
|
|
2. **Check .htaccess**:
|
|
```apache
|
|
# Must have these rules
|
|
RewriteEngine On
|
|
RewriteRule ^index\.php$ - [L]
|
|
RewriteCond %{REQUEST_FILENAME} !-f
|
|
RewriteCond %{REQUEST_FILENAME} !-d
|
|
RewriteRule . /index.php [L]
|
|
```
|
|
|
|
3. **Check nginx configuration** (if using nginx):
|
|
```nginx
|
|
location / {
|
|
try_files $uri $uri/ /index.php?$args;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Authentication Problems
|
|
|
|
### Error: "Invalid username or password"
|
|
|
|
**Cause**: Application Password not configured correctly.
|
|
|
|
**Solution**:
|
|
|
|
1. **Verify Application Password is enabled**:
|
|
- WordPress 5.6+ only
|
|
- Go to: Users → Your Profile
|
|
- Look for "Application Passwords" section
|
|
|
|
2. **Generate new Application Password**:
|
|
```
|
|
Name: MCP Server
|
|
Click: Add New Application Password
|
|
Copy password (format: xxxx xxxx xxxx xxxx xxxx xxxx)
|
|
```
|
|
|
|
3. **Update .env file**:
|
|
```bash
|
|
WORDPRESS_SITE1_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
|
|
```
|
|
|
|
4. **Important notes**:
|
|
- Include spaces in password
|
|
- Password is one-time display only
|
|
- Each application needs unique password
|
|
|
|
### Error: "Application Passwords not available"
|
|
|
|
**Cause**: WordPress version < 5.6 or disabled by plugin/filter.
|
|
|
|
**Solutions**:
|
|
|
|
1. **Update WordPress**:
|
|
```bash
|
|
# Via WP-CLI
|
|
wp core update
|
|
```
|
|
|
|
2. **Check if disabled by plugin/filter**:
|
|
- Some security plugins disable Application Passwords
|
|
- Check: Security Plugins → Settings → Application Passwords
|
|
|
|
3. **Enable via code** (add to `functions.php`):
|
|
```php
|
|
// Remove filter that may disable it
|
|
add_filter('wp_is_application_passwords_available', '__return_true');
|
|
```
|
|
|
|
### WooCommerce Authentication Failed
|
|
|
|
**Cause**: Invalid Consumer Key/Secret.
|
|
|
|
**Solution**:
|
|
|
|
1. **Regenerate API keys**:
|
|
- WooCommerce → Settings → Advanced → REST API
|
|
- Add Key
|
|
- Permissions: Read/Write
|
|
- Copy both Consumer Key and Consumer Secret
|
|
|
|
2. **Verify format in .env**:
|
|
```bash
|
|
WORDPRESS_SITE1_WC_CONSUMER_KEY=ck_xxxxxxxxxxxxxxxxxxxx
|
|
WORDPRESS_SITE1_WC_CONSUMER_SECRET=cs_xxxxxxxxxxxxxxxxxxxx
|
|
```
|
|
|
|
3. **Check permissions**:
|
|
- User must have `manage_woocommerce` capability
|
|
- Keys must be for admin user
|
|
|
|
---
|
|
|
|
## Rate Limiting Issues
|
|
|
|
### Error: "Rate limit exceeded"
|
|
|
|
**Symptoms**: HTTP 429, "Too many requests"
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# Check rate limit stats
|
|
python -c "
|
|
from src.core.rate_limiter import RateLimiter
|
|
limiter = RateLimiter()
|
|
print(limiter.get_stats())
|
|
"
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Adjust rate limits** in `.env`:
|
|
```bash
|
|
RATE_LIMIT_PER_MINUTE=120 # Increase from 60
|
|
RATE_LIMIT_PER_HOUR=2000 # Increase from 1000
|
|
RATE_LIMIT_PER_DAY=20000 # Increase from 10000
|
|
```
|
|
|
|
2. **Reset rate limiter**:
|
|
```bash
|
|
# Via MCP tool
|
|
reset_rate_limit()
|
|
|
|
# Or restart server
|
|
docker compose restart # If using Docker
|
|
```
|
|
|
|
3. **Distribute requests**:
|
|
- Add delays between bulk operations
|
|
- Use batching for large operations
|
|
|
|
### Rate Limit Not Working
|
|
|
|
**Symptoms**: No rate limiting being applied.
|
|
|
|
**Solution**:
|
|
|
|
Check rate limiter initialization in logs:
|
|
```bash
|
|
grep "Rate limiter" logs/audit.log
|
|
```
|
|
|
|
Ensure rate limiter is enabled:
|
|
```python
|
|
# In .env
|
|
RATE_LIMITING_ENABLED=true
|
|
```
|
|
|
|
---
|
|
|
|
## Docker Problems
|
|
|
|
### Container Won't Start
|
|
|
|
**Symptoms**: `docker compose up` fails, container exits immediately.
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# Check container logs
|
|
docker compose logs
|
|
|
|
# Check container exit code
|
|
docker compose ps -a
|
|
```
|
|
|
|
**Common Solutions**:
|
|
|
|
1. **Port already in use**:
|
|
```bash
|
|
# Check what's using port 8000
|
|
lsof -i :8000 # Linux/Mac
|
|
netstat -ano | findstr :8000 # Windows
|
|
|
|
# Change port in docker-compose.yml
|
|
ports:
|
|
- "8080:8000" # Use 8080 instead
|
|
```
|
|
|
|
2. **Invalid environment variables**:
|
|
```bash
|
|
# Validate .env file
|
|
docker compose config
|
|
```
|
|
|
|
3. **Permission issues**:
|
|
```bash
|
|
# Fix permissions
|
|
sudo chown -R 1000:1000 logs/
|
|
```
|
|
|
|
### Container Running but Not Accessible
|
|
|
|
**Symptoms**: Container status shows "Up" but health check fails.
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# Check container health
|
|
docker compose ps
|
|
|
|
# Test from inside container
|
|
docker compose exec mcp-server curl localhost:8000/health
|
|
|
|
# Check container network
|
|
docker compose exec mcp-server cat /etc/hosts
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check binding address**:
|
|
- Should bind to `0.0.0.0`, not `127.0.0.1`
|
|
- Update `server.py` if needed
|
|
|
|
2. **Check firewall**:
|
|
```bash
|
|
# Allow Docker network
|
|
sudo ufw allow from 172.0.0.0/8
|
|
```
|
|
|
|
### High Memory Usage
|
|
|
|
**Symptoms**: Container using excessive RAM.
|
|
|
|
**Solutions**:
|
|
|
|
1. **Set memory limits** in `docker-compose.yml`:
|
|
```yaml
|
|
services:
|
|
mcp-server:
|
|
deploy:
|
|
resources:
|
|
limits:
|
|
memory: 512M
|
|
```
|
|
|
|
2. **Optimize logging**:
|
|
```bash
|
|
# Reduce log level
|
|
LOG_LEVEL=WARNING
|
|
```
|
|
|
|
3. **Clear cache**:
|
|
```bash
|
|
docker system prune -a
|
|
```
|
|
|
|
---
|
|
|
|
## Performance Issues
|
|
|
|
### Slow Response Times
|
|
|
|
**Symptoms**: Tools taking > 5 seconds to respond.
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# Check health metrics
|
|
python -c "
|
|
from core.health import HealthMonitor
|
|
monitor = HealthMonitor()
|
|
print(monitor.get_all_health())
|
|
"
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check WordPress site performance**:
|
|
```bash
|
|
# Test direct WordPress API
|
|
time curl https://your-site.com/wp-json/wp/v2/posts
|
|
```
|
|
|
|
2. **Enable caching** on WordPress:
|
|
- Install caching plugin (WP Super Cache, W3 Total Cache)
|
|
- Enable object caching (Redis/Memcached)
|
|
|
|
3. **Optimize database**:
|
|
```bash
|
|
# Use WP-CLI tool
|
|
wordpress_wp_db_optimize(site="site1")
|
|
```
|
|
|
|
4. **Reduce payload size**:
|
|
```python
|
|
# Request fewer items
|
|
wordpress_list_posts(site="site1", per_page=10) # Instead of 100
|
|
```
|
|
|
|
### High CPU Usage
|
|
|
|
**Symptoms**: Server using 100% CPU.
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check for infinite loops** in logs:
|
|
```bash
|
|
tail -f logs/audit.log | grep ERROR
|
|
```
|
|
|
|
2. **Limit concurrent requests**:
|
|
```bash
|
|
# In .env
|
|
MAX_CONCURRENT_REQUESTS=5
|
|
```
|
|
|
|
3. **Optimize queries**:
|
|
- Use pagination
|
|
- Filter results
|
|
- Cache responses
|
|
|
|
---
|
|
|
|
## Tool Registration Issues
|
|
|
|
### Error: "Tool not found"
|
|
|
|
**Symptoms**: MCP reports tool doesn't exist.
|
|
|
|
**Diagnosis**:
|
|
```bash
|
|
# List all registered tools
|
|
python -c "
|
|
from server import mcp
|
|
tools = app.list_tools()
|
|
for tool in tools:
|
|
print(tool['name'])
|
|
"
|
|
```
|
|
|
|
**Solutions**:
|
|
|
|
1. **Check site configuration**:
|
|
```bash
|
|
# Ensure site is configured in .env
|
|
grep "WORDPRESS_SITE1" .env
|
|
```
|
|
|
|
2. **Verify plugin loaded**:
|
|
```bash
|
|
# Check logs for plugin initialization
|
|
grep "plugin loaded" logs/audit.log
|
|
```
|
|
|
|
3. **Restart server**:
|
|
```bash
|
|
# Tools are registered at startup
|
|
docker compose restart
|
|
```
|
|
|
|
### Duplicate Tools
|
|
|
|
**Symptoms**: Same tool name registered multiple times.
|
|
|
|
**Cause**: Multiple plugins or sites with same alias.
|
|
|
|
**Solution**:
|
|
|
|
1. **Check for duplicate aliases**:
|
|
```bash
|
|
grep "ALIAS" .env | sort
|
|
```
|
|
|
|
2. **Ensure unique aliases**:
|
|
```bash
|
|
WORDPRESS_SITE1_ALIAS=mainsite
|
|
WORDPRESS_SITE2_ALIAS=shop # Not mainsite
|
|
```
|
|
|
|
---
|
|
|
|
## Logging and Debugging
|
|
|
|
### Enable Debug Logging
|
|
|
|
```bash
|
|
# In .env
|
|
LOG_LEVEL=DEBUG
|
|
|
|
# Restart server
|
|
docker compose restart
|
|
```
|
|
|
|
### View Real-time Logs
|
|
|
|
```bash
|
|
# Audit logs
|
|
tail -f logs/audit.log
|
|
|
|
# Application logs
|
|
docker compose logs -f
|
|
|
|
# Filter for errors
|
|
grep ERROR logs/audit.log
|
|
|
|
# Filter for specific site
|
|
grep "site1" logs/audit.log
|
|
```
|
|
|
|
### Common Log Patterns
|
|
|
|
**Successful request**:
|
|
```json
|
|
{
|
|
"timestamp": "2025-11-11T10:30:00Z",
|
|
"event_type": "tool_execution",
|
|
"level": "INFO",
|
|
"event": "wordpress_list_posts",
|
|
"details": {
|
|
"site": "site1",
|
|
"status": "success"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Failed request**:
|
|
```json
|
|
{
|
|
"timestamp": "2025-11-11T10:30:00Z",
|
|
"event_type": "tool_execution",
|
|
"level": "ERROR",
|
|
"event": "wordpress_list_posts",
|
|
"details": {
|
|
"site": "site1",
|
|
"error": "Connection timeout",
|
|
"status": "failed"
|
|
}
|
|
}
|
|
```
|
|
|
|
### Debugging Tips
|
|
|
|
1. **Test with curl**:
|
|
```bash
|
|
# Test WordPress directly
|
|
curl -u "admin:xxxx xxxx xxxx xxxx xxxx xxxx" \
|
|
https://your-site.com/wp-json/wp/v2/posts
|
|
```
|
|
|
|
2. **Check environment loading**:
|
|
```python
|
|
python -c "
|
|
from dotenv import load_dotenv
|
|
import os
|
|
load_dotenv()
|
|
print(os.getenv('WORDPRESS_SITE1_URL'))
|
|
"
|
|
```
|
|
|
|
3. **Test individual components**:
|
|
```bash
|
|
# Test WordPress plugin
|
|
pytest tests/test_wordpress_plugin.py -v
|
|
|
|
# Test rate limiter
|
|
pytest tests/test_rate_limiter.py -v
|
|
```
|
|
|
|
---
|
|
|
|
## Getting Help
|
|
|
|
### Before Asking for Help
|
|
|
|
1. **Check logs**:
|
|
```bash
|
|
tail -50 logs/audit.log
|
|
```
|
|
|
|
2. **Run health check**:
|
|
```bash
|
|
python -c "
|
|
from core.health import HealthMonitor
|
|
monitor = HealthMonitor()
|
|
print(monitor.check_all_projects())
|
|
"
|
|
```
|
|
|
|
3. **Verify configuration**:
|
|
```bash
|
|
# Mask sensitive data
|
|
grep -v "PASSWORD\|KEY\|SECRET" .env
|
|
```
|
|
|
|
4. **Test connectivity**:
|
|
```bash
|
|
curl -I https://your-wordpress-site.com
|
|
```
|
|
|
|
### What to Include in Bug Reports
|
|
|
|
1. **Environment information**:
|
|
- Python version: `python --version`
|
|
- Docker version: `docker --version`
|
|
- OS: `uname -a` (Linux/Mac) or `systeminfo` (Windows)
|
|
|
|
2. **Error messages**:
|
|
- Full error output
|
|
- Stack trace if available
|
|
- Relevant log entries
|
|
|
|
3. **Configuration** (mask sensitive data):
|
|
- Relevant .env variables
|
|
- docker-compose.yml modifications
|
|
- WordPress/WooCommerce versions
|
|
|
|
4. **Steps to reproduce**:
|
|
- Exact commands run
|
|
- Expected vs actual behavior
|
|
- Frequency (always, sometimes, once)
|
|
|
|
### Contact Information
|
|
|
|
**Email**: hello@mcphub.dev
|
|
|
|
**Subject format**: `[BUG] Brief description`
|
|
|
|
**Example**:
|
|
```
|
|
Subject: [BUG] wordpress_list_posts returns 403 error
|
|
|
|
Environment:
|
|
- Python 3.11.5
|
|
- Docker 24.0.6
|
|
- WordPress 6.4
|
|
- Ubuntu 22.04
|
|
|
|
Issue:
|
|
wordpress_list_posts(site="site1") returns 403 Forbidden
|
|
|
|
Steps to reproduce:
|
|
1. Configure WORDPRESS_SITE1_* in .env
|
|
2. Run python server.py
|
|
3. Call wordpress_list_posts(site="site1", per_page=10)
|
|
4. Receive 403 error
|
|
|
|
Logs:
|
|
[Include relevant log entries]
|
|
|
|
Configuration:
|
|
WORDPRESS_SITE1_URL=https://example.com
|
|
WORDPRESS_SITE1_USERNAME=admin
|
|
[Application password masked]
|
|
```
|
|
|
|
---
|
|
|
|
---
|