circuitjs-mcp
circuitjs-mcp
MCP-сервер, позволяющий управлять симулятором схем CircuitJS1 Фальстада из AI-агентов. Это стандартный MCP-сервер на stdio, поэтому он работает с любым MCP-совместимым клиентом: Claude Code, Codex CLI, Claude Desktop, Cursor и другими.
CircuitJS1 — это название HTML5/JavaScript-версии симулятора схем Пола Фальстада, который раньше был известен как Java-апплет «Circuit Simulator Applet», а сейчас работает в браузере на falstad.com/circuit. После прекращения поддержки Java-апплетов в браузерах Айан Шарп портировал его на JavaScript с помощью GWT; движок симуляции и текстовый формат схем общие с версией-апплетом (файлы схем времён апплета читаются как есть). JavaScript-интерфейс, который использует этот сервер, появился уже в CircuitJS1 — в версии-апплете его нет.
Сервер запускает скомпилированное веб-приложение CircuitJS1 (включено в webapp/, работает офлайн) в headless-режиме Chromium (Playwright) и предоставляет его JavaScript-интерфейс в виде MCP-инструментов. Состояние симулятора сохраняется между вызовами инструментов (можно интерактивно: загрузить схему → запустить → измерить → переписать схему).
Установка
Требования: Node.js 18 или новее.
cd circuitjs-mcp
npm install # postinstall で Playwright の Chromium も入ります
npm test # スモークテスト(RC回路の過渡応答が理論値と一致するか等を検証)Если playwright install chromium по каким-то причинам невозможен, можно использовать уже установленный Chrome/Chromium:
export CIRCUITJS_CHROMIUM="/usr/bin/google-chrome" # 例Related MCP server: circuit-sim-mcp
Регистрация в MCP-клиенте
Команда запуска одинакова для всех клиентов: node /абсолютный/путь/circuitjs-mcp/server.mjs
С переменной окружения CIRCUITJS_HEADFUL=1 окно браузера будет видимым, и человек сможет напрямую управлять тем же симулятором, что и агент (режим совместной работы). Во всех примерах ниже эта переменная указана; если она не нужна, уберите её.
Claude Code:
claude mcp add circuitjs -e CIRCUITJS_HEADFUL=1 -- node /絶対パス/circuitjs-mcp/server.mjsCodex CLI:
codex mcp add circuitjs --env CIRCUITJS_HEADFUL=1 -- node /絶対パス/circuitjs-mcp/server.mjsКлиенты с файлом конфигурации (claude_desktop_config.json для Claude Desktop, mcp.json для Cursor и т. п.):
{
"mcpServers": {
"circuitjs": {
"command": "node",
"args": ["/絶対パス/circuitjs-mcp/server.mjs"],
"env": { "CIRCUITJS_HEADFUL": "1" }
}
}
}Инструмент screenshot возвращает PNG как изображение MCP-контента. В клиентах, не поддерживающих отображение изображений, используйте аргумент save_path для сохранения в файл.
Список инструментов
Инструмент | Функция |
| Загружает схему в текстовом формате Falstad (с проверкой). Возвращает список элементов. |
| Получает время, разность напряжений/токи/напряжения на выводах всех элементов, напряжения на узлах с метками. |
| Запускает симуляцию на заданное время и возвращает временные ряды проб (напряжения узлов, токи/напряжения/мощности элементов). |
| run / stop / reset / status, настройка максимального шага по времени, задание значений внешних источников напряжения. |
| Экспортирует схему в текстовом формате Falstad или в SVG. |
| Генерирует URL ( |
| PNG-скриншот текущей схемы (возвращается как изображение, можно также сохранить в файл). |
| Запасной выход для операций, которых нет выше. Выполняет произвольный JS на объекте |
Примеры использования (образцы инструкций агенту)
«Собери RC-фильтр нижних частот на 1 кОм и 1 мкФ, подай меандр 1 кГц и сними форму выходного сигнала за 5 мс».
«Загрузи эту схему (вставка текста) и выведи список потребляемой мощности каждого резистора».
«Покажи скриншот схемы».
В местах, где нужно проводить измерения, размещайте узлы с метками (тип элемента 207, пример: 207 336 128 400 128 4 out) — тогда напряжение можно читать пробой {"node":"out"} или через nodes в circuit_state. Токи и напряжения отдельных элементов задаются через index, который возвращают circuit_load / circuit_state.
Прямое управление из скриптов
Если нужно вызывать инструменты из скрипта, минуя MCP-клиент, используйте drive.mjs. Он запускает сервер как дочерний процесс, последовательно выполняет JSON-файлы из каталога команд (cmd-1.json, cmd-2.json, ...) и записывает результаты в res-N.json:
node drive.mjs /tmp/cjs-commands
# 別プロセスから: echo '{"tool":"circuit_state","args":{}}' > /tmp/cjs-commands/cmd-1.jsonФайлы следует сначала записывать под временным именем, а затем переименовывать (чтобы избежать чтения наполовину записанного файла).
Переменные окружения
Переменная | Значение |
| Путь к исполняемому файлу Chrome/Chromium (по умолчанию: Chromium под управлением Playwright; при неудаче — системный Chrome). |
| URL CircuitJS1 для загрузки вместо встроенного webapp (например: |
|
|
Ограничения
Скорость симуляции в
run_transientзависит от настройки скорости симуляции в строке$схемы и от CPU. Если реальное время слишком велико, выполнение прерывается поwallTimeoutMsи возвращаются частичные данные (это можно определить по полюreason).«Редактирование» схемы в основном сводится к переписыванию текста Falstad и повторной загрузке через
circuit_load(при импорте время сбрасывается).Только переходные процессы (в самом CircuitJS1 нет, например, AC-анализа по малому сигналу). Частотную характеристику можно получить, перебирая частоты и повторяя
run_transient.
Лицензия
Весь репозиторий распространяется под лицензией GPL-2.0-or-later (COPYING.txt).
CircuitJS1 — это ПО Пола Фальстада / Айана Шарпа под лицензией GPLv2+.
webapp/— его скомпилированная сборка (без изменений); соответствующий исходный код доступен в pfalstad/circuitjs1 (оригинал) и в веткеpagesрепозитория code4fukui/circuitjs1 (источник этой сборки).Код сервера (
server.mjs,drive.mjs,test-client.mjs) © 2026 Suzu (涼鈴), GPL-2.0-or-later.
Available Tools
8 toolscircuit_exportExport circuitB
Export the current circuit as Falstad text format, or as an SVG drawing of the schematic.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Default "text". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral context. It clearly indicates the tool produces either Falstad text or SVG, but it does not disclose whether the export returns content directly, creates a file, or has any side effects. Some useful behavior is stated, but meaningful context is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that conveys the tool's purpose and its two output formats without redundancy. Every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, with one optional parameter, so extensive documentation is not required. However, since there is no output schema, the description does not clarify what the tool returns or how the exported content is delivered, leaving some ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema already documents the 'format' enum and default, the description enriches the enum values by explaining that 'text' means Falstad text format and 'svg' means a drawing of the schematic. This adds value beyond the bare parameter name and enum list.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Export'), the resource ('the current circuit'), and two concrete output formats ('Falstad text format' or 'SVG drawing'). It is clear and informative, though it does not explicitly distinguish itself from sibling tools like screenshot or circuit_link.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to choose this tool over alternatives such as screenshot or circuit_link. The description states what it does but not in what situations it is preferred, nor what it is not for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circuit_linkGet shareable linkA
Return a URL that opens the circuit in the Falstad simulator in any normal browser (falstad.com, no install needed). Uses the current circuit unless text is given. Give this link to the user so they can view/edit the circuit interactively in Chrome.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Base simulator URL, default https://www.falstad.com/circuit/circuitjs.html | |
| text | No | Circuit in Falstad text format; default: the currently loaded circuit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses that the link opens in any normal browser with no install needed, uses the current circuit by default, and is intended for interactive viewing/editing. It doesn't mention potential sharing caveats or response shape, but for a simple read-only link generator it is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. Three sentences each contribute: what it returns, how the input affects behavior, and how to use the result. There is no filler or duplication of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with no output schema, the description is complete. It identifies the output as a URL, explains the default behavior, names the destination simulator, and tells the agent what to do with the result. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the meaning of the `text` parameter by stating it overrides the current circuit, but it adds little beyond what the schema already says. `base` is not mentioned in prose, though its schema description covers it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: returning a URL that opens the circuit in the Falstad simulator. It specifies the resource, the requested action, and the practical use case (view/edit interactively in Chrome), which distinguishes it from sibling tools like circuit_export or screenshot.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use it: 'Give this link to the user so they can view/edit the circuit interactively in Chrome.' It also explains the key input behavior (uses current circuit unless text is given). It stops short of explicitly naming alternatives or saying when not to use it, so it isn't a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circuit_loadLoad circuitA
Replace the current circuit with the given circuit definition in Falstad CircuitJS1 text format (the same format produced by File > Export as Text, starting with a "$" line). Resets simulation time to 0. Returns the list of parsed elements so you can verify the circuit and note element indices for probing. The simulator keeps state between tool calls.
| Name | Required | Description | Default |
|---|---|---|---|
| run | No | Start the simulation running after load (default false). | |
| text | Yes | Circuit in Falstad text format. First line is the "$" options line: `$ flags timestep simSpeed currentSpeed voltageRange powerScale minTimestep`. A reasonable default: "$ 1 0.000005 10.20027730826997 50 5 50 5e-11". Coordinates are grid-snapped multiples of 16. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key side effects: replacing the current circuit, resetting simulation time to 0, keeping simulator state across calls, and returning parsed elements for verification. This goes beyond the bare schema and gives the agent useful behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three purposeful sentences cover action, input format, side effects, return value, and state persistence. The core operation is front-loaded, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately simple load tool with no output schema, the description covers the required input format, reset behavior, return value, and cross-call statefulness. Combined with a fully described schema, an agent has enough to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains the text format, the '$' line, reasonable defaults, and the run boolean. The tool description adds no parameter-specific meaning beyond noting the returned element list, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the operation (replace), the exact resource (current circuit), the input format (Falstad CircuitJS1 text starting with a '$' line), and the return value. This stands apart from siblings such as circuit_export and circuit_state, so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear that this tool is for installing a new circuit definition and that simulator state persists across calls, implying use at circuit-setup/load time. It does not explicitly name alternatives or say when not to use it, but no sibling has an overlapping function, so the gap is small.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
circuit_stateRead circuit stateA
Read the current simulation state: time, running flag, timestep, and every element with its voltage difference, current, post voltages and info string. Use the element index values with run_transient probes. Optionally pass node names (of labeled nodes, e.g. from "207 ..." labeled-node elements) to read their voltages.
| Name | Required | Description | Default |
|---|---|---|---|
| nodes | No | Labeled node names to read voltages for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It clearly frames the operation as a non-mutating read and lists what will be reported. It does not disclose potential edge cases such as behavior when the simulation is not running or the possibility of very large output, but it is generally transparent for a read-only state inspection tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: stating the primary behavior, linking to run_transient usage, and explaining the optional parameter. There is no redundancy or filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one optional parameter, the description covers the returned data, the source of valid node labels, and a cross-tool usage hint. Minor gaps such as output formatting, units, or error behavior are absent, but these are not critical for correctly invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, providing a baseline of 3. The description adds value beyond the schema by explaining that acceptable node names are labeled nodes and giving a concrete provenance example ('207 ...' labeled-node elements). It also clarifies the optional nature of the parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear read operation on the current simulation state and enumerates the specific data returned: time, running flag, timestep, and per-element voltage difference, current, post voltages, and info string. The verb 'read' and the explicit data inventory distinguish it from the write/control siblings in the context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete usage hint: use returned element index values with run_transient probes. It also explains when to pass labeled node names. However, it does not explicitly state when to prefer circuit_state over siblings like circuit_load or sim_control, nor does it give any when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
eval_jsEvaluate JavaScript against the simulatorA
Advanced escape hatch: run arbitrary JavaScript inside the CircuitJS1 page. The code is the body of an async function receiving sim (the CircuitJS1 object, see https://www.falstad.com/circuit/doc/js-interface.html). Return a JSON-serializable value. Example: "return sim.getElements().filter(e => e.getType()==='ResistorElm').map(e => e.getCurrent())".
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It clearly explains the execution model: code becomes an async function body, receives the `sim` object, and must return a JSON-serializable value. It does not spell out side effects or error behavior, but the phrase 'run arbitrary JavaScript' strongly implies mutating potential.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences plus one example carry high information density with no filler. The core operational facts are front-loaded, and the example earns its place by clarifying the expected code shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers how to invoke the tool, what the code receives, the return contract, and links to the simulator's documented interface. It lacks explicit caveats about side effects or serialization failures, but given the tool's arbitrary-code nature and the provided example, an agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `code` parameter is fully elaborated despite 0% schema description coverage. The description defines what the code should look like, what context it receives, what it must return, and provides a practical example. This fully compensates for the schema's minimal parameter definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: run arbitrary JavaScript inside the CircuitJS1 page. The 'advanced escape hatch' framing and concrete example clearly distinguish it from the sibling tools, which are more specialized operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is only implied by 'Advanced escape hatch,' suggesting it is a fallback when the standard tools cannot express the needed operation. It does not explicitly state when not to use it or name any sibling alternatives for common cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_transientRun transient simulationA
Run the simulation for a given amount of SIMULATED time while sampling probes, then stop. Returns time-series data {t, }. Probes: {"node":"name"} reads a labeled node voltage; {"element":i,"quantity":"current"|"voltageDiff"|"power"} reads element i (indices from circuit_state/circuit_load). Simulation speed is bounded by the circuit's sim-speed setting and CPU, so wall-clock time may differ from simulated time; the call aborts with partial data if wallTimeoutMs elapses first.
| Name | Required | Description | Default |
|---|---|---|---|
| probes | Yes | ||
| seconds | Yes | Simulated seconds to run, e.g. 0.01. | |
| fromReset | No | Reset the circuit to t=0 first (default true). | |
| maxSamples | No | Max samples to return (default 500). | |
| wallTimeoutMs | No | Wall-clock abort, default 30000, max 120000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden, and it does: it explains that simulation stops after the target time, returns partial data if wallTimeoutMs is hit, and that wall-clock can differ from simulated time. It does not explicitly describe side effects on circuit state beyond what fromReset implies, but the disclosure is still substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: first sentence states the core operation, second defines the output and probe syntax, third explains timing behavior. Every sentence earns its place, and the key scoping constraint (SIMULATED time) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, no annotations, and no output schema, the description is largely complete: it covers probe semantics, return shape, timeout behavior, and the sim-speed relationship. It could add a bit more detail about the exact output format or default reset behavior, but these are at least hinted at or covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so some parameter meaning is already provided. The description adds real value by defining probe syntax and semantics: node probes read labeled voltage, element probes read current/voltageDiff/power with indices from circuit_state/circuit_load. This goes beyond the bare schema and compensates for the harder-to-infer parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Run the simulation'), the resource (a transient simulation), and the core distinguishing scope (simulated time with probe sampling). It also identifies the return type as time-series data, so it is clear how this tool differs from siblings like circuit_load or circuit_state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context, including how probe indices relate to circuit_state/circuit_load and how sim-speed affects wall-clock time. However, it never explicitly states when to prefer this tool over an alternative or what would be a better tool for a different task, such as sim_control.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotScreenshot the schematicA
Take a PNG screenshot of the circuit as currently drawn (including scope traces if the circuit defines scopes). Returns the image; optionally also saves it to save_path.
| Name | Required | Description | Default |
|---|---|---|---|
| save_path | No | Absolute file path to also save the PNG to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral disclosure burden. It states that the tool returns a PNG image, optionally saves it to save_path, and includes scope traces only when scopes are defined. It does not mention file-overwrite behavior, but the core side effects are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence that conveys the primary action, the return value, the inclusion condition, and the optional parameter without redundancy. Every clause contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-optional-parameter capture tool with no output schema, the description fully explains what is returned and the only optional side effect. An agent has enough information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description only restates what the schema already says about save_path ('optionally also saves it to save_path'). No additional parameter meaning is added beyond the schema's explicit 'Absolute file path to also save the PNG to.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Take a PNG screenshot of the circuit as currently drawn') and clarifies the included content ('including scope traces if the circuit defines scopes'). This clearly distinguishes the tool from siblings like circuit_export and circuit_load.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for capturing the current visual circuit state and notes when scope traces are included, but it never explicitly states when to use this tool versus alternatives such as circuit_export. Usage context is present only by implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sim_controlControl simulationB
Start/stop/reset the simulation, set the max timestep, or set the voltage of an external voltage source (an "Extern voltage" element, type ExtVoltageElm, addressed by its name). "reset" reloads the current circuit, zeroing time and all state.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | ||
| extVoltage | No | ||
| maxTimeStep | No | Seconds, e.g. 5e-6. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully discloses reset semantics ('reloads the current circuit, zeroing time and all state'), but does not explain side effects of run/stop, whether operations block, or what status returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the primary actions efficiently. The parenthetical detail about external voltage elements is somewhat dense but adds necessary precision without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description omits the 'status' action entirely even though it appears in the schema enum. It also provides no return-value information, no constraints on combining parameters, and no mention of prerequisites, which is significant for a control tool with no output schema and no annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low at 33%, and the description partially compensates by explaining extVoltage as an external voltage source element addressed by name. However, the action enum values have no accompanying behavioral descriptions, and maxTimeStep relies on the schema's unit example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's purpose: starting, stopping, resetting the simulation, setting max timestep, and setting external voltage source values. It uses specific verbs and a named resource, though it does not explicitly differentiate itself from siblings like run_transient.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives such as run_transient. The action enum implies some usage, but there are no stated conditions, exclusions, or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.0- First observed
circuit_export - First observed
circuit_link - First observed
circuit_load - First observed
circuit_state - First observed
eval_js - First observed
run_transient - First observed
screenshot - First observed
sim_control
TDQS
Scored across 8 tools
Each tool has a clear, distinct role: loading/exporting circuits, reading state, controlling simulation, running transient probes, taking screenshots, generating links, and escaping to JS. circuit_state and run_transient are separated clearly as snapshot vs. time-series sampling.
Four tools use the circuit_ prefix, while sim_control, run_transient, screenshot, and eval_js follow different patterns. The names are still readable, but the convention is not uniformly applied across the server.
Eight tools is a well-scoped count for a circuit simulator server. Each tool maps to a meaningful user need without redundancy or bloat.
The set covers the full simulation workflow: load, export, inspect, control, run transient analysis, capture output, and share. eval_js provides an escape hatch for anything not explicitly exposed, leaving no obvious dead ends.
Maintenance
Related MCP Connectors
OCR, transcription, file extraction, and image generation for AI agents via MCP.
Create and manage Mermaid.js flowcharts and diagrams with AI agents via MCP.
Web scraping, browser automation, screenshots and AI data extraction for AI agents via MCP.
MCP tools for AI agents: render URLs to image/PDF, check link health, convert HTML/CSV/JSON.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceGenerates, simulates, and inspects LTspice circuits via MCP tools and resources, providing structured JSON interfaces for AI agents.MIT
- FlicenseNot gradedqualityFmaintenanceProvides circuit simulation capabilities via MCP, enabling creation, simulation (DC, AC, transient), and analysis of electronic circuits using PySpice.1-
- AlicenseNot gradedqualityDmaintenanceEnables MCP-compatible agents to generate Qucs circuit schematics, run simulations, and parse results programmatically.2MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to automatically generate Multisim circuits, run simulations, extract experimental data, and export circuit diagrams, CSV, waveforms, and lab reports.28MIT