From 60cd065c98c0e0ca1f37351705b85122806fba50 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 00:05:03 +0000 Subject: [PATCH 1/4] feat: Add poe-command workflow and poe slash command Co-Authored-By: AJ Steers --- .github/workflows/poe-command.yml | 35 ++++++++++++++++++++ .github/workflows/slash_command_dispatch.yml | 1 + 2 files changed, 36 insertions(+) create mode 100644 .github/workflows/poe-command.yml diff --git a/.github/workflows/poe-command.yml b/.github/workflows/poe-command.yml new file mode 100644 index 000000000..ac8e044bf --- /dev/null +++ b/.github/workflows/poe-command.yml @@ -0,0 +1,35 @@ +name: On-Demand Poe Task + +on: + workflow_dispatch: + inputs: + comment-id: + description: "Optional comment-id of the slash command. Ignore if not applicable." + required: false + pr: + description: "PR Number" + required: false + +permissions: + contents: write + pull-requests: write + +jobs: + run-poe-command: + runs-on: ubuntu-latest + steps: + - name: Authenticate as GitHub App + uses: actions/create-github-app-token@v2 + id: get-app-token + with: + owner: "airbytehq" + repositories: "PyAirbyte" + app-id: ${{ secrets.OCTAVIA_BOT_APP_ID }} + private-key: ${{ secrets.OCTAVIA_BOT_PRIVATE_KEY }} + + - name: Run Poe Slash Command Processor + uses: aaronsteers/poe-command-processor@v1.3.3 + with: + pr: ${{ github.event.inputs.pr }} + comment-id: ${{ github.event.inputs.comment-id }} + github-token: ${{ steps.get-app-token.outputs.token }} diff --git a/.github/workflows/slash_command_dispatch.yml b/.github/workflows/slash_command_dispatch.yml index c45a34ebc..916fa78a3 100644 --- a/.github/workflows/slash_command_dispatch.yml +++ b/.github/workflows/slash_command_dispatch.yml @@ -34,6 +34,7 @@ jobs: fix-pr test-pr poetry-lock + poe static-args: | pr=${{ github.event.issue.number }} comment-id=${{ github.event.comment.id }} From 188e6434cf67ce85a303c31d02969782e2e485ba Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 00:05:50 +0000 Subject: [PATCH 2/4] feat: Add test-my-tools poe task for Claude Code headless mode Co-Authored-By: AJ Steers --- pyproject.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0117343b9..e11621976 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -159,6 +159,16 @@ mcp-serve-sse = { cmd = "poetry run python -c \"from airbyte.mcp.server import a mcp-inspect = { cmd = "poetry run fastmcp inspect airbyte/mcp/server.py:app", help = "Inspect MCP tools and resources (supports --tools, --health, etc.)" } mcp-tool-test = { cmd = "poetry run python bin/test_mcp_tool.py", help = "Test MCP tools directly with JSON arguments: poe mcp-tool-test ''" } +# Claude Code MCP Testing Tasks +[tool.poe.tasks.test-my-tools] +help = "Run Claude Code in headless mode with the test-my-tools MCP prompt" +shell = """ +claude --print "Use the test-my-tools prompt${scope:+ with scope: $scope}" \ + --allowedTools "mcp__airbyte-mcp__*" \ + --mcp-config .mcp.json +""" +args = [{ name = "scope", default = "", help = "Optional scope/context to focus testing (e.g., 'focus on areas of the code changed versus main')" }] + [tool.airbyte_ci] extra_poetry_groups = ["dev"] poe_tasks = ["test"] From b44abc505ba5947641bfca4ae1db530c4f0114d9 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 00:19:00 +0000 Subject: [PATCH 3/4] feat: Use npx for stateless Claude Code execution in test-my-tools poe task Co-Authored-By: AJ Steers --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e11621976..c3706c9ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -163,7 +163,7 @@ mcp-tool-test = { cmd = "poetry run python bin/test_mcp_tool.py", help = "Test M [tool.poe.tasks.test-my-tools] help = "Run Claude Code in headless mode with the test-my-tools MCP prompt" shell = """ -claude --print "Use the test-my-tools prompt${scope:+ with scope: $scope}" \ +npx @anthropic-ai/claude-code --print "Use the test-my-tools prompt${scope:+ with scope: $scope}" \ --allowedTools "mcp__airbyte-mcp__*" \ --mcp-config .mcp.json """ From bd7b5aa355d2c976c63f9cc9cb4f6fefa0d383f5 Mon Sep 17 00:00:00 2001 From: "Aaron (AJ) Steers" Date: Tue, 16 Dec 2025 22:32:44 -0800 Subject: [PATCH 4/4] update poe task definition, add mcp json config --- .github/mcp-ci-tests.mcp.json | 16 ++++++++++++++++ pyproject.toml | 8 +++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 .github/mcp-ci-tests.mcp.json diff --git a/.github/mcp-ci-tests.mcp.json b/.github/mcp-ci-tests.mcp.json new file mode 100644 index 000000000..c78bd6e71 --- /dev/null +++ b/.github/mcp-ci-tests.mcp.json @@ -0,0 +1,16 @@ +{ + "mcpServers": { + "airbyte-mcp": { + "type": "stdio", + "command": "poetry", + "args": [ + "run", + "airbyte-mcp" + ], + "env": { + "GCP_GSM_CREDENTIALS": "${GCP_GSM_CREDENTIALS}", + "AIRBYTE_CLOUD_MCP_SAFE_MODE": "1" + } + } + } +} diff --git a/pyproject.toml b/pyproject.toml index c3706c9ea..4fa2b78d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -163,9 +163,11 @@ mcp-tool-test = { cmd = "poetry run python bin/test_mcp_tool.py", help = "Test M [tool.poe.tasks.test-my-tools] help = "Run Claude Code in headless mode with the test-my-tools MCP prompt" shell = """ -npx @anthropic-ai/claude-code --print "Use the test-my-tools prompt${scope:+ with scope: $scope}" \ - --allowedTools "mcp__airbyte-mcp__*" \ - --mcp-config .mcp.json +npx @anthropic-ai/claude-code --print "/mcp__airbyte-mcp__test-my-tools ${scope:+ $scope}" \ + --mcp-config=.github/mcp-ci-tests.mcp.json \ + --dangerously-skip-permissions \ + --verbose --output-format=stream-json | \ + jq -r '.message.content[]? | if .type == "text" then "💬 " + .text elif .type == "tool_use" then "🔧 " + .name + "(" + (.input | tojson) + ")" else empty end' 2>/dev/null """ args = [{ name = "scope", default = "", help = "Optional scope/context to focus testing (e.g., 'focus on areas of the code changed versus main')" }]