Skip to content

feat(mcp): Simplify deployment of Replication MCP server over HTTPS#1069

Draft
Ella6882 wants to merge 1 commit into
airbytehq:mainfrom
Ella6882:feat/mcp-https-dust-deployment
Draft

feat(mcp): Simplify deployment of Replication MCP server over HTTPS#1069
Ella6882 wants to merge 1 commit into
airbytehq:mainfrom
Ella6882:feat/mcp-https-dust-deployment

Conversation

@Ella6882

@Ella6882 Ella6882 commented Jul 7, 2026

Copy link
Copy Markdown

Description

  1. Add HTTPS deployment documentation
    Create docs/MCP_HTTP_DEPLOYMENT.md covering:
  • Architecture: TLS at reverse proxy → airbyte-mcp-http on :8080
  • Docker quick start (Dockerfile.mcp)
  • Environment variables (MCP_SERVER_URL, OIDC, secrets file)
  • MCP endpoint URL behavior (/mcp vs path-stripped deployments)
  • Remote client integration:
  • Public URL to register in the client
  • Auth options: Bearer token, OIDC, network-level protection
  • Optional CORS for browser-based OAuth flows
  1. Add self-hosted deployment examples
    Add deploy/docker-compose.mcp.yml and a reverse-proxy config (e.g. Caddy) for a reference stack:
  • MCP server container (airbyte-mcp-http)
  • Reverse proxy with automatic TLS
  • Health check on /health
  1. Optional CORS support
    Add MCP_CORS_ORIGINS (comma-separated origins) and wire it into the HTTP transport for clients that need CORS (e.g. OAuth in the browser). Include MCP and Airbyte credential headers.

  2. Improve discoverability

  • Update airbyte/mcp/init.py with a hosted HTTPS section linking to the new guide
  • Update docs/CONTRIBUTING.md with a dev task for the production transport
  • Add poe mcp-serve-streamable-http in pyproject.toml
  1. Tests
    Unit tests for CORS origin parsing and middleware configuration.

Relates

Testing

uv run pytest tests/unit_tests/test_mcp_http_config.py -v
============================= test session starts ==============================
platform darwin -- Python 3.12.8, pytest-8.4.2, pluggy-1.6.0 -- /Users/ellarunciman/github/PyAirbyte/.venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/ellarunciman/github/PyAirbyte
configfile: pyproject.toml
plugins: anyio-4.12.1, mock-3.15.1, docker-3.2.5, timeout-2.4.0, Faker-21.0.1, logfire-4.19.0
timeout: 600.0s
timeout method: signal
timeout func_only: False
collected 4 items                                                                                         

tests/unit_tests/test_mcp_http_config.py::test_parse_cors_origins_empty PASSED                      [ 25%]
tests/unit_tests/test_mcp_http_config.py::test_parse_cors_origins_trims_and_splits PASSED           [ 50%]
tests/unit_tests/test_mcp_http_config.py::test_build_http_middleware_without_origins PASSED         [ 75%]
tests/unit_tests/test_mcp_http_config.py::test_build_http_middleware_with_origins PASSED            [100%]

============================================ warnings summary =============================================
<frozen abc>:106
<frozen abc>:106
<frozen abc>:106
  ExperimentalClassWarning: This class is experimental. Use at your own risk.

airbyte/secrets/base.py:125: 10 warnings
  DeprecationWarning: The `field_name` argument on `with_info_after_validator_function` is deprecated, it will be passed to the function through `ValidationState` instead.

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
------ generated xml file: /Users/ellarunciman/github/PyAirbyte/build/test-results/test-results.xml -------
===================================== 4 passed, 13 warnings in 2.88s ======================================

and

confirm successful Streamable HTTP MCP handshake:

curl -s http://127.0.0.1:8080/health
{"status":"ok"}%        

curl -s -X POST http://127.0.0.1:8080/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
event: message
data: {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{"experimental":{},"logging":{},"prompts":{"listChanged":true},"resources":{"subscribe":false,"listChanged":true},"tools":{"listChanged":true},"extensions":{"io.modelcontextprotocol/ui":{}}},"serverInfo":{"name":"airbyte-mcp","version":"3.2.0"},"instructions":"PyAirbyte connector management and data integration server for discovering,\ndeploying, and running Airbyte connectors.\n\nUse this server for:\n- Discovering connectors from the Airbyte registry (sources and destinations)\n- Deploying sources, destinations,and connections to Airbyte Cloud\n- Running cloud syncs and monitoring sync status\n- Managing custom connector definitions in Airbyte Cloud\n- Local connector execution for data extraction without cloud deployment\n- Listing and describing environment variables for connector configuration\n\nOperational modes:\n- Cloud operations: Deploy and manage connectors on Airbyte Cloud (requires\n  AIRBYTE_CLOUD_CLIENT_ID, AIRBYTE_CLOUD_CLIENT_SECRET, AIRBYTE_CLOUD_WORKSPACE_ID)\n- Local operations: Run connectors locally for data extraction (requires\n  AIRBYTE_PROJECT_DIR for artifact storage)\n\nSafety features:\n- Safe mode (default): Restricts destructive operations to objects created in\n  the current session\n- Read-only mode: Disables all write operations for cloud resources"}}               

and

can List tools in MCP Inspector

