@geohar/pi-svg-mcp

extensionmaintained

Pi extension: run the svg-mcp MCP server via sharedserver and inject the diagram-authoring directive. Pairs with pi-mcp-adapter, which makes svg-mcp's tools reachable from Pi.

by — · v0.7.4 · published 6d ago

$ pi install npm:@geohar/pi-svg-mcp
downloads/mo
641
stars
6
last push
6d ago
open issues
0

Signals

license: MITtestspi manifest: missinginstall size: —deps: 0peer deps: 0

Download trend

No downloads in the last 12 weeks.

README

@geohar/pi-svg-mcp

A Pi extension that makes svg-mcp available to Pi: it starts the svg-mcp server (supervised by sharedserver) and injects the diagram-authoring directive into the system prompt so the agent reaches for svg-mcp's tools instead of hand-writing SVG XML.

It is the Pi counterpart of svg-mcp's Claude Code and OpenCode plugins, and shares the same server and sharedserver instance — so Pi, Claude Code, OpenCode, and Neovim all talk to one refcounted process.

How it fits together

Pi has no MCP of its own. Two pieces give it svg-mcp:

  1. pi-mcp-adapter — the Pi package that speaks MCP; it reads its own mcp.json. Install it too (pi install npm:pi-mcp-adapter).
  2. This extension — the process + directive half:
    • Run svg-mcp on session_start via sharedserver use … -- uvx svg-mcp@<v> --transport streamable-http --port …, refcounted and shared across clients (its cold start — numpy + pillow — is paid once); released on session_shutdown when reason === "quit".
    • Inject the directive on before_agent_start (analogue of CC's additionalContext and OpenCode's system.transform).

Stand-down when combiner-served

If a combiner already serves svg-mcp (the global MCP_COMBINER switch, or the per-backend MCP_COMBINER_SERVES_SVG_MCP override, which wins), the extension does not launch a standalone backend — the combiner owns svg-mcp's lifecycle. The directive still applies, since svg-mcp's tools are present via the combiner too. In that setup you register the combiner with pi-mcp-adapter (see the mcp-companion Pi extension), not svg-mcp directly.

Install

# build
npm --prefix plugins/pi install && npm --prefix plugins/pi run build
# install into Pi (symlink the package dir; uses "main": dist/index.js)
ln -sfn "$PWD/plugins/pi" ~/.pi/agent/extensions/svg-mcp
# MCP transport (skip the mcp.json when svg-mcp is combiner-served)
pi install npm:pi-mcp-adapter
cp plugins/pi/mcp.json.example ~/.config/mcp/mcp.json   # standalone only

Build-free live dev: pi -e ./plugins/pi/src/index.ts.

Configuration

svg-mcp's tool knobs use the shared SVG_MCP_* namespace (as its OpenCode plugin does), so they apply across every client. Pi-extension toggles use PI_SVG_MCP_*.

VariableDefaultEffect
SVG_MCP_PORT7731HTTP port svg-mcp serves on.
SVG_MCP_VERSION0.2.6Pin the PyPI release (uvx svg-mcp@<v>).
SVG_MCP_DEV—Dev checkout for uv run --project <dir> (a path, or 1 for in-repo source).
PI_SVG_MCP_NAMEsvg-mcpsharedserver instance name.
PI_SVG_MCP_GRACE1hsharedserver grace period.
PI_SVG_MCP_LOG—Capture svg-mcp's stdout/stderr (sharedserver --log-file); "none"/unset disables.
PI_SVG_MCP_MANAGEtruefalse → don't launch (assume svg-mcp runs elsewhere).
PI_SVG_MCP_INSTRUCTIONStruefalse → don't inject the directive.
PI_SVG_MCP_NOTIFYtruefalse → don't surface messages via the Pi UI.
MCP_COMBINER / MCP_COMBINER_SERVES_SVG_MCP—Combiner serves svg-mcp → don't launch a standalone backend.
SHAREDSERVER_BIN / SHAREDSERVER_LOCKDIR(auto)sharedserver binary / lock dir.

Development

npm install && npm run typecheck && npm run build

src/sharedserver-resolve.ts is vendored byte-identical from georgeharker/sharedserver via scripts/sync-vendored.sh — edit upstream, re-sync here.

License

MIT © George Harker