Skip to main content
Glama

naja-scope

PyPI version Python versions CI License: Apache 2.0 Glama quality

Let your AI assistant explore SystemVerilog designs — without pasting source code into the chat.

naja-scope is an MCP server that gives AI agents (Claude, and any MCP-compatible assistant) a precise, structured view of your elaborated SystemVerilog design. Instead of dumping thousands of lines of RTL into the model's context, the agent asks targeted questions — what drives this signal? what's inside this module? where does this net come from? — and gets back small, exact answers with file-and-line references.

Built on the najaeda netlist engine.

On a 17-question CVA6 benchmark, the same Claude Code agent scored 17/17 with naja-scope versus 10/17 with grep/read source tools — in 77 turns instead of 123, processing about 5× less input. How it was measured ↓

pip install naja-scope
claude mcp add naja-scope -- naja-scope-mcp

naja-scope demo: a real Claude Code session tracing drivers and a fan-in cone on a UART design, using only naja-scope tools


Why

Large designs don't fit in a chat window. Pasting RTL is slow, expensive, and the model still can't reliably trace connectivity across hierarchy. naja-scope turns your design into something an agent can navigate:

  • 🔎 Trace connectivity — find what drives or loads any signal, across module boundaries.

  • 🌲 Walk the hierarchy — explore modules, instances, and ports on demand.

  • 🎯 Jump to source — every answer comes with file:line ranges, so the agent can quote the exact RTL that matters.

  • 🧩 Logic cones — trace fan-in / fan-out combinational cones up to the register boundary.

  • 💡 Recover design intent — enum state names, struct/union fields, and parameter formulas that normally vanish when a design is elaborated.

Works on RTL and gate-level netlists alike: load elaborated SystemVerilog, or load a post-synthesis structural Verilog netlist together with its Liberty standard-cell library and navigate the gates the same way (see Gate-level designs). VHDL loading is in beta.

All responses are token-bounded: lists paginate, large results truncate with clear markers. Your context stays small; your answers stay accurate.


Related MCP server: Universal Netlist MCP Server

Does it actually help?

naja-scope helps most when the answer exists in the elaborated design rather than in any single source file. In an initial 17-question run on the cv32a6_imac_sv32 configuration of CVA6, the same Claude Code agent was tested with naja-scope and with source-search tools alone.

Agent setup

Provider and models

Initial automated score

Turns

Input processed

Output tokens

Agent + naja-scope

Anthropic Claude Code; claude-sonnet-4-6 with claude-haiku-4-5-20251001 helper

17 / 17

77

1,058,556

19,520

Agent + grep/read source

Anthropic Claude Code; claude-sonnet-4-6 with claude-haiku-4-5-20251001 helper

10 / 17

123

5,461,719

55,962

The difference is clearest on structural questions that source search cannot answer directly:

CVA6 question

Agent + naja-scope

Agent + grep/read source

Flattened register groups under ex_stage_i

92, in 4 turns

No answer at the turn limit

Flattened register groups under commit_stage_i

0, in 3 turns

No answer at the turn limit

Elaborated hpdcache_mux variants

20, in 3 turns

No answer at the turn limit

Source search remains the right tool for local textual questions. naja-scope adds the elaborated hierarchy, connectivity, lowered primitives, and generated or uniquified structures that are otherwise difficult to reconstruct.

See the benchmark methodology and multi-model runner and historical result record for configuration, scoring, token accounting, and reproducibility details.


Install

pip install naja-scope        # pulls najaeda and the MCP runtime from PyPI
naja-scope-mcp                # stdio MCP server

Connect it to Claude Code

claude mcp add naja-scope -- naja-scope-mcp

Or add it to any MCP client's config:

{
  "mcpServers": {
    "naja-scope": {
      "command": "naja-scope-mcp"
    }
  }
}

Then just ask your assistant to load a design and start exploring:

"Load my UART design from rtl/uart.sv with top uart_top, then show me everything that drives tx_o."

The agent loads the design once and answers follow-up questions instantly — no re-reading source, no giant pastes.


Connect it to ChatGPT

ChatGPT connects to MCP servers over an HTTP endpoint (custom connectors / Developer mode), so run naja-scope as an HTTP server instead of stdio:

naja-scope-mcp --transport streamable-http --host 127.0.0.1 --port 8000

This serves MCP at http://<host>:8000/mcp. Because ChatGPT reaches the server over the network, expose that URL where ChatGPT can see it — e.g. a public tunnel for a local run:

# example: a tunnel to your local server (ngrok, cloudflared, …)
ngrok http 8000        # -> https://<something>.ngrok.app  →  add /mcp

