| → / Space | Next slide |
| ← | Previous slide |
| Home | First slide |
| End | Last slide |
| Swipe | Touch navigation |
Every layer has a governance boundary. Identity flows top to bottom.
A supervisor coordinates specialized sub-agents, each with its own tools and identity context.
OBO Supervisor auto-forwards the user's token to all sub-agents. current_user() = human email everywhere.
M2M Supervisor uses its own SP credentials. Sub-agents see the SP identity.
OBO token propagation from browser to the deepest tool call.
current_user() returns the human email at every resource — from the supervisor down to the table query.
ModelServingUserCredentials() only works inside Model Serving — do not use in Apps codegenie and dashboards.genie scopes403: "required scopes: genie"Single App: X-Forwarded-Access-Token has the user’s token — pass it as Bearer to Agent Bricks. Works fine. App → App (two-proxy): User token is lost. Use X-Forwarded-Email (survives proxy hops, cannot be forged) + M2M SQL.
Databricks-hosted, pre-built connectors (e.g., Unity Catalog). No code needed.
Your code, deployed as Databricks App. Full control over tools and auth.
Third-party MCP servers accessed via UC HTTP Connections.
X-Forwarded-Email (trustworthy, signed by proxy)tools/list, tools/call)| OBO | Read X-Forwarded-Access-Token, forward to downstream |
| M2M | WorkspaceClient() no-args, SP identity |
| Mixed | M2M for data, OBO for user context |
# tools/list response { "tools": [ { "name": "query_genie", "description": "Ask a question", "inputSchema": { "type": "object", "properties": { "question": {"type": "string"} } } } ] } # tools/call invocation POST /tools/call { "name": "query_genie", "arguments": {"question": "..."} }
Access third-party MCP servers through governed connection objects.
GRANT USE CONNECTION controls accessOpenAI Agents SDK + MCP
Native MCP client integration. Each tool backed by a UC connection.
LangGraph + MCP
MCP tools as LangGraph nodes. Graph orchestration with governed tool access.
uc-mcp-proxy
Local proxy bridges IDE MCP clients to Databricks-governed connections.
UC Connections are the governance boundary for every external API call.
GRANT USE CONNECTION controls who can use each connectionREVOKE removes access immediately (runtime enforcement)http_request() / SDKStatic token stored in UC. Simple but shared identity.
Client credentials flow. App-level identity at external service.
One user’s OAuth token shared across callers.
Each user’s own OAuth token. True per-user identity on both sides.
-- Enable agent to use Jira GRANT USE CONNECTION ON CONNECTION jira_mcp TO `agent-sp-uuid`; -- Immediately disable (no redeploy needed) REVOKE USE CONNECTION ON CONNECTION jira_mcp FROM `agent-sp-uuid`;
This is the kill switch. Revoke connection access and the agent loses the tool immediately. No code change, no redeploy.
✓ Tool call succeeds
✗ Permission denied at UC layer
One AppKit app proves all auth patterns side by side. External service is provider-agnostic.
| Tab | Pattern | Identity | What It Proves |
|---|---|---|---|
| SQL Analytics | OBO vs M2M (.obo.sql / .sql) |
User or SP | Row filters fire per-user with OBO; shared cache with SP |
| Genie Chat | OBO token → Genie API | User | current_user() = human, per-user data access |
| External Service | UC Connection (U2M Per User) | User on both sides | Two-sided identity: Databricks & external service see user |
| Connection Gov | GRANT / REVOKE USE CONNECTION | Admin | Runtime kill switch — revoke = tool gone immediately |
External Service tab is a template. Swap connection_name + path for Salesforce, Jira, GitHub, Slack, ServiceNow — same pattern, same code.
genie scope via account APIDeploy raw .mjs files — esbuild bundles break AppKit’s runtime import(). Include package.json, exclude .npmrc.
Exchange a trusted IdP JWT for a Databricks OAuth token. No Databricks secrets needed.
POST /oidc/v1/token| Feature | Account Federation | WIF |
|---|---|---|
| Applies to | Users & SPs | Workload → SP |
| SCIM required | Yes | No |
| Issuer limit | 5 | Unlimited |
| Secrets | None | None |
| Refresh tokens | Yes (U2M) | No |
Databricks copies the IdP’s exp claim verbatim.
| Entra ID | Account + WIF |
| Okta | Account + WIF |
| PingOne | Account + WIF |
| Google Cloud Identity | Account + WIF |
| Auth0 | Account + WIF |
| AWS IAM | WIF only |
| GitHub Actions OIDC | WIF only |
JDBC/ODBC driver support: Work in progress. Not all drivers support federation yet. Check driver release notes before depending on this path.
Centralized model traffic management: rate limiting, cost tracking, guardrails, fallback routing.
Per endpoint, per user, per model. Sliding window with configurable QPM/TPM.
Token counts, latency, cost allocation per team/project/endpoint.
Content filtering, PII detection, topic blocking on input and output.
Primary model fails → automatically route to secondary. No client code change.
Traffic splitting across model versions with built-in metrics comparison.
| Scenario | AI Gateway | UC + Scopes | Both |
|---|---|---|---|
| Rate limit model access | ✓ | ||
| Track token usage / cost | ✓ | ||
| Content guardrails | ✓ | ||
| Data access control | ✓ | ||
| External tool governance | ✓ | ||
| Production agent deployment | ✓ |
AI Gateway manages MODEL traffic. UC manages DATA and TOOL access. Both needed for production.
Three pillars. Join on request_id for end-to-end agent lineage.
Every API call logged. Join on SP UUID to trace agent actions.
Every agent step, tool call, LLM invocation. Latency, tokens, errors.
Structured application logs from Databricks Apps. Auto-configured OTel env vars.
system.access.audit + MLflow traces on request_id for end-to-end agent lineage.
-- Who changed permissions?
SELECT *
FROM system.access.audit
WHERE action_name IN (
'grantPermission',
'revokePermission'
)
AND event_date >=
current_date() - 7;
-- OBO token usage
SELECT
request_params.user_email,
count(*)
FROM system.access.audit
WHERE source_ip_address
LIKE '10.%'
AND user_identity.email
LIKE '%ServicePrincipal%'
GROUP BY 1;
-- Agent tool invocations
SELECT *
FROM system.access.audit
WHERE action_name =
'executeFunction'
AND user_identity.email =
'<agent-sp-uuid>';
| OTEL_EXPORTER_* | Export endpoint + protocol |
| OTEL_SERVICE_NAME | App name auto-set |
| OTEL_RESOURCE_* | Resource attributes |
| DATABRICKS_APP_PORT | Framework port |
10 env vars total, auto-configured at app startup. No manual OTel setup needed.
| OS | Ubuntu 22.04 |
| Python | 3.11 |
| Node | 22.16 |
| P50 latency | ~50ms |
| P95 latency | ~200ms |
App Insights (Beta): Built-in dashboard in the App UI. Metrics, traces, and logs in one view.
Every agent action traces back to an identity.
Every tool call goes through UC.
Every external service call goes through a connection.
Every step is audited.