uv run poe mcp-tool-test list_connectors '{}'
Poe => python -m fastmcp_extensions.utils.test_tool --app airbyte.mcp.server:app list_connectors '{}'
<frozen runpy>:128: RuntimeWarning: 'fastmcp_extensions.utils.test_tool' found in sys.modules after import of package 'fastmcp_extensions.utils', but prior to execution of 'fastmcp_extensions.utils.test_tool'; this may result in unpredictable behaviour
Running in MCP mode: Airbyte Replication MCP v0.49.0a2 (Python v3.12.8)
CallToolResult(content=[TextContent(type='text', text='["destination-astra","destination-aws-datalake","destination-azure-blob-storage","destination-bigquery","destination-chroma","destination-clickhouse","destination-convex","destination-csv","destination-customer-io","destination-databricks","destination-deepset","destination-dev-null","destination-duckdb","destination-dynamodb","destination-elasticsearch","destination-firebolt","destination-firestore","destination-gcs","destination-gcs-data-lake","destination-glassflow","destination-google-sheets","destination-hubspot","destination-kafka","destination-local-json","destination-milvus","destination-mongodb","destination-motherduck","destination-mssql","destination-mssql-v2","destination-mysql","destination-oracle","destination-pgvector","destination-pinecone","destination-postgres","destination-pubsub","destination-qdrant","destination-rabbitmq","destination-ragie","destination-redis","destination-redshift","destination-s3","destination-s3-data-lake","destination-s3-glue","destination-salesforce","destination-sftp-json","destination-snowflake","destination-snowflake-cortex","destination-sqlite","destination-starburst-galaxy","destination-surrealdb","destination-teradata","destination-timeplus","destination-typesense","destination-vectara","destination-weaviate","destination-yellowbrick","source-100ms","source-7shifts","source-activecampaign","source-acuity-scheduling","source-adjust","source-adobe-commerce-magento","source-agilecrm","source-aha","source-airbyte","source-aircall","source-airtable","source-akeneo","source-algolia","source-alpaca-broker-api","source-alpha-vantage","source-amazon-ads","source-amazon-seller-partner","source-amazon-sqs","source-amplitude","source-apify-dataset","source-appcues","source-appfigures","source-appfollow","source-apple-search-ads","source-appsflyer","source-apptivo","source-asana","source-ashby","source-assemblyai","source-auth0","source-aviationstack","source-avni","source-awin-advertiser","source-aws-cloudtrail","source-azure-blob-storage","source-azure-table","source-babelforce","source-bamboo-hr","source-basecamp","source-beamer","source-bigmailer","source-bigquery","source-bing-ads","source-bitly","source-blogger","source-bluetally","source-boldsign","source-box","source-box-data-extract","source-braintree","source-braze","source-breezometer","source-breezy-hr","source-brevo","source-brex","source-bugsnag","source-buildkite","source-bunny-inc","source-buzzsprout","source-cal-com","source-calendly","source-callrail","source-campaign-monitor","source-campayn","source-canny","source-capsule-crm","source-captain-data","source-care-quality-commission","source-cart","source-castor-edc","source-chameleon","source-chargebee","source-chargedesk","source-chargify","source-chartmogul","source-chift","source-churnkey","source-cimis","source-cin7","source-circa","source-circleci","source-cisco-meraki","source-clarif-ai","source-clazar","source-clickhouse","source-clickup-api","source-clockify","source-clockodo","source-close-com","source-cloudbeds","source-coassemble","source-cockroachdb","source-coda","source-codefresh","source-coin-api","source-coingecko-coins","source-coinmarketcap","source-commcare","source-commercetools","source-concord","source-configcat","source-confluence","source-convertkit","source-convex","source-copper","source-couchbase","source-countercyclical","source-criteo-marketing","source-customer-io","source-customerly","source-datadog","source-datagen","source-datascope","source-db2","source-db2-enterprise","source-dbt","source-defillama","source-delighted","source-deputy","source-devin-ai","source-ding-connect","source-discord","source-dixa","source-dockerhub","source-docuseal","source-dolibarr","source-dremio","source-drift","source-drip","source-dropbox-sign","source-dwolla","source-dynamodb","source-e-conomic","source-e2e-test","source-easypost","source-easypromos","source-ebay-finance","source-ebay-fulfillment","source-elasticemail","source-elasticsearch","source-emailoctopus","source-employment-hero","source-encharge","source-eventbrite","source-eventee","source-eventzilla","source-everhour","source-exchange-rates","source-ezofficeinventory","source-facebook-marketing","source-facebook-pages","source-factorial","source-faker","source-fastbill","source-fastly","source-fauna","source-feishu","source-file","source-fillout","source-finage","source-financial-modelling","source-finnhub","source-finnworlds","source-firebase-realtime-database","source-firebolt","source-firehydrant","source-fleetio","source-flexmail","source-flexport","source-float","source-flowlu","source-formbricks","source-free-agent-connector","source-freightview","source-freshbooks","source-freshcaller","source-freshchat","source-freshdesk","source-freshsales","source-freshservice","source-front","source-fulcrum","source-fullstory","source-gainsight-px","source-gcs","source-genesys","source-getgist","source-getlago","source-giphy","source-gitbook","source-github","source-gitlab","source-glassfrog","source-gmail","source-gnews","source-gocardless","source-goldcast","source-gologin","source-gong","source-google-ads","source-google-analytics-data-api","source-google-calendar","source-google-classroom","source-google-directory","source-google-drive","source-google-forms","source-google-pagespeed-insights","source-google-search-console","source-google-sheets","source-google-tasks","source-google-webfonts","source-gorgias","source-grafana","source-granola","source-greenhouse","source-greythr","source-gridly","source-guru","source-gutendex","source-hardcoded-records","source-harness","source-harvest","source-height","source-hellobaton","source-help-scout","source-hibob","source-high-level","source-hoorayhr","source-hubplanner","source-hubspot","source-hugging-face-datasets","source-humanitix","source-huntr","source-illumina-basespace","source-imagga","source-incident-io","source-inflowinventory","source-insightful","source-insightly","source-instagram","source-instatus","source-intercom","source-interzoid","source-intruder","source-invoiced","source-invoiceninja","source-ip2whois","source-iterable","source-jamf-pro","source-jina-ai-reader","source-jira","source-jobnimbus","source-jotform","source-judge-me-reviews","source-just-sift","source-justcall","source-k6-cloud","source-kafka","source-katana","source-keka","source-kisi","source-kissmetrics","source-klarna","source-klaus-api","source-klaviyo","source-kyriba","source-kyve","source-launchdarkly","source-leadfeeder","source-lemlist","source-less-annoying-crm","source-lever-hiring","source-lightspeed-retail","source-linear","source-linkedin-ads","source-linkedin-pages","source-linkrunner","source-linnworks","source-lob","source-lokalise","source-looker","source-luma","source-mailchimp","source-mailerlite","source-mailersend","source-mailgun","source-mailjet-mail","source-mailjet-sms","source-mailosaur","source-mailtrap","source-mantle","source-marketo","source-marketstack","source-mendeley","source-mention","source-mercado-ads","source-merge","source-metabase","source-metricool","source-microsoft-dataverse","source-microsoft-entra-id","source-microsoft-lists","source-microsoft-onedrive","source-microsoft-sharepoint","source-microsoft-teams","source-miro","source-missive","source-mixmax","source-mixpanel","source-mode","source-monday","source-mongodb-v2","source-mssql","source-mux","source-my-hours","source-mysql","source-n8n","source-nasa","source-navan","source-nebius-ai","source-netsuite","source-netsuite-enterprise","source-news-api","source-newsdata","source-newsdata-io","source-nexiopay","source-nexus-datasets","source-ninjaone-rmm","source-nocrm","source-northpass-lms","source-notion","source-nutshell","source-nylas","source-nytimes","source-okta","source-omnisend","source-oncehub","source-onepagecrm","source-onesignal","source-onfleet","source-open-data-dc","source-open-exchange-rates","source-openaq","source-openfda","source-openweather","source-opinion-stage","source-opsgenie","source-opuswatch","source-oracle","source-oracle-enterprise","source-orb","source-oura","source-outbrain-amplify","source-outlook","source-outreach","source-oveit","source-pabbly-subscriptions-billing","source-paddle","source-pagerduty","source-pandadoc","source-paperform","source-papersign","source-pardot","source-partnerize","source-partnerstack","source-payfit","source-paypal-transaction","source-paystack","source-pendo","source-pennylane","source-perigon","source-perk","source-persistiq","source-persona","source-pexels-api","source-phyllo","source-picqer","source-pingdom","source-pinterest","source-pipedrive","source-pipeliner","source-pivotal-tracker","source-piwik","source-plaid","source-planhat","source-plausible","source-pocket","source-pokeapi","source-polygon-stock-api","source-poplar","source-postgres","source-posthog","source-postmarkapp","source-prestashop","source-pretix","source-primetric","source-printify","source-productboard","source-productive","source-public-apis","source-pylon","source-pypi","source-qonto","source-qualaroo","source-quickbooks","source-railz","source-rd-station-marketing","source-recharge","source-recreation","source-recruitee","source-recurly","source-reddit","source-redshift","source-referralhero","source-rentcast","source-repairshopr","source-reply-io","source-retailexpress-by-maropost","source-retently","source-revenuecat","source-revolut-merchant","source-ringcentral","source-rki-covid","source-rocket-chat","source-rocketlane","source-rollbar","source-rootly","source-rss","source-ruddr","source-s3","source-safetyculture","source-sage-hr","source-salesflare","source-salesforce","source-salesloft","source-sap-fieldglass","source-sap-hana-enterprise","source-savvycal","source-scryfall","source-secoda","source-segment","source-sendgrid","source-sendinblue","source-sendowl","source-sendpulse","source-senseforce","source-sentry","source-serpstat","source-service-now","source-sftp","source-sftp-bulk","source-sharepoint-enterprise","source-sharepoint-lists-enterprise","source-sharetribe","source-shippo","source-shipstation","source-shopify","source-shopwired","source-shortcut","source-shortio","source-shutterstock","source-sigma-computing","source-signnow","source-simfin","source-simplecast","source-simplesat","source-singlestore","source-slack","source-smaily","source-smartengage","source-smartreach","source-smartsheets","source-smartwaiver","source-smoke-test","source-snapchat-marketing","source-snowflake","source-solarwinds-service-desk","source-sonar-cloud","source-spacex-api","source-sparkpost","source-split-io","source-spotify-ads","source-spotlercrm","source-square","source-squarespace","source-statsig","source-statuspage","source-stigg","source-stockdata","source-strava","source-stripe","source-survey-sparrow","source-surveycto","source-surveymonkey","source-survicate","source-svix","source-systeme","source-taboola","source-tavus","source-teamtailor","source-teamwork","source-tempo","source-teradata","source-testrail","source-the-guardian-api","source-thinkific","source-thinkific-courses","source-thrive-learning","source-ticketmaster","source-tickettailor","source-ticktick","source-tidb","source-tiktok-marketing","source-timely","source-tinyemail","source-tmdb","source-todoist","source-toggl","source-tplcentral","source-track-pms","source-trello","source-tremendous","source-trustpilot","source-tvmaze-schedule","source-twelve-data","source-twilio","source-twilio-taskrouter","source-twitter","source-tyntec-sms","source-typeform","source-ubidots","source-unleash","source-uppromote","source-uptick","source-us-census","source-uservoice","source-vantage","source-veeqo","source-vercel","source-visma-economic","source-vitally","source-vwo","source-waiteraid","source-wasabi-stats-api","source-watchmode","source-weatherstack","source-web-scrapper","source-webflow","source-when-i-work","source-whisky-hunter","source-wikipedia-pageviews","source-woocommerce","source-wordpress","source-workable","source-workday","source-workday-rest","source-workflowmax","source-workramp","source-wrike","source-wufoo","source-xero","source-xkcd","source-xsolla","source-yahoo-finance-price","source-yandex-metrica","source-yotpo","source-you-need-a-budget-ynab","source-younium","source-yousign","source-youtube-analytics","source-youtube-data","source-zapier-supported-storage","source-zapsign","source-zendesk-chat","source-zendesk-sunshine","source-zendesk-support","source-zendesk-talk","source-zenefits","source-zenloop","source-zoho-analytics-metadata-api","source-zoho-bigin","source-zoho-billing","source-zoho-books","source-zoho-campaign","source-zoho-crm","source-zoho-desk","source-zoho-expense","source-zoho-inventory","source-zoho-invoice","source-zonka-feedback","source-zoom"]', annotations=None, meta=None)], structured_content={'result': ['destination-astra', 'destination-aws-datalake', 'destination-azure-blob-storage', 'destination-bigquery', 'destination-chroma','destination-clickhouse', 'destination-convex', 'destination-csv', 'destination-customer-io', 'destination-databricks', 'destination-deepset', 'destination-dev-null', 'destination-duckdb', 'destination-dynamodb', 'destination-elasticsearch', 'destination-firebolt', 'destination-firestore', 'destination-gcs', 'destination-gcs-data-lake', 'destination-glassflow', 'destination-google-sheets', 'destination-hubspot', 'destination-kafka', 'destination-local-json', 'destination-milvus', 'destination-mongodb', 'destination-motherduck', 'destination-mssql', 'destination-mssql-v2', 'destination-mysql', 'destination-oracle', 'destination-pgvector', 'destination-pinecone', 'destination-postgres', 'destination-pubsub', 'destination-qdrant', 'destination-rabbitmq', 'destination-ragie', 'destination-redis', 'destination-redshift', 'destination-s3', 'destination-s3-data-lake', 'destination-s3-glue', 'destination-salesforce', 'destination-sftp-json', 'destination-snowflake', 'destination-snowflake-cortex', 'destination-sqlite', 'destination-starburst-galaxy', 'destination-surrealdb', 'destination-teradata', 'destination-timeplus', 'destination-typesense', 'destination-vectara', 'destination-weaviate', 'destination-yellowbrick', 'source-100ms', 'source-7shifts', 'source-activecampaign', 'source-acuity-scheduling', 'source-adjust', 'source-adobe-commerce-magento', 'source-agilecrm', 'source-aha', 'source-airbyte', 'source-aircall', 'source-airtable', 'source-akeneo', 'source-algolia', 'source-alpaca-broker-api', 'source-alpha-vantage', 'source-amazon-ads', 'source-amazon-seller-partner', 'source-amazon-sqs', 'source-amplitude', 'source-apify-dataset', 'source-appcues', 'source-appfigures', 'source-appfollow', 'source-apple-search-ads', 'source-appsflyer', 'source-apptivo', 'source-asana', 'source-ashby', 'source-assemblyai', 'source-auth0', 'source-aviationstack', 'source-avni', 'source-awin-advertiser','source-aws-cloudtrail', 'source-azure-blob-storage', 'source-azure-table', 'source-babelforce', 'source-bamboo-hr', 'source-basecamp', 'source-beamer', 'source-bigmailer', 'source-bigquery', 'source-bing-ads', 'source-bitly', 'source-blogger', 'source-bluetally', 'source-boldsign', 'source-box', 'source-box-data-extract', 'source-braintree', 'source-braze', 'source-breezometer', 'source-breezy-hr', 'source-brevo', 'source-brex', 'source-bugsnag', 'source-buildkite', 'source-bunny-inc', 'source-buzzsprout', 'source-cal-com', 'source-calendly', 'source-callrail', 'source-campaign-monitor', 'source-campayn', 'source-canny', 'source-capsule-crm', 'source-captain-data', 'source-care-quality-commission', 'source-cart', 'source-castor-edc', 'source-chameleon', 'source-chargebee', 'source-chargedesk', 'source-chargify', 'source-chartmogul', 'source-chift', 'source-churnkey', 'source-cimis', 'source-cin7', 'source-circa', 'source-circleci', 'source-cisco-meraki', 'source-clarif-ai', 'source-clazar', 'source-clickhouse', 'source-clickup-api', 'source-clockify', 'source-clockodo', 'source-close-com', 'source-cloudbeds', 'source-coassemble', 'source-cockroachdb', 'source-coda', 'source-codefresh', 'source-coin-api', 'source-coingecko-coins', 'source-coinmarketcap', 'source-commcare', 'source-commercetools', 'source-concord', 'source-configcat', 'source-confluence', 'source-convertkit', 'source-convex', 'source-copper', 'source-couchbase', 'source-countercyclical', 'source-criteo-marketing', 'source-customer-io', 'source-customerly', 'source-datadog', 'source-datagen', 'source-datascope', 'source-db2', 'source-db2-enterprise', 'source-dbt', 'source-defillama', 'source-delighted', 'source-deputy', 'source-devin-ai', 'source-ding-connect', 'source-discord', 'source-dixa', 'source-dockerhub', 'source-docuseal', 'source-dolibarr', 'source-dremio', 'source-drift', 'source-drip', 'source-dropbox-sign', 'source-dwolla', 'source-dynamodb', 'source-e-conomic', 'source-e2e-test', 'source-easypost', 'source-easypromos', 'source-ebay-finance', 'source-ebay-fulfillment', 'source-elasticemail', 'source-elasticsearch', 'source-emailoctopus', 'source-employment-hero', 'source-encharge', 'source-eventbrite', 'source-eventee', 'source-eventzilla', 'source-everhour', 'source-exchange-rates', 'source-ezofficeinventory', 'source-facebook-marketing', 'source-facebook-pages', 'source-factorial', 'source-faker', 'source-fastbill', 'source-fastly', 'source-fauna', 'source-feishu', 'source-file', 'source-fillout', 'source-finage', 'source-financial-modelling', 'source-finnhub', 'source-finnworlds', 'source-firebase-realtime-database', 'source-firebolt', 'source-firehydrant', 'source-fleetio', 'source-flexmail', 'source-flexport', 'source-float', 'source-flowlu', 'source-formbricks', 'source-free-agent-connector', 'source-freightview', 'source-freshbooks', 'source-freshcaller', 'source-freshchat', 'source-freshdesk', 'source-freshsales', 'source-freshservice', 'source-front', 'source-fulcrum', 'source-fullstory','source-gainsight-px', 'source-gcs', 'source-genesys', 'source-getgist', 'source-getlago', 'source-giphy', 'source-gitbook', 'source-github', 'source-gitlab', 'source-glassfrog', 'source-gmail', 'source-gnews', 'source-gocardless', 'source-goldcast', 'source-gologin', 'source-gong', 'source-google-ads', 'source-google-analytics-data-api', 'source-google-calendar', 'source-google-classroom', 'source-google-directory', 'source-google-drive', 'source-google-forms', 'source-google-pagespeed-insights', 'source-google-search-console', 'source-google-sheets', 'source-google-tasks', 'source-google-webfonts', 'source-gorgias', 'source-grafana', 'source-granola', 'source-greenhouse', 'source-greythr', 'source-gridly', 'source-guru', 'source-gutendex', 'source-hardcoded-records', 'source-harness', 'source-harvest', 'source-height', 'source-hellobaton', 'source-help-scout', 'source-hibob', 'source-high-level', 'source-hoorayhr', 'source-hubplanner', 'source-hubspot', 'source-hugging-face-datasets', 'source-humanitix', 'source-huntr', 'source-illumina-basespace', 'source-imagga', 'source-incident-io', 'source-inflowinventory', 'source-insightful', 'source-insightly', 'source-instagram', 'source-instatus','source-intercom', 'source-interzoid', 'source-intruder', 'source-invoiced', 'source-invoiceninja', 'source-ip2whois', 'source-iterable', 'source-jamf-pro', 'source-jina-ai-reader', 'source-jira', 'source-jobnimbus', 'source-jotform', 'source-judge-me-reviews', 'source-just-sift', 'source-justcall', 'source-k6-cloud', 'source-kafka', 'source-katana', 'source-keka', 'source-kisi', 'source-kissmetrics', 'source-klarna', 'source-klaus-api', 'source-klaviyo', 'source-kyriba', 'source-kyve', 'source-launchdarkly', 'source-leadfeeder', 'source-lemlist', 'source-less-annoying-crm', 'source-lever-hiring', 'source-lightspeed-retail', 'source-linear', 'source-linkedin-ads', 'source-linkedin-pages', 'source-linkrunner', 'source-linnworks', 'source-lob', 'source-lokalise', 'source-looker', 'source-luma', 'source-mailchimp', 'source-mailerlite', 'source-mailersend', 'source-mailgun', 'source-mailjet-mail', 'source-mailjet-sms', 'source-mailosaur', 'source-mailtrap', 'source-mantle', 'source-marketo', 'source-marketstack', 'source-mendeley', 'source-mention', 'source-mercado-ads', 'source-merge', 'source-metabase', 'source-metricool', 'source-microsoft-dataverse', 'source-microsoft-entra-id', 'source-microsoft-lists', 'source-microsoft-onedrive', 'source-microsoft-sharepoint', 'source-microsoft-teams', 'source-miro', 'source-missive', 'source-mixmax', 'source-mixpanel', 'source-mode', 'source-monday', 'source-mongodb-v2', 'source-mssql', 'source-mux', 'source-my-hours', 'source-mysql', 'source-n8n', 'source-nasa', 'source-navan', 'source-nebius-ai', 'source-netsuite', 'source-netsuite-enterprise', 'source-news-api', 'source-newsdata', 'source-newsdata-io', 'source-nexiopay', 'source-nexus-datasets', 'source-ninjaone-rmm', 'source-nocrm', 'source-northpass-lms', 'source-notion', 'source-nutshell', 'source-nylas', 'source-nytimes', 'source-okta', 'source-omnisend', 'source-oncehub', 'source-onepagecrm', 'source-onesignal', 'source-onfleet', 'source-open-data-dc', 'source-open-exchange-rates', 'source-openaq', 'source-openfda', 'source-openweather', 'source-opinion-stage', 'source-opsgenie', 'source-opuswatch', 'source-oracle', 'source-oracle-enterprise', 'source-orb', 'source-oura', 'source-outbrain-amplify', 'source-outlook', 'source-outreach', 'source-oveit', 'source-pabbly-subscriptions-billing', 'source-paddle', 'source-pagerduty', 'source-pandadoc', 'source-paperform', 'source-papersign', 'source-pardot', 'source-partnerize', 'source-partnerstack', 'source-payfit', 'source-paypal-transaction', 'source-paystack', 'source-pendo', 'source-pennylane', 'source-perigon', 'source-perk', 'source-persistiq', 'source-persona', 'source-pexels-api', 'source-phyllo', 'source-picqer', 'source-pingdom','source-pinterest', 'source-pipedrive', 'source-pipeliner', 'source-pivotal-tracker', 'source-piwik', 'source-plaid', 'source-planhat', 'source-plausible', 'source-pocket', 'source-pokeapi', 'source-polygon-stock-api', 'source-poplar', 'source-postgres', 'source-posthog', 'source-postmarkapp', 'source-prestashop', 'source-pretix', 'source-primetric', 'source-printify', 'source-productboard', 'source-productive', 'source-public-apis', 'source-pylon', 'source-pypi', 'source-qonto', 'source-qualaroo', 'source-quickbooks', 'source-railz', 'source-rd-station-marketing', 'source-recharge', 'source-recreation', 'source-recruitee', 'source-recurly', 'source-reddit', 'source-redshift', 'source-referralhero', 'source-rentcast', 'source-repairshopr', 'source-reply-io', 'source-retailexpress-by-maropost', 'source-retently', 'source-revenuecat', 'source-revolut-merchant', 'source-ringcentral', 'source-rki-covid', 'source-rocket-chat', 'source-rocketlane', 'source-rollbar', 'source-rootly', 'source-rss', 'source-ruddr', 'source-s3', 'source-safetyculture', 'source-sage-hr', 'source-salesflare', 'source-salesforce', 'source-salesloft', 'source-sap-fieldglass', 'source-sap-hana-enterprise', 'source-savvycal', 'source-scryfall', 'source-secoda', 'source-segment', 'source-sendgrid', 'source-sendinblue', 'source-sendowl', 'source-sendpulse', 'source-senseforce', 'source-sentry', 'source-serpstat', 'source-service-now', 'source-sftp', 'source-sftp-bulk', 'source-sharepoint-enterprise', 'source-sharepoint-lists-enterprise', 'source-sharetribe', 'source-shippo', 'source-shipstation', 'source-shopify', 'source-shopwired', 'source-shortcut', 'source-shortio', 'source-shutterstock', 'source-sigma-computing', 'source-signnow', 'source-simfin', 'source-simplecast', 'source-simplesat', 'source-singlestore', 'source-slack', 'source-smaily', 'source-smartengage', 'source-smartreach', 'source-smartsheets', 'source-smartwaiver', 'source-smoke-test', 'source-snapchat-marketing', 'source-snowflake', 'source-solarwinds-service-desk', 'source-sonar-cloud', 'source-spacex-api', 'source-sparkpost', 'source-split-io', 'source-spotify-ads', 'source-spotlercrm', 'source-square', 'source-squarespace', 'source-statsig', 'source-statuspage', 'source-stigg', 'source-stockdata', 'source-strava', 'source-stripe', 'source-survey-sparrow', 'source-surveycto', 'source-surveymonkey', 'source-survicate', 'source-svix', 'source-systeme', 'source-taboola', 'source-tavus', 'source-teamtailor', 'source-teamwork', 'source-tempo', 'source-teradata', 'source-testrail', 'source-the-guardian-api', 'source-thinkific', 'source-thinkific-courses', 'source-thrive-learning', 'source-ticketmaster', 'source-tickettailor', 'source-ticktick', 'source-tidb', 'source-tiktok-marketing', 'source-timely', 'source-tinyemail', 'source-tmdb', 'source-todoist', 'source-toggl', 'source-tplcentral', 'source-track-pms', 'source-trello', 'source-tremendous', 'source-trustpilot', 'source-tvmaze-schedule', 'source-twelve-data', 'source-twilio', 'source-twilio-taskrouter', 'source-twitter', 'source-tyntec-sms', 'source-typeform', 'source-ubidots', 'source-unleash', 'source-uppromote', 'source-uptick', 'source-us-census', 'source-uservoice', 'source-vantage', 'source-veeqo', 'source-vercel', 'source-visma-economic', 'source-vitally', 'source-vwo', 'source-waiteraid', 'source-wasabi-stats-api', 'source-watchmode', 'source-weatherstack', 'source-web-scrapper', 'source-webflow', 'source-when-i-work', 'source-whisky-hunter', 'source-wikipedia-pageviews', 'source-woocommerce', 'source-wordpress', 'source-workable', 'source-workday', 'source-workday-rest', 'source-workflowmax', 'source-workramp', 'source-wrike', 'source-wufoo', 'source-xero', 'source-xkcd', 'source-xsolla', 'source-yahoo-finance-price', 'source-yandex-metrica', 'source-yotpo', 'source-you-need-a-budget-ynab', 'source-younium', 'source-yousign', 'source-youtube-analytics', 'source-youtube-data', 'source-zapier-supported-storage', 'source-zapsign', 'source-zendesk-chat', 'source-zendesk-sunshine', 'source-zendesk-support', 'source-zendesk-talk', 'source-zenefits', 'source-zenloop', 'source-zoho-analytics-metadata-api', 'source-zoho-bigin', 'source-zoho-billing', 'source-zoho-books', 'source-zoho-campaign', 'source-zoho-crm', 'source-zoho-desk', 'source-zoho-expense', 'source-zoho-inventory', 'source-zoho-invoice', 'source-zonka-feedback', 'source-zoom']}, meta={'fastmcp': {'wrap_result':True}}, data=['destination-astra', 'destination-aws-datalake', 'destination-azure-blob-storage', 'destination-bigquery', 'destination-chroma', 'destination-clickhouse', 'destination-convex', 'destination-csv', 'destination-customer-io', 'destination-databricks', 'destination-deepset', 'destination-dev-null', 'destination-duckdb', 'destination-dynamodb', 'destination-elasticsearch', 'destination-firebolt', 'destination-firestore', 'destination-gcs', 'destination-gcs-data-lake', 'destination-glassflow', 'destination-google-sheets', 'destination-hubspot', 'destination-kafka', 'destination-local-json','destination-milvus', 'destination-mongodb', 'destination-motherduck', 'destination-mssql', 'destination-mssql-v2', 'destination-mysql', 'destination-oracle', 'destination-pgvector', 'destination-pinecone', 'destination-postgres', 'destination-pubsub', 'destination-qdrant', 'destination-rabbitmq', 'destination-ragie', 'destination-redis', 'destination-redshift', 'destination-s3', 'destination-s3-data-lake', 'destination-s3-glue', 'destination-salesforce', 'destination-sftp-json', 'destination-snowflake', 'destination-snowflake-cortex', 'destination-sqlite', 'destination-starburst-galaxy', 'destination-surrealdb', 'destination-teradata', 'destination-timeplus', 'destination-typesense', 'destination-vectara', 'destination-weaviate', 'destination-yellowbrick', 'source-100ms', 'source-7shifts', 'source-activecampaign', 'source-acuity-scheduling', 'source-adjust', 'source-adobe-commerce-magento', 'source-agilecrm', 'source-aha', 'source-airbyte', 'source-aircall', 'source-airtable', 'source-akeneo','source-algolia', 'source-alpaca-broker-api', 'source-alpha-vantage', 'source-amazon-ads', 'source-amazon-seller-partner', 'source-amazon-sqs', 'source-amplitude', 'source-apify-dataset', 'source-appcues', 'source-appfigures', 'source-appfollow', 'source-apple-search-ads', 'source-appsflyer', 'source-apptivo', 'source-asana', 'source-ashby', 'source-assemblyai', 'source-auth0', 'source-aviationstack', 'source-avni', 'source-awin-advertiser', 'source-aws-cloudtrail', 'source-azure-blob-storage', 'source-azure-table', 'source-babelforce', 'source-bamboo-hr', 'source-basecamp', 'source-beamer', 'source-bigmailer', 'source-bigquery', 'source-bing-ads', 'source-bitly', 'source-blogger', 'source-bluetally', 'source-boldsign', 'source-box', 'source-box-data-extract', 'source-braintree', 'source-braze', 'source-breezometer', 'source-breezy-hr', 'source-brevo', 'source-brex', 'source-bugsnag', 'source-buildkite', 'source-bunny-inc', 'source-buzzsprout', 'source-cal-com', 'source-calendly', 'source-callrail', 'source-campaign-monitor', 'source-campayn', 'source-canny', 'source-capsule-crm', 'source-captain-data', 'source-care-quality-commission', 'source-cart', 'source-castor-edc', 'source-chameleon', 'source-chargebee', 'source-chargedesk', 'source-chargify', 'source-chartmogul', 'source-chift', 'source-churnkey', 'source-cimis', 'source-cin7', 'source-circa', 'source-circleci', 'source-cisco-meraki', 'source-clarif-ai', 'source-clazar', 'source-clickhouse', 'source-clickup-api', 'source-clockify','source-clockodo', 'source-close-com', 'source-cloudbeds', 'source-coassemble', 'source-cockroachdb', 'source-coda', 'source-codefresh', 'source-coin-api', 'source-coingecko-coins', 'source-coinmarketcap', 'source-commcare', 'source-commercetools', 'source-concord', 'source-configcat', 'source-confluence', 'source-convertkit', 'source-convex', 'source-copper', 'source-couchbase', 'source-countercyclical', 'source-criteo-marketing', 'source-customer-io', 'source-customerly', 'source-datadog', 'source-datagen', 'source-datascope', 'source-db2', 'source-db2-enterprise', 'source-dbt', 'source-defillama', 'source-delighted', 'source-deputy', 'source-devin-ai', 'source-ding-connect', 'source-discord', 'source-dixa', 'source-dockerhub', 'source-docuseal', 'source-dolibarr', 'source-dremio', 'source-drift', 'source-drip', 'source-dropbox-sign', 'source-dwolla', 'source-dynamodb', 'source-e-conomic', 'source-e2e-test', 'source-easypost', 'source-easypromos', 'source-ebay-finance', 'source-ebay-fulfillment', 'source-elasticemail', 'source-elasticsearch', 'source-emailoctopus', 'source-employment-hero', 'source-encharge', 'source-eventbrite', 'source-eventee', 'source-eventzilla', 'source-everhour', 'source-exchange-rates', 'source-ezofficeinventory', 'source-facebook-marketing', 'source-facebook-pages', 'source-factorial', 'source-faker', 'source-fastbill', 'source-fastly', 'source-fauna', 'source-feishu', 'source-file', 'source-fillout', 'source-finage', 'source-financial-modelling', 'source-finnhub', 'source-finnworlds', 'source-firebase-realtime-database', 'source-firebolt', 'source-firehydrant', 'source-fleetio', 'source-flexmail', 'source-flexport', 'source-float', 'source-flowlu', 'source-formbricks', 'source-free-agent-connector', 'source-freightview', 'source-freshbooks', 'source-freshcaller', 'source-freshchat', 'source-freshdesk', 'source-freshsales', 'source-freshservice', 'source-front', 'source-fulcrum', 'source-fullstory', 'source-gainsight-px', 'source-gcs', 'source-genesys', 'source-getgist', 'source-getlago', 'source-giphy', 'source-gitbook', 'source-github', 'source-gitlab', 'source-glassfrog', 'source-gmail', 'source-gnews', 'source-gocardless', 'source-goldcast', 'source-gologin', 'source-gong', 'source-google-ads', 'source-google-analytics-data-api', 'source-google-calendar', 'source-google-classroom', 'source-google-directory', 'source-google-drive', 'source-google-forms', 'source-google-pagespeed-insights', 'source-google-search-console', 'source-google-sheets', 'source-google-tasks', 'source-google-webfonts', 'source-gorgias', 'source-grafana', 'source-granola', 'source-greenhouse', 'source-greythr', 'source-gridly', 'source-guru', 'source-gutendex', 'source-hardcoded-records', 'source-harness', 'source-harvest', 'source-height', 'source-hellobaton', 'source-help-scout', 'source-hibob', 'source-high-level', 'source-hoorayhr', 'source-hubplanner', 'source-hubspot', 'source-hugging-face-datasets', 'source-humanitix', 'source-huntr', 'source-illumina-basespace', 'source-imagga', 'source-incident-io', 'source-inflowinventory', 'source-insightful', 'source-insightly', 'source-instagram', 'source-instatus', 'source-intercom', 'source-interzoid', 'source-intruder', 'source-invoiced', 'source-invoiceninja', 'source-ip2whois', 'source-iterable', 'source-jamf-pro', 'source-jina-ai-reader', 'source-jira', 'source-jobnimbus', 'source-jotform', 'source-judge-me-reviews', 'source-just-sift', 'source-justcall', 'source-k6-cloud', 'source-kafka', 'source-katana', 'source-keka', 'source-kisi', 'source-kissmetrics', 'source-klarna', 'source-klaus-api', 'source-klaviyo', 'source-kyriba', 'source-kyve', 'source-launchdarkly', 'source-leadfeeder', 'source-lemlist', 'source-less-annoying-crm', 'source-lever-hiring', 'source-lightspeed-retail', 'source-linear', 'source-linkedin-ads', 'source-linkedin-pages', 'source-linkrunner', 'source-linnworks', 'source-lob', 'source-lokalise', 'source-looker', 'source-luma', 'source-mailchimp', 'source-mailerlite', 'source-mailersend', 'source-mailgun', 'source-mailjet-mail', 'source-mailjet-sms', 'source-mailosaur', 'source-mailtrap','source-mantle', 'source-marketo', 'source-marketstack', 'source-mendeley', 'source-mention', 'source-mercado-ads', 'source-merge', 'source-metabase', 'source-metricool', 'source-microsoft-dataverse', 'source-microsoft-entra-id', 'source-microsoft-lists', 'source-microsoft-onedrive', 'source-microsoft-sharepoint', 'source-microsoft-teams', 'source-miro', 'source-missive', 'source-mixmax', 'source-mixpanel', 'source-mode', 'source-monday', 'source-mongodb-v2', 'source-mssql', 'source-mux', 'source-my-hours', 'source-mysql', 'source-n8n', 'source-nasa', 'source-navan', 'source-nebius-ai', 'source-netsuite', 'source-netsuite-enterprise', 'source-news-api', 'source-newsdata', 'source-newsdata-io', 'source-nexiopay', 'source-nexus-datasets', 'source-ninjaone-rmm', 'source-nocrm', 'source-northpass-lms', 'source-notion', 'source-nutshell', 'source-nylas', 'source-nytimes', 'source-okta', 'source-omnisend', 'source-oncehub', 'source-onepagecrm', 'source-onesignal', 'source-onfleet', 'source-open-data-dc', 'source-open-exchange-rates', 'source-openaq', 'source-openfda', 'source-openweather', 'source-opinion-stage', 'source-opsgenie', 'source-opuswatch', 'source-oracle', 'source-oracle-enterprise', 'source-orb', 'source-oura', 'source-outbrain-amplify', 'source-outlook', 'source-outreach', 'source-oveit', 'source-pabbly-subscriptions-billing', 'source-paddle', 'source-pagerduty', 'source-pandadoc', 'source-paperform', 'source-papersign', 'source-pardot', 'source-partnerize', 'source-partnerstack', 'source-payfit', 'source-paypal-transaction', 'source-paystack', 'source-pendo', 'source-pennylane', 'source-perigon', 'source-perk', 'source-persistiq', 'source-persona', 'source-pexels-api', 'source-phyllo', 'source-picqer', 'source-pingdom', 'source-pinterest', 'source-pipedrive', 'source-pipeliner', 'source-pivotal-tracker', 'source-piwik', 'source-plaid', 'source-planhat', 'source-plausible', 'source-pocket', 'source-pokeapi', 'source-polygon-stock-api', 'source-poplar', 'source-postgres', 'source-posthog', 'source-postmarkapp', 'source-prestashop', 'source-pretix', 'source-primetric', 'source-printify', 'source-productboard', 'source-productive', 'source-public-apis', 'source-pylon', 'source-pypi', 'source-qonto', 'source-qualaroo', 'source-quickbooks', 'source-railz', 'source-rd-station-marketing', 'source-recharge', 'source-recreation', 'source-recruitee', 'source-recurly', 'source-reddit', 'source-redshift', 'source-referralhero', 'source-rentcast', 'source-repairshopr', 'source-reply-io', 'source-retailexpress-by-maropost', 'source-retently', 'source-revenuecat', 'source-revolut-merchant', 'source-ringcentral', 'source-rki-covid', 'source-rocket-chat', 'source-rocketlane', 'source-rollbar', 'source-rootly', 'source-rss', 'source-ruddr', 'source-s3', 'source-safetyculture', 'source-sage-hr', 'source-salesflare', 'source-salesforce', 'source-salesloft', 'source-sap-fieldglass', 'source-sap-hana-enterprise', 'source-savvycal', 'source-scryfall', 'source-secoda', 'source-segment', 'source-sendgrid', 'source-sendinblue', 'source-sendowl', 'source-sendpulse', 'source-senseforce', 'source-sentry', 'source-serpstat', 'source-service-now', 'source-sftp', 'source-sftp-bulk', 'source-sharepoint-enterprise', 'source-sharepoint-lists-enterprise', 'source-sharetribe', 'source-shippo', 'source-shipstation', 'source-shopify', 'source-shopwired', 'source-shortcut', 'source-shortio', 'source-shutterstock', 'source-sigma-computing', 'source-signnow', 'source-simfin', 'source-simplecast', 'source-simplesat', 'source-singlestore', 'source-slack', 'source-smaily', 'source-smartengage', 'source-smartreach', 'source-smartsheets', 'source-smartwaiver', 'source-smoke-test', 'source-snapchat-marketing', 'source-snowflake', 'source-solarwinds-service-desk', 'source-sonar-cloud', 'source-spacex-api', 'source-sparkpost', 'source-split-io', 'source-spotify-ads', 'source-spotlercrm', 'source-square', 'source-squarespace', 'source-statsig', 'source-statuspage', 'source-stigg', 'source-stockdata', 'source-strava', 'source-stripe', 'source-survey-sparrow', 'source-surveycto', 'source-surveymonkey', 'source-survicate', 'source-svix', 'source-systeme', 'source-taboola', 'source-tavus', 'source-teamtailor', 'source-teamwork', 'source-tempo', 'source-teradata', 'source-testrail', 'source-the-guardian-api','source-thinkific', 'source-thinkific-courses', 'source-thrive-learning', 'source-ticketmaster', 'source-tickettailor', 'source-ticktick', 'source-tidb', 'source-tiktok-marketing', 'source-timely', 'source-tinyemail', 'source-tmdb', 'source-todoist', 'source-toggl', 'source-tplcentral', 'source-track-pms', 'source-trello', 'source-tremendous', 'source-trustpilot', 'source-tvmaze-schedule', 'source-twelve-data', 'source-twilio', 'source-twilio-taskrouter', 'source-twitter', 'source-tyntec-sms', 'source-typeform', 'source-ubidots', 'source-unleash', 'source-uppromote', 'source-uptick', 'source-us-census', 'source-uservoice', 'source-vantage', 'source-veeqo', 'source-vercel', 'source-visma-economic','source-vitally', 'source-vwo', 'source-waiteraid', 'source-wasabi-stats-api', 'source-watchmode', 'source-weatherstack', 'source-web-scrapper', 'source-webflow', 'source-when-i-work', 'source-whisky-hunter', 'source-wikipedia-pageviews', 'source-woocommerce', 'source-wordpress', 'source-workable', 'source-workday', 'source-workday-rest', 'source-workflowmax', 'source-workramp', 'source-wrike', 'source-wufoo', 'source-xero', 'source-xkcd', 'source-xsolla', 'source-yahoo-finance-price', 'source-yandex-metrica', 'source-yotpo', 'source-you-need-a-budget-ynab', 'source-younium', 'source-yousign', 'source-youtube-analytics', 'source-youtube-data', 'source-zapier-supported-storage', 'source-zapsign', 'source-zendesk-chat', 'source-zendesk-sunshine', 'source-zendesk-support', 'source-zendesk-talk', 'source-zenefits', 'source-zenloop', 'source-zoho-analytics-metadata-api', 'source-zoho-bigin', 'source-zoho-billing', 'source-zoho-books', 'source-zoho-campaign', 'source-zoho-crm', 'source-zoho-desk', 'source-zoho-expense', 'source-zoho-inventory', 'source-zoho-invoice', 'source-zonka-feedback', 'source-zoom'], is_error=False)

