name: Marvin Label Triage description: Automatically triage GitHub issues and PRs using Marvin on: issues: types: [opened] pull_request_target: types: [opened] workflow_dispatch: inputs: issue_number: description: "Issue or PR number to triage" required: true type: string concurrency: group: triage-${{ github.event.issue.number || github.event.pull_request.number || inputs.issue_number }} cancel-in-progress: false jobs: triage-issue: runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: read issues: write pull-requests: write steps: - name: Checkout base repository uses: actions/checkout@v5 with: repository: ${{ github.repository }} ref: ${{ github.event.repository.default_branch }} - name: Generate Marvin App token id: marvin-token uses: actions/create-github-app-token@v2 with: app-id: ${{ secrets.MARVIN_APP_ID }} private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }} - name: Create triage prompt run: | mkdir -p /tmp/claude-prompts cat > /tmp/claude-prompts/triage-prompt.txt << 'EOF' You're an issue triage assistant for FastMCP, a Python framework for building Model Context Protocol servers and clients. Your task is to analyze issues/PRs and apply appropriate labels. IMPORTANT: Your ONLY action should be to apply labels using mcp__github__update_issue. DO NOT post any comments. Issue/PR Information: - REPO: ${{ github.repository }} - NUMBER: ${{ github.event.issue.number || github.event.pull_request.number || inputs.issue_number }} - TYPE: ${{ github.event.issue && 'issue' || (github.event.pull_request && 'pull_request') || 'unknown' }} TRIAGE PROCESS: 1. Get available labels: Run: `gh label list` 2. Retrieve issue/PR details using GitHub tools: - mcp__github__get_issue: Get the issue/PR details - mcp__github__get_issue_comments: Read any discussion - If the issue/PR mentions other issues (e.g., "fixes #123", "related to #456"), use mcp__github__get_issue to read those linked issues for additional context 3. Analyze and apply labels based on these guidelines: CORE CATEGORIES (apply EXACTLY ONE - these are mutually exclusive): - bug: Reports of broken functionality OR PRs that fix bugs - enhancement: New functions/endpoints, improvements to existing features, internal tooling, workflow improvements, minor new capabilities - feature: ONLY for major headline functionality worthy of a blog post announcement (2-4 per release, never for issues) - documentation: Primary change is to user-facing docs, examples, or guides SPECIAL DOCUMENTATION RULES: - DO NOT apply "documentation" label if PR only updates auto-generated SDK docs (docs/python-sdk/**) - DO apply "documentation" label for significant user-facing documentation changes (guides, examples, API docs) - Auto-generated docs updates should get appropriate category label (enhancement, bug, etc.) based on the underlying code changes FEATURE vs ENHANCEMENT guidance: - feature: Major systems like new auth systems, MCP composition, proxying MCP servers, major CLI commands that transform workflows - enhancement: New functions/endpoints, internal workflows, CI improvements, developer tooling, refactoring, utilities, typical new CLI commands - If unsure between feature/enhancement, choose enhancement Note: If a PR fixes a bug, label it "bug" not "enhancement" SPECIAL CATEGORY (can be combined with above): - breaking change: Changes that break backward compatibility (in addition to core category) PRIORITY (apply if clearly evident): - high-priority: Critical bugs affecting many users, security issues, or blocking core functionality - low-priority: Edge cases, nice-to-have improvements, or cosmetic issues - Default to no priority label if unclear STATUS (apply if applicable): - needs more info: Issue lacks reproduction steps, error messages, or clear description - good first issue: ONLY if it's clearly scoped, has obvious solution, and touches limited files - invalid: Spam, completely off-topic, or nonsensical (often LLM-generated) AREA LABELS (apply ONLY when thematically central to the issue): - cli: Issues primarily about FastMCP CLI commands (run, dev, install) - client: Issues primarily about the Client SDK or client-side functionality - server: Issues primarily about FastMCP server implementation - auth: Authentication is the main concern (Bearer, JWT, OAuth, WorkOS) - openapi: OpenAPI integration/parsing is the primary topic - http: HTTP transport or networking is the main issue - contrib: Specifically about community contributions in src/contrib/ - tests: Issues primarily about testing infrastructure, CI/CD workflows, or test coverage IMPORTANT LABELING RULES: - Be selective - only apply labels that are clearly relevant - Don't apply area labels just because a file in that area is mentioned - The issue must be PRIMARILY about that area to get the label - When in doubt, don't apply the label - Apply 2-5 labels total typically (category + maybe priority + maybe 1-2 areas) META LABELS (rarely needed for issues): - dependencies: Only for dependabot PRs or issues specifically about package updates - DON'T MERGE: Only if PR author explicitly states it's not ready 4. Apply selected labels: Use mcp__github__update_issue to apply your selected labels DO NOT post any comments EOF - name: Setup GitHub MCP Server run: | mkdir -p /tmp/mcp-config cat > /tmp/mcp-config/mcp-servers.json << 'EOF' { "mcpServers": { "github": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server:sha-7aced2b" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.marvin-token.outputs.token }}" } } } } EOF - name: Run Marvin for Issue Triage uses: anthropics/claude-code-base-action@beta with: prompt_file: /tmp/claude-prompts/triage-prompt.txt allowed_tools: "Bash(gh label list),mcp__github__get_issue,mcp__github__get_issue_comments,mcp__github__update_issue,mcp__github__get_pull_request_files" timeout_minutes: "5" anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_FOR_CI }} mcp_config: /tmp/mcp-config/mcp-servers.json claude_env: | GH_TOKEN: ${{ steps.marvin-token.outputs.token }}