Announcing CIMD support for MCP Client registration
Learn more

Databricks MCP vs Databricks API for AI Agents (2026)

Saif Ali Shaik
Founding Developer Advocate

TL;DR

  • Databricks managed MCP (Public Preview) and the Databricks REST API overlap on data access but diverge sharply on operations. Managed MCP exposes Genie, AI Search, Unity Catalog functions, and AI-generated SQL, mostly read paths governed by Unity Catalog. Jobs, clusters, SQL warehouses, Model Serving, Secrets, and IAM live only in the REST API.
  • Both paths support OAuth. Databricks MCP is not OAuth-user-only: it supports OAuth user-to-machine, OAuth machine-to-machine via a service principal, and personal access tokens. Headless agents work on either path.
  • The sharp MCP auth constraint is different: Databricks does not support Dynamic Client Registration for any MCP type, so OAuth apps must be pre-registered by an account admin. Personal access tokens are not supported for MCP servers you host on Databricks Apps.
  • For multi-tenant B2B agents, the automation identity on Databricks is a service principal, not a per-human token. Every tenant workspace still needs an isolated, refreshed, revocable credential. Neither path gives you the vault, rotation, or revocation.
  • Scalekit's Databricks Workspace connector holds that per-tenant service-principal credential in an encrypted vault, resolves it server-side on every tool call, and logs each call to a queryable audit trail, so the MCP versus API decision does not change your credential infrastructure.

Your agent needs to reach into Databricks. It has to query governed tables, run a SQL job, check why last night's pipeline failed, and pull a Genie answer for a sales rep. Databricks now ships two ways in. There are managed MCP servers, in Public Preview, that expose Unity Catalog data and functions over Model Context Protocol.

And there is the REST API surface your data team has scripted against for years. They cover overlapping but not identical ground, they put you on different auth paths, and for a background data agent one of those differences decides the architecture. Here is how to pick.

Databricks MCP: three layers, one protocol

Databricks exposes MCP in three forms. Managed MCP servers are Databricks-hosted and connect agents to Unity Catalog data, AI Search indexes, Genie Spaces, and custom functions. MCP Services proxy third-party apps such as GitHub, Slack, and Google Drive through the Unity AI Gateway. Databricks-hosted MCP servers run your own code on Databricks Apps.

The managed MCP status and transport

Managed MCP servers are in Public Preview as of mid-2026. Transport is Streamable HTTP, and every call runs under Unity Catalog permissions. Agents connect the same way they connect to any remote MCP server: point at the server URL, authenticate, and call tools.

Databricks MCP auth in one line

Auth is OAuth (recommended) for all three MCP types, with personal access tokens supported for managed servers and MCP Services. OAuth supports both public and confidential clients, plus service-principal machine-to-machine. Official docs: managed MCP servers and client setup.

Databricks REST API: the full platform surface

The REST API is the complete control plane for a workspace and account. It spans Databricks SQL (Statement Execution, SQL Warehouses, Queries), Jobs, Clusters, Unity Catalog administration (Catalogs, Schemas, Tables, Functions, Connections), Model Serving, Vector Search and AI Search, Secrets, DBFS and Files, and IAM (Users, Groups, Service Principals, Permissions).

Databricks REST API auth in one line

Auth supports personal access tokens (now treated as legacy), OAuth user-to-machine, and OAuth machine-to-machine with a service principal client ID and secret. Machine-to-machine access tokens are valid for one hour and refresh automatically under the Databricks SDKs. Official docs: REST API reference and Statement Execution API.

What each path actually exposes

This section lists what is real on each path, sourced from Databricks documentation, so you can see precisely what is not possible on one side versus the other.

Managed MCP servers and their tools

Each managed server is scoped by an OAuth scope. The list below is from the official managed MCP documentation.

Managed MCP server
What it does
Read or write
OAuth scope
Genie One
Natural-language questions across Genie Spaces and Unity Catalog; returns a grounded answer
Read
genie
Genie Space
Natural-language analysis against a single Genie Space
Read
genie
AI Search (formerly Vector Search)
Query AI Search indexes for relevant documents; requires Databricks managed embeddings
Read
ai-search
Databricks SQL
Run AI-generated SQL to author data pipelines from coding tools
Read and write
sql
Unity Catalog functions
Run predefined SQL functions registered in Unity Catalog
Read and write via function
unity-catalog

REST API surface groups

