Description
I've deployed a custom MCP server (mcp-server-qdrant) behind Traefik, exposing the SSE endpoint at https://mcp-qdrant.cityzen.co.za/sse. The endpoint works fine when tested directly via curl:
curl -N -H "Accept: text/event-stream" https://mcp-qdrant.cityzen.co.za/sse
data: /messages/?session_id=...
However, when I add this server to my Windsurf configuration:
"mcp": {
"servers": {
"qdrant": {
"transport": "sse",
"serverUrl": "https://mcp-qdrant.cityzen.co.za/sse"
}
}
}
}
Windsurf fails to detect or list the server in the MCP UI. There are no errors logged, but the server doesn't appear in the interface even after refreshing or rescanning.
✅ Troubleshooting steps attempted:
-
Confirmed the SSE endpoint is publicly reachable and returns correct event: and data: messages.
-
Validated JSON config (no syntax errors).
-
Checked container logs — server starts correctly and streams data.
-
Tried bypassing Traefik and exposing the port directly — same issue.
-
Also tested locally on the same physical machine as the Windsurf client, using localhost to eliminate network or DNS concerns still not picked up.
Here is the relevant Docker Compose setup for reference:
🧱 Docker Compose (Portainer Stack)
Click to expand Docker Compose YAML
services:
qdrant:
image: qdrant/qdrant:gpu-nvidia-latest
container_name: qdrant
restart: always
ports:
- "6333:6333"
- "6334:6334"
volumes:
- /home/homelab/conf/qdrant/data:/qdrant/storage
environment:
- QDRANT__GPU__INDEXING=true
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
labels:
traefik.enable: "true"
traefik.docker.network: "homelab"
traefik.http.routers.mcp.tls: "true"
traefik.http.routers.mcp.entrypoints: "https"
traefik.http.routers.mcp.rule: "Host(`qdrant.cityzen.co.za`)"
traefik.http.services.mcp.loadbalancer.server.port: "6333"
networks:
- homelab
mcp-qdrant:
image: mcp-server-qdrant:latest
container_name: mcp-qdrant
command: sh -c "uvx mcp-server-qdrant --transport sse"
networks:
- homelab
depends_on:
- qdrant
environment:
- QDRANT_URL=http://qdrant:6333
- COLLECTION_NAME=code-snippets
- EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2
- EMBEDDING_PROVIDER=fastembed
- TOOL_STORE_DESCRIPTION=Store reusable code snippets for later retrieval...
- TOOL_FIND_DESCRIPTION=Search for relevant code snippets based on natural language...
- LOG_LEVEL=debug
- QDRANT_VERIFY_SSL=False
labels:
traefik.enable: "true"
traefik.docker.network: "homelab"
traefik.http.routers.mcp-qdrant.rule: Host(`mcp-qdrant.cityzen.co.za`) && PathPrefix(`/sse`)
traefik.http.routers.mcp-qdrant.entrypoints: "https"
traefik.http.routers.mcp-qdrant.tls: "true"
traefik.http.services.mcp-qdrant.loadbalancer.server.port: "8000"
networks:
homelab:
external: true
🧩 Is there a specific discovery format or required SSE metadata that Windsurf expects beyond the event: endpoint convention?
Thanks for your help — happy to dig deeper or test beta fixes if needed!