Implementation Overview
Symposium consists of several major components:
- a MCP server, implemented in Rust (
symposium/mcp-server), which also serves as an IPC bus; - a VSCode extension, implemented in TypeScript (
symposium/vscode); - a desktop application, implemented in Swift (
symposium/macos-app).
Chart
flowchart TD
Agent
User
User -- makes requests --> Agent
Agent -- invokes MCP tools --> MCP
subgraph L [Symposium]
IDE["IDE Extension
(impl'd in TypeScript
or lang appropriate for IDE)"]
MCP["symposium-mcp server
(impl'd in Rust)"]
APP["Desktop application
(impl'd in Swift)"]
MCP <--> IDE
MCP <--> APP
IDE <--> APP
end
L -..- BUS
BUS["All communication actually goes over a central IPC Bus"]
IPC Bus
All components talk over an IPC bus which is implemented in symposium-mcp. The IDE + application connect to this bus by running symposium-mcp client. This will create a daemon process (using symposium-mcp server) if one is not already running. The MCP server just runs the code inline, starting the server if needed.
The client has a simple interface:
- a message is a single-line of json;
- each message that is sent is forwarded to all connected clients (including the sender);
- there are some special "control" messages that begin with
#, e.g.#identify:namesets the "id" for this client to "name"- see
handle_debug_commandindaemon.rs
Debugging
The server tracks the last N messages that have been gone out over the bus for debugging purposes. You can run
symposium-mcp debug
to access those logs. Very useful!