# Multi-Endpoint Architecture Guide > Solving the Tool Visibility Problem --- ## The Problem ### Before (Single Endpoint) ``` Client connects to /mcp ↓ Sees ALL 188 tools ↓ API key for site4 can see: - ✅ WordPress tools (but for all sites!) - ❌ Gitea tools (shouldn't see) - ❌ System tools (shouldn't see) - ❌ API key management (security risk!) ``` ### Issue - Users saw tools they couldn't use - Wasted AI context on irrelevant tools - Security concern: tool enumeration - Confusing UX --- ## The Solution ### After (Multi-Endpoint) ``` Client connects to /mcp/wordpress ↓ Sees ONLY 92 WordPress tools ↓ Clean, focused, secure ``` --- ## Endpoint Overview | Endpoint | Tools | Requires | Use Case | |----------|-------|----------|----------| | `/mcp` | 188 | Master Key | Admin operations | | `/mcp/wordpress` | 92 | API Key | WordPress management | | `/mcp/wordpress-advanced` | 22 | Admin Key | DB/Bulk/System ops | | `/mcp/gitea` | 55 | API Key | Git management | | `/mcp/project/{id}` | Varies | Project Key | Single project | --- ## Migration Guide ### For Existing Users **Before (v1.x)** ```json { "mcpServers": { "coolify": { "url": "https://mcp.example.com/mcp", "headers": { "Authorization": "Bearer cmp_xxx" } } } } ``` **After (v2.0)** ```json { "mcpServers": { "wordpress": { "url": "https://mcp.example.com/mcp/wordpress", "headers": { "Authorization": "Bearer cmp_xxx" } }, "gitea": { "url": "https://mcp.example.com/mcp/gitea", "headers": { "Authorization": "Bearer cmp_yyy" } } } } ``` ### Benefits After Migration - Faster tool discovery - Less AI context used - Better security - Clearer access control --- ## API Key Configuration ### Creating WordPress-Only Key ```bash # Using admin endpoint with Master Key curl -X POST https://mcp.example.com/mcp \ -H "Authorization: Bearer sk-master-key" \ -H "Content-Type: application/json" \ -d '{ "tool": "manage_api_keys_create", "arguments": { "project_id": "wordpress_site1", "scope": "write", "name": "Site1 Editor" } }' ``` ### Key Scopes | Scope | Permissions | |-------|-------------| | `read` | Read-only operations | | `write` | Read + create/update | | `admin` | Full access + system tools | --- ## Endpoint Details ### `/mcp` - Admin Endpoint **Access**: Master API Key (`sk-*`) only **Tools**: All 188 tools including: - WordPress Core (92) - WordPress Advanced (22) - Gitea (55) - System tools (19) - API key management - OAuth management **Use Cases**: - Initial setup - Creating API keys - System monitoring - OAuth client management --- ### `/mcp/wordpress` - WordPress Endpoint **Access**: Any valid API key **Tools**: 92 WordPress tools - Posts & Pages - Media - Taxonomy - Comments - Users - WooCommerce - SEO **Blacklisted Tools**: - `manage_api_keys_*` - `oauth_*` - System tools **Use Cases**: - Content management - WooCommerce operations - SEO management --- ### `/mcp/wordpress-advanced` - Advanced WordPress Endpoint **Access**: Admin scope required **Tools**: 22 advanced tools - Database operations - Bulk operations - System operations **Use Cases**: - Database backup/restore - Bulk content updates - System maintenance --- ### `/mcp/gitea` - Gitea Endpoint **Access**: Any valid API key (with gitea project) **Tools**: 55 Gitea tools - Repository management - Issue tracking - Pull requests - Webhooks **Use Cases**: - Git operations - Issue management - PR reviews --- ### `/mcp/project/{id}` - Project Endpoint **Access**: API key matching project_id **Tools**: Plugin tools filtered to single project **Example**: `/mcp/project/wordpress_site1` - Only WordPress tools - Site parameter auto-set to `site1` **Use Cases**: - Single-site management - Restricted access per client --- ## Security Considerations ### Tool Blacklisting System and admin tools are blacklisted from non-admin endpoints: ```python tool_blacklist = { "manage_api_keys_create", "manage_api_keys_delete", "manage_api_keys_rotate", "oauth_register_client", "oauth_revoke_client", } ``` ### API Key Validation Each endpoint validates: 1. Token format and validity 2. Scope requirements 3. Plugin type matching 4. Tool-level access ### Audit Logging All tool calls are logged with: - Endpoint path - Tool name - API key ID - Timestamp - Success/failure --- ## Running the Server ### Development ```bash # Install dependencies pip install -r requirements.txt # Run multi-endpoint server python server_multi.py --port 8000 ``` ### Production (Docker) ```bash # Build docker-compose build # Run docker-compose up -d ``` ### Environment Variables ```bash # Required MASTER_API_KEY=sk-your-secure-key # WordPress WORDPRESS_SITE1_URL=https://example.com WORDPRESS_SITE1_USERNAME=admin WORDPRESS_SITE1_PASSWORD=app_password # Gitea GITEA_SITE1_URL=https://gitea.example.com GITEA_SITE1_TOKEN=your-token ``` --- ## Testing Endpoints ### Check Available Endpoints ```bash curl http://localhost:8000/endpoints ``` ### Check Health ```bash curl http://localhost:8000/health ``` ### Test WordPress Endpoint ```bash curl -X POST http://localhost:8000/mcp/wordpress \ -H "Authorization: Bearer cmp_xxx" \ -H "Content-Type: application/json" \ -d '{"tool": "wordpress_list_posts", "arguments": {"site": "site1"}}' ``` --- ## Troubleshooting ### "Endpoint requires master API key" - Use `/mcp` endpoint with Master Key for admin operations - Or use appropriate plugin endpoint with project API key ### "API key cannot access this endpoint" - API key project_id must match endpoint plugin type - Example: `wordpress_site1` key works on `/mcp/wordpress`, not `/mcp/gitea` ### "Access denied to tool" - Tool may be blacklisted for this endpoint - Check if admin scope is required --- ## Future Improvements - [ ] Per-project endpoints (`/mcp/project/{id}`) - [ ] Dynamic endpoint creation - [ ] Custom tool whitelists - [ ] Endpoint-level rate limiting - [ ] Endpoint usage analytics --- **Last Updated**: 2025-11-24