Interactive OAuth 2.1
ChatGPT, Startwerk and other interactive clients use Authorization Code with PKCE and request the mcp:use scope. A verified Datahub user must have an active Consumer membership before consent.
Datahub developer reference
A product-neutral Streamable HTTP channel for the governed Datahub consumer API. REST/OpenAPI remains the authoritative contract.
ChatGPT, Startwerk and other interactive clients use Authorization Code with PKCE and request the mcp:use scope. A verified Datahub user must have an active Consumer membership before consent.
Existing edb_… Service Account tokens are accepted as an HTTP Authorization: Bearer token on the same endpoint.
Production redirect origins are restricted to ChatGPT and Startwerk. Dynamic registration is limited to 10 attempts per hour and IP. Localhost is accepted only outside production.
ChatGPT availability and workspace controls can change while full MCP support is in beta. Follow the official OpenAI setup guide for the current developer-mode workflow.
Tools without an effective capability are omitted from discovery. Every call still rechecks the concrete Data Product, membership and Privacy grant. Every tool publishes an operation-specific output schema for its structured result.
| Tool | Capability | Behavior |
|---|---|---|
| list_data_products | authenticated | List Data Products and capabilities effectively available to the current principal. |
| find_entities | entities.read | Find product-scoped entities by a governed identifier. |
| get_entity | entities.read | Get a privacy-filtered canonical entity snapshot. |
| list_entity_relationships | relationships.read | List product-scoped relationships for an entity. |
| list_entity_documents | documents.read | List product-scoped document metadata for an entity. |
| get_document_download | documents.content.read | Get document availability or a five-minute one-time protected download URL. |
| request_document_content | documents.content.read | Request retrieval of remote-only document content. |
| get_document_content_request | documents.content.read | Get the status of a document content request. |
| request_entity_materialization | entities.materialize | Request priority materialization for an incomplete organization. |
| get_entity_materialization | entities.materialize | Get the status of an entity materialization request. |
| list_entity_changes | changes.entities.read | Read product-scoped entity changes after a cursor. |
| list_entity_subscriptions | entity-subscriptions.manage | List entity watches owned by the current consumer. |
| watch_entity | entity-subscriptions.manage | Create or update an idempotent entity watch. |
| unwatch_entity | entity-subscriptions.manage | Disable an entity watch. |
| list_watched_entity_changes | changes.entities.read | Read changes matching active entity watches. |
| get_analytics_catalog | analytics.read | List active analytics metrics and their supported operations. |
| create_analytics_analysis | analytics.read | Create an idempotent governed analytics analysis. |
| get_analytics_analysis | analytics.read | Get an analytics analysis and its immutable result snapshot. |
| list_analytics_analysis_entities | analytics.entities.read | List organization entities represented by an analysis. |
| list_analytics_anomalies | analytics.read | List detected analytics anomalies. |
| get_analytics_anomaly | analytics.read | Get a detected analytics anomaly. |
Collections use external page metadata or opaque change cursors. Mutating tools require a caller-generated UUID idempotency_key; replaying it returns the same request or end state.
Binary content never enters model context. Available files receive a single-use five-minute HTTPS ticket. Remote documents and analyses return public request UIDs plus poll_after_seconds.
unauthenticatedforbiddenvalidation_errornot_foundconflictrate_limitedtemporarily_unavailableNo tool returns raw payloads, object-storage paths, person matching evidence, Ops data or governance controls.