{"slug": "show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp", "title": "Show HN: Naja-scope – Let AI agents explore SystemVerilog netlists over MCP", "summary": "Naja-scope, an MCP server built on the najaeda netlist engine, lets AI agents explore SystemVerilog netlists without pasting source code. In a head-to-head test on the CVA6 RISC-V core, it achieved 17/17 correct answers with 182k input tokens versus 10/17 and 888k tokens for grep-based file reading, demonstrating a 5× reduction in token usage.", "body_md": "**Let your AI assistant explore SystemVerilog designs — without pasting source code into the chat.**\n\nnaja-scope is an [MCP](https://modelcontextprotocol.io) server that gives AI\nagents (Claude, and any MCP-compatible assistant) a precise, structured view of\nyour elaborated SystemVerilog design. Instead of dumping thousands of lines of\nRTL into the model's context, the agent asks targeted questions — *what drives\nthis signal? what's inside this module? where does this net come from?* — and\ngets back small, exact answers with file-and-line references.\n\nBuilt on the [najaeda](https://github.com/najaeda/naja) netlist engine.\n\nLarge designs don't fit in a chat window. Pasting RTL is slow, expensive, and\nthe model still can't reliably trace connectivity across hierarchy. naja-scope\nturns your design into something an agent can *navigate*:\n\n- 🔎\n**Trace connectivity**— find what drives or loads any signal, across module boundaries. - 🌲\n**Walk the hierarchy**— explore modules, instances, and ports on demand. - 🎯\n**Jump to source**— every answer comes with`file:line`\n\nranges, so the agent can quote the exact RTL that matters. - 🧩\n**Logic cones**— trace fan-in / fan-out combinational cones up to the register boundary. - 💡\n**Recover design intent**— enum state names, struct/union fields, and parameter formulas that normally vanish when a design is elaborated.\n\nWorks on **RTL and gate-level netlists** alike: load elaborated SystemVerilog,\nor load a post-synthesis structural Verilog netlist together with its Liberty\nstandard-cell library and navigate the gates the same way (see\n[Gate-level designs](#gate-level-designs)).\n\nAll responses are token-bounded: lists paginate, large results truncate with clear markers. Your context stays small; your answers stay accurate.\n\nWe ran a head-to-head on [CVA6](https://github.com/openhwgroup/cva6) (a\nproduction RISC-V core): the same 17 design questions, answered by Claude once\nwith **only naja-scope** and once with **only grep/file reading** over the\nsource tree.\n\n| Approach | Correct answers | Conversation turns | Input tokens |\n|---|---|---|---|\nnaja-scope |\n17 / 17 |\n77 |\n182 k |\n| grep + read source | 10 / 17 | 123 | 888 k |\n\nMore correct answers, fewer back-and-forth turns, and **~5× fewer tokens** — the\nagent stops scrolling through files and goes straight to the structural answer.\n\n```\npip install naja-scope        # pulls najaeda and the MCP runtime from PyPI\nnaja-scope-mcp                # stdio MCP server\nclaude mcp add naja-scope -- naja-scope-mcp\n```\n\nOr add it to any MCP client's config:\n\n```\n{\n  \"mcpServers\": {\n    \"naja-scope\": {\n      \"command\": \"naja-scope-mcp\"\n    }\n  }\n}\n```\n\nThen just ask your assistant to load a design and start exploring:\n\n\"Load my UART design from`rtl/uart.sv`\n\nwith top`uart_top`\n\n, then show me everything that drives`tx_o`\n\n.\"\n\nThe agent loads the design once and answers follow-up questions instantly — no re-reading source, no giant pastes.\n\nChatGPT connects to MCP servers over an **HTTP endpoint** (custom connectors /\nDeveloper mode), so run naja-scope as an HTTP server instead of stdio:\n\n```\nnaja-scope-mcp --transport streamable-http --host 127.0.0.1 --port 8000\n```\n\nThis serves MCP at `http://<host>:8000/mcp`\n\n. Because ChatGPT reaches the server\nover the network, expose that URL where ChatGPT can see it — e.g. a public\ntunnel for a local run:\n\n```\n# example: a tunnel to your local server (ngrok, cloudflared, …)\nngrok http 8000        # -> https://<something>.ngrok.app  →  add /mcp\n```\n\nThen in ChatGPT, open **Settings → Connectors** (enable Developer mode if\nneeded), **add a custom connector**, and paste the server URL\n(`https://<your-host>/mcp`\n\n). Once connected, ask it to load a design and explore\nexactly as above. (ChatGPT's connector UI evolves; the constant is: it needs an\nHTTPS MCP URL, which `--transport streamable-http`\n\nprovides.)\n\n⚠️ The HTTP server has no built-in auth — only expose it over a trusted tunnel, and prefer short-lived tunnels for local experiments.\n\nAlready 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:\n\n\"Load the Liberty library`pdk/stdcells.lib`\n\n, then the gate netlist`build/top.v`\n\n, and tell me what cells`top`\n\nis built from and what drives`data_out`\n\n.\"\n\nHierarchy, per-cell counts (`get_module_card`\n\n), drivers/loads, and logic cones\nall work on the netlist; cones stop at the sequential cells. A gate netlist\ncarries no source line info, so `get_source`\n\napplies to RTL only. A runnable\nexample lives in [ examples/](/najaeda/naja-scope/blob/main/examples) (\n\n`stdcells.lib`\n\n+ `counter2.v`\n\n+\n`gate_level.py`\n\n).Once a design is loaded, your assistant can:\n\n**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.**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.\n\nA runnable end-to-end walkthrough lives in [ examples/](/najaeda/naja-scope/blob/main/examples).\n\n- Python 3.10+\n- Works anywhere\n`najaeda`\n\nruns (Linux, macOS, Windows)\n\n```\n# from a checkout\npython3 -m venv .venv\n.venv/bin/pip install -e .\n.venv/bin/python -m pytest -q\n```\n\nThe full test suite runs against a plain `pip install`\n\nof `najaeda`\n\n— no native\nbuild required. The CVA6 cross-hierarchy cone regression\n(`tests/test_zzz_cone_cva6.py`\n\n) is slow and skips automatically unless a CVA6\nsnapshot is present.\n\n- 🐛\n**Found a bug or have a feature request?**[Open an issue on GitHub →](https://github.com/najaeda/naja-scope/issues) - 📫\n**Get in touch:**[contact@keplertech.io](mailto:contact@keplertech.io)\n\nApache-2.0. See [LICENSE](/najaeda/naja-scope/blob/main/LICENSE).", "url": "https://wpnews.pro/news/show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp", "canonical_source": "https://github.com/najaeda/naja-scope", "published_at": "2026-06-30 14:31:03+00:00", "updated_at": "2026-06-30 14:50:18.678802+00:00", "lang": "en", "topics": ["ai-tools", "ai-agents", "developer-tools"], "entities": ["naja-scope", "najaeda", "CVA6", "Claude", "ChatGPT", "MCP", "SystemVerilog", "RISC-V"], "alternates": {"html": "https://wpnews.pro/news/show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp", "markdown": "https://wpnews.pro/news/show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp.md", "text": "https://wpnews.pro/news/show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp.txt", "jsonld": "https://wpnews.pro/news/show-hn-naja-scope-let-ai-agents-explore-systemverilog-netlists-over-mcp.jsonld"}}