The REST API is organized into the groups below. This is not the full endpoint list; it is the shape of the surface.

REST API group
Representative capability
Databricks SQL
Statement Execution, SQL Warehouses, Queries, Query History, Alerts
Jobs
Create, list, run-now, run history, policy compliance
Compute
Clusters, Cluster Policies, Instance Pools
Unity Catalog
Catalogs, Schemas, Tables, Functions, Volumes, Connections, Grants
Machine Learning
Model Registry, Serving Endpoints, Experiments
Search and retrieval
Vector Search and AI Search Endpoints and Indexes
Identity and access
Users, Groups, Service Principals, Permissions, SCIM
Files and secrets
DBFS, Files, Secrets, Git Credentials, Repos

What is not possible on each side

The gap is real and specific. Name it precisely before choosing. Managed MCP cannot start or stop a cluster, trigger a job, manage a SQL warehouse, administer Unity Catalog objects, manage Secrets, or manage IAM. Those are REST-only operations. Managed MCP also does not do high-volume programmatic extraction; the Databricks SQL server targets AI-assisted authoring in coding tools, while bulk result retrieval belongs to the Statement Execution API with chunked results. The REST API, in turn, does not expose Genie answers or AI Search retrieval as native tools without extra wiring; those exist as first-class managed MCP servers.

What your agent can actually do

The managed MCP servers are built for governed data access. The REST API owns operations and administration. The table uses plain text, not symbols.

Capability
Databricks managed MCP
Databricks REST API
Natural-language data questions (Genie)
Yes, Genie One and Genie Space
Partial, via Genie API with more wiring
Vector or AI Search retrieval
Yes, AI Search server
Partial, via AI Search API
Run Unity Catalog functions as tools
Yes
Yes
AI-generated SQL authoring
Yes, Databricks SQL server
Yes, via Statement Execution
Programmatic SQL execution and paging
Partial, poll for results
Yes, Statement Execution with chunks
Trigger and monitor Jobs
No
Yes
Start, stop, inspect Clusters
No
Yes
Manage SQL Warehouses
No
Yes
Model Serving and Model Registry
No
Yes
Manage Secrets
No
Yes
IAM, Service Principals, SCIM
No
Yes
Unity Catalog administration
No
Yes

The auth path each one puts you on

Both paths support the same core methods, so the auth decision is narrower than it looks. Managed MCP and the REST API both accept OAuth user-to-machine, OAuth machine-to-machine via a service principal, and personal access tokens. A background agent authenticates as a service principal on either path and operates without a browser in the loop.

The MCP-specific constraint: no Dynamic Client Registration

The one place MCP diverges is client registration. Databricks does not support Dynamic Client Registration for managed MCP servers, MCP Services, or Databricks-hosted MCP servers. An account admin must create the OAuth application in the account console and hand you a client ID, plus a client secret for confidential clients. MCP clients and IDEs that require Dynamic Client Registration cannot use OAuth against Databricks.

The PAT constraint for hosted servers

Personal access tokens work for managed MCP servers and MCP Services, but not for MCP servers you host on Databricks Apps. Those require OAuth. Plan the credential type per MCP layer, not once for all of them.

The implication for multi-tenant agents

The structural point holds on both paths. In a multi-tenant B2B agent, every tenant workspace needs its own Databricks credential. OAuth gives you a token per identity; a service principal gives you a credential per workspace. Neither the MCP path nor the REST path stores, rotates, or revokes that credential for you. That is infrastructure you build or adopt, regardless of which path you pick. For a deeper look at this challenge, see access control for multi-tenant AI agents.

What you own in production

On the MCP path

Databricks manages hosting, tool schemas, and Unity Catalog enforcement. You own OAuth app registration per client, credential storage and refresh, the one-hour lifetime of machine-to-machine tokens, and IP allowlisting for cloud-hosted agents that reach your workspace. You also own the poll loop: Genie and long-running SQL return asynchronously and require polling.

On the REST API path

You own everything above, plus adapter code for each API group you touch, pagination and chunked result handling for large SQL results, and version handling across the surface. You choose the endpoints, and you own their error and retry models.

Governance and observability now built in

Databricks added Unity AI Gateway agent tracing and the Lakewatch SIEM at Summit 2026, so managed MCP activity is captured in a governed telemetry layer. This is real and worth using. It covers Databricks-side activity; it does not cover the credential and identity layer across the other tools in a multi-tool agent.

When to use MCP, when to use the API

