{"name":"AxonQA MCP Server","version":"1.0.0","protocolVersion":"2024-11-05","description":"MCP server exposing AxonQA QA automation tools","documentation":"/docs/mcp","endpoints":{"mcp":"/api/mcp","stream":"/api/mcp/stream","openapi":"/api/mcp/openapi.json"},"configTemplates":{"claudeDesktop":"/mcp/claude_desktop_config.example.json","vscode":"/mcp/vscode_settings.example.json","codex":"/mcp/codex_config.example.json"},"authentication":{"type":"bearer","description":"Use Bearer token in Authorization header","example":"Authorization: Bearer your-api-key-here"},"rateLimits":{"default":"100 requests per minute"},"tools":[{"name":"ask_clarifying_question","description":"Ask the user exactly one focused clarifying question. Use this WHENEVER you need information you don't have to proceed safely — most commonly when you're about to call a write tool (create/update/delete/rename/etc.) but a required argument isn't in the conversation (e.g. user said 'rename X' without saying the new name). Always prefer this over guessing parameters.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"start_background_task","description":"Move the user's request into the reliable durable task engine. Use this for multi-step work, conditional/chained work, anything that must wait for a test run, work likely to outlive this chat request, or when the user asks to run in the background. Copy the user's complete instruction, including names and conditions, into instruction. Do not use for a simple question, navigation, clarification, or one immediate tool action. After calling this tool, do not execute the delegated work again in the live turn.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_jira","description":"Import a Jira ticket by ID to extract acceptance criteria and generate tests. Returns ticket details including title, description, and acceptance criteria.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"search_jira","description":"Search Jira for tickets using JQL or natural text query. Returns matching issues with key, summary, status, type, priority, and assignee.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_jira_issue","description":"Update a Jira issue's summary, description, or priority.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_jira_comment","description":"Add a comment to a Jira issue. Useful for posting test results, status updates, or notes.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"transition_jira_issue","description":"Move a Jira issue to a new status (e.g., \"Done\", \"In Progress\", \"In Review\"). Lists available transitions and applies the matching one.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"generate_tests","description":"Generate test cases from acceptance criteria. Can generate from a Jira ticket or custom description. Returns generated test cases with coverage metrics. The result is a DRAFT suite: it is not in any project until save_generated_tests commits it to a project's Tests page.","category":"server","requiresConfirmation":false,"longRunning":true},{"name":"save_generated_tests","description":"Save a generated test suite into a project's Tests page (materialise the draft into real project test cases). Use after generate_tests when the user wants the tests kept, added to a project, or visible on the Tests page. Finds or creates the user story from the suite's ticket reference and creates one project test case per generated test. Identify the suite by ticket reference (e.g. DEV-12) or suite id.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"improve_tests","description":"Improve existing test suite by adding missing coverage, edge cases, or refining test steps.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_test_suites","description":"List all test suites for the current user. Returns summary of each suite including coverage and test counts.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_test_suite","description":"Get details of a specific test suite including all test cases. Accepts a ticket reference (e.g. DEV-12) or a suite ID.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"pair_agent","description":"Connect (pair) the AxonQA Agent to the user's account using the 6-character pairing code the agent shows after they run its installer. If the user wants to connect their agent but hasn't given you a code yet, ASK them for the 6-character code first — never call this with a guessed or placeholder code.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"check_agent_status","description":"Check if the AxonQA Agent is connected and ready for DOM capture or test execution.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"capture_dom","description":"Capture DOM elements from a webpage using the connected agent. Extracts interactive elements like buttons, inputs, and links with selectors. After starting, call check_capture_status to see results.","category":"agent","requiresConfirmation":false,"longRunning":true},{"name":"check_capture_status","description":"Check the status of a DOM capture session. Call this after starting a capture to see if it completed and get results.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_captures","description":"List recent DOM capture sessions to see what pages have been captured.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_tests","description":"Compatibility entry point for running an automation framework through the connected local agent. Prefer run_framework for cloud execution. It can target all tests, exact test IDs, or any custom tag.\n\nSUPPORTS FILTERING BY TAG:\n- testType accepts any team-defined tag\n- The tag is resolved to exact runnable tests before dispatch\n- Example: \"run smoke tests\" → testType: \"smoke\"\n- Example: \"run release candidate tests\" → testType: \"release-candidate\", frameworkName: \"Swag\"\n\nYou can also filter by:\n- frameworkId or frameworkName: Run tests from a specific automation framework\n- testIds: Run specific test IDs","category":"agent","requiresConfirmation":false,"longRunning":true},{"name":"run_framework","description":"Start an automation framework's tests in the CLOUD and report back when it finishes.\n\nUSE THIS (not run_tests) when the user asks to run a framework / suite and be told the result — especially for background tasks. It starts the run and returns right away; the system will automatically notify with the outcome when the run completes. Do NOT call wait_for_run_completion after this — you will be re-invoked with the results.\n\n- frameworkName or frameworkId: which framework to run (name is a partial match, e.g. \"storefront smoke\")\n- testName: optional. Run only ONE specific test by its exact name (use find_automated_tests first to resolve a plain-language request like \"the checkout test\" to a specific testName).\n- testType: optional @tag filter that runs only tests carrying that @tag (e.g. \"smoke\" runs @smoke). OMIT both testName and testType to run ALL tests (a full run). Only pass \"regression\" if the user means the @regression-tagged subset, not a full run.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_test_chain","description":"Run MULTIPLE test runs in sequence with conditions. Use this (instead of run_framework) whenever the user chains runs with an \"if it passes / if it fails\" condition — e.g. \"run the storefront smoke test, and if it passes run the full regression\".\n\nIt starts the first step in the cloud and advances automatically: after each run finishes, the next step runs only if its condition is met. If a step FAILS and stops the chain, the user is notified with the reason and suggestions — you do NOT need to poll or wait.\n\nsteps: ordered list. Each step has frameworkName (or frameworkId), optional testType (@tag), and 'on' = when to run it relative to the PREVIOUS step: \"pass\" (default), \"fail\", or \"always\". The first step's 'on' is ignored.\n\nIMPORTANT — test selection: testType accepts any team-defined tag and filters to tests carrying it (e.g. \"smoke\" → only tests tagged @smoke). For a FULL run / \"full regression\", OMIT testType so ALL tests run (do not use testType \"regression\" unless the user specifically means the @regression-tagged subset). A tag typo is refused before dispatch and the chain does not start.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"cancel_background_task","description":"Cancel a running background task or test-run chain that was started to run in the background. Use when the user says \"cancel that\", \"stop the run\", or \"stop the chain\". Stops the current cloud run and prevents any further chained steps. If no taskId is given, it cancels the user's most recent still-running background task.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"suggest_test_tags","description":"AI-classify a framework's tests into suites (@smoke / @regression / …) and tag them, so runs can be filtered by tag (e.g. \"run the smoke tests\"). Applies the tags. Use this first when a user wants to run a smoke/regression subset but the tests aren't tagged yet.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"set_test_tags","description":"Set the classification tags on a specific test (replaces its current tags). Tags like @smoke / @regression let runs be filtered by tag.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"quarantine_test","description":"Quarantine a flaky/broken test so it is skipped in runs (without deleting it). Use when a test is failing for non-product reasons and the user wants to keep runs green while it's fixed.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"unquarantine_test","description":"Remove a test from quarantine so it runs again.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_framework","description":"Delete an automation framework and all its generated code. Destructive and not easily undone.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_schedules","description":"List scheduled test runs, including target, exact scope, cadence, timezone, next run and whether each schedule is enabled or paused.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_schedule","description":"Create a cloud test schedule using the same validated workflow as the Schedules page.\n\nFor \"next Thursday at 3am\", create a ONE-TIME schedule: scheduleType=\"one_time\" and runAt=\"next Thursday at 3am\". Never turn \"next Thursday\" into a weekly cron. For \"every Thursday at 3am\", create a RECURRING schedule with cronExpression=\"0 3 * * 4\".\n\nTo schedule \"this test\" or the current checkbox selection, pass scopeMode=\"current_selection\". The page's framework and selected tests are resolved automatically. To name a test explicitly, pass testName or testNames and scopeMode=\"tests\". For tags, pass scopeMode=\"tags\" and selectedTags. Omit all scope fields only when the user wants the whole framework.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"set_schedule_enabled","description":"Pause or resume a scheduled run. Resuming recalculates the next recurring run, while an undispatched one-time schedule keeps its exact date.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_schedule","description":"Delete a scheduled run. Destructive.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"find_automated_tests","description":"Find AUTOMATED, runnable tests in a project by a plain-language description (e.g. \"the checkout test\", \"login\", \"add to cart\"). Use this to resolve a request like \"run the test that tests checkout in Mobile QA\" into a specific test you can then run with run_framework (pass the returned frameworkName and testName).\n\nReturns each match with its framework and exact testName. Behaviour to follow:\n- Exactly one match: run it with run_framework({ frameworkName, testName }).\n- Several matches: list them to the user and ask which one to run (do not guess).\n- No matches, but the query names exactly ONE manual test case: this returns the automation ladder's prompt for that case (run its links, link a close match, build from an app exploration, or record it). Relay that prompt as written.\n- No matches, and the query names SEVERAL manual test cases: this lists them and asks which one. Do not pick one.\n- No matches at all: tell the user plainly that no automated test matches and no manual test case does either.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"rerun_failed_tests","description":"Re-run only the FAILED tests from a previous run, in the cloud. Reports back when done. Use after a run has failures and the user wants to retry just those.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"accept_assertion_fix","description":"Accept an application's NEW output for a failed assertion — i.e. the app is right and the test's expected value should be updated to match. Model-backed and durable. Use ONLY when the user confirms the app behaviour is correct (not a bug). Provide the run and test; if oldValue/newValue aren't given they're taken from the run's recorded expected/actual. After accepting, offer to re-run the test.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_run_status","description":"Get the current status and results of a test run.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"cancel_run","description":"Cancel a running test execution.","category":"agent","requiresConfirmation":true,"longRunning":false},{"name":"wait_for_run_completion","description":"Wait for a test run to complete and return final results with summary.\n\nIMPORTANT: Always call this after run_tests to get the actual results.\nThe run_tests tool only STARTS the run - it doesn't wait for completion.\n\nUse this to:\n- Get final pass/fail counts\n- Get test execution duration\n- Check for healing suggestions\n- Provide results summary to user\n\nIf the run was started by run_test_binding's projectTestCaseId mode (running every\nautomation link a manual test case has), pass that SAME projectTestCaseId here too:\nthe result then carries an aggregate case verdict (each linked check with its own\nstatus, plus a pass/fail summary for the whole case) instead of just raw run stats.","category":"server","requiresConfirmation":false,"longRunning":true},{"name":"list_locators","description":"List all locator libraries (DOM captures) for the current user.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_locator_library","description":"Get details of a specific locator library including all captured elements.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_heal_suggestions","description":"Get healing suggestions (selector fixes) from a test run. Shows proposed fixes for broken locators.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"apply_heals","description":"Apply healing fixes to update broken locators. Can apply specific fixes or all safe fixes.","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"revert_heals","description":"Revert previously applied healing fixes.","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"export_tests","description":"Export test cases to various formats (JSON, Excel, Markdown, or automation code).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"generate_automation_code","description":"Generate automation test code from test cases.\n\nSMART DEFAULTS (use these when not specified):\n- language: \"typescript\" (default)\n- baseUrl: \"http://localhost:3000\" (default)\n- headless: true (default)\n\nREQUIRED PARAMETERS:\n- framework: MUST be specified or extracted from user message\n- testSuiteId OR ticketRef OR testCount: Need to know which tests to generate\n\nUSAGE PATTERNS:\n1. By ticket reference: ticketRef=\"DEV-7\" → finds suite by ticket\n2. By suite ID: testSuiteId=\"abc123\" → uses specific suite\n3. First N tests: testCount=4, testSuiteId=\"...\" → generates first N tests\n4. Specific tests: testCaseIds=[\"id1\",\"id2\"] → specific test cases only\n5. With locators: locatorLibraryName=\"Login Page\" → uses existing DOM capture\n\nLOCATOR LIBRARY INTEGRATION:\n- User can specify locatorLibraryName (e.g., \"Login Page\") to use an existing DOM capture\n- Or specify locatorLibraryId directly\n- Captured locators will be included in generated code\n\nDO NOT ask users for language/baseUrl/headless - use defaults.\nONLY ask for framework and test scope if not clear from context.","category":"server","requiresConfirmation":false,"longRunning":true},{"name":"save_automation_framework","description":"Save an automation framework to the database so the user can access it on the Automation page.\n\nUSE THIS when you write test code yourself (e.g., user describes scenarios and you build the framework).\nThe file tree is auto-built from generatedCode paths — no need to pass fileTree.\n\nREQUIRED: name, framework, language, generatedCode\ngeneratedCode format: [{path: \"playwright.config.ts\", content: \"...\"}, {path: \"tests/login.spec.ts\", content: \"...\"}]","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_frameworks","description":"List all automation frameworks created by the user.\nReturns framework name, type, test count, and last run status.\nUse this to find frameworks before updating or running them.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_framework_code","description":"Read the generated code files from an existing automation framework.\nReturns the full source code for all files (or a specific file).\n\nUSE THIS BEFORE modifying code with update_framework — you need to see the current code first.\n\nLOOKUP OPTIONS (use one):\n- frameworkId: Exact framework ID\n- frameworkName: Partial name match (e.g., \"Login\" matches \"Login Tests - Playwright\")\n- ticketRef: Ticket reference (e.g., \"DEV-7\") — finds framework generated from that ticket\n\nOPTIONAL:\n- filePath: Return only a specific file (e.g., \"tests/login.spec.ts\")\n- includeMetadata: Also return framework config (framework type, language, base URL, test cases)","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_framework","description":"Update an existing automation framework's code or configuration.\nUse this to modify test code, add new tests, update locators, or change settings.\n\nCOMMON USE CASES:\n- Add new test cases to existing framework\n- Update specific test file content\n- Change framework configuration\n- Update locators after new DOM capture\n- Add extra instructions for regeneration\n\nREQUIRES: frameworkId or frameworkName to identify the framework, unless the framework is the active page context. Explicit targets always override the page.","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"sync_framework","description":"Sync framework files between cloud and local workspace.\n\nSYNC DIRECTIONS:\n- \"pull\" (cloud → local): Get latest code from cloud to local workspace\n- \"push\" (local → cloud): Upload local changes to cloud\n- \"auto\": Intelligently choose direction based on timestamps\n\nCONFLICT RESOLUTION (when both cloud and local have changes):\n- \"cloud_wins\": Cloud version overwrites local (default for pull)\n- \"local_wins\": Local version overwrites cloud (default for push)\n- \"manual\": Return both versions for manual resolution\n- \"merge\": Attempt to merge changes (keeps both with conflict markers)\n\nREQUIRES: frameworkId or frameworkName + direction","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"get_pending_syncs","description":"Get all frameworks with pending sync changes.\nReturns frameworks that have unsynced cloud or local changes.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"open_framework_in_ide","description":"Open an automation framework in VS Code, Cursor, or another IDE.\n\nThis tool will:\n1. Sync the framework files to a local directory\n2. Open the directory in the specified IDE\n\nSUPPORTED IDEs:\n- \"vscode\" or \"code\" - Visual Studio Code (default)\n- \"cursor\" - Cursor IDE\n- \"webstorm\" - JetBrains WebStorm\n- \"idea\" - IntelliJ IDEA\n- \"sublime\" - Sublime Text\n- \"atom\" - Atom Editor\n\nEXAMPLES:\n- \"Open SwagLabs framework in VS Code\" → frameworkName: \"SwagLabs\", ide: \"vscode\"\n- \"Open my tests in Cursor\" → ide: \"cursor\"\n\nREQUIRES: Connected agent to write files and open IDE.","category":"agent","requiresConfirmation":false,"longRunning":false},{"name":"get_settings","description":"Get current user settings including auto-apply configuration.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_settings","description":"Update user settings like auto-apply configuration.","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"check_browserstack_status","description":"Check if BrowserStack is connected and return account information.\n\nUse this to:\n- Verify BrowserStack is set up before running cloud tests\n- Check available parallel sessions\n- See account plan details","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_browserstack_configs","description":"Get available browser, OS, and device configurations for BrowserStack tests.\n\nReturns:\n- Desktop browsers (Chrome, Firefox, Safari, Edge)\n- Operating systems (Windows 11/10, macOS Sonoma/Ventura/Monterey)\n- Mobile devices (iPhone 15 Pro, Pixel 8, Galaxy S24, etc.)\n\nUse this to show users what configurations they can choose from.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_tests_browserstack","description":"Run tests on BrowserStack cloud infrastructure for cross-browser testing.\n\nREQUIRES:\n- BrowserStack to be connected (use check_browserstack_status first)\n- A connected AxonQA agent to execute the tests\n\nCONFIGURATION OPTIONS:\n- browsers: Array of browsers to test on (chrome, firefox, safari, edge)\n- os: Operating system (Windows, OS X)\n- osVersion: OS version (11, 10 for Windows; Sonoma, Ventura, Monterey for macOS)\n- devices: Array of mobile device IDs for mobile testing\n\nEXAMPLES:\n- \"Run tests on Chrome and Firefox on Windows 11\"\n  → browsers: [\"chrome\", \"firefox\"], os: \"Windows\", osVersion: \"11\"\n\n- \"Test on Safari on macOS Sonoma\"\n  → browsers: [\"safari\"], os: \"OS X\", osVersion: \"Sonoma\"\n\n- \"Run on iPhone 15 Pro\"\n  → devices: [\"iPhone 15 Pro\"]\n\nThe agent will execute Playwright tests against BrowserStack's cloud browsers.","category":"agent","requiresConfirmation":false,"longRunning":false},{"name":"get_browserstack_run_status","description":"Get the status of a BrowserStack test run including session details, video URLs, and logs.\n\nUse after run_tests_browserstack to check progress and get results.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_epic","description":"Create a new epic in a project. Use this when the user wants to manually add an epic (not import from Jira). Returns the created epic details. The epic context is automatically extracted and added to the Project Brain.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_story","description":"Create a new user story in a project, optionally under an epic. Use this when the user wants to add a user story (not an epic). If adding to an epic, use list_epics first to find the epicId.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_epics","description":"List all epics in a project. Use this to find an epic ID when the user wants to add a story to a specific epic.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_projects","description":"List all projects the user has access to. Use this to find a project ID when the user mentions a project by name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_project_overview","description":"Headline numbers for a project — epics, user stories (with tests vs. still needing tests), test cases (total, linked to automation vs. linkable), coverage %, automation frameworks, and test plans. Use this to answer questions like \"how many epics/stories/test cases do I have?\", \"how many are linked / can be linked?\", and \"what's my coverage?\". Pass the current project's id.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_project","description":"Create a new project. Use when the user asks to create or start a new project (e.g. \"create a project called Source Demo\"). Returns the new project's id so follow-up steps (import Jira tickets, add stories, generate tests) can target it.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_coverage","description":"Test-coverage breakdown for a project (or a single epic): overall coverage %, how many user stories have tests vs. still need them, and the specific uncovered stories (the gaps). Use for \"what's my coverage?\", \"which stories are uncovered?\", \"coverage on the X epic?\". Pass the current project's id; optionally an epicId to scope to one epic.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_frameworks","description":"List the automation frameworks linked to a project. Use this first when the user asks about test health, runs, healing or locators \"for this project\", because those tools take a frameworkId rather than a projectId.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_test_bindings","description":"List the links between a project's test cases and the automation tests that implement them, with the sync state of each. Use this to answer whether a test case is automated, which framework covers it, and which links have drifted from their test case.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"suggest_test_bindings","description":"Rank the automation tests that best match one test case, scored by how closely their name and steps line up with the test case's intent, the same way the Link picker in the product does. Give it a test case, get back its best candidate matches, highest first. Read-only: it suggests, it does not create anything.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_binding_drift","description":"Explain why one test-case-to-automation link is out of sync: whether the generated file and test still exist, and what the framework currently contains.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_test_binding","description":"Link one project test case to one automation test in a framework, by naming the spec file the test lives in. Use this when you know exactly which automation test implements a test case, for example a candidate returned by suggest_test_bindings. The spec file path is required: a link that names no test is not automation coverage and cannot be run. For a whole story whose automation AxonQA generated, prefer link_test_cases, which finds the tests by their @aqtc tag so you do not have to supply paths at all.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"bulk_create_test_bindings","description":"Link several project test cases to automation tests in ONE framework in a single call. Every link must name the spec file its automation test lives in: a link with no spec file is not automation coverage and cannot be run, so it is refused. Get the paths from suggest_test_bindings, one test case at a time, then send them here together. For a whole story whose automation AxonQA generated, prefer link_test_cases instead: it finds the tests by their @aqtc tag, so it needs no paths and cannot mis-pair them. Capped at 50 links per call.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_test_binding","description":"Run automation for a manual test case. Two modes: pass bindingId to run the single automation test behind ONE link, or pass projectTestCaseId to run EVERY link a test case has (its primary link and any secondary links, skipping broken ones) in a single cloud run. Starts a real cloud run, so it is rate limited alongside other runs. The run uses the framework's own base URL and shared variables, not a named environment: to run against a specific environment such as UAT, use the Run button on the test itself. In case mode, call wait_for_run_completion afterward with the runId AND the same projectTestCaseId to get the aggregate pass/fail verdict across every linked check, not just the raw run stats.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_test_binding","description":"Remove the link between a test case and an automation test. The automation test itself is not deleted, but the test case stops counting as automated.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"check_test_automation","description":"Work out what \"run this manual test\" should do next: run its linked automation, propose the closest unlinked match with a stated confidence, offer to generate automation from an existing app exploration, or offer to record it or explore the app first when there is nothing to build from yet. Read-only: it decides and asks, it never links, generates, records or runs anything itself. Call this whenever someone asks to run a manual test case that has no confirmed plan yet.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"propose_automation_from_exploration","description":"Build proposed automation for a manual test case from an app exploration that has already been run, and SHOW it for approval. Nothing is saved and nothing is linked: it returns the proposed test steps and a pack id. Call this when the user accepts rung 3 of check_test_automation. Follow it with commit_automation_from_exploration once the user approves what it shows, passing back BOTH the packId AND the baseUrl this returns: the baseUrl is the host the proposal was grounded in and commit refuses without it. If the exploration does not contain enough evidence, this REFUSES and names exactly what to capture. Relay that refusal as written.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"commit_automation_from_exploration","description":"Save an automation proposal from propose_automation_from_exploration and link it to its manual test case, so the test case becomes runnable. Call this ONLY after the user has seen the proposal and approved it. Pass the packId the proposal returned, AND the baseUrl it returned: baseUrl is REQUIRED and must be the one from that proposal, because it is the host the automation will run against. This refuses rather than guessing a host.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_bugs","description":"List the bugs filed from this project to Jira or Azure DevOps, with status, severity, assignee and a link to each ticket. Use this to answer which bugs are open, what is still failing, or whether a fix has been verified.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_activity","description":"The recent activity feed for a project: generations, runs, healing, story and epic changes, who did what and when. Use this to answer what has happened lately.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_members","description":"Who is on a project and with what role: owner, admin, member or viewer. Use this to answer who has access or who to ask about something.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_plan_readiness","description":"The release readiness verdict for a test plan: ready, ready with accepted gaps, or not ready, with the gates behind it and any recorded ship decision. Read-only. Use this to answer whether a release can ship.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_releases","description":"List a project's open releases. Use this to resolve a release name before attaching a run or report as release evidence. The current project is used only when no project is explicitly named.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_release_readiness","description":"Read the live readiness position and latest frozen assessment for a release, including effective discipline/story scope and every applicable condition. Does not create an assessment.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"assess_release_readiness","description":"Freeze a new immutable readiness assessment for an open release. The server recomputes live evidence, project rules, and scope; the assistant cannot supply a verdict. Unmet should conditions may be accepted only with a reason. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"set_release_evidence","description":"Attach the current run/report to a release, move it to another release, or remove its release tag. A report is evidence for its underlying run, so use the report page's runId and runKind. Explicit project/release/run arguments override page context. If a release name has several matches, this tool refuses to guess.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_project","description":"Update a project’s name, description, appearance, tracker mapping, defaults, timezone, or coverage target. Pass only fields the user asked to change.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"archive_project","description":"Archive a project and pause its test and crawl schedules. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"restore_project","description":"Restore an archived project. Schedules remain paused so the user can review them before enabling them.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_project","description":"Permanently delete a project and its contained data, while queueing stored artifacts for deletion. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_epic","description":"Get one epic and its stories.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_epic","description":"Rename an epic or update its description or status.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_epic","description":"Delete an epic. Its stories remain in the project without an epic. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_stories","description":"List user stories in a project, optionally within one epic.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_story","description":"Get the complete details of one project user story.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_story","description":"Update a story’s title, description, acceptance criteria, epic, status, risk, points, owner, tags, workflow status, or Jira key.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_story","description":"Delete a user story and its dependent story data. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_project_member","description":"Add an existing AxonQA user to a project by email, or update their existing project role.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_project_member_role","description":"Change an existing project member’s role.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"remove_project_member","description":"Remove a member from a project. The last owner cannot be removed. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_release","description":"Create a release in a project, optionally declaring manual, automation, and/or API scope plus release stories. Readiness rules come from Project Settings.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_release","description":"Update release metadata, planned disciplines, or story scope. Readiness thresholds and strengths can only be changed in Project Settings.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"archive_release","description":"Archive a release while preserving its evidence and assessments. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"restore_release","description":"Restore an archived release.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_alerts","description":"List a project’s alert rules, recent incidents, and safe notification-channel metadata. Channel secrets and webhook URLs are never returned.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_project_alert_rule","description":"Create a project alert rule for failures, coverage, stuck runs, API errors, visual regressions, or filed bugs.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_project_alert_rule","description":"Update, mute, or re-enable an existing project alert rule.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_project_alert_rule","description":"Delete an alert rule while preserving its incident history. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_project_notification_channel","description":"Create a safe project notification destination using email or an already-connected Slack/Microsoft Teams integration. It never accepts or exposes webhook secrets.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_project_notification_channel","description":"Rename, enable, disable, reprioritize, or retarget a safe email/connected Slack/Teams project notification channel.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_project_notification_channel","description":"Delete a project notification channel and detach it from alert rules. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"send_project_notification_test","description":"Send a real health-check notification to a project channel. This has an external side effect and requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_knowledge","description":"List documents and screenshots in a project knowledge base, with extraction status and summaries.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_project_knowledge_item","description":"Inspect one project knowledge item and its extracted chunks. Large chunk text is bounded to keep the assistant context reliable.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_project_knowledge_item","description":"Rename a project knowledge item, replace its tags, or restore an archived item.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"archive_project_knowledge_item","description":"Archive a project knowledge item without deleting its stored file or extracted context. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"generate_project_brief","description":"Refresh the concise project brief from all ready, extracted knowledge sources.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_project_reports","description":"List generated reports and scheduled reports for a project, including status, cadence, delivery choices, and recent usage.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"generate_project_report","description":"Generate a project automation, coverage, release-readiness, or composed report from live project data.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_project_report","description":"Delete a generated project report. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_scheduled_project_report","description":"Schedule a recurring project report and choose email, Slack, and in-app delivery.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_scheduled_project_report","description":"Update, pause, or resume a scheduled project report.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_scheduled_project_report","description":"Delete a report schedule while preserving reports it already generated. Requires explicit confirmation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_testrail_projects","description":"List the projects in the user's connected TestRail account. Optionally pass a project name/id to drill into that project's suites and sections. Read-only — use this to help the user choose what to import before calling import_testrail.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_testrail","description":"Import test cases from a connected TestRail project into an AxonQA project. Resolve the TestRail project (and optional suite/section) by name. Can optionally file the imported cases under an epic and/or user story (by name) in the target project — if that epic/story does not exist, the tool lists what's there and offers to create it right in the chat. IMPORTANT: this tool ALWAYS previews the case count first and asks the user to confirm; call it again with confirm:true ONLY after the user explicitly agrees. If the named TestRail project/suite/section isn't found, the tool returns the available options for the user to pick — relay them and ask which one.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_azure_projects","description":"List the projects in the user's connected Azure DevOps organization. Optionally pass a project name/id to list its test plans, and a plan to list its suites. Read-only — use this to help the user choose what to import before calling import_azure.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_azure","description":"Import test cases from a connected Azure DevOps test plan into an AxonQA project. Resolve the Azure project, test plan, and (optional) suite by name. Can optionally file the imported cases under an epic and/or user story (by name) in the target project — if that epic/story does not exist, the tool lists what's there and offers to create it right in the chat. IMPORTANT: this tool ALWAYS previews the case count first and asks the user to confirm; call it again with confirm:true ONLY after the user explicitly agrees. If a named project/plan/suite isn't found, it returns the available options — relay them and ask which one. With no suite named, it imports the whole plan (all suites, de-duplicated).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_zephyr_projects","description":"List the projects (by Jira project key) in the user's connected Zephyr Scale (TM4J) account. Optionally pass a project key to list that project's test-case folders. Read-only — use this to help the user choose what to import before calling import_zephyr.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_zephyr","description":"Import test cases from a connected Zephyr Scale (TM4J) project into an AxonQA project. Resolve the Zephyr project (by Jira key) and optional folder by name. Can optionally file the imported cases under an epic and/or user story (by name) in the target project — if that epic/story does not exist, the tool lists what's there and offers to create it right in the chat. IMPORTANT: this tool ALWAYS previews the case count first and asks the user to confirm; call it again with confirm:true ONLY after the user explicitly agrees. If a named project/folder isn't found, it returns the available options — relay them and ask which one. With no folder named, it imports every case in the project.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"raise_bug","description":"Raise a bug ticket in Jira or Azure DevOps from a failed automation test. Drafts the summary, description, steps to reproduce, expected and actual results, attaches the failure recording (or links it if too large), and can file it into a sprint/iteration. IMPORTANT: ALWAYS preview the drafted ticket first and ask the user to confirm; call again with confirm:true ONLY after they explicitly agree. If the run, provider, or project is unknown, ask for it (do not guess). The user can EDIT any field before confirming: when they ask to change the summary, description, steps, expected, or actual, re-call this tool with that field as an override to re-preview the edited ticket.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_test_plans","description":"List a project's test plans with their status and item counts. Use to answer \"what test plans do I have?\" or before running/updating one. Pass the current project's id.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_test_plan","description":"Create a reusable test plan in a project. For a request like \"create Release 2.3, run smoke, and only run the full regression if smoke passes\", set runPattern=\"smoke_then_regression\" and startRun=true. This creates the same persisted phases and gate as the Test Plans UI; do not use run_test_chain for a saved test plan. The smoke tag is live and the regression phase means ALL runnable automation tests. Without runPattern, optionally scope a legacy draft to storyIds.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_test_plan","description":"Start a run of a test plan — dispatches its automation and API sections for execution. Use when the user asks to run or execute a plan. Returns a link to watch the run live. Identify the plan by id or name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_test_plan_run_status","description":"Summarize a test plan's latest run (or a specific run). LIVE run → status + % done + pass/fail counts. FINISHED run → a report summary: pass rate, per-type breakdown, top failures, and recommendations, with a link to the full report. Use for \"how's my run going?\", \"how did it go?\", or \"give me a report summary\". Identify the plan by id or name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"duplicate_test_plan","description":"Duplicate an existing test plan into a new DRAFT — same coverage, scope, and settings, named \"Copy of <source>\" (or a name you give). Use when the user wants a new plan like an existing one. Identify the source by id or name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"archive_test_plan","description":"Archive a test plan (retire it — hidden from the active list, kept with all run history, can't run or schedule). Pass restore=true to RESTORE an archived plan to active instead. Identify the plan by id or name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_test_plan_runs","description":"List a test plan's run history — each past run with its label/milestone, status, pass/fail counts, and date. Use for \"show me the runs of plan X\" or \"how many times has X been run?\". Identify the plan by id or name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"link_test_cases","description":"Link a user story's test cases to an automation framework (create automation bindings). Works automatically when the automation was AxonQA-generated, because each test carries an `@aqtc` tag, so every matching test case links deterministically. PREFER THIS whenever the work is scoped to a story and the automation was AxonQA-generated: it finds the spec file and test name itself, so nothing has to be guessed. Use bulk_create_test_bindings instead when the test cases are not one story's, or when the automation was imported or hand-written and you must name each spec file yourself (get those paths from suggest_test_bindings). Any test case that can't be matched automatically here is reported as needing manual linking, and the result offers to take the user to the Tests page with the story open. Identify the story (id, Jira key, or title) and the framework (id or name).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_test_cases","description":"List all test cases for a story. Returns test case IDs, titles, types, AC coverage, and automation status.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"edit_test_case","description":"Edit an existing test case. You can update the title, type (happy/negative/edge), steps, or expected result. Use list_test_cases first to get test case IDs.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_test_case","description":"Delete a test case from a story. This will recalculate AC coverage. Use with caution — it may reduce coverage.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"file_jira_defect","description":"Create a Jira Bug issue from a failed test. The defect includes the error message, test steps, and metadata. Requires Jira to be connected.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_quality_gates","description":"List all quality gates configured for the user. Quality gates define pass rate thresholds and failure blocking rules for CI/CD pipelines.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_automation_status","description":"Get the automation status for a story, including frameworks, run history, pass rates, and self-healing stats.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_failure_details","description":"Get detailed failure information for a test run — which tests failed, error messages, failed steps, and healing events. Use this when the user asks \"what failed?\", \"why did tests fail?\", or \"tell me about the failure\". Always use this AFTER get_run_status or wait_for_run_completion shows failures.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"start_crawl","description":"Start a Discover crawl on a website. The agent will crawl the site, extract elements, detect forms, capture screenshots, and identify user flows.\n\nRequires a connected AxonQA Agent. Use check_agent_status first if unsure.\n\nOptions:\n- crawlMode: \"quick\" (fast orientation), \"smart\" (recommended adaptive scan), \"deep\" (maximum coverage)\n- loginUsername + loginPassword: provide login credentials if the site requires authentication\n- enableInteractions: true — AI clicks buttons, fills forms to discover hidden pages\n- excludePatterns: skip URLs matching glob patterns (e.g. \"/admin/*\", \"*.pdf\")\n- enableAccessibilityAudit: run WCAG accessibility checks on each page\n- enablePerformanceMetrics: collect Core Web Vitals (LCP, CLS, TTI)\n- enableVisualBaselines: store high-quality screenshots for visual regression\n\nBefore crawling a bare URL, confirm with the user (unless already provided): whether any part of the site is behind a login (loginUsername/loginPassword), whether to enable interactions (default read-only — clicks and form-fills), and the scope (quick vs deep). Never enable destructive interactions, or interactions on a production site, without explicit approval.","category":"agent","requiresConfirmation":false,"longRunning":true},{"name":"get_crawl_status","description":"Check the progress or final status of a Discover crawl. Shows pages crawled, forms found, health breakdown, and detected flows.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_crawl_sessions","description":"List all Discover crawl sessions for a project. Shows past and active crawls with their status and page counts.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_crawl_results","description":"Get detailed results from a completed Discover crawl. Can return pages, detected flows, health data, or everything.\n\nUse include parameter to filter:\n- \"pages\" — list of all crawled pages with URL, type, element/form counts\n- \"flows\" — detected user flows (login, registration, checkout, etc.) with step details\n- \"health\" — pages grouped by health grade with error summaries\n- \"all\" — everything (default)\n\nUse this after a crawl completes to understand the site structure before generating tests.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"cancel_crawl","description":"Cancel an active Discover crawl. The agent will stop crawling and the session will be marked as cancelled.","category":"server","requiresConfirmation":true,"longRunning":false},{"name":"generate_tests_from_crawl","description":"Generate test automation code from Discover crawl results. Can generate tests for a single page or a detected user flow.\n\nUse get_crawl_results first to see available pages and flows, then pass the page or flow ID.\n\n- type \"page\": Generates a smoke test that navigates to the page and verifies key elements are visible\n- type \"flow\": Generates an end-to-end test that follows the flow steps (login, checkout, etc.)","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"wait_for_crawl_completion","description":"Wait for a Discover crawl to complete and return final results.\n\nIMPORTANT: Always call this after start_crawl. Crawls run in the background via the agent.\nstart_crawl only launches the crawl — it does not wait for it to finish.\n\nUse this to:\n- Get final page count, flow count, and health summary\n- Know when it's safe to call get_crawl_results or generate_tests_from_crawl\n- Get the navigation link to view the Discover map\n\nCrawls typically take 2-20 minutes depending on site size. This tool will poll every 5 seconds.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"describe_test","description":"Turn a plain-language test intent (e.g. \"test that a user can add an item to the basket\") into grounded QA scenarios from a completed discovery/crawl. Grounded only in what discovery captured: if there is not enough evidence it REFUSES and names exactly what to capture, and never invents tests. It grounds in the discovery for the project the user is viewing, or asks which discovery to use when there is more than one — it does NOT assume the latest. Pass sessionId once the user has chosen one; pass discoveryName to match a crawl by name or domain.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_discovered_capabilities","description":"List the product capabilities Axon learned from a discovery/crawl (e.g. \"Log in\", \"Add item to cart\", \"Checkout\") with each one's TEST-READINESS: whether enough evidence was captured to generate a grounded test, and if not, exactly what is missing. Use this to see what the app can do and what is ready before calling describe_test. Omit sessionId to use the project's most recent completed discovery.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_page_health","description":"Report performance (Core Web Vitals: LCP, CLS) and accessibility health for the pages in a discovery/crawl, flagging pages with problems. Use to answer \"which pages have accessibility or performance issues\". Omit sessionId to use the most recent completed discovery.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_runs","description":"List recent test RUNS for a project and/or framework, with each run's id, status, and pass/fail counts. Use this to resolve \"check the latest run(s) for <project or framework>\" into a run id, then call get_failure_details or debug_test_failure on that id to explain the failures. Resolves the project or framework by id OR name. Omit everything to list the user's most recent runs.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_test_history","description":"Show a single test's run history across recent runs: how often it passed vs failed, the recent pass/fail pattern, whether it is FLAKY (intermittent) or CONSISTENTLY FAILING (likely a real break or bug), the dominant error category, and whether it is quarantined. Use this to answer \"has this test been failing for a while?\", \"is this test flaky?\", or to back up a failure explanation with history. Match the test by name.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_project_analytics","description":"Get analytics and metrics for a project — test run stats, pass rates, test case counts, crawl data, and recent activity. Use when users ask about stats, metrics, coverage, trends, or \"how are my tests doing?\".","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"count_records","description":"Count records for the current project by a dimension — e.g. how many test cases are desktop / high priority / linked to automation, how many alerts are critical, how many schedules are paused, how many runs failed. Use for \"how many X are Y?\" follow-ups on ANY page. Pick `entity` from the current page (Tests→test_cases, Alerts→alert_rules or alerts, Schedules→schedules, Runs→runs). Omit `value` to get the full breakdown by that dimension. Returns exact DB counts — never guess from the on-screen sample.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"bulk_improve_tests","description":"Improve multiple test suites at once. Fetches test suites for a project and improves each one. Use when the user says \"improve all my tests\" or \"fix all failing tests\".","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"bulk_generate_from_crawl","description":"Generate test suites for multiple pages from a Discover crawl at once. Filters pages by type (all, forms-only, or interactive) and generates tests for each.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"edit_framework_file","description":"Edit a specific file in an automation framework's generated code.\n\nUse this to make targeted changes to page objects, test specs, helpers, config, or any file in the framework.\nThe edit is saved to the framework's generatedCode (single source of truth).\n\nExamples:\n- Fix a selector in a page object\n- Update a test step\n- Change a config value\n- Add a new helper function\n\nYou can either replace the entire file content or do a find-and-replace within the file.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_visual_regression","description":"Get visual regression data for a test run — shows which steps have visual changes compared to the baseline.\n\nReturns per-step screenshot comparisons with diff scores. A diff score > 0.02 (2%) indicates a visual change.\n\nUse this to:\n- Check if a test run introduced visual changes\n- Identify which steps look different from the baseline\n- Get diff image URLs for side-by-side comparison","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_visual_comparison","description":"Run visual comparison for a specific screenshot against its baseline.\n\nIf no baseline exists, the screenshot is set as the baseline for future comparisons.\nReturns the diff score and diff image URL.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"debug_test_failure","description":"Get detailed debugging information for a failed test in a run.\n\nReturns:\n- Full error message and stack trace\n- Failed step details (which step, what selector, what line)\n- DOM snapshot at failure time (if captured)\n- Screenshot at failure time\n- Test code around the failed line\n- Page object code containing the broken selector\n- Suggested fixes with confidence scores\n\nUse this to deeply investigate why a test failed and recommend specific fixes.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_collection","description":"Create a new API collection in a project. Use when the user wants to organize their API endpoints into a named group.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_api_endpoint","description":"Add an API endpoint to a collection. Specify method, path, headers, body, and authentication.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_api_test","description":"Execute a saved API endpoint (or every endpoint in a collection) — fires the request(s), records a run, and reports HTTP status + assertion pass/fail. Production/destructive requests are skipped (they need UI confirmation).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_test_results","description":"Get detailed results of an API test run, including assertion results, request/response data, and timing.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"generate_api_tests","description":"AI-generate test cases for an API endpoint. Creates functional, negative, security, and edge case tests based on the endpoint definition and any saved response.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"debug_api_endpoint","description":"Diagnose why an API request is failing. Sends the request and analyzes the response — checks auth, headers, body format, status codes, and common issues.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_collections","description":"List all API collections in a project with endpoint counts.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"configure_api_auth","description":"Configure automatic token-based authentication for an API collection. Designates a login/token endpoint that is called automatically to obtain and inject auth tokens into subsequent requests. Use when the user wants to set up auth for their API collection, or when they mention needing to log in / get a token first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_collection","description":"Get a single API collection by id, including its folders and endpoints.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_collection","description":"Update fields on an API collection: rename, change description, or change baseUrl. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_collection","description":"Delete an API collection and EVERYTHING inside it (folders, endpoints, datasets, run history). This is destructive — confirm with the user before calling.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"duplicate_api_collection","description":"Duplicate an API collection, including its folders and endpoints. The copy is named '<original> Copy' and lives in the same project.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_folders","description":"List the folders inside an API collection.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_folder","description":"Create a folder inside an API collection. Optionally nest it inside another folder by passing parentFolderId.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"rename_api_folder","description":"Rename an API folder.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_folder","description":"Delete an API folder. Endpoints inside the folder move back to the collection root (they are NOT deleted). This is destructive — confirm with the user before calling.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_endpoints","description":"List the endpoints in an API collection.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_endpoint","description":"Get the full details of one API endpoint.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_endpoint","description":"Update fields on an API endpoint. Pass any subset of: name, method, path, priority, headers (JSON), queryParams (JSON), body (JSON), bodyType, description.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_endpoint","description":"Delete an API endpoint and every assertion, schema, and run-history row attached to it. This is destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"duplicate_api_endpoint","description":"Duplicate an API endpoint inside the same collection. The copy is named '<original> Copy'.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"move_api_endpoint","description":"Move an API endpoint into a folder, or back to the collection root. Pass folderId=null (or omit it) to move to the root.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_environments","description":"List canonical environments in a project, including kind, web/API base URLs, default/production flags, enabled state, and variable count.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_environment","description":"Get one environment's details including its variables (secrets are listed by name only).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_environment","description":"Create a new environment in a project. Optionally pre-seed variables (non-secret only; for secrets use create_api_variable afterwards).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_environment","description":"Update canonical project-environment fields: name, description, kind, web/API base URLs, default/production/enabled flags, execution mode, and TLS verification.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_environment","description":"Archive an environment while preserving its variables and historical run links. Confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"duplicate_api_environment","description":"Clone an environment plus every variable inside it. Copy is named '<original> Copy' and is never default or production.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_variables","description":"List variables in a given scope. Pass environmentId, collectionId, folderId, or projectId — only one. Secret values are NEVER returned; the response shows name + scope + isSecret only.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_variable","description":"Create a variable. Pass exactly one scope: environmentId (most common), collectionId, folderId, or projectId. For secret values pass isSecret:true — the value is encrypted at rest and never appears in any list/get response.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_variable","description":"Update a variable's value, name, type, or description. To toggle secret status, pass isSecret + a fresh value.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_variable","description":"Delete a single variable. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_flows","description":"List API flows (multi-step request chains). Filter by projectId or collectionId. Returns each flow's id, name, step count, strategy, and parent collection.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_flow","description":"Get a single flow by id, including ordered steps with each step's endpoint method and path.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_flow","description":"Create a new flow (multi-step request chain) inside a collection. Steps are added separately via add_api_flow_step or create_api_chain.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_flow","description":"Update flow settings: rename, change description, executionStrategy, failureStrategy, alwaysRunCleanup, or maxDurationMs. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_flow","description":"Delete a flow. Cascades to all of its steps. Cannot be undone.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"run_api_flow","description":"Execute a flow synchronously. Returns the run id, pass/fail status, and per-step results. Optionally provide an environmentId for variable resolution.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_flow_steps","description":"List the ordered steps of a flow, with each step's endpoint method/path, extractors, conditions, retry policy, and cleanup flag.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_api_flow_step","description":"Append a step to a flow. Endpoint must be in the same project. Optionally set extractors (to capture values into variables), conditions, delay, overrides, retry policy, or mark as cleanup.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_flow_step","description":"Update a flow step in place: change extractors, conditions, delay, overrides, retry policy, cleanup flag, or reorder. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_flow_step","description":"Delete a single flow step. Cannot be undone.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"reorder_api_flow_steps","description":"Reorder all steps of a flow at once. Provide the step ids in the new order — the tool assigns stepOrder 0, 1, 2, … in that sequence.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_runs","description":"List historical API test runs. Optional filters: projectId, status ('passed'|'failed'|'running'|'cancelled'), triggeredBy ('manual'|'schedule'|'ci'|'assistant'), productionOnly (true to show only runs against production environments), ciBranch (substring), limit (max 200).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_run","description":"Get a single API test run by id, including its first result's status code, duration, and any per-step results for flow/dataset runs.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"pin_api_run","description":"Pin (or unpin) an API test run. Pinned runs are exempt from retention sweeps — used to preserve regression baselines and post-mortem evidence.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_run","description":"Delete a single API test run and its per-step results. Destructive — pinned runs are NOT specially protected; if the user said delete, delete. Confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_datasets","description":"List datasets in an API collection. Datasets drive data-driven runs — one execution per row.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_dataset","description":"Get a dataset by id, including its columns and a preview of its first 10 rows.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_dataset","description":"Create a new dataset in a collection. Supply source='csv' or 'json' plus content (the raw text), OR source='inline' plus columns and an optional rows array. Row count is capped at 5000.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_dataset","description":"Update a dataset: rename, change description, or replace its rows. To replace rows, supply EITHER source='csv'/'json' plus new content, OR new columns and rows arrays for inline. Omit row fields to keep existing data.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_dataset","description":"Delete a dataset. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_assertions","description":"List assertions attached to an API endpoint, ordered by their execution position. Each row shows type, target, operator, expected value, severity, and whether it's enabled.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_api_assertion","description":"Append an assertion to an endpoint. Type is one of: status_code, response_time, header, cookie, json_path, schema, body_contains, regex, array_length, custom_script. Operator is one of: equals, not_equals, contains, exists, not_exists, less_than, greater_than, matches, one_of. `expected` is the value to compare against (JSON-encoded as string).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_assertion","description":"Update fields on an assertion: type, target, operator, expected (JSON-encoded), severity, enabled, description. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"toggle_api_assertion","description":"Enable or disable a single assertion without otherwise editing it. Omit `enabled` to toggle.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_assertion","description":"Delete a single assertion. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_schemas","description":"List saved schemas. Filter by endpointId (per-endpoint response schemas) or by collectionId (everything in the collection, including collection-wide schemas).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_schema","description":"Get a single saved schema by id, including its parsed content.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"save_api_schema","description":"Save a new schema pinned to an endpoint. `content` is the schema body (JSON Schema object or string). Defaults: type='json-schema', format='draft-07'.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_schema","description":"Update a saved schema: rename, replace content, or change format. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_schema","description":"Delete a saved schema. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_endpoint_scripts","description":"Return the pre-request and post-response JS scripts attached to an endpoint. Either may be null when not set.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"set_api_endpoint_script","description":"Set or replace the pre-request or post-response JS script on an endpoint. `which` is 'pre' or 'post'. To clear a script, use clear_api_endpoint_script instead.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"clear_api_endpoint_script","description":"Clear (null out) the pre-request or post-response JS script on an endpoint. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_mock_servers","description":"List mock servers in an API collection. Each server hosts many mock routes; the public dispatch URL is /api/mock/<mockKey>/...","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_mock_server","description":"Get a single mock server by id, including its public dispatch URL (the part the user copies into the consumer app).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_mock_server","description":"Create a new mock server inside a collection. The server's mockKey (URL token) is generated automatically — share /api/mock/<mockKey>/ with the consumer app.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_mock_server","description":"Update a mock server: rename, change description, toggle isActive, or set activeScenario (used to switch which scenario-named mocks the dispatcher prefers). Omit any field to leave it unchanged. Pass activeScenario='' to clear it.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_mock_server","description":"Delete a mock server and every mock route inside it. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_mocks","description":"List the mock routes in a mock server, ordered by sortOrder (lowest wins on ties).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"add_api_mock","description":"Add a mock route to a mock server. method + path required. responseBody / responseHeaders are JSON-encoded strings. Optional: delay (ms), delayJitterMs, scenarioName, errorRate (0-1), errorStatusCode, sortOrder.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_mock","description":"Update a mock route. Any combination of: method, path, statusCode, responseBody (JSON-encoded), responseHeaders (JSON-encoded), delay, delayJitterMs, scenarioName, errorRate, errorStatusCode, sortOrder, isActive. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"toggle_api_mock","description":"Enable or disable a mock route without otherwise editing it. Omit `isActive` to toggle.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_mock","description":"Delete a single mock route. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_webhook_inboxes","description":"List webhook inboxes. Optional projectId filter. Each inbox has a public URL — /api/api-testing/webhook/<inboxKey> — that you give to Stripe/GitHub/etc.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_webhook_inbox","description":"Get a webhook inbox by id, including its public ingest URL.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_webhook_inbox","description":"Create a new webhook inbox in a project. The inboxKey (URL token) is generated automatically — share /api/api-testing/webhook/<inboxKey> with the sender.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_webhook_inbox","description":"Update a webhook inbox: rename, change description, toggle active. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_webhook_inbox","description":"Delete a webhook inbox and every event in it. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_webhook_events","description":"List the events received by a webhook inbox, newest first. Returns metadata only — fetch a single event for full body.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_webhook_event","description":"Get a single webhook event by id, including its headers and body. Body may be truncated; check `bodyTruncated`.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_webhook_event","description":"Delete a single webhook event from its inbox. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_auth_profiles","description":"List the auth profiles in a project. Each profile holds reusable auth config (Bearer, API Key, Basic, OAuth2, JWT, Custom) that endpoints reference. Secrets are not returned — only the keys that exist.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"get_api_auth_profile","description":"Get a single auth profile in editor view (non-secret config + the names of stored secrets, but never plaintext).","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_auth_profile","description":"Create a new auth profile in a project. `type` is one of NONE, BEARER, API_KEY, BASIC, OAUTH2_CC, OAUTH2_AC, JWT, CUSTOM. `payload` is a JSON-encoded object holding the type-specific fields (e.g. {\"token\":\"...\"} for BEARER; {\"name\":\"X-API-Key\",\"value\":\"...\",\"addTo\":\"header\"} for API_KEY). Secrets in payload are split out and encrypted at rest.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"update_api_auth_profile","description":"Update an auth profile: rename, change description, change type, replace payload (re-encrypting secrets), or change refresh policy. Partial payloads merge with existing secrets — you don't have to re-supply a password to change the username. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_auth_profile","description":"Delete an auth profile. Endpoints that reference it will have authProfileId nulled. Destructive — confirm with the user first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_tokens","description":"List API tokens issued for a project. Each row shows name, prefix (first 8 chars), expiry, and last-used. Raw token values are NEVER returned — only available once at creation.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_token","description":"Issue a new API token for a project (for CI scripts / SDK use). The raw token is returned ONCE in the response message — the user must save it now; it is hashed at rest and cannot be retrieved again. expiresAt is optional ISO 8601; omit for a never-expiring token.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"revoke_api_token","description":"Revoke an API token. Soft delete via revokedAt timestamp — the row stays so historical audit events still resolve, but any future request using this token is rejected. Cannot be undone.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_client_certificates","description":"List mTLS client certificates registered for a project. Returns subject, issuer, validity window, fingerprint, and the environments that reference each cert. PEM bodies are NOT returned.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_client_certificate","description":"Register a new mTLS client certificate for a project. `certPem` is the public cert PEM; `keyPem` is the matching private key (encrypted at rest); optional `passphrase` decrypts the key. Cert metadata (subject/issuer/validity) is parsed server-side.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_client_certificate","description":"Delete a registered client certificate. Environments that reference it have clientCertificateId nulled (FK on delete = SET NULL). Destructive — confirm first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_ca_bundles","description":"List custom CA bundles for a project. Each bundle holds one or more CA certs that environments may opt into trusting. Returns metadata only — not the PEM body.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_ca_bundle","description":"Register a custom CA bundle for a project. `pem` may contain one or more PEM-encoded CA certificates concatenated. Metadata (cert count, validity envelope, subjects) is parsed and stored server-side.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_ca_bundle","description":"Delete a CA bundle. Environments that reference it have caBundleId nulled. Destructive — confirm first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_api_local_agents","description":"List Local Agents registered for a project. Each row shows name, platform, version, status (pending|connected|disconnected|revoked), last-seen, and the token prefix. Raw tokens are never returned.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"create_api_local_agent","description":"Register a new Local Agent for a project. Returns a one-time pairing code (valid 10 minutes) which the agent binary pastes on first start to claim its long-lived bearer token. The agent starts in 'pending' status until the first successful pair.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"revoke_api_local_agent","description":"Revoke a Local Agent. Soft delete (status='revoked'); the row stays so audit events still resolve, but its bearer token is cleared and any in-flight WS auth fails on next ping. Destructive — confirm first.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_api_from_text","description":"Import endpoints into an existing collection from raw text. Format defaults to 'auto' — detects OpenAPI/Swagger, Postman, HAR, or cURL. To create a new collection first, call create_api_collection then this. For URL-based imports use import_api_from_url instead.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_api_from_url","description":"Server-side fetch a spec URL (OpenAPI/Postman/HAR) and import the endpoints into a collection. Bypasses browser CORS. Use this when the user gives a URL like https://api.example.com/openapi.json.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"preview_api_wsdl","description":"Fetch + parse a WSDL (SOAP) without writing anything. Returns the list of operations + services + target namespace so the user (or a follow-up import_api_wsdl call) can pick which operations to bring in.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"import_api_wsdl","description":"Import SOAP operations from a WSDL into a collection. Supply EITHER wsdl (raw XML text) OR wsdlUrl (server-side fetch). Optional operationNames (JSON array of op names) restricts the import to those names; omit to import all. Optional folderName creates a folder to hold the imported endpoints.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"export_api_collection_postman","description":"Generate a Postman v2.1 collection JSON for an existing API collection. Returns the JSON inline so the user can save it. Secrets are emitted as {{NAME}} placeholders — never plaintext.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"append_api_test_file_to_framework","description":"Append (or replace) a single test file inside an existing AutomationFramework's generatedCode bundle. Useful for dropping a generated API test into a framework without regenerating the whole project. If a file with the same path already exists, it's overwritten; the user is told it was replaced.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"list_tours","description":"List the guided tours available to teach the user a feature interactively. Each tour has a stable `name` you pass to start_tour, plus a one-line summary.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"start_tour","description":"Start a guided, click-along tour that teaches the user how to use a feature. Use this whenever the user asks 'how do I X', 'teach me X', or 'show me how to X' AND a matching tour exists (call list_tours first if unsure). The user clicks through the highlighted steps themselves — you don't perform the action for them.","category":"server","requiresConfirmation":false,"longRunning":false}],"methods":[{"name":"initialize","description":"Handshake and capability negotiation"},{"name":"tools/list","description":"List all available tools"},{"name":"tools/call","description":"Execute a tool"},{"name":"tools/info","description":"Get detailed info about a tool"},{"name":"ping","description":"Health check"}]}