Then in ChatGPT, open Settings → Connectors (enable Developer mode if needed), add a custom connector, and paste the server URL (https://<your-host>/mcp). Once connected, ask it to load a design and explore exactly as above. (ChatGPT's connector UI evolves; the constant is: it needs an HTTPS MCP URL, which --transport streamable-http provides.)

⚠️ The HTTP server has no built-in auth — only expose it over a trusted tunnel, and prefer short-lived tunnels for local experiments.


Gate-level designs

Already synthesized? Load the structural Verilog netlist together with the Liberty library that defines its standard cells, and navigate the gates the same way as RTL:

"Load the Liberty library pdk/stdcells.lib, then the gate netlist build/top.v, and tell me what cells top is built from and what drives data_out."

Hierarchy, per-cell counts (get_module_card), drivers/loads, and logic cones all work on the netlist; cones stop at the sequential cells. get_source shows a cell's or net's line in the netlist. For Yosys output, load with yosys_source_attributes=True: the (* src = ... *) attributes become origins that get_source(path, origin=0) reads back in the RTL. A runnable example lives in examples/ (stdcells.lib + counter2.v + gate_level.py).


VHDL (beta)

VHDL loading is available in beta. Call load_vhdl(file=["pkg.vhd", "child.vhd", "top.vhd"], top="my_entity") to explore its elaborated hierarchy and connectivity; the files may be listed in any order. A single path per call also works (load packages first); package-only files may return top: null until the top file is loaded. The frontend supports a restricted two-state RTL subset, and supported constructs may change. get_intent/load_intent remain SystemVerilog-only; VHDL source ranges are not guaranteed.


What you can ask

Once a design is loaded, your assistant can:

  • Resolve any signal or instance by hierarchical path (with glob and did-you-mean suggestions).

  • Find objects design-wide by pattern.

  • Show the hierarchy of any module.

  • Get drivers / loads of a net — the real endpoints, across hierarchy; literal drivers preserve four-state 0 / 1 / X / Z values.

  • Trace logic cones (fan-in / fan-out) and see the register frontier.

  • Get source — the exact SystemVerilog lines behind any object.

  • Get a module card — ports, counts, clock/reset at a glance.

  • Recover design intent — state-machine names, struct fields, parameter expressions lost during elaboration.

A runnable end-to-end walkthrough lives in examples/, including versions that run against CVA6 (a production RISC-V core, cloned on demand — see examples/cva6_demo.sh) and CORE-V-MCU (a full multi-vendor RISC-V SoC — see examples/core_v_mcu_demo.sh).


The Python escape hatch (off by default)

naja-scope also has a query_python tool that runs Python directly against the loaded design, for queries the typed tools above cannot express. It is not registered unless you opt in:

NAJA_SCOPE_ENABLE_PYTHON=1 naja-scope-mcp

It is unsandboxed eval/exec inside the server process — read-only by convention, not enforced — so anything that can reach the server can run arbitrary Python as the server's user. That matters most under --transport streamable-http, where the server listens on a socket. Leave it off unless you need it and trust every client that can reach the endpoint.


Requirements

  • Python 3.10+

  • Works anywhere najaeda runs (Linux, macOS, Windows)


Development

# from a checkout
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/python -m pytest -q

The full test suite runs against a plain pip install of najaeda — no native build required. The CVA6 cross-hierarchy cone regression (tests/test_zzz_cone_cva6.py) is slow and skips automatically unless a CVA6 snapshot is present.

CI tests every supported Python version on Linux x86_64, plus native platform lanes for Linux x86_64/aarch64, macOS x86_64/arm64, and Windows x86_64. The macOS x86_64 lane builds najaeda from its source distribution because PyPI does not currently provide an Intel macOS wheel.


Support & contact


License

Apache-2.0. See LICENSE.

Optional browser schematic

Requires naja-schematic 0.2.0 or later (the release containing the embeddable viewer API):

pip install "naja-scope[schematic]"

Restart the MCP server after installation. Load a design as usual, then use:

  • open_schematic(path="top.u_cpu"): returns a local browser URL and focuses the instance. Omit path for the top. Anonymous #id instances are supported.

  • annotate_schematic(items=[{"path": "top.u_cpu", "message": "Check reset", "severity": "warning"}]): replaces the overlay. Use kind="term" with a pin/port path to annotate that terminal; annotations apply to the whole port, not individual bus bits. Pass items=[] to clear. At most 200 annotations, each with at most 2000 message characters.

  • get_schematic_selection(): returns the last clicked instance as a regular naja-scope path, usable with source, hierarchy and module-card queries.

The viewer shares the existing raw naja universe; it does not elaborate again. The server binds to loopback and returns a token-bearing URL. Open that URL on the machine running the MCP server; it is not a remote or embedded MCP UI. Treat the URL as access to the loaded design. Design loads/resets refresh open viewers and clear selection, focus and annotations. The browser server stops with naja-scope. Existing tools remain usable without the schematic extra.

Available Tools

23 tools
annotate_schematicA

Replace schematic annotations on instances or pins/ports. Returns the local viewer URL and count. Annotations clear when the design changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesUp to 200 annotations: path (scope path), kind (instance or term), severity (info, warning, error), message (up to 2000 characters). Whole pins/ports only; [] clears overlays.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnly=false, destructive=false, openWorld=false, idempotent=false), so the description's added value is the lifecycle and return contract: it says annotations clear when the design changes and that the call returns a local viewer URL and count. That ephemerality note is genuinely useful context an agent cannot get from the annotations, though permissions and size limits are only in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero filler; the action is front-loaded and each remaining sentence carries distinct information (return value, lifecycle). Nothing to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a write tool with no output schema, the description covers the essentials: what it replaces, what it returns, and that the effect is not persistent across design changes. It does not mention required permissions or confirm the clearing semantics of an empty list (that lives in the schema), so it is strong but not exhaustive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single `items` parameter is documented in detail (path/kind/severity/message, 200 cap, 2000 chars, pins/ports only, [] clears). The description adds nothing beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Replace") and resource ("schematic annotations") plus the target objects ("instances or pins/ports"), so the agent immediately knows this is a mutation of annotation overlays. No sibling is named, but no other sibling tool does annotation work, so differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: you call it to set annotations on a schematic. There is no statement of when to prefer this over alternatives (e.g., get_schematic_selection for reading the current selection) or any precondition such as a design needing to be loaded first. Adequate but leaves routing and prerequisites to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

findA
Read-onlyIdempotent

Search case-sensitive object names across the loaded design with a glob. Use this when an exact path is unknown; use resolve once a path is known or get_hierarchy to browse structure. A dot in pattern switches matching to full hierarchical paths. Returns typed descriptors in matches plus count, has_more, and an opaque next_cursor for pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoRestrict results to one design-object kind, or any.any
limitNoPage size; defaults to 50 and is capped at 200.
cursorNoOpaque next_cursor from the previous response; omit for the first page.
patternYesCase-sensitive glob; include a dot to match full hierarchical paths.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds value beyond that by disclosing the glob-dot path-switching rule and the return/pagination shape (matches with typed descriptors, count, has_more, next_cursor) in the absence of an output schema. It does not discuss result-ordering or cost, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the core action before usage guidance and return shape. Every sentence carries distinct information (purpose, routing, return structure) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool, the definition covers purpose, sibling routing, glob semantics, and the return/pagination contract. With annotations carrying the safety profile and no output schema, an agent has everything needed to call it correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented in the schema (kind enum, limit default/cap, cursor origin, pattern dot rule). The description restates the pattern-dot behavior and explains pagination flow, but adds no syntax or constraints the schema lacks, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search), resource (case-sensitive object names in the loaded design) and mechanism (glob), which is far more than the vague name 'find' conveys. It also names two siblings (resolve, get_hierarchy) and the conditions that select them, letting an agent distinguish it without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this when an exact path is unknown; use resolve once a path is known or get_hierarchy to browse structure" gives explicit when-to-use, when-not, and named alternatives. Nothing about tool selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_driversA
Read-onlyIdempotent

List the immediate upstream endpoints that drive a term or net across hierarchy. Use this for direct sources; use get_loads for downstream readers or trace_cone for the transitive combinational fanin. Returns leaf drivers (FF/gate instances with pin, model, source ref) and top-level ports. Lowered assign glue is traversed rather than reported as an endpoint. Literal assign drivers include constant (0, 1, X, or Z); bus entries include the driven bit. Capped at limit (default 50, max 200) with a truncated flag; no cursor — raise limit to see more.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesExact hierarchical path to a term or net in the loaded design.
limitNoMaximum endpoint entries; defaults to 50 and is capped at 200.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety bar is low; the description goes well beyond by disclosing the return shape (leaf FF/gate instances with pin, model, source ref; top-level ports), traversal behavior (lowered assign glue is traversed, not reported), edge-case encoding (constant 0/1/X/Z, bus bit entries), and pagination semantics (limit cap, truncated flag, no cursor). This is unusually complete behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded — purpose first, then alternative routing, then return/pagination details. Dense but every sentence carries information, particularly the encoding details that would otherwise be undiscoverable without an output schema; slightly verbose but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return-value burden itself, and it does: it enumerates driver kinds, port endpoints, constant/bit encodings, and truncation signaling. Nothing an agent needs in order to call and interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds value beyond the schema by explaining that truncation is signaled via a `truncated` flag, that there is no cursor, and that raising `limit` is the only way to see more. That is meaningful operational semantics not present in the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the immediate upstream endpoints that drive a term or net across hierarchy'), scoping it to direct/leaf drivers. It names the two neighboring tools it is not (get_loads for downstream, trace_cone for transitive fanin), so an agent can select it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this for direct sources' and names both alternatives with the condition that selects each: get_loads for downstream readers, trace_cone for transitive combinational fanin. When-to-use and when-not-to-use are both fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hierarchyA
Read-onlyIdempotent

