naja-scope
naja-scope is an MCP server that lets an AI assistant load, navigate, and query elaborated SystemVerilog, VHDL, or gate-level netlists with file:line source references instead of pasting RTL into the chat.
Load designs — elaborate SystemVerilog (
load_systemverilog, with defines, flists, timescale fallback, blackboxing) or VHDL beta (load_vhdl), or load structural gate netlists with Liberty cells or built-in primitive sets (load_liberty,load_primitives,load_verilog).Speed up reloads — persist the active design with
save_snapshotand restore it in seconds withload_snapshot; clear state withreset_universeand check state withstatus.Locate objects — resolve hierarchical paths (glob and bit-select aware, with did-you-mean hints) via
resolve, or search design-wide with case-sensitive globs usingfind(paginated).Walk the hierarchy — browse instance trees to depth 5 with
get_hierarchy, including leaf/submodule flags and assign counts.Trace connectivity — get immediate drivers and loads across hierarchy (
get_drivers,get_loads), preserving 0/1/X/Z literals and bus bits.Analyze logic cones — follow transitive combinational fanin/fanout with
trace_cone, stopping at flops, top ports, and blackboxes, with cross-hierarchy register frontier grouping.Read source — pull bounded source excerpts with context lines for any object via
get_source, including upstream RTL origins from Yosyssrcattributes.Summarize structure — get ports, instance counts, register bits, RAM/ROM details and clock/reset guesses with
get_module_card; aggregate counts below an instance withget_stats.Recover design intent — retrieve enum/FSM state encodings, record fields, generics, and parameter formulas via
get_intent(withintent=Trueorload_intent).Verify content — compare elaborated designs across snapshots with versioned SHA-256 hashes via
get_content_hash.Visualize schematically — open a browser schematic viewer with
open_schematic, overlay annotations withannotate_schematic, and read back clicked instances withget_schematic_selection(requires the schematic extra).Keep output bounded — all list/query tools paginate or truncate with explicit markers and configurable limits (default 20, max 200), so responses stay token-efficient.
Optional Python escape hatch —
query_pythonfor arbitrary queries against the loaded design, disabled unlessNAJA_SCOPE_ENABLE_PYTHON=1.
naja-scope
Let your AI assistant explore SystemVerilog and VHDL 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 or VHDL 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 ↓
claude mcp add naja-scope -- uvx naja-scopeNo separate install step: uvx fetches naja-scope
and najaeda from PyPI on first launch. The buttons above do the same for VS Code
and Cursor. Prefer pip? See Install.

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:lineranges, 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.
Requires najaeda 0.7.35 or newer. See the 0.1.25 release notes for test results and snapshot migration requirements.
Works on RTL and gate-level netlists alike: load elaborated SystemVerilog or VHDL (beta), 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).
All responses are token-bounded: lists paginate, large results truncate with clear markers. Your context stays small; your answers stay accurate.
Related MCP server: WaveQ
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; | 17 / 17 | 77 | 1,058,556 | 19,520 |
Agent + grep/read source | Anthropic Claude Code; | 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 | 92, in 4 turns | No answer at the turn limit |
Flattened register groups under | 0, in 3 turns | No answer at the turn limit |
Elaborated | 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 serverConnect it to Claude Code
claude mcp add naja-scope -- uvx naja-scope # with uv, no install step
claude mcp add naja-scope -- naja-scope-mcp # after pip install naja-scopeOr add it to any MCP client's config:
{
"mcpServers": {
"naja-scope": {
"command": "uvx",
"args": ["naja-scope"]
}
}
}(With a pip install, use "command": "naja-scope-mcp" and no args.)
Then just ask your assistant to load a design and start exploring:
"Load my UART design from
rtl/uart.svwith topuart_top, then show me everything that drivestx_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 8000This 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 /mcpThen 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 netlistbuild/top.v, and tell me what cellstopis built from and what drivesdata_out."
Hierarchy, per-cell counts (get_module_card), drivers/loads, and logic cones
all work on the netlist; cones stop at the sequential cells. get_source
shows a cell's or net's line in the netlist. For Yosys output, load with
yosys_source_attributes=True: the (* src = ... *) attributes become
origins that get_source(path, origin=0) reads back in the RTL. A runnable
example lives in examples/ (stdcells.lib + counter2.v +
gate_level.py).
Storage summaries
get_module_card reports direct-child register bits and inferred RAM/ROM
summaries: width, depth, capacity in bits, read/write port counts, and
initialization status. Native memory interfaces also report address_bits
and reset_mode (none, async_low, async_high, sync_low, or
sync_high). It lists up to 12 memories, with memories_truncated
when more exist; initialized memories include a 64-character init_preview
and init_truncated. Address zero occupies the least-significant word.
get_stats aggregates these counts below the selected instance using
flat_register_bits, flat_memory_instances, flat_rom_instances,
flat_ram_instances, and flat_memory_bits. Register bits count modeled
flip-flop/latch states, including multibit Liberty banks; RAM capacity is
separate. Sequential cells without a state model are counted in
register_bits_unknown_instances (flat_ in statistics), so known bit
counts remain explicit lower bounds when that count is nonzero. Memories
are recognized from native naja primitives; opaque memory macros are not
assigned an inferred capacity.
Bounded tool output
MCP tools send compact JSON text alongside the same structured result.
get_stats() returns aggregate counts and total_models with an empty
models list. Request details with get_stats(limit=5), or pass the
summary's next_cursor to start paging models (25 per page when only a cursor
is supplied; maximum 200). Totals stay the same on every page.
find, get_drivers, and get_loads default to 20 entries (maximum 200).
Use find's next_cursor to continue; for endpoints, check truncated and
raise limit or query an individual bus bit. Explicit large limits or deep
hierarchy queries can still exceed a client's inline output cap.
These defaults change benchmark token counts; record the naja-scope version when comparing runs across this change.
Content comparison
get_content_hash() returns a versioned SHA-256 of the top model and its
descendants; pass module="uart_tx" to hash one elaborated model. Use it to
compare loaded content before and after snapshot reload or netlist edits.
The response includes format_version and naja_git_hash; compare hashes only
within the same format version and track the engine separately when primitive
semantics matter. Names and IDs participate, while source metadata and
primitive definitions are excluded. This is not functional equivalence.
Hashing is explicit because large hierarchies can take time.
SystemVerilog time units
For mixed RTL where only some modules declare a time unit, pass
default_timescale="1ns/1ps" to load_systemverilog. It supplies a fallback
for modules without a time unit and preserves explicit declarations. The
setting survives snapshots and load_intent re-elaboration.
VHDL (beta)
VHDL loading is available in beta. Call
load_vhdl(file=["pkg.vhd", "child.vhd", "top.vhd"], top="my_entity") to
explore its elaborated hierarchy and connectivity; the files may be listed in
any order. A single path per call also works (load packages first);
package-only files may return top: null until the top file is loaded. The frontend supports a restricted two-state RTL subset,
and supported constructs may change. get_source reads VHDL entity, port,
signal, instance and process origins, including after snapshot reloads.
Designs that name their library, as in library neorv32;, need
library="neorv32" on the load.
Pass intent=True to load_vhdl, or call load_intent afterwards, to query
get_intent for enum literals and their encodings, including FSM states held
in record fields, record fields, generics, and symbolic ranges such as
WIDTH-1 downto 0. Package members use pkg::NAME, and an instance's parameter
list leaves them out. Query the signal rather than its inferred flop, and note
that record fields report widths, not bit positions. Validated on the
NEORV32 SoC.
What you can ask
find uses case-sensitive globs: use *state*. Regex-style patterns such as
.*state.* return a corrective hint without scanning the hierarchy. When a
search misses a known parameter, a warm intent session points to get_intent.
Use get_intent("top.inst.PARAM") for one parameter, get_intent("pkg::NAME")
for a package member, or get_intent("pkg", want="parameters") to list package
parameters. SystemVerilog package listing discovers names from available
source files and validates them through the live engine; macro-generated
names may require an explicit pkg::NAME query.
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/Zvalues.Trace logic cones (fan-in / fan-out) and see the register frontier.
Get source — the exact source 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-mcpIt 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
najaedaruns (Linux, macOS, Windows)
Development
# from a checkout
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/python -m pytest -qThe 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
🐛 Found a bug or have a feature request? Open an issue on GitHub →
📫 Get in touch: contact@keplertech.io
License
Apache-2.0. See LICENSE.
Optional browser schematic
Requires naja-schematic 0.2.0 or later (the release containing the embeddable viewer API):
pip install "naja-scope[schematic]"Restart the MCP server after installation. Load a design as usual, then use:
open_schematic(path="top.u_cpu"): returns a local browser URL and focuses the instance. Omitpathfor the top. Anonymous#idinstances are supported.annotate_schematic(items=[{"path": "top.u_cpu", "message": "Check reset", "severity": "warning"}]): replaces the overlay. Usekind="term"with a pin/port path to annotate that terminal; annotations apply to the whole port, not individual bus bits. Passitems=[]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
24 toolsannotate_schematicA
Replace schematic annotations on instances or pins/ports. Returns the local viewer URL and count. Annotations clear when the design changes.
Inputs: items (required). Returns: result
findARead-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. Use 'state', not the regex '.state.'.
Parameters and package members are source intent: use get_intent.
Returns typed descriptors in matches plus
count, has_more, and an opaque next_cursor for pagination.
Inputs: pattern (required), kind, limit, cursor. Returns: result
get_content_hashARead-onlyIdempotent
Versioned SHA-256 of a model and its descendants, computed on demand. Compare elaborated content across snapshots using the same format_version. Names and IDs participate; source metadata and primitive definitions are excluded. Track naja_git_hash separately for engine changes. This is not functional equivalence. Large hierarchies can take time to hash.
Inputs: module. Returns: result
get_driversARead-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 20, max 200) with a truncated flag; no cursor —
raise limit to see more.
Inputs: path (required), limit. Returns: result
get_hierarchyARead-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.
Inputs: path, depth, limit, cursor. Returns: result
get_intentARead-onlyIdempotent
Retrieve source-level intent that netlist lowering erases (warm-only). Use when the answer is in the SystemVerilog or VHDL type/declaration, not the flattened gates: enum/typedef state names + encodings (incl. PACKAGE typedefs whose members live in another file), and symbolic PARAMETER or generic expressions (the formula behind a baked-in width). ref: a hierarchical path ('cva6.csr_regfile_i.priv_lvl_q'), a package member ('riscv::PLEN'), a parameter path ('top.inst.PARAM'), an instance path for its parameters, or a bare package name to list 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.
Inputs: ref (required), want. Returns: result
get_loadsARead-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 20, max 200) with a truncated flag; no cursor —
raise limit to see more.
Inputs: path (required), limit. Returns: result
get_module_cardARead-onlyIdempotent
Deterministic module summary: ports, instance counts by model, sequential cell and register-bit counts, bounded RAM/ROM details (width, depth, ports, initialization preview), and source ref. Clock/reset candidates are name-based guesses; verify before relying on them. Use this for one model's interface; use get_stats for counts below an instance.
Inputs: module (required). Returns: result
get_schematic_selectionARead-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.
Inputs: no named parameters. Returns: result
get_sourceARead-onlyIdempotent
Read the bounded source excerpt that produced an object (for example,
an SV FF instance maps to its always_ff block; a netlist cell maps to its
instantiation line). Use when exact source text is needed; use get_intent
for typedef/enum/parameter semantics. When the response lists origins
(e.g. Yosys src attributes), call again with origin=N to read that RTL.
Returns object, file, start/end range, text, and truncation status without
modifying files; missing paths and source ranges return structured errors.
Inputs: path (required), origin, context_lines. Returns: result
get_statsARead-onlyIdempotent
Summarize instance population by model below path or the top design.
Use this for aggregate leaf/sequential/model counts, register bits, and
RAM/ROM counts and capacity; 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,
total_models, and an empty models list by default. Pass limit or the
returned next_cursor to retrieve model details with pagination.
Register bits count modeled flip-flop/latch states, excluding memories;
unknown sequential bit counts are reported separately.
Inputs: path, limit, cursor. Returns: result
load_intentADestructive
Make the warm source-intent layer available for get_intent. Use after a
SystemVerilog or VHDL load that did not retain intent; do not call for
gate-level Verilog, and prefer 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.
Inputs: top, files, flist. Returns: result
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}.
Inputs: files (required). Returns: result
load_primitivesADestructive
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}.
Inputs: file, name. Returns: result
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).
Inputs: directory (required), intent. Returns: result
load_systemverilogA
Elaborate local SystemVerilog sources into the active design session.
Use this for SystemVerilog RTL; use load_vhdl for VHDL (beta), or
load_verilog with load_liberty/load_primitives for a
structural gate netlist. Requires at least files or flist and changes
the in-memory design session.
Anonymous lowered objects are addressable by #. defines are
preprocessor -D entries ("NAME" or "NAME=VALUE"). allow_unknown_designs=True
blackboxes any module still undefined instead of failing (e.g. undelivered
hard macros in a partly-open-source design). blackbox_multi_writer_memories
does the same for modules whose multi-writer memories naja cannot infer.
intent=True retains naja's in-engine SNL↔slang link for get_intent.
Inputs: top, files, flist, intent, +5 more. Returns: result
load_verilogA
Load local gate-level or structural Verilog into the active session.
First call load_liberty for Liberty cells or load_primitives for built-ins;
use load_systemverilog instead for RTL elaboration. Unknown modules fail
unless allow_unknown_designs is true. get_source shows the netlist
declaration of an object; for Yosys output, yosys_source_attributes=True
also records its RTL origins (get_source origin=N). get_intent cannot
answer for netlists.
Inputs: files (required), keep_assigns, allow_unknown_designs, yosys_source_attributes. Returns: result
load_vhdlA
Load VHDL into the active session (beta, restricted two-state RTL subset). Prefer passing every file of the design as one list (any order; units are resolved across files). Single-file calls still work: load package files first, then the top. Package-only files or entities awaiting generics may return top=null. Use hierarchy, cards and connectivity queries on the elaborated design. Use get_source for entity, port, signal, instance and process source references. intent=True enables get_intent for enum literals, record fields, generics and symbolic ranges. Unsupported constructs may fail during beta development. Returns the top summary when elaborated, language and beta status.
Inputs: file (required), top, intent, library. Returns: result
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.
Inputs: path. Returns: result
reset_universeADestructiveIdempotent
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}.
Inputs: no named parameters. Returns: result
resolveARead-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.
Inputs: path (required), kind, limit. Returns: result
save_snapshotADestructiveIdempotent
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.
Inputs: directory (required). Returns: result
statusARead-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.
Inputs: no named parameters. Returns: result
trace_coneARead-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.
Inputs: path (required), direction (required), max_frontier. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 24 tools
Every tool's description explicitly names the sibling tools it should not be confused with (get_drivers vs get_loads vs trace_cone, resolve vs find vs get_hierarchy, get_stats vs get_module_card, get_source vs get_intent, load_systemverilog vs load_verilog vs load_vhdl). The resource+action boundaries are sharply drawn, including edge cases like assign-glue traversal and pagination behavior. An agent can select confidently in nearly every situation.
The dominant pattern is verb_noun (open_schematic, load_snapshot, get_hierarchy, save_snapshot, load_intent), applied consistently across load/get/open/annotate families. A few tools break the pattern with bare verbs or nouns (status, resolve, find, reset_universe), though these remain readable and conventional for their function.
24 tools is at the high end, but the domain (multi-language elaboration, snapshotting, schematic UI, structural and connectivity queries) legitimately requires this breadth, and no tool appears redundant. The load_* family is large yet each entry covers a distinct source format or model set. Slightly heavy but well-scoped overall.
Coverage is strong: loading across SV/VHDL/Verilog/Liberty/primitives, session lifecycle (status, reset, save/load snapshot), intent layer management, hierarchy/connectivity/source/style queries, hashing, and schematic interaction. Minor gaps exist around exporting or deleting artifacts and no dedicated tool to list loaded files other than status, but no core workflow dead-ends.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Repository knowledge graph MCP server for codebase understanding and debugging.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseAqualityAmaintenanceThis MCP server enables AI agents to understand and analyze electrical schematics from Cadence and Altium for comprehensive design reviews through natural conversations.11677 npm68Apache 2.0
- AlicenseAqualityBmaintenanceLocal 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.182AGPL 3.0
- AlicenseNot gradedqualityDmaintenanceA lean MCP server that lets AI agents drive Xilinx Vivado for synthesis, implementation, simulation, and diagnostics through 30 curated tools and raw Tcl execution.Apache 2.0
- FlicenseAqualityDmaintenanceMCP server bridging ChatGPT-compatible clients to the Design Flow System, enabling project session management, draft import, round locking, and read-only access to design state and traceability.17-