That shows both the HTTP transport and MCP protocol working.
Screenshot 2026-07-07 at 2 34 58 PM

Summary by CodeRabbit

  • New Features

    • Added guidance for hosting the MCP server over HTTPS for remote clients.
    • Introduced a new Streamable HTTP startup option and expanded local testing commands.
  • Bug Fixes

    • Improved HTTP handling for remote access by enabling configurable CORS support and required response headers.
    • Added reverse-proxy and container deployment examples for secure public access.
  • Documentation

    • Expanded setup docs with HTTPS deployment, authentication, health checks, and local development instructions.

@github-actions github-actions Bot added the community PRs from community contributors label Jul 7, 2026
@octavia-bot octavia-bot Bot marked this pull request as draft July 7, 2026 20:35
@octavia-bot

octavia-bot Bot commented Jul 7, 2026

Copy link
Copy Markdown

Note

📝 PR Converted to Draft

More info...

Thank you for creating this PR. As a policy to protect our engineers' time, Airbyte requires all PRs to be created first in draft status. Your PR has been automatically converted to draft status in respect for this policy.

As soon as your PR is ready for formal review, you can proceed to convert the PR to "ready for review" status by clicking the "Ready for review" button at the bottom of the PR page.

To skip draft status in future PRs, please include [ready] in your PR title or add the skip-draft-status label when creating your PR.

