Announcing CIMD support for MCP Client registration
Learn more

Airbyte MCP vs Airbyte API for AI Agents

Nishant Choudhary
Tech Evangelist

Airbyte now ships three MCP surfaces and a public REST API: a hosted MCP server for its data pipelines, the same server run locally for self-managed deployments, a separate Agent MCP for querying business apps, and the Airbyte API that replaced the deprecated Configuration API. They share a brand and a login and diverge on what they touch, which deployments they reach, and whose permissions they carry. This guide compares what each path lets an agent do, the credential each one puts you on, and how to run either across many customer organizations in production.

TL;DR

  • "Airbyte MCP" is three servers. The Airbyte MCP at https://mcp.airbyte.com/mcp manages data pipelines in Airbyte Cloud and is in open beta with 46 tools. The same server runs locally over stdio (uvx --from=airbyte@latest airbyte-mcp) for self-managed Airbyte Core. The Airbyte Agent MCP at https://mcp.airbyte.ai/mcp belongs to Airbyte Agents, launched in May 2026, and queries business apps such as Salesforce and Zendesk rather than managing ELT pipelines.
  • The Airbyte API at https://api.airbyte.com/v1 covers workspaces, sources, destinations, connections, jobs, streams, users, permissions, tags, organizations, and connector definitions. Its auth is an application client_id and client_secret exchanged at /v1/applications/token for a Bearer token that expires in 15 minutes and carries every permission of the user who created the application. There are no scopes.
  • The pipeline MCP signs users in with OAuth 2.0 through Airbyte Cloud (SSO included), and also accepts an application's Client-Id and Client-Secret headers for headless agents. Neither path removes per-user or per-customer credential isolation in a multi-tenant agent.
  • MCP is the faster path for a data engineer asking Claude or Cursor why last night's sync failed. The API is the right path for orchestrators that trigger syncs with POST /v1/jobs, poll for succeeded or failed, provision connections per customer, or run against self-managed deployments.
  • Scalekit's airbytemcp connector proxies Airbyte's Agent MCP with 20 tools and OAuth 2.1, with Scalekit-managed OAuth credentials available, so per-user Airbyte tokens live in the token vault and the MCP vs API decision doesn't change your auth infrastructure.

The decision your Airbyte agent forces first

Your agent sits next to your customers' data stack. It needs to answer "why is the Stripe connection three days stale," re-run a failed sync before the morning dashboards load, spin up a Postgres-to-Snowflake connection for a new tenant, or pull the open Salesforce deals a sales rep asked about. Airbyte now ships a hosted MCP server for its data platform, a separate MCP server for its newer Airbyte Agents product, and a public REST API that has replaced the deprecated Configuration API. They share a brand and a login, and they diverge on what they touch, which deployments they reach, and whose permissions they carry. Here's how to pick.

What Airbyte MCP and Airbyte API actually are

Airbyte MCP

The Airbyte MCP is a Model Context Protocol (MCP) server for Airbyte's replication platform, hosted at https://mcp.airbyte.com/mcp over Streamable HTTP. Airbyte labels it beta and "in active development." It works with all Airbyte Cloud editions and Airbyte Flex, it is free on every plan, and it acts with the signed-in user's Airbyte permissions (Airbyte MCP overview). Connecting Claude Code is one line: claude mcp add --transport http airbyte https://mcp.airbyte.com/mcp.

Its 46 tools cover organizations and workspaces (list_cloud_workspaces, get_default_cloud_context), connectors (deploy_connector_to_cloud, check_cloud_connector, update_cloud_connector_config), connections (create_connection_on_cloud, set_cloud_connection_selected_streams, update_cloud_connection), syncs (run_cloud_sync, cancel_cloud_sync, get_cloud_sync_status, get_cloud_sync_logs), custom connector manifests (publish_custom_source_definition), direct reads (execute_external_api_query, execute_external_sql_query), and docs search (search_airbyte_knowledge_sources).

