Stateless HTTP MCP server for deterministic SPICE circuit simulation. Runs ngspice 44.2 in batch mode. The netlist is the circuit as code — the caller owns it, the server only runs the simulation and returns named scalar measurements.
mcp-spice demonstrates solid engineering with well-structured tool definitions, clear naming conventions, and comprehensive parameter schemas. All 7 tools follow verb_noun patterns (ngspice_netlist_submit, spice_simulate_op, etc.). Descriptions are substantive (100-200 chars typical), explaining WHAT the tool does and WHEN to use it. Input schemas are complete with typed parameters and descriptions. However, output schemas are not documented in the visible code, LLMs cannot predict return structure. Error handling via SpiceToolError is machine-readable (code/context/recovery pattern) but not integrated into tool definitions. Tool composition is excellent: netlist submission returns content-addressed references that downstream simulation tools accept, enabling proper chaining. Security is strong: no credentials in parameters, content-addressed storage prevents tampering.
Submit a netlist with ngspice_netlist_submit (exact UTF-8 bytes; an expected SHA-256 is optional) to obtain a content-addressed reference.
spice_simulate_dc runs one bounded voltage-source sweep and returns reduced summaries, never a raw transfer curve.
spice_simulate_op returns requested node voltages and optional voltage-source branch currents (raw i(Vsource), positive into the source positive terminal).
spice_simulate_tran returns requested node voltage and branch-current min/max/final summaries with timestamps. Transient wrdata is bounded to 8 MiB and 50,000 samples before reduction.
Retrieve the dispatch record and publication status of a simulation by dispatch SHA-256 hash.
Retrieve a documentary receipt for a completed simulation by receipt SHA-256 hash.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'node voltages and branch currents') but LLMs cannot predict field names, types, or structure. This forces agents to guess or make exploratory calls.
Parameter 'timeout_s' lacks constraints. No minimum/maximum specified. LLMs could pass 0, negative, or absurdly large values (e.g., 999999). Should document valid range (e.g., '0.1 - 3600 seconds').
Mutually exclusive parameters not documented. Tools accept netlist_sha256, netlist_uri, and netlist_path, but which combinations are valid? Should state: 'Provide exactly one of netlist_sha256 (preferred), netlist_uri, or netlist_path (legacy).'
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 83 | 2026-07-28+ | v2 |
Retrieve the result of a completed simulation by outcome SHA-256 hash.
Error handling not integrated into tool definitions. SpiceToolError class exists (code/context/recovery) but tool schemas do not declare error responses. LLMs cannot predict error structure or recovery paths from the tool definition alone.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All simulation tools are read-only and idempotent, but this is not declared. Agents cannot infer safety properties without explicit hints.