@github-actions

github-actions Bot commented Jul 7, 2026

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@feat/mcp-https-dust-deployment' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@feat/mcp-https-dust-deployment'

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.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds hosted HTTPS deployment support for the Airbyte Replication MCP server: a new CORS middleware config module wired into the HTTP entry point, Docker Compose/Caddy deployment assets, a new poe task, and documentation covering remote client integration, authentication, and reverse proxy setup.

Changes

MCP HTTPS Deployment Support

Layer / File(s) Summary
CORS middleware configuration and tests
airbyte/mcp/_http_config.py, tests/unit_tests/test_mcp_http_config.py
Adds parse_cors_origins and build_http_middleware to derive CORS settings from MCP_CORS_ORIGINS or an explicit argument, building a CORSMiddleware list; adds unit tests for both.
HTTP entry point wiring
airbyte/mcp/http_main.py
Imports and invokes build_http_middleware(), passing the result into app.run(...); docstring documents MCP_CORS_ORIGINS alongside OIDC vars.
Docker Compose and Caddy reverse proxy config
deploy/Caddyfile, deploy/docker-compose.mcp.yml
New Caddyfile routes /health, /mcp*, and fallback traffic to mcp:8080; new compose file defines mcp and caddy services with health checks, env vars, and persistent volumes.
Deployment documentation
docs/MCP_HTTP_DEPLOYMENT.md, airbyte/mcp/__init__.py, docs/CONTRIBUTING.md, pyproject.toml
New guide covers architecture, endpoint URL, env vars, remote client auth options, local dev, and reverse proxy examples; docstrings and CONTRIBUTING updated with links, and a new mcp-serve-streamable-http poe task is added.

