MCP server integration for Burp Suite providing tools for HTTP proxy history analysis, GraphQL introspection, security scanning, scope management, and task queuing
BurpMcpEnhance demonstrates solid tool engineering with complete schemas, clear descriptions, and thoughtful composition. All 17 tools are explicitly registered with full parameter schemas and descriptions. Tool names follow verb_noun patterns (diff_, list_, get_, manage_, start_). The server excels at guiding LLM behavior with dependency hints (e.g., 'Prefer list_security_candidates first'), token-saving strategies (e.g., diff_proxy_responses and include_body flags), and pagination guidance (count ≤ 20). Error handling is implicit in validation logic (type coercion with fallback messages). However, output schemas are not formally documented in descriptions, some error paths lack recovery guidance, and destructive operations (delete_file, manage_scope remove/clear) could benefit from explicit confirmation patterns. The design reflects domain expertise in Burp integration and security testing workflows.
Deletes a file from the file queue by file ID. Frees up temporary storage.
Diffs two HTTP responses from the proxy history DB by their IDs. Returns ONLY the changed lines (added/removed), not the full responses. Use this instead of reading both full responses — saves tokens for large payloads. Get IDs from list_proxy_http_history. Useful for comparing baseline vs. tampered request responses to confirm vulnerabilities.
Gets proxy HTTP history details by IDs. Provide comma-separated IDs (e.g., "1,2,3"). Prefer list_security_candidates first. This returns request and response evidence for the specified entries. By default, bodies are omitted to save tokens. Re-call with include_body=true when you need the body. Set include_duplicates=true to also retrieve raw duplicate requests captured for the same endpoint (e.g., multiple login attempts or credential-stuffing requests to the same URL). Call list_proxy_http_history first to get IDs, then drill down with this tool.
Gets scanner issue details by IDs
Returns discovered URLs from Burp's site map, populated by proxy traffic. Optionally filter by URL prefix (e.g. 'https://api.example.com'). Shows method, URL, and status code. Use count ≤ 20 to stay within token limits.
Polls for the result of a previously submitted task using its task ID. Returns status (PENDING/RUNNING/COMPLETED/FAILED) and result/error if available.
Minimal descriptions for list_scanner_issues and get_scanner_issue_detail lack context on when to prefer these over list_security_candidates or what signals they reveal. Description lengths are 34-52 characters, below the 50-200 character LLM-optimized baseline.
delete_file lacks confirmation or dry-run pattern. Destructive operations risk catastrophic errors if an agent hallucination passes the wrong fileId. No recovery guidance in error response.
Output schemas not formally documented in tool descriptions. Agents cannot infer what fields task result returns (status, result, error structure) or what graphql_query response format is without reading implementation code.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | <=2025-11-25 | v2 |
Describes a specific type from a cached GraphQL schema: lists all fields with their types and arguments. Requires graphql_introspect to have been called first. Tip: look for fields with unusual arguments or deprecated fields — these are often overlooked attack surfaces.
Sends a GraphQL introspection query to the target and caches the schema in memory. Returns a summary of discovered types and root fields (Query/Mutation). Cache key format: 'hostname:port/path' (e.g. 'api.example.com:443/graphql'). Run this first — subsequent graphql_list_types / graphql_describe_type calls read from the cache. Useful for discovering hidden fields, deprecated arguments, and internal types for bug hunting.
Lists all non-introspection types in a cached GraphQL schema. Requires graphql_introspect to have been called first with the same cacheKey. Shows each type's name and kind (OBJECT, SCALAR, ENUM, INPUT_OBJECT, INTERFACE, UNION). Use graphql_describe_type to drill into a specific type's fields and arguments.
Executes an arbitrary GraphQL query or mutation against the target endpoint. query: the GraphQL query string (e.g. '{ user(id: "1") { id name } }'). variables: optional JSON string of variables (e.g. '{"id":"1"}'). Returns the raw JSON response. Use graphql_introspect first to discover available fields.
Lists proxy HTTP history from local cache. Returns lightweight entries with id, method, status, url, content_type, param_names, hit_count, and candidate summary fields. Prefer list_security_candidates first, then use get_proxy_http_detail with specific IDs only when you need request or response evidence. Use count ≤ 20.
Lists scanner issues from the database cache
Lists high-signal proxy cache candidates ranked for security review. Returns only summary fields and no bodies. Prefer this before reading raw history. Use minScore to tighten the queue, or includeLowValue=true to see the tail.
Manages Burp's target scope. action: 'add' — include URL in scope (url required); 'ensure' — idempotently include URL only if missing (url required); 'remove' — exclude URL from scope (url required); 'check' — test if URL is currently in scope (url required); 'list' — export all current scope rules as JSON (url not needed); 'clear' — remove all include rules from scope (url not needed). URL examples: 'https://example.com', 'https://api.example.com/v1/'. To backup/restore scope: action='list' to get JSON, then use set_project_options with that JSON wrapped under a top-level 'project_options' key to restore.
Reads content from a file stored in the file queue by file ID. Supports offset and limit for chunked reading. Use for large responses.
Starts a Burp active scan of the specified URL (Pro only). auditType options: 'active' — active checks (default); 'passive' — passive checks only. IMPORTANT: pass the full raw HTTP request (request line, headers, cookies, body) via the optional 'content' param so request-shape-dependent extensions actually fire — e.g. FastjsonScan needs a POST JSON body, ShiroScan needs a rememberMe cookie, Java Deserialization Scanner needs a body. Without 'content', the scan falls back to a bare GET of the URL (only query-string params become insertion points). Installed scanner extensions (Active Scan++, FastjsonScan, ShiroScan, etc.) run automatically. Returns immediately. Poll results with list_scanner_issues (DB cache) or get_scanner_issues (live). Tip: call manage_scope to add the URL to scope first.
Submits a task to the message queue for async execution. Returns a task ID. Supported types: send_http1_request, create_repeater_tab, send_to_intruder. Poll completion with get_task_result.
submit_task 'params' parameter accepts generic object with no documentation of required/optional keys per task type. LLMs must infer valid keys from task type name alone. Enumerate expected params for send_http1_request, create_repeater_tab, send_to_intruder in description.
manage_scope action parameter accepts string with no enum constraint. LLM could hallucinate 'list_all' or 'delete' instead of correct 'list', 'clear'. Enum(['add', 'ensure', 'remove', 'check', 'list', 'clear']) prevents invalid values.
Error handling delegates to implicit type coercion (id1.toIntOrNull() ?: return error). LLMs see generic 'Invalid ID' message with no recovery hint. Errors should suggest what ID format is expected or offer list_proxy_http_history to fetch valid IDs.