Browse the instance tree below path (or the top instance). Use this for structural children; use find for design-wide name search or get_stats for aggregate model counts. Lists only non-assign children (real submodules + leaf primitives); assign glue is reported as assign_count, not enumerated. Each child carries a leaf flag (submodule vs leaf primitive). depth<=5; the non-assign set is paginated at the root via limit/cursor (next_cursor/has_more), deeper levels via children_truncated.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoHierarchical instance path; omit to start at the top instance.
depthNoTree depth from 1 through 5; out-of-range values are clamped.
limitNoMaximum non-assign children per level; root default 20, maximum 100.
cursorNoOpaque root-level next_cursor from a previous response.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish a safe read (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description goes well beyond them: it discloses that only non-assign children are listed, that `assign` glue is summarized as `assign_count`, that each child carries a `leaf` flag, that depth is capped at 5, and that root pagination uses limit/cursor with next_cursor/has_more while deeper levels report children_truncated. This is exactly the kind of result-shaping behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, and nearly every clause carries distinct information (sibling routing, assign handling, leaf flag, depth cap, pagination). It is dense and somewhat run-on, but there is essentially no filler to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the full burden of describing return shape — and it does, covering assign_count, the per-child leaf flag, next_cursor/has_more, and children_truncated. Combined with the sibling routing and depth limits, an agent has everything needed to call and interpret this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the schema already documents path, depth, limit, and cursor. The description adds genuine meaning the schema lacks: that depth is capped at 5, that pagination applies only at the root while deeper levels truncate, and that the cursor is a root-level opaque token. It does not add syntax/format detail for `path`, so it stops short of 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Browse the instance tree below `path`') and immediately scopes it against siblings ('use find for design-wide name search or get_stats for aggregate model counts'). An agent can distinguish it from find/get_stats/get_module_card without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names two alternative tools and the exact condition that selects each (design-wide name search vs aggregate counts vs structural children). It also clarifies the fallback behavior for `assign` children and where pagination applies, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_intentA
Read-onlyIdempotent

Retrieve source-level intent that netlist lowering erases (warm-only). Use when the answer is in the SystemVerilog type/declaration, not the flattened gates: enum/typedef state names + encodings (incl. PACKAGE typedefs whose members live in another file), and symbolic PARAMETER expressions (the formula behind a baked-in width). ref: a hierarchical path ('cva6.csr_regfile_i.priv_lvl_q'), a package member ('riscv::PLEN'), or an instance path for its parameters. want: auto | type | fsm_states | parameters. If the intent layer is not loaded, returns a note and you should fall back to get_source.

ParametersJSON Schema
NameRequiredDescriptionDefault
refYesHierarchical object/instance path or package member such as pkg::NAME.
wantNoIntent fact to retrieve; auto selects from the reference.auto

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds genuinely new behavioral context: the 'warm-only' precondition (requires the intent layer to be loaded) and the explicit degraded-return behavior ('returns a note') with a fallback instruction. This is meaningful disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core concept, then scoped to specifics, then parameter guidance and fallback. Dense but each sentence carries weight; slightly heavy prose keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description adequately characterizes what is returned (state names + encodings, symbolic parameter formulas) and the degraded-case behavior. An agent has enough to call it correctly and know when to switch tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3, but the description adds value by enumerating the ref forms (hierarchical path, package member 'riscv::PLEN', instance path for parameters) and clarifying that 'auto selects from the reference', which enriches the enum semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Retrieve source-level intent') and pinpoints exactly what it returns: enum/typedef state names with encodings and symbolic PARAMETER expressions. It clearly distinguishes itself from get_source and get_module_card by naming the 'type/declaration, not the flattened gates' scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('when the answer is in the SystemVerilog type/declaration') and provides the alternative path: if the intent layer is not loaded it returns a note and you should fall back to get_source. Both the when and the when-not are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_loadsA
Read-onlyIdempotent

List the immediate downstream endpoints that consume a term or net across hierarchy. Use this for direct readers; use get_drivers for upstream sources or trace_cone for the transitive combinational fanout. Returns leaf readers (instances with pin, model, source ref) and top-level ports. Lowered assign glue is traversed rather than reported as an endpoint. Capped at limit (default 50, max 200) with a truncated flag; no cursor — raise limit to see more.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesExact hierarchical path to a term or net in the loaded design.
limitNoMaximum endpoint entries; defaults to 50 and is capped at 200.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe read-only, idempotent, non-destructive operation, but the description adds substantial behavior beyond them: the exact return shape (leaf readers with pin/model/source ref, plus top-level ports), that lowered assign glue is traversed rather than reported, and the pagination contract (capped at limit, default 50/max 200, truncated flag, no cursor). These are genuine non-obvious traits that an agent could not derive from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then routes to alternatives, then covers return shape and pagination in a compact, well-ordered block. Every sentence earns its place with no filler, despite a slightly odd internal line break.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description takes on the burden of explaining return values and does so (leaf readers, top-level ports, lowered glue handling), while also covering alternatives and pagination. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — both path and limit are fully documented in the schema, including the same default/max values. The description reinforces the limit semantics and adds 'no cursor — raise limit to see more', which is minor incremental value. Baseline 3 is appropriate when the schema carries the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (immediate downstream endpoints that consume a term or net across hierarchy), and immediately distinguishes itself from siblings get_drivers (upstream) and trace_cone (transitive fanout). An agent can select it correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool ('for direct readers') and names the two alternatives with the conditions that select them ('get_drivers for upstream sources', 'trace_cone for the transitive combinational fanout'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_module_cardA
Read-onlyIdempotent

Deterministic module summary: ports, instance counts by model, sequential count, source ref, plus clock/reset candidates — a name-based regex guess, not a structural result; verify before relying on it. Use this for one model's interface; use get_stats for counts below an instance.

ParametersJSON Schema
NameRequiredDescriptionDefault
moduleYesElaborated module/model name, not an instance path.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds critical non-structured context: clock/reset results are 'a name-based regex guess, not a structural result; verify before relying on it.' This discloses result reliability, which an agent cannot infer from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the payload contents, then the caveat, then the alternative routing — well ordered with no filler. It is dense and packs several distinct claims into two sentences, but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so the description correctly enumerates what is returned, flags the heuristic nature of part of it, and routes to the alternative tool. Combined with annotations covering safety, an agent has everything needed to call it and interpret results appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema coverage is 100%, so the schema already documents that 'module' is the elaborated module/model name (not an instance path). The description reinforces 'one model's interface' but adds no syntax or format detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (module summary) and enumerates the payload: ports, instance counts by model, sequential count, source ref, clock/reset candidates. It also explicitly contrasts itself with get_stats, so an agent can distinguish it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: 'Use this for one model's interface; use get_stats for counts below an instance.' Names the alternative and the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_schematic_selectionA
Read-onlyIdempotent

Return the last browser-selected instance as a naja-scope path, or null. Use the returned path with module-card, source, or hierarchy tools.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so safety is covered. The description adds genuinely useful behavioral facts beyond that: the value reflects the *last* selection (state-dependent) and may be null, which an agent must handle. It stops short of explaining what a naja-scope path is.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the return contract is front-loaded and the follow-up routing sentence immediately adds actionable value. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-param getter with no output schema, the description fully covers the return contract (path or null) and next steps. The only omission is any explanation of the naja-scope path format, which an unfamiliar agent would have to infer from the referenced consumer tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. No parameter guidance is needed or missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the last browser-selected instance'), specifies the output format ('as a naja-scope path, or null'), and distinguishes itself from siblings that consume its output. An agent knows exactly what this returns without opening anything else.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly directs the agent to feed the result into module-card, source, or hierarchy tools, which is a concrete usage path. It doesn't state when the tool should NOT be called or note that it depends on prior browser interaction, but no true alternative exists among siblings, so the guidance is adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sourceA
Read-onlyIdempotent

Read the bounded source excerpt that produced an object (for example, an SV FF instance maps to its always_ff block; a netlist cell maps to its instantiation line). Use when exact source text is needed; use get_intent for typedef/enum/parameter semantics. When the response lists origins (e.g. Yosys src attributes), call again with origin=N to read that RTL. Returns object, file, start/end range, text, and truncation status without modifying files; missing paths and source ranges return structured errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesExact hierarchical path to a loaded design object.
originNoIndex into the object's `origins` list to read an upstream source (e.g. the RTL behind a Yosys netlist cell) instead of its declaration.
context_linesNoExtra lines before and after the source range; clamped to 0..20.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the origin re-call workflow, the fields returned (object, file, start/end range, text, truncation status), and structured errors on missing paths. It exceeds the annotation bar without contradicting anything.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose before the alternatives and the origin workflow. It is dense but every sentence (examples, alternative, workflow, return/error behavior) earns its place; the parenthetical examples are the only mild padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: it names the returned fields, truncation status, and structured error behavior for missing paths. Combined with full schema coverage and annotations, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline would be 3. The description still adds meaning by framing origin as a two-step workflow (list origins, then re-call with origin=N) and by contrasting it with reading a declaration, which is more than the schema's field-level text conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read the bounded source excerpt that produced an object) and grounds it with concrete examples mapping an SV FF instance to its always_ff block. It explicitly distinguishes itself from the sibling get_intent by scope, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('when exact source text is needed'), names the alternative and its domain ('use get_intent for typedef/enum/parameter semantics'), and describes the follow-up workflow (call again with origin=N when the response lists origins). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_statsA
Read-onlyIdempotent

Summarize instance population by model below path or the top design. Use this for aggregate leaf/sequential/model counts; use get_hierarchy for actual child instances or get_module_card for one model's ports. This read-only query requires a loaded design. Returns root_model, flat totals, a paginated models list, total_models, has_more, and next_cursor.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoHierarchical instance path; omit to summarize the top design.
limitNoModels per page; defaults to 25 and is capped at 200.
cursorNoOpaque next_cursor from the previous response; omit for the first page.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description adds a real precondition (a loaded design is required) and describes the return shape (root_model, totals, paginated models list, pagination fields), which is genuinely useful since no output schema exists. It stops short of describing pagination limits behavior in prose, but the schema covers limit/cursor.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, then routing, then precondition and return shape. The return-field list is dense but earns its place because there is no output schema. Slightly run-on but no waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only stats query with full schema coverage and no output schema, the description covers purpose, alternatives, precondition, and return fields. Nothing an agent needs in order to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents path, limit, and cursor fully (including the 200 cap). The description reinforces path semantics ('below `path` or the top design') but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (summarize) and resource (instance population by model) with explicit scope ('below `path` or the top design'). It even names the two sibling tools it is not (get_hierarchy, get_module_card), so an agent can distinguish it without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: 'Use this for aggregate leaf/sequential/model counts; use get_hierarchy for actual child instances or get_module_card for one model's ports.' It also states the precondition ('requires a loaded design'), leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_intentA
Destructive

Make the warm source-intent layer available for get_intent. Use after a SystemVerilog load that did not retain intent; do not call for VHDL or gate-level Verilog, and prefer load_systemverilog(intent=True) on the initial load. This is a no-op when the link is already live; otherwise it replaces the active universe by re-elaborating from explicit or captured flist/files. Returns intent_loaded; missing inputs produce a structured error.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoTop module name; omit to reuse the captured or inferred top.
filesNoSystemVerilog source paths; omit to reuse captured load inputs.
flistNoSystemVerilog file-list path; omit to reuse captured load inputs.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, and the description goes further by naming what is destroyed: 'it replaces the active universe by re-elaborating from explicit or captured flist/files.' It also discloses the idempotency-like no-op path when the link is already live, the return value (intent_loaded), and the error behavior for missing inputs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then the precondition, exclusions, alternative, and side effects in five tight sentences with no filler. Every clause carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation tool with no output schema, the description covers preconditions, exclusions, the destructive replace-the-universe side effect, the reuse behavior of omitted params, and the return/error signals. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so top/files/flist are already documented with their reuse semantics. The description only echoes the 'explicit or captured flist/files' concept without adding format or precedence detail beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: makes the warm source-intent layer available for get_intent. It explicitly names the sibling alternative (load_systemverilog(intent=True)) and the case it serves, so an agent can distinguish it from the load_* family without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when (after a SystemVerilog load that did not retain intent), when-not (VHDL or gate-level Verilog), and the preferred alternative on initial load (load_systemverilog(intent=True)). All routing conditions are stated rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_libertyA

Register standard-cell models from local Liberty .lib files in the active session. Use this before load_verilog when a gate netlist instantiates those cells; use load_primitives instead for the built-in Xilinx or Yosys model sets. This changes session state and returns {"ok": true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesOne or more local Liberty .lib file paths.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, idempotentHint=false), so the bar is lower, but the description adds real value by stating it 'changes session state' and returning `{"ok": true}` — a return shape that matters because there is no output schema. It stops short of noting failure modes (bad paths, duplicate loads) or that repeated invocation is not idempotent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the ordering prerequisite, then the alternative and the state/return note. No filler and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter loader with no output schema, the description covers purpose, sequencing relative to load_verilog, the sibling alternative, and the return value. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single `files` parameter is already documented as 'One or more local Liberty .lib file paths.' The description's mention of local `.lib` files merely restates the schema, adding no syntax, globbing, or multi-file resolution detail. Baseline 3 for a fully covered schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Register standard-cell models from local Liberty `.lib` files in the active session.' It is immediately distinguishable from load_primitives (built-in model sets) and load_verilog/load_vhdl without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the ordering condition ('use this before load_verilog when a gate netlist instantiates those cells') and names the alternative with its selecting condition ('use load_primitives instead for the built-in Xilinx or Yosys model sets'). This is a full when/when-not/alternative routing statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_primitivesA
Destructive

Register primitive models in the active session from either a built-in name (xilinx or yosys) or one local Python file defining load(db). Provide one source; name takes precedence when both are set. A custom file executes unsandboxed Python in the server process, so only use trusted code. Use load_liberty instead for standard-cell .lib files. Returns {"ok": true}.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNoLocal Python file defining load(db); used only when name is omitted.
nameNoBuilt-in primitive set to register; when set, file is ignored.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a destructive, non-idempotent, open-world write, and the description adds genuinely non-redundant context: custom files execute unsandboxed Python in the server process and must be trusted. It also discloses precedence behavior and the return value `{"ok": true}`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences that lead with the action and source choice, then the precedence rule, then the risk note and alternative. Slightly dense with clauses, but essentially no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-param tool with no output schema, the description covers source selection, precedence, the execution-security caveat, the alternative sibling for a related file format, and the return shape. Nothing needed to invoke it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are already documented with the same precedence semantics ('used only when name is omitted', 'when set, file is ignored'). The description largely restates that, so the baseline 3 applies; it adds the trusted-code constraint but no additional parameter syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Register primitive models in the active session') and enumerates the two mutually exclusive sources (built-in `name` or local Python `file`). It also names the sibling it is not (load_liberty), so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit either/or rule ('Provide one source; `name` takes precedence when both are set') and an explicit alternative for a plausible adjacent task ('Use load_liberty instead for standard-cell `.lib` files'). Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_snapshotA

Load a compatible save_snapshot directory into the active session in seconds instead of re-elaborating. Use load_systemverilog/load_verilog/load_vhdl when no compatible snapshot exists. The directory must match this najaeda version. intent=True also re-elaborates the warm intent layer from the flist saved in the snapshot (for get_intent).

ParametersJSON Schema
NameRequiredDescriptionDefault
intentNoAlso rebuild the warm intent layer from saved elaboration inputs.
directoryYesLocal directory previously created by save_snapshot.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark this as non-read-only and non-idempotent, and the description adds real context beyond that: the version-compatibility requirement, the performance profile ('in seconds instead of re-elaborating'), and the side effect of intent=True rebuilding the warm intent layer. It does not state what happens on a version mismatch or exactly which session state is overwritten, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the benefit and immediately followed by the fallback rule and precondition. No filler, though the closing intent clause is slightly dense relative to its value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, no-output-schema tool with annotations present, the description covers purpose, precondition, alternative tools, and the optional parameter's effect, which is enough to invoke it correctly. Return behavior is not described, but no output schema exists to carry that burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining that intent=True re-elaborates the warm intent layer 'for get_intent', giving the parameter purpose in the workflow rather than just restating the schema text. The directory parameter's snapshot origin is already covered by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (load a save_snapshot directory into the active session) plus the exact outcome (fast restore instead of re-elaboration). It is clearly separable from save_snapshot and from the load_systemverilog/load_verilog/load_vhdl siblings, which it names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit decision rule: use load_systemverilog/load_verilog/load_vhdl when no compatible snapshot exists, and adds the hard precondition that the directory must match the najaeda version. Alternatives and the condition selecting them are named outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_systemverilogA

Elaborate local SystemVerilog sources into the active design session. Use this for SystemVerilog RTL; use load_vhdl for VHDL (beta), or load_verilog with load_liberty/load_primitives for a structural gate netlist. Requires at least files or flist and changes the in-memory design session. Anonymous lowered objects are addressable by #. defines are preprocessor -D entries ("NAME" or "NAME=VALUE"). allow_unknown_designs=True blackboxes any module still undefined instead of failing (e.g. undelivered hard macros in a partly-open-source design). blackbox_multi_writer_memories does the same for modules whose multi-writer memories naja cannot infer. intent=True retains naja's in-engine SNL↔slang link for get_intent.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoTop module name; omit to use najaeda's inferred top.
filesNoLocal SystemVerilog source file paths; optional when flist is provided.
flistNoPath to a simulator-style file list; optional when files are provided.
intentNoRetain the live SNL-to-slang link required by get_intent; uses more memory.
definesNoPreprocessor definitions as "NAME" or "NAME=VALUE" entries.
keep_assignsNoPreserve continuous assignments as explicit lowered objects.
allow_unknown_designsNoBlack-box unresolved module definitions instead of failing elaboration.
blackbox_multi_writer_memoriesNoBlack-box whole modules whose memories have unsupported multiple writers instead of failing.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) establish the mutation profile; the description adds real context on top: it changes the in-memory design session, blackboxes undefined modules, retains the SNL↔slang link for get_intent, and notes anonymous objects are addressable by #<id>. It stops short of describing return shape or failure semantics, so 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded: purpose, then sibling routing, then the precondition, then per-flag detail. Every sentence carries weight, though the defines syntax and intent wording partially restate text already in the schema descriptions, adding mild redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter mutation tool with no output schema, the description covers purpose, alternatives, prerequisites, and the non-obvious flag semantics well. It omits what happens on repeated loads (idempotency behavior) and error/result reporting, which an agent would benefit from knowing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 still adds value beyond the schema: the `files`-or-`flist` requirement is not expressible in the schema (neither is required), and it explains the practical effect of allow_unknown_designs (undelivered hard macros in partly-open-source designs) and blackbox_multi_writer_memories (multi-writer memories naja cannot infer).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("Elaborate") + resource ("local SystemVerilog sources") + destination ("active design session"). It explicitly names how it differs from siblings load_vhdl, load_verilog, load_liberty and load_primitives, so an agent can disambiguate without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States exactly when to pick this tool (SystemVerilog RTL) and routes to named alternatives for VHDL and structural gate netlists. It also gives a hard prerequisite ("Requires at least `files` or `flist`"), which is critical since the schema declares zero required parameters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_verilogA

Load local gate-level or structural Verilog into the active session. First call load_liberty for Liberty cells or load_primitives for built-ins; use load_systemverilog instead for RTL elaboration. Unknown modules fail unless allow_unknown_designs is true. get_source shows the netlist declaration of an object; for Yosys output, yosys_source_attributes=True also records its RTL origins (get_source origin=N). get_intent cannot answer for netlists.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYesOne or more local structural Verilog netlist paths.
keep_assignsNoPreserve continuous assignments as explicit objects.
allow_unknown_designsNoBlack-box unresolved cell/module definitions instead of failing.
yosys_source_attributesNoDecode Yosys `(* src = ... *)` attributes into source origins pointing back to the RTL.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, idempotent=false, openWorld=false, destructive=false). The description adds substantive behavior beyond them: unresolved modules fail unless allow_unknown_designs is true, and yosys_source_attributes records RTL origins consumable via get_source. It also flags a downstream limitation (get_intent cannot answer for netlists), which is genuinely non-obvious.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and each sentence is dense and useful, but the trailing sentences about get_source and get_intent drift into describing sibling tools' behavior, which is slightly more than this tool's own contract requires. Still lean overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a load tool with no output schema and high-complexity session side effects, the description covers prerequisites, alternatives, failure semantics, and downstream tool interactions. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description restates the effect of allow_unknown_designs and yosys_source_attributes that the schema already documents, adding only the get_source origin=N usage detail, which is marginal incremental value over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Load), resource (gate-level/structural Verilog), and target (active session), and explicitly distinguishes itself from load_systemverilog ('for RTL elaboration'), load_liberty, and load_primitives. An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit ordering prerequisites ('First call load_liberty... or load_primitives') and names the alternative for the RTL case ('use load_systemverilog instead'). When-to-use and when-not-to-use are both covered with named siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_vhdlA