Estimated code review effort: 2 (Simple) | ~15 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant Caddy
  participant MCPServer as MCP Server (http_main.py)

  Client->>Caddy: HTTPS request to MCP_PUBLIC_HOST
  Caddy->>MCPServer: Proxy /mcp* or /health to mcp:8080
  MCPServer->>MCPServer: build_http_middleware() applies CORS rules
  MCPServer-->>Caddy: Response (with CORS headers if configured)
  Caddy-->>Client: HTTPS response
Loading

Possibly related issues

Possibly related PRs

  • airbytehq/PyAirbyte#1046: Both PRs modify airbyte/mcp/http_main.py's main() startup wiring, one adding OIDC/health support and this one adding CORS middleware injection.
  • airbytehq/PyAirbyte#1051: Both PRs touch the app.run(...) startup call in http_main.py, one adjusting the mounted path and this one adding middleware.

Nice tidy set of deployment docs and a middleware helper here — wdyt about eventually adding a small integration test that spins up the compose stack to verify the CORS headers actually reach a client through Caddy? 🐰✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main change: simplifying HTTPS deployment for the Replication MCP server.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

Actionable comments posted: 3

🤖 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/_http_config.py`:
- Line 45: The CORS origin selection in build_http_middleware currently treats
an explicit empty string the same as no value, so cors_origins="" falls back to
MCP_CORS_ORIGINS unexpectedly. Update the logic around parse_cors_origins in
_http_config so only None triggers the environment lookup, while an empty string
is passed through as an intentional opt-out; this will keep
test_build_http_middleware_without_origins and similar callers independent of
env state.

In `@deploy/Caddyfile`:
- Around line 19-22: The fallback in Caddyfile still proxies the original
request URI, so the path-prefix deployment flow won’t reach the root app. Update
the fallback `handle` block to strip or rewrite the configured prefix before
`reverse_proxy mcp:8080`, using the same path-prefix logic expected by
`MCP_SERVER_URL`; if that can’t be done here, remove the path-prefixed
deployment claim from the docs/config comments. Refer to the fallback `handle`
and `reverse_proxy` block when making the change.

In `@deploy/docker-compose.mcp.yml`:
- Around line 21-23: The MCP public origin is currently falling back to
localhost via MCP_SERVER_URL and related public-host settings, which makes the
compose stack unusable for remote access unless overridden manually. Update the
docker-compose MCP configuration to require an explicit MCP_PUBLIC_HOST instead
of defaulting it to localhost, and ensure the MCP_SERVER_URL and any other
public-host dependent values are derived from that required hostname in the
compose file.
🪄 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: c4744d8b-7e0e-4509-9691-c0ea5400114a

📥 Commits

Reviewing files that changed from the base of the PR and between 15ca9ab and dfc3402.

📒 Files selected for processing (9)
  • airbyte/mcp/__init__.py
  • airbyte/mcp/_http_config.py
  • airbyte/mcp/http_main.py
  • deploy/Caddyfile
  • deploy/docker-compose.mcp.yml
  • docs/CONTRIBUTING.md
  • docs/MCP_HTTP_DEPLOYMENT.md
  • pyproject.toml
  • tests/unit_tests/test_mcp_http_config.py

remote MCP clients that connect from a browser context (for example,
browser-based OAuth flows).
"""
origins = parse_cors_origins(cors_origins or os.getenv(MCP_CORS_ORIGINS_ENV, ""))

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Falsy "" falls through to env var — intentional?

cors_origins or os.getenv(...) treats an explicitly passed empty string the same as "unset", so it silently falls back to MCP_CORS_ORIGINS from the environment. That also makes test_build_http_middleware_without_origins (passing cors_origins="") implicitly depend on the env var being unset in CI. Want to switch to a None sentinel so callers can explicitly opt out of CORS regardless of env state?

💡 Proposed fix
 def build_http_middleware(
     *,
     cors_origins: str | None = None,
 ) -> list[Middleware]:
     ...
-    origins = parse_cors_origins(cors_origins or os.getenv(MCP_CORS_ORIGINS_ENV, ""))
+    if cors_origins is None:
+        cors_origins = os.getenv(MCP_CORS_ORIGINS_ENV, "")
+    origins = parse_cors_origins(cors_origins)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
origins = parse_cors_origins(cors_origins or os.getenv(MCP_CORS_ORIGINS_ENV, ""))
if cors_origins is None:
cors_origins = os.getenv(MCP_CORS_ORIGINS_ENV, "")
origins = parse_cors_origins(cors_origins)
🤖 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/_http_config.py` at line 45, The CORS origin selection in
build_http_middleware currently treats an explicit empty string the same as no
value, so cors_origins="" falls back to MCP_CORS_ORIGINS unexpectedly. Update
the logic around parse_cors_origins in _http_config so only None triggers the
environment lookup, while an empty string is passed through as an intentional
opt-out; this will keep test_build_http_middleware_without_origins and similar
callers independent of env state.

