Skip to content

feat(mcp)!: split manifest_yaml into manifest_yaml_text and manifest_yaml_file - #1374

Merged
Aaron ("AJ") Steers (aaronsteers) merged 8 commits into
release-candidate/v1from
devin/1791951262-split-manifest-yaml-args
Oct 14, 2026
Merged

Aaron ("AJ") Steers (aaronsteers) merged 8 commits into
release-candidate/v1from
devin/1791951262-split-manifest-yaml-args

Conversation

@aaronsteers

@aaronsteers Aaron ("AJ") Steers (aaronsteers) commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Overview

👉 TL;DR: The tools for publishing and updating custom connectors now take the connector definition through two separate inputs: one for the text itself, and one for a file location that only appears on servers allowed to read local files. Before this, hosted agents passed a file location in the text input and got back a confusing error.

Specifically, publish_custom_source_definition and update_custom_source_definition replace manifest_yaml with manifest_yaml_text and manifest_yaml_file, and manifest_yaml_file is excluded from the tool schema when AIRBYTE_MCP_TRUSTED_EXECUTION is off.

Builds on:

Changes

  • manifest_yaml (str | Path | None, described as "inline YAML or a file path") is replaced by two args, and each description covers only its own arg:
    • manifest_yaml_text: str | None: the full YAML contents, never treated as a path.
    • manifest_yaml_file: str | None: an absolute path on the machine running the MCP server. It requires trusted execution.
  • register_cloud_tools adds manifest_yaml_file to exclude_args when trusted execution is disabled. This is the same mechanism that already hides workspace_id. The hosted Cloud MCP runs untrusted, so it no longer advertises a file input. The gate is evaluated at registration time, not at import.
  • Both tools pass extra_help_text=_manifest_yaml_source_hint, a zero-arg callable that fastmcp-extensions resolves at registration. Only when both args are exposed does it append "Provide the manifest as either manifest_yaml_text or manifest_yaml_file, not both." The mcp_tool wrapper in _tool_utils.py now accepts the callable type.
  • fastmcp-extensions is bumped to >=0.35.0,<1.0.0.
  • resolve_manifest_yaml(*, manifest_yaml_text, manifest_yaml_file):
    • rejects calls that pass both;
    • rejects a file when untrusted (AirbyteTrustedExecutionRequiredError);
    • drops the old heuristic that turned single-line text into a path in trusted mode.
  • The publish "no manifest" error and the update "at least one of ..." error mention manifest_yaml_file only when it's exposed.
  • In update_custom_source_definition, the manifest args are now keyword-only.

Review Spotlight

Reviewers with limited time, please review first:

Breaking changes

  • MCP callers passing manifest_yaml to either tool now fail FastMCP validation with Unexpected keyword argument. They must switch to manifest_yaml_text, or to manifest_yaml_file on trusted local servers.
  • Local stdio servers without AIRBYTE_MCP_TRUSTED_EXECUTION enabled no longer show a file input. Path reads were already rejected there.
  • Single-line manifest_yaml_text is never read as a path, even in trusted mode. Use manifest_yaml_file instead.
  • The Python API (CloudWorkspace.publish_custom_source_definition(manifest_yaml=...), update_definition(manifest_yaml=...)) is unchanged.

Test plan

  • tests/unit_tests/test_mcp_trusted_execution.py covers:
    • resolver cases;
    • schema and description: with trusted execution off and then on, manifest_yaml_file and the "not both" hint appear only when trusted, and manifest_yaml never appears;
    • missing-manifest errors in both modes.
  • tests/unit_tests/test_mcp_arg_trace_parity.py and its fixture are updated for both new args.

Link to Devin session: https://app.devin.ai/sessions/759182bd74904028a5c714645866125e
Open in Devin Desktop: https://app.devin.ai/desktop/session/759182bd74904028a5c714645866125e?variant=devin
Requested by: Aaron ("AJ") Steers (@aaronsteers)

…yaml_file

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

Copy link
Copy Markdown
Contributor

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • 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/1791951262-split-manifest-yaml-args' pyairbyte --help

# Install PyAirbyte from this branch for development:
pip install 'git+https://github.com/airbytehq/PyAirbyte.git@devin/1791951262-split-manifest-yaml-args'

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.

🟢 Approval recommended

The implementation matches the described contract and includes focused resolver, schema, and telemetry coverage.

0 open findings

What changed in this PR

Splits custom connector manifest input into explicit text and trusted local-file arguments.

Changes:

  • Adds separate manifest_yaml_text and manifest_yaml_file inputs.
  • Hides file inputs when trusted execution is disabled.
  • Updates resolver, schema, and tracing tests.
