{
  "schema_version": 1,
  "title": "bugAgent MCP tool index",
  "description": "Generated from the MCP runtime. OAuth-only means a workspace API-key scope does not unlock the tool.",
  "server_url": "https://mcp.bugagent.com/mcp",
  "tools": [
    {
      "name": "create_bug_report",
      "description": "File a new bug report. Auto-classifies bug type if not provided. Returns the created report with classification.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "title",
        "description",
        "type",
        "severity",
        "priority",
        "browser",
        "os",
        "device",
        "url",
        "attachments",
        "filename",
        "data",
        "project",
        "is_epic",
        "parent_epic_id",
        "assigned_to",
        "format_description",
        "time_spent_seconds"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_bug_reports",
      "description": "List bug reports with optional filters by workspace, project, type, severity, status, resolution, root cause, reporter, or search query. A digits-only search such as `366` is an exact lookup against both legacy and project ticket numbers. Project filters are applied server-side before pagination, so `project: \"bugagent\"` returns the true newest matching reports for that project. Each result includes tenant-scoped reporter_user_id, reporter_name, assigned_to, and assignee_name fields. Report reads do not expose member email addresses.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "workspace",
        "workspace_id",
        "team_id",
        "project",
        "project_id",
        "project_slug",
        "project_prefix",
        "type",
        "severity",
        "status",
        "resolution",
        "root_cause",
        "reporter_user_id",
        "is_epic",
        "search",
        "limit",
        "offset"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "pick_next_bug",
      "description": "Return the next bug(s) the agent loop should work on, ordered by priority (S1 → S2 → S3, oldest first within each bucket). Automatically scoped to your workspace — shows tickets across all projects in your team with status new, awaiting-triage, or confirmed. READ-ONLY — does not atomically claim tickets. Use claim_bug when actually picking up work. Returns { count, bugs }; each bug contains identifiers, people, title, severity, status, type, createdAt, and assignedTo.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "severity",
        "limit"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "claim_bug",
      "description": "Atomically claim a bug for the calling user. Sets status=\"in-progress\", assigned_to=caller, and claimed_at=NOW() — but ONLY if the ticket is currently in status new, awaiting-triage, or confirmed. Returns {claimed: true, bug} if the claim succeeded; {claimed: false, reason} if another consumer already claimed it (race-loser path) or the ticket no longer exists. Successful responses include tenant-scoped reporter_user_id, reporter_name, assigned_to, and assignee_name fields. Race-free via Postgres row-level lock — safe to call from multiple agents/replicas concurrently. Pair with pick_next_bug for the read-then-claim pattern.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_bug_report",
      "description": "Get full details of a specific bug report by ID. Accepts either the UUID or the workspace-scoped short ID (e.g. TEST-BA-123). Short IDs are resolved within the caller's team only. Returns tenant-scoped reporter_user_id, reporter_name, assigned_to, and assignee_name fields without exposing member email addresses.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_epic_children",
      "description": "List one page of child reports for an Epic. Accepts an Epic UUID or short ID. Returns bounded child summaries plus aggregate progress for all children without loading the full Epic into one response.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "id",
        "limit",
        "offset"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_bug_report",
      "description": "Update an existing bug report. Only provided fields will be changed. Use assigned_to with a user ID returned by a report read (OAuth sessions may also use list_team_members). Accepts either the UUID or the short ID (e.g. TEST-BA-123). Set `resolution` and `root_cause` whenever transitioning out of `new` — required by the agent-loop convention so analytics + Kanban render correctly.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "id",
        "title",
        "description",
        "type",
        "severity",
        "priority",
        "status",
        "resolution",
        "root_cause",
        "assigned_to",
        "is_epic",
        "parent_epic_id",
        "internal_notes",
        "time_spent_seconds"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "classify_bug",
      "description": "Classify a bug description into a bug type (ui, performance, crash, security, logic, data, network) with confidence score.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "title",
        "description"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_usage",
      "description": "Check current usage against plan limits. Shows reports used and remaining quota for your plan period.",
      "access": "api_key_and_oauth",
      "api_key_scope": "usage:read",
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "sync_to_jira",
      "description": "Sync a bug report to Jira. Creates a Jira issue with mapped fields, labels, and priority (translated through the project's field map). Routes to the Jira project mapped to the report's bugAgent project, else the workspace default. Requires a connected Jira account. Reports created while the project's sync mode is auto_new or auto_all are pushed automatically — only call this for a manual push or to target a different project key.",
      "access": "api_key_and_oauth",
      "api_key_scope": "jira:write",
      "entitlement": "jira",
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "push_to_claude",
      "description": "Generate (or regenerate) the Developer Notes for a bug report — root cause, affected areas, suggested fix, verification steps, and risk assessment. Internally runs a multi-step chain that adapts to severity: medium/low bugs get a three-step chain (Sonnet draft → OpenAI challenger critique → Sonnet synthesis); critical/high bugs escalate to a five-step debate (draft → critique → Sonnet rebuttal → adjudicator, where a different model — default Claude Opus — reads the full transcript and writes the final notes with independent judgment). The response exposes every round (draft, critique, rebuttal, challenger_model, adjudicator_model, debated flag) so agents can inspect the reasoning chain. Any step failing falls through to the next-best answer. Uses platform keys — no per-team Claude connection required. Auto-fires on bug creation. Accepts UUID or short ID (PREFIX-NNN).",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "report_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "analyze_fix_area",
      "description": "Generate (or regenerate) the \"Likely Fix Area\" for a bug report — a narrow Sonnet output that names where in the codebase the fix most likely belongs. Uses the platform Anthropic key (no per-team Claude connection required). When the project has a GitHub repo mapped and the team has a github_connections row, the output is grounded in real file snippets; otherwise it falls back to general guidance with a nudge to connect a repo. Writes the result back onto bug_reports (likely_fix_area, likely_fix_area_status, likely_fix_area_generated_at) so the dashboard picks it up automatically. Accepts UUID or short ID (PREFIX-NNN).",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "report_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_projects",
      "description": "List available projects for the current user. Returns workspace and project UUIDs, names, slugs, ticket prefixes, and which project is the default. Use id, slug, name, or ticket prefix with create_bug_report and list_bug_reports to target a specific project.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_stats",
      "description": "Get bug report statistics: daily counts, breakdowns by type/severity/status. Use to answer questions like \"how many bugs yesterday?\" or \"what types of bugs are most common?\"",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "days"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "upgrade_plan",
      "description": "Request bugAgent Enterprise. Enrollment is sales-assisted, so this returns the sales contact page instead of creating a checkout session.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "plan",
        "billing"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "register_account",
      "description": "Create a new bugAgent account with email and password. The account is auto-confirmed and ready to use immediately. Returns user_id and email.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "email",
        "password",
        "full_name"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "login",
      "description": "Sign in to bugAgent with email and password. Returns access tokens. In stdio mode, credentials are saved to ~/.bugagent/credentials.json for future sessions.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "email",
        "password"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": true
      }
    },
    {
      "name": "update_profile",
      "description": "Update your display name.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "full_name"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "change_password",
      "description": "Change your account password.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "new_password"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_settings",
      "description": "Get your profile info, plan, and notification preferences.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_settings",
      "description": "Update notification preferences.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "email_usage_warning"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_project",
      "description": "Create a new project. The first project becomes the default. Enforces plan limits.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "name",
        "description"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "delete_project",
      "description": "Delete a project. Choose how to handle its bug reports: move to another project, unassign, or delete them. All other project data (automations, test cases, mobile apps, schedules, geo snaps, notes, time entries) is permanently deleted. Only owner/manager can delete. Cannot delete last project.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "project",
        "report_action",
        "move_to_project"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "create_performance_test",
      "description": "Create a performance test configuration. Combines Lighthouse page audits with k6 Cloud load testing. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "performance",
      "inputs": [
        "name",
        "url",
        "device",
        "duration"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_performance_tests",
      "description": "List performance test configurations for the current team.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "run_performance_test",
      "description": "Run a Lighthouse + k6 Cloud performance test. Triggers a page audit and optional load test. Results include Core Web Vitals, performance scores, and load test metrics. Auto-creates bug reports when thresholds are breached.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "performance",
      "inputs": [
        "test_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "get_performance_results",
      "description": "Get results for a performance test run. Includes Lighthouse scores (Performance, Accessibility, Best Practices, SEO), Core Web Vitals (LCP, FID, CLS, FCP, TTFB, INP, TBT, SI), and load test metrics (VUs, requests, RPS, p50/p90/p95/p99 latencies).",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "run_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_performance_usage",
      "description": "Check monthly performance test usage against plan limits. Performance testing is Enterprise-only and unlimited. Free workspaces cannot run performance tests; admins bypass plan limits.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_security_scan",
      "description": "Create a security scan configuration. Web: Quick Scanner + Nuclei + ZAP DAST. Mobile: MobSF binary analysis for APK/IPA. Code: Semgrep SAST for 30+ languages. Configurable auto-bug creation with severity threshold. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "security",
      "inputs": [
        "name",
        "scan_type",
        "url",
        "app_id",
        "repo_url",
        "repo_branch",
        "repo_token",
        "scan_depth",
        "auto_create_bug",
        "min_severity_for_bug"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_security_scans",
      "description": "List security scan configurations for the current team. Returns scan names, types, targets, and status.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "run_security_scan",
      "description": "Trigger a security scan run. Web: Quick Scanner + Nuclei + ZAP. Mobile: MobSF binary analysis. Code: Semgrep SAST. Returns a run ID to poll for results.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "security",
      "inputs": [
        "scan_id",
        "scan_depth"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_security_results",
      "description": "Get results for a security scan run. Includes findings categorized by severity (Critical, High, Medium, Low, Info) with vulnerability type, description, affected URL/file, and remediation guidance.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "run_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_security_usage",
      "description": "Check monthly security scan usage against plan limits. Security scanning is Enterprise-only. Limits: Enterprise=unlimited, Admin=unlimited.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_code_reviews",
      "description": "List recent AI code reviews for the team. Returns review ID, repo, PR number/title, quality score, severity counts, and timestamps. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_code_review",
      "description": "Get a code review with all findings. Each finding includes severity, category (bug/security/performance/style/logic/maintainability), title, description, code suggestion, file path, and line numbers.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "review_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_code_review_usage",
      "description": "Check monthly code review usage. AI code review is Enterprise-only and unlimited. Free workspaces cannot run code reviews.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_code_review_analytics",
      "description": "Get code review analytics: trends, finding categories/sources, severity breakdown, velocity metrics, top repos, top authors. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "days"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_explorations",
      "description": "List Exploratory AI configs for the team. Each exploration targets a URL and can be run to autonomously find bugs.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_exploration",
      "description": "Create a new Exploratory AI config. The exploration will autonomously crawl the target URL, generate test scripts, execute them, and file bug reports for issues found. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "exploration",
      "inputs": [
        "name",
        "target_url",
        "focus_areas",
        "instructions",
        "max_depth",
        "agent_count"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": false,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_exploration",
      "description": "Get an exploration config with its recent runs.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_exploration_run",
      "description": "Get results of an exploration run including all findings, phase data, and linked bugs.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "run_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_exploration_usage",
      "description": "Check monthly Exploratory AI usage. Exploratory AI is Enterprise-only. Enterprise: unlimited.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "flush_reports",
      "description": "Bulk delete old bug reports. Only team owners and admins can flush. Optionally limit to a specific project.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "months",
        "project"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "generate_api_key",
      "description": "Create a named API key. The full key is returned only once — save it securely.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "name",
        "scopes",
        "expires_in_days"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_api_keys",
      "description": "List your active API keys. Shows key prefix (first 16 chars) but never the full key.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "regenerate_api_key",
      "description": "Revoke an existing API key and create a new one with the same name and scopes. The new key is returned only once.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "key_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "delete_api_key",
      "description": "Revoke and delete an API key. The key will immediately stop working.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "key_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "check_jira_sync",
      "description": "Check if a Jira-synced bug report has remote changes. Returns field differences and new Jira comments. Use before merge_jira_sync.",
      "access": "api_key_and_oauth",
      "api_key_scope": "jira:read",
      "entitlement": "jira",
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": true
      }
    },
    {
      "name": "merge_jira_sync",
      "description": "Bi-directional merge between bugAgent and Jira. Updates both systems to match. Use check_jira_sync first to see differences.",
      "access": "api_key_and_oauth",
      "api_key_scope": "jira:write",
      "entitlement": "jira",
      "inputs": [
        "id",
        "prefer"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "add_comment",
      "description": "Add a comment to a bug report. If the report is synced to Jira, the comment is automatically pushed to the Jira issue. Accepts UUID or short ID (PREFIX-NNN). Pass author_user_id to post the comment as a specific agent account (the target user must have is_agent=true — use list_team_members to find the Claude bot user ID).",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "report_id",
        "content",
        "author_user_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_comments",
      "description": "List all comments on a bug report, oldest first, with author names. Comments are not part of get_bug_report — use this to read the discussion thread on a ticket. Accepts UUID or short ID (PREFIX-NNN).",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "report_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "link_bug_reports",
      "description": "Create a directional link between two bug reports. Use `duplicate-of` to mark one report as a duplicate of another, `parent-of` for parent/child hierarchies, `related-to` for a non-directional related-issue link, `depends-on` to record that the from-report cannot ship until the to-report does, and `testing-blocked-by` when testing the from-report is blocked by the to-report. Both reports must be in the same workspace and project. Accepts UUIDs or short IDs (PREFIX-NNN).",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "from_report_id",
        "to_report_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "unlink_bug_reports",
      "description": "Remove a previously-created bug-report link by its UUID. Use list_bug_report_links to find the link_id.",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:write",
      "entitlement": null,
      "inputs": [
        "link_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_bug_report_links",
      "description": "List every user-curated link touching a bug report. Returns the link as it reads from this report's perspective — a stored `duplicate-of` row where this report is the target renders as `duplicated-by`, a `parent-of` row where this report is the target renders as `subtask-of`, `depends-on` rows where this report is the target render as `blocks`, and `testing-blocked-by` rows where this report is the target render as `blocks-testing`. `related-to` is symmetric. Accepts UUID or short ID (PREFIX-NNN).",
      "access": "api_key_and_oauth",
      "api_key_scope": "reports:read",
      "entitlement": null,
      "inputs": [
        "report_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_team_members",
      "description": "List all members of your current team/workspace with their roles and status.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "invite_team_member",
      "description": "Invite a user to your team by email. Only managers and above can invite. The invited user receives an email with a 5-day expiry link.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "email",
        "role"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "create_automation",
      "description": "Create a new automation with a custom Playwright script (no FAB recording required). Returns the automation ID. Available on both plans within workspace limits; live-browser execution requires Enterprise. To duplicate an existing automation, first call get_automation to retrieve the script, then call this tool with name set to \"[Copy] Original Name\" and pass the original script, target_url, and project_id. The duplicate starts in draft status with no version history.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "name",
        "target_url",
        "script",
        "status",
        "test_type",
        "tags",
        "linked_requirement",
        "project_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_automations",
      "description": "List Playwright automation scripts for the current team. Filter by project or status.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "project_id",
        "status"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_automation",
      "description": "Get full details of a Playwright automation script including the generated script code, recent run history, and the saved script_versions stack. Inspect script_versions (array of { script, source, timestamp, version }, oldest-first, capped at 100) before calling run_automation with the durable version_label if you need to replay a specific historical version; omit both version selectors to run the current live script.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "run_automation",
      "description": "Trigger an immediate run of a Playwright automation script. Runs on virtual headless browser by default, or on a real BrowserStack browser when browserstack=true. The automation's saved login profile and authenticated-session mode are honored; configure those in the dashboard before running. Broken locators self-heal automatically: when a locator action times out, the runner asks Claude for a working selector and retries the step once (assertions are never healed, so real regressions still fail); each heal is logged in the run stdout. Prefer version_label to replay a historical version of the script instead of the current live one.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:run",
      "entitlement": null,
      "inputs": [
        "automation_id",
        "device",
        "browserstack",
        "bs_browser",
        "bs_os",
        "bs_os_version",
        "version_index",
        "version_label"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_automation_runs",
      "description": "List recent runs for a Playwright automation script with status, duration, and error details.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:run",
      "entitlement": null,
      "inputs": [
        "automation_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_schedules",
      "description": "List all scheduled automation runs for the current team with cron expression, timezone, and notification settings.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_schedule",
      "description": "Create a scheduled automation run. Specify cron expression, timezone, and optional failure notifications (email, slack, or both).",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "automation_id",
        "cron_expression",
        "timezone",
        "device",
        "notify_on_fail",
        "slack_channel_id",
        "slack_channel_name",
        "notify_email"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "delete_schedule",
      "description": "Delete a scheduled automation run.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_mobile_schedules",
      "description": "List all scheduled mobile automation runs for the current team.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_mobile_schedule",
      "description": "Create a scheduled mobile automation run on a real device. Private login profiles require their active creator; shared profiles require active access to the same project.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "automation_id",
        "cron_expression",
        "timezone",
        "devices",
        "notify_on_fail",
        "notify_email",
        "slack_channel_id",
        "slack_channel_name"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": false,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "delete_mobile_schedule",
      "description": "Delete a scheduled mobile automation run. Only the active schedule creator or an active workspace owner/admin may delete it.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_security_schedules",
      "description": "List all scheduled security scans for the current team. Includes web DAST, code SAST, and mobile binary analysis scans.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_security_schedule",
      "description": "Create a scheduled security scan. One schedule per scan config. Enterprise security runs are unlimited; admins bypass plan limits. Scan depth is read from the scan config at run time — edit the config to change it.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "security",
      "inputs": [
        "scan_id",
        "cron_expression",
        "timezone",
        "notify_on_fail",
        "notify_email",
        "slack_channel_id",
        "slack_channel_name"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": false,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "delete_security_schedule",
      "description": "Delete a scheduled security scan.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "optimize_automation_script",
      "description": "Send a Playwright automation script to Sonnet 4 for AI-powered optimization. Applies a 12-point checklist that automatically fixes selectors, wait strategies, assertions, error handling, auth patterns, mobile compatibility, and strict mode issues. The current script version is saved before optimization so you can undo the change.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "automation_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": false,
        "destructive": true,
        "open_world": true
      }
    },
    {
      "name": "undo_automation_script",
      "description": "Revert an automation script to its previous version. Up to 100 previous versions are retained. Versions are saved before manual edits, AI optimization, and script regeneration.",
      "access": "api_key_and_oauth",
      "api_key_scope": "automations:write",
      "entitlement": null,
      "inputs": [
        "automation_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": false,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_notes",
      "description": "List project-scoped testing notes. Shows your private notes plus shared/restricted notes you can access. Filter by project, folder, tag, full-text search keyword, wiki marker, date range, or archive state. Pass folder_id=\"unfiled\" to list notes with no folder; folder filters include child folders by default.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "project_id",
        "search",
        "visibility",
        "folder_id",
        "include_children",
        "tag",
        "archived",
        "date_from",
        "date_to",
        "wiki",
        "sort"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_note",
      "description": "Get full content of a specific note by ID. Shared notes require the project_id context.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "id",
        "project_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_note",
      "description": "Create a project-scoped testing note. Supports markdown, plain text, bug template, checklist, and outline formats. Notes can be private, shared with the project team, or restricted to selected teammates. Optionally mark as a wiki page, file into a project folder (use list_note_folders to find folder IDs), add tags, and attach base64-encoded files up to 400 MB each.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "title",
        "content",
        "format",
        "visibility",
        "allowed_user_ids",
        "project_id",
        "folder_id",
        "tags",
        "time_spent_seconds",
        "wiki_page",
        "attachments",
        "filename",
        "data"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "update_note",
      "description": "Update an existing note. Only the author can update their notes. Attachments passed in this call are APPENDED to the existing attachment list (existing attachments are preserved). Pass folder_id to move the note into a folder, or null to unfile it.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "id",
        "title",
        "content",
        "format",
        "visibility",
        "allowed_user_ids",
        "project_id",
        "folder_id",
        "tags",
        "time_spent_seconds",
        "wiki_page",
        "archived_at",
        "attachments",
        "filename",
        "data"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "delete_note",
      "description": "Delete a note. Only the author can delete their notes.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_note_folders",
      "description": "List note folders for one project that the caller can access. Returns folder names, IDs, visibility, parent_folder_id, depth, favorite, and sort order. Use folder IDs with create_note or update_note to file notes.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "project_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_note_folder",
      "description": "Create a new project-scoped note folder. Folders let teams organise notes into wiki-style sections and subfolders. Folders can be shared with the project team or restricted to selected teammates.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "name",
        "description",
        "parent_folder_id",
        "favorite",
        "sort_order",
        "visibility",
        "allowed_user_ids",
        "project_id"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "scale_team",
      "description": "Instantly scale your QA team with booster testers. Accounts are provisioned automatically with tester access. Available on Enterprise.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "team_size",
        "location",
        "duration",
        "product_url",
        "product_types",
        "tech_levels",
        "budget"
      ],
      "output": "structuredContent.result",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_time_entries",
      "description": "List time tracking entries for the team. Filter by period, project, or category. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "time_tracking",
      "inputs": [
        "period",
        "project_id",
        "category",
        "sort"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_time_entry",
      "description": "Create a new time tracking entry. Log hours spent on QA tasks with categories. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "time_tracking",
      "inputs": [
        "description",
        "category",
        "duration_minutes",
        "project_id",
        "entry_date"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "update_time_entry",
      "description": "Update an existing time tracking entry. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "time_tracking",
      "inputs": [
        "id",
        "description",
        "category",
        "duration_minutes",
        "project_id",
        "entry_date"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "delete_time_entry",
      "description": "Delete a time tracking entry. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "time_tracking",
      "inputs": [
        "id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_test_cases",
      "description": "List test cases with optional search, priority, type, status, and sort filters.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:read",
      "entitlement": null,
      "inputs": [
        "project",
        "search",
        "priority",
        "type",
        "status",
        "sort"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_test_case",
      "description": "Create a new test case. Two template variants: \"steps\" (default) — per-step Action + Expected Result grid (pass `steps`); \"text\" — single free-form description of the steps (pass `text_content`). Both columns can be sent in the same call; the platform stores both independently so a tester switching templates later doesn't lose either side's data.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:write",
      "entitlement": "test_cases",
      "inputs": [
        "project",
        "name",
        "description",
        "preconditions",
        "template_type",
        "steps",
        "action",
        "expected",
        "text_content",
        "urls",
        "priority",
        "type",
        "tags",
        "estimated_time"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_test_case",
      "description": "Get full test case details including steps and execution history.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:read",
      "entitlement": null,
      "inputs": [
        "id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_test_suites",
      "description": "List test suites with project identity, case count, and last run status.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_runs:read",
      "entitlement": "test_cases",
      "inputs": [
        "project",
        "search"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_test_suite",
      "description": "Create a project-scoped test suite. Pass parent_suite_id to nest under another suite. Max nesting depth is 3 levels (root/child/grandchild/great-grandchild).",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:write",
      "entitlement": "test_cases",
      "inputs": [
        "project",
        "name",
        "description",
        "parent_suite_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "bulk_update_test_cases",
      "description": "Apply a single action to many test cases at once. Supported actions: set_priority, set_status, set_type, add_tags, remove_tags, add_to_suite, pin, unpin. Up to 500 case IDs per call. IDs not in your team are silently skipped.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "test_cases",
      "inputs": [
        "ids",
        "action",
        "params"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "link_test_case_to_bug",
      "description": "Link a test case to a bug report — establishes traceability so the case shows up on the bug report and vice versa. The test case is recorded as proving (or covering or relating to) the linked bug.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "test_cases",
      "inputs": [
        "case_id",
        "bug_report_id",
        "relation"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_test_case_links",
      "description": "List all requirement / bug links for a single test case.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "case_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "list_test_case_review_candidates",
      "description": "List test cases the system has flagged as candidates for archival: never_run (no runs in 90+ days since creation), always_passes (5+ runs in last 90 days, all passed — possibly redundant), always_skipped (3+ runs in last 90 days, all skipped). Informational only — no auto-archive.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "never_run",
        "always_passes",
        "always_skipped"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "mark_test_case_review_flags",
      "description": "Persists current archive-candidate flags onto test_cases.review_flag for the team. Idempotent: clears stale flags before applying current ones. Safe to call any time; runs automatically every Monday at 09:00 UTC via pg_cron, but you can invoke on demand.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "marked"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_test_runs",
      "description": "List test runs with suite name, assignee, and pass/fail summary.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "search",
        "status",
        "suite_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_test_run",
      "description": "Create a test run from a suite. Snapshots all cases at creation time — INCLUDING every case in every descendant sub-suite (running a parent suite executes its whole subtree). A case linked to both a parent and a sub-suite is added exactly once.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "test_cases",
      "inputs": [
        "suite_id",
        "name",
        "description",
        "assigned_to"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "start_test_plan",
      "description": "Start or idempotently resume an external-agent execution from a human-curated suite. The run contains immutable, paginated case snapshots and includes descendant sub-suites. Reuse the same external_run_id after a timeout; a matching call returns the existing run instead of creating a duplicate.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_runs:write",
      "entitlement": "test_cases",
      "inputs": [
        "suite_id",
        "external_run_id",
        "name",
        "agent"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_test_run_plan",
      "description": "Read canonical state and one immutable page of an external-agent test run. Follow plan.next_cursor until plan.has_more is false. Existing result status is included so an interrupted worker can resume without rerunning completed cases.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_runs:read",
      "entitlement": "test_cases",
      "inputs": [
        "run_id",
        "cursor",
        "limit"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "report_test_results",
      "description": "Atomically submit up to 200 external-agent results for cases already in a run. Parallel batches serialize in the database. Exact retries are safe; a different second status for an already-tested case is rejected. The run completes automatically after every case has a result.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_runs:write",
      "entitlement": "test_cases",
      "inputs": [
        "run_id",
        "results",
        "case_id",
        "status",
        "actual_result",
        "notes",
        "duration_seconds"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "abort_test_run",
      "description": "Idempotently stop an interrupted external-agent run while preserving every result already submitted. Completed runs cannot be aborted.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_runs:write",
      "entitlement": "test_cases",
      "inputs": [
        "run_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_test_case_folders",
      "description": "List accessible test-case folders. Folders organize test cases hierarchically (one folder per case via test_cases.folder_id) — distinct from suites, which are many-to-many test-plan groupings. Returns up to 500 folders ordered by sort_order then name.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:read",
      "entitlement": null,
      "inputs": [
        "project",
        "project_id",
        "parent_folder_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "create_test_case_folder",
      "description": "Create a new test case folder. Nestable up to 3 levels deep via parent_folder_id. Folders organize the case catalog — use bulk_update_test_cases with action \"set_folder\" (via params.folder_id) to move cases into one.",
      "access": "api_key_and_oauth",
      "api_key_scope": "test_cases:write",
      "entitlement": "test_cases",
      "inputs": [
        "project",
        "name",
        "description",
        "parent_folder_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_test_reports_overview",
      "description": "Headline quality KPIs for a time window — pass rate, runs completed, cases executed — with deltas vs the prior equivalent window. Same numbers the Reports tab KPI strip shows. Default window is the trailing 30 days.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "from",
        "to",
        "project_id",
        "suite_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "get_test_reports_failures",
      "description": "Failure analysis for the window — four parallel \"what to fix?\" lists: failing_cases (>=50% fail, min 3 runs), flaky_cases (most pass/fail flips), failing_suites (>=30% fail, min 5 runs), regressed_cases (most-recent fail with an earlier pass in the window). Same data the Reports tab failure-analysis grid shows.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "from",
        "to",
        "project_id",
        "suite_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "upload_mobile_app",
      "description": "Upload an APK (Android) or IPA (iOS) mobile app for testing on real devices.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "name",
        "platform",
        "file_url",
        "project_id",
        "project"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "list_mobile_apps",
      "description": "List uploaded mobile apps in the workspace, optionally filtered by project and platform.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "project_id",
        "project",
        "platform",
        "limit"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_mobile_app",
      "description": "Replace a mobile app binary with a new version. Deletes old file, clears cached URLs, and all automations use the new version on next run. Private linked login profiles require their active creator; shared profiles require active access to the same project.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "app_id",
        "file_url",
        "version"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": true
      }
    },
    {
      "name": "create_mobile_automation",
      "description": "Create a mobile automation. Set execution_mode=browserstack_maestro to run one externally validated Maestro YAML flow natively. Native flows do not use recorded actions or AI refinement; they preserve validated Maestro runtime expressions such as ${maestro.copiedText} and ${output.value}, may reference ${USERNAME}/${PASSWORD} from a login profile, and may reference ${DATA_*} values from a same-project non-secret variable profile. The automation inherits the linked app project; a supplied project must match. Returns the automation ID. Enterprise only.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "name",
        "app_id",
        "script_type",
        "execution_mode",
        "script",
        "target_devices",
        "project_id",
        "project",
        "credential_id",
        "variable_profile_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_mobile_automations",
      "description": "List mobile automations in the workspace, optionally filtered by project, app, or status.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "project_id",
        "project",
        "app_id",
        "status",
        "limit"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "import_mobile_script",
      "description": "Import an existing mobile test script and turn it into a runnable bugAgent automation. Supported dialects: Appium-Python, WebdriverIO, Maestro (YAML flows), and Playwright (mobile-web). The script is parsed into executable steps that PRESERVE the developer's own locators (resource-id / accessibility-id / xpath / UiSelector; Maestro id/text; Playwright getByTestId→resource-id / getByRole/getByLabel/getByText), so runs resolve elements precisely instead of guessing from labels. Android apps only. Returns the new automation plus the parsed action count, detected dialect, and any warnings for selectors that could not be mapped. Enterprise only.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "name",
        "app_id",
        "script",
        "target_devices",
        "project_id",
        "project"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "create_mobile_credential",
      "description": "Create a reusable login profile for Mobile, Web Automation, and Exploratory AI. Secrets are AES-256-GCM encrypted and WRITE-ONLY. Private profiles are creator-only; shared profiles are available to active members with access to the same project. Enterprise only. This compatibility tool keeps its historical mobile name.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "project_id",
        "name",
        "username",
        "password",
        "visibility"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_mobile_credentials",
      "description": "List reusable login profiles visible to the caller. Private profiles from other users are omitted. Returns only non-secret metadata for use across Mobile, Web Automation, and Exploratory AI.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "project_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_mobile_credential",
      "description": "Rename or rotate a login profile. The active creator may manage any profile; workspace owners/admins may recover shared profiles. Private profiles remain creator-only. Username and password remain write-only and are never returned.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id",
        "name",
        "username",
        "password",
        "visibility"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "delete_mobile_credential",
      "description": "Delete (soft-delete) a login profile by id. The active creator may manage any profile; workspace owners/admins may recover shared profiles. Private profiles remain creator-only. The row is retained for audit and run history but is no longer usable or listed.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "create_login_profile",
      "description": "Create a project-scoped, write-only encrypted username/password profile reusable by Mobile, Web Automation, and Exploratory AI.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "project_id",
        "name",
        "username",
        "password",
        "visibility"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_login_profiles",
      "description": "List non-secret login-profile metadata visible to the caller. Private profiles owned by other users and inaccessible projects are omitted.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "project_id",
        "profiles"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_login_profile",
      "description": "Rename, rotate, or change the visibility of a login profile. The active creator may manage any profile; workspace owners/admins may recover shared profiles. Private profiles remain creator-only and secrets remain write-only.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id",
        "name",
        "username",
        "password",
        "visibility"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "delete_login_profile",
      "description": "Soft-delete a login profile. The active creator may delete it; workspace owners/admins may delete shared profiles. Private profiles remain creator-only.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "create_mobile_variable_profile",
      "description": "Create a project-scoped variable profile for reusable synthetic Maestro test data. Values are deliberately NON-SECRET: authorized project members can read them, and they may appear in private screenshots/video. Use only uppercase DATA_* keys and never store credentials, tokens, production personal data, or other secrets. Limits: 1-100 values, 4096 UTF-8 bytes per value, 65536 bytes total. Enterprise only.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "project_id",
        "name",
        "variables"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "list_mobile_variable_profiles",
      "description": "List the non-secret variable profiles in one authorized project. Returned DATA_* values are readable synthetic test data, not a secret vault. Do not put credentials, tokens, production personal data, or other secrets in these profiles.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "project_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": null,
        "open_world": false
      }
    },
    {
      "name": "update_mobile_variable_profile",
      "description": "Rename or replace the values in a project-scoped non-secret variable profile. Only its active creator or an active workspace owner/admin may update it. DATA_* values remain readable to authorized project members and may appear in private visual evidence; never store secrets here.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id",
        "name",
        "variables"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "delete_mobile_variable_profile",
      "description": "Soft-delete a project-scoped non-secret variable profile. Only its active creator or an active workspace owner/admin may delete it. Existing run history remains, and automation defaults are cleared.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:write",
      "entitlement": "mobile",
      "inputs": [
        "id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": true,
        "open_world": false
      }
    },
    {
      "name": "list_mobile_runs",
      "description": "List project-authorized mobile test runs with status, private video/screenshot links, BrowserStack session metadata, and filtered diagnostics. Credentialed native Maestro runs may include filtered logs, real step names/results, and detailed failures; when exact redaction context is unavailable, sensitive text is withheld and structural fallback diagnostics are returned. Mobile runs are triggered from the dashboard or on a schedule; archived runs are excluded by default.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:read",
      "entitlement": null,
      "inputs": [
        "automation_id",
        "status",
        "limit",
        "project_id",
        "project"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "run_mobile_automation",
      "description": "Trigger an immediate mobile automation run on a real device. For native Maestro, an omitted variable_profile_id inherits the automation default, null runs without one, and a UUID overrides the default. Every referenced ${DATA_*} key must exist. Variable profiles contain non-secret synthetic data only; exact-match text filtering is best effort and transformed values or authorized private visual evidence may still display app-rendered data.",
      "access": "api_key_and_oauth",
      "api_key_scope": "mobile:run",
      "entitlement": "mobile",
      "inputs": [
        "automation_id",
        "device",
        "os_version",
        "credential_id",
        "variable_profile_id"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "collect_compliance_evidence",
      "description": "Trigger compliance evidence collection from connected services (Cloudflare, GitHub, Sentry, Supabase, Railway). Returns run ID for tracking. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "compliance",
      "inputs": [
        "run_id",
        "status"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "check_config_drift",
      "description": "Check all connected services for security configuration drift from baselines (SSL, HSTS, WAF, headers). Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "compliance",
      "inputs": [
        "drifts",
        "checked_at"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": true
      }
    },
    {
      "name": "generate_access_review",
      "description": "Generate a quarterly access review report showing team members, API key usage, MFA status, and recommendations. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": "compliance",
      "inputs": [
        "quarter"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "get_security_events",
      "description": "Query the cross-service security event timeline (Cloudflare WAF, Sentry errors, etc.). Filter by source and severity. Enterprise only.",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "source",
        "severity",
        "limit"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": null,
        "destructive": false,
        "open_world": false
      }
    },
    {
      "name": "export_okf_bundle",
      "description": "Export this project's QA knowledge (bug reports, test cases, automations, performance/security/exploratory tests) as an OKF/OQA bundle of markdown files (Open Query Agent format).",
      "access": "oauth_only",
      "api_key_scope": null,
      "entitlement": null,
      "inputs": [
        "project"
      ],
      "output": "declared_schema",
      "annotations": {
        "read_only": true,
        "destructive": false,
        "open_world": null
      }
    }
  ]
}
