Skip to content

MCP troubleshooting

Check the public service, discovery, OAuth, account surface, and tool authorization in that order.

1. Verify the correct hostname and path

text
REST API:          https://api.example.com
MCP origin:        https://mcp.example.com
Member endpoint:   https://mcp.example.com/mcp

Common mistakes:

  • using api. instead of mcp.;
  • using /docs or /api-docs instead of an MCP endpoint;
  • authorizing while the wrong member account is active in the browser;
  • putting a token or API key in the URL;
  • connecting through another customer's hostname.

2. Check public health and readiness

bash
curl --fail --show-error "https://mcp.example.com/health"
curl --fail --show-error "https://mcp.example.com/ready"

/health proves the process responds. /ready should be used for dependencies such as OAuth state storage and durable storage. A service can be alive but intentionally not ready.

3. Check DNS and TLS

bash
curl --head "https://mcp.example.com/"
openssl s_client -connect mcp.example.com:443 -servername mcp.example.com

Confirm the public DNS address, certificate hostname, full chain, expiry, and SNI. ChatGPT and Claude connect from their cloud networks, so a local-only success does not prove remote reachability.

4. Check OAuth discovery

Member metadata:

bash
curl --fail --show-error \
  "https://mcp.example.com/.well-known/oauth-protected-resource/mcp"

Authorization server:

bash
curl --fail --show-error \
  "https://mcp.example.com/.well-known/oauth-authorization-server"

The returned issuer and endpoint URLs must use the same verified customer MCP origin. Reverse proxies must preserve the correct host and HTTPS scheme.

5. Reconnect the client

For ChatGPT, remove and recreate the plugin if discovery or OAuth metadata was cached. Follow Connect ChatGPT.

For Claude Code:

bash
claude mcp list
claude mcp get nexus

Open /mcp, clear authentication, and authorize again. Reauthorization is expected after token revocation, session expiry, tenant change, account-type change, or identity drift.

6. Confirm identity and permissions

Ask the connected client:

Call nexus_whoami and show tenant, identity type, modules, scopes, and available/catalog counts. Do not change anything.

Interpret missing tools as an authorization signal, not necessarily a discovery bug:

  • member tools require the /mcp surface and live member menu access;
  • reads require nexus:read;
  • changes require nexus:write plus confirmation;
  • uploads require nexus:upload in addition to write;
  • durable scheduled tasks require offline_access.

7. Understand common statuses

ResultMeaningAction
400 Bad RequestInvalid protocol, OAuth, redirect, resource, tool arguments, or contractCorrect the request; do not retry unchanged
401 UnauthorizedMissing/expired/revoked token, wrong resource, or session must be reauthorizedReconnect through OAuth
403 ForbiddenRole, module, scope, ownership, sensitive-route policy, DLP, or confirmation denialInspect identity/contract; never weaken checks blindly
404 Not FoundMissing or inaccessible object; ownership is deliberately not disclosedVerify the ID and connected account
409 ConflictState, idempotency, approval, token rotation, or concurrent-change conflictReload state and prepare again
421 Misdirected RequestHost is not a valid enabled customer MCP domainUse the exact customer's mcp. hostname
429 Too Many RequestsOAuth, MCP, or operation quota exceededRespect retry guidance and use backoff
503 Service UnavailableOAuth/durable storage or another required dependency is unavailableFix readiness before accepting traffic
Timeout/TLS failureDNS, firewall, proxy, TLS, or cloud reachability problemTest externally and verify certificate/SNI

8. Tool-specific checks

Campaign not found

A campaign that does not exist and one owned by another advertiser return the same result. Confirm the member connection and CID; do not probe other IDs.

Counts are incomplete

Read sourcePagination.complete, exactness flags, and nextOffset. Follow pagination or narrow filters before claiming an account-wide total.

Write will not execute

Confirm that:

  1. the OAuth session has the required write scope;
  2. current state was read;
  3. the exact contract-valid payload was prepared;
  4. the displayed diff was explicitly approved;
  5. the approval/fingerprint matches the unchanged payload;
  6. a unique idempotency key is supplied;
  7. a conflicting later change has not invalidated the preview.

Scheduled task is blocked

Reconnect with offline_access, then prepare the constrained task again. The server does not accept arbitrary code or arbitrary API calls as schedules.

9. Inspect logs safely

For a systemd deployment:

bash
journalctl -u nexus-mcp.service -n 100 --no-pager

Look for request ID, verified hostname, route, status, OAuth/session category, dependency readiness, and redacted error context. Never copy authorization headers, cookies, tokens, request bodies, provider URLs with credentials, or database secrets into support messages.

Browser checks

Opening /mcp in a browser is not a complete MCP test. It does not perform client discovery, PKCE, OAuth code exchange, MCP initialization, or tool calls. Use the client connection flow and the discovery/readiness checks above.

White-label Nexus API documentation