Skip to content

feat(mcp): always-on HTTP auth via typed build_mcp_auth with Airbyte Cloud defaults - #1084

Open
Aaron ("AJ") Steers (aaronsteers) wants to merge 25 commits into
mainfrom
devin/1784611568-cloud-mcp-airbyte-branded-auth
Open

feat(mcp): always-on HTTP auth via typed build_mcp_auth with Airbyte Cloud defaults#1084
Aaron ("AJ") Steers (aaronsteers) wants to merge 25 commits into
mainfrom
devin/1784611568-cloud-mcp-airbyte-branded-auth

Conversation

@aaronsteers

@aaronsteers Aaron ("AJ") Steers (aaronsteers) commented Jul 21, 2026

Copy link
Copy Markdown
Member

Summary

Running the Airbyte MCP server over HTTP now always authenticates, targeting Airbyte Cloud out of the box with zero auth config. This replaces the previous opt-in MCP_AUTH_AIRBYTE_CLOUD=true boolean, which meant a hosted deployment that set only OIDC_* silently accepted no headless bearer tokens (the bug that let a valid minted Airbyte Cloud token get 401ed on prod).

This server owns the Airbyte Cloud realm literals (public, non-secret) as defaults and maps its own Airbyte-branded env vars into the typed config objects fastmcp_extensions.build_mcp_auth consumes, so the extensions library stays provider-agnostic (it reads no environment variables of its own).

fastmcp-extensions 0.14.0 migration (breaking upstream)

fastmcp-extensions 0.14.0 removed the library-side env-var mapping (resolve_mcp_auth and its generic OIDC_* / MCP_AUTH_* parsing). This PR bumps the floor to >=0.14.0,<1.0.0 and moves the env→config translation into this server:

# before: library parsed generic env names
return resolve_mcp_auth(env=resolved_env)

# after: server maps branded env -> typed config, library just assembles
jwt = JWTAuthConfig(
    jwks_uri=jwks_uri or None,
    public_key=public_key or None,
    issuer=_env_or_default(JWT_ISSUER_ENV, AIRBYTE_CLOUD_ISSUER),
    audience=_env_or_default(JWT_AUDIENCE_ENV, AIRBYTE_CLOUD_AUDIENCE),
    algorithm=_env_or_default(JWT_ALGORITHM_ENV, AIRBYTE_CLOUD_ALGORITHM),
    base_url=base_url,
)
oidc = None
if oidc_client_id and oidc_client_secret:
    oidc = OIDCAuthConfig(
        config_url=_env_or_default(OIDC_CONFIG_URL_ENV, AIRBYTE_CLOUD_OIDC_CONFIG_URL),
        client_id=oidc_client_id,
        client_secret=oidc_client_secret,
        base_url=base_url,
    )
return build_mcp_auth(oidc=oidc, jwt=jwt, base_url=base_url)

The operator-facing env-var surface is unchanged — only the internal hop to generic names is gone. _resolve_signing_key() now returns a (jwks_uri, public_key) tuple instead of a generic-name dict.