File Description
airbyte/​mcp/​cloud.py Updates tool arguments, validation, and schema registration.
airbyte/​mcp/​_arg_resolvers.py Resolves explicit text or trusted file inputs.
tests/​unit_tests/​test_mcp_trusted_execution.py Tests resolver and trust-dependent schemas.
tests/​unit_tests/​test_mcp_arg_trace_parity.py Handles trust-dependent trace inventories.
tests/​unit_tests/​fixtures/​arg_trace_plan.json Records tracing policies for both new arguments.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@aaronsteers
Aaron ("AJ") Steers (aaronsteers) marked this pull request as ready for review October 14, 2026 04:25
@github-code-quality

github-code-quality Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: Python

Python / code-coverage/pytest-no-creds

The overall line coverage in commit d3c8cc1 in the devin/1791951262-spl... branch is 79%. The line coverage in commit d9f652f in the release-candidate/v1 branch is 65%.

Show a line coverage summary of the most impacted files.
File release-candidate/v1 d9f652f devin/1791951262-spl... d3c8cc1 +/-
airbyte/mcp/cloud.py 52% 83% +31%
airbyte/_util/api_util.py 36% 68% +32%
airbyte/cloud/connectors.py 34% 75% +41%
airbyte/mcp/_datadog.py 0% 50% +50%
airbyte/mcp/_user_identity.py 0% 93% +93%
airbyte/_direct...ctors/models.py 0% 94% +94%
airbyte/mcp/_telemetry.py 0% 94% +94%
airbyte/mcp/_sso_auth.py 0% 96% +96%
airbyte/cloud/models.py 0% 97% +97%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%

Python / code-coverage/pytest

The overall line coverage in commit d3c8cc1 in the devin/1791951262-spl... branch is 81%. The line coverage in commit d9f652f in the release-candidate/v1 branch is 71%.

Show a line coverage summary of the most impacted files.
File release-candidate/v1 d9f652f devin/1791951262-spl... d3c8cc1 +/-
airbyte/cloud/connectors.py 51% 80% +29%
airbyte/mcp/cloud.py 52% 83% +31%
airbyte/mcp/_datadog.py 0% 50% +50%
airbyte/mcp/int..._registry_ui.py 0% 92% +92%
airbyte/mcp/_user_identity.py 0% 93% +93%
airbyte/_direct...ctors/models.py 0% 94% +94%
airbyte/mcp/_telemetry.py 0% 94% +94%
airbyte/mcp/_sso_auth.py 0% 96% +96%
airbyte/cloud/models.py 0% 97% +97%
airbyte/mcp/int...nc_status_ui.py 0% 97% +97%

Python / code-coverage/pytest-unit

The overall line coverage in commit d3c8cc1 in the devin/1791951262-spl... branch is 76%. Line coverage data for the release-candidate/v1 branch is not yet available.

Show a line coverage summary of the most covered files.
File release-candidate/v1 devin/1791951262-spl... d3c8cc1 +/-
airbyte/cloud/models.py — 97% —
airbyte/mcp/_sso_auth.py — 96% —
airbyte/_direct...ctors/models.py — 94% —
airbyte/cloud/client.py — 90% —
airbyte/exceptions.py — 89% —
airbyte/mcp/cloud.py — 83% —
airbyte/progress.py — 80% —
airbyte/cloud/connectors.py — 75% —
airbyte/_util/api_util.py — 68% —
airbyte/shared/...ql_processor.py — 68% —

Updated October 14, 2026 05:33 UTC

Comment thread airbyte/mcp/cloud.py Outdated
…ile description

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

@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: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Devin Review

Comment thread airbyte/mcp/cloud.py Outdated
Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/mcp/cloud.py
Comment thread airbyte/mcp/cloud.py Outdated
Comment thread airbyte/mcp/cloud.py Outdated
Comment thread airbyte/mcp/cloud.py Outdated
Comment thread airbyte/mcp/cloud.py Outdated
Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread airbyte/mcp/cloud.py Outdated
Comment thread airbyte/mcp/cloud.py Outdated
devin-ai-integration Bot and others added 2 commits October 14, 2026 05:03
Co-Authored-By: AJ Steers <aj@airbyte.io>
Comment thread pyproject.toml Outdated
Co-Authored-By: AJ Steers <aj@airbyte.io>
@aaronsteers
Aaron ("AJ") Steers (aaronsteers) merged commit f54527f into release-candidate/v1 Oct 14, 2026
29 checks passed
@aaronsteers
Aaron ("AJ") Steers (aaronsteers) deleted the devin/1791951262-split-manifest-yaml-args branch October 14, 2026 15:11
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