For self-managed Airbyte Core, the hosted server does not apply. You run the same MCP locally over stdio with uvx --from=airbyte@latest airbyte-mcp, pointed at AIRBYTE_CLOUD_API_URL=http://localhost:8000/api/public/v1 with AIRBYTE_CLOUD_CLIENT_ID, AIRBYTE_CLOUD_CLIENT_SECRET, and AIRBYTE_CLOUD_WORKSPACE_ID. This is the PyAirbyte MCP server, which PyAirbyte marks experimental. Pipeline tools work there; the context layer and direct reads are Cloud only.

The Airbyte Agent MCP at https://mcp.airbyte.ai/mcp is a different product. It belongs to Airbyte Agents, announced on May 5, 2026, and connects agents to business systems through agent connectors and a managed Context Store. Its tools follow an inspect, read docs, execute pattern: inspect_connector, read_skill_docs, list_skills, search_skills, and an execute tool that queries or writes records. This is the server Scalekit's airbytemcp connector proxies.

Airbyte API

The Airbyte API is REST at https://api.airbyte.com/v1/ for Cloud and <your-airbyte-url>/api/public/v1/ for self-managed. The reference groups it into Applications, Sources, Destinations, Connections, Jobs, Streams, Workspaces, Permissions, Users, Organizations, Tags, Health, and Source, Destination, and Declarative Source Definitions. Airbyte also publishes Python and Java SDKs and a Terraform provider. The old Configuration API is deprecated and unsupported.