Load VHDL into the active session (beta, restricted two-state RTL subset). Prefer passing every file of the design as one list (any order; units are resolved across files). Single-file calls still work: load package files first, then the top. Package-only files or entities awaiting generics may return top=null. Use hierarchy, cards and connectivity queries on the elaborated design. SystemVerilog intent recovery is unavailable; source ranges are not guaranteed. Unsupported constructs may fail during beta development. Returns the top summary when elaborated, language and beta status.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoTop entity name; omit to infer the top.
fileYesA local VHDL source path (.vhd/.vhdl), or a list of paths loaded as one batch in any order.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare it non-read-only and non-idempotent; the description goes well past that by disclosing beta limitations (restricted subset, possible failures on unsupported constructs), the possibility of top=null for package-only or generic-awaiting entities, and unavailable SV intent recovery with unguaranteed source ranges. This is exactly the extra behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and then layers caveats efficiently; every sentence (batch preference, package-first ordering, beta limitations, return summary) carries information. It is dense but not padded, though the caveat block is slightly long.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly fills that gap by stating it returns the top summary plus language and beta status, and it warns about top=null before the agent misreads a result. For a stateful loader in beta, this is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: files may be passed in any order because units resolve across files, and top may remain null for specific design shapes. It explains the batch-vs-single semantics rather than restating the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Load VHDL into the active session") and scopes it to a beta two-state RTL subset, which cleanly distinguishes it from load_systemverilog and load_verilog among its siblings. An agent can select it purely on language identity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete how-to-use guidance: prefer one batch list in any order, and if going single-file, load packages before the top. It also names downstream queries (hierarchy, cards, connectivity) as the intended follow-on. It stops short of explicitly contrasting when to pick this loader over its sibling loaders.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_schematicA