Comment thread deploy/Caddyfile
Comment on lines +19 to +22
# Fallback for path-stripped deployments (MCP_SERVER_URL with a path prefix).
handle {
reverse_proxy mcp:8080
}

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Strip the prefix before proxying this fallback.

handle { reverse_proxy mcp:8080 } still forwards the original URI, so the documented MCP_SERVER_URL=https://host/airbyte flow will hit mcp:8080/airbyte instead of the root-mounted app. Could we either rewrite the prefix here or drop the path-prefixed deployment claim until that rewrite exists?

🤖 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 `@deploy/Caddyfile` around lines 19 - 22, The fallback in Caddyfile still
proxies the original request URI, so the path-prefix deployment flow won’t reach
the root app. Update the fallback `handle` block to strip or rewrite the
configured prefix before `reverse_proxy mcp:8080`, using the same path-prefix
logic expected by `MCP_SERVER_URL`; if that can’t be done here, remove the
path-prefixed deployment claim from the docs/config comments. Refer to the
fallback `handle` and `reverse_proxy` block when making the change.

Comment on lines +21 to +23
MCP_SERVER_URL: https://${MCP_PUBLIC_HOST:-localhost}
MCP_CORS_ORIGINS: ${MCP_CORS_ORIGINS:-}
OIDC_CONFIG_URL: ${OIDC_CONFIG_URL:-}

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Don’t default the public hostname to localhost.

With automatic HTTPS, {$MCP_PUBLIC_HOST} becomes the certificate name and MCP_SERVER_URL becomes the public origin. Defaulting both to localhost leaves the stack in a state that won’t produce a usable remote endpoint unless every user overrides it manually. Could we require an explicit public hostname instead?

Also applies to: 45-46

🤖 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 `@deploy/docker-compose.mcp.yml` around lines 21 - 23, The MCP public origin is
currently falling back to localhost via MCP_SERVER_URL and related public-host
settings, which makes the compose stack unusable for remote access unless
overridden manually. Update the docker-compose MCP configuration to require an
explicit MCP_PUBLIC_HOST instead of defaulting it to localhost, and ensure the
MCP_SERVER_URL and any other public-host dependent values are derived from that
required hostname in the compose file.

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

Labels

community PRs from community contributors

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant