# π§ 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]
```
---
---