Serve an interactive browser schematic of the current design. Returns a local URL to open on the MCP server's machine; requires the schematic extra. Uses the loaded design and supports anonymous #id instances.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoInstance path to focus; omit for the top.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructiveHint=false, openWorldHint=false), but the description adds genuinely useful context beyond them: it returns a local URL, that URL lives on the MCP server's machine (a real gotcha for a remote caller), and it requires the schematic extra. It never explains why readOnlyHint is false even though the operation looks like a pure view, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the core action front-loaded and no filler. Minor structural looseness in the trailing sentence, which packs two unrelated details ('loaded design' and '#id instances') together, keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description does its job by stating what is returned (a local URL) and the requirement to have the schematic extra and a loaded design. The agent has enough to call it correctly; the only missing piece is guidance on how the returned URL should be consumed or when this tool is the right choice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the path parameter's meaning ('Instance path to focus; omit for the top') is already fully documented. The description's phrase 'supports anonymous #id instances' adds a hint about accepted id forms but does not define syntax or format, so the schema carries the load and the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: 'Serve an interactive browser schematic of the current design.' That is far more informative than a restated name and the nature of the tool is unmistakable. It does not, however, explicitly differentiate itself from schematic-adjacent siblings such as annotate_schematic or get_schematic_selection, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: 'requires the schematic extra' and 'Uses the loaded design' hint at prerequisites, and the mention of the current design implies a design must already be loaded. There is no explicit when-to-use, when-not-to-use, or routing to an alternative tool, which is the core of this dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_universeA
DestructiveIdempotent

