Skip to content

feat: Enhance MCP tools for cross-workspace connector migration #978

@devin-ai-integration

Description

@devin-ai-integration

Summary

Enhance PyAirbyte MCP (Coral MCP) tools to support cross-workspace connector duplication and migration workflows (e.g., self-managed → Cloud, Cloud → Cloud). This was identified during an exploration of the end-to-end migration process using Coral MCP and Ops MCP tools.

Requested by: Aaron ("AJ") Steers (@aaronsteers)

Related Devin session: https://app.devin.ai/sessions/eb636b8d14fc4895b3b894ea399f998e

Note: Setting catalog/state artifacts is intentionally out of scope here — those write operations are handled by the Ops MCP connection_medic tools (behind AIRBYTE_OPS_MEDIC_MODE).


Context: Migration Workflow

A connector migration requires these steps:

  1. Read source connector config (type, name, credentials/config)
  2. Read destination connector config
  3. Read connection metadata (streams, sync modes, schedule, enabled status)
  4. Read configured catalog (already supported via get_connection_artifact)
  5. Read connection state (already supported via get_connection_artifact)
  6. Deploy source to target workspace (supported via deploy_source_to_cloud)
  7. Deploy destination to target workspace (supported via deploy_destination_to_cloud)
  8. Create connection in target workspace (supported via create_connection_on_cloud)
  9. Import catalog to target connection (handled by Ops MCP medic mode)
  10. Import state to target connection (handled by Ops MCP medic mode)

Steps 4-5 and 6-10 are already covered. Steps 1-3 have gaps documented below.


P0: Critical Gaps

1. Add source/destination config to describe responses (or new tool)

Problem: describe_cloud_source and describe_cloud_destination return name, ID, URL, and connector_definition_id — but not the connector configuration. Without the config, you cannot recreate the connector in a target workspace.

Affected code:

  • airbyte/mcp/cloud.pyCloudSourceDetails model (line ~94-104) has no config field
  • airbyte/mcp/cloud.pyCloudDestinationDetails model (line ~107-117) has no config field
  • airbyte/mcp/cloud.pydescribe_cloud_source() function (line ~921-948) strips config from response
  • airbyte/mcp/cloud.pydescribe_cloud_destination() function (line ~957-984) strips config from response

Proposed fix: Add a configuration field to CloudSourceDetails and CloudDestinationDetails, populated from the SourceResponse.configuration / DestinationResponse.configuration API data. The API already masks secrets, so sensitive values will appear redacted — the user would need to re-enter credentials for the target workspace.

Implementation Details

The underlying API calls (api_util.get_source() and api_util.get_destination()) already return SourceResponse / DestinationResponse objects that include configuration. The MCP tool just needs to pass it through. The _connector_info is already fetched and cached when source.name is accessed.

Key files:

  • airbyte/mcp/cloud.py: CloudSourceDetails, CloudDestinationDetails, describe_cloud_source(), describe_cloud_destination()
  • airbyte/cloud/connectors.py: CloudSource._fetch_connector_info() (line ~194), CloudDestination._fetch_connector_info() (line ~279)

2. Add connector_name to describe source/dest responses

Problem: describe_cloud_source returns connector_definition_id (a UUID), but deploy_source_to_cloud requires source_connector_name (e.g., "source-postgres"). There is no tool that maps definition_id → connector name, making it impossible to programmatically recreate a connector.

Affected code:

  • airbyte/mcp/cloud.pyCloudSourceDetails model has connector_definition_id but no connector_name
  • airbyte/mcp/cloud.pyCloudDestinationDetails model same issue

Proposed fix: Add connector_name field (e.g., "source-postgres") to both response models. The SourceResponse object includes source_type which can be mapped to the connector name format.


P1: Important Gaps

3. Add config_api_root parameter to Coral MCP tools

Problem: The Ops MCP tools (get_connection_state, get_connection_catalog) accept a config_api_root parameter to target self-managed Airbyte instances. But all Coral MCP tools resolve the API root from env vars only — they have no equivalent override parameter. This prevents reading from or writing to self-managed instances without switching environment variables.

Affected code:

  • airbyte/mcp/cloud.py_get_cloud_workspace() function (line ~238-270) hardcodes API root from env/config
  • All Coral MCP cloud tools that call _get_cloud_workspace()

Proposed fix: Add an optional config_api_root parameter to _get_cloud_workspace() and propagate it to the relevant MCP tool signatures (at minimum: describe_cloud_source, describe_cloud_destination, describe_cloud_connection, get_connection_artifact, deploy_source_to_cloud, deploy_destination_to_cloud, create_connection_on_cloud).

Reference: Ops MCP approach

The Ops MCP already implements this pattern in connection_state.py:

config_api_root: Annotated[
    str | None,
    Field(
        description="Optional API root URL override. "
        "Defaults to Airbyte Cloud. "
        "Use this to target local or self-hosted deployments.",
        default=None,
    ),
] = None,

And passes it through: api_root=config_api_root or constants.CLOUD_API_ROOT

4. Add schedule and enabled status to describe_cloud_connection

Problem: describe_cloud_connection returns source_id, dest_id, selected_streams, and table_prefix — but omits schedule type (cron/manual), cron expression, and enabled/disabled status. These are needed for a faithful migration.

Affected code:

  • airbyte/mcp/cloud.pyCloudConnectionDetails model (line ~120-140) missing schedule and status fields
  • airbyte/mcp/cloud.pydescribe_cloud_connection() function (line ~993-1022)

Proposed fix: Add schedule_type, cron_expression, and status (active/inactive) fields to CloudConnectionDetails, populated from the ConnectionResponse data that is already fetched.


Checklist

  • P0: Add config to describe_cloud_source / describe_cloud_destination responses
  • P0: Add connector_name to source/dest describe responses
  • P1: Add config_api_root parameter to Coral MCP cloud tools
  • P1: Add schedule/status to describe_cloud_connection response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions