Guides
Troubleshooting
Resolve discovery, indexing, subscription, and delivery issues.
Identify which step failed: plugin discovery, event-source indexing, subscription registration, Redis, webhook acknowledgment, or the dot’s later execution. These are separate systems.
Tools appear, but no webhook events are listed
send_to_dot is registered through the official MCP Go SDK. The event catalog is implemented separately. Make sure the deployed server advertises events: {} in both legacy initialize and MCP 2.0 server/discover, and that events/list returns message.created with webhook delivery.
MCP 2.0 (2026-07-28) requires its own method header and protocol metadata. A handcrafted probe missing Mcp-Method: server/discover will return HTTP 400 even on a correct server. Follow the MCP reference instead of treating every failed manual probe as a server defect.
Rescan the MCP connection after a deployment that changes advertised capabilities.
Events show in the plugin UI, but the dot says there are no event sources
This happened during development: message.created appeared in ChatGPT’s plugin UI while list_event_sources omitted dm-dot and discover_webhook_schema returned “This connector has no available webhook events.” After the plugin’s event catalog had time to propagate, subscription became available without changing the server again.
First confirm the deployed MCP 2.0 discovery response is correct, rescan the plugin, and retry the dot subscription after the platform updates its event catalog. Do not delete the subscription or rotate keys merely because the UI and the event-source index temporarily disagree. If it persists, report the connector ID, UTC time, and non-secret response details to the platform provider; never share an authenticated MCP URL.
Cannot subscribe: callback challenge failed
events/subscribe requires a valid public HTTPS callback, Standard Webhooks signing secret, and exact challenge echo. Callback verification returns a protocol error if the remote callback doesn’t accept and echo the challenge correctly.
Verify external HTTPS reachability and ChatGPT’s event support for the selected dot. Do not disable signing, TLS verification, or private-IP protections to force a subscription through.
A different dot is already subscribed
Only one callback is active per deployment. A new callback cannot replace it until the existing one unsubscribes or expires. Ask the former dot to unsubscribe, or carefully clear the single Redis key if recovering a subscription you can no longer reach. Do not clear unrelated Redis data.
send_to_dot or REST says no active subscription
The plugin may be connected without the dot having subscribed. Ask the dot to subscribe to message.created and confirm that registration succeeded. Subscriptions are finite (maximum seven days per grant); ChatGPT needs to refresh them before expiry. There is no queue for messages sent while the dot is unsubscribed.
REST returns 401, 409, or 503
| Error | Likely cause | Check |
|---|---|---|
401 unauthorized |
Wrong REST bearer key | Use DM_DOT_REST_API_KEY, not MCP_API_KEY |
409 no_subscription |
Dot not subscribed/expired | Subscribe or refresh in the dot |
503 not_configured |
Missing REST API key | Configure Vercel Production secret, redeploy |
503 storage_unavailable |
Incorrect Redis REST credentials or unreachable Upstash | Inspect Vercel env and Upstash health |
502 delivery_failed |
Webhook failed or returned non-success | Check remote callback and transient errors |
See REST API for the complete status mapping.
Webhook accepted, but the dot has not done anything
An HTTP 202 from the REST API, or an event ID from the MCP tool, confirms ChatGPT webhook acceptance. The dot works asynchronously and may be subject to platform scheduling, permissions, and its own tool calls. There is no built-in completion receipt. Test with a unique message ID and ask the dot to acknowledge via an already-authorized channel.
See Measuring latency for an accurate timing method.
Deployment doesn’t reflect source changes
Verify the production alias points at the expected deployment and Git commit. Changes to sensitive environment variables require a new deployment. The project intentionally skips Git-created preview deployments on feature branches; manual previews are still possible.
Security and duplicates
The authenticated MCP URL includes a query-string secret and should not appear in issue reports. Keep REST keys out of browser code. Transient retries can create duplicate webhook deliveries; never assume exactly-once execution.