Skip to content

Add BurpSuite MCP Bridge#191

Open
6jeffr3y wants to merge 2 commits into
hashgraph-online:mainfrom
6jeffr3y:add-burpsuite-mcp-bridge
Open

Add BurpSuite MCP Bridge#191
6jeffr3y wants to merge 2 commits into
hashgraph-online:mainfrom
6jeffr3y:add-burpsuite-mcp-bridge

Conversation

@6jeffr3y

@6jeffr3y 6jeffr3y commented Jun 6, 2026

Copy link
Copy Markdown

Summary

Adds BurpSuite MCP Bridge to the Tools & Integrations section.

BurpSuite MCP Bridge connects Burp Suite traffic, replay, rewrite rules, UI selection handoff, BCheck/Bambda import,
and evidence export into Codex through MCP for WSL, Windows, and macOS workflows.

Checklist

  • Added README entry in alphabetical order.
  • Added mirrored plugin bundle under plugins/6jeffr3y/burpsuite-mcp-bridge/.
  • Added .codex-plugin/plugin.json and icon assets.
  • Updated plugins.json and .agents/plugins/marketplace.json.

Local validation

  • python3 scripts/check-alphabetical.py README.md
  • python3 scripts/validate-plugin-pr.py --base-ref origin/main

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the BurpSuite MCP Bridge plugin, adding its registration, configuration examples, documentation, and a Python MCP server implementation. The code review identified critical runtime compatibility issues with the official mcp Python SDK in the server implementation, specifically regarding unsupported FastMCP constructor arguments, invalid transport options, and a potential JSONDecodeError when handling empty HTTP response bodies.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +27 to +38
mcp = FastMCP(
"BurpSuite MCP Bridge",
instructions=(
"Use these tools to read and operate Burp proxy traffic from Windows Burp in WSL mirrored mode. "
"Prefer burp_target_overview(host=...) when working one target, or burp_live_overview/burp_live_poll for incremental triage, then burp_flow_get for a decisive request/response pair. "
"Use burp_replay_flow or burp_send_raw_request when you need AI-driven request mutation and replay. "
"Use burp_rule_upsert to install automatic request/response rewrite rules for proxied traffic; rule action is modify, drop, or spoof."
),
host=MCP_SERVER_HOST,
port=MCP_SERVER_PORT,
streamable_http_path=MCP_SERVER_PATH,
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The FastMCP constructor in the official mcp Python SDK (version 1.0.0+) does not accept the streamable_http_path argument. Including it will cause a TypeError at runtime, preventing the server from starting. Please remove this argument to ensure compatibility with the standard mcp library.

mcp = FastMCP(
    "BurpSuite MCP Bridge",
    instructions=(
        "Use these tools to read and operate Burp proxy traffic from Windows Burp in WSL mirrored mode. "
        "Prefer burp_target_overview(host=...) when working one target, or burp_live_overview/burp_live_poll for incremental triage, then burp_flow_get for a decisive request/response pair. "
        "Use burp_replay_flow or burp_send_raw_request when you need AI-driven request mutation and replay. "
        "Use burp_rule_upsert to install automatic request/response rewrite rules for proxied traffic; rule action is modify, drop, or spoof."
    ),
    host=MCP_SERVER_HOST,
    port=MCP_SERVER_PORT,
)

Comment on lines +1234 to +1249
if __name__ == "__main__":
try:
parser = argparse.ArgumentParser(description="BurpSuite MCP Bridge server")
parser.add_argument("--transport", choices=["stdio", "streamable-http", "sse"], default=MCP_TRANSPORT)
parser.add_argument("--host", default=MCP_SERVER_HOST, help="Host for HTTP MCP transports")
parser.add_argument("--port", type=int, default=MCP_SERVER_PORT, help="Port for HTTP MCP transports")
parser.add_argument("--path", default=MCP_SERVER_PATH, help="Path for Streamable HTTP MCP transport")
args = parser.parse_args()

mcp.settings.host = args.host
mcp.settings.port = args.port
mcp.settings.streamable_http_path = args.path
mcp.run(transport=args.transport)
except Exception as exc: # pragma: no cover
print(f"[burpsuite-mcp-bridge] fatal: {exc}", file=os.sys.stderr)
raise

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The official mcp Python SDK's FastMCP class does not expose a mutable settings attribute with streamable_http_path, nor does mcp.run() support "streamable-http" as a transport option. Attempting to run the server with these options will result in runtime errors. Let's update the argument parser and transport options to align with the official SDK's supported transports ("stdio" and "sse").

Suggested change
if __name__ == "__main__":
try:
parser = argparse.ArgumentParser(description="BurpSuite MCP Bridge server")
parser.add_argument("--transport", choices=["stdio", "streamable-http", "sse"], default=MCP_TRANSPORT)
parser.add_argument("--host", default=MCP_SERVER_HOST, help="Host for HTTP MCP transports")
parser.add_argument("--port", type=int, default=MCP_SERVER_PORT, help="Port for HTTP MCP transports")
parser.add_argument("--path", default=MCP_SERVER_PATH, help="Path for Streamable HTTP MCP transport")
args = parser.parse_args()
mcp.settings.host = args.host
mcp.settings.port = args.port
mcp.settings.streamable_http_path = args.path
mcp.run(transport=args.transport)
except Exception as exc: # pragma: no cover
print(f"[burpsuite-mcp-bridge] fatal: {exc}", file=os.sys.stderr)
raise
if __name__ == "__main__":
try:
parser = argparse.ArgumentParser(description="BurpSuite MCP Bridge server")
parser.add_argument("--transport", choices=["stdio", "sse"], default=MCP_TRANSPORT)
parser.add_argument("--host", default=MCP_SERVER_HOST, help="Host for HTTP MCP transports")
parser.add_argument("--port", type=int, default=MCP_SERVER_PORT, help="Port for HTTP MCP transports")
args = parser.parse_args()
mcp.host = args.host
mcp.port = args.port
mcp.run(transport=args.transport)
except Exception as exc: # pragma: no cover
print(f"[burpsuite-mcp-bridge] fatal: {exc}", file=os.sys.stderr)
raise

Comment on lines +63 to +64
with _NO_PROXY_OPENER.open(request, timeout=30) as response:
data = json.loads(response.read().decode("utf-8"))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

If the Burp bridge returns an empty response body (e.g., for successful DELETE or buffer clearing operations), response.read() will return an empty byte string. Calling json.loads() on an empty string will raise a json.JSONDecodeError. We should check if the response body is empty before attempting to parse it as JSON.

Suggested change
with _NO_PROXY_OPENER.open(request, timeout=30) as response:
data = json.loads(response.read().decode("utf-8"))
with _NO_PROXY_OPENER.open(request, timeout=30) as response:
res_bytes = response.read()
data = json.loads(res_bytes.decode("utf-8")) if res_bytes else {"ok": True}

@mcp.tool()
def burp_flow_get(flow_id: int, source: str = "live", include_bodies: bool = True) -> dict[str, Any]:
"""读取单条流量的完整细节。source=live/history/selection。"""
if source not in {"live", "history", "selection"}:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CRITICAL: Missing 'logger' in source validation allows incorrect routing

The validation set {"live", "history", "selection"} does not include "logger", but other functions like burp_replay_flow (line 860), burp_send_to_repeater (line 441), and burp_export_flow_bundle (line 471) all accept "logger" as a valid source. If a caller passes source="logger", the function would incorrectly fall through to the else branch and route to /api/selection/flows/{flow_id} instead of the correct /api/logger/flows/{flow_id}.

This should be: if source not in {"live", "history", "logger", "selection"}

@kilo-code-bot

kilo-code-bot Bot commented Jun 6, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

The previously reported CRITICAL issue (missing 'logger' in source validation allowing incorrect routing) has been fixed in this PR. All source validation checks now correctly include 'logger' in the allowed values set.

This PR adds the BurpSuite MCP Bridge plugin with proper source validation across all tool functions.

Files Reviewed (11 files)
  • plugins/6jeffr3y/burpsuite-mcp-bridge/wsl-mcp/server.py - New file, 1251 lines (exceeds 500 LOC guideline - carried forward observation)
  • plugins/6jeffr3y/burpsuite-mcp-bridge/.codex-plugin/plugin.json - New file, valid structure
  • plugins/6jeffr3y/burpsuite-mcp-bridge/.mcp.json - New file, valid MCP configuration
  • plugins/6jeffr3y/burpsuite-mcp-bridge/README.md - New file, Chinese/English docs
  • plugins/6jeffr3y/burpsuite-mcp-bridge/README_CN.md - New file
  • plugins/6jeffr3y/burpsuite-mcp-bridge/CHANGELOG.md - New file
  • plugins/6jeffr3y/burpsuite-mcp-bridge/CHANGELOG_CN.md - New file
  • plugins/6jeffr3y/burpsuite-mcp-bridge/RELEASE_NOTES_v1.1.0.md - New file
  • plugins/6jeffr3y/burpsuite-mcp-bridge/assets/icon.svg - New file (binary)
  • plugins/6jeffr3y/burpsuite-mcp-bridge/assets/logo.svg - New file (binary)
  • scripts/generate_plugins_json.py - Added burpsuite-mcp-bridge to EXTRA_MIRROR_PATHS

Reviewed by laguna-m.1-20260312:free · 4,212,427 tokens

@internet-dot

Copy link
Copy Markdown
Collaborator

Two concerns:\n\n1. Binary JAR files in the bundle. The PR includes burpsuite-mcp-bridge-1.1.0-all.jar (~438KB) and burpsuite-mcp-bridge-latest.jar inside the plugin directory. These should not be committed to the git repo. If installation requires the JAR, provide download-on-install instructions instead.\n\n2. Proprietary license. The plugin.json declares "license": "Proprietary Runtime Distribution". Including a proprietary-licensed plugin needs explicit maintainer approval.\n\nPlease remove the JAR files and clarify the license terms before we can proceed.

@internet-dot

Copy link
Copy Markdown
Collaborator

Before this PR can be merged, your plugin repo needs the HOL AI Plugin Scanner running in CI. This is a mandatory requirement for all submissions.

Add this workflow to your plugin repo at .github/workflows/hol-plugin-scanner.yml:

name: HOL Plugin Scanner

on:
  push:
    branches: [main, master]
  pull_request:
    branches: [main, master]

permissions:
  contents: read
  security-events: write

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
      - name: HOL Plugin Scanner
        uses: hashgraph-online/ai-plugin-scanner-action@v1
        with:
          plugin_dir: "."
          mode: scan
          min_score: 80
          fail_on_severity: high
          format: sarif
          upload_sarif: true

Also run the scanner locally and include the score in your PR description:

pipx install plugin-scanner
plugin-scanner scan . --format text

Your plugin needs a score of 80/130 or higher with no critical or high severity findings. Link the CI run or paste the score in this PR description.

See the full guide: SCANNER_GUIDE.md

Additional issues:
Previous review noted JAR binaries and proprietary license in the bundle. Please address those concerns too.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants