{"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":"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.","category":"server","requiresConfirmation":false,"longRunning":true},{"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":"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":"Execute tests using the connected agent. Can run all tests, specific test cases, or tests by type/tag.\n\nSUPPORTS FILTERING BY TEST TYPE:\n- testType: \"smoke\" | \"regression\" | \"sanity\" | \"critical\" | \"e2e\" | \"integration\"\n- This filters tests based on their @tag annotation in the test code\n- Example: \"run smoke tests\" → testType: \"smoke\"\n- Example: \"run critical tests for Swag\" → testType: \"critical\", 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\n- headed: Show visible browser (true) or run headless (false)","category":"agent","requiresConfirmation":false,"longRunning":true},{"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","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 (Playwright, Cypress) 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","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":"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\" (30 pages, fast), \"standard\" (50 pages, balanced), \"deep\" (100 pages, full audit)\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","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":"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":"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":"import_api_spec","description":"Import API endpoints from an OpenAPI/Swagger spec, Postman collection, cURL command, or HAR file. Provide the content directly or a URL to fetch.","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 API tests for an endpoint or entire collection. Runs all active test cases and returns results with pass/fail details.","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":"create_api_chain","description":"Build a multi-step API request chain with variable extraction between steps. Use for testing flows like Register → Login → Create Resource → Verify.","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":"manage_api_environment","description":"Create or update an API testing environment with variables like baseUrl, apiKey, tokens, etc.","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, 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 environments in a project. Returns name, default flag, production flag, enabled flag, and updatedAt.","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 fields on an environment: rename, toggle isDefault / isProduction / enabled, set defaultExecutionMode, toggle TLS verification. Omit any field to leave it unchanged.","category":"server","requiresConfirmation":false,"longRunning":false},{"name":"delete_api_environment","description":"Delete an environment and every variable inside it. Destructive — 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"}]}