opensta-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@opensta-mcpload my design and report worst setup slack, TNS, and WNS"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
opensta-mcp
An MCP server that keeps one OpenSTA process alive for the whole conversation and exposes static timing and power analysis as nine tools. An agent (Claude Code, or any MCP client) loads a design once, then asks questions; the server translates each question into OpenSTA Tcl, runs it in the live session, and returns the result with the exact command it ran.
Claude Code ──JSON-RPC over stdio──▶ opensta-mcp (Python) ──Tcl over stdin/stdout──▶ sta
◀────────────────────── ◀────────────────────────The left pipe carries request ids; the right pipe is plain text and carries none. Everything
in session.py exists because of that asymmetry.
Tools
tool | what it does |
| reads the design ( |
| worst setup/hold slack, TNS/WNS, min period and fmax per clock, DRV violation counts, cell/net counts |
|
|
| power by group and component, optionally the N highest-power instances; always states whether switching activity came from a VCD/SAIF or from OpenSTA defaults |
| any other OpenSTA command, sandboxed and journaled; shows printed output and the Tcl return value; |
| names of the OpenSTA commands matching a glob; for when the agent does not know a command's name |
| what sta is doing now; works even while another tool is waiting |
| the files, constraint changes, activity source and scenes a result was computed under; every result ends with |
| the only way the sta process is restarted; after sta dies every other tool is refused until this is called |
Every analysis result (the report tools, get_summary, load_design, and run_tcl when it runs a
report_* command) ends with one line naming its conditions, e.g.
[conditions #2] liberty: sky130_fd_sc_hd__tt_025C_1v80 | sdc: 6_final.sdc +1 change by run_tcl | spef: 6_final.spef.
The number advances on load_design and on every state-changing run_tcl, so two results with
the same number were computed under the same conditions. The count is by the text sent, so a
command OpenSTA accepts but ignores, or a read_sdc of an empty file, is counted too. load_design
on a running sta reads the SDC on top of the earlier state; the line then says so and earlier
run_tcl changes are listed apart. Call restart_session first for a clean state.
Anything not covered by a dedicated tool goes through run_tcl. Commands that recur in the
journal are candidates for promotion to a dedicated tool.
Related MCP server: Fusion Compiler Session MCP
Install
git clone https://github.com/InsungHeo/opensta-mcp && cd opensta-mcp
python3 -m venv .venv && source .venv/bin/activate
pip install -e . # adds the `opensta-mcp` and `opensta-mcp-probe` commands
which sta # OpenSTA must be on PATH, or set STA_BINRegister with Claude Code (adjust paths):
claude mcp add opensta \
--env STA_BIN=/path/to/OpenROAD/bin/sta \
-- /path/to/opensta-mcp/.venv/bin/opensta-mcpor copy examples/claude_mcp.json into your project's .mcp.json.
Claude Code on Windows, OpenSTA in WSL. A Windows claude cannot execute a Linux path, and
--env sets a Windows-side variable that does not cross into WSL. Launch the server through
wsl.exe and set the variable inside it:
claude mcp add --scope user opensta -- \
wsl.exe -d Ubuntu-24.04 --exec env STA_BIN=/home/<you>/OpenROAD-flow-scripts/tools/install/OpenROAD/bin/sta \
/home/<you>/opensta-mcp/.venv/bin/opensta-mcp
claude mcp list # should show opensta as connected--exec matters: without it the command goes through a shell first, which expands $VAR and
$(...) before your own settings apply.
Two Windows shell traps seen in practice:
PowerShell 5.1 drops
--when calling a native program, soclaudereads-das its own option (unknown option '-d'). Run the command from Git Bash orcmdinstead.Git Bash rewrites
/home/...into a Windows path. Prefix the command withMSYS_NO_PATHCONV=1.
Configuration (environment variables)
variable | default | meaning |
|
| OpenSTA binary |
|
| extra arguments |
|
| where sessions and ownership files live |
|
|
|
|
| seconds of silence before the server checks whether sta is idle |
|
| characters returned per tool call before truncation (about 150 report lines) |
|
| server log level (stderr + |
What a session leaves behind
~/.opensta-mcp/sessions/20260926_153012_4242/
journal.jsonl every command: tool, arguments, Tcl sent, ok/error, seconds, warning count
replay.tcl only the state-changing commands; `sta replay.tcl` reproduces the session by hand
warnings.log every warning line, grouped by command (OpenSTA prints warnings on stdout)
sta.stderr.log the sta process's stderr, for crash traces
server.log the server's logtail -f journal.jsonl in another terminal shows what the agent is doing in real time.
Design decisions
One live process, not one per query. Liberty/SPEF loading dominates; constraints set earlier must still apply later.
Scripts travel as base64 data. The stdin line is always a complete Tcl command (
__mcp_run <id> <base64>), so an unbalanced brace becomes a caught error instead of an interpreter waiting for more input.catchdecides success. The Tcl side reports__MCP_ERR__ <id>before the error text; the server never guesses from output patterns.A per-request end marker.
__MCP_DONE__ <id>with a fresh id per command, matched as a whole line, so late output from an abandoned command is recognised and dropped.One lock in front of the pipe. The MCP side may send requests concurrently; the sta side cannot tell them apart.
No automatic restart. Death, computing and stalled are distinguished (
/proc/<pid>/stat) and reported with a diagnosis. After sta dies every command is refused untilrestart_session, so nothing runs silently on a fresh sta that lacks the design and constraint changes.Dies with its parent.
PR_SET_PDEATHSIG, spawned from the reader thread so the signal is tied to the process lifetime. Ownership files let a new server reap orphans left by a crashed one, and only those.Sandbox, inside the interpreter.
exec exit socket source cd loadare deleted from the Tcl interpreter (the session stops sta by closing its stdin);openis wrapped to allow reading only (OpenSTA's ownread_sdcandincluderead files through Tclopen, so removing it breaks them; the first real-OpenSTA run found this);filekeeps read-only subcommands;renameandinterpare deleted last, so nothing can be brought back, not even from a file read withinclude;auto_noexecstops Tcl from running a program for an unknown word. OpenSTA's own file writers (at any command position) and> fileredirection are allowed only under the session directory (only the output argument is checked; library and model inputs may live anywhere). The originalopenandfileremain reachable inside the interpreter under internal names, so a script written to find them can still write files: this guards against accidents and careless prompts, not against a determined user. The sta process runs with the user's permissions.Every argument is quoted. Bus bits like
reg_next_pc[31]would otherwise be read as a command substitution; OpenSTA itself is deprecating unquoted bus names (ChangeLog 2026-09-24).stdout is for JSON-RPC only. Server logs go to stderr and a file.
Errors carry a fix hint when the cause is Tcl, not OpenSTA. An unquoted
reg_next_pc[31]$_SDFFE_PN0P_/Dfails asinvalid command name "31"; the error says to use braces.
Checking the tool before trusting the design
opensta-mcp-probe --liberty LIB.lib --verilog design.v --top TOP --sdc c.sdc --spef d.spef --json probe.jsonprints whether this OpenSTA supports -format json, whether output is buffered when piped,
which stream warnings use, and how long each load step takes. These answers decide the output
format and the stderr handling for your version.
Tests
pip install -e ".[dev]"
pytest # uses tests/fake_sta.py, no OpenSTA needed
OPENSTA_MCP_INTEGRATION=1 STA_BIN=sta pytest # also runs the real-sta round tripStatus and limits
Built for a talk on agent-driven timing analysis (September 2026).
Tested: OpenSTA 3.1.0 (the
stabuilt by OpenROAD-flow-scripts) on Linux / WSL2, Python 3.12, MCP Python SDK 1.x.Not a security boundary against a determined user: the sandbox stops accidents and careless prompts; the sta process itself runs as you and can read what you can read.
MCP SDK: pinned to
mcp<2. SDK 2.x renamedFastMCPtoMCPServer; migration is planned.OpenSTA versions: 3.x. Older releases call
-group_path_count-group_count, soreport_timingfails there (userun_tcl).macOS: should work but is untested. Stall detection reads
/proc; without it the server never declares a stall and reports the process state as unknown.Windows: run the server in WSL (see Install).
OpenSTA bug worked around:
report_power -highest_power_instances Nfails in OpenSTA 3.1.0 (and on master as of 2026-09-24) becausepower/Power.tclcalls a prochighest_power_instancesthat does not exist.report_power(top_instances=N)checks for that proc and, when it is missing, calls the underlyingsta::report_power_highest_instsdirectly.
License
MIT
Available Tools
9 toolsfind_commandsA
Names of the OpenSTA commands matching a glob pattern (e.g. "power", "report_*"). Use this when you do not know a command's name or run_tcl answered "invalid command name". Returns names only; read a command's description and options with run_tcl "help ".
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | No | * |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the load, and it does well: it discloses that only names are returned ('Returns names only'), not descriptions or options, and points to the remedy. It does not state read-only semantics explicitly, but the read-only nature is strongly implied by the query-style behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the return value and followed by usage and follow-up guidance. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not required, yet the description still clarifies that only names come back. Combined with usage triggers and glob examples, nothing an agent needs 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single pattern parameter, so the description must compensate; it does so with concrete glob examples ('*power*', 'report_*'). It stops short of describing the default or pattern syntax rules, but the examples convey the intended format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: returns OpenSTA command names matching a glob pattern. It is clearly distinguishable from siblings like run_tcl and report_timing, and the glob examples make the scope immediately concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two explicit trigger conditions ('you do not know a command's name' or 'run_tcl answered "invalid command name"') and a named follow-up action (run_tcl "help <name>"). The agent knows both when to call this and what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conditionsA
The analysis conditions behind a result: the Liberty, netlist, SDC and
SPEF files (full paths), every constraint change made through run_tcl
since, the switching-activity source and the scenes. Analysis results end
with "[conditions #n]"; pass that n as state to see the conditions they
were computed under, or 0 for the current state. Answers from the session
journal, so earlier states can be read even after sta died.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that answers come from the session journal, so earlier states remain readable even after sta died. That persistence/source detail is genuinely useful behavioral context. It does not mention permissions, cost, or error behavior, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with what the tool returns and followed by the actionable usage rule and the persistence caveat; little waste. The enumeration is dense and the line-break artifact mid-sentence slightly hurts flow, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not strictly required, yet the description still conveys the content shape and the crucial `state` usage rule plus journal-backed persistence. For a one-parameter read tool this is close to complete, with only edge details (valid state range, post-restart behavior) missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single `state` parameter, so the description must compensate and largely does: it explains to pass the n from "[conditions #n]" or 0 for current state. It does not state the default or the range of valid n values, leaving a small gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (retrieve/see) and a well-defined resource: the analysis conditions behind a result, enumerated as Liberty, netlist, SDC, SPEF files, run_tcl constraint changes, switching-activity source, and scenes. It does not explicitly contrast itself with siblings like get_summary or get_status, so it stops short of a 5, but an agent can tell what this returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete when-to-use instructions tied to output: results end with "[conditions #n]", pass that n as `state`, or 0 for the current state. This is a clear trigger condition, though it does not name an alternative tool or state when not to use it, so it falls short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
What the OpenSTA session is doing. Safe to call at any time, including while another tool is waiting: shows the running command and its elapsed time, whether sta is computing or idle, the loaded design and its state number, constraint changes made through run_tcl, and the session log directory.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full behavioral burden and does disclose the key trait that it is concurrency-safe while another tool is blocking. It also enumerates what state is exposed (running command, elapsed time, computing/idle, design state number, run_tcl constraint changes, log directory). It stops short of edge cases such as behavior when no design is loaded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with a one-line purpose, then a single sentence listing returned state, which is efficient. Some enumerated return items arguably duplicate the available output schema, making it slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an output schema for the return shape, and no annotations, the description covers what an agent needs: what it reports and that it is safe to call concurrently with a blocking tool. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the schema baseline of 4 applies. The description appropriately avoids inventing parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource — the status of the OpenSTA session ('What the OpenSTA session is doing') — so the agent knows this returns session state rather than timing or power data. However, it never distinguishes itself from the overlapping sibling get_summary or get_conditions, leaving the agent to guess which status-like tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage context: 'Safe to call at any time, including while another tool is waiting,' which tells the agent it can be invoked concurrently with other calls. It does not, however, name an alternative or state when a sibling like get_summary would be preferred instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_summaryA
Timing and size summary as numbers: worst setup/hold slack, TNS, WNS, minimum clock period and fmax per clock, design-rule violation counts, cell and net counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only describes output content. It does not state that this is a read-only query, nor that a design must be loaded first (a real prerequisite in EDA sessions), nor any unit conventions. The risk is low for a summary getter, but the disclosure gap is real.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence followed by a compact metric list; every item earns its place and there is no filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values, yet it does so anyway (harmless). The missing piece is the operational context: whether a design must be loaded and what units the numbers use, which matters in a session-based EDA tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document; baseline for a no-param tool is 4. The description correctly avoids inventing arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Timing and size summary as numbers') and enumerates the exact metrics returned (slack, TNS, WNS, clock period, fmax, DRC counts, cell/net counts). It distinguishes itself from report_timing/report_power by framing itself as a numeric summary, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this versus the sibling report_timing or report_power tools. Usage is only implied by the content enumeration ('summary as numbers'), which suggests a quick overview rather than a detailed report, but the agent must infer this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
load_designA
Load a design into the OpenSTA session. Call this once before any analysis.
liberty: Liberty (.lib) file path, or a list of paths verilog: gate-level netlist (.v) path top: top module name to link sdc: SDC constraints file (optional but required for meaningful timing) spef: parasitics file (optional; without it delays use wire-load / no parasitics)
Returns per-step timings and a digest of warnings. Warnings raised here (unmatched SPEF nets, missing cells, unconstrained ports) affect every later result, so read them. Starts a new analysis state (see get_conditions). Loads on top of the running sta: to drop earlier constraints and run_tcl changes, call restart_session first.
| Name | Required | Description | Default |
|---|---|---|---|
| sdc | No | ||
| top | Yes | ||
| spef | No | ||
| liberty | Yes | ||
| verilog | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: it discloses that loading is additive on top of a running session, that it starts a new analysis state, that warnings (unmatched SPEF nets, missing cells, unconstrained ports) propagate to all later results, and that it returns per-step timings plus a warning digest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then a tight parameter glossary, then behavioral caveats — every line carries information the agent cannot get from the schema, and the caveats are ordered by importance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, it still summarizes the return payload and, more importantly, supplies the state model, sequencing, and warning-propagation context that structured fields cannot express for a setup tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and does: it documents all five parameters in-line, including liberty's string-or-list form, the optional-but-consequential nature of sdc ("required for meaningful timing") and spef ("without it delays use wire-load / no parasitics").
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Load a design into the OpenSTA session") and immediately scopes its role in the workflow ("Call this once before any analysis"), which distinguishes it cleanly from sibling reporting/tcl tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the invocation point (once, before any analysis) and routes the agent to the correct alternative: restart_session is named as required first when earlier constraints must be dropped, and get_conditions is cross-referenced for the new analysis state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_powerB
Report power by group (sequential, combinational, clock, macro, pad) and component (internal, switching, leakage), in watts.
top_instances: also list this many highest-power instances (0 = none) format: "text" table or "json" (the instance list is always text)
The result states where switching activity came from: a VCD/SAIF read through run_tcl, or OpenSTA's default activity (then values are estimates).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | text | |
| top_instances | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose valuable behavior: output is in watts, and the switching-activity provenance (VCD/SAIF read through run_tcl vs OpenSTA default, in which case values are estimates). However, it says nothing about permissions, that this is purely read-only, or any side effects/rate characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then per-parameter notes, then a provenance caveat. Every sentence carries information, though the embedded parameter notes read like schema comments rather than prose and the final paragraph is slightly disjointed from the opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description still adds the key interpretive note about where switching activity came from. Given two optional params and no annotations, it is nearly complete, missing only explicit read-only/safety framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely does: top_instances is defined as 'list this many highest-power instances (0 = none)' and format as a 'text' table or 'json', adding the non-obvious caveat that the instance list is always text. Only minor gaps remain (defaults, interaction with hierarchy).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (report power) and enumerates the exact breakdown dimensions (sequential, combinational, clock, macro, pad groups; internal, switching, leakage components) plus units (watts). This is clearly distinct from report_timing and get_summary by domain, though the description never explicitly routes against siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance. It never says to prefer this over get_summary or report_timing, nor what prerequisites (e.g., a loaded design, prior run_tcl activity read) are needed. The usage context is only inferable from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_timingA
Report timing paths (OpenSTA report_checks).
path_delay: "max" = setup paths, "min" = hold paths path_count: paths per path group (-group_path_count) scope: "reg2reg" = register to register only, "in2reg" = from input ports, "reg2out" = to output ports, "all" = no restriction from_pin / to_pin: restrict to a start or end point (pin, port or instance name; bus bits like reg_next_pc[31] are fine, they are quoted for you) fields: include input-pin rows (separates wire from cell delay) and slew, capacitance, fanout and net columns format: "end" and "summary" are one line per path; "json" only if this OpenSTA supports it (check with run_tcl "help report_checks") timeout_s: 0 = wait as long as it takes (a stalled sta is still detected)
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | all | |
| fields | No | ||
| format | No | full | |
| to_pin | No | ||
| from_pin | No | ||
| timeout_s | No | ||
| path_count | No | ||
| path_delay | No | max |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does disclose real behaviors: bus bits are auto-quoted, timeout_s=0 means wait indefinitely with stall detection, and json format may be unsupported. It does not state that this is a non-destructive read, nor that a design/session must already be loaded, which are meaningful gaps for a stateless-looking call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one line followed by a tight per-parameter list with no filler prose. Only weakness is that the two default formats, 'full' and 'full_clock_expanded', are never explained, so the list is slightly asymmetrical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with 0% schema coverage and no annotations, the description supplies nearly all parameter meaning, and the existing output schema removes the need to document return values. The remaining gaps are the missing design-loaded prerequisite and unexplained 'full'/'full_clock_expanded' formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: it defines path_delay, path_count, scope enum values, from_pin/to_pin targeting rules, fields, format, and timeout_s semantics. Seven of the eight parameters get explicit meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Report timing paths') and names the underlying command (OpenSTA report_checks), which pins down exactly what executes. It is clearly distinct from siblings like report_power or get_summary without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context (static timing analysis) is implied by the parameter glossary, and there is one routing hint ('check with run_tcl "help report_checks"' before using json format). However there is no explicit when-to-use vs when-not, and no guidance on required preconditions such as a loaded design relative to siblings like load_design or get_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_sessionA
Stop the sta process and start a fresh one. The loaded design and any constraint changes are lost; call load_design again. Use this after get_status reports sta as exited, stalled, or holding an unfinished command.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it discloses the destructive side effect ('The loaded design and any constraint changes are lost') and the necessary follow-up ('call load_design again'). It does not mention whether the restart requires specific permissions or how long it takes, so it falls just 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: one states the action, one states the consequence and required follow-up, one states the trigger condition. Front-loaded with the core action; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, zero parameters, and complexity from the destructive nature of the operation, the description covers all an agent needs: what it does, what is lost, what to call afterward, and when to use it. An output schema exists, so no return-value details are required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description appropriately adds nothing about parameters because there are none, and the schema is trivially complete. No parameter-related content is needed or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Stop the sta process and start a fresh one.' The agent knows exactly what this does, and it is clearly distinguishable from siblings like get_status (read state), load_design (load design), and run_tcl (execute commands).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition: 'Use this after get_status reports sta as exited, stalled, or holding an unfinished command.' It names the sibling tool to check first and enumerates the trigger states, leaving no ambiguity about when to invoke restart_session rather than other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_tclA
Run any OpenSTA Tcl command(s) in the live session.
Rules:
OpenSTA syntax. Unsure of a command name? Use find_commands. Unsure of its options? Run
help <command>here first.Wrap bus bit names in braces: -to {reg_next_pc[31]}.
exec, exit, socket, source, cd and load are disabled. Files (reports via
> file, write_* commands) can be written only under the session directory shown by get_status.State changes made here (read_*, set_*, create_*, ...) stay in effect, start a new analysis state and are listed by get_conditions.
The script's Tcl return value is returned too, so
putsis not needed.Long output is truncated; narrow the query instead of asking for everything. timeout_s: 0 = no limit. sta is never restarted automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | ||
| timeout_s | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it lists the disabled commands (exec, exit, socket, source, cd, load), the file-write sandbox tied to the session directory, state persistence and how it surfaces via get_conditions, output truncation behavior, and timeout semantics. This is exactly the safety and side-effect context a raw eval tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then uses a tight bulleted rule list where each entry carries distinct information (syntax, sandboxing, state, return value, truncation, timeout). Dense but no sentence is filler; slightly long for the payoff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers sandboxing, disabled commands, state side-effects, output limits and timeout for a high-power arbitrary-execution tool. An output schema exists, yet the description still usefully clarifies that the Tcl return value is returned and that puts is unnecessary, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it documents OpenSTA syntax expectations, the brace-wrapping rule for bus bit names with a concrete example, and clarifies timeout_s (0 = no limit) and the default. It adds real meaning beyond the bare 'command' string, though not exhaustively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run any OpenSTA Tcl command(s) in the live session'), immediately distinguishing it from siblings like find_commands (discovery) and get_status (read-only introspection). An agent can tell what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional routing: use find_commands when unsure of a command name and `help <command>` when unsure of options, and covers the timeout semantics. It does not, however, tell the agent when to prefer the dedicated siblings (report_timing, report_power, get_summary) over hand-written Tcl, which is the main routing decision for this tool.
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.
9 tool updates
v0.1.0- First observed
find_commands - First observed
get_conditions - First observed
get_status - First observed
get_summary - First observed
load_design - First observed
report_power - First observed
report_timing - First observed
restart_session - First observed
run_tcl
TDQS
Scored across 9 tools
Most tools have clearly distinct purposes: load_design loads, report_timing/report_power produce specific reports, restart_session resets, etc. However, run_tcl is a general escape hatch that overlaps functionally with report_timing and report_power, and get_status vs get_conditions both report session state, creating some potential for misselection. Descriptions mitigate this well.
All tool names follow a consistent snake_case verb_noun pattern (get_summary, load_design, report_timing, run_tcl, find_commands, get_status, get_conditions, restart_session). There are no deviations in casing or style.
Nine tools is a well-scoped set for an STA server. Each tool covers a distinct operation (load, report, inspect, reset, discover) and there is no redundant tool that could be removed without losing functionality.
The surface covers the full lifecycle: loading a design, querying conditions/status, producing timing and power reports, discovering commands, running arbitrary Tcl, and restarting. Missing specialized reports (e.g., area, clocks) can be accessed via run_tcl, so there are no dead ends.
Maintenance
Related MCP Connectors
Authenticated async Opus 5.5 agent with status polling and artifact results.
51Scoped agent execution. Server-side credentials, policy, budgets and verifiable receipts.
Hosted MCP memory and agent control plane for durable conversations, jobs, and operations.
Authenticated async Opus 4.8 Agent agent with status polling and artifact results.
Related MCP Servers
- AlicenseBqualityBmaintenanceMCP server for elaborated SystemVerilog and gate-level netlists. Agents query design structure against a real elaboration - what drives this net, what a module instantiates, what registers are in a fanin cone - instead of reading RTL files. Answers come from najaeda's netlist engine, so they reflect post-elaboration connectivity across hierarchy, not text matches.20159 PyPI16Apache 2.0
- -licenseNot gradedqualityNot gradedmaintenanceEnables starting and managing named independent PTY sessions for Synopsys Fusion Compiler, sending arbitrary Tcl commands, and listing/interrupting sessions via MCP.-
- -licenseNot gradedqualityNot gradedmaintenanceManages a persistent Fusion Compiler session via PTY, enabling Tcl command execution and common EDA queries through an MCP interface.-
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to directly launch, control, and analyze AMD/Xilinx Vivado on Windows and Linux, supporting project management, synthesis, implementation, bitstream generation, timing/resource analysis, and simulation through a persistent Tcl session.34 PyPIMIT