Behavior (unchanged by the migration)

  • HTTP transport ⇒ a JWTVerifier is always built against Airbyte Cloud's _airbyte-application-clients realm (headless bearer works by default).
  • Interactive OIDC additionally activates once both OIDC client credentials are supplied (discovery URL defaults to Airbyte Cloud's airbyte realm).
  • Both combined via MultiAuth; HTTP startup fails fast if no auth provider resolves.
  • Static public key vs baked Cloud JWKS: the Cloud JWKS default applies only when neither an explicit JWKS URI nor a static public key is set.
  • Every default is overridable via the branded AIRBYTE_MCP_* env vars for self-hosted deployments.

Env var surface (server-owned branded names)

AIRBYTE_MCP_OIDC_CONFIG_URL      (default: Cloud `airbyte` realm discovery)
AIRBYTE_MCP_OIDC_CLIENT_ID       (no default; deploy-provided)
AIRBYTE_MCP_OIDC_CLIENT_SECRET   (no default; secret)
AIRBYTE_MCP_AUTH_JWKS_URI        (default: Cloud app-client realm certs)
AIRBYTE_MCP_AUTH_JWT_PUBLIC_KEY  (static-key alternative to JWKS; no default)
AIRBYTE_MCP_AUTH_ISSUER          (default: .../realms/_airbyte-application-clients)
AIRBYTE_MCP_AUTH_AUDIENCE        (default: account)
AIRBYTE_MCP_AUTH_ALGORITHM       (default: RS256)

MCP_SERVER_URL unchanged (per-deploy public base URL / OIDC redirect base); defaults to http://localhost:8080.

Opt-in: static client credentials via HTTP Basic

Behind AIRBYTE_MCP_AUTH_ALLOW_CLIENT_CREDENTIALS (off by default), the server accepts long-lived credentials via standard HTTP Basic (client_secret_basic), exchanges them for a short-lived token server-side (async-locked, cached until shortly before expiry), rewrites to Authorization: Bearer <token>, and lets the existing JWT verifier handle it. Bearer, unauthenticated, and malformed-Basic requests pass through unchanged. No custom headers, no URL credentials, no secrets/tokens logged.

Test plan

  • poe check (ruff, pyrefly, collect-only) clean locally.
  • tests/unit_tests/test_mcp_server_auth.py updated for the typed API: _resolve_signing_key tuple return, plus new build_mcp_auth-spy tests asserting the Cloud JWT defaults, branded-env claim overrides, OIDC activation only when both credentials present, and no OIDC on the bearer-only path.
  • test_mcp_server_auth.py + test_mcp_client_credentials.py: 31 passed locally.

Requested by AJ.

Link to Devin session: https://app.devin.ai/sessions/0b0d7690d5354d5c95e12ccf1b2e620e
Requested by: Aaron ("AJ") Steers (@aaronsteers)

@devin-ai-integration

Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

Copy link
Copy Markdown

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

Testing This PyAirbyte Version

You can test this version of PyAirbyte using the following:

# Run PyAirbyte CLI from this branch:
uvx --from 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1784611568-cloud-mcp-airbyte-branded-auth' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1784611568-cloud-mcp-airbyte-branded-auth'

PR Slash Commands

Airbyte Maintainers can execute the following slash commands on your PR:

  • /fix-pr - Fixes most formatting and linting issues
  • /uv-lock - Updates uv.lock file
  • /test-pr - Runs tests with the updated PyAirbyte
  • /prerelease - Builds and publishes a prerelease version to PyPI
📚 Show Repo Guidance

Helpful Resources

Community Support

Questions? Join the #pyairbyte channel in our Slack workspace.

📝 Edit this welcome message.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR changes the MCP HTTP transport to be authenticated by default (targeting Airbyte Cloud out-of-the-box), and updates the server-side auth wiring so Airbyte-branded environment variables are translated into the generic names consumed by fastmcp_extensions.resolve_mcp_auth.

Changes:

  • Default HTTP auth to Airbyte Cloud Keycloak realms (JWT verification always configured; interactive OIDC activates once client creds are provided).
  • Replace the old MCP_AUTH_AIRBYTE_CLOUD opt-in with baked-in Cloud defaults + an AIRBYTE_MCP_* env-var surface mapped into generic OIDC_* / MCP_AUTH_*.
  • Update HTTP entrypoint and package docs to reflect the new defaults and env vars.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
airbyte/mcp/server.py Introduces baked Airbyte Cloud auth defaults and maps AIRBYTE_MCP_* env vars into resolve_mcp_auth.
airbyte/mcp/http_main.py Updates HTTP entrypoint documentation and adjusts the “no auth” warning messaging.
airbyte/mcp/__init__.py Updates user-facing docs for HTTP auth behavior and server env-var configuration.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread airbyte/mcp/server.py Outdated
Comment thread airbyte/mcp/http_main.py
Comment thread airbyte/mcp/__init__.py
Comment thread airbyte/mcp/http_main.py

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

View 1 additional finding in Devin Review.

Open in Devin Review

Comment thread airbyte/mcp/server.py Outdated
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

HTTP MCP authentication now resolves Airbyte-specific settings into fastmcp_extensions, defaults to Airbyte Cloud verification, and supports interactive OIDC, bearer tokens, and optional Basic client-credential exchange. HTTP startup builds the wrapped ASGI application and fails when authentication is unresolved.

Changes

MCP HTTP authentication

Layer / File(s) Summary
Authentication resolution wiring
airbyte/mcp/server.py
Airbyte-specific environment variables are translated into OIDC and JWT verifier settings, with Airbyte Cloud defaults and self-hosted overrides passed to resolve_mcp_auth.
Basic client-credentials exchange
airbyte/mcp/_client_credentials.py, tests/unit_tests/test_mcp_client_credentials.py, pyproject.toml
Opt-in Basic credentials are decoded, exchanged for cached short-lived bearer tokens, rewritten for downstream verification, and covered by unit tests; HTTPX and Uvicorn are added as runtime dependencies.
HTTP startup and authentication contract
airbyte/mcp/http_main.py, airbyte/mcp/__init__.py
HTTP startup constructs and runs an ASGI app, applies the optional exchange wrapper, raises when authentication is unresolved, and documents supported authentication modes and variables.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MCPClient
  participant HTTPEntrypoint
  participant ClientCredentialsExchangeMiddleware
  participant AirbyteTokenEndpoint
  participant FastMCPAuth
  MCPClient->>HTTPEntrypoint: HTTP request
  HTTPEntrypoint->>ClientCredentialsExchangeMiddleware: Wrapped ASGI request
  ClientCredentialsExchangeMiddleware->>AirbyteTokenEndpoint: Exchange Basic credentials when enabled
  AirbyteTokenEndpoint-->>ClientCredentialsExchangeMiddleware: Short-lived access_token
  ClientCredentialsExchangeMiddleware->>FastMCPAuth: Forward Basic or rewritten Bearer request
  FastMCPAuth-->>MCPClient: Authenticated MCP response
Loading

Possibly related PRs

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 94.12% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main change: HTTP auth is now always required with Airbyte Cloud defaults.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch devin/1784611568-cloud-mcp-airbyte-branded-auth

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
airbyte/mcp/server.py (1)

144-152: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider warning on legacy bare OIDC_CLIENT_ID/OIDC_CLIENT_SECRET.

Per the PR objectives, deployments using the old bare OIDC_CLIENT_ID/OIDC_CLIENT_SECRET must rename to AIRBYTE_MCP_OIDC_CLIENT_ID/AIRBYTE_MCP_OIDC_CLIENT_SECRET. Since _create_auth() only reads the new prefixed names, an operator who forgets to rename gets silent no-OIDC behavior rather than a signal. A one-line check (e.g. warn if the bare names are set in os.environ but the prefixed ones aren't) would catch this migration foot-gun cheaply, wdyt?

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@airbyte/mcp/server.py` around lines 144 - 152, Update the authentication
setup around _AUTH_ENV_MAP and _create_auth() to warn when legacy bare
OIDC_CLIENT_ID or OIDC_CLIENT_SECRET is present in os.environ while its
corresponding AIRBYTE_MCP-prefixed variable is unset. Keep _create_auth()
reading only the new prefixed names, and emit a clear migration warning for each
detected legacy variable.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@airbyte/mcp/server.py`:
- Around line 144-152: Update the authentication setup around _AUTH_ENV_MAP and
_create_auth() to warn when legacy bare OIDC_CLIENT_ID or OIDC_CLIENT_SECRET is
present in os.environ while its corresponding AIRBYTE_MCP-prefixed variable is
unset. Keep _create_auth() reading only the new prefixed names, and emit a clear
migration warning for each detected legacy variable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 0278a2c4-9cde-4e8c-a815-ec773aa41d0f

📥 Commits

Reviewing files that changed from the base of the PR and between 65e4309 and feb9cec.

📒 Files selected for processing (3)
  • airbyte/mcp/__init__.py
  • airbyte/mcp/http_main.py
  • airbyte/mcp/server.py

@github-code-quality

github-code-quality Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: Python

Python / code-coverage/pytest-fast

The overall coverage in commit f14290d in the devin/1784611568-clo... branch is 68%. The coverage in commit d9f652f in the main branch is 65%.

Show a code coverage summary of the most impacted files.
File main d9f652f devin/1784611568-clo... f14290d +/-
airbyte/mcp/_tool_utils.py 72% 84% +12%
airbyte/mcp/server.py 69% 86% +17%
airbyte/mcp/registry.py 53% 70% +17%
airbyte/mcp/_arg_resolvers.py 13% 44% +31%
airbyte/mcp/int...c_history_ui.py 0% 36% +36%
airbyte/mcp/int...hared_models.py 0% 81% +81%
airbyte/cloud/models.py 0% 91% +91%
airbyte/mcp/int..._registry_ui.py 0% 92% +92%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%
airbyte/mcp/_cl..._credentials.py 0% 100% +100%

Python / code-coverage/pytest-no-creds

The overall coverage in commit f14290d in the devin/1784611568-clo... branch is 68%. The coverage in commit d9f652f in the main branch is 65%.

Show a code coverage summary of the most impacted files.
File main d9f652f devin/1784611568-clo... f14290d +/-
airbyte/mcp/_tool_utils.py 72% 84% +12%
airbyte/mcp/server.py 69% 86% +17%
airbyte/mcp/registry.py 53% 70% +17%
airbyte/mcp/_arg_resolvers.py 13% 44% +31%
airbyte/mcp/int...c_history_ui.py 0% 36% +36%
airbyte/mcp/int...hared_models.py 0% 81% +81%
airbyte/cloud/models.py 0% 91% +91%
airbyte/mcp/int..._registry_ui.py 0% 92% +92%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%
airbyte/mcp/_cl..._credentials.py 0% 100% +100%

Python / code-coverage/pytest

The overall coverage in commit f14290d in the devin/1784611568-clo... branch is 73%. The coverage in commit d9f652f in the main branch is 71%.

Show a code coverage summary of the most impacted files.
File main d9f652f devin/1784611568-clo... f14290d +/-
airbyte/mcp/_tool_utils.py 72% 84% +12%
airbyte/mcp/server.py 69% 86% +17%
airbyte/mcp/registry.py 53% 70% +17%
airbyte/mcp/_arg_resolvers.py 13% 44% +31%
airbyte/mcp/int...c_history_ui.py 0% 36% +36%
airbyte/mcp/int...hared_models.py 0% 81% +81%
airbyte/mcp/int..._registry_ui.py 0% 92% +92%
airbyte/cloud/models.py 0% 93% +93%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%
airbyte/mcp/_cl..._credentials.py 0% 100% +100%

Updated July 24, 2026 01:43 UTC

devin-ai-integration Bot and others added 3 commits July 21, 2026 05:57
… shadowed by the baked JWKS default

Co-Authored-By: AJ Steers <aj@airbyte.io>
Add AIRBYTE_MCP_AUTH_ALLOW_CLIENT_CREDENTIALS (off by default). When set, the
server accepts Authorization: Basic base64(client_id:client_secret), exchanges
it for a short-lived bearer token server-side (cached until shortly before
expiry, guarded by an async lock), and rewrites the request to Bearer so the
existing JWTVerifier validates it. Runs as the outermost ASGI layer, ahead of
FastMCP's auth middleware. Bearer/OIDC paths and fail-closed startup unchanged.

Co-Authored-By: AJ Steers <aj@airbyte.io>
Resolve http_main.py: keep the outermost client-credentials ASGI wrap (uvicorn)
while adding main's assert_http_trusted_execution_disabled startup guard.

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/mcp/server.py Fixed
The HTTP client-credentials exchange imports httpx and the HTTP entrypoint
runs uvicorn directly; both were previously transitive (deptry DEP003).

Co-Authored-By: AJ Steers <aj@airbyte.io>
@devin-ai-integration devin-ai-integration Bot changed the title feat(mcp): always-on HTTP auth with baked Airbyte Cloud defaults feat(mcp): always-on HTTP auth with baked Airbyte Cloud defaults + opt-in Basic client credentials Jul 21, 2026
Avoids a CodeQL clear-text-logging false positive: the migration warning only
logs env var *names*, but reading OIDC_CLIENT_SECRET via os.getenv created a
sensitive-data taint source. Membership checks never read the value.

Co-Authored-By: AJ Steers <aj@airbyte.io>
@devin-ai-integration
devin-ai-integration Bot requested a review from Copilot July 21, 2026 06:05

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@airbyte/mcp/_client_credentials.py`:
- Around line 82-95: Replace the global self._lock in the credential caching
flow with locks keyed by the per-credential cache key, and use the corresponding
lock in the request/token exchange path around cache access and minting. Ensure
different credential pairs proceed independently while concurrent requests for
the same credential remain serialized.
- Around line 137-170: Update _mint_token to catch httpx.HTTPError from the
token request and ValueError from response.json(), log a warning without
exposing credentials or tokens, and return None for either failure so token
verification continues through the existing fail-closed path.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5e197e3c-37a4-4214-aa6f-bf98e142237e

📥 Commits

Reviewing files that changed from the base of the PR and between feb9cec and 1d28bfa.

📒 Files selected for processing (4)
  • airbyte/mcp/__init__.py
  • airbyte/mcp/_client_credentials.py
  • airbyte/mcp/http_main.py
  • airbyte/mcp/server.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • airbyte/mcp/init.py

Comment thread airbyte/mcp/_client_credentials.py Outdated
Comment thread airbyte/mcp/_client_credentials.py Outdated
- Wrap the client-credentials token request in try/except for httpx.HTTPError
  and response.json() ValueError so an unreachable/non-JSON token endpoint falls
  through to the verifier (401) instead of surfacing a 500.
- Replace the single asyncio.Lock with a per-credential lock so a slow token
  endpoint stalls only the affected credential, not all Basic-auth traffic.

Addresses CodeRabbit review on #1084.

Co-Authored-By: AJ Steers <aj@airbyte.io>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 5 out of 6 changed files in this pull request and generated 4 comments.

Comment thread airbyte/mcp/_client_credentials.py Outdated
Comment thread airbyte/mcp/_client_credentials.py Outdated
Comment thread airbyte/mcp/_client_credentials.py Outdated
Comment thread airbyte/mcp/_client_credentials.py Outdated
…view

- Drop the branded (secret-named) replacement var from the legacy-env
  warning so no secret-named symbol reaches the log sink (CodeQL false
  positive on the OIDC_CLIENT_SECRET_ENV constant); still names the
  legacy vars.
- Use public Mapping[str, str] instead of private os._Environ for the
  client_credentials_enabled env param.
- Add unit tests for the opt-in Basic client-credentials middleware
  (enable flag, Basic decode, cache key, bearer rewrite, routing,
  caching, and fail-through).

Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread pyproject.toml Outdated
Copilot AI review requested due to automatic review settings July 22, 2026 22:07
Save and restore the ambient AIRBYTE_MCP_ENV_FILE around the module-import-time
pop so importing airbyte.mcp.server for these tests no longer permanently mutates
the process environment for other test modules.

Co-Authored-By: AJ Steers <aj@airbyte.io>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated no new comments.

Copilot AI review requested due to automatic review settings July 22, 2026 23:27

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated no new comments.

Match the merged ops-mcp server (airbytehq/airbyte-ops-mcp#1135): the
cloud-mcp server reads only the branded AIRBYTE_MCP_OIDC_* / AIRBYTE_MCP_AUTH_*
names, so the pre-rename generic names are simply unrecognized. Remove the
_LEGACY_AUTH_ENV map and _warn_on_legacy_auth_env migration warning per the
no-backwards-compatibility directive.

Co-Authored-By: AJ Steers <aj@airbyte.io>
Copilot AI review requested due to automatic review settings July 23, 2026 21:07

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Comment thread airbyte/mcp/server.py Outdated
fastmcp-extensions 0.14.0 drops the library's env-var auth mapping
(resolve_mcp_auth). Map the server's AIRBYTE_MCP_* env vars directly into
JWTAuthConfig / OIDCAuthConfig and call build_mcp_auth. _resolve_signing_key
now returns a (jwks_uri, public_key) tuple. Behavior preserved: Airbyte Cloud
realm defaults with zero config, static-key-not-shadowed precedence, and
interactive OIDC only when both client credentials are present.

Co-Authored-By: AJ Steers <aj@airbyte.io>
Copilot AI review requested due to automatic review settings July 24, 2026 01:08
@devin-ai-integration devin-ai-integration Bot changed the title feat(mcp): always-on HTTP auth with baked Airbyte Cloud defaults + opt-in Basic client credentials feat(mcp): always-on HTTP auth via typed build_mcp_auth with Airbyte Cloud defaults Jul 24, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Comment thread airbyte/mcp/__init__.py Outdated
…sing in lib)

Co-Authored-By: AJ Steers <aj@airbyte.io>
Copilot AI review requested due to automatic review settings July 24, 2026 01:12

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Comment thread tests/unit_tests/test_mcp_server_auth.py Outdated
Copilot AI review requested due to automatic review settings July 24, 2026 01:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.

Comment thread airbyte/mcp/__init__.py Outdated
Copilot AI review requested due to automatic review settings July 24, 2026 01:20

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 8 changed files in this pull request and generated no new comments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants