Fritzing MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fritzing MCP Serverplace an Arduino Uno and an LED, then wire them together"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
WattLab Controlled Fritzing MCP
A strictly controlled local MCP server that lets an AI agent perform narrow, validated Fritzing engineering operations — search parts, inspect connectors, place, wire, validate, render, save — while the AI gets no shell, no arbitrary filesystem access, no generic process execution, no direct Fritzing control. The MCP server is the security boundary; the AI is not trusted.
What this is / is not
Is: a Windows MCP server (Python 3.11+,
mcp2.x) over a standard Fritzing install.Is not: a general-purpose AI-computer-control tool; a formal electrical simulator; a nice way to bypass the user’s Fritzing library.
Related MCP server: AgentCAD
Architecture
AI AGENT
│ MCP (stdio, tool calls only)
▼
server/mcp/tools.py # narrow tools: search / inspect / create / place / move / wire / validate / render / visual_report / save
│
▼
server/policy.py # trust levels, lifecycle state machine, save policy
▼
server/fritzing/ # parts.db integration, .fz/.fzz generation, validation, rendering
▼
artifact manager # projects/active|completed|rejected/<WTL-FZ-...>/Everything the AI can touch is a JSON-manifest-authoritative project under C:\Users\...\fritzing_mcp\projects. There is no download/HTTP tool, no file-path tool, no shell tool.
Project lifecycle (enforced)
CREATED → DISCOVERED → PLACED → WIRED → VALIDATED → RENDERED → REVIEWED → READY_TO_SAVE → SAVEDfritzing_renderrequires a validated, non-stale project (dirty == false,status != FAIL).Every structural mutation invalidates validation and reverts state (
WIRED/PLACED), forces re-validation.fritzing_save_projectrequires fresh validation;PASSsaves as verified,PASS_WITH_WARNINGSsaves only if policy allows warnings,FAILsaves only to the rejected store, and stale/never-validated projects are denied.
Part trust model
OFFICIAL / VERIFIED -> placeable
COMMUNITY -> requires policy enablement
GENERATED -> requires validation
UNKNOWN / REJECTED -> deniedA client cannot bypass trust by supplying an arbitrary part ID; unknown IDs and connector lookups fail hard.
Project manifest
{
"project_id": "WTL-FZ-2026-0001",
"state": "…",
"parts": [{ "instance_id": "inst_0001", "part_id": "…", "x": 0, "y": 0, "rotation": 0, "view": "breadboard" }],
"connections": [{ "connection_id": "wire_0001", "from_instance": "…", "from_connector": "…", "to_instance": "…", "to_connector": "…" }],
"validation": { "status": "PASS | PASS_WITH_WARNINGS | FAIL", "errors": [...], "warnings": [...], "needs_human_review": [...] },
"artifacts": { "fz": "…/circuit.fz", "fzz": "…/circuit.fzz", "render": { "engine": "…", "svgs": [...] } }
}.fzand.fzzare regenerated from the manifest at save time.Audit log:
projects/<id>/audit.jsonlwithtimestamp,request_id,transaction_id,tool,project,actor,parameters(secrets scrubbed),result.
Security
Capability | Allowed? |
| No — no such tools exist |
Search / inspect / place / wire / validate / render / save | Yes, narrowly |
Relative paths, | Rejected at |
Path traversal inside | Rejected; zip bounded ( |
Project-name shell injection / reserved names | Rejected |
Overwriting other projects | Blocked |
Trust is enforced server-side; the AI cannot escalate with prompt text.
Rendering
Two engines, always truthful:
{ "engine": "fritzing-native" }or
{ "engine": "builtin-engineering-preview", "precision": "approximate" }fritzing-native: runs the real
Fritzing.exe -svgheadless against an isolated profile with a dialog-dismissal watchdog.builtin-engineering-preview: draws component SVGs at manifest positions, plus connector markers, labeled endpoints, and explicit wire polylines for every connection. This is an engineering preview, not an authoritative Fritzing render — it is labeled
approximate.
If the native export is blank/missing the engine falls back to the preview; the mcp never silently calls a fallback render fritzing-native.
FZZ portability
circuit.fzz is a zip containing circuit.fz, referencing parts by the module IDs from the stock fritzing-parts installation. The artifact:
is structurally validated (must parse as XML zip),
contains no absolute paths,
opens in the installed Fritzing (verified on 1.0.8.0).
For portability beyond the current install, the receiving Fritzing must have the same fritzing-parts-family access (core/contributed modules). The manifest and render artifacts are versioned alongside it.
Validation behavior
fritzing_validate_project produces structured diagnostics and a status:
Checks | Type |
manifest schema, duplicate parts/wires | structural |
5V↔3V3 rails, rail⇄ground, missing VCC/GND, orphaned part, possible driven-output short | electrical heuristic |
duplicate module ID, unknown connector reference | structural |
These heuristics are surfaced as ERROR/WARNING/NEEDS_HUMAN_REVIEW and are the basis for saving. They are not a substitute for SPICE/electrical review.
Configuration
policy/policy.json— feature flags:filesystem,shell(always off),custom_parts(off by default),community_parts,overwrite,network,save.require_valid_validation,save.allow_warnings,ziplimits.Environment overrides:
FRITZING_DIR,FRITZING_EXE,FRITZING_PARTS_DIR,FRITZING_DOCUMENTS_DIR.
Running
python -m server.main doctor # environment diagnostic
python -m server.main serve # start the MCP server (stdio)
pytestOpen an MCP client (JSON-RPC over stdio). Point it at:
{
"mcpServers": {
"fritzing": {
"command": "python",
"args": ["-m", "server.main", "serve"],
"cwd": "C:\\Users\\Stealthy\\Desktop\\MCP\\fritzing_mcp"
}
}
}Tools
Tool | Purpose |
| environment + version + policy summary |
| indexed search (max 50) |
| full metadata, trust, views, connectors |
| normalized connector table |
| new |
| manifest view |
| add instance (trust/rotation/coordinate validated) |
| move existing instance |
| add a connection between validated connector IDs (no duplicates) |
| run validation pipeline → status |
| gated render (native → fallback) |
| inspect render artifacts |
| lifecycle-gated save; forced path (never accepts arbitrary output path) |
| gated OFF (NOT_IMPLEMENTED) unless custom parts enabled |
| custom-part validation hook |
Rules for agents
See knowledge/AGENT_CONTRACT.md. Summary: search before wiring, don't invent IDs, validate before render/save, never request shell/filesystem access, treat NEEDS_HUMAN_REVIEW seriously, and never claim electrical correctness beyond what the validator reports.
MCP resources
fritzing://rulesfritzing://tutorial/create-schematicfritzing://tutorial/validationfritzing://parts/policyfritzing://project-schemafritzing://tool-guidefritzing://troubleshootingfritzing://knowledge/{workflow,parts,schematic,validation,rules,troubleshooting}
MCP prompts
fritzing_create_schematicfritzing_debug_schematicfritzing_validate_schematicfritzing_create_custom_part
Known limitations
Native headless render is unreliable on this machine — the isolated profile's installer parts-db lookup does not resolve (
Application folder fritzing-parts not found), so native export yields blank canvases on some runs. The fallback engineering preview is deterministic but approximate.FZZ dependencies — the artifact references stock
fritzing-partsmodule IDs; move it between identical Fritzing installs only.Heuristic electrical checks are advisory, not proof.
No PNG export — native SVG export only; no Windows multi-format conversion hook yet.
User parts (
Documents\Fritzing\parts) currently contain duplicates/__MACOSXfiles that cause modal Fritzing dialogs — admins should clean that directory; the server ignores arbitrary user-paths, so it is not affected functionally.
Troubleshooting
Symptom | Fix |
| confirm part id via |
| call |
| run |
| decode |
| native export unavailable; check Fritzing install / profile permissions |
Fritzing dialogs blocking | close orphaned Fritzing processes; clean |
Development / testing
python -m pytest tests # unit + integration + security
python -m pytest tests\integration\test_render.py # renderer (slow, touches Fritzing.exe)
python -m server.main doctorTests are deterministic and do not depend on the polluted user-parts directory.
License
GPL-2.0-or-later, matching the Fritzing project.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Security gateway for AI agents: policy, approval, and audited execution, no secrets shared.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
The trust harness for AI agents. Set what an agent can do before it acts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA security-hardened MCP server that enables AI models to safely interact with Obsidian vaults through sandboxed file operations and todo tracking. It implements strict validation layers and resource limits to protect the local filesystem from potentially hostile tool calls.MIT
- AlicenseNot gradedqualityBmaintenanceEnables engineering agents to perform parametric CAD operations through a controlled MCP gateway built on FreeCAD, with transactions, diagnostics, and reproducible verification.2GNU Lesser General Public v2.1 only
- AlicenseNot gradedqualityBmaintenanceEnables AI hosts to interact with a browser CAD workbench through model-neutral local stdio or authenticated remote MCP tools, supporting command discovery, design-health analysis, and scoped previews while never reading local files or taking over open sessions.MIT
- AlicenseAqualityBmaintenanceEnables MCP-compatible AI clients to securely access explicitly authorized local project files and run approved development commands with bounded execution and audit logging.1MIT