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. A gate netlist carries no source line info, so get_source applies to RTL only. A runnable example lives in examples/ (stdcells.lib + counter2.v + gate_level.py).


VHDL (beta)

VHDL loading is available in beta with najaeda 0.7.25 or newer. Call load_vhdl(file="/path/to/design.vhd", top="my_entity") to explore its elaborated hierarchy and connectivity. Load dependencies/packages first, one file per call; 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.1.6 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 SystemVerilog source excerpt that produced an object (for example, an FF instance maps to its always_ff block). Use after load_systemverilog when exact source text is needed; use get_intent for typedef/enum/parameter semantics and do not use for gate-level Verilog. 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 an object from a SystemVerilog load.
context_linesNoExtra lines before and after the source range; clamped to 0..20.

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, and closed-world. The description still adds real value beyond them: it discloses the return payload (object, file, start/end range, text, truncation status) and error semantics for missing paths/ranges, which the annotations do not cover. It stops short of a 5 only because 'bounded' is left implicit rather than quantified.

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, then routes usage and disclosure in four tight sentences with no filler. Slightly dense but every clause carries distinct 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 two-parameter read tool with no output schema, the description covers purpose, routing, return fields, truncation behavior, and error handling. Nothing an agent needs 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 description coverage is 100%, and both parameters (path, context_lines) are fully documented in the schema, including the 0..20 clamp. The description's phrase 'bounded excerpt' gestures at the range/context behavior but adds no syntax or format detail 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.

Purpose5/5

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

States a specific verb ('Read') and resource ('bounded SystemVerilog source excerpt') and clarifies the mapping (an FF instance maps to its always_ff block). It also explicitly distinguishes itself from get_intent and gate-level Verilog, so an agent can disambiguate without opening sibling 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 lifecycle guidance ('Use after load_systemverilog when exact source text is needed'), a named alternative for a specific case ('use get_intent for typedef/enum/parameter semantics'), and an exclusion ('do not use for gate-level Verilog'). This is the full when/when-not/alternative triad.

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). 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.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only cover the generic safety profile; the description adds real behavioral context: it mutates the in-memory design session, anonymous lowered objects are addressable by #<id>, allow_unknown_designs blackboxes undefined modules instead of failing, and intent=True costs memory to retain the SNL↔slang link for get_intent.

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 and sibling routing before requirements and option semantics; every sentence carries information. It is dense and multi-clause, but not padded.

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 7-parameter mutation tool with no output schema, the description covers inputs, session effect, and key flags. Minor gap: it does not say how this interacts with existing loaded designs or reset_universe/load_snapshot, but nothing essential to correct invocation 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 already 100%, so the baseline is 3. The description still adds meaning beyond the schema: the #<id> addressing convention for anonymous objects, the motivation behind intent=True (get_intent link, memory cost) and a concrete use case for allow_unknown_designs (undelivered hard macros).

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?

Opens with a specific verb+resource and scope: 'Elaborate local SystemVerilog sources into the active design session.' It goes further by explicitly naming what it is not (load_vhdl, load_verilog with load_liberty/load_primitives), so an agent can distinguish it from siblings without reading 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?

Explicit selection guidance: 'Use this for SystemVerilog RTL; use load_vhdl for VHDL (beta), or load_verilog with load_liberty/load_primitives for a structural gate netlist.' It also states the input precondition (requires at least `files` or `flist`) and the side effect on the session.

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. Gate netlists carry no source info, so get_source/get_intent cannot answer for them.

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.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only establish that this is a non-read-only, non-destructive, closed-world, non-idempotent operation. The description adds real context beyond that: ordering dependencies on other loaders, the failure mode for unresolved modules, and a downstream consequence (get_source/get_intent cannot answer for gate netlists).

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, then prerequisites, alternatives, and limitations. Every sentence carries distinct information 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?

No output schema exists, yet the description covers prerequisites, alternatives, failure behavior, and the downstream limitations of the loaded artifact. Nothing an agent needs in order to call this 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 the schema already documents all three parameters including allow_unknown_designs and keep_assigns. The description echoes allow_unknown_designs' effect but adds no syntax, format, or default guidance 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 (Load) and resource (local gate-level/structural Verilog into the active session) and explicitly distinguishes itself from load_systemverilog for RTL elaboration. An agent can separate it from load_vhdl, load_liberty, and load_primitives 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 preconditions (call load_liberty for Liberty cells or load_primitives for built-ins first), a named alternative with its selecting condition (load_systemverilog for RTL), and a failure condition (unknown modules fail unless allow_unknown_designs is true). 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.

load_vhdlA

Load VHDL into the active session (beta, restricted two-state RTL subset). Load dependency/package files first, one call per file, then the top file. 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.
fileYesOne local VHDL source file path (.vhd or .vhdl).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-read-only, non-idempotent operation, and the description adds real value beyond them: beta status, an unsupported-construct failure mode, the case where elaboration yields top=null, and the fact that SystemVerilog intent recovery and guaranteed source ranges are unavailable. It does not describe permissions or what session state is replaced on re-load.

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?

Dense but well front-loaded: the primary action and its sequencing constraint come first, caveats last. A few fragments read like release notes rather than tool guidance, which slightly dilutes focus.

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 state the return shape (top summary, language, beta status) and covers the main failure modes for a mutating loader. It is close to complete, though it omits how re-loading affects an already-populated session.

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 parameters are already documented ('file' path, 'top' omit-to-infer). The description only marginally extends this via 'one call per file' and the note that top can come back null for package-only files, so the 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 and resource (load VHDL into the active session) and immediately scopes it (beta, restricted two-state RTL subset), which cleanly distinguishes it from load_verilog, load_systemverilog and load_liberty siblings.

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 explicit sequencing rules ('Load dependency/package files first, one call per file, then the top file') and names the follow-up queries to run on the elaborated design (hierarchy, cards, connectivity). It does not state when to prefer a different loader or what to do when the language is not VHDL, so it stops short of full alternative routing.

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. 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."
  2. 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

Each tool targets a clearly distinct resource or action: per-language/level loaders, session lifecycle, hierarchical/name/connectivity queries, source/intent retrieval, and schematic interaction. Descriptions explicitly cross-reference alternatives (e.g., resolve vs find, get_drivers vs get_loads vs trace_cone), so no two tools appear interchangeable.

Naming Consistency4/5

Most names follow a predictable snake_case pattern with clear families: load_*, get_*, and action_* (save_snapshot, open_schematic, annotate_schematic, trace_cone). However, single-word names like resolve, find, and status break the dominant verb_noun convention, keeping it from a perfect score.

Tool Count3/5

At 23 tools, the surface is heavy for the typical 3–15 sweet spot. Although each tool maps to a distinct EDA workflow, the seven load_* variants in particular make the set feel borderline oversized and invite consolidation.

Completeness4/5

The set covers loading multiple HDL/model formats, session lifecycle (status, reset, save/load snapshot), hierarchy and name search, connectivity tracing, source/intent retrieval, and schematic interaction. Only minor gaps exist, such as no direct enumeration of assign glue or snapshot deletion/listing.

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.
    267 npm
    49
    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
    51
    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