Use Databricks managed MCP when

  • Your agent is interactive and data-facing: analysts asking Genie questions in Claude, Cursor, or ChatGPT without leaving their assistant.
  • You want Unity Catalog permissions to constrain the agent automatically, per identity, with no adapter code.
  • You are retrieving from AI Search indexes or running Unity Catalog functions and want a consistent tool interface.
  • You are authoring SQL from a coding tool and want AI-generated SQL against governed data.

Use the Databricks REST API when

  • Your agent operates the platform: triggering Jobs, starting Clusters, managing SQL Warehouses, or administering Unity Catalog.
  • Your agent runs headless on a schedule and you want a service principal, a one-hour token, and explicit control of retries.
  • You need Model Serving, Secrets, IAM, SCIM, or DBFS, none of which the managed MCP servers expose.
  • You need high-volume programmatic SQL with chunked result paging through the Statement Execution API.

The credential problem that exists on both paths

The same credential either way

Whichever path you choose, the agent ends up holding a Databricks credential per tenant: an OAuth token or a service principal secret. Databricks governs what that identity can do through Unity Catalog. Databricks does not give you a vault, rotation logic, or a revocation flow.

The N-credential reality for data agents

In a multi-tenant B2B data agent, each customer workspace is its own service principal with its own grants. That is N credentials to store encrypted, refresh before the one-hour machine-to-machine token expires, and revoke when a customer offboards. The problem is identical whether you chose MCP or the REST API; the token type differs, the infrastructure required does not. This is the same credential ownership challenge that surfaces across every tool-calling pattern.

Where Scalekit fits

Scalekit's Databricks Workspace connector authenticates as a Service Principal over OAuth 2.0, holds that credential in an encrypted vault namespaced per tenant, resolves it server-side on every tool call, and never places it in the LLM context. The same auth layer works whether you reach Databricks through Scalekit's tool API or through a Scalekit-generated MCP URL. Connector page: Databricks Workspace; docs: connector reference.

What the connector calls today

The connector wraps the REST operations most data agents need: SQL execution and paging, Jobs, Clusters, SQL Warehouses, Unity Catalog listing, INFORMATION_SCHEMA discovery, SCIM, and Secret scopes. Representative tools include databricksworkspace_sql_statement_execute, databricksworkspace_jobs_list, databricksworkspace_job_run_now, databricksworkspace_clusters_list, and databricksworkspace_unity_catalog_tables_list.

Connect it with the Python SDK

The connection name must match the connection you created in the Scalekit dashboard exactly; it is the single most common integration error.

import os import scalekit.client scalekit_client = scalekit.client.ScalekitClient( client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), env_url=os.getenv("SCALEKIT_ENV_URL"), ) actions = scalekit_client.actions # connection_name must match the dashboard connection exactly CONNECTION = "databricksworkspace" # 1) Bind this tenant's Databricks service principal to a connected account response = actions.get_or_create_connected_account( connection_name=CONNECTION, identifier="tenant_acme", ) if response.connected_account.status != "ACTIVE": link = actions.get_authorization_link(connection_name=CONNECTION, identifier="tenant_acme") print("Authorize Databricks:", link.link) # 2) Execute a scoped tool call; the token is resolved server-side result = actions.execute_tool( tool_name="databricksworkspace_sql_statement_execute", identifier="tenant_acme", tool_input={ "statement": "SELECT date, COUNT(*) FROM events.signups GROUP BY date", "warehouse_id": "", }, ) print(result.data)

Connect it with the Node.js SDK

import { ScalekitClient } from '@scalekit-sdk/node'; import { ConnectorStatus } from '@scalekit-sdk/node/lib/pkg/grpc/scalekit/v1/connected_accounts/connected_accounts_pb'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENV_URL, process.env.SCALEKIT_CLIENT_ID, process.env.SCALEKIT_CLIENT_SECRET, ); const actions = scalekit.actions; // connectionName must match the dashboard connection exactly const CONNECTION = 'databricksworkspace'; const { connectedAccount } = await actions.getOrCreateConnectedAccount({ connectionName: CONNECTION, identifier: 'tenant_acme', }); if (connectedAccount?.status !== ConnectorStatus.ACTIVE) { const { link } = await actions.getAuthorizationLink({ connectionName: CONNECTION, identifier: 'tenant_acme' }); console.log('Authorize Databricks:', link); } const result = await actions.executeTool({ toolName: 'databricksworkspace_jobs_list', identifier: 'tenant_acme', toolInput: { limit: 20 }, }); console.log(result.data);

