- i18n: add 115 missing EN translation keys (parity with FA) - csrf: test /dashboard-legacy/keys (SPA owns /dashboard/*) - oauth: add tier scopes to test fixture allowed_scopes - DOCKER_README: v3.13.0 — remove Appwrite/Directus, clarify 8 plugins - getting-started: remove Appwrite/Directus, add Coolify endpoint row - Overview.tsx: fix Lang type for AdminStatsPanel Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
18 KiB
Getting Started with MCP Hub
Table of Contents
- Prerequisites
- Installation
- Configuration
- Running the Server
- Connect Your AI Client
- Using MCP Tools
- Docker Deployment
- Coolify Deployment
- Next Steps
Prerequisites
Required
- Python 3.11+: Download Python
- Git: Download Git
Optional (for Docker deployment)
- Docker: Download Docker Desktop
- Docker Compose: Included with Docker Desktop
WordPress Requirements
For each WordPress site you want to manage:
- WordPress 5.0+
- Application Passwords enabled (WordPress 5.6+)
- WooCommerce 3.0+ (if using WooCommerce tools)
- Rank Math or Yoast SEO (if using SEO tools)
- HTTPS enabled (recommended)
Installation
Option 0: Use Hosted Version (No Setup Required)
The fastest way to try MCP Hub — no installation needed:
- Visit mcp.example.com
- Log in with GitHub or Google
- Add your sites via the dashboard (My Sites → Add Service)
- Go to Connect page to generate your AI client config
- Copy-paste into Claude Desktop, VS Code, or Claude Code
Your personal MCP endpoint:
https://mcp.example.com/u/{your-user-id}/{alias}/mcp
WordPress users: Install the Airano MCP SEO Bridge plugin for SEO tools, and create an Application Password (Users → Profile) for authentication.
If you prefer self-hosting, continue with the options below.
Option 1: Docker (Recommended)
git clone https://github.com/airano-ir/mcphub.git
cd mcphub
cp env.example .env
# Edit .env — set MASTER_API_KEY and add your site credentials (see Configuration below)
docker compose up -d
After starting, see Verify Installation below.
Option 2: Docker Hub (No Clone)
# 1. Create a .env file (see Configuration section below)
# 2. Run:
docker run -d --name mcphub -p 8000:8000 --env-file .env airano/mcphub:latest
Option 3: From Source
git clone https://github.com/airano-ir/mcphub.git
cd mcphub
pip install -e .
cp env.example .env
# Edit .env with your site credentials
python server.py --transport streamable-http --port 8000
Option 4: Automated Setup Scripts
Linux/Mac
git clone https://github.com/airano-ir/mcphub.git
cd mcphub
chmod +x scripts/setup.sh
./scripts/setup.sh
Windows (PowerShell)
git clone https://github.com/airano-ir/mcphub.git
cd mcphub
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
.\scripts\setup.ps1
Configuration
Step 1: Generate WordPress Application Passwords
For each WordPress site:
- Log in to WordPress admin
- Navigate to: Users > Your Profile
- Scroll to Application Passwords section
- Enter name:
MCP Hub - Click Add New Application Password
- Copy the generated password (format:
xxxx xxxx xxxx xxxx xxxx xxxx)
Important: Save this password immediately. You cannot retrieve it later.
Step 2: Generate WooCommerce API Keys
If using WooCommerce tools:
- Go to: WooCommerce > Settings > Advanced > REST API
- Click Add Key
- Fill in:
- Description:
MCP Hub - User: Select admin user
- Permissions:
Read/Write
- Description:
- Click Generate API Key
- Copy Consumer Key and Consumer Secret
Step 3: Configure Environment Variables
Edit the .env file with your credentials:
# ============================================
# Authentication (recommended — auto-generates temp key if omitted)
# ============================================
MASTER_API_KEY=your-secure-key-here
# ============================================
# WordPress Site
# ============================================
WORDPRESS_SITE1_URL=https://myblog.com
WORDPRESS_SITE1_USERNAME=admin
WORDPRESS_SITE1_APP_PASSWORD=xxxx xxxx xxxx xxxx xxxx xxxx
WORDPRESS_SITE1_ALIAS=myblog
# ============================================
# WooCommerce Store (separate plugin)
# ============================================
WOOCOMMERCE_STORE1_URL=https://mystore.com
WOOCOMMERCE_STORE1_CONSUMER_KEY=ck_xxxxx
WOOCOMMERCE_STORE1_CONSUMER_SECRET=cs_xxxxx
WOOCOMMERCE_STORE1_ALIAS=mystore
# ============================================
# Gitea Instance (optional)
# ============================================
GITEA_REPO1_URL=https://git.example.com
GITEA_REPO1_TOKEN=your_gitea_token
GITEA_REPO1_ALIAS=mygitea
# ============================================
# OAuth (required for Claude/ChatGPT auto-registration)
# ============================================
OAUTH_JWT_SECRET_KEY=your-jwt-secret
OAUTH_BASE_URL=https://your-server:8000
# ============================================
# Social Login (GitHub/Google OAuth — for hosted/multi-user)
# ============================================
GITHUB_CLIENT_ID=your-github-oauth-app-id
GITHUB_CLIENT_SECRET=your-github-oauth-app-secret
GOOGLE_CLIENT_ID=your-google-oauth-client-id
GOOGLE_CLIENT_SECRET=your-google-oauth-client-secret
PUBLIC_URL=https://your-server:8000
# ============================================
# Encryption (required for storing user site credentials)
# ============================================
# Generate: python -c "import os, base64; print(base64.b64encode(os.urandom(32)).decode())"
ENCRYPTION_KEY=your-base64-encoded-32-byte-key
# ============================================
# Optional
# ============================================
LOG_LEVEL=INFO
RATE_LIMIT_PER_MINUTE=60
RATE_LIMIT_PER_HOUR=1000
RATE_LIMIT_PER_DAY=10000
WordPress Plugin Requirements
Some tools require specific WordPress plugins or infrastructure:
| Tools | Requirement |
|---|---|
wordpress_get_post_seo, wordpress_update_post_seo, wordpress_get_product_seo, wordpress_update_product_seo |
Yoast SEO or RankMath |
wordpress_wp_cache_*, wordpress_wp_db_*, wordpress_wp_plugin_*, wordpress_wp_theme_*, wordpress_wp_core_*, wordpress_wp_search_replace_dry_run (15 tools) |
Docker socket + CONTAINER env var |
wordpress_specialist_* (51 tools — plugins, themes, users, options, cron, maintenance, page editing, site config + layout, db inspection, bulk fan-out) |
Airano MCP Bridge v2.18.0+ companion plugin (no Docker socket) |
woocommerce_* |
WooCommerce plugin (separate WOOCOMMERCE_ config) |
Docker Socket for WP-CLI
A subset of legacy wordpress_* tools (15 WP-CLI helpers under
wordpress_wp_*) require Docker socket access:
services:
mcphub:
image: airano/mcphub:latest
ports:
- "8000:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
WORDPRESS_SITE1_URL: https://your-site.com
WORDPRESS_SITE1_USERNAME: admin
WORDPRESS_SITE1_APP_PASSWORD: xxxx xxxx xxxx xxxx
WORDPRESS_SITE1_CONTAINER: wordpress-container-name
WORDPRESS_SITE1_ALIAS: mysite
wordpress_specialist_* tools do not need Docker — they're served
through the Airano MCP Bridge companion plugin via REST. Install
wordpress-plugin/airano-mcp-bridge.zip on the WordPress site and use
an Application Password for a manage_options user.
Without Docker socket:
- WP-CLI helpers (
wordpress_wp_*) return "not available" errors - All REST API tools (bulk operations, content management,
wordpress_specialist_*) work normally
Site Configuration
Sites are managed via the web dashboard. After starting the server, open the dashboard to add sites.
Each plugin requires specific credentials (see below for reference).
WordPress
WORDPRESS_SITE1_URL=https://your-site.com # Required
WORDPRESS_SITE1_USERNAME=admin # Required
WORDPRESS_SITE1_APP_PASSWORD=xxxx xxxx xxxx xxxx # Required (WordPress Application Password)
WORDPRESS_SITE1_ALIAS=my-site # Recommended
WORDPRESS_SITE1_CONTAINER=wp-container # Optional (for WP-CLI)
WooCommerce
WOOCOMMERCE_SITE1_URL=https://your-site.com # Required
WOOCOMMERCE_SITE1_CONSUMER_KEY=ck_xxx # Required
WOOCOMMERCE_SITE1_CONSUMER_SECRET=cs_xxx # Required
WOOCOMMERCE_SITE1_ALIAS=my-shop # Recommended
WordPress Advanced
WORDPRESS_ADVANCED_SITE1_URL=https://your-site.com # Required
WORDPRESS_ADVANCED_SITE1_USERNAME=admin # Required
WORDPRESS_ADVANCED_SITE1_APP_PASSWORD=xxxx xxxx xxxx xxxx # Required
WORDPRESS_ADVANCED_SITE1_CONTAINER=wp-container # Required (for WP-CLI tools)
WORDPRESS_ADVANCED_SITE1_ALIAS=my-site-admin # Recommended
Gitea
GITEA_SITE1_URL=https://gitea.example.com # Required
GITEA_SITE1_TOKEN=your-access-token # Required
GITEA_SITE1_ALIAS=my-gitea # Recommended
n8n
N8N_SITE1_URL=https://n8n.example.com # Required
N8N_SITE1_API_KEY=your-api-key # Required
N8N_SITE1_ALIAS=my-n8n # Recommended
Supabase
SUPABASE_SITE1_URL=https://your-project.supabase.co # Required
SUPABASE_SITE1_API_KEY=your-service-role-key # Required
SUPABASE_SITE1_ALIAS=my-supabase # Recommended
OpenPanel
OPENPANEL_SITE1_URL=https://openpanel.example.com # Required
OPENPANEL_SITE1_CLIENT_ID=your-client-id # Required
OPENPANEL_SITE1_CLIENT_SECRET=your-client-secret # Required
OPENPANEL_SITE1_ALIAS=my-analytics # Recommended
Note: Use
APP_PASSWORD(WordPress Application Password), notPASSWORD.
Configuration Tips
- Site Aliases: Use friendly names like
myblog,mystore, ormygitea - Separate plugins: WordPress and WooCommerce are separate plugins with separate env var prefixes
- Testing: Start with one site, verify it works, then add more
- Security: Never commit
.envfile to git
Running the Server
Streamable HTTP Transport (for remote AI clients)
python server.py --transport streamable-http --port 8000
Stdio Transport (for Claude Desktop local)
python server.py
Verify Installation
After starting (via Docker or locally), wait ~30 seconds for the server to initialize, then:
1. Check health:
curl http://localhost:8000/health
# Expected: {"status": "ok", "tools_loaded": 565, ...}
2. Open the web dashboard:
Open http://localhost:8000/dashboard in your browser. Log in with your MASTER_API_KEY or via GitHub/Google OAuth (if configured).
The dashboard lets you:
- View all connected sites and their health status
- Add, edit, delete, and test sites via the My Sites page (OAuth users)
- Create and manage per-project API keys
- Generate AI client configs on the Connect page (with correct transport type per client)
- View audit logs and monitor rate limits
- Per-user MCP endpoints: OAuth users get personal endpoints at
/u/{user_id}/{alias}/mcpwithmhu_API keys
3. Check container status (Docker only):
docker compose ps
# Look for Status: "Up (healthy)"
# Note: Health check starts after 40 seconds — "starting" is normal initially
# View logs if something is wrong:
docker compose logs -f mcphub
4. Troubleshooting:
| Problem | Solution |
|---|---|
| Container exits immediately | Check logs: docker compose logs mcphub |
| Port 8000 already in use | Change port in docker-compose.yaml: "8001:8000" |
| Health check shows "unhealthy" | Wait 60 seconds, then check logs for startup errors |
| Dashboard login fails | Make sure you're using the MASTER_API_KEY value from your .env |
| Sites not showing up | Add sites via the web dashboard, then check the connect page |
Connect Your AI Client
All requests require Bearer token authentication via the Authorization header:
Authorization: Bearer YOUR_API_KEY
X-API-Keyheader and query parameter auth are not supported.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"mcphub-wordpress": {
"type": "streamableHttp",
"url": "http://your-server:8000/wordpress/mcp",
"headers": {
"Authorization": "Bearer YOUR_MASTER_API_KEY"
}
}
}
}
Claude Code
Add to .mcp.json in your project:
{
"mcpServers": {
"mcphub-wordpress": {
"type": "http",
"url": "http://your-server:8000/wordpress/mcp",
"headers": {
"Authorization": "Bearer YOUR_MASTER_API_KEY"
}
}
}
}
Cursor
Go to Settings > MCP Servers > Add Server:
- Name: MCP Hub WordPress
- URL:
http://your-server:8000/wordpress/mcp - Headers:
Authorization: Bearer YOUR_MASTER_API_KEY
VS Code + Copilot
Add to .vscode/mcp.json:
{
"servers": {
"mcphub-wordpress": {
"type": "http",
"url": "http://your-server:8000/wordpress/mcp",
"headers": {
"Authorization": "Bearer YOUR_MASTER_API_KEY"
}
}
}
}
ChatGPT (Remote MCP)
MCP Hub supports Open Dynamic Client Registration (RFC 7591). ChatGPT can auto-register as an OAuth client:
- Deploy MCP Hub with
OAUTH_BASE_URLset - In ChatGPT, add MCP server:
https://your-server:8000/mcp - ChatGPT auto-discovers OAuth metadata and registers
Important
: Use
"type": "streamableHttp"for Claude Desktop and"type": "http"for VS Code/Claude Code. Using"type": "sse"will cause400 Bad Requesterrors.
Using MCP Tools
565 Tools Across 9 Plugins
| Plugin | Tools | Env Prefix |
|---|---|---|
| WordPress | 67 | WORDPRESS_ |
| WooCommerce | 28 | WOOCOMMERCE_ |
| WordPress Advanced | 22 | WORDPRESS_ADVANCED_ |
| Gitea | 56 | GITEA_ |
| n8n | 56 | N8N_ |
| Supabase | 70 | SUPABASE_ |
| OpenPanel | 42 | OPENPANEL_ |
| Appwrite | 100 | APPWRITE_ |
| Directus | 100 | DIRECTUS_ |
| System | 24 | (no config needed) |
Unified Tool Pattern
All tools use a site parameter to select which site to operate on:
wordpress_list_posts(site="myblog", per_page=10, status="publish")
wordpress_create_post(site="myblog", title="Hello", content="World")
woocommerce_list_products(site="mystore")
gitea_list_repos(site="mygitea")
The site parameter accepts either a site_id (e.g., site1) or an alias (e.g., myblog).
Multi-Endpoint Architecture
Use the most specific endpoint for your use case to minimize token usage:
| Endpoint | Use Case | Tools | site param? |
|---|---|---|---|
/project/{alias}/mcp |
Single-site workflow | 22-100 | No (pre-scoped) |
/{plugin}/mcp |
Multi-site management | 23-101 | Yes |
/system/mcp |
System administration | 24 | N/A |
/mcp |
Admin & discovery only | 565 | Yes |
Recommendation: Always use the most specific endpoint. Using
/mcp(565 tools) wastes context tokens and degrades AI response quality.
Available plugin endpoints:
| Endpoint | Plugin | Tools |
|---|---|---|
/wordpress/mcp |
WordPress | 67 |
/woocommerce/mcp |
WooCommerce | 28 |
/wordpress-specialist/mcp |
WordPress Specialist | 51 |
/gitea/mcp |
Gitea | 56 |
/n8n/mcp |
n8n | 56 |
/supabase/mcp |
Supabase | 70 |
/openpanel/mcp |
OpenPanel | 42 |
/coolify/mcp |
Coolify | ~65 |
/system/mcp |
System Management | 24 |
Plugin endpoint vs Project endpoint:
| Feature | Plugin (/wordpress/mcp) |
Project (/project/{alias}/mcp) |
|---|---|---|
list_sites tool |
Yes | No |
site parameter needed |
Yes | No (pre-scoped) |
| Tool count | N + 1 (includes list_sites) |
N |
| Multi-site support | Yes | No (single site) |
Docker Deployment
Quick Start
docker compose up -d
After starting, verify the installation:
curl http://localhost:8000/health # server health
open http://localhost:8000/dashboard # web dashboard
See Verify Installation for detailed steps.
Docker Commands
# View logs
docker compose logs -f mcphub
# Check status (look for "healthy")
docker compose ps
# Restart (needed after .env changes)
docker compose restart
# Stop
docker compose down
# Rebuild (after code changes)
docker compose up --build -d
Adding Sites After Startup
- Edit your
.envfile to add new site credentials - Restart the container:
docker compose restart - Verify:
curl http://localhost:8000/health— check that tools are loaded - The dashboard at http://localhost:8000/dashboard will show the new sites
Coolify Deployment
Step 1: Create New Resource
- Log in to Coolify dashboard
- Click + New Resource
- Select Docker Compose
Step 2: Configure Repository
- Git Repository:
https://github.com/airano-ir/mcphub.git - Branch:
main - Build Pack:
Docker Compose
Step 3: Configure Environment Variables
Add the required environment variables in Coolify's environment variable UI:
MASTER_API_KEY=your-secure-key-here
OAUTH_JWT_SECRET_KEY=your-jwt-secret
OAUTH_BASE_URL=https://your-domain.com
ENCRYPTION_KEY=your-base64-encryption-key
After deployment, add sites via the web dashboard at https://your-domain.com/dashboard.
Step 4: Configure Health Check
- Path:
/health - Port:
8000 - Interval:
30s - Timeout:
10s - Retries:
3
Step 5: Deploy
- Click Deploy
- Wait for build to complete
- Check logs for successful startup
Next Steps
- Explore the full tool list: See the README for all 565 tools
- Set up API keys: API Keys Guide for per-project access control
- Configure OAuth: OAuth Guide for Claude/ChatGPT auto-registration
- Monitor health: Use
check_all_projects_healthtool or visit the web dashboard - Troubleshoot issues: Troubleshooting Guide