Skip to main content
Glama
deslicer

MCP Server for Splunk

traefik-routing-guide.md9.15 kB
# ✅ Traefik Routing - Working Configuration ## Summary Your MCP server is now accessible through **both** Traefik (recommended) and direct access: | Method | URL | Status | Use Case | |--------|-----|--------|----------| | **Traefik** | `http://localhost:8003/mcp` | ✅ Working | Production, load balancing | | **Direct** | `http://localhost:8004/mcp` | ✅ Working | Development, debugging | ## Current Configuration ### Architecture ``` ┌────────────────────────────────────────────────────────────────┐ │ Docker Network │ │ (mcp-for-splunk_splunk-network) │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌────────────┐│ │ │ Traefik │───────▶│ MCP Server │◀─────│ Inspector ││ │ │ 172.19.0.2 │ │ 172.19.0.3 │ │172.19.0.4 ││ │ │ │ │ Port: 8003 │ │ ││ │ └──────────────┘ └──────────────┘ └────────────┘│ │ │ │ │ └─────────┼────────────────────────┼─────────────────────────────┘ │ │ │ │ Port 8003 Port 8004 (Traefik) (Direct) │ │ ▼ ▼ Your Client Your Client ``` ### Port Mapping ```yaml # Traefik ports: - "8003:8003" # External:Internal # MCP Server ports: - "8004:8003" # Direct access (Host:8004 -> Container:8003) ``` ### Traefik Configuration The Traefik routing is configured via Docker labels: ```yaml labels: # Router configuration - "traefik.http.routers.mcp-server.rule=PathPrefix(`/mcp`)" - "traefik.http.routers.mcp-server.entrypoints=mcp" # Backend service pointing to container port 8003 - "traefik.http.services.mcp-server.loadbalancer.server.port=8003" # CORS middleware - "traefik.http.middlewares.mcp-cors.headers.accesscontrolalloworiginlist=*" - "traefik.http.routers.mcp-server.middlewares=mcp-cors" ``` ## Verification ### Check Traefik Backend Status ```bash # Via Traefik API curl -s "http://localhost:8081/api/http/services/mcp-server@docker" | jq ``` **Expected output:** ```json { "loadBalancer": { "servers": [ { "url": "http://172.19.0.3:8003" } ] }, "serverStatus": { "http://172.19.0.3:8003": "UP" } } ``` ### Test MCP Endpoint (via Traefik) ```bash # The MCP endpoint requires proper headers curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ http://localhost:8003/mcp # Should return MCP protocol response (not an error) ``` ### Test Direct Health Check ```bash # Direct access (bypasses Traefik path prefix) curl http://localhost:8004/health # Via Traefik (must include /mcp prefix due to PathPrefix rule) # Note: Health endpoint doesn't require MCP headers curl http://localhost:8004/health # Direct works ``` ### Check Traefik Logs ```bash # View routing activity docker logs traefik-dev --tail 20 # Should show successful routing: # 172.19.0.1 - "POST /mcp HTTP/1.1" 200 ... "mcp-server@docker" "http://172.19.0.3:8003" ``` ## MCP Client Configuration ### Option 1: Via Traefik (Recommended for Production) ```json { "mcpServers": { "splunk": { "url": "http://localhost:8003/mcp", "transport": "streamable-http" } } } ``` **Benefits:** - ✅ Production-ready - ✅ Load balancing support - ✅ CORS handling via middleware - ✅ Easy to add multiple backends - ✅ Monitoring via Traefik dashboard ### Option 2: Direct Access (For Development) ```json { "mcpServers": { "splunk": { "url": "http://localhost:8004/mcp", "transport": "streamable-http" } } } ``` **Benefits:** - ✅ Lower latency (no proxy) - ✅ Simpler debugging - ✅ Direct server logs - ✅ Isolated testing ## MCP Inspector Configuration The Inspector is now configured to use **internal Docker network** with Traefik's backend: ```yaml # Inspector connects internally to: http://mcp-server-dev:8003/mcp # Not through Traefik, but directly to container port 8003 ``` This is optimal because: - Inspector is in the same Docker network - No need to go through Traefik for internal communication - Faster communication (no proxy overhead) - Simpler configuration ## Traefik Dashboard Access the Traefik dashboard to monitor routing: ```bash open http://localhost:8081/dashboard/ ``` **Features:** - View all routers and services - Check backend health status - Monitor request metrics - Debug routing rules ## Troubleshooting ### Issue: 502 Bad Gateway **Symptoms:** ```bash curl http://localhost:8003/mcp # Returns: Bad Gateway ``` **Check:** 1. Container is running: `docker ps | grep mcp-server` 2. Traefik can reach backend: `docker logs traefik-dev | tail` 3. Backend port matches label: Should be `8003` **Fix:** ```bash # Recreate container to update labels docker compose -f docker-compose-dev.yml up -d --force-recreate mcp-server-dev ``` ### Issue: 404 Not Found **Symptoms:** ```bash curl http://localhost:8003/health # Returns: 404 page not found ``` **Cause:** Missing `/mcp` path prefix (due to `PathPrefix` rule) **Fix:** Traefik routes only paths starting with `/mcp`: ```bash # Direct health check (bypasses Traefik) curl http://localhost:8004/health # ✅ Works # MCP endpoint via Traefik curl http://localhost:8003/mcp # ✅ Works ``` ### Issue: Connection Refused **Symptoms:** ```bash curl http://localhost:8003/mcp # Returns: Connection refused ``` **Check:** 1. Traefik is running: `docker ps | grep traefik` 2. Port 8003 is exposed: Should show `0.0.0.0:8003->8003/tcp` **Fix:** ```bash # Restart Traefik docker compose -f docker-compose-dev.yml restart traefik ``` ## Comparison: Traefik vs Direct | Feature | Via Traefik (8003) | Direct Access (8004) | |---------|-------------------|---------------------| | **Latency** | ~1-2ms overhead | Direct connection | | **Load Balancing** | ✅ Supported | ❌ Single backend | | **CORS** | ✅ Handled by middleware | ⚠️ Server config only | | **Monitoring** | ✅ Traefik dashboard | ❌ Server logs only | | **SSL/TLS** | ✅ Can terminate | ❌ Server only | | **Rate Limiting** | ✅ Easy to add | ❌ Server only | | **Multiple Backends** | ✅ Easy to add | ❌ Not supported | | **Debugging** | ⚠️ Extra hop | ✅ Direct connection | | **Production Ready** | ✅ Yes | ⚠️ Development only | ## Best Practices ### Development Use **direct access** (port 8004) for: - Local testing - Debugging connection issues - Performance testing without proxy - Isolated development ### Staging/Production Use **Traefik** (port 8003) for: - Multi-client environments - Load balancing across instances - SSL/TLS termination - Rate limiting and security - Monitoring and metrics ## Configuration Summary ### Current docker-compose-dev.yml Settings ```yaml mcp-server-dev: environment: - MCP_SERVER_PORT=8003 # Container listens on 8003 ports: - "8004:8003" # Direct access: host:8004 -> container:8003 labels: # Traefik routes /mcp to container port 8003 - "traefik.http.services.mcp-server.loadbalancer.server.port=8003" ``` ### Traefik Entrypoints ```yaml traefik: command: - --entrypoints.mcp.address=:8003 ports: - "8003:8003" # Traefik listens on 8003, routes to backend ``` ## Testing Commands ```bash # 1. Test Traefik routing curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ http://localhost:8003/mcp # 2. Test direct access curl -X POST \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ http://localhost:8004/mcp # 3. Check Traefik status curl http://localhost:8081/api/http/services/mcp-server@docker # 4. View Traefik logs docker logs traefik-dev --tail 10 # 5. View MCP server logs docker logs mcp-server-dev --tail 10 ``` ## Next Steps 1. ✅ **Traefik routing is working** - Use `http://localhost:8003/mcp` 2. ✅ **Direct access available** - Use `http://localhost:8004/mcp` for debugging 3. ✅ **Inspector configured** - Uses internal network connection 4. 📊 **Monitor via dashboard** - Visit `http://localhost:8081/dashboard/` Choose the access method based on your use case: - **Production/Staging**: Use Traefik (port 8003) - **Development/Debugging**: Use Direct (port 8004) Both routes are working and can be used simultaneously! 🚀

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/deslicer/mcp-for-splunk'

If you have feedback or need assistance with the MCP directory API, please join our Discord server