Run it inside a Claude agent loop

Scalekit returns tool schemas in Anthropic's native input_schema format, so no conversion is needed. list_scoped_tools returns only the tools this identity is authorized to call.

from google.protobuf.json_format import MessageToDict import anthropic client = anthropic.Anthropic() # Fetch only the tools this tenant's service principal is authorized to call scoped_response, _ = actions.tools.list_scoped_tools( identifier="tenant_acme", filter={"connection_names": ["databricksworkspace"]}, page_size=100, # fetch beyond the default page so no connector tools are missed ) llm_tools = [ { "name": MessageToDict(t.tool).get("definition", {}).get("name"), "description": MessageToDict(t.tool).get("definition", {}).get("description", ""), "input_schema": MessageToDict(t.tool).get("definition", {}).get("input_schema", {}), } for t in scoped_response.tools ] messages = [{"role": "user", "content": "Which jobs failed in the last 24 hours and why?"}] while True: response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, tools=llm_tools, messages=messages, ) if response.stop_reason == "end_turn": print(response.content[0].text) break tool_results = [] for block in response.content: if block.type == "tool_use": result = actions.execute_tool( tool_name=block.name, identifier="tenant_acme", tool_input=block.input, ) tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": str(result.data), }) messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results})

Run it inside a LangChain agent

actions.langchain.get_tools returns native StructuredTool objects, already scoped to the identity you pass.

from langchain_openai import ChatOpenAI from langchain_core.messages import HumanMessage, ToolMessage tools = actions.langchain.get_tools( identifier="tenant_acme", connection_names=["databricksworkspace"], page_size=100, # avoid missing tools when a connector has more than the default page ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [HumanMessage("List clusters with more than 10 workers")] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: result = tool_map[tc["name"]].invoke(tc["args"]) messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Why this matters downstream for tool calling

The list_scoped_tools call returns only the tools this tenant's identity is authorized to reach, not a full catalog. Surface reduction is the lever for tool-calling accuracy: a smaller decision space produces more reliable selection and fewer hallucinated parameters, and it cuts the token overhead of carrying every tool in context. Model upgrades help; they are not the lever.

Why this matters for multi-tenant isolation

Scope is a function of identity, not connector configuration. Each tenant's Databricks credential lives in its own vault namespace, so an agent acting for tenant Acme cannot reach tenant Globex data on the same connection. Unity Catalog grants on the service principal define the ceiling: what the service principal cannot do, the agent cannot do.

Why this matters for observability

Every Databricks tool call is written to Scalekit's auth logs with the identity that authorized it, the tool invoked, and the result, with a queryable history and SIEM-ready export. In a multi-tool agent that also touches Salesforce, Slack, or GitHub, this is one identity-level audit trail across every connector, complementing the Databricks-side telemetry in Unity AI Gateway.

If the surface you need is missing

The connector covers the REST operations above; it does not yet expose the Genie, AI Search, or Unity Catalog function managed-MCP servers as native tools. If your agent needs those, or a Databricks capability not listed here, request it: join the Scalekit community, talk to the team, or book time with an engineer.

Which one to build against

Match the path to the agent

If your agent is interactive and data-facing, analysts asking Genie questions or retrieving from AI Search inside their assistant, build on Databricks managed MCP. Unity Catalog does the scoping for you, and there is no adapter code to write.

The operational agent goes to REST

If your agent operates the platform, runs on a schedule, or needs Jobs, Clusters, Warehouses, Model Serving, Secrets, or IAM, build on the REST API with a service principal. That is where headless execution and the full control plane live.

The part that is the same either way

Most production Databricks agents will use both. The credential problem does not change with the path: a per-tenant service principal that has to be vaulted, refreshed before its one-hour token expires, and revoked on offboarding. That is the layer that needs production-grade token vault infrastructure, whichever path you are on.

Browse the Scalekit Databricks Workspace connector: scalekit.com/connectors/databricks-workspace

No items found.
Agent Auth Quickstart
On this page
Share this article
Agent Auth Quickstart

Acquire enterprise customers with zero upfront cost

Every feature unlocked. No hidden fees.
Start Free
$0
/ month
1 million Monthly Active Users
100 Monthly Active Organizations
1 SSO connection
1 SCIM connection
10K Connected Accounts
Unlimited Dev & Prod environments