From 96c681cf61b9b0b36f2d9d403d95f390b9eaac59 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 19 Jun 2026 16:29:00 +0100 Subject: [PATCH 1/2] feat(mcp): default to streamable-http transport --- .gitignore | 2 ++ extra/mcp/tracy_mcp.py | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index e4f0cad3..d5c919f1 100644 --- a/.gitignore +++ b/.gitignore @@ -30,6 +30,8 @@ profiler/build/win32/Tracy.aps extra/vswhere.exe extra/tracy-build .cache +.uv-cache/ +.venv/ compile_commands.json profiler/build/wasm/Tracy-release.* profiler/build/wasm/Tracy-debug.* diff --git a/extra/mcp/tracy_mcp.py b/extra/mcp/tracy_mcp.py index feb3fc26..f860ce87 100644 --- a/extra/mcp/tracy_mcp.py +++ b/extra/mcp/tracy_mcp.py @@ -30,6 +30,7 @@ _HERE = os.path.dirname(os.path.abspath(__file__)) _PORT_FILE = os.path.join(_HERE, "tracy_mcp.port") _PID_FILE = os.path.join(_HERE, "tracy_mcp.pid") _PREFERRED_PORT = int(os.environ.get("TRACY_MCP_PORT", "47380")) +_TRANSPORT = os.environ.get("TRACY_MCP_TRANSPORT", "streamable-http").strip().lower() # Shared documentation surfaces. system.prompt.md is Tracy Assist's source # system prompt; exposing it as an MCP resource keeps analysis guidance in @@ -677,6 +678,13 @@ async def shutdown_server() -> str: if __name__ == "__main__": atexit.register(_cleanup_pid_files) + if _TRANSPORT not in ("sse", "streamable-http"): + print( + "TRACY_MCP_TRANSPORT must be 'sse' or 'streamable-http'.", + file=sys.stderr, + ) + sys.exit(1) + running, existing_port = _is_our_server_running() if running: print( @@ -689,12 +697,17 @@ if __name__ == "__main__": port = _find_free_port() _write_pid_and_port(port) - print(f"Tracy MCP listening on http://127.0.0.1:{port}/sse", file=sys.stderr) + path = ( + mcp_server.settings.sse_path + if _TRANSPORT == "sse" + else mcp_server.settings.streamable_http_path + ) + print(f"Tracy MCP listening on http://127.0.0.1:{port}{path}", file=sys.stderr) mcp_server.settings.host = "127.0.0.1" mcp_server.settings.port = port try: - mcp_server.run(transport="sse") + mcp_server.run(transport=_TRANSPORT) except KeyboardInterrupt: print("\nTracy MCP server stopped.", file=sys.stderr) sys.exit(0) From 7dd4dbc8a522b28e53ee4a428c7573ac3754941a Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Fri, 19 Jun 2026 16:45:44 +0100 Subject: [PATCH 2/2] update docs --- manual/tracy.md | 7 ++++--- manual/tracy.tex | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/manual/tracy.md b/manual/tracy.md index 7917a8ef..c0975518 100644 --- a/manual/tracy.md +++ b/manual/tracy.md @@ -2315,21 +2315,22 @@ Set the following environment variables before launching (or export them in your PYTHONPATH=/path/to/tracy/build/python/Release TRACY_CAPTURES_DIR=/path/to/captures # enables list_captures TRACY_MCP_PORT=47380 # optional; default 47380 + TRACY_MCP_TRANSPORT=streamable-http # optional; streamable-http or sse ### Integrating with an AI assistant -The server runs as a singleton on SSE transport (port 47380 by default). Only one process loads `TracyServerBindings` regardless of how many editor windows are open; subsequent launches detect the port is taken and exit immediately. +The server runs as a singleton on Streamable HTTP transport (port 47380 by default). Only one process loads `TracyServerBindings` regardless of how many editor windows are open; subsequent launches detect the port is taken and exit immediately. Set `TRACY_MCP_TRANSPORT=sse` before launching to use the legacy SSE transport instead. The server prints its URL on startup and writes it to `extra/mcp/tracy_mcp.port`: - Tracy MCP listening on http://127.0.0.1:47380/sse + Tracy MCP listening on http://127.0.0.1:47380/mcp Configure your AI assistant using that URL. For example, for a JSON-based MCP configuration: { "mcpServers": { "tracy": { - "url": "http://127.0.0.1:47380/sse" + "url": "http://127.0.0.1:47380/mcp" } } } diff --git a/manual/tracy.tex b/manual/tracy.tex index 424bc554..979adb59 100644 --- a/manual/tracy.tex +++ b/manual/tracy.tex @@ -2599,16 +2599,17 @@ Set the following environment variables before launching (or export them in your PYTHONPATH=/path/to/tracy/build/python/Release TRACY_CAPTURES_DIR=/path/to/captures # enables list_captures TRACY_MCP_PORT=47380 # optional; default 47380 +TRACY_MCP_TRANSPORT=streamable-http # optional; streamable-http or sse \end{lstlisting} \subsubsection{Integrating with an AI assistant} -The server runs as a singleton on SSE transport (port 47380 by default). Only one process loads \texttt{TracyServerBindings} regardless of how many editor windows are open; subsequent launches detect the port is taken and exit immediately. +The server runs as a singleton on Streamable HTTP transport (port 47380 by default). Only one process loads \texttt{TracyServerBindings} regardless of how many editor windows are open; subsequent launches detect the port is taken and exit immediately. Set \texttt{TRACY\_MCP\_TRANSPORT=sse} before launching to use the legacy SSE transport instead. The server prints its URL on startup and writes it to \texttt{extra/mcp/tracy\_mcp.port}: \begin{lstlisting} -Tracy MCP listening on http://127.0.0.1:47380/sse +Tracy MCP listening on http://127.0.0.1:47380/mcp \end{lstlisting} Configure your AI assistant using that URL. For example, for a JSON-based MCP configuration: @@ -2617,7 +2618,7 @@ Configure your AI assistant using that URL. For example, for a JSON-based MCP co { "mcpServers": { "tracy": { - "url": "http://127.0.0.1:47380/sse" + "url": "http://127.0.0.1:47380/mcp" } } }