Auth is one method. You create an application under User settings > Applications, then POST /v1/applications/token with client_id, client_secret, and grant-type: client_credentials (hyphenated in Airbyte's docs). The response is a Bearer access_token with expires_in: 900 (API access guide).

What your agent can actually do

Capability
Airbyte MCP (mcp.airbyte.com)
Airbyte Agent MCP (mcp.airbyte.ai)
Airbyte API (api.airbyte.com/v1)
List organizations and workspaces
Yes
Limited: Airbyte Agents workspaces only
Yes: Organizations and Workspaces endpoints
Create sources and destinations
Yes
Limited: Creates agent connectors, not ELT sources
Yes: Sources and Destinations endpoints
Create connections and pick streams
Yes
No
Yes: Connections and Streams endpoints
Trigger and cancel syncs
Yes
No
Yes
Reset a connection
No: No reset tool
No
Yes
Job status and history
Yes
No
Yes
Read sync logs for troubleshooting
Yes
No
Limited: Not part of the job response
Publish custom connector manifests
Yes
No
Yes: Declarative Source Definitions endpoints
Users, permissions, and tags
No
No
Yes: Users, Permissions, and Tags endpoints
Read live records from a source app
Yes
Yes: Up to 10 operations per call, reads and writes
No: The API moves data; it does not query it
Read-only SQL on Snowflake or BigQuery destinations
Yes
No
No
Sync failure and success notifications
No
No
Limited: Workspace webhooks, configured in settings

The pipeline MCP and the API manage the same objects. The API goes further on administration (users, permissions, tags, resets) and is the only path that a scheduler can drive with a stable contract. The pipeline MCP goes further on diagnosis: get_cloud_sync_logs and show_connection_sync_history give a model the context it needs to explain a failure. The Agent MCP sits in a different column entirely. It does not know your connections exist.

What the MCP path makes easier

Airbyte's pipeline model is a chain of UUIDs: organization, workspace, source, destination, connection, job. "Why did the HubSpot sync fail last night" on the raw API means resolving the workspace, listing connections, matching the name, listing jobs, reading the failed one, and then going to the UI for logs. On the pipeline MCP, list_cloud_connections, list_cloud_sync_jobs, and get_cloud_sync_logs chain in one conversation, and check_cloud_connector tests the credential before the model suggests rotating it.

The Agent MCP does the same for business apps. A connector's entities and actions are documented as skills, and the model reads only the section it needs with read_skill_docs before it calls execute. Writing the schema is the hard part. Not the API call.

The tradeoff on both servers is that Airbyte owns the tool list. The pipeline MCP is beta, and Airbyte says features and tools may change.

The auth path each one puts you on

Airbyte MCP: OAuth sign-in, or application headers for headless agents

For interactive clients, the pipeline MCP uses OAuth 2.0 sign-in through Airbyte Cloud, with single sign-on supported. The install guide says the client "registers itself automatically," so you only supply the server URL and leave client ID, secret, and endpoint fields blank. The resulting token carries the user's Airbyte role, so the agent sees only the workspaces, connectors, and connections that user can see. What the user can't do, the agent can't do.

Headless agents, scripts, and CI jobs send an application's credentials in Client-Id and Client-Secret headers on every request, and the server exchanges them for a fresh access token each time. Optional X-Airbyte-Workspace-Id or X-Airbyte-Organization-Id headers target a non-default workspace or organization. A raw Authorization: Bearer token also works, but it expires after 15 minutes.

Destructive tools are fenced. Each tool declares whether it is read-only or destructive, and permanent deletes of connectors, connections, and custom definitions only work when the resource name contains delete-me or deleteme.

Airbyte Agent MCP: two credential layers

The Agent MCP has its own OAuth login to your Airbyte Agents account, scoped to your account and organization. The third-party systems sit behind a second layer: the agent calls a credential flow tool, the user opens a URL, and enters the Salesforce or Zendesk credential in the browser, never in chat. Airbyte stores that credential server-side. Your system holds the Airbyte token; Airbyte holds the Salesforce token.

Airbyte API: an application is the user

The direct path has no OAuth Authorization Code flow and no scopes. Airbyte's docs state that an access token "represents an individual Airbyte user, and it has the same permissions as that Airbyte user." An application created by a workspace admin gives your agent admin rights in that workspace, including deleting sources. There is no read-only application.

Three details break naive implementations:

  • Tokens expire in 15 minutes, and there is no refresh token. You re-run the client credentials exchange. Airbyte's guidance on a 401 is to fetch a new token and retry once, not to loop.
  • The body field is grant-type, hyphenated, in Airbyte's reference. Copying a standard OAuth library's grant_type is the first thing to check when the exchange fails.
  • The application dies with its owner. Airbyte recommends creating applications under a service account, because a script breaks when the person who owns the credentials leaves the organization.

Both paths still need per-user isolation

In a multi-tenant B2B agent, MCP's OAuth flow gives you a token per user and the direct API gives you a credential per user or per customer. In neither case does the path itself solve storage, rotation, or revocation; those are infrastructure problems regardless of which path you choose.

Airbyte sharpens it. On the API path, the stored secret is long-lived, unscoped, and equal to a human's full role. A leaked client_secret for a customer's admin is a leaked admin.

Recommended reading: OAuth vs API keys for AI agents

What you own in production

On the MCP path

Airbyte hosts the pipeline MCP, owns its 46 tool schemas, and maps them to the platform. You own the OAuth token per user if your product is the MCP client, or the application secret per customer if your agent runs headless with Client-Id headers. You also own the cost of reads: direct reads are capped at 100,000 per organization per month at no cost, and they count against the source system's own API rate limits. A sloppy agent can throttle a customer's Salesforce.

You also own what the server doesn't do. There is no subscription for sync events, so an agent that reacts to failures polls list_cloud_sync_jobs.

On the API path

You own schemas, retries, the token cache, and the job state machine. POST /v1/jobs returns immediately; your agent polls GET /v1/jobs/{jobId} until status leaves pending or running and lands on succeeded, failed, incomplete, or cancelled. Airbyte's API docs do not publish a request rate limit, so budget polling intervals conservatively.

For events, Airbyte's workspace notifications post Failed sync and Successful sync payloads to any webhook, with connection, jobId, recordsCommitted, and on failure errorMessage, errorType, and errorOrigin. They are configured in workspace settings, and the docs say nothing about payload signing, so treat them as a trigger to call the API, not as a trusted record.

Self-managed deployments add their own lifecycle: your URL, your TLS, and /api/public/v1 instead of /v1.

Schema drift and versioning

The API is versioned in the path and the Configuration API is gone, so the public contract is what your scheduler should depend on. The pipeline MCP is beta and changes as Airbyte adds tools; the Agent MCP shipped in 2026 and its connector skills change as Airbyte adds entities and write actions. On the API path, a change is something you adopt when you choose. On the MCP path, the tool list your agent sees can change between runs.

When to use MCP, when to use the API

Use Airbyte MCP when

  • A data engineer asks Claude Code or Cursor "why did the Postgres to Snowflake connection fail last night, and what changed in the schema," and get_cloud_sync_logs plus get_connection_artifact answer it without a dashboard.
  • An analyst needs a quick answer from live source data or a Snowflake or BigQuery destination, and execute_external_api_query or execute_external_sql_query returns it read-only.
  • A developer is building a custom source in the Connector Builder and wants the agent to publish and test the manifest with publish_custom_source_definition and check_cloud_connector.
  • Your product's users want to ask questions across their CRM and support tools without you building connectors, which is what the Agent MCP and Scalekit's airbytemcp connector are for.

Use the Airbyte API when

  • An orchestrator triggers syncs after upstream jobs finish, with POST /v1/jobs, and blocks downstream dbt models until GET /v1/jobs/{jobId} reports succeeded.
  • You provision pipelines per customer: create a source, a destination, and a connection with fixed streams and schedule for every new tenant, as a deterministic pipeline.
  • The agent resets connections, manages users and permissions, or applies tags, none of which the MCP servers expose.
  • You run self-managed Airbyte Core in production and need a stable contract rather than a beta, stdio-only local MCP.

The credential problem that exists on both paths

Both paths hand you an Airbyte credential. Neither hands you a vault. A multi-tenant agent serving 60 customer organizations with 5 data engineers each holds 300 OAuth grants on the MCP path. On the API path it holds 60 application secrets, one per customer service account, each exchanged every 15 minutes and each carrying that account's full role. Every one must be stored encrypted, kept out of logs and LLM context, and deleted when a customer churns.

The Agent MCP adds a layer rather than removing one. The user's Salesforce credential lives in Airbyte, but the Airbyte token that reaches it lives with you. Lose control of that token and you have lost control of every system the user connected behind it.

The tempting shortcut is one application under your own admin account across customers. That turns tenant isolation into a filter your prompt has to remember, and a leaked secret into access to every customer's pipelines.

Scalekit's airbytemcp connector handles the Airbyte OAuth flow, stores each user's tokens in the token vault, and refreshes them, so the MCP vs API decision doesn't change your auth infrastructure. Your agent passes an identifier; credentials never touch the agent runtime or the LLM context.

Recommended reading: why a token vault matters for AI agent workflows

How to connect an Airbyte agent with Scalekit

Scalekit's airbytemcp connector proxies Airbyte's own Agent MCP server. It exposes 20 tools: 13 read-only, 6 write, and 1 destructive (airbytemcp_delete_connector). The core set:

Tool
What it does
airbytemcp_check_enrollment_status
Checks and triggers account enrollment; call it first for a new user
airbytemcp_list_created_connectors
Lists the user's connected systems and their connector IDs
airbytemcp_inspect_connector
Returns metadata, readiness, and the docs_skill_id for a connector
airbytemcp_read_skill_docs
Reads the entities, actions, and params for execute
airbytemcp_execute
Queries, searches, or writes records, up to 10 operations per call
airbytemcp_start_credential_flow
Returns a URL where the user connects a new system in the browser

It authenticates with OAuth 2.1, and Scalekit-managed OAuth credentials are available, so you do not register your own OAuth app.

Prerequisites and the connection name

Create an Airbyte MCP connection in AgentKit > Connections in the Scalekit dashboard. The name you give it is the connection_name your code passes, and the string must match the dashboard exactly. This is the most common integration error. Copy SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID, and SCALEKIT_CLIENT_SECRET from Developers > API Credentials into .env.

pip install scalekit-sdk-python python-dotenv langchain-openai

Authorize each user once

get_or_create_connected_account returns the user's connected account. If it is not ACTIVE, get_authorization_link returns the Airbyte OAuth link the user opens once. Then airbytemcp_check_enrollment_status confirms the Airbyte Agents account is provisioned.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ) actions = scalekit_client.actions CONNECTION_NAME = "airbytemcp" # must match the connection name in AgentKit > Connections identifier = "user_123" # your app's stable ID for this user account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier, ) print("Authorize Airbyte:", link.link) input("Press Enter after signing in to Airbyte...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier, ) if account.connected_account.status != "ACTIVE": raise RuntimeError(f"Airbyte MCP is {account.connected_account.status}, not ACTIVE") enrollment = actions.execute_tool( tool_name="airbytemcp_check_enrollment_status", tool_input={}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(enrollment.execution_id, enrollment.data)

Retrieve the Airbyte tools this user can call

This is not a catalog load. The agent asks for the tools this user's connected account is authorized to call, then narrows them to the five a read-and-report agent needs. airbytemcp_delete_connector and airbytemcp_start_credential_flow never reach the model, so it cannot remove a user's Salesforce connection or start connecting new systems while answering a question.

tools = actions.langchain.get_tools( identifier=identifier, connection_names=[CONNECTION_NAME], tool_names=[ "airbytemcp_current_datetime", "airbytemcp_list_created_connectors", "airbytemcp_inspect_connector", "airbytemcp_read_skill_docs", "airbytemcp_execute", ], page_size=100, ) tool_map = {t.name: t for t in tools} print(sorted(tool_map))

Run the agent loop

The loop runs until the model stops requesting tools. Every call executes with this user's Airbyte token and sees only the connectors this user created.

from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o").bind_tools(tools) messages = [ SystemMessage( "You answer questions from the user's connected business systems through Airbyte. " "Call airbytemcp_current_datetime before resolving relative dates. " "Call airbytemcp_list_created_connectors to find connector IDs, then " "airbytemcp_inspect_connector and airbytemcp_read_skill_docs before the first " "airbytemcp_execute call for any connector. Only read data unless the user asks you to write." ), HumanMessage( "List Salesforce opportunities over $50,000 that are still open and closing this " "month, then tell me how many Zendesk tickets from those accounts are open." ), ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: tool = tool_map.get(tc["name"]) if tool: result = tool.invoke(tc["args"]) else: result = f"Unknown tool: {tc['name']}" messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Deterministic calls with execute_tool

For pipelines, skip the model. execute_tool runs one tool with a fixed input and returns data plus an execution_id you can log. This job lists the user's connectors, then fetches the skill docs for one of them so your code can build airbytemcp_execute items against the documented entity and action.

connectors = actions.execute_tool( tool_name="airbytemcp_list_created_connectors", tool_input={}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(connectors.execution_id, connectors.data) # Connector ID from the list above, stored in your config for this user connector_id = os.environ["AIRBYTE_SALESFORCE_CONNECTOR_ID"] inspected = actions.execute_tool( tool_name="airbytemcp_inspect_connector", tool_input={"connector_id": connector_id}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(inspected.execution_id, inspected.data) # docs_skill_id returned by inspect_connector docs_skill_id = os.environ["AIRBYTE_SALESFORCE_DOCS_SKILL_ID"] skill_docs = actions.execute_tool( tool_name="airbytemcp_read_skill_docs", tool_input={"id": docs_skill_id}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(skill_docs.execution_id, skill_docs.data)

Onboarding a new system is two calls. airbytemcp_start_credential_flow takes a template_id from airbytemcp_list_available_connectors and returns a URL the user opens; airbytemcp_check_credential_flow_status takes the returned session_id and, once the user finishes, creates the connector and returns its connector_id. The Salesforce credential never passes through your code or the model.

flow = actions.execute_tool( tool_name="airbytemcp_start_credential_flow", tool_input={"template_id": os.environ["AIRBYTE_ZENDESK_TEMPLATE_ID"]}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(flow.execution_id, flow.data) # contains the URL and session_id status = actions.execute_tool( tool_name="airbytemcp_check_credential_flow_status", tool_input={"session_id": os.environ["AIRBYTE_CREDENTIAL_SESSION_ID"]}, connection_name=CONNECTION_NAME, identifier=identifier, ) print(status.execution_id, status.data)

Reaching the Airbyte platform API

Scalekit does not ship a prebuilt connector for the Airbyte platform API or for mcp.airbyte.com. Scalekit custom connectors support OAUTH, BASIC, BEARER, and API_KEY auth, but not the client credentials exchange the Airbyte API requires, so on the pipeline path the application secret and the 15-minute token loop stay in your code. Keep it small and server-side:

import os import time import requests AIRBYTE_API = "https://api.airbyte.com/v1" # self-managed: https://<your-host>/api/public/v1 def airbyte_token(client_id: str, client_secret: str) -> str: resp = requests.post( f"{AIRBYTE_API}/applications/token", json={ "client_id": client_id, "client_secret": client_secret, "grant-type": "client_credentials", }, timeout=30, ) resp.raise_for_status() return resp.json()["access_token"] # expires_in is 900 seconds token = airbyte_token(os.environ["AIRBYTE_CLIENT_ID"], os.environ["AIRBYTE_CLIENT_SECRET"]) headers = {"Authorization": f"Bearer {token}"} job = requests.post( f"{AIRBYTE_API}/jobs", json={"connectionId": os.environ["AIRBYTE_CONNECTION_ID"], "jobType": "sync"}, headers=headers, timeout=30, ) job.raise_for_status() job_id = job.json()["jobId"] while True: status = requests.get(f"{AIRBYTE_API}/jobs/{job_id}", headers=headers, timeout=30) if status.status_code == 401: token = airbyte_token(os.environ["AIRBYTE_CLIENT_ID"], os.environ["AIRBYTE_CLIENT_SECRET"]) headers = {"Authorization": f"Bearer {token}"} continue status.raise_for_status() body = status.json() if body["status"] not in ("pending", "running"): print(job_id, body["status"], body.get("rowsSynced"), body.get("bytesSynced")) break time.sleep(30)

Create the application under a service account with the narrowest workspace role that can run syncs, one per customer organization.

Multi-tool, multi-tenant Airbyte agents on a virtual MCP server

A data-ops assistant rarely stops at one system. It reads the user's CRM through Airbyte, then posts a summary where the team works. Load all 20 airbytemcp tools and the model holds airbytemcp_delete_connector, organization switching, and credential flows while answering a reporting question. A Scalekit virtual MCP server declares exactly which tools an agent role can see across connections, and session tokens keep each run bound to one user's connected accounts. Docs: set up a virtual MCP server.

Create the server once per agent role

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping vmcp = actions.mcp.create_config( name="airbyte-pipeline-digest", description="Reads CRM and support data through Airbyte and posts a daily digest to Slack", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="airbytemcp", tools=[ "airbytemcp_current_datetime", "airbytemcp_list_created_connectors", "airbytemcp_inspect_connector", "airbytemcp_read_skill_docs", "airbytemcp_execute", ], ), McpConfigConnectionToolMapping( connection_name="slack", tools=["slack_send_message"], ), ], ) print(vmcp.config.id, vmcp.config.mcp_server_url)

Mint a session token per user, per run

One server definition serves every user. Before each run, check that the user's accounts are active and mint a short-lived session token scoped to them. Any MCP client that speaks Streamable HTTP can connect; this example uses langchain-mcp-adapters (pip install langchain-mcp-adapters) and passes the token as a Bearer header.

import asyncio from datetime import timedelta from langchain_mcp_adapters.client import MultiServerMCPClient config_id = vmcp.config.id mcp_server_url = vmcp.config.mcp_server_url user_id = "user_123" accounts = actions.mcp.list_mcp_connected_accounts( config_id=config_id, identifier=user_id, include_auth_link=True, ) not_ready = [ a for a in accounts.connected_accounts if str(a.connected_account_status).upper() != "ACTIVE" ] for a in not_ready: print(f"{a.connection_name} is {a.connected_account_status}: {a.authentication_link}") if not_ready: raise RuntimeError("Connect the accounts above before starting this run") session_token = actions.mcp.create_session_token( mcp_config_id=config_id, identifier=user_id, expiry=timedelta(minutes=30), ).token async def load_tools(): client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": mcp_server_url, "headers": {"Authorization": f"Bearer {session_token}"}, } } ) return await client.get_tools() mcp_tools = asyncio.run(load_tools()) print([t.name for t in mcp_tools])

The agent sees six tools instead of 20 plus everything Slack exposes. The endpoint is static; the identity is per-user.

Observability: every Airbyte action tied to a user

Every execute_tool call returns an execution_id, and every execution is attributed to a connected account, which maps to one of your users and one customer. When a customer asks which agent run wrote to a HubSpot record through airbytemcp_execute, the answer is a lookup, not an investigation.

The API path is weaker by construction. A token from an application "represents an individual Airbyte user," so every sync your orchestrator triggers is recorded in Airbyte as that user. If one service account's application drives every agent, Airbyte attributes every job to it, and your side has to reconstruct which agent run, which prompt, and which customer request led there. Shared credentials are a single-user solution. They do not survive a second user.

Recommended reading: audit trails for agent auth

Which one to build against

If your agent is a data engineer's assistant inside Claude Code or Cursor, diagnosing failed syncs, reading logs, and testing connector configs with a human watching, use the Airbyte MCP at mcp.airbyte.com: it is hosted, free, and its troubleshooting tools do real work, with the caveat that it is beta. If your agent answers questions from business apps for your product's users, the Agent MCP is the right surface, and Scalekit's airbytemcp connector gives it per-user OAuth without an app registration. If your agent triggers syncs on a schedule, provisions pipelines per tenant, resets connections, or runs against self-managed Core, build against the Airbyte API. Either way, you hold one Airbyte credential per user or per customer, each worth a full Airbyte role, and that's what needs production-grade infrastructure.

FAQs

What is the difference between Airbyte MCP and Airbyte Agent MCP?

The Airbyte MCP at mcp.airbyte.com manages data pipelines in Airbyte Cloud: connectors, connections, syncs, logs, and custom connector manifests, with 46 tools in open beta. The Airbyte Agent MCP at mcp.airbyte.ai belongs to Airbyte Agents, launched in May 2026, and queries business apps such as Salesforce and Zendesk through agent connectors and a managed Context Store. It does not know your pipelines exist.

Can the Airbyte MCP server be used with self-managed Airbyte?

The hosted server applies to Airbyte Cloud and Flex only. For self-managed Airbyte Core you run the same MCP locally over stdio with uvx, pointed at your instance's public API URL with an application's client ID, client secret, and workspace ID. Pipeline tools work there; the context layer and direct reads are Cloud only, and PyAirbyte marks the local server experimental.

How does Airbyte API authentication work?

There is one method. You create an application under User settings, then exchange its client_id and client_secret at /v1/applications/token for a Bearer token that expires after 15 minutes with no refresh token. The body field is grant-type, hyphenated. The token carries every permission of the user who created the application, with no scopes, and the application stops working when that user leaves, which is why Airbyte recommends creating it under a service account.

Does Airbyte send webhooks when a sync fails?

Workspace notifications can post Failed sync and Successful sync payloads to any webhook URL, carrying the connection, job ID, records committed, and on failure the error message, type, and origin. They are configured in workspace settings and the docs say nothing about payload signing, so treat them as a trigger to call the API rather than a trusted record. Neither MCP server offers a subscription.

When should an agent use the Airbyte API instead of MCP?

When an orchestrator triggers syncs after upstream jobs and blocks downstream models until the job reports succeeded, when pipelines are provisioned per customer as a deterministic flow, when the agent resets connections or manages users, permissions, and tags, or when it runs against self-managed Core and needs a stable contract rather than a beta, stdio-only local MCP.

How does Scalekit connect an AI agent to Airbyte?

The airbytemcp connector proxies Airbyte's Agent MCP with 20 tools and OAuth 2.1, and Scalekit-managed OAuth credentials mean no app registration. Each user signs in once, Scalekit stores and refreshes the tokens in the token vault, a virtual MCP server narrows the tools per agent role, and every execution returns an execution_id. The pipeline API's client credentials exchange is not a supported custom connector auth type, so that loop stays in your own server-side code.

Build your Airbyte agent with Scalekit

Browse the Scalekit Airbyte MCP connector and the Airbyte MCP connector docs with the full tool list. See Scalekit pricing, or talk to us.

No items found.
On this page
Share this article

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.