From df0799cfdd7bef36acc4c53912c4c2e28c6baeb0 Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 12:41:41 +0200 Subject: [PATCH 01/16] add: mcp server --- frontend/src/components/LogTable/LogTable.vue | 10 +- frontend/src/stores/logs.js | 4 +- mcphawk/__init__.py | 1 - mcphawk/cli.py | 90 +++++- mcphawk/logger.py | 61 ++++- mcphawk/mcp_server/__init__.py | 1 + mcphawk/mcp_server/server.py | 227 +++++++++++++++ mcphawk/sniffer.py | 19 +- mcphawk/utils.py | 53 ++++ mcphawk/web/server.py | 9 +- requirements.txt | 3 +- tests/test_cli.py | 54 +++- tests/test_mcp_server.py | 259 ++++++++++++++++++ tests/test_sniffer.py | 2 +- tests/test_traffic_type.py | 9 +- tests/test_utils.py | 165 +++++++++++ tests/test_web.py | 41 ++- tests/test_web_server.py | 2 +- 18 files changed, 957 insertions(+), 53 deletions(-) create mode 100644 mcphawk/mcp_server/__init__.py create mode 100644 mcphawk/mcp_server/server.py create mode 100644 mcphawk/utils.py create mode 100644 tests/test_mcp_server.py create mode 100644 tests/test_utils.py diff --git a/frontend/src/components/LogTable/LogTable.vue b/frontend/src/components/LogTable/LogTable.vue index 995eb0b..5800109 100644 --- a/frontend/src/components/LogTable/LogTable.vue +++ b/frontend/src/components/LogTable/LogTable.vue @@ -36,10 +36,10 @@ @@ -75,10 +75,6 @@ const logStore = useLogStore() const displayLogs = computed(() => logStore.filteredLogs) function handleLogClick(log) { - // Generate ID if missing (for compatibility) - if (!log.id) { - log.id = `${log.timestamp}-${log.src_port}-${Math.random()}` - } - logStore.selectLog(log.id) + logStore.selectLog(log.log_id) } \ No newline at end of file diff --git a/frontend/src/stores/logs.js b/frontend/src/stores/logs.js index ece3888..2eeb375 100644 --- a/frontend/src/stores/logs.js +++ b/frontend/src/stores/logs.js @@ -58,7 +58,7 @@ export const useLogStore = defineStore('logs', () => { }) const selectedLog = computed(() => { - return logs.value.find(log => log.id === selectedLogId.value) + return logs.value.find(log => log.log_id === selectedLogId.value) }) const pairedLogs = computed(() => { @@ -71,7 +71,7 @@ export const useLogStore = defineStore('logs', () => { logs.value.forEach(log => { const logParsed = parseMessage(log.message) if (logParsed && logParsed.id === parsed.id) { - paired.add(log.id) + paired.add(log.log_id) } }) diff --git a/mcphawk/__init__.py b/mcphawk/__init__.py index 3dc1f76..e69de29 100644 --- a/mcphawk/__init__.py +++ b/mcphawk/__init__.py @@ -1 +0,0 @@ -__version__ = "0.1.0" diff --git a/mcphawk/cli.py b/mcphawk/cli.py index 7a13a5c..ce56c04 100644 --- a/mcphawk/cli.py +++ b/mcphawk/cli.py @@ -1,9 +1,12 @@ +import asyncio import logging import sys +import threading import typer from mcphawk.logger import init_db +from mcphawk.mcp_server.server import MCPHawkServer from mcphawk.sniffer import start_sniffer from mcphawk.web.server import run_web @@ -22,6 +25,8 @@ def sniff( port: int = typer.Option(None, "--port", "-p", help="TCP port to monitor"), filter: str = typer.Option(None, "--filter", "-f", help="Custom BPF filter expression"), auto_detect: bool = typer.Option(False, "--auto-detect", "-a", help="Auto-detect MCP traffic on any port"), + with_mcp: bool = typer.Option(False, "--with-mcp", help="Start MCP server alongside sniffer"), + mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP server (stdio if not specified)"), debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start sniffing MCP traffic (console output only).""" @@ -45,10 +50,32 @@ def sniff( filter_expr = "tcp" print("[MCPHawk] Auto-detect mode: monitoring all TCP traffic for MCP messages") + # Start MCP server if requested + mcp_thread = None + if with_mcp: + print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + server = MCPHawkServer() + + def run_mcp(): + asyncio.run(server.run_stdio()) + + mcp_thread = threading.Thread(target=run_mcp, daemon=True) + mcp_thread.start() + print(f"[MCPHawk] Starting sniffer with filter: {filter_expr}") + if with_mcp and filter_expr != "tcp": + print(f"[MCPHawk] Note: MCP server traffic on port {mcp_port} will be excluded from capture") print("[MCPHawk] Press Ctrl+C to stop...") + try: - start_sniffer(filter_expr=filter_expr, auto_detect=auto_detect, debug=debug) + # Exclude MCP port if running MCP server + excluded_ports = [mcp_port] if with_mcp else [] + start_sniffer( + filter_expr=filter_expr, + auto_detect=auto_detect, + debug=debug, + excluded_ports=excluded_ports + ) except KeyboardInterrupt: print("\n[MCPHawk] Sniffer stopped.") sys.exit(0) @@ -62,6 +89,8 @@ def web( no_sniffer: bool = typer.Option(False, "--no-sniffer", help="Disable sniffer (view historical logs only)"), host: str = typer.Option("127.0.0.1", "--host", help="Web server host"), web_port: int = typer.Option(8000, "--web-port", help="Web server port"), + with_mcp: bool = typer.Option(False, "--with-mcp", help="Start MCP server alongside web UI"), + mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP server (stdio if not specified)"), debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start the MCPHawk dashboard with sniffer.""" @@ -85,11 +114,68 @@ def web( else: filter_expr = None # No sniffer + # Start MCP server if requested + mcp_thread = None + if with_mcp: + print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + server = MCPHawkServer() + + def run_mcp(): + asyncio.run(server.run_stdio()) + + mcp_thread = threading.Thread(target=run_mcp, daemon=True) + mcp_thread.start() + + # Update filter to exclude MCP port if needed + if with_mcp and filter_expr and filter_expr != "tcp": + print(f"[MCPHawk] Note: MCP server traffic on port {mcp_port} will be excluded from capture") + run_web( sniffer=not no_sniffer, host=host, port=web_port, filter_expr=filter_expr, auto_detect=auto_detect, - debug=debug + debug=debug, + excluded_ports=[mcp_port] if with_mcp else [] ) + + +@app.command() +def mcp( + transport: str = typer.Option("stdio", "--transport", "-t", help="Transport type: stdio or tcp"), + mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for TCP transport (ignored for stdio)"), + debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") +): + """Run MCPHawk MCP server standalone (query existing captured data).""" + print(f"[MCPHawk] Starting MCP server (transport: {transport})") + + if transport == "stdio": + print("[MCPHawk] Use this server with MCP clients by configuring stdio transport") + print("[MCPHawk] Example MCP client configuration:") + print(""" +{ + "mcpServers": { + "mcphawk": { + "command": "mcphawk", + "args": ["mcp"] + } + } +} + """) + elif transport == "tcp": + print(f"[MCPHawk] MCP server will listen on port {mcp_port}") + print("[MCPHawk] Note: TCP transport not yet implemented") + raise typer.Exit(1) + else: + print(f"[ERROR] Unknown transport: {transport}") + raise typer.Exit(1) + + # Create and run MCP server + server = MCPHawkServer() + + try: + asyncio.run(server.run_stdio()) + except KeyboardInterrupt: + print("\n[MCPHawk] MCP server stopped.") + sys.exit(0) diff --git a/mcphawk/logger.py b/mcphawk/logger.py index 1ba1c78..970505c 100644 --- a/mcphawk/logger.py +++ b/mcphawk/logger.py @@ -29,7 +29,7 @@ def init_db() -> None: cur.execute( """ CREATE TABLE IF NOT EXISTS logs ( - id INTEGER PRIMARY KEY AUTOINCREMENT, + log_id TEXT PRIMARY KEY, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP, src_ip TEXT, dst_ip TEXT, @@ -57,6 +57,7 @@ def log_message(entry: dict[str, Any]) -> None: Args: entry (Dict[str, Any]): Must contain MCPMessageLog fields: + log_id (str) - UUID for the log entry timestamp (datetime) - If missing, current time is used src_ip (str) dst_ip (str) @@ -67,14 +68,19 @@ def log_message(entry: dict[str, Any]) -> None: traffic_type (str): 'TCP', 'WS', or 'N/A' (optional, defaults to 'N/A') """ timestamp = entry.get("timestamp", datetime.now(tz=timezone.utc)) + log_id = entry.get("log_id") + if not log_id: + raise ValueError("log_id is required") + conn = sqlite3.connect(DB_PATH) cur = conn.cursor() cur.execute( """ - INSERT INTO logs (timestamp, src_ip, dst_ip, src_port, dst_port, direction, message, traffic_type) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) + INSERT INTO logs (log_id, timestamp, src_ip, dst_ip, src_port, dst_port, direction, message, traffic_type) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( + log_id, timestamp.isoformat(), entry.get("src_ip"), entry.get("dst_ip"), @@ -113,9 +119,9 @@ def fetch_logs(limit: int = 100) -> list[dict[str, Any]]: cur = conn.cursor() cur.execute( """ - SELECT timestamp, src_ip, dst_ip, src_port, dst_port, direction, message, traffic_type + SELECT log_id, timestamp, src_ip, dst_ip, src_port, dst_port, direction, message, traffic_type FROM logs - ORDER BY id DESC + ORDER BY timestamp DESC LIMIT ? """, (limit,), @@ -125,6 +131,7 @@ def fetch_logs(limit: int = 100) -> list[dict[str, Any]]: return [ { + "log_id": row["log_id"], "timestamp": datetime.fromisoformat(row["timestamp"]), "src_ip": row["src_ip"], "dst_ip": row["dst_ip"], @@ -162,3 +169,47 @@ def clear_logs() -> None: cur.execute("DELETE FROM logs;") conn.commit() conn.close() + + +def get_log_by_id(log_id: str) -> dict[str, Any] | None: + """ + Fetch a specific log entry by ID. + + Args: + log_id (str): The UUID of the log entry to retrieve. + + Returns: + Dictionary matching MCPMessageLog format or None if not found. + """ + current_path = DB_PATH if DB_PATH else _DEFAULT_DB_PATH + if not current_path.exists(): + return None + + conn = sqlite3.connect(current_path) + conn.row_factory = sqlite3.Row + cur = conn.cursor() + cur.execute( + """ + SELECT log_id, timestamp, src_ip, dst_ip, src_port, dst_port, direction, message, traffic_type + FROM logs + WHERE log_id = ? + """, + (log_id,), + ) + row = cur.fetchone() + conn.close() + + if not row: + return None + + return { + "log_id": row["log_id"], + "timestamp": datetime.fromisoformat(row["timestamp"]), + "src_ip": row["src_ip"], + "dst_ip": row["dst_ip"], + "src_port": row["src_port"], + "dst_port": row["dst_port"], + "direction": row["direction"], + "message": row["message"], + "traffic_type": row["traffic_type"] if row["traffic_type"] is not None else "N/A", + } diff --git a/mcphawk/mcp_server/__init__.py b/mcphawk/mcp_server/__init__.py new file mode 100644 index 0000000..6e3a591 --- /dev/null +++ b/mcphawk/mcp_server/__init__.py @@ -0,0 +1 @@ +"""MCPHawk MCP Server - Query and analyze captured MCP traffic.""" diff --git a/mcphawk/mcp_server/server.py b/mcphawk/mcp_server/server.py new file mode 100644 index 0000000..2f3b4ca --- /dev/null +++ b/mcphawk/mcp_server/server.py @@ -0,0 +1,227 @@ +"""MCP server implementation for MCPHawk.""" + +import asyncio +import json +from typing import Any, Optional + +from mcp.server import Server +from mcp.types import TextContent, Tool + +from .. import logger +from ..utils import get_message_type + + +class MCPHawkServer: + """MCP server that exposes captured traffic data.""" + + def __init__(self, db_path: Optional[str] = None): + self.server = Server("mcphawk-mcp") + if db_path: + logger.set_db_path(db_path) + self._setup_handlers() + + def _setup_handlers(self): + """Setup MCP protocol handlers.""" + + @self.server.list_tools() + async def handle_list_tools() -> list[Tool]: + """List available tools.""" + return [ + Tool( + name="query_traffic", + description="Query captured MCP traffic with optional filtering", + inputSchema={ + "type": "object", + "properties": { + "limit": { + "type": "integer", + "description": "Maximum number of results to return", + "default": 100 + }, + "offset": { + "type": "integer", + "description": "Number of results to skip", + "default": 0 + } + } + } + ), + Tool( + name="get_log", + description="Get a specific log entry by ID", + inputSchema={ + "type": "object", + "properties": { + "log_id": { + "type": "string", + "description": "The ID of the log entry to retrieve" + } + }, + "required": ["log_id"] + } + ), + Tool( + name="search_traffic", + description="Search traffic by message content", + inputSchema={ + "type": "object", + "properties": { + "search_term": { + "type": "string", + "description": "Term to search for in message content" + }, + "message_type": { + "type": "string", + "enum": ["request", "response", "notification"], + "description": "Filter by message type" + }, + "traffic_type": { + "type": "string", + "enum": ["TCP/Direct", "TCP/WS"], + "description": "Filter by traffic type" + } + }, + "required": ["search_term"] + } + ), + Tool( + name="get_stats", + description="Get statistics about captured traffic", + inputSchema={ + "type": "object", + "properties": {} + } + ), + Tool( + name="list_methods", + description="List all unique JSON-RPC methods captured", + inputSchema={ + "type": "object", + "properties": {} + } + ) + ] + + @self.server.call_tool() + async def handle_call_tool(name: str, arguments: Optional[dict[str, Any]] = None) -> list[TextContent]: + """Handle tool calls.""" + + if name == "query_traffic": + limit = arguments.get("limit", 100) if arguments else 100 + # offset = arguments.get("offset", 0) if arguments else 0 # TODO: implement offset support + logs = logger.fetch_logs(limit=limit) + + # Convert datetime objects to strings for JSON serialization + for log in logs: + log["timestamp"] = log["timestamp"].isoformat() + + return [TextContent(type="text", text=json.dumps(logs, indent=2))] + + elif name == "get_log": + if not arguments or "log_id" not in arguments: + return [TextContent(type="text", text="Error: log_id is required")] + log_id = arguments["log_id"] + log = logger.get_log_by_id(log_id) + if log: + # Convert datetime to string for JSON serialization + log["timestamp"] = log["timestamp"].isoformat() + return [TextContent(type="text", text=json.dumps(log, indent=2))] + else: + return [TextContent(type="text", text=f"Error: Log with ID {log_id} not found")] + + elif name == "search_traffic": + if not arguments or "search_term" not in arguments: + return [TextContent(type="text", text="Error: search_term is required")] + + search_term = arguments["search_term"].lower() + message_type = arguments.get("message_type") + traffic_type = arguments.get("traffic_type") + + # Fetch all logs and filter (TODO: Add DB-level search) + all_logs = logger.fetch_logs(limit=1000) + results = [] + + for log in all_logs: + if search_term in log["message"].lower(): + # Apply filters + if message_type: + log_msg_type = get_message_type(log["message"]) + if log_msg_type != message_type: + continue + if traffic_type and log.get("traffic_type") != traffic_type: + continue + results.append(log) + + # Convert datetime objects to strings + for log in results: + log["timestamp"] = log["timestamp"].isoformat() + + return [TextContent(type="text", text=json.dumps(results, indent=2))] + + elif name == "get_stats": + logs = logger.fetch_logs(limit=10000) # Get recent logs + + stats = { + "total": len(logs), + "requests": 0, + "responses": 0, + "notifications": 0, + "errors": 0, + "by_traffic_type": { + "TCP/Direct": 0, + "TCP/WS": 0, + "N/A": 0 + } + } + + for log in logs: + msg_type = get_message_type(log["message"]) + if msg_type == "request": + stats["requests"] += 1 + elif msg_type == "response": + stats["responses"] += 1 + elif msg_type == "notification": + stats["notifications"] += 1 + + # Check for errors + try: + parsed = json.loads(log["message"]) + if "error" in parsed: + stats["errors"] += 1 + except json.JSONDecodeError: + pass + + # Traffic type + traffic_type = log.get("traffic_type", "N/A") + if traffic_type in stats["by_traffic_type"]: + stats["by_traffic_type"][traffic_type] += 1 + + return [TextContent(type="text", text=json.dumps(stats, indent=2))] + + elif name == "list_methods": + logs = logger.fetch_logs(limit=10000) + methods = set() + + for log in logs: + try: + parsed = json.loads(log["message"]) + if "method" in parsed: + methods.add(parsed["method"]) + except json.JSONDecodeError: + pass + + return [TextContent(type="text", text=json.dumps(sorted(methods), indent=2))] + + else: + return [TextContent(type="text", text=f"Unknown tool: {name}")] + + async def run_stdio(self): + """Run the MCP server using stdio transport.""" + async with self.server.run(): + # The server will run until interrupted + await asyncio.Event().wait() + + async def run_tcp(self, host: str = "127.0.0.1", port: int = 8765): + """Run the MCP server using TCP transport.""" + # TODO: Implement TCP transport when needed + raise NotImplementedError("TCP transport not implemented yet") diff --git a/mcphawk/sniffer.py b/mcphawk/sniffer.py index f25f107..ef14c74 100644 --- a/mcphawk/sniffer.py +++ b/mcphawk/sniffer.py @@ -1,6 +1,7 @@ import asyncio import logging import platform +import uuid from datetime import datetime, timezone # Suppress Scapy warnings before importing @@ -34,6 +35,9 @@ def _broadcast_in_any_loop(log_entry: dict) -> None: # Global variable to track auto-detect mode _auto_detect_mode = False +# Global variable to track excluded ports +_excluded_ports = set() + # Track established WebSocket connections _ws_connections = set() @@ -42,6 +46,12 @@ def packet_callback(pkt): Callback for every sniffed packet. Extract JSON-RPC messages from raw TCP payloads. """ + # Skip packets to/from excluded ports + if pkt.haslayer(TCP) and _excluded_ports: + tcp_layer = pkt[TCP] + if tcp_layer.sport in _excluded_ports or tcp_layer.dport in _excluded_ports: + return + if pkt.haslayer(Raw): raw_payload = pkt[Raw].load if not _auto_detect_mode: # Less verbose in auto-detect mode @@ -109,7 +119,9 @@ def packet_callback(pkt): if _auto_detect_mode and "jsonrpc" in msg: print(f"[MCPHawk] Detected WebSocket MCP traffic on port {src_port} -> {dst_port}") + log_id = str(uuid.uuid4()) entry = { + "log_id": log_id, "timestamp": ts, "src_ip": src_ip, "src_port": src_port, @@ -156,7 +168,9 @@ def packet_callback(pkt): src_ip = "" dst_ip = "" + log_id = str(uuid.uuid4()) entry = { + "log_id": log_id, "timestamp": ts, "src_ip": src_ip, "src_port": src_port, @@ -177,7 +191,7 @@ def packet_callback(pkt): logger.debug(f"JSON decode failed: {e}") -def start_sniffer(filter_expr: str = "tcp and port 12345", auto_detect: bool = False, debug: bool = False) -> None: +def start_sniffer(filter_expr: str = "tcp and port 12345", auto_detect: bool = False, debug: bool = False, excluded_ports: list[int] | None = None) -> None: """ Start sniffing packets on the appropriate interface. - On macOS: use `lo0` @@ -188,8 +202,9 @@ def start_sniffer(filter_expr: str = "tcp and port 12345", auto_detect: bool = F auto_detect: If True, automatically detect MCP traffic on any port debug: If True, enable debug logging """ - global _auto_detect_mode + global _auto_detect_mode, _excluded_ports _auto_detect_mode = auto_detect + _excluded_ports = set(excluded_ports) if excluded_ports else set() # Configure logging based on debug flag if debug: diff --git a/mcphawk/utils.py b/mcphawk/utils.py new file mode 100644 index 0000000..13519a5 --- /dev/null +++ b/mcphawk/utils.py @@ -0,0 +1,53 @@ +"""Utility functions for MCPHawk.""" + +import json +from typing import Any, Optional + + +def parse_message(message: str) -> Optional[dict[str, Any]]: + """Parse a JSON message string.""" + try: + if isinstance(message, str): + return json.loads(message) + return message + except (json.JSONDecodeError, TypeError): + return None + + +def get_message_type(message: str) -> str: + """ + Determine the type of a JSON-RPC message. + + Returns: 'request', 'response', 'notification', 'error', or 'unknown' + """ + parsed = parse_message(message) + if not parsed: + return "unknown" + + # Check if it's a valid JSON-RPC 2.0 message + if parsed.get("jsonrpc") != "2.0": + return "unknown" + + # Error response (has error and id) + if "error" in parsed and "id" in parsed: + return "error" + + # Response (has result and id) + if "result" in parsed and "id" in parsed: + return "response" + + # Request (has method and id) + if "method" in parsed and "id" in parsed: + return "request" + + # Notification (has method but no id) + if "method" in parsed and "id" not in parsed: + return "notification" + + return "unknown" + + +def get_method_name(message: str) -> Optional[str]: + """Extract method name from a JSON-RPC message.""" + parsed = parse_message(message) + return parsed.get("method") if parsed else None diff --git a/mcphawk/web/server.py b/mcphawk/web/server.py index 7987fd1..c943237 100644 --- a/mcphawk/web/server.py +++ b/mcphawk/web/server.py @@ -83,7 +83,7 @@ async def websocket_endpoint(websocket: WebSocket): logger.debug(f"WebSocket disconnected: {len(active_clients)} active clients") -def _start_sniffer_thread(filter_expr: str, auto_detect: bool = False, debug: bool = False): +def _start_sniffer_thread(filter_expr: str, auto_detect: bool = False, debug: bool = False, excluded_ports: Optional[list[int]] = None): """ Start the sniffer in a dedicated daemon thread. @@ -91,18 +91,19 @@ def _start_sniffer_thread(filter_expr: str, auto_detect: bool = False, debug: bo filter_expr: BPF filter expression for the sniffer. auto_detect: Whether to auto-detect MCP traffic. debug: Whether to enable debug logging. + excluded_ports: List of ports to exclude from capture. """ from mcphawk.sniffer import start_sniffer def safe_start(): logger.debug(f"Sniffer thread starting with filter: {filter_expr}, auto_detect: {auto_detect}") - return start_sniffer(filter_expr=filter_expr, auto_detect=auto_detect, debug=debug) + return start_sniffer(filter_expr=filter_expr, auto_detect=auto_detect, debug=debug, excluded_ports=excluded_ports) thread = threading.Thread(target=safe_start, daemon=True) thread.start() -def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, filter_expr: Optional[str] = None, auto_detect: bool = False, debug: bool = False): +def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, filter_expr: Optional[str] = None, auto_detect: bool = False, debug: bool = False, excluded_ports: Optional[list[int]] = None): """ Run the web server and optionally the sniffer. @@ -117,7 +118,7 @@ def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, fil if sniffer: if not filter_expr: raise ValueError("filter_expr is required when sniffer is enabled") - _start_sniffer_thread(filter_expr, auto_detect, debug) + _start_sniffer_thread(filter_expr, auto_detect, debug, excluded_ports) if sniffer: print(f"[MCPHawk] Starting sniffer and dashboard on http://{host}:{port}") diff --git a/requirements.txt b/requirements.txt index d1f8b5b..6f7aab6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ scapy==2.5.0 psutil==6.0.0 typer>=0.12.0 uvicorn==0.35.0 -wsproto==1.2.0 \ No newline at end of file +wsproto==1.2.0 +mcp>=1.0.0 \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index f39a838..62e40e0 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -60,7 +60,7 @@ def test_sniff_command_with_port(mock_start_sniffer): assert result.exit_code == 0 assert "[MCPHawk] Starting sniffer with filter: tcp port 3000" in result.stdout assert "[MCPHawk] Sniffer stopped." in result.stdout - mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=False) + mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.start_sniffer') @@ -71,7 +71,7 @@ def test_sniff_command_custom_filter(mock_start_sniffer): result = runner.invoke(app, ["sniff", "--filter", "tcp port 8080"]) assert result.exit_code == 0 assert "[MCPHawk] Starting sniffer with filter: tcp port 8080" in result.stdout - mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 8080", auto_detect=False, debug=False) + mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 8080", auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.start_sniffer') @@ -83,7 +83,7 @@ def test_sniff_command_auto_detect(mock_start_sniffer): assert result.exit_code == 0 assert "[MCPHawk] Auto-detect mode: monitoring all TCP traffic for MCP messages" in result.stdout assert "[MCPHawk] Starting sniffer with filter: tcp" in result.stdout - mock_start_sniffer.assert_called_once_with(filter_expr="tcp", auto_detect=True, debug=False) + mock_start_sniffer.assert_called_once_with(filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[]) def test_web_command_requires_flags(): @@ -102,7 +102,7 @@ def test_web_command_with_port(mock_run_web): """Test web command with port option.""" result = runner.invoke(app, ["web", "--port", "3000"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.run_web') @@ -110,7 +110,7 @@ def test_web_command_no_sniffer(mock_run_web): """Test web command with --no-sniffer.""" result = runner.invoke(app, ["web", "--no-sniffer"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False) + mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.run_web') @@ -118,7 +118,7 @@ def test_web_command_custom_host_web_port(mock_run_web): """Test web command with custom host and web-port.""" result = runner.invoke(app, ["web", "--port", "3000", "--host", "0.0.0.0", "--web-port", "9000"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False) + mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.run_web') @@ -126,7 +126,7 @@ def test_web_command_with_filter(mock_run_web): """Test web command with custom filter.""" result = runner.invoke(app, ["web", "--filter", "tcp port 8080 or tcp port 8081"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False, excluded_ports=[]) @patch('mcphawk.cli.run_web') @@ -134,7 +134,7 @@ def test_web_command_auto_detect(mock_run_web): """Test web command with auto-detect mode.""" result = runner.invoke(app, ["web", "--auto-detect"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[]) def test_scapy_warnings_suppressed(): @@ -162,7 +162,7 @@ def test_sniff_command_with_debug_flag(mock_start_sniffer): result = runner.invoke(app, ["sniff", "--port", "3000", "--debug"]) assert result.exit_code == 0 - mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=True) + mock_start_sniffer.assert_called_once_with(filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[]) @patch('mcphawk.cli.run_web') @@ -170,4 +170,38 @@ def test_web_command_with_debug_flag(mock_run_web): """Test web command with debug flag.""" result = runner.invoke(app, ["web", "--port", "3000", "--debug"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[]) + + +@patch('mcphawk.cli.run_web') +@patch('mcphawk.cli.MCPHawkServer') +@patch('mcphawk.cli.threading.Thread') +def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web): + """Test web command with MCP server integration.""" + result = runner.invoke(app, ["web", "--port", "3000", "--with-mcp"]) + assert result.exit_code == 0 + + # Check MCP server was created + mock_mcp_server.assert_called_once() + + # Check thread was started + mock_thread.assert_called_once() + mock_thread.return_value.start.assert_called_once() + + # Check run_web was called with excluded ports + mock_run_web.assert_called_once_with( + sniffer=True, + host="127.0.0.1", + port=8000, + filter_expr="tcp port 3000", + auto_detect=False, + debug=False, + excluded_ports=[8765] # Default MCP port + ) + + +def test_mcp_command(): + """Test standalone MCP command.""" + result = runner.invoke(app, ["mcp", "--help"]) + assert result.exit_code == 0 + assert "Run MCPHawk MCP server standalone" in result.stdout diff --git a/tests/test_mcp_server.py b/tests/test_mcp_server.py new file mode 100644 index 0000000..cc847cc --- /dev/null +++ b/tests/test_mcp_server.py @@ -0,0 +1,259 @@ +"""Tests for MCP server functionality.""" + +import json +import uuid +from datetime import datetime, timezone +from unittest.mock import Mock + +import pytest +from mcp.types import TextContent + +from mcphawk import logger +from mcphawk.mcp_server.server import MCPHawkServer + + +@pytest.fixture +def test_db(tmp_path): + """Create a temporary test database.""" + db_path = tmp_path / "test_mcp.db" + logger.set_db_path(str(db_path)) + logger.init_db() + yield db_path + + +@pytest.fixture +def sample_logs(test_db): + """Create sample log entries.""" + test_messages = [ + { + "jsonrpc": "2.0", + "method": "tools/list", + "id": "req-1" + }, + { + "jsonrpc": "2.0", + "result": {"tools": ["query", "search"]}, + "id": "req-1" + }, + { + "jsonrpc": "2.0", + "method": "progress/update", + "params": {"progress": 50} + }, + { + "jsonrpc": "2.0", + "error": {"code": -32601, "message": "Method not found"}, + "id": "req-2" + } + ] + + log_ids = [] + for i, msg in enumerate(test_messages): + log_id = str(uuid.uuid4()) + log_ids.append(log_id) + entry = { + "log_id": log_id, + "timestamp": datetime.now(tz=timezone.utc), + "src_ip": "127.0.0.1", + "dst_ip": "127.0.0.1", + "src_port": 3000 + i, + "dst_port": 8000, + "direction": "unknown", + "message": json.dumps(msg), + "traffic_type": "TCP/WS" if i % 2 == 0 else "TCP/Direct" + } + logger.log_message(entry) + + return log_ids + + +class TestMCPServer: + """Test MCP server functionality.""" + + def test_server_initialization(self, test_db): + """Test server initializes correctly.""" + server = MCPHawkServer(str(test_db)) + assert server.server.name == "mcphawk-mcp" + + # Check that handlers were registered + assert hasattr(server.server, 'list_tools') + assert hasattr(server.server, 'call_tool') + + @pytest.mark.asyncio + async def test_list_tools_handler(self, test_db): + """Test the list_tools handler directly.""" + server = MCPHawkServer(str(test_db)) + + # Create a mock server instance to capture the handler + mock_server = Mock() + handlers = {} + + def capture_list_tools(): + def decorator(func): + handlers['list_tools'] = func + return func + return decorator + + mock_server.list_tools = capture_list_tools + + # Temporarily replace server and setup handlers + original_server = server.server + server.server = mock_server + server._setup_handlers() + server.server = original_server + + # Now test the captured handler + tools = await handlers['list_tools']() + + assert len(tools) == 5 + tool_names = [tool.name for tool in tools] + assert "query_traffic" in tool_names + assert "get_log" in tool_names + assert "search_traffic" in tool_names + assert "get_stats" in tool_names + assert "list_methods" in tool_names + + # Check tool schemas + query_tool = next(t for t in tools if t.name == "query_traffic") + assert "limit" in query_tool.inputSchema["properties"] + assert "offset" in query_tool.inputSchema["properties"] + + @pytest.mark.asyncio + async def test_call_tool_handler(self, sample_logs): + """Test the call_tool handler directly.""" + server = MCPHawkServer() + + # Create a mock server instance to capture the handler + mock_server = Mock() + handlers = {} + + def capture_call_tool(): + def decorator(func): + handlers['call_tool'] = func + return func + return decorator + + mock_server.call_tool = capture_call_tool + mock_server.list_tools = lambda: lambda f: f # Dummy for list_tools + + # Temporarily replace server and setup handlers + original_server = server.server + server.server = mock_server + server._setup_handlers() + server.server = original_server + + # Test query_traffic + result = await handlers['call_tool']("query_traffic", {"limit": 2}) + assert len(result) == 1 + assert isinstance(result[0], TextContent) + data = json.loads(result[0].text) + assert len(data) == 2 + assert all("log_id" in log for log in data) + + # Test get_log + result = await handlers['call_tool']("get_log", {"log_id": sample_logs[0]}) + data = json.loads(result[0].text) + assert data["log_id"] == sample_logs[0] + assert "tools/list" in data["message"] + + # Test get_log with invalid ID + result = await handlers['call_tool']("get_log", {"log_id": "invalid"}) + assert "not found" in result[0].text + + # Test search_traffic + result = await handlers['call_tool']("search_traffic", {"search_term": "tools/list"}) + data = json.loads(result[0].text) + assert len(data) == 1 + assert "tools/list" in data[0]["message"] + + # Test get_stats + result = await handlers['call_tool']("get_stats", {}) + stats = json.loads(result[0].text) + assert stats["total"] == 4 + assert stats["requests"] == 1 + assert stats["responses"] == 1 + assert stats["notifications"] == 1 + assert stats["errors"] == 1 + + # Test list_methods + result = await handlers['call_tool']("list_methods", {}) + methods = json.loads(result[0].text) + assert len(methods) == 2 + assert "tools/list" in methods + assert "progress/update" in methods + + # Test unknown tool + result = await handlers['call_tool']("unknown_tool", {}) + assert "Unknown tool" in result[0].text + + @pytest.mark.asyncio + async def test_search_with_filters(self, sample_logs): + """Test search functionality with various filters.""" + server = MCPHawkServer() + + # Capture handler as before + mock_server = Mock() + handlers = {} + + def capture_call_tool(): + def decorator(func): + handlers['call_tool'] = func + return func + return decorator + + mock_server.call_tool = capture_call_tool + mock_server.list_tools = lambda: lambda f: f + + original_server = server.server + server.server = mock_server + server._setup_handlers() + server.server = original_server + + # Test message type filter + result = await handlers['call_tool']("search_traffic", { + "search_term": "jsonrpc", + "message_type": "notification" + }) + data = json.loads(result[0].text) + assert len(data) == 1 + assert "progress/update" in data[0]["message"] + + # Test traffic type filter + result = await handlers['call_tool']("search_traffic", { + "search_term": "jsonrpc", + "traffic_type": "TCP/WS" + }) + data = json.loads(result[0].text) + assert len(data) == 2 + assert all(log["traffic_type"] == "TCP/WS" for log in data) + + @pytest.mark.asyncio + async def test_error_handling(self, test_db): + """Test error handling in handlers.""" + server = MCPHawkServer(str(test_db)) + + # Capture handler + mock_server = Mock() + handlers = {} + + def capture_call_tool(): + def decorator(func): + handlers['call_tool'] = func + return func + return decorator + + mock_server.call_tool = capture_call_tool + mock_server.list_tools = lambda: lambda f: f + + original_server = server.server + server.server = mock_server + server._setup_handlers() + server.server = original_server + + # Test missing required parameter + result = await handlers['call_tool']("get_log", {}) + assert "log_id is required" in result[0].text + + # Test missing search term + result = await handlers['call_tool']("search_traffic", {}) + assert "search_term is required" in result[0].text diff --git a/tests/test_sniffer.py b/tests/test_sniffer.py index d9ea081..c741af6 100644 --- a/tests/test_sniffer.py +++ b/tests/test_sniffer.py @@ -85,7 +85,7 @@ def test_packet_callback(clean_db, dummy_server): conn = sqlite3.connect(TEST_DB) cur = conn.cursor() - cur.execute("SELECT message FROM logs ORDER BY id DESC LIMIT 1;") + cur.execute("SELECT message FROM logs ORDER BY log_id DESC LIMIT 1;") logged_msg = cur.fetchone()[0] conn.close() diff --git a/tests/test_traffic_type.py b/tests/test_traffic_type.py index a035a96..185928a 100644 --- a/tests/test_traffic_type.py +++ b/tests/test_traffic_type.py @@ -1,5 +1,6 @@ """Test traffic_type field is properly set for TCP and WebSocket traffic.""" import json +import uuid from datetime import datetime, timezone import pytest @@ -20,6 +21,7 @@ def test_db(tmp_path): def test_tcp_traffic_type(test_db): """Test that TCP traffic is marked with traffic_type='TCP'.""" entry = { + "log_id": str(uuid.uuid4()), "timestamp": datetime.now(tz=timezone.utc), "src_ip": "127.0.0.1", "src_port": 12345, @@ -40,6 +42,7 @@ def test_tcp_traffic_type(test_db): def test_websocket_traffic_type(test_db): """Test that WebSocket traffic is marked with traffic_type='WS'.""" entry = { + "log_id": str(uuid.uuid4()), "timestamp": datetime.now(tz=timezone.utc), "src_ip": "127.0.0.1", "src_port": 8765, @@ -60,6 +63,7 @@ def test_websocket_traffic_type(test_db): def test_unknown_traffic_type(test_db): """Test that unknown traffic is marked with traffic_type='N/A'.""" entry = { + "log_id": str(uuid.uuid4()), "timestamp": datetime.now(tz=timezone.utc), "src_ip": "127.0.0.1", "src_port": 9999, @@ -87,10 +91,11 @@ def test_legacy_entries_without_traffic_type(test_db): cur = conn.cursor() cur.execute( """ - INSERT INTO logs (timestamp, src_ip, dst_ip, src_port, dst_port, direction, message) - VALUES (?, ?, ?, ?, ?, ?, ?) + INSERT INTO logs (log_id, timestamp, src_ip, dst_ip, src_port, dst_port, direction, message) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) """, ( + str(uuid.uuid4()), datetime.now(tz=timezone.utc).isoformat(), "127.0.0.1", "127.0.0.1", diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..410462f --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,165 @@ +"""Tests for utility functions.""" + +import json + +from mcphawk.utils import get_message_type, get_method_name, parse_message + + +class TestParseMessage: + """Test parse_message function.""" + + def test_parse_valid_json_string(self): + """Test parsing valid JSON string.""" + message = '{"jsonrpc": "2.0", "method": "test"}' + result = parse_message(message) + assert result == {"jsonrpc": "2.0", "method": "test"} + + def test_parse_invalid_json_string(self): + """Test parsing invalid JSON string.""" + message = '{"invalid": json}' + result = parse_message(message) + assert result is None + + def test_parse_non_string(self): + """Test parsing non-string input.""" + message = {"already": "parsed"} + result = parse_message(message) + assert result == {"already": "parsed"} + + def test_parse_empty_string(self): + """Test parsing empty string.""" + result = parse_message("") + assert result is None + + +class TestGetMessageType: + """Test get_message_type function.""" + + def test_request_message(self): + """Test identifying request messages.""" + message = json.dumps({ + "jsonrpc": "2.0", + "method": "tools/list", + "id": "123" + }) + assert get_message_type(message) == "request" + + def test_response_message(self): + """Test identifying response messages.""" + message = json.dumps({ + "jsonrpc": "2.0", + "result": {"tools": []}, + "id": "123" + }) + assert get_message_type(message) == "response" + + def test_notification_message(self): + """Test identifying notification messages.""" + message = json.dumps({ + "jsonrpc": "2.0", + "method": "progress/update" + }) + assert get_message_type(message) == "notification" + + def test_error_message(self): + """Test identifying error messages.""" + message = json.dumps({ + "jsonrpc": "2.0", + "error": { + "code": -32600, + "message": "Invalid Request" + }, + "id": "123" + }) + assert get_message_type(message) == "error" + + def test_unknown_message_no_jsonrpc(self): + """Test message without jsonrpc field.""" + message = json.dumps({ + "method": "test", + "id": "123" + }) + assert get_message_type(message) == "unknown" + + def test_unknown_message_wrong_version(self): + """Test message with wrong JSON-RPC version.""" + message = json.dumps({ + "jsonrpc": "1.0", + "method": "test", + "id": "123" + }) + assert get_message_type(message) == "unknown" + + def test_unknown_message_invalid_json(self): + """Test invalid JSON.""" + message = "not json" + assert get_message_type(message) == "unknown" + + def test_edge_case_null_id(self): + """Test request with null id (valid in JSON-RPC 2.0).""" + message = json.dumps({ + "jsonrpc": "2.0", + "method": "test", + "id": None + }) + assert get_message_type(message) == "request" + + def test_edge_case_error_without_id(self): + """Test error without id (should be unknown).""" + message = json.dumps({ + "jsonrpc": "2.0", + "error": {"code": -32600, "message": "Error"} + }) + assert get_message_type(message) == "unknown" + + def test_edge_case_result_without_id(self): + """Test result without id (should be unknown).""" + message = json.dumps({ + "jsonrpc": "2.0", + "result": "test" + }) + assert get_message_type(message) == "unknown" + + +class TestGetMethodName: + """Test get_method_name function.""" + + def test_get_method_from_request(self): + """Test extracting method from request.""" + message = json.dumps({ + "jsonrpc": "2.0", + "method": "tools/list", + "id": "123" + }) + assert get_method_name(message) == "tools/list" + + def test_get_method_from_notification(self): + """Test extracting method from notification.""" + message = json.dumps({ + "jsonrpc": "2.0", + "method": "progress/update" + }) + assert get_method_name(message) == "progress/update" + + def test_get_method_from_response(self): + """Test extracting method from response (should be None).""" + message = json.dumps({ + "jsonrpc": "2.0", + "result": {"tools": []}, + "id": "123" + }) + assert get_method_name(message) is None + + def test_get_method_from_error(self): + """Test extracting method from error (should be None).""" + message = json.dumps({ + "jsonrpc": "2.0", + "error": {"code": -32600, "message": "Error"}, + "id": "123" + }) + assert get_method_name(message) is None + + def test_get_method_from_invalid_json(self): + """Test extracting method from invalid JSON.""" + message = "not json" + assert get_method_name(message) is None diff --git a/tests/test_web.py b/tests/test_web.py index fc9b4a0..f611812 100644 --- a/tests/test_web.py +++ b/tests/test_web.py @@ -8,6 +8,7 @@ import os import tempfile +import uuid from datetime import datetime, timezone import pytest @@ -55,22 +56,33 @@ def clean_db(setup_test_db): yield +def create_test_log(message, **kwargs): + """Helper to create a log entry with required log_id.""" + entry = { + "log_id": str(uuid.uuid4()), + "timestamp": datetime.now(timezone.utc), + "src_ip": "127.0.0.1", + "dst_ip": "127.0.0.1", + "message": message, + } + entry.update(kwargs) + return entry + + def test_get_logs_limit(setup_test_db): """ Ensure /logs returns valid JSON and respects the limit parameter. """ # Insert two logs for testing - log_message( - { - "timestamp": datetime.now(timezone.utc), + log_message({ + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "message": '{"jsonrpc":"2.0","method":"ping"}', } ) - log_message( - { - "timestamp": datetime.now(timezone.utc), + log_message({ + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "message": '{"jsonrpc":"2.0","method":"pong"}', @@ -92,17 +104,15 @@ def test_get_logs_multiple(setup_test_db): Ensure /logs can return multiple rows when more logs are inserted. """ # Insert multiple logs - log_message( - { - "timestamp": datetime.now(timezone.utc), + log_message({ + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "message": '{"jsonrpc":"2.0","method":"ping"}', } ) - log_message( - { - "timestamp": datetime.now(timezone.utc), + log_message({ + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "message": '{"jsonrpc":"2.0","method":"pong"}', @@ -153,7 +163,7 @@ def test_logs_persist_across_requests(setup_test_db): """Test that logs persist between different API requests.""" # Add a log log_message({ - "timestamp": datetime.now(timezone.utc), + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "192.168.1.1", "dst_ip": "192.168.1.2", "src_port": 12345, @@ -184,7 +194,7 @@ def test_logs_order_newest_first(setup_test_db): # Add logs with small delays to ensure different timestamps for i in range(3): log_message({ - "timestamp": datetime.now(timezone.utc), + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "src_port": 12345, @@ -210,7 +220,7 @@ def test_logs_default_limit(setup_test_db): # Add 60 logs for i in range(60): log_message({ - "timestamp": datetime.now(timezone.utc), + "log_id": str(uuid.uuid4()),"timestamp": datetime.now(timezone.utc), "src_ip": "127.0.0.1", "dst_ip": "127.0.0.1", "src_port": 12345, @@ -229,6 +239,7 @@ def test_logs_default_limit(setup_test_db): def test_log_fields_preserved_in_api(setup_test_db): """Test that all log fields are preserved through the API.""" test_entry = { + "log_id": str(uuid.uuid4()), "timestamp": datetime.now(timezone.utc), "src_ip": "10.0.0.1", "dst_ip": "10.0.0.2", diff --git a/tests/test_web_server.py b/tests/test_web_server.py index 80a098e..b4943c4 100644 --- a/tests/test_web_server.py +++ b/tests/test_web_server.py @@ -132,7 +132,7 @@ def test_run_web_with_sniffer(): ) # Verify sniffer was started - mock_start_sniffer.assert_called_once_with("tcp port 3000", False, True) + mock_start_sniffer.assert_called_once_with("tcp port 3000", False, True, None) # Verify uvicorn was started with correct params mock_uvicorn.assert_called_once() From 12d23458881ad2bea36897e88d02718e1da8c38c Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 12:51:12 +0200 Subject: [PATCH 02/16] add: small ui tweak for connection status --- .../components/common/ConnectionStatus.vue | 57 +++++++++++++++---- mcphawk/cli.py | 3 +- mcphawk/web/server.py | 19 ++++++- tests/test_cli.py | 15 ++--- tests/test_web_server.py | 29 ++++++++++ 5 files changed, 102 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/common/ConnectionStatus.vue b/frontend/src/components/common/ConnectionStatus.vue index 96ff22d..da87116 100644 --- a/frontend/src/components/common/ConnectionStatus.vue +++ b/frontend/src/components/common/ConnectionStatus.vue @@ -1,22 +1,48 @@ \ No newline at end of file diff --git a/mcphawk/cli.py b/mcphawk/cli.py index ce56c04..9d514b7 100644 --- a/mcphawk/cli.py +++ b/mcphawk/cli.py @@ -137,7 +137,8 @@ def run_mcp(): filter_expr=filter_expr, auto_detect=auto_detect, debug=debug, - excluded_ports=[mcp_port] if with_mcp else [] + excluded_ports=[mcp_port] if with_mcp else [], + with_mcp=with_mcp ) diff --git a/mcphawk/web/server.py b/mcphawk/web/server.py index c943237..080d0ef 100644 --- a/mcphawk/web/server.py +++ b/mcphawk/web/server.py @@ -15,6 +15,9 @@ # Set up logger for this module logger = logging.getLogger(__name__) +# Global flag to track if web server was started with MCP +_with_mcp = False + app = FastAPI() # Allow local UI dev or CDN-based dashboard @@ -27,6 +30,16 @@ ) +@app.get("/status") +def get_status(): + """ + Get server status including MCP server status. + """ + return JSONResponse(content={ + "with_mcp": _with_mcp + }) + + @app.get("/logs") def get_logs(limit: int = 50): """ @@ -103,7 +116,7 @@ def safe_start(): thread.start() -def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, filter_expr: Optional[str] = None, auto_detect: bool = False, debug: bool = False, excluded_ports: Optional[list[int]] = None): +def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, filter_expr: Optional[str] = None, auto_detect: bool = False, debug: bool = False, excluded_ports: Optional[list[int]] = None, with_mcp: bool = False): """ Run the web server and optionally the sniffer. @@ -115,6 +128,10 @@ def run_web(sniffer: bool = True, host: str = "127.0.0.1", port: int = 8000, fil auto_detect: Whether to auto-detect MCP traffic. debug: Whether to enable debug logging. """ + # Set global MCP flag + global _with_mcp + _with_mcp = with_mcp + if sniffer: if not filter_expr: raise ValueError("filter_expr is required when sniffer is enabled") diff --git a/tests/test_cli.py b/tests/test_cli.py index 62e40e0..bd7b350 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -102,7 +102,7 @@ def test_web_command_with_port(mock_run_web): """Test web command with port option.""" result = runner.invoke(app, ["web", "--port", "3000"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False) @patch('mcphawk.cli.run_web') @@ -110,7 +110,7 @@ def test_web_command_no_sniffer(mock_run_web): """Test web command with --no-sniffer.""" result = runner.invoke(app, ["web", "--no-sniffer"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=False, host="127.0.0.1", port=8000, filter_expr=None, auto_detect=False, debug=False, excluded_ports=[], with_mcp=False) @patch('mcphawk.cli.run_web') @@ -118,7 +118,7 @@ def test_web_command_custom_host_web_port(mock_run_web): """Test web command with custom host and web-port.""" result = runner.invoke(app, ["web", "--port", "3000", "--host", "0.0.0.0", "--web-port", "9000"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=True, host="0.0.0.0", port=9000, filter_expr="tcp port 3000", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False) @patch('mcphawk.cli.run_web') @@ -126,7 +126,7 @@ def test_web_command_with_filter(mock_run_web): """Test web command with custom filter.""" result = runner.invoke(app, ["web", "--filter", "tcp port 8080 or tcp port 8081"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 8080 or tcp port 8081", auto_detect=False, debug=False, excluded_ports=[], with_mcp=False) @patch('mcphawk.cli.run_web') @@ -134,7 +134,7 @@ def test_web_command_auto_detect(mock_run_web): """Test web command with auto-detect mode.""" result = runner.invoke(app, ["web", "--auto-detect"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp", auto_detect=True, debug=False, excluded_ports=[], with_mcp=False) def test_scapy_warnings_suppressed(): @@ -170,7 +170,7 @@ def test_web_command_with_debug_flag(mock_run_web): """Test web command with debug flag.""" result = runner.invoke(app, ["web", "--port", "3000", "--debug"]) assert result.exit_code == 0 - mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[]) + mock_run_web.assert_called_once_with(sniffer=True, host="127.0.0.1", port=8000, filter_expr="tcp port 3000", auto_detect=False, debug=True, excluded_ports=[], with_mcp=False) @patch('mcphawk.cli.run_web') @@ -196,7 +196,8 @@ def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web): filter_expr="tcp port 3000", auto_detect=False, debug=False, - excluded_ports=[8765] # Default MCP port + excluded_ports=[8765], # Default MCP port + with_mcp=True ) diff --git a/tests/test_web_server.py b/tests/test_web_server.py index b4943c4..2af82b3 100644 --- a/tests/test_web_server.py +++ b/tests/test_web_server.py @@ -172,3 +172,32 @@ def test_run_web_sniffer_without_filter(): # Test that ValueError is raised when sniffer=True but no filter_expr with pytest.raises(ValueError, match="filter_expr is required"): run_web(sniffer=True, filter_expr=None) + + +def test_status_endpoint(client): + """Test /status endpoint returns MCP server status.""" + response = client.get("/status") + assert response.status_code == 200 + data = response.json() + assert "with_mcp" in data + assert isinstance(data["with_mcp"], bool) + + +def test_status_endpoint_with_mcp_enabled(): + """Test /status endpoint when MCP is enabled.""" + import mcphawk.web.server + from mcphawk.web.server import app + + # Set MCP flag + original_value = mcphawk.web.server._with_mcp + mcphawk.web.server._with_mcp = True + + try: + with TestClient(app) as client: + response = client.get("/status") + assert response.status_code == 200 + data = response.json() + assert data["with_mcp"] is True + finally: + # Restore original value + mcphawk.web.server._with_mcp = original_value From d609e3e283c0f96358da9cda20d876c89bb86053 Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 20:04:54 +0200 Subject: [PATCH 03/16] add: HTTP Streaming for MCP --- README.md | 69 ++++++- mcphawk/cli.py | 55 +++--- mcphawk/mcp_server/server.py | 193 ++++++++++++++++++- tests/test_cli.py | 252 ++++++++++++++++++++++++- tests/test_mcp_server.py | 350 ++++++++++++++++++++++++++++++++++- 5 files changed, 884 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index dbef113..8153446 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,10 @@ Non-exhaustive list: - expand mode to directly see JSON withtout detailed view - filtering - always see if WS connection is up for live updates +- **MCP Server for querying captured data** - Query captured traffic via MCP protocol + - Standalone mode or integrated with sniffer/web commands + - Streamable HTTP transport for easy integration and testing + - Tools for traffic search, statistics, and analysis ## Comparison with Similar Tools @@ -141,6 +145,69 @@ sudo mcphawk web --port 3000 --host 0.0.0.0 --web-port 9000 # Enable debug output for troubleshooting sudo mcphawk sniff --port 3000 --debug sudo mcphawk web --port 3000 --debug + +# Start MCP server with captured data (stdio transport) +mcphawk mcp + +# Start MCP server with Streamable HTTP transport +mcphawk mcp --transport http --mcp-port 8765 + +# Start sniffer with integrated MCP server (HTTP transport) +sudo mcphawk sniff --port 3000 --with-mcp --mcp-transport http + +# Start web UI with integrated MCP server +sudo mcphawk web --port 3000 --with-mcp --mcp-transport http --mcp-port 8765 +``` + +## MCP Server for Querying Captured Data + +MCPHawk includes an MCP server that allows you to query captured traffic using the Model Context Protocol. This is perfect for: +- Building AI agents that analyze captured traffic +- Integrating traffic analysis into your MCP-enabled tools +- Programmatically searching and filtering captured data + +### Available MCP Tools + +- **query_traffic** - Fetch logs with pagination (limit/offset) +- **get_log** - Retrieve specific log entry by ID +- **search_traffic** - Search by content, message type, or traffic type +- **get_stats** - Get traffic statistics (requests, responses, errors, etc.) +- **list_methods** - List all unique JSON-RPC methods seen + +### Using with Streamable HTTP Transport + +The HTTP transport makes it easy to test and integrate: + +```bash +# Start MCP server on HTTP +mcphawk mcp --transport http --mcp-port 8765 + +# Initialize session +curl -X POST http://localhost:8765/mcp \ + -H 'Content-Type: application/json' \ + -H 'X-Session-Id: my-session' \ + -d '{"jsonrpc":"2.0","method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0"}},"id":1}' + +# Query traffic statistics +curl -X POST http://localhost:8765/mcp \ + -H 'Content-Type: application/json' \ + -H 'X-Session-Id: my-session' \ + -d '{"jsonrpc":"2.0","method":"tools/call","params":{"name":"get_stats","arguments":{}},"id":2}' +``` + +### Using with stdio Transport (Claude Desktop) + +Configure in Claude Desktop settings: + +```json +{ + "mcpServers": { + "mcphawk": { + "command": "mcphawk", + "args": ["mcp"] + } + } +} ``` ## Platform Support @@ -192,7 +259,7 @@ Vote for features by opening a GitHub issue! - [ ] **Interactive Replay** - Click any request to re-send it, edit and replay captured messages - [ ] **Real-time Alerts** - Alert on specific methods or error patterns with webhook support - [ ] **Visualization** - Sequence diagrams, resource heat maps, method dependency graphs -- [ ] **MCP Server Interface** - Expose captured traffic via MCP server for AI agents to query and analyze traffic patterns +- [x] **MCP Server Interface** - Expose captured traffic via MCP server for AI agents to query and analyze traffic patterns ... and a few more off the deep end: - [ ] **TLS/HTTPS Support (MITM Proxy Mode)** - Optional man-in-the-middle proxy with certificate installation for encrypted traffic diff --git a/mcphawk/cli.py b/mcphawk/cli.py index 9d514b7..218fd66 100644 --- a/mcphawk/cli.py +++ b/mcphawk/cli.py @@ -26,7 +26,8 @@ def sniff( filter: str = typer.Option(None, "--filter", "-f", help="Custom BPF filter expression"), auto_detect: bool = typer.Option(False, "--auto-detect", "-a", help="Auto-detect MCP traffic on any port"), with_mcp: bool = typer.Option(False, "--with-mcp", help="Start MCP server alongside sniffer"), - mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP server (stdio if not specified)"), + mcp_transport: str = typer.Option("http", "--mcp-transport", help="MCP transport type: stdio or http"), + mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP HTTP server (ignored for stdio)"), debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start sniffing MCP traffic (console output only).""" @@ -52,24 +53,27 @@ def sniff( # Start MCP server if requested mcp_thread = None + excluded_ports = [] if with_mcp: - print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") server = MCPHawkServer() - def run_mcp(): - asyncio.run(server.run_stdio()) + if mcp_transport == "http": + print(f"[MCPHawk] Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") + excluded_ports = [mcp_port] # Exclude MCP port from sniffing + def run_mcp(): + asyncio.run(server.run_http(port=mcp_port)) + else: + print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + def run_mcp(): + asyncio.run(server.run_stdio()) mcp_thread = threading.Thread(target=run_mcp, daemon=True) mcp_thread.start() print(f"[MCPHawk] Starting sniffer with filter: {filter_expr}") - if with_mcp and filter_expr != "tcp": - print(f"[MCPHawk] Note: MCP server traffic on port {mcp_port} will be excluded from capture") print("[MCPHawk] Press Ctrl+C to stop...") try: - # Exclude MCP port if running MCP server - excluded_ports = [mcp_port] if with_mcp else [] start_sniffer( filter_expr=filter_expr, auto_detect=auto_detect, @@ -90,7 +94,8 @@ def web( host: str = typer.Option("127.0.0.1", "--host", help="Web server host"), web_port: int = typer.Option(8000, "--web-port", help="Web server port"), with_mcp: bool = typer.Option(False, "--with-mcp", help="Start MCP server alongside web UI"), - mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP server (stdio if not specified)"), + mcp_transport: str = typer.Option("http", "--mcp-transport", help="MCP transport type: stdio or http"), + mcp_port: int = typer.Option(8765, "--mcp-port", help="Port for MCP HTTP server (ignored for stdio)"), debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start the MCPHawk dashboard with sniffer.""" @@ -116,20 +121,23 @@ def web( # Start MCP server if requested mcp_thread = None + excluded_ports = [] if with_mcp: - print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") server = MCPHawkServer() - def run_mcp(): - asyncio.run(server.run_stdio()) + if mcp_transport == "http": + print(f"[MCPHawk] Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") + excluded_ports = [mcp_port] # Exclude MCP port from sniffing + def run_mcp(): + asyncio.run(server.run_http(port=mcp_port)) + else: + print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + def run_mcp(): + asyncio.run(server.run_stdio()) mcp_thread = threading.Thread(target=run_mcp, daemon=True) mcp_thread.start() - # Update filter to exclude MCP port if needed - if with_mcp and filter_expr and filter_expr != "tcp": - print(f"[MCPHawk] Note: MCP server traffic on port {mcp_port} will be excluded from capture") - run_web( sniffer=not no_sniffer, host=host, @@ -137,7 +145,7 @@ def run_mcp(): filter_expr=filter_expr, auto_detect=auto_detect, debug=debug, - excluded_ports=[mcp_port] if with_mcp else [], + excluded_ports=excluded_ports, with_mcp=with_mcp ) @@ -164,10 +172,10 @@ def mcp( } } """) - elif transport == "tcp": - print(f"[MCPHawk] MCP server will listen on port {mcp_port}") - print("[MCPHawk] Note: TCP transport not yet implemented") - raise typer.Exit(1) + elif transport == "http": + print(f"[MCPHawk] MCP server will listen on http://localhost:{mcp_port}/mcp") + print("[MCPHawk] Example test command:") + print(f"curl -X POST http://localhost:{mcp_port}/mcp -H 'Content-Type: application/json' -d '{{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{{}},\"clientInfo\":{{\"name\":\"test\",\"version\":\"1.0\"}}}},\"id\":1}}'") else: print(f"[ERROR] Unknown transport: {transport}") raise typer.Exit(1) @@ -176,7 +184,10 @@ def mcp( server = MCPHawkServer() try: - asyncio.run(server.run_stdio()) + if transport == "stdio": + asyncio.run(server.run_stdio()) + elif transport == "http": + asyncio.run(server.run_http(port=mcp_port)) except KeyboardInterrupt: print("\n[MCPHawk] MCP server stopped.") sys.exit(0) diff --git a/mcphawk/mcp_server/server.py b/mcphawk/mcp_server/server.py index 2f3b4ca..e9ef311 100644 --- a/mcphawk/mcp_server/server.py +++ b/mcphawk/mcp_server/server.py @@ -1,6 +1,5 @@ """MCP server implementation for MCPHawk.""" -import asyncio import json from typing import Any, Optional @@ -23,6 +22,10 @@ def __init__(self, db_path: Optional[str] = None): def _setup_handlers(self): """Setup MCP protocol handlers.""" + # Store handlers as instance attributes for HTTP transport + self._handle_list_tools = None + self._handle_call_tool = None + @self.server.list_tools() async def handle_list_tools() -> list[Tool]: """List available tools.""" @@ -102,6 +105,9 @@ async def handle_list_tools() -> list[Tool]: ) ] + # Store the handler + self._handle_list_tools = handle_list_tools + @self.server.call_tool() async def handle_call_tool(name: str, arguments: Optional[dict[str, Any]] = None) -> list[TextContent]: """Handle tool calls.""" @@ -215,13 +221,182 @@ async def handle_call_tool(name: str, arguments: Optional[dict[str, Any]] = None else: return [TextContent(type="text", text=f"Unknown tool: {name}")] + # Store the handler + self._handle_call_tool = handle_call_tool + async def run_stdio(self): """Run the MCP server using stdio transport.""" - async with self.server.run(): - # The server will run until interrupted - await asyncio.Event().wait() - - async def run_tcp(self, host: str = "127.0.0.1", port: int = 8765): - """Run the MCP server using TCP transport.""" - # TODO: Implement TCP transport when needed - raise NotImplementedError("TCP transport not implemented yet") + import sys + + import anyio + from mcp.server.stdio import stdio_server + + # Wrap stdin/stdout in async file objects + async_stdin = anyio.wrap_file(sys.stdin) + async_stdout = anyio.wrap_file(sys.stdout) + + async with stdio_server(async_stdin, async_stdout) as (read_stream, write_stream): + await self.server.run( + read_stream, + write_stream, + self.server.create_initialization_options() + ) + + async def run_http(self, host: str = "127.0.0.1", port: int = 8765): + """Run the MCP server using Streamable HTTP transport.""" + import uuid + + import uvicorn + from fastapi import FastAPI, Request + from fastapi.responses import JSONResponse + + # Create FastAPI app for HTTP transport + app = FastAPI(title="MCPHawk MCP Server") + + # Store active sessions + sessions = {} + + # Get handlers for use in closures + handle_list_tools = self._handle_list_tools + handle_call_tool = self._handle_call_tool + + @app.post("/mcp") + async def handle_mcp_request(request: Request): + """Handle MCP JSON-RPC requests over HTTP.""" + try: + # Get request body + body = await request.json() + + # Get or create session ID from headers + session_id = request.headers.get("X-Session-Id", str(uuid.uuid4())) + + # Process the JSON-RPC request + method = body.get("method") + params = body.get("params", {}) + request_id = body.get("id") + + # Handle different methods + if method == "initialize": + # Mark session as initialized + sessions[session_id] = True + result = { + "protocolVersion": "2024-11-05", + "capabilities": { + "experimental": {}, + "tools": {"listChanged": False} + }, + "serverInfo": { + "name": "mcphawk-mcp", + "version": "1.12.2" + } + } + + elif method == "tools/list": + # Check if session is initialized + if session_id not in sessions: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32602, + "message": "Session not initialized" + } + } + ) + + # Get tools list - call our handler directly + tools = await handle_list_tools() + result = { + "tools": [ + { + "name": tool.name, + "description": tool.description, + "inputSchema": tool.inputSchema + } + for tool in tools + ] + } + + elif method == "tools/call": + # Check if session is initialized + if session_id not in sessions: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32602, + "message": "Session not initialized" + } + } + ) + + # Call the tool + tool_name = params.get("name") + tool_args = params.get("arguments", {}) + + # Call our handler directly + content = await handle_call_tool(tool_name, tool_args) + + result = { + "content": [ + {"type": c.type, "text": c.text} + for c in content + ] + } + + else: + # Unknown method + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32601, + "message": f"Unknown method: {method}" + } + } + ) + + # Return successful response + response = { + "jsonrpc": "2.0", + "id": request_id, + "result": result + } + + # Include session ID in response headers + return JSONResponse( + content=response, + headers={"X-Session-Id": session_id} + ) + + except Exception as e: + import traceback + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": body.get("id") if "body" in locals() else None, + "error": { + "code": -32603, + "message": "Internal error", + "data": str(e) + "\n" + traceback.format_exc() + } + } + ) + + # Run the server + config = uvicorn.Config( + app, + host=host, + port=port, + log_level="info", + access_log=False + ) + server = uvicorn.Server(config) + await server.serve() diff --git a/tests/test_cli.py b/tests/test_cli.py index bd7b350..d67c772 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -11,11 +11,12 @@ def test_cli_help(): - """Test that CLI help shows both commands.""" + """Test that CLI help shows all commands.""" result = runner.invoke(app, ["--help"]) assert result.exit_code == 0 assert "sniff" in result.stdout assert "web" in result.stdout + assert "mcp" in result.stdout assert "MCPHawk: Passive MCP traffic sniffer + dashboard" in result.stdout @@ -51,6 +52,252 @@ def test_sniff_command_requires_flags(): assert "mcphawk sniff --auto-detect" in result.stdout +def test_mcp_command_help(): + """Test mcp command help.""" + result = runner.invoke(app, ["mcp", "--help"]) + assert result.exit_code == 0 + assert "Run MCPHawk MCP server" in result.stdout + assert "--transport" in result.stdout + assert "--mcp-port" in result.stdout + assert ("stdio or http" in result.stdout) or ("stdio or tcp" in result.stdout) + + +def test_mcp_command_stdio_transport(): + """Test mcp command with stdio transport.""" + with patch('mcphawk.cli.MCPHawkServer') as mock_server_class, \ + patch('mcphawk.cli.asyncio.run') as mock_asyncio_run: + + mock_server_instance = mock_server_class.return_value + + result = runner.invoke(app, ["mcp", "--transport", "stdio"]) + + # Check output + assert "[MCPHawk] Starting MCP server (transport: stdio)" in result.stdout + assert "mcpServers" in result.stdout + + # Verify server was created and run_stdio was called + mock_server_class.assert_called_once() + mock_asyncio_run.assert_called_once() + + # Verify that asyncio.run was called with the server's run_stdio method + assert mock_asyncio_run.called + # The coroutine passed should be from run_stdio + assert mock_server_instance.run_stdio.called + + +def test_mcp_command_http_transport(): + """Test mcp command with HTTP transport.""" + with patch('mcphawk.cli.MCPHawkServer') as mock_server_class, \ + patch('mcphawk.cli.asyncio.run') as mock_asyncio_run: + + mock_server_instance = mock_server_class.return_value + + result = runner.invoke(app, ["mcp", "--transport", "http", "--mcp-port", "8765"]) + + # Check output + assert "[MCPHawk] Starting MCP server (transport: http)" in result.stdout + assert "http://localhost:8765/mcp" in result.stdout + assert "curl -X POST" in result.stdout + + # Verify server was created and run_http was called + mock_server_class.assert_called_once() + mock_asyncio_run.assert_called_once() + + # Verify that asyncio.run was called with the server's run_http method + assert mock_asyncio_run.called + # The coroutine passed should be from run_http + assert mock_server_instance.run_http.called + + +def test_mcp_command_unknown_transport(): + """Test mcp command with unknown transport.""" + result = runner.invoke(app, ["mcp", "--transport", "websocket"]) + assert result.exit_code == 1 + assert "[ERROR] Unknown transport: websocket" in result.stdout + + +def test_sniff_with_mcp_http(): + """Test sniff command with MCP HTTP transport.""" + with patch('mcphawk.cli.start_sniffer') as mock_start_sniffer, \ + patch('mcphawk.cli.MCPHawkServer'), \ + patch('mcphawk.cli.threading.Thread') as mock_thread: + + mock_thread_instance = mock_thread.return_value + + result = runner.invoke(app, [ + "sniff", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "http", + "--mcp-port", "8765" + ]) + + # Check MCP server startup message + assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout + + # Verify thread was started for MCP server + mock_thread.assert_called_once() + mock_thread_instance.start.assert_called_once() + + # Verify sniffer was called with excluded ports + mock_start_sniffer.assert_called_once() + call_args = mock_start_sniffer.call_args[1] + assert call_args['excluded_ports'] == [8765] + + +def test_sniff_with_mcp_stdio(): + """Test sniff command with MCP stdio transport.""" + with patch('mcphawk.cli.start_sniffer') as mock_start_sniffer, \ + patch('mcphawk.cli.MCPHawkServer'), \ + patch('mcphawk.cli.threading.Thread'): + + result = runner.invoke(app, [ + "sniff", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "stdio" + ]) + + # Check MCP server startup message + assert "[MCPHawk] Starting MCP server on stdio" in result.stdout + + # Verify sniffer was called with empty excluded ports + mock_start_sniffer.assert_called_once() + call_args = mock_start_sniffer.call_args[1] + assert call_args['excluded_ports'] == [] + + +def test_web_with_mcp_http(): + """Test web command with MCP HTTP transport.""" + with patch('mcphawk.cli.run_web') as mock_run_web, \ + patch('mcphawk.cli.MCPHawkServer'), \ + patch('mcphawk.cli.threading.Thread'): + + result = runner.invoke(app, [ + "web", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "http", + "--mcp-port", "8766" + ]) + + # Check MCP server startup message + assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8766/mcp" in result.stdout + + # Verify web was called with excluded ports + mock_run_web.assert_called_once() + call_args = mock_run_web.call_args[1] + assert call_args['excluded_ports'] == [8766] + + +def test_mcp_command_custom_port(): + """Test mcp command with custom HTTP port.""" + with patch('mcphawk.cli.MCPHawkServer') as mock_server_class, \ + patch('mcphawk.cli.asyncio.run') as mock_asyncio_run: + + mock_server_instance = mock_server_class.return_value + + result = runner.invoke(app, ["mcp", "--transport", "http", "--mcp-port", "9999"]) + + # Check output shows custom port + assert "[MCPHawk] Starting MCP server (transport: http)" in result.stdout + assert "http://localhost:9999/mcp" in result.stdout + + # Verify server was created + mock_server_class.assert_called_once() + + # Verify run_http was called with custom port + mock_asyncio_run.assert_called_once() + # Check it was called with port=9999 + assert mock_server_instance.run_http.call_args[1]['port'] == 9999 + + +def test_sniff_with_mcp_custom_port(): + """Test sniff command with MCP on custom port.""" + with patch('mcphawk.cli.start_sniffer') as mock_start_sniffer, \ + patch('mcphawk.cli.MCPHawkServer'), \ + patch('mcphawk.cli.threading.Thread') as mock_thread: + + mock_thread_instance = mock_thread.return_value + + result = runner.invoke(app, [ + "sniff", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "http", + "--mcp-port", "7777" + ]) + + # Check MCP server startup message with custom port + assert "[MCPHawk] Starting MCP HTTP server on http://localhost:7777/mcp" in result.stdout + + # Verify thread was started for MCP server + mock_thread.assert_called_once() + mock_thread_instance.start.assert_called_once() + + # Verify sniffer was called with custom port excluded + mock_start_sniffer.assert_called_once() + call_args = mock_start_sniffer.call_args[1] + assert call_args['excluded_ports'] == [7777] + + +def test_mcp_stdio_ignores_port(): + """Test that stdio transport ignores the mcp-port parameter.""" + with patch('mcphawk.cli.MCPHawkServer') as mock_server_class, \ + patch('mcphawk.cli.asyncio.run'): + + mock_server_instance = mock_server_class.return_value + + # Even with --mcp-port specified, stdio should ignore it + result = runner.invoke(app, ["mcp", "--transport", "stdio", "--mcp-port", "9999"]) + + # Check output doesn't mention the port + assert "[MCPHawk] Starting MCP server (transport: stdio)" in result.stdout + assert "9999" not in result.stdout + assert "mcpServers" in result.stdout + + # Verify run_stdio was called (not run_http) + assert mock_server_instance.run_stdio.called + assert not mock_server_instance.run_http.called + + +def test_web_with_mcp_default_vs_custom_port(): + """Test that default port 8765 is used when not specified.""" + with patch('mcphawk.cli.run_web') as mock_run_web, \ + patch('mcphawk.cli.MCPHawkServer') as mock_server_class, \ + patch('mcphawk.cli.threading.Thread') as mock_thread: + + # Test 1: Default port + result = runner.invoke(app, [ + "web", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "http" + ]) + + assert "[MCPHawk] Starting MCP HTTP server on http://localhost:8765/mcp" in result.stdout + call_args = mock_run_web.call_args[1] + assert call_args['excluded_ports'] == [8765] + + # Reset mocks + mock_run_web.reset_mock() + mock_server_class.reset_mock() + mock_thread.reset_mock() + + # Test 2: Custom port + result = runner.invoke(app, [ + "web", + "--port", "3000", + "--with-mcp", + "--mcp-transport", "http", + "--mcp-port", "5555" + ]) + + assert "[MCPHawk] Starting MCP HTTP server on http://localhost:5555/mcp" in result.stdout + call_args = mock_run_web.call_args[1] + assert call_args['excluded_ports'] == [5555] + + @patch('mcphawk.cli.start_sniffer') def test_sniff_command_with_port(mock_start_sniffer): """Test sniff command with port option.""" @@ -189,6 +436,7 @@ def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web): mock_thread.return_value.start.assert_called_once() # Check run_web was called with excluded ports + # Default MCP transport is HTTP on port 8765 mock_run_web.assert_called_once_with( sniffer=True, host="127.0.0.1", @@ -196,7 +444,7 @@ def test_web_command_with_mcp(mock_thread, mock_mcp_server, mock_run_web): filter_expr="tcp port 3000", auto_detect=False, debug=False, - excluded_ports=[8765], # Default MCP port + excluded_ports=[8765], # Default HTTP MCP port is excluded with_mcp=True ) diff --git a/tests/test_mcp_server.py b/tests/test_mcp_server.py index cc847cc..f859885 100644 --- a/tests/test_mcp_server.py +++ b/tests/test_mcp_server.py @@ -1,9 +1,13 @@ """Tests for MCP server functionality.""" +import asyncio +import contextlib import json +import os +import tempfile import uuid from datetime import datetime, timezone -from unittest.mock import Mock +from unittest.mock import AsyncMock, MagicMock, Mock, patch import pytest from mcp.types import TextContent @@ -257,3 +261,347 @@ def decorator(func): # Test missing search term result = await handlers['call_tool']("search_traffic", {}) assert "search_term is required" in result[0].text + + @pytest.mark.asyncio + async def test_run_stdio(self): + """Test that run_stdio properly handles stdio transport.""" + server = MCPHawkServer() + + # Mock dependencies + with patch('anyio.wrap_file') as mock_wrap_file, \ + patch('mcp.server.stdio.stdio_server') as mock_stdio_server: + + # Setup mocks + mock_async_stdin = AsyncMock() + mock_async_stdout = AsyncMock() + mock_wrap_file.side_effect = [mock_async_stdin, mock_async_stdout] + + mock_read_stream = AsyncMock() + mock_write_stream = AsyncMock() + mock_context = AsyncMock() + mock_context.__aenter__.return_value = (mock_read_stream, mock_write_stream) + mock_context.__aexit__.return_value = None + mock_stdio_server.return_value = mock_context + + # Mock server.run to complete immediately + server.server.run = AsyncMock() + server.server.create_initialization_options = MagicMock(return_value={}) + + # Run the method + await server.run_stdio() + + # Verify wrap_file was called correctly + assert mock_wrap_file.call_count == 2 + + # Verify stdio_server was called with wrapped files + mock_stdio_server.assert_called_once_with(mock_async_stdin, mock_async_stdout) + + # Verify server.run was called + server.server.run.assert_called_once_with( + mock_read_stream, + mock_write_stream, + {} + ) + + @pytest.mark.asyncio + async def test_run_http(self, test_db): + """Test that run_http properly handles HTTP transport.""" + server = MCPHawkServer(str(test_db)) + + # Create test server config that immediately shuts down + with patch('uvicorn.Server') as mock_server_class: + mock_server_instance = AsyncMock() + mock_server_instance.serve = AsyncMock() + mock_server_class.return_value = mock_server_instance + + # Run the server in a task that we'll cancel + task = asyncio.create_task(server.run_http(port=8765)) + + # Give it a moment to set up + await asyncio.sleep(0.1) + + # Cancel the task + task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await task + + # Verify uvicorn was configured correctly + mock_server_class.assert_called_once() + config = mock_server_class.call_args[0][0] + assert config.host == "127.0.0.1" + assert config.port == 8765 + + @pytest.mark.asyncio + async def test_http_handlers(self, sample_logs): + """Test HTTP transport handlers with actual requests.""" + from fastapi.testclient import TestClient + + # Create a temporary database for this test + with tempfile.NamedTemporaryFile(suffix='.db', delete=False) as tmp_db: + db_path = tmp_db.name + + # Initialize database with sample data + logger.set_db_path(db_path) + logger.init_db() + + # Re-create sample logs in the new database + test_messages = [ + { + "jsonrpc": "2.0", + "method": "tools/list", + "id": "req-1" + }, + { + "jsonrpc": "2.0", + "result": {"tools": ["query", "search"]}, + "id": "req-1" + }, + { + "jsonrpc": "2.0", + "method": "progress/update", + "params": {"progress": 50} + }, + { + "jsonrpc": "2.0", + "error": {"code": -32601, "message": "Method not found"}, + "id": "req-2" + } + ] + + for i, msg in enumerate(test_messages): + entry = { + "log_id": str(uuid.uuid4()), + "timestamp": datetime.now(tz=timezone.utc), + "src_ip": "127.0.0.1", + "dst_ip": "127.0.0.1", + "src_port": 3000 + i, + "dst_port": 8000, + "direction": "unknown", + "message": json.dumps(msg), + "traffic_type": "TCP/WS" if i % 2 == 0 else "TCP/Direct" + } + logger.log_message(entry) + + # Create server instance + server = MCPHawkServer(db_path) + + # Get the FastAPI app by running the HTTP server setup + app = None + sessions = {} + + # Extract the app creation logic + import uuid as uuid_module + + from fastapi import FastAPI, Request + from fastapi.responses import JSONResponse + + app = FastAPI(title="MCPHawk MCP Server") + + # Get references to handlers + handle_list_tools = server._handle_list_tools + handle_call_tool = server._handle_call_tool + + @app.post("/mcp") + async def handle_mcp_request(request: Request): + """Handle MCP JSON-RPC requests over HTTP.""" + try: + body = await request.json() + session_id = request.headers.get("X-Session-Id", str(uuid_module.uuid4())) + method = body.get("method") + params = body.get("params", {}) + request_id = body.get("id") + + if method == "initialize": + sessions[session_id] = True + result = { + "protocolVersion": "2024-11-05", + "capabilities": { + "experimental": {}, + "tools": {"listChanged": False} + }, + "serverInfo": { + "name": "mcphawk-mcp", + "version": "1.12.2" + } + } + + elif method == "tools/list": + if session_id not in sessions: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32602, + "message": "Session not initialized" + } + } + ) + + tools = await handle_list_tools() + result = { + "tools": [ + { + "name": tool.name, + "description": tool.description, + "inputSchema": tool.inputSchema + } + for tool in tools + ] + } + + elif method == "tools/call": + if session_id not in sessions: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32602, + "message": "Session not initialized" + } + } + ) + + tool_name = params.get("name") + tool_args = params.get("arguments", {}) + content = await handle_call_tool(tool_name, tool_args) + + result = { + "content": [ + {"type": c.type, "text": c.text} + for c in content + ] + } + + else: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": request_id, + "error": { + "code": -32601, + "message": f"Unknown method: {method}" + } + } + ) + + response = { + "jsonrpc": "2.0", + "id": request_id, + "result": result + } + + return JSONResponse( + content=response, + headers={"X-Session-Id": session_id} + ) + + except Exception as e: + return JSONResponse( + status_code=200, + content={ + "jsonrpc": "2.0", + "id": body.get("id") if "body" in locals() else None, + "error": { + "code": -32603, + "message": "Internal error", + "data": str(e) + } + } + ) + + # Create test client + client = TestClient(app) + + # Test initialize + response = client.post( + "/mcp", + json={ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test", "version": "1.0"} + }, + "id": 1 + }, + headers={"X-Session-Id": "test-session"} + ) + assert response.status_code == 200 + data = response.json() + assert data["result"]["protocolVersion"] == "2024-11-05" + assert "test-session" in sessions + + # Test tools/list without session + response = client.post( + "/mcp", + json={ + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 2 + }, + headers={"X-Session-Id": "new-session"} + ) + assert response.status_code == 200 + data = response.json() + assert "error" in data + assert data["error"]["message"] == "Session not initialized" + + # Test tools/list with session + response = client.post( + "/mcp", + json={ + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 3 + }, + headers={"X-Session-Id": "test-session"} + ) + assert response.status_code == 200 + data = response.json() + assert len(data["result"]["tools"]) == 5 + + # Test tools/call get_stats + response = client.post( + "/mcp", + json={ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "get_stats", + "arguments": {} + }, + "id": 4 + }, + headers={"X-Session-Id": "test-session"} + ) + assert response.status_code == 200 + data = response.json() + stats = json.loads(data["result"]["content"][0]["text"]) + assert stats["total"] == 4 + + # Test unknown method + response = client.post( + "/mcp", + json={ + "jsonrpc": "2.0", + "method": "unknown/method", + "params": {}, + "id": 5 + }, + headers={"X-Session-Id": "test-session"} + ) + assert response.status_code == 200 + data = response.json() + assert "error" in data + assert "Unknown method" in data["error"]["message"] + + # Clean up + os.unlink(db_path) From 9b8ef69f6947e9b0eced14b64253911940829865 Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 21:30:16 +0200 Subject: [PATCH 04/16] fix: tests, stdio --- README.md | 12 +- examples/stdio_client.py | 207 ++++++++++++++++++++ mcphawk/cli.py | 90 ++++++--- requirements-dev.txt | 3 +- tests/test_cli.py | 21 +- tests/test_mcp_http_simple.py | 138 +++++++++++++ tests/test_mcp_stdio_integration.py | 287 ++++++++++++++++++++++++++++ 7 files changed, 714 insertions(+), 44 deletions(-) create mode 100644 examples/stdio_client.py create mode 100644 tests/test_mcp_http_simple.py create mode 100644 tests/test_mcp_stdio_integration.py diff --git a/README.md b/README.md index 8153446..3f1faa6 100644 --- a/README.md +++ b/README.md @@ -146,12 +146,12 @@ sudo mcphawk web --port 3000 --host 0.0.0.0 --web-port 9000 sudo mcphawk sniff --port 3000 --debug sudo mcphawk web --port 3000 --debug -# Start MCP server with captured data (stdio transport) -mcphawk mcp - -# Start MCP server with Streamable HTTP transport +# Start MCP server with Streamable HTTP transport (default) mcphawk mcp --transport http --mcp-port 8765 +# Start MCP server with stdio transport (for Claude Desktop integration) +mcphawk mcp --transport stdio + # Start sniffer with integrated MCP server (HTTP transport) sudo mcphawk sniff --port 3000 --with-mcp --mcp-transport http @@ -204,12 +204,14 @@ Configure in Claude Desktop settings: "mcpServers": { "mcphawk": { "command": "mcphawk", - "args": ["mcp"] + "args": ["mcp", "--transport", "stdio"] } } } ``` +See [examples/stdio_client.py](examples/stdio_client.py) for a complete working example of stdio communication. + ## Platform Support ### Tested Platforms diff --git a/examples/stdio_client.py b/examples/stdio_client.py new file mode 100644 index 0000000..b483088 --- /dev/null +++ b/examples/stdio_client.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +""" +Example stdio client for MCPHawk MCP server. + +This demonstrates how to communicate with MCPHawk's MCP server using the stdio transport. +The MCP protocol requires: +1. Initialize request +2. Initialized notification +3. Then you can make tool calls +""" + +import json +import queue +import subprocess +import threading +from typing import Any, Optional + + +class MCPHawkStdioClient: + """Client for communicating with MCPHawk MCP server over stdio.""" + + def __init__(self, debug: bool = False): + self.debug = debug + self.proc = None + self.stderr_queue = queue.Queue() + self.request_id = 0 + + def connect(self) -> bool: + """Start the MCP server process and initialize connection.""" + try: + # Start the MCP server + self.proc = subprocess.Popen( + ["mcphawk", "mcp", "--transport", "stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + bufsize=0 # Unbuffered + ) + + # Start stderr reader thread + self.stderr_thread = threading.Thread(target=self._read_stderr, daemon=True) + self.stderr_thread.start() + + # Send initialize request + init_response = self._send_request({ + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "mcphawk-stdio-client", "version": "1.0"} + } + }) + + if not init_response or "error" in init_response: + print(f"Failed to initialize: {init_response}") + return False + + # Send initialized notification + self._send_notification({ + "method": "notifications/initialized", + "params": {} + }) + + if self.debug: + print(f"Connected to server: {init_response['result']['serverInfo']}") + + return True + + except Exception as e: + print(f"Failed to connect: {e}") + return False + + def _read_stderr(self): + """Read stderr in a separate thread.""" + while self.proc and self.proc.poll() is None: + line = self.proc.stderr.readline() + if line: + self.stderr_queue.put(line.strip()) + + def _send_request(self, request: dict[str, Any]) -> Optional[dict[str, Any]]: + """Send a JSON-RPC request and wait for response.""" + self.request_id += 1 + request["jsonrpc"] = "2.0" + request["id"] = self.request_id + + request_str = json.dumps(request) + if self.debug: + print(f">>> {request_str}") + + self.proc.stdin.write(request_str + "\n") + self.proc.stdin.flush() + + # Read response + response_line = self.proc.stdout.readline() + if response_line: + try: + response = json.loads(response_line) + if self.debug: + print(f"<<< {json.dumps(response, indent=2)}") + return response + except json.JSONDecodeError as e: + print(f"Failed to decode response: {e}") + print(f"Raw: {response_line}") + return None + return None + + def _send_notification(self, notification: dict[str, Any]) -> None: + """Send a JSON-RPC notification (no response expected).""" + notification["jsonrpc"] = "2.0" + + notification_str = json.dumps(notification) + if self.debug: + print(f">>> {notification_str}") + + self.proc.stdin.write(notification_str + "\n") + self.proc.stdin.flush() + + def list_tools(self) -> Optional[list]: + """Get list of available tools.""" + response = self._send_request({ + "method": "tools/list", + "params": {} + }) + + if response and "result" in response: + return response["result"]["tools"] + return None + + def call_tool(self, tool_name: str, arguments: Optional[dict[str, Any]] = None) -> Optional[Any]: + """Call a tool with given arguments.""" + response = self._send_request({ + "method": "tools/call", + "params": { + "name": tool_name, + "arguments": arguments or {} + } + }) + + if response and "result" in response: + # Extract the text content from the response + content = response["result"]["content"] + if content and len(content) > 0: + text = content[0]["text"] + try: + # Try to parse as JSON + return json.loads(text) + except json.JSONDecodeError: + # Return as plain text if not JSON + return text + return None + + def close(self): + """Close the connection.""" + if self.proc: + self.proc.terminate() + self.proc.wait() + self.proc = None + + +def main(): + """Example usage of the MCPHawk stdio client.""" + client = MCPHawkStdioClient(debug=True) + + print("Connecting to MCPHawk MCP server...") + if not client.connect(): + print("Failed to connect!") + return + + print("\n1. Listing available tools:") + tools = client.list_tools() + if tools: + for tool in tools: + print(f" - {tool['name']}: {tool['description']}") + + print("\n2. Getting traffic statistics:") + stats = client.call_tool("get_stats") + if stats: + print(f" Total logs: {stats['total']}") + print(f" Requests: {stats['requests']}") + print(f" Responses: {stats['responses']}") + print(f" Notifications: {stats['notifications']}") + print(f" Errors: {stats['errors']}") + + print("\n3. Querying recent traffic:") + logs = client.call_tool("query_traffic", {"limit": 5}) + if logs: + print(f" Found {len(logs)} recent log entries") + for log in logs: + msg_preview = log['message'][:50] + "..." if len(log['message']) > 50 else log['message'] + print(f" - {log['timestamp']}: {msg_preview}") + + print("\n4. Listing captured methods:") + methods = client.call_tool("list_methods") + if methods: + print(f" Found {len(methods)} unique methods:") + for method in methods[:10]: # Show first 10 + print(f" - {method}") + if len(methods) > 10: + print(f" ... and {len(methods) - 10} more") + + print("\nClosing connection...") + client.close() + + +if __name__ == "__main__": + main() diff --git a/mcphawk/cli.py b/mcphawk/cli.py index 218fd66..ea38365 100644 --- a/mcphawk/cli.py +++ b/mcphawk/cli.py @@ -13,6 +13,9 @@ # Suppress Scapy warnings about network interfaces logging.getLogger("scapy.runtime").setLevel(logging.ERROR) +# Setup logger for CLI +logger = logging.getLogger("mcphawk.cli") + # ✅ Typer multi-command app app = typer.Typer(help="MCPHawk: Passive MCP traffic sniffer + dashboard") @@ -31,13 +34,20 @@ def sniff( debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start sniffing MCP traffic (console output only).""" + # Configure logging - clear existing handlers first + logger.handlers.clear() + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(logging.Formatter('[MCPHawk] %(message)s')) + logger.addHandler(handler) + logger.setLevel(logging.DEBUG if debug else logging.INFO) + # Validate that user specified either port, filter, or auto-detect if not any([port, filter, auto_detect]): - print("[ERROR] You must specify either --port, --filter, or --auto-detect") - print("Examples:") - print(" mcphawk sniff --port 3000") - print(" mcphawk sniff --filter 'tcp port 3000 or tcp port 3001'") - print(" mcphawk sniff --auto-detect") + logger.error("You must specify either --port, --filter, or --auto-detect") + logger.error("Examples:") + logger.error(" mcphawk sniff --port 3000") + logger.error(" mcphawk sniff --filter 'tcp port 3000 or tcp port 3001'") + logger.error(" mcphawk sniff --auto-detect") raise typer.Exit(1) if filter: @@ -49,7 +59,7 @@ def sniff( else: # Auto-detect mode - capture all TCP traffic filter_expr = "tcp" - print("[MCPHawk] Auto-detect mode: monitoring all TCP traffic for MCP messages") + logger.info("Auto-detect mode: monitoring all TCP traffic for MCP messages") # Start MCP server if requested mcp_thread = None @@ -58,20 +68,20 @@ def sniff( server = MCPHawkServer() if mcp_transport == "http": - print(f"[MCPHawk] Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") + logger.info(f"Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") excluded_ports = [mcp_port] # Exclude MCP port from sniffing def run_mcp(): asyncio.run(server.run_http(port=mcp_port)) else: - print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + logger.info("Starting MCP server on stdio (configure in your MCP client)") def run_mcp(): asyncio.run(server.run_stdio()) mcp_thread = threading.Thread(target=run_mcp, daemon=True) mcp_thread.start() - print(f"[MCPHawk] Starting sniffer with filter: {filter_expr}") - print("[MCPHawk] Press Ctrl+C to stop...") + logger.info(f"Starting sniffer with filter: {filter_expr}") + logger.info("Press Ctrl+C to stop...") try: start_sniffer( @@ -81,7 +91,7 @@ def run_mcp(): excluded_ports=excluded_ports ) except KeyboardInterrupt: - print("\n[MCPHawk] Sniffer stopped.") + logger.info("Sniffer stopped.") sys.exit(0) @@ -99,14 +109,21 @@ def web( debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Start the MCPHawk dashboard with sniffer.""" + # Configure logging - clear existing handlers first + logger.handlers.clear() + handler = logging.StreamHandler(sys.stdout) + handler.setFormatter(logging.Formatter('[MCPHawk] %(message)s')) + logger.addHandler(handler) + logger.setLevel(logging.DEBUG if debug else logging.INFO) + # If sniffer is enabled, validate that user specified either port, filter, or auto-detect if not no_sniffer and not any([port, filter, auto_detect]): - print("[ERROR] You must specify either --port, --filter, or --auto-detect (or use --no-sniffer)") - print("Examples:") - print(" mcphawk web --port 3000") - print(" mcphawk web --filter 'tcp port 3000 or tcp port 3001'") - print(" mcphawk web --auto-detect") - print(" mcphawk web --no-sniffer # View historical logs only") + logger.error("You must specify either --port, --filter, or --auto-detect (or use --no-sniffer)") + logger.error("Examples:") + logger.error(" mcphawk web --port 3000") + logger.error(" mcphawk web --filter 'tcp port 3000 or tcp port 3001'") + logger.error(" mcphawk web --auto-detect") + logger.error(" mcphawk web --no-sniffer # View historical logs only") raise typer.Exit(1) # Prepare filter expression @@ -126,12 +143,12 @@ def web( server = MCPHawkServer() if mcp_transport == "http": - print(f"[MCPHawk] Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") + logger.info(f"Starting MCP HTTP server on http://localhost:{mcp_port}/mcp") excluded_ports = [mcp_port] # Exclude MCP port from sniffing def run_mcp(): asyncio.run(server.run_http(port=mcp_port)) else: - print("[MCPHawk] Starting MCP server on stdio (configure in your MCP client)") + logger.info("Starting MCP server on stdio (configure in your MCP client)") def run_mcp(): asyncio.run(server.run_stdio()) @@ -157,12 +174,25 @@ def mcp( debug: bool = typer.Option(False, "--debug", "-d", help="Enable debug output") ): """Run MCPHawk MCP server standalone (query existing captured data).""" - print(f"[MCPHawk] Starting MCP server (transport: {transport})") + # Configure logging based on transport and debug flag - clear existing handlers first + logger.handlers.clear() + if transport == "stdio": + # For stdio, all logs must go to stderr to avoid interfering with JSON-RPC on stdout + handler = logging.StreamHandler(sys.stderr) + else: + # For other transports, use stdout + handler = logging.StreamHandler(sys.stdout) + + handler.setFormatter(logging.Formatter('[MCPHawk] %(message)s')) + logger.addHandler(handler) + logger.setLevel(logging.DEBUG if debug else logging.INFO) + + logger.info(f"Starting MCP server (transport: {transport})") if transport == "stdio": - print("[MCPHawk] Use this server with MCP clients by configuring stdio transport") - print("[MCPHawk] Example MCP client configuration:") - print(""" + logger.debug("Use this server with MCP clients by configuring stdio transport") + logger.debug("Example MCP client configuration:") + logger.debug(""" { "mcpServers": { "mcphawk": { @@ -173,11 +203,11 @@ def mcp( } """) elif transport == "http": - print(f"[MCPHawk] MCP server will listen on http://localhost:{mcp_port}/mcp") - print("[MCPHawk] Example test command:") - print(f"curl -X POST http://localhost:{mcp_port}/mcp -H 'Content-Type: application/json' -d '{{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{{}},\"clientInfo\":{{\"name\":\"test\",\"version\":\"1.0\"}}}},\"id\":1}}'") + logger.info(f"MCP server will listen on http://localhost:{mcp_port}/mcp") + logger.debug("Example test command:") + logger.debug(f"curl -X POST http://localhost:{mcp_port}/mcp -H 'Content-Type: application/json' -d '{{\"jsonrpc\":\"2.0\",\"method\":\"initialize\",\"params\":{{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{{}},\"clientInfo\":{{\"name\":\"test\",\"version\":\"1.0\"}}}},\"id\":1}}'") else: - print(f"[ERROR] Unknown transport: {transport}") + logger.error(f"Unknown transport: {transport}") raise typer.Exit(1) # Create and run MCP server @@ -189,5 +219,9 @@ def mcp( elif transport == "http": asyncio.run(server.run_http(port=mcp_port)) except KeyboardInterrupt: - print("\n[MCPHawk] MCP server stopped.") + logger.info("MCP server stopped.") sys.exit(0) + + +if __name__ == "__main__": + app() diff --git a/requirements-dev.txt b/requirements-dev.txt index d6ff5d5..a0a5e1f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,4 +4,5 @@ pytest>=8.0.0 pytest-asyncio==1.1.0 pytest-cov>=5.0.0 ruff>=0.8.0 -websockets>=12.0 \ No newline at end of file +websockets>=12.0 +requests>=2.31.0 \ No newline at end of file diff --git a/tests/test_cli.py b/tests/test_cli.py index d67c772..1a90c90 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -46,7 +46,7 @@ def test_sniff_command_requires_flags(): """Test sniff command requires port, filter, or auto-detect.""" result = runner.invoke(app, ["sniff"]) assert result.exit_code == 1 - assert "[ERROR] You must specify either --port, --filter, or --auto-detect" in result.stdout + assert "You must specify either --port, --filter, or --auto-detect" in result.stdout assert "mcphawk sniff --port 3000" in result.stdout assert "mcphawk sniff --filter 'tcp port 3000 or tcp port 3001'" in result.stdout assert "mcphawk sniff --auto-detect" in result.stdout @@ -72,8 +72,9 @@ def test_mcp_command_stdio_transport(): result = runner.invoke(app, ["mcp", "--transport", "stdio"]) # Check output - assert "[MCPHawk] Starting MCP server (transport: stdio)" in result.stdout - assert "mcpServers" in result.stdout + assert "Starting MCP server (transport: stdio)" in result.stdout + # The debug output with mcpServers only shows up with debug flag + # So we don't check for it here # Verify server was created and run_stdio was called mock_server_class.assert_called_once() @@ -95,9 +96,9 @@ def test_mcp_command_http_transport(): result = runner.invoke(app, ["mcp", "--transport", "http", "--mcp-port", "8765"]) # Check output - assert "[MCPHawk] Starting MCP server (transport: http)" in result.stdout + assert "Starting MCP server (transport: http)" in result.stdout assert "http://localhost:8765/mcp" in result.stdout - assert "curl -X POST" in result.stdout + # curl example only shows in debug mode # Verify server was created and run_http was called mock_server_class.assert_called_once() @@ -113,7 +114,7 @@ def test_mcp_command_unknown_transport(): """Test mcp command with unknown transport.""" result = runner.invoke(app, ["mcp", "--transport", "websocket"]) assert result.exit_code == 1 - assert "[ERROR] Unknown transport: websocket" in result.stdout + assert "Unknown transport: websocket" in result.stdout def test_sniff_with_mcp_http(): @@ -200,7 +201,7 @@ def test_mcp_command_custom_port(): result = runner.invoke(app, ["mcp", "--transport", "http", "--mcp-port", "9999"]) # Check output shows custom port - assert "[MCPHawk] Starting MCP server (transport: http)" in result.stdout + assert "Starting MCP server (transport: http)" in result.stdout assert "http://localhost:9999/mcp" in result.stdout # Verify server was created @@ -252,9 +253,9 @@ def test_mcp_stdio_ignores_port(): result = runner.invoke(app, ["mcp", "--transport", "stdio", "--mcp-port", "9999"]) # Check output doesn't mention the port - assert "[MCPHawk] Starting MCP server (transport: stdio)" in result.stdout + assert "Starting MCP server (transport: stdio)" in result.stdout assert "9999" not in result.stdout - assert "mcpServers" in result.stdout + # mcpServers only shows in debug output # Verify run_stdio was called (not run_http) assert mock_server_instance.run_stdio.called @@ -337,7 +338,7 @@ def test_web_command_requires_flags(): """Test web command requires port, filter, auto-detect, or no-sniffer.""" result = runner.invoke(app, ["web"]) assert result.exit_code == 1 - assert "[ERROR] You must specify either --port, --filter, or --auto-detect (or use --no-sniffer)" in result.stdout + assert "You must specify either --port, --filter, or --auto-detect (or use --no-sniffer)" in result.stdout assert "mcphawk web --port 3000" in result.stdout assert "mcphawk web --filter 'tcp port 3000 or tcp port 3001'" in result.stdout assert "mcphawk web --auto-detect" in result.stdout diff --git a/tests/test_mcp_http_simple.py b/tests/test_mcp_http_simple.py new file mode 100644 index 0000000..92483aa --- /dev/null +++ b/tests/test_mcp_http_simple.py @@ -0,0 +1,138 @@ +"""Simple HTTP integration tests for MCP server.""" + +import json +import subprocess +import sys +import time + +import pytest +import requests + + +class TestMCPHTTPSimple: + """Test MCP server HTTP transport with subprocess.""" + + @pytest.fixture + def mcp_server_url(self): + """Start MCP server in subprocess and return URL.""" + # Start server + proc = subprocess.Popen( + [sys.executable, "-m", "mcphawk.cli", "mcp", "--transport", "http", "--mcp-port", "8768"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + # Give server time to start + time.sleep(2) + + # Check if server started + assert proc.poll() is None, "Server failed to start" + + yield "http://localhost:8768/mcp" + + # Cleanup + proc.terminate() + proc.wait() + + def test_http_basic_flow(self, mcp_server_url): + """Test basic HTTP flow: initialize, list tools, call tool.""" + session_id = "test-session-basic" + + # 1. Initialize + response = requests.post( + mcp_server_url, + json={ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test-http", "version": "1.0"} + }, + "id": 1 + }, + headers={"X-Session-Id": session_id} + ) + + assert response.status_code == 200 + data = response.json() + assert data["id"] == 1 + assert data["result"]["protocolVersion"] == "2024-11-05" + + # 2. List tools + response = requests.post( + mcp_server_url, + json={ + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 2 + }, + headers={"X-Session-Id": session_id} + ) + + assert response.status_code == 200 + data = response.json() + assert data["id"] == 2 + assert len(data["result"]["tools"]) == 5 + + # 3. Call get_stats + response = requests.post( + mcp_server_url, + json={ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "get_stats", + "arguments": {} + }, + "id": 3 + }, + headers={"X-Session-Id": session_id} + ) + + assert response.status_code == 200 + data = response.json() + assert data["id"] == 3 + assert "content" in data["result"] + + # Parse stats + stats = json.loads(data["result"]["content"][0]["text"]) + assert "total" in stats + assert "requests" in stats + + def test_http_error_handling(self, mcp_server_url): + """Test HTTP error handling.""" + # Try to call tool without initialization + response = requests.post( + mcp_server_url, + json={ + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 1 + }, + headers={"X-Session-Id": "uninitialized"} + ) + + assert response.status_code == 200 + data = response.json() + assert "error" in data + assert "not initialized" in data["error"]["message"] + + # Unknown method + response = requests.post( + mcp_server_url, + json={ + "jsonrpc": "2.0", + "method": "unknown/method", + "params": {}, + "id": 2 + } + ) + + assert response.status_code == 200 + data = response.json() + assert "error" in data + assert "Unknown method" in data["error"]["message"] diff --git a/tests/test_mcp_stdio_integration.py b/tests/test_mcp_stdio_integration.py new file mode 100644 index 0000000..58c7331 --- /dev/null +++ b/tests/test_mcp_stdio_integration.py @@ -0,0 +1,287 @@ +"""Integration tests for MCP stdio transport.""" + +import contextlib +import json +import subprocess +import sys +from datetime import datetime, timezone + +import pytest + +from mcphawk import logger + + +class TestMCPStdioIntegration: + """Test MCP server stdio transport with real subprocess communication.""" + + @pytest.fixture + def test_db(self, tmp_path, monkeypatch): + """Create a temporary test database and patch the logger to use it.""" + # Create temp database + db_path = tmp_path / "test_stdio.db" + + # Monkeypatch the logger module to use our test database + monkeypatch.setattr(logger, "DB_PATH", str(db_path)) + logger.init_db() + + # Add some test data + test_messages = [ + { + "jsonrpc": "2.0", + "method": "tools/list", + "id": "test-1" + }, + { + "jsonrpc": "2.0", + "result": {"tools": ["test"]}, + "id": "test-1" + } + ] + + for i, msg in enumerate(test_messages): + entry = { + "log_id": f"test-{i}", + "timestamp": datetime.now(tz=timezone.utc), + "src_ip": "127.0.0.1", + "dst_ip": "127.0.0.1", + "src_port": 3000, + "dst_port": 8000, + "direction": "unknown", + "message": json.dumps(msg), + "traffic_type": "TCP/Direct" + } + logger.log_message(entry) + + return db_path + + def test_stdio_initialize_handshake(self, test_db, monkeypatch): + """Test proper MCP initialization handshake over stdio.""" + # For this test, we'll use the simpler approach without database dependency + # The key is to test the protocol handshake works correctly + + # Prepare all requests + requests = [ + { + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test", "version": "1.0"} + }, + "id": 1 + }, + { + "jsonrpc": "2.0", + "method": "notifications/initialized", + "params": {} + }, + { + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 2 + } + ] + + input_data = "\n".join(json.dumps(req) for req in requests) + "\n" + + # Start the MCP server + proc = subprocess.Popen( + [sys.executable, "-m", "mcphawk.cli", "mcp", "--transport", "stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + stdout, stderr = proc.communicate(input=input_data, timeout=5) + + # Parse responses + responses = [] + for line in stdout.strip().split('\n'): + if line: + with contextlib.suppress(json.JSONDecodeError): + responses.append(json.loads(line)) + + # Should have at least 2 responses (no response for notification) + assert len(responses) >= 2, f"Expected at least 2 responses, got {len(responses)}" + + # Check initialize response + assert responses[0]["id"] == 1 + assert "result" in responses[0] + assert responses[0]["result"]["protocolVersion"] == "2024-11-05" + assert responses[0]["result"]["serverInfo"]["name"] == "mcphawk-mcp" + + # Check tools/list response + assert responses[1]["id"] == 2 + assert "result" in responses[1] + assert "tools" in responses[1]["result"] + assert len(responses[1]["result"]["tools"]) == 5 # We have 5 tools + + def test_stdio_basic_communication(self): + """Test basic stdio communication without select.""" + # Use communicate() for simpler testing + requests = [ + { + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test", "version": "1.0"} + }, + "id": 1 + }, + { + "jsonrpc": "2.0", + "method": "notifications/initialized", + "params": {} + }, + { + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 2 + } + ] + + input_data = "\n".join(json.dumps(req) for req in requests) + "\n" + + proc = subprocess.Popen( + [sys.executable, "-m", "mcphawk.cli", "mcp", "--transport", "stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + bufsize=0 + ) + + stdout, stderr = proc.communicate(input=input_data, timeout=5) + + # Parse responses + responses = [] + for line in stdout.strip().split('\n'): + if line: + with contextlib.suppress(json.JSONDecodeError): + responses.append(json.loads(line)) + + # Debug output + if not responses: + print(f"STDOUT: {stdout}") + print(f"STDERR: {stderr}") + + # Should have 2 responses (no response for notification) + assert len(responses) >= 2, f"Expected at least 2 responses, got {len(responses)}" + + # Check initialize response + assert responses[0]["id"] == 1 + assert responses[0]["result"]["protocolVersion"] == "2024-11-05" + + # Check tools/list response + assert responses[1]["id"] == 2 + assert "tools" in responses[1]["result"] + + def test_stdio_logging_to_stderr(self): + """Test that all logging goes to stderr, not stdout.""" + # Use communicate for simpler test + input_data = json.dumps({ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test", "version": "1.0"} + }, + "id": 1 + }) + "\n" + + proc = subprocess.Popen( + [sys.executable, "-m", "mcphawk.cli", "mcp", "--transport", "stdio", "--debug"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + stdout, stderr = proc.communicate(input=input_data, timeout=5) + + # Response should be valid JSON (no log messages mixed in stdout) + response_line = stdout.strip() + response = json.loads(response_line) + assert response["id"] == 1 + assert "result" in response + + # Check stderr has log messages + assert "[MCPHawk]" in stderr + assert "Starting MCP server" in stderr + + @pytest.mark.parametrize("tool_name,args,expected_in_result", [ + ("get_stats", {}, "total"), + ("list_methods", {}, []), # Empty list if no data + ]) + def test_stdio_tool_calls_basic(self, tool_name, args, expected_in_result): + """Test basic tool calls that don't require specific data.""" + # Use communicate for simpler test + requests = [ + { + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": {"name": "test", "version": "1.0"} + }, + "id": 1 + }, + { + "jsonrpc": "2.0", + "method": "notifications/initialized", + "params": {} + }, + { + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": tool_name, + "arguments": args + }, + "id": 2 + } + ] + + input_data = "\n".join(json.dumps(req) for req in requests) + "\n" + + proc = subprocess.Popen( + [sys.executable, "-m", "mcphawk.cli", "mcp", "--transport", "stdio"], + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + + stdout, stderr = proc.communicate(input=input_data, timeout=5) + + # Parse responses + responses = [] + for line in stdout.strip().split('\n'): + if line: + with contextlib.suppress(json.JSONDecodeError): + responses.append(json.loads(line)) + + # Should have 2 responses (init and tool call) + assert len(responses) >= 2 + + # Check tool response + tool_response = responses[-1] # Last response should be tool call + assert tool_response["id"] == 2 + assert "result" in tool_response + assert "content" in tool_response["result"] + + # Check content + content = tool_response["result"]["content"][0]["text"] + if isinstance(expected_in_result, str): + assert expected_in_result in content + else: + # For list_methods, just check it's valid JSON + json.loads(content) From 3328660e82970c623294bcf5c5e721533222a8be Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 21:42:10 +0200 Subject: [PATCH 05/16] fix: README --- README.md | 6 ++++-- examples/branding/mcphawk_claudedesktop.png | Bin 0 -> 339085 bytes 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 examples/branding/mcphawk_claudedesktop.png diff --git a/README.md b/README.md index 3f1faa6..037db2b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ MCPHawk is a passive sniffer for **Model Context Protocol (MCP)** traffic, simil - MCPHawk can reconstruct full JSON-RPC messages from raw TCP traffic without requiring a handshake. - It captures traffic "on the wire" between any MCP client and server—does not require client/server modification. -MCPHawk Logo +MCPHawk Screenshot ## Features @@ -166,6 +166,8 @@ MCPHawk includes an MCP server that allows you to query captured traffic using t - Integrating traffic analysis into your MCP-enabled tools - Programmatically searching and filtering captured data +MCPHawk Claude Desktop MCP + ### Available MCP Tools - **query_traffic** - Fetch logs with pagination (limit/offset) @@ -251,6 +253,7 @@ sudo mcphawk web --auto-detect Vote for features by opening a GitHub issue! - [x] **Auto-detect MCP traffic** - Automatically discover MCP traffic on any port without prior configuration +- [x] **MCP Server Interface** - Expose captured traffic via MCP server for AI agents to query and analyze traffic patterns - [ ] **Protocol Version Detection** - Identify and display MCP protocol version from captured traffic - [ ] **Smart Search & Filtering** - Search by method name, params, or any JSON field with regex support - [ ] **Performance Analytics** - Request/response timing, method frequency charts, and latency distribution @@ -261,7 +264,6 @@ Vote for features by opening a GitHub issue! - [ ] **Interactive Replay** - Click any request to re-send it, edit and replay captured messages - [ ] **Real-time Alerts** - Alert on specific methods or error patterns with webhook support - [ ] **Visualization** - Sequence diagrams, resource heat maps, method dependency graphs -- [x] **MCP Server Interface** - Expose captured traffic via MCP server for AI agents to query and analyze traffic patterns ... and a few more off the deep end: - [ ] **TLS/HTTPS Support (MITM Proxy Mode)** - Optional man-in-the-middle proxy with certificate installation for encrypted traffic diff --git a/examples/branding/mcphawk_claudedesktop.png b/examples/branding/mcphawk_claudedesktop.png new file mode 100644 index 0000000000000000000000000000000000000000..bf475321fe37de120dae59acf3ffaf68687b402b GIT binary patch literal 339085 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

jbv7OeeU-Co{ne-;`zo^ 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 U?U=@`>j5%u$ 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

$w&cSB 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 TuP(Gn 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 F{uhS9r{Vwr literal 0 HcmV?d00001 From 23bb6aecdf835bd597755c1301f8cbc0366619f3 Mon Sep 17 00:00:00 2001 From: tech4242 <5933291+tech4242@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:37:15 +0200 Subject: [PATCH 06/16] add: own mcphawk mcp debugging to ui --- examples/test_mcp_http.sh | 168 ++++++++++++++++++ examples/test_mcp_simple.sh | 28 +++ .../src/components/LogTable/LogFilters.vue | 17 +- frontend/src/components/LogTable/LogRow.vue | 21 ++- frontend/src/components/LogTable/LogTable.vue | 2 +- .../MessageDetail/MessageDetailModal.vue | 15 ++ frontend/src/stores/logs.js | 35 +++- mcphawk/cli.py | 26 ++- mcphawk/logger.py | 19 +- mcphawk/sniffer.py | 30 +++- mcphawk/web/server.py | 9 +- 11 files changed, 347 insertions(+), 23 deletions(-) create mode 100755 examples/test_mcp_http.sh create mode 100755 examples/test_mcp_simple.sh diff --git a/examples/test_mcp_http.sh b/examples/test_mcp_http.sh new file mode 100755 index 0000000..3c015bc --- /dev/null +++ b/examples/test_mcp_http.sh @@ -0,0 +1,168 @@ +#!/bin/bash + +# Test MCPHawk MCP Server with various requests +# Make sure MCPHawk is running with: +# sudo mcphawk web --auto-detect --with-mcp --mcp-transport http --mcp-port 8765 --debug + +SESSION_ID="test-session-$(date +%s)" +MCP_URL="http://localhost:8765/mcp" + +echo "Testing MCPHawk MCP Server with session: $SESSION_ID" +echo "================================================" + +# 1. Initialize session +echo -e "\n1. Initializing MCP session..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "test-client", + "version": "1.0" + } + }, + "id": 1 + }' | jq . + +sleep 1 + +# 2. Send initialized notification +echo -e "\n2. Sending initialized notification..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "notifications/initialized", + "params": {} + }' | jq . + +sleep 1 + +# 3. List available tools +echo -e "\n3. Listing available tools..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/list", + "params": {}, + "id": 2 + }' | jq . + +sleep 1 + +# 4. Get traffic statistics +echo -e "\n4. Getting traffic statistics..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "get_stats", + "arguments": {} + }, + "id": 3 + }' | jq . + +sleep 1 + +# 5. Query recent traffic +echo -e "\n5. Querying recent traffic (limit 10)..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "query_traffic", + "arguments": { + "limit": 10 + } + }, + "id": 4 + }' | jq . + +sleep 1 + +# 6. List unique methods captured +echo -e "\n6. Listing unique JSON-RPC methods..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "list_methods", + "arguments": {} + }, + "id": 5 + }' | jq . + +sleep 1 + +# 7. Search for specific traffic +echo -e "\n7. Searching for 'initialize' in traffic..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "search_traffic", + "arguments": { + "search_term": "initialize" + } + }, + "id": 6 + }' | jq . + +sleep 1 + +# 8. Test error handling - call non-existent tool +echo -e "\n8. Testing error handling (calling non-existent tool)..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "tools/call", + "params": { + "name": "non_existent_tool", + "arguments": {} + }, + "id": 7 + }' | jq . + +sleep 1 + +# 9. Send a notification (no ID, no response expected) +echo -e "\n9. Sending a notification..." +curl -X POST $MCP_URL \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "notifications/progress", + "params": { + "progress": 50, + "message": "Test progress notification" + } + }' + +echo -e "\n\nAll tests completed!" +echo "Check the MCPHawk web UI at http://localhost:8000 to see:" +echo "- All requests marked with purple 'MCP' badges" +echo "- Use the MCPHawk toggle button to filter these messages" +echo "- Click on messages to see full JSON details" \ No newline at end of file diff --git a/examples/test_mcp_simple.sh b/examples/test_mcp_simple.sh new file mode 100755 index 0000000..83b4c97 --- /dev/null +++ b/examples/test_mcp_simple.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Simple test for MCPHawk MCP Server +# Run MCPHawk with: sudo mcphawk web --auto-detect --with-mcp --mcp-transport http --mcp-port 8765 --debug + +SESSION_ID="test-$(date +%s)" +echo "Testing with session: $SESSION_ID" + +# Single test request +echo "Sending initialize request..." +curl -X POST http://localhost:8765/mcp \ + -H 'Content-Type: application/json' \ + -H "X-Session-Id: $SESSION_ID" \ + -d '{ + "jsonrpc": "2.0", + "method": "initialize", + "params": { + "protocolVersion": "2024-11-05", + "capabilities": {}, + "clientInfo": { + "name": "test-client", + "version": "1.0" + } + }, + "id": 1 + }' + +echo -e "\n\nCheck http://localhost:8000 for captured traffic" \ No newline at end of file diff --git a/frontend/src/components/LogTable/LogFilters.vue b/frontend/src/components/LogTable/LogFilters.vue index 8bc7ac6..00e34e3 100644 --- a/frontend/src/components/LogTable/LogFilters.vue +++ b/frontend/src/components/LogTable/LogFilters.vue @@ -48,6 +48,21 @@ + + +