Skip to main content
The Developer API supports the Memory MCP pages in the PAM app (Setup, Access, Usage, Request Log). Use it to programmatically manage Memory MCP setup, inspect readiness, and review retrieval history.
These endpoints are not the Memory MCP protocol. For agent retrieval, use POST /v1/mcp/memory — see MCP reference.

Authentication

Developer API endpoints require a PAM access JWT in the Authorization header:
This is different from Memory MCP authentication, which supports either:
  • Static pam_mkey agent API keys (Cursor, Claude Code, scripts)
  • OAuth 2.1 Bearer tokens (browser-hosted LLM connectors such as Claude web)
Browser clients discover OAuth via:
  • GET /.well-known/oauth-protected-resource
  • GET /.well-known/oauth-authorization-server
  • POST /v1/oauth/register (DCR)
Trusted browser redirect URIs include https://claude.ai/api/mcp/auth_callback and https://chatgpt.com/connector/oauth/{id}.

Base URL

Endpoints

Not counted toward MCP quotas

Developer REST calls do not count toward Memory MCP retrieval limits. Only tools/callretrieve_memory on /v1/mcp/memory is metered.

Typical workflows

Call GET /v1/dev/readiness and confirm ready: true before testing retrieve_memory from your MCP client.
Call GET /v1/dev/mcp-config when you want account-specific MCP connection details in one response. See mcp-config fields below — most integrations only need a subset.
Call POST /v1/dev/rotate-key with your access JWT. Copy the new api_key immediately and update your MCP client configuration.
Call GET /v1/dev/mcp-requests to list recent calls, then GET /v1/dev/mcp-requests/{request_id} for full prompt and response details.
Call GET /v1/dev/oauth-connections to see ChatGPT and Claude web sessions (one row per refresh-token family). Revoke with POST /v1/dev/oauth-connections/{connection_id}/revoke — the same action as Connected apps in the PAM app.

mcp-config fields

GET /v1/dev/mcp-config is a dashboard aggregate — one poll for the Memory MCP UI. External automation can use it too, but you usually do not need every field.
api_key is almost always null. The full secret is returned only once from POST /v1/dev/rotate-key. Use key_prefix plus your stored secret, or rotate and capture the new key immediately.

Use these for MCP setup

Typical flow: poll until readiness.ready is true → paste claude_code_config_example → inject your key → run hello_world_prompt → confirm mcp_verified.

Optional convenience copies

You can hardcode these from the docs instead of reading them from the API.

Also included (prefer dedicated endpoints when polling)

Safe to ignore in code

Example response (abbreviated)

Full schema: OpenAPI DeveloperMcpConfigResponse in the Developer API reference.

Response examples

All examples use fictional account data. Timestamps are ISO 8601 UTC.

GET /v1/dev/readiness

While sources are still syncing, ready is false and estimated_wait_message explains the wait:

POST /v1/dev/rotate-key

The full api_key is returned once. Store it immediately — subsequent GET /v1/dev/mcp-config calls return api_key: null.

POST /v1/dev/revoke-key

GET /v1/dev/oauth-connections

Lists browser LLM connections (one item per refresh-token family). expires_at reflects refresh-token lifetime when present.
status is active, expired, or revoked.

POST /v1/dev/oauth-connections/{connection_id}/revoke

GET /v1/dev/mcp-usage-stats?days=30

Daily series includes every calendar day in the range (zero-filled when there was no activity). hourly_heatmap uses weekday 0 = Sunday through 6 = Saturday.

GET /v1/dev/mcp-requests?limit=10&page=1

response_json is the stored MCP tool result — same shape as a live tools/call response (content, structuredContent, isError). Text fields may be truncated in this example.

GET /v1/dev/mcp-requests/{request_id}

Same fields as a list item — use this endpoint when you already have a request_id and need the full stored prompt and response.