Discard the active design and all in-memory session state. Use before starting an unrelated design; do not use merely to inspect status. This is destructive to the current session but does not delete source or snapshots. Repeating it is safe and returns {"ok": true}.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds the crucial blast radius: it destroys session state yet does NOT delete source or snapshots, and it is safely repeatable. This is exactly the contextual disclosure annotations cannot convey, and it is consistent with them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, each earning its place: purpose first, then usage boundary, then destructive scope, then idempotency and return value. Front-loaded and entirely free of filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description covers everything: what it clears, when to invoke it, what it does not affect, and its return value. Nothing an agent needs to call it safely is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to explain; the schema has no fields to document. Baseline of 4 applies since nothing is missing on the input side.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action and resource — 'Discard the active design and all in-memory session state' — with a clear scope. It implicitly separates itself from read-only siblings by warning 'do not use merely to inspect status', so an agent can distinguish it from status without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives genuine when-to-use ('before starting an unrelated design') and when-not-to-use ('do not use merely to inspect status') guidance. It stops short of naming the concrete alternative tool (the `status` sibling) that should be used for inspection, so the routing is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolveA
Read-onlyIdempotent

Resolve a known hierarchical object path to instance, term, or net descriptors with source references. The final segment accepts a glob and bit selects (for example top.u_uart.tx_o[0]). Use find when the path is unknown; use get_hierarchy to browse children. This read-only query requires a loaded design and returns did-you-mean suggestions on failure.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoOptional object-kind filter for otherwise ambiguous paths.
pathYesHierarchical object path; the final segment may be a glob or bit select.
limitNoMaximum matches to return; defaults to 20 and is capped at 200.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description still adds real behavior, namely that it requires a loaded design and returns did-you-mean suggestions on failure. It stops short of describing match ordering or how source references are formatted, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose first, then syntax affordance, then alternative routing and prerequisites. Every clause carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only resolve query with full schema coverage, no output schema, and a small sibling set, the description covers purpose, path syntax, alternatives, prerequisite state, and failure behavior. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by giving a concrete glob/bit-select example (`top.u_uart.tx_o[0]`), which clarifies the path syntax in a way the property text does not. It adds no further meaning for kind or limit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (resolve) and resource (hierarchical object path) and states the output artifacts (instance/term/net descriptors with source references). It explicitly distinguishes itself from find and get_hierarchy, so an agent can tell what this does without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: 'Use find when the path is unknown; use get_hierarchy to browse children', plus the prerequisite that a design must be loaded. Both the alternative tools and the condition selecting them are stated, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_snapshotA
DestructiveIdempotent

Write the active design and source metadata to a local directory for fast reload. Use after loading a design; load_snapshot reads the result. Existing snapshot files in the directory may be overwritten. Snapshots are tied to their producing najaeda version, and returns include the saved path.

