Skip to content

Troubleshooting

Symptom: POST /api/connections returns 201 but scanning shows errors for that app.

Causes & Fixes:

  1. Wrong command path — Ensure the binary exists and is on $PATH inside the Docker container.

    Terminal window
    docker exec wcp which npx # should return /usr/local/bin/npx
  2. Missing environment variables — Some MCP servers need API keys. Pass them in the env field:

    {
    "name": "notion",
    "command": "npx",
    "args": ["-y", "@anthropic/mcp-server-notion"],
    "env": { "NOTION_API_KEY": "ntn_..." }
    }
  3. Server crashes on startup — Run the MCP command manually to see its stderr:

    Terminal window
    npx -y @anthropic/mcp-server-notion 2>&1
  4. npm cache issues — If npx -y downloads fail inside Docker, try pulling the image fresh or clearing the npm cache:

    Terminal window
    docker exec wcp npm cache clean --force

Symptom: POST /api/capabilities/scan returns {"scanned": [], "bindings_detected": 0}.

  • No connections registered — call GET /api/connections first.
  • If connections exist but scan is empty, the MCP servers may not expose any tools. Check the server documentation.

Symptom: POST /api/sync/run/await returns {"synced": 0, "errors": 0, "conflicts": 0}.

  • No SyncLinks exist yet. You need at least two apps with matching capabilities. Check GET /api/capabilities/syncable-pairs for valid pairs, then run a sync.
  • If pairs exist but sync count is zero, the entities may already be in sync (same content_hash).

Symptom: POST /api/conflicts/{id}/resolve returns 409.

  • The conflict was already resolved or dismissed. Query it with GET /api/conflicts?status=all to check its current status.
  • Ensure the winning_app value matches one of the app names in the conflict’s sides[] array.

Symptom: Dashboard loses real-time updates or WebSocket connections drop.

  • Behind a reverse proxy (Traefik, Nginx), ensure WebSocket upgrade headers are forwarded:
    # Traefik docker label
    - "traefik.http.middlewares.wcp-headers.headers.customrequestheaders.Connection=Upgrade"
  • WCP sends ping frames every 20 seconds. If your proxy has a shorter idle timeout, increase it to ≥ 30s.
  • If using Cloudflare, enable WebSockets in the Network tab of your domain settings.

Symptom: Container exits immediately or restarts in a loop.

  1. Check logs:

    Terminal window
    docker logs wcp --tail 50
  2. Port conflict — Another service is using port 8000:

    Terminal window
    docker run -d -p 9000:8000 ... # map to a different host port
  3. Volume permissions — On some hosts the /data directory isn’t writable:

    Terminal window
    docker exec wcp ls -la /data
  4. ARM64 image on x86 — If you pulled an ARM64 image on an x86 host (or vice versa), rebuild:

    Terminal window
    docker build --platform linux/amd64 -t wcp .

Symptom: sqlite3.OperationalError: database is locked

  • Only one WCP instance should write to the same SQLite file. Don’t mount the same volume into two containers.
  • If the process crashed mid-write, the lock file may be stale. Restart the container:
    Terminal window
    docker restart wcp

Symptom: Browser console shows Access-Control-Allow-Origin errors.

  • Set the WCP_CORS_ORIGINS environment variable to your dashboard URL:
    Terminal window
    -e WCP_CORS_ORIGINS=https://dashboard.example.com
  • For local development, use * (wildcard). Never use * in production.

CodeMeaningWhat to do
404Resource not foundCheck the connection name, conflict ID, or wcp_id
409Conflict / duplicateResource already exists or conflict already resolved
422Validation errorCheck request body — missing or invalid fields
500Internal server errorCheck docker logs wcp for the traceback