ltspice-mcp
Health Warn
- License — License: GPL-3.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
This is an MCP server that exposes LTspice and NGspice circuit simulation capabilities to LLMs. It allows AI models to create netlists, run electronic simulations, and parse the resulting data through standard MCP tool calls.
Security Assessment
Overall risk: Low. The automated code scan reviewed 12 files and found no dangerous patterns, no hardcoded secrets, and no requests for risky system permissions. The tool operates locally via a standard stdio transport rather than exposing a network port. Because its core function is to interface with local SPICE simulators, it does inherently execute external processes (running LTspice or NGspice executables on your machine). However, it does not access sensitive personal data, and there are no hidden network callbacks. The standard risks are limited to whatever output the local simulations generate.
Quality Assessment
The project is very new and highly experimental, explicitly stating it is a "work in progress" with potential breaking changes. Community trust is minimal right now, reflected by having only 5 GitHub stars. On the positive side, the repository is under active development (last updated today) and is properly licensed under GPL-3.0. The documentation is excellent, providing clear installation steps, platform compatibility details, and setup instructions for multiple AI clients.
Verdict
Use with caution — the code appears safe and well-structured, but the project's early experimental status means you should expect rough edges and potential breaking changes.
MCP server giving LLMs the ability to design, simulate, and analyze SPICE circuits via LTSpice and NGspice
ltspice-mcp
Work in progress. Core functionality is usable but expect rough edges, missing features, and breaking changes.
MCP server that exposes LTspice circuit simulation to LLMs via the Model Context Protocol. Create netlists, edit schematics, run simulations, and analyze results through MCP tool calls.
Built on the low-level mcp.server.lowlevel.Server API with spicelib for simulator interfacing and result parsing.
Requirements
- Python 3.13+
- LTspice (for simulation — circuit editing works without it)
- An MCP-capable client (see MCP clients below)
Platform support
| Platform | How LTspice runs |
|---|---|
| Windows | Native |
| WSL2 | Windows LTspice.exe via interop (not Wine) |
| Linux | Via Wine (spicelib handles this) |
Install
Any Python package installer works — pick whichever you already use.
# uv (recommended — fast, installs in an isolated tool env and puts `ltspice-mcp` on PATH)
uv tool install ltspice-mcp
# or plain pip (inside a venv or with --user)
pip install ltspice-mcp
# or pipx (same isolated-tool model as `uv tool`, if you prefer PyPA tooling)
pipx install ltspice-mcp
After install, the ltspice-mcp command should be on your PATH. Verify with:
ltspice-mcp --help
Install from source
git clone https://github.com/Cognitohazard/ltspice-mcp.git
cd ltspice-mcp
uv sync # or: pip install -e .
Configure
cp ltspice-mcp.example.toml ltspice-mcp.toml
# Set simulator.path if LTspice isn't auto-detected (required on WSL)
MCP clients
MCP is an open standard, so this server works with any client that speaks it. Below are setup snippets for the major ones. All examples assume you've already installed ltspice-mcp so the executable is on your PATH.
Transport:
ltspice-mcpspeaks stdio. Local desktop clients (Claude Desktop, Claude Code, Cursor, Windsurf, Gemini CLI, etc.) connect to stdio servers directly. Web clients that only accept remote MCP (claude.ai, ChatGPT) need a stdio→HTTP bridge — see Remote / web clients.
Generic stdio config
Every client below uses the same JSON snippet — only the config file path differs. Paste this into the client's MCP config file:
{
"mcpServers": {
"ltspice": {
"command": "ltspice-mcp",
"args": []
}
}
}
If ltspice-mcp isn't on the client's PATH (common on macOS GUI apps), use the absolute path — find it with which ltspice-mcp (Linux/macOS) or where ltspice-mcp (Windows).
Claude Code (Anthropic CLI)
claude mcp add -s project ltspice -- ltspice-mcp
This writes a .mcp.json in the project root. Use -s user to install globally for your user instead.
Claude Desktop
Paste the generic stdio config into:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
Restart Claude Desktop. The LTspice tools appear under the MCP icon in the input box.
Cursor
Paste the generic stdio config into ~/.cursor/mcp.json (global) or .cursor/mcp.json in a project.
Windsurf (Codeium)
Paste the generic stdio config into ~/.codeium/windsurf/mcp_config.json.
Gemini CLI
Merge the generic stdio config into the mcpServers object in ~/.gemini/settings.json.
Continue, Cline, Zed, and other clients
Any client that supports MCP stdio servers takes the same generic stdio config — check the client's docs for where its config file lives.
Remote / web clients
claude.ai (Pro/Max "Connectors") and ChatGPT (Developer Mode connectors) only accept remote MCP servers over HTTPS, not local stdio processes. To use ltspice-mcp with them you need to bridge stdio to HTTP/SSE and expose it at a public URL. Common approaches:
mcp-proxy— wraps a stdio server as an SSE endpoint- Run behind a reverse tunnel (Cloudflare Tunnel, ngrok, Tailscale Funnel)
Because this server can write files, spawn simulators, and read arbitrary paths under allowed_paths, only expose it on a network you fully control. For remote use cases, tighten [security] allowed_paths and keep the tunnel private.
WSL configuration
On WSL, LTspice.exe runs via Windows interop (not Wine), so spicelib can't auto-detect it across the WSL boundary. Set the Windows-side path explicitly in ltspice-mcp.toml:
[simulator]
path = "/mnt/c/Program Files/ADI/LTspice/LTspice.exe"
Simulation output is automatically redirected to a Windows temp directory. LTspice writes SQLite .db files alongside results, and these fail on UNC paths (\\wsl.localhost\...), which causes .MEAS data to be lost.
Persisted job state
The server stores simulation, sweep, and Monte Carlo job metadata in a
per-circuit sidecar directory so a restarted server can surface prior
runs. Expect to see these alongside your circuits:
your-project/
├── amp.cir
└── .ltspice-mcp/
└── jobs/
├── sim_a3f1.json
└── sweep_b82c.json
If you track the circuit project in git, add to .gitignore:
.ltspice-mcp/
The global recent-circuits index lives at ~/.ltspice-mcp/recent.json
(or $XDG_STATE_HOME/ltspice-mcp/recent.json / $LTSPICE_MCP_HOME/recent.json).
Set [state] persist_jobs = false in ltspice-mcp.toml to disable
persistence entirely.
Tool Profiles
tool_profile controls which tools the server exposes. Set via [tools] profile in TOML or LTSPICE_MCP_TOOL_PROFILE env var.
| Profile | Tools | Use case |
|---|---|---|
full (default) |
All 47 tools | Backwards-compatible default for any MCP client |
agentic |
33 | Recommended when your client supports skill files |
The agentic profile removes netlist-editing wrappers, sweep/MC configuration tools, niche schematic operations, and library session management — things a capable LLM agent does better through direct file editing. It keeps simulation lifecycle, binary .raw parsing, batch orchestration, AscEditor-dependent ops, and library search — the tools that provide genuine leverage over what an LLM can do natively.
[tools]
profile = "agentic"
Skills
The tools give LLMs access to simulation. The skills give them the expertise to use it well.
The skills/ directory contains structured domain knowledge that teaches LLMs how to work with SPICE circuit simulators. Each skill is a self-contained reference covering SPICE fundamentals, simulator-specific gotchas, and MCP tool workflows — the kind of knowledge that takes years to build and that LLMs don't reliably have.
| Skill | Description |
|---|---|
skills/ltspice/SKILL.md |
LTspice: .asc schematic editing, Windows/WSL paths, LTspice-specific directives |
skills/ngspice/SKILL.md |
ngspice: open-source workflow, control scripts, ngspice model compatibility |
Copy the relevant skill into whatever location your MCP client uses for persistent instructions, then set the agentic profile. The skill provides the domain knowledge that replaces the removed wrapper tools.
Tools
All 47 tools are prefixed with ltspice_ to avoid namespace conflicts with other MCP servers. Every tool declares MCP annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) for client auto-approval decisions.
Circuit editing (16 tools)
Work on both .cir/.net netlists and .asc schematics. Extension-based dispatch picks the right editor automatically.
| Tool | Description |
|---|---|
ltspice_create_netlist |
Create a new netlist from a content string |
ltspice_read_circuit |
Read and parse a circuit file (netlist text for .cir, schematic layout for .asc) |
ltspice_list_components |
List components (optionally filtered by prefix) or look up a single component by reference |
ltspice_set_component_value |
Set one component value, or batch-set many via a values dict |
ltspice_parameter |
Get all .PARAM values (no args) or set one (name + value) |
ltspice_edit_directive |
Add or remove SPICE directives (.tran, .ac, .lib, etc.) |
ltspice_remove_component |
Remove a component (warns about orphaned wires) |
ltspice_move_component |
Move or rotate a component in an .asc schematic |
ltspice_set_component_attribute |
Set a component attribute (SpiceLine, Value2, etc.) |
ltspice_add_component |
Add a component with value, attributes, returns pin positions and bounding box |
ltspice_connect |
Connect two pins by reference with waypoint routing; validates for pin collisions, wire junctions, and diagonal wires before adding |
ltspice_add_net_label |
Add/remove net labels and ground flags (supports pin reference for placement) |
ltspice_add_text |
Add comment text annotations to schematic |
ltspice_symbol_info |
Get symbol pin positions, bounding box, pin directions, and description |
ltspice_component_info |
Get placed component pin positions, bounding box, and attributes |
ltspice_export_netlist |
Export .asc to .net netlist (shows diff against previous export) |
.asc schematic editing requires .asy symbol files. These are auto-detected on Windows and WSL; override with [schematic] symbol_paths in TOML or the LTSPICE_MCP_SYMBOL_PATHS env var.
Simulation (3 tools)
| Tool | Description |
|---|---|
ltspice_run_simulation |
Run a simulation — sync for short runs, async (returns job ID) for long ones |
ltspice_check_job |
Check a job's status by ID, or list all jobs |
ltspice_cancel_job |
Cancel a running simulation |
Analysis (16 tools)
Scalar and overview tools work on any .raw file; waveform tools reject AC (use the AC-specific tools instead) and AC tools reject transient.
| Tool | Description |
|---|---|
ltspice_signal_stats |
Signal statistics: min, max, mean, RMS, peak-to-peak (dB/phase for AC) |
ltspice_query_value |
Query a signal's value at a specific time or frequency |
ltspice_measurements |
Extract .MEAS directive results from the simulation log |
ltspice_operating_point |
DC operating point: all node voltages and branch currents |
ltspice_simulation_summary |
Full summary: simulation type, signals, measurements, warnings |
ltspice_edge_metrics |
Transient rise/fall time and slew rate for one edge |
ltspice_pulse_response |
Transient overshoot, undershoot, and settling time for a step |
ltspice_timing_between |
Propagation delay between two transient signals on a shared axis |
ltspice_periodic_metrics |
Period, frequency, duty cycle, and jitter for an oscillating signal |
ltspice_measurement_stats |
Aggregate .MEAS scalars across a sweep or Monte Carlo run |
ltspice_filter_metrics |
AC filter characterization: type (LPF/HPF/BPF/BSF), cutoffs, ripple, rejection, order |
ltspice_stability_metrics |
AC loop-gain stability: all unity-gain / -180° crossings and per-crossing margins |
ltspice_gain_at |
Batch gain + phase at N frequencies with log-axis interpolation |
ltspice_roll_off |
Magnitude slope between two frequencies in dB/decade + dB/octave |
ltspice_resonance |
Detect AC peaks and estimate Q factor + -3 dB bandwidth per peak |
ltspice_find_crossing |
Low-level: find frequencies where magnitude (dB/linear) or phase crosses a level |
Parametric analysis (5 tools)
| Tool | Description |
|---|---|
ltspice_configure_sweep |
Configure a multi-parameter sweep (linear or log, by step size or point count) |
ltspice_run_sweep |
Execute a configured sweep (async, returns job ID) |
ltspice_configure_montecarlo |
Configure Monte Carlo analysis with per-type component tolerances |
ltspice_run_montecarlo |
Execute a configured Monte Carlo analysis (async, returns job ID) |
ltspice_batch_results |
Query sweep/MC job progress, per-signal statistics, or per-run data |
Library management (5 tools)
| Tool | Description |
|---|---|
ltspice_find_model |
Find model candidates by name (fuzzy by default; exact=true for exact case-insensitive match) |
ltspice_model_info |
Get model parameters and the .include directive to use it |
ltspice_load_library |
Load a .lib/.mod file or a directory of library files |
ltspice_unload_library |
Unload a previously loaded library |
ltspice_list_libraries |
List loaded libraries, optionally with their model names |
Status (2 tools)
| Tool | Description |
|---|---|
ltspice_server_status |
Server status: detected simulators, config, sandbox paths, runtime state |
ltspice_recent |
Recently-used circuits and jobs from the persistent sidecar index |
Resources
Static resources and URI templates for browsing circuit files and simulation results.
| URI | Description |
|---|---|
ltspice://netlists/ |
List netlist files in the working directory |
ltspice://netlists/{filename} |
Read the full text of a specific netlist |
ltspice://results/ |
List all simulation and batch jobs with their status |
ltspice://results/{job_id}/signals |
Signal/trace names from a completed job's .raw file |
ltspice://results/{job_id}/measurements |
.MEAS results from a completed job's log |
ltspice://models/ |
List loaded model libraries and their models |
ltspice://config |
Current server configuration and detected simulators |
Configuration
Copy ltspice-mcp.example.toml to ltspice-mcp.toml and edit. All settings can be overridden with LTSPICE_MCP_ prefixed environment variables (highest precedence). The config file path itself can be set with --config PATH or the LTSPICE_MCP_CONFIG env var.
[simulator]
default = "ltspice" # ltspice, ngspice, qspice, xyce (null = auto-detect)
path = "" # Explicit executable path (required on WSL)
[security]
allowed_paths = ["."] # Sandbox: only these directories are accessible
[simulation]
max_parallel = 4 # Concurrent simulation limit
timeout = 300.0 # Default timeout in seconds
[analysis]
max_points = 10000 # Max waveform data points per trace
[plotting]
dpi = 150 # Plot resolution
style = "seaborn-v0_8-darkgrid" # Matplotlib style
[schematic]
symbol_paths = [] # Custom .asy symbol paths (auto-detected on Windows/WSL)
[logging]
level = "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL
Architecture
MCP Protocol server.py — lifespan, dispatch, request routing
resources.py — MCP resources and URI templates
Tools tools/circuit.py — netlist and schematic editing
tools/simulation.py — simulation execution and job management
tools/analysis.py — waveform analysis and measurements
tools/advanced.py — parametric sweep and Monte Carlo
tools/library.py — component library management
tools/status.py — server diagnostics
Core lib/sim_runner.py — spicelib SimRunner async integration
lib/sweep_runner.py — parametric sweep execution
lib/montecarlo_runner.py — Monte Carlo execution
lib/runner_manager.py — centralized runner lifecycle and caching
lib/raw_parser.py — .raw file parsing and statistics
lib/log_parser.py — .log parsing (errors, measurements, Fourier)
lib/batch_results.py — sweep/MC batch result extraction
lib/ltspice_wsl.py — WSL-aware LTspice subclass
lib/wsl.py — WSL detection and path conversion
lib/simulator.py — simulator detection and selection
lib/library_manager.py — SPICE model library management
lib/library_parser.py — .lib/.mod file parsing
lib/cache.py — FileCache for editor and result instances
lib/pathutil.py — path security (safe_path, resolve_safe_path)
lib/format.py — output formatting helpers
lib/plotting.py — matplotlib plot generation
lib/sweep_utils.py — sweep parameter utilities
Config config.py — TOML + env var configuration
state.py — session state (jobs, editors, caches)
errors.py — structured error hierarchy
Design notes
- Async wrapping: spicelib is synchronous. Short-lived parser/editor calls run inline on the event loop (the MCP stdio transport processes one request at a time). Long-lived simulator work uses
asyncio.to_thread()inside the runner layer (sim_runner,sweep_runner,montecarlo_runner). - Path sandbox: User-provided paths are validated against
config.allowed_paths. Paths outside the sandbox raisePathSecurityError. - Runner lifecycle:
RunnerManagerowns all runner instances (sim, sweep, MC). It auto-invalidates cached runners when the event loop, simulator class, or output folder changes. Runners are never created directly. - stdin protection:
main.pyredirects fd 0 to/dev/nullbefore starting the server, passing the real stdin only to the MCP transport. This prevents subprocesses from consuming MCP protocol bytes — a workaround for python-sdk#671. - Tool annotations: Every tool declares
readOnlyHint,destructiveHint,idempotentHint, andopenWorldHintfor client auto-approval decisions. - Output schemas: All 19 data-returning tools declare
outputSchemafor client introspection ofstructuredContent. The remaining 16 text-only confirmation tools don't setstructuredContentand omitoutputSchema. - Structured errors: Typed error hierarchy (
PathSecurityError,NetlistError,SimulationErrorvariants) inerrors.py. Handlers catchLTSpiceMCPErrorsubtypes and return error text; unknown exceptions propagate to the MCP SDK.
Development
The project uses uv for dev dependency management because it resolves the PEP 735 dependency-groups in pyproject.toml natively. Plain pip (25.1+) also supports this via --group.
# With uv (recommended for development)
uv sync # Install runtime + dev dependencies
uv run pytest tests/ -v # Run tests
uv run pyright # Type checking
uv run ruff check src/ tests/ # Lint
uv run ltspice-mcp # Run server (stdio)
uv run ltspice-mcp --config /path/to/config.toml # Custom config
# With pip 25.1+
pip install -e . --group dev
pytest tests/ -v
pyright
ltspice-mcp
License
GPL-3.0
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found