ParametersJSON Schema
NameRequiredDescriptionDefault
directoryYesLocal destination directory for naja-if and metadata files.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true and idempotent=true, so the write profile is partly covered; the description adds real value beyond that with 'Existing snapshot files in the directory may be overwritten' and the version-coupling caveat. It also discloses that the return includes the saved path, which matters since no output schema exists. Minor gap: it doesn't state auth/permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the verb+resource, then the trigger, then the caveats. Every sentence carries distinct information (purpose, when, side effects/compat) with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter write tool with annotations covering the safety profile, the description covers trigger, overwrite risk, version compatibility, and the return path even though no output schema exists. Only permission/error behavior is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is only one parameter, so the schema already documents 'directory' as the local destination for naja-if and metadata files. The description's 'local directory' wording only marginally reinforces this, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Write the active design and source metadata to a local directory') with the purpose ('for fast reload'). It explicitly names its counterpart 'load_snapshot reads the result', so an agent can distinguish it from the load_* siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear trigger ('Use after loading a design') and names the complementary tool that consumes the output. It stops short of stating when not to use it (e.g., prior to loading) or whether it can be re-run mid-edit, so it lands at 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

statusA
Read-onlyIdempotent

Inspect the current in-memory session without changing it. Use this before design queries to confirm a design is loaded and whether get_intent is live (intent_loaded) or can be reloaded (intent_loadable). Returns loaded and, when available, the top summary and loaded source files.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond that: it enumerates the returned fields (`loaded`, top summary, loaded source files) and explains the `intent_loaded`/`intent_loadable` state semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then usage, then return shape in a tight block with no filler. The phrase 'without changing it' slightly duplicates the readOnlyHint annotation, but otherwise every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so ('Returns `loaded` and, when available, the top summary and loaded source files'). For a zero-parameter read tool this is essentially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4; there is no parameter syntax an agent needs the description to supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Inspect the current in-memory session') and scopes it with 'without changing it', which an agent can distinguish from the load_* siblings. It does not explicitly name a sibling to contrast against, keeping it just below a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('Use this before design queries'), states the conditions it confirms (a design being loaded, whether get_intent is live or reloadable), and references get_intent as the related tool. No explicit when-not or exclusions, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_coneA
Read-onlyIdempotent

Trace the combinational fanin/fanout cone of a term/net via naja's LogicCone. Use this for transitive logic reachability; use get_drivers or get_loads for only immediate endpoints. direction: fanin|fanout. The cone crosses hierarchy and combinatorial arcs and always stops at flops, top ports, and opaque black-box cells. Returns node_count, counts_by_kind, counts_by_model, and a frontier of {flops, ports, blackboxes} with exact counts and lists capped at max_frontier (<=200) with a truncation marker. cross_hierarchy groups the flop frontier by top-level submodule and, under outside_root_subtree, names the frontier registers that live OUTSIDE the cone root's own subtree (the cross-hierarchy answer) — read it directly.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesExact hierarchical path to the cone's root term or net.
directionYesTraverse upstream fanin or downstream fanout logic.
max_frontierNoMaximum listed endpoints per frontier kind; clamped to 1..200.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), but the description adds real traversal semantics: the cone crosses hierarchy and combinatorial arcs and always terminates at flops, top ports, and opaque black-box cells. This is behavior beyond the annotations, though much of the rest of the text shifts toward return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the sibling distinction are front-loaded, and most sentences carry useful information. It runs slightly long, with return-shape detail that could be tightened, but nothing is gratuitous.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so thoroughly (node_count, counts_by_kind/model, frontier shape, truncation marker, cross_hierarchy/outside_root_subtree semantics). Combined with full param coverage and rich annotations, an agent has everything needed to call and interpret it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both direction and max_frontier are already documented (including the 1..200 clamp and default 50). The description restates direction and the <=200 cap but adds no syntax or format detail beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Trace) and resource (combinational fanin/fanout cone of a term/net) with clear scope, and names get_drivers/get_loads as the immediate-endpoint alternatives, so an agent can distinguish it from siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (transitive logic reachability) versus the alternatives (get_drivers/get_loads for immediate endpoints only), which is exactly the selection guidance an agent needs.

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.

  1. 4 tool updates
    • Changedget_source2 fields changed
      • addedInput schema / properties / origin
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Index into the object's `origins` list to read an upstream source (e.g. the RTL behind a Yosys netlist cell) instead of its declaration.",
        +  "title": "Origin"
        +}
      • changedInput schema / properties / path / description
        Previous value: -"Exact hierarchical path to an object from a SystemVerilog load."New value: +"Exact hierarchical path to a loaded design object."
    • Changedload_systemverilog1 field changed
      • addedInput schema / properties / blackbox_multi_writer_memories
        Added value: +{
        +  "default": false,
        +  "description": "Black-box whole modules whose memories have unsupported multiple writers instead of failing.",
        +  "title": "Blackbox Multi Writer Memories",
        +  "type": "boolean"
        +}
    • Changedload_verilog1 field changed
      • addedInput schema / properties / yosys_source_attributes
        Added value: +{
        +  "default": false,
        +  "description": "Decode Yosys `(* src = ... *)` attributes into source origins pointing back to the RTL.",
        +  "title": "Yosys Source Attributes",
        +  "type": "boolean"
        +}
    • Changedload_vhdl3 fields changed
      • addedInput schema / properties / file / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / file / description
        Previous value: -"One local VHDL source file path (.vhd or .vhdl)."New value: +"A local VHDL source path (.vhd/.vhdl), or a list of paths loaded as one batch in any order."
      • removedInput schema / properties / file / type
        Removed value: -"string"
  2. 22 tool updatesv0.1.9
    • Addedannotate_schematic
    • Changedfind5 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"Opaque next_cursor from the previous response; omit for the first page."
      • addedInput schema / properties / kind / description
        Added value: +"Restrict results to one design-object kind, or any."
      • addedInput schema / properties / kind / enum
        Added value: +[
        +  "instance",
        +  "net",
        +  "port",
        +  "module",
        +  "any"
        +]
      • addedInput schema / properties / limit / description
        Added value: +"Page size; defaults to 50 and is capped at 200."
      • addedInput schema / properties / pattern / description
        Added value: +"Case-sensitive glob; include a dot to match full hierarchical paths."
    • Changedget_drivers2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum endpoint entries; defaults to 50 and is capped at 200."
      • addedInput schema / properties / path / description
        Added value: +"Exact hierarchical path to a term or net in the loaded design."
    • Changedget_hierarchy4 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"Opaque root-level next_cursor from a previous response."
      • addedInput schema / properties / depth / description
        Added value: +"Tree depth from 1 through 5; out-of-range values are clamped."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum non-assign children per level; root default 20, maximum 100."
      • addedInput schema / properties / path / description
        Added value: +"Hierarchical instance path; omit to start at the top instance."
    • Changedget_intent3 fields changed
      • addedInput schema / properties / ref / description
        Added value: +"Hierarchical object/instance path or package member such as pkg::NAME."
      • addedInput schema / properties / want / description
        Added value: +"Intent fact to retrieve; auto selects from the reference."
      • addedInput schema / properties / want / enum
        Added value: +[
        +  "auto",
        +  "type",
        +  "fsm_states",
        +  "parameters"
        +]
    • Changedget_loads2 fields changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum endpoint entries; defaults to 50 and is capped at 200."
      • addedInput schema / properties / path / description
        Added value: +"Exact hierarchical path to a term or net in the loaded design."
    • Changedget_module_card1 field changed
      • addedInput schema / properties / module / description
        Added value: +"Elaborated module/model name, not an instance path."
    • Addedget_schematic_selection
    • Changedget_source2 fields changed
      • addedInput schema / properties / context_lines / description
        Added value: +"Extra lines before and after the source range; clamped to 0..20."
      • addedInput schema / properties / path / description
        Added value: +"Exact hierarchical path to an object from a SystemVerilog load."
    • Changedget_stats3 fields changed
      • addedInput schema / properties / cursor / description
        Added value: +"Opaque next_cursor from the previous response; omit for the first page."
      • addedInput schema / properties / limit / description
        Added value: +"Models per page; defaults to 25 and is capped at 200."
      • addedInput schema / properties / path / description
        Added value: +"Hierarchical instance path; omit to summarize the top design."
    • Changedload_intent3 fields changed
      • addedInput schema / properties / files / description
        Added value: +"SystemVerilog source paths; omit to reuse captured load inputs."
      • addedInput schema / properties / flist / description
        Added value: +"SystemVerilog file-list path; omit to reuse captured load inputs."
      • addedInput schema / properties / top / description
        Added value: +"Top module name; omit to reuse the captured or inferred top."
    • Changedload_liberty1 field changed
      • addedInput schema / properties / files / description
        Added value: +"One or more local Liberty .lib file paths."
    • Changedload_primitives3 fields changed
      • addedInput schema / properties / file / description
        Added value: +"Local Python file defining load(db); used only when name is omitted."
      • changedInput schema / properties / name / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "xilinx",
        +      "yosys"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / name / description
        Added value: +"Built-in primitive set to register; when set, file is ignored."
    • Changedload_snapshot2 fields changed
      • addedInput schema / properties / directory / description
        Added value: +"Local directory previously created by save_snapshot."
      • addedInput schema / properties / intent / description
        Added value: +"Also rebuild the warm intent layer from saved elaboration inputs."
    • Changedload_systemverilog7 fields changed
      • addedInput schema / properties / allow_unknown_designs
        Added value: +{
        +  "default": false,
        +  "description": "Black-box unresolved module definitions instead of failing elaboration.",
        +  "title": "Allow Unknown Designs",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / defines
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Preprocessor definitions as \"NAME\" or \"NAME=VALUE\" entries.",
        +  "title": "Defines"
        +}
      • addedInput schema / properties / files / description
        Added value: +"Local SystemVerilog source file paths; optional when flist is provided."
      • addedInput schema / properties / flist / description
        Added value: +"Path to a simulator-style file list; optional when files are provided."
      • addedInput schema / properties / intent / description
        Added value: +"Retain the live SNL-to-slang link required by get_intent; uses more memory."
      • addedInput schema / properties / keep_assigns / description
        Added value: +"Preserve continuous assignments as explicit lowered objects."
      • addedInput schema / properties / top / description
        Added value: +"Top module name; omit to use najaeda's inferred top."
    • Changedload_verilog3 fields changed
      • addedInput schema / properties / allow_unknown_designs / description
        Added value: +"Black-box unresolved cell/module definitions instead of failing."
      • addedInput schema / properties / files / description
        Added value: +"One or more local structural Verilog netlist paths."
      • addedInput schema / properties / keep_assigns / description
        Added value: +"Preserve continuous assignments as explicit objects."
    • Addedload_vhdl
    • Addedopen_schematic
    • Removedquery_python
    • Changedresolve4 fields changed
      • changedInput schema / properties / kind / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "instance",
        +      "term",
        +      "net"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / kind / description
        Added value: +"Optional object-kind filter for otherwise ambiguous paths."
      • addedInput schema / properties / limit / description
        Added value: +"Maximum matches to return; defaults to 20 and is capped at 200."
      • addedInput schema / properties / path / description
        Added value: +"Hierarchical object path; the final segment may be a glob or bit select."
    • Changedsave_snapshot1 field changed
      • addedInput schema / properties / directory / description
        Added value: +"Local destination directory for naja-if and metadata files."
    • Changedtrace_cone4 fields changed
      • addedInput schema / properties / direction / description
        Added value: +"Traverse upstream fanin or downstream fanout logic."
      • addedInput schema / properties / direction / enum
        Added value: +[
        +  "fanin",
        +  "fanout"
        +]
      • addedInput schema / properties / max_frontier / description
        Added value: +"Maximum listed endpoints per frontier kind; clamped to 1..200."
      • addedInput schema / properties / path / description
        Added value: +"Exact hierarchical path to the cone's root term or net."
  3. 20 tool updatesv0.1.8
    • First observedfind
    • First observedget_drivers
    • First observedget_hierarchy
    • First observedget_intent
    • First observedget_loads
    • First observedget_module_card
    • First observedget_source
    • First observedget_stats
    • First observedload_intent
    • First observedload_liberty
    • First observedload_primitives
    • First observedload_snapshot
    • First observedload_systemverilog
    • First observedload_verilog
    • First observedquery_python
    • First observedreset_universe
    • First observedresolve
    • First observedsave_snapshot
    • First observedstatus
    • First observedtrace_cone

