Docs: MCP Server — v2.0.x-SNAPSHOT OAuth, security, tools reference, and connection guide updates - #368
Docs: MCP Server — v2.0.x-SNAPSHOT OAuth, security, tools reference, and connection guide updates#368kiran1287 wants to merge 16 commits into
Conversation
…nection guide updates - oauth.mdx: Add Dynamic Client Registration flow, discovery endpoints, token lifetimes, rate limits, CORS config, SAML card - security.mdx: New page covering PKCE, public client handling, RBAC enforcement, audit trail, secrets in logs, session revocation - connect.mdx: Bump version 0.11.2→1.1.0, protocol 2024-11-05→2025-03-26 (Streamable HTTP), remove fake create-greeting prompt, update tools/list sample response - reference.mdx: Add 5 missing context tools (get_user_context, get_persona_context, get_asset_context, find_context, get_knowledge_content), add Data Quality entity types to search_metadata, add similarityScore note, add extension/custom properties note to get_entity_details, add Read/Write type labels - semantic-search.mdx: Fix OpenSearch-only claim — Elasticsearch vector search is also supported
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
The security.mdx page was never added to docs.json navigation, leaving it orphaned.
|
|
||
| ## Allowed Origins (CORS) | ||
|
|
||
| By default, the MCP Server allows requests from all origins. For self-hosted deployments, administrators can restrict allowed origins by configuring `mcpConfiguration.allowedOrigins` in the OpenMetadata server configuration file. |
There was a problem hiding this comment.
[P1] Correct the CORS default and configuration surface. allowedOrigins is loaded from database-backed MCP settings, not the server configuration file, and the transport sends CORS headers only when the request origin exactly matches an allowed origin. There is no all-origins default. Point readers to the MCP settings API or UI and an explicit allowlist.
There was a problem hiding this comment.
Fixed in 0362138. Corrected the default: it's a fixed localhost allowlist (localhost:3000, :8585, :9090), not all-origins — verified against mcpConfiguration.json in openmetadata-spec. Storage is DB-backed via SettingsType.MCP_CONFIGURATION, editable via GET/PUT /api/v1/system/mcp/config (admin-only); confirmed the MCP app's settings UI doesn't currently expose this field, so the docs now point to the API only. Matching is exact-origin (allowedOrigins.contains(origin)), no wildcard/prefix — now stated explicitly.
| } | ||
| ``` | ||
|
|
||
| ## Context |
There was a problem hiding this comment.
[P1] Regenerate the Context reference from the tool manifest. The new entries do not match shipped schemas: get_persona_context reads personaName, not persona; get_knowledge_content requires entityType and fqn; and find_context semantically searches company knowledge rather than keyword-searching asset or persona memories. The documented requests will behave differently or fail. Regenerate the parameter tables and examples from tools.json.
There was a problem hiding this comment.
Fixed in 0362138. Regenerated all 5 tool parameter tables and examples against tools.json on origin/main — corrected get_persona_context to personaName, added the required entityType/fqn params to get_knowledge_content, and reworded find_context as a semantic search over company knowledge (glossary term definitions, metric definitions, Context Center articles) that returns candidate assets, not a keyword search over asset/persona memories.
|
|
||
| Only origins on the allowlist will receive a valid `Access-Control-Allow-Origin` response header. This is relevant for browser-based MCP clients or custom integrations that call the MCP endpoint directly from a web page. | ||
|
|
||
| For a full breakdown of the security model — PKCE details, public client handling, RBAC enforcement, audit trail, and secrets management — see the [MCP Server Security](/v2.0.x-SNAPSHOT/how-to-guides/mcp/security) page. |
There was a problem hiding this comment.
[P1] Do not link the deleted security page. This PR deletes security.mdx, so this link is a 404 and the current documentation-link check fails. It also directs readers to an active-session management screen that the current implementation does not expose. Remove the link and describe the supported OAuth revocation workflow, or restore a corrected page.
There was a problem hiding this comment.
Fixed in 0362138. Removed the link to the deleted security.mdx page and replaced it with a new 'Revoking Access' section describing the actual OAuth 2.0 Token Revocation flow (RFC 7009): POST {baseUrl}/mcp/revoke, with revocation_endpoint verified as genuinely advertised in the OAuth discovery document (OAuthWellKnownFilter). Kept the existing pointer to session management under the Token Management section for user-level revocation.
| | Endpoint | Purpose | | ||
| |----------|---------| | ||
| | `GET /.well-known/oauth-authorization-server` | OAuth 2.0 authorization server metadata (RFC 8414) | | ||
| | `GET /.well-known/openid-configuration` | OpenID Connect discovery (for OIDC-aware clients) | |
There was a problem hiding this comment.
[P2] Do not label the OAuth metadata alias as OIDC discovery. /.well-known/openid-configuration is routed to the OAuth authorization-server metadata handler; it does not expose an OIDC discovery document. Label it as an OAuth metadata compatibility alias, or remove it from this table.
There was a problem hiding this comment.
Fixed in 0362138. Verified in OAuthWellKnownFilter that both /.well-known/oauth-authorization-server and /.well-known/openid-configuration route to the same handleMetadata handler and serialize the identical RFC 8414 OAuthMetadata object — no OIDC-specific fields (userinfo_endpoint, jwks_uri, etc.) are added. Relabeled the row as an OAuth metadata compatibility alias rather than true OIDC discovery.
| ``` | ||
|
|
||
| <Note> | ||
| Results include a `similarityScore` field (0.0–1.0) for each entity when semantic ranking is active, indicating how closely the result matches your query. Higher scores indicate stronger relevance. |
There was a problem hiding this comment.
[P2] Do not promise a normalized semantic-only similarity score. search_metadata forwards the backend _score whenever it is present; current tests include 12.5 and 8.0. It is neither guaranteed 0–1 nor restricted to semantic ranking. Describe it as an opaque backend score, or move the claim to a tool with that contract.
There was a problem hiding this comment.
Fixed in 0362138. Verified in SearchMetadataTool.java that similarityScore is a direct passthrough of the backend's raw _score field with no normalization applied. Rewrote the note to describe it as the backend's opaque relevance score (not a 0.0-1.0 normalized value), meaningful only as relative ordering within a single result set.
| <Info> | ||
|
|
||
| Semantic Search requires **OpenSearch** as the search backend and must be [enabled in your deployment | ||
| Semantic Search requires **OpenSearch or Elasticsearch** as the search backend and must be [enabled in your deployment |
There was a problem hiding this comment.
[P2] Align the linked deployment guide. This page now says Elasticsearch supports semantic search, but the linked deployment guide still says Elasticsearch is not supported throughout prerequisites and troubleshooting. Update that guide in this change, or keep this page OpenSearch-only, so deployment instructions do not conflict.
There was a problem hiding this comment.
Fixed in 0362138. Verified both ElasticSearchVectorService and OpenSearchVectorService implement KNN vector search, so core semantic search works on both backends; the hybrid keyword+semantic pipeline (hybrid-rrf) exists only in the OpenSearch client. Updated deployment/semantic-search.mdx (prerequisites, Info callout, troubleshooting) to match this page's Elasticsearch support claim and call out the hybrid-pipeline caveat, so the two pages no longer contradict each other.
Corrects the CORS defaults and settings surface, relabels the OIDC discovery alias, removes the dead security.mdx link in favor of a Revoking Access section, regenerates the Context tool parameter tables from the actual tool schemas, describes similarityScore as an opaque backend score, and reconciles Elasticsearch semantic search support between the MCP docs and the deployment guide.
Databricks doesn't connect to an MCP server the way Claude or Cursor do; an admin registers it once as a Unity Catalog HTTP connection, then as a governed MCP Service in Unity Catalog, and grants EXECUTE to the callers who need it. Documents that flow end to end (UI and REST API), including the per-user OAuth U2M login step, and registers the page in docs.json navigation. Addresses open-metadata/OpenMetadata#27937.
…MCP guide Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…o fix/mcp-oauth-security-docs
| 7. Click **Create** to save the connection. | ||
|
|
||
| <Tip> | ||
| If your OpenMetadata deployment authenticates with OAuth 2.0 instead of a PAT, use **OAuth M2M** (shared service-principal credentials) or **OAuth U2M** (per-user login) as the authentication type instead of Bearer token. See [OAuth 2.0 Authentication](/v2.0.x-SNAPSHOT/how-to-guides/mcp/oauth) for the values OpenMetadata expects. |
There was a problem hiding this comment.
[P1] Do not advertise unsupported OAuth M2M\n\nThe new Databricks setup tells users to use OAuth M2M (client credentials). The shipped MCP OAuth flow does not accept grant_type=client_credentials: the integration test sends that request and expects HTTP 400, while the server advertises authorization_code and refresh_token grant types. A reader choosing OAuth M2M therefore cannot authenticate the Databricks connection. Remove this option or document a grant flow that the server actually supports.\n\n
There was a problem hiding this comment.
Fixed in 7eeacba. Verified in McpOAuthIT.java: the token endpoint explicitly rejects grant_type=client_credentials with a 400, and app registration only accepts authorization_code/refresh_token. Removed OAuth M2M from the auth type Tip and the Prerequisites bullet; kept Bearer token (PAT) as the shared non-interactive credential and OAuth U2M for per-user login, both of which the server actually supports.
Verified in McpOAuthIT.java: the MCP OAuth token endpoint explicitly rejects grant_type=client_credentials with a 400, and registration only accepts authorization_code/refresh_token grant types. OAuth M2M (which requires client_credentials) was never a working option for the Databricks Unity Catalog HTTP connection. Removed it from the auth type Tip and the Prerequisites bullet, keeping Bearer token (PAT) as the shared non-interactive credential and OAuth U2M for per-user login, both of which the server actually supports.
|
[P1] Document client authentication for token revocation The new example at oauth.mdx:180-182 sends only [P2] Reconcile the OAuth and JWT setup instructions connect.mdx:16-32 says OAuth is recommended or JWT is supported, then says the server requires JWT and shows only JWT setup. Document the supported OAuth setup, or state clearly that JWT is the only supported option. [P2] Use the runtime vector alias in troubleshooting The newly broadened cross-backend guidance still tells users to check [P2] Correct the Databricks navigation path databricks.mdx:31 says Existing feedback follow-up (same roots, not duplicate findings): the CORS paragraph at oauth.mdx:174-178 still incorrectly says |
Summary
All changes are scoped to v2.0.x-SNAPSHOT only. No changes to v1.12.x or v1.13.x.
Test plan