TDQS

A4.1/5.0

Scored across 23 tools

Disambiguation5/5

Tools are highly differentiated: load_* split by source language/format, resolve/find/get_hierarchy split by known path vs search vs browsing, and get_drivers/get_loads/trace_cone split by immediate upstream vs immediate downstream vs transitive cone. Descriptions explicitly steer between nearest alternatives.

Naming Consistency4/5

All names use snake_case, with get_*/load_* prefixes and verb_noun forms. A few exceptions (status, resolve, find, trace_cone) are still readable but prevent a strict uniform verb_noun pattern.

Tool Count3/5

23 tools is heavy for a single MCP server, though the breadth reflects genuinely distinct EDA operations such as multi-language loads, model registration, hierarchy/connectivity queries, schematic, intent, and snapshots. The set is not obviously padded, but it sits in the crowded 16-25 range.

Completeness4/5

The surface covers session lifecycle, design loading for SV/VHDL/gate netlists, snapshots, structural and connectivity queries, source/intent retrieval, and schematic interaction. Minor gaps include snapshot management (list/delete) and any explicit annotation retrieval, but core workflows are covered.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    F
    maintenance
    A comprehensive Model Context Protocol server that connects AI assistants to Electronic Design Automation tools, enabling Verilog synthesis, simulation, ASIC design flows, and waveform analysis through natural language interaction.
    6
    112
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    This MCP server enables AI agents to understand and analyze electrical schematics from Cadence and Altium for comprehensive design reviews through natural conversations.
    395 npm
    51
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    An MCP server that connects LLM assistants to real circuit simulation: LTspice and ngspice, plus direct editing of LTspice .asc schematics. Simulation results come back as structured numbers so the assistant can design, verify, and iterate on circuits.
    48
    298 PyPI
    57
    GPL 3.0
  • A
    license
    A
    quality
    C
    maintenance
    Local MCP server for querying VCD waveform files via SQLite; enables AI agents to ask precise questions about signal values, transitions, and clock cycles without dumping raw VCD text.
    18
    1
    MIT