Skip to main content
Glama
theerayutbo

RedPitayaCore-MCP

by theerayutbo

RedPitayaCore-MCP

A local MCP server for safe Red Pitaya diagnostics, RX access, and bounded offline FPGA development from Claude Code. It targets an operator-managed STEMlab 125-14 running official Red Pitaya OS 3.00-57 with Pavel Demin sdr_transceiver 1.0-20260302 build cbecbdd4. Those values are a compatibility target, not facts inferred from an open port or device response.

The server starts in deterministic mock mode, with no target host and no hardware traffic. Its live surface is deliberately narrow: bounded metadata and connection diagnostics, optional fixed read-only SSH diagnostics, and explicitly enabled RX control/data. A separate local FPGA surface can inspect and edit an explicitly selected HDL workspace, plan named register operations, run an operator-configured Vivado toolchain, inspect generated artifacts, and produce ILA Tcl plans. It has no dedicated tool for loading an FPGA image, accessing live MMIO, capturing an ILA, or transmitting RF, and its generated Tcl requests none of those actions.

Safety boundary

  • RP_MODE=mock is the default and requires no hardware.

  • Live mode requires an explicit unicast IPv4 RP_HOST chosen by the operator.

  • Live RX requires RP_ALLOW_RX=true at process startup and acknowledge_side_effects=true on rp_rx_connect.

  • RX connect and disconnect change device state: role 0 resets tuning/rate, role 1 resets the RX FIFO, and closing control resets tuning.

  • The upstream TCP protocol has no acknowledgement. connected does not prove the server accepted a role or setting.

  • RP_ALLOW_LIFECYCLE=true enables lifecycle execution in mock mode only. Live start and stop remain blocked because startup may program the FPGA and stop changes global controller ownership.

  • All sample values, including mock data, are uncalibrated units.

  • This MCP has no TX path and does not force the board's outputs off. Actual hardware TX state remains unknown_not_read; another client may control it.

  • Local FPGA permissions are independent of RP_MODE. Enabling project writes or builds in mock mode changes local files or starts Vivado. Trusted HDL, XDC, simulator and vendor code can perform arbitrary actions with the build user's OS, network and device access, outside this MCP's dedicated transport adapters.

  • rp_fpga_hardware_plan is always non-executing. No environment variable turns bitstream loading, register writes, or TX into executable operations.

Read the protocol boundary, provenance, and security policy before enabling live RX. See the FPGA development guide before enabling local writes or builds.

Related MCP server: corporate-mcp-system-inspector

Requirements

  • Python 3.11 or newer

  • Claude Code with local stdio MCP support

  • Optional for live system diagnostics: the system ssh client, existing key authentication, and a verified known_hosts entry

  • Optional for real local FPGA builds: a licensed Linux Vivado installation and an operator-selected absolute executable path

The dependency mcp>=1.30,<2 is intentional. It uses the official Python SDK 1.x maintenance line and avoids silently adopting an unreviewed major version.

Install

Clone the public repository and create an isolated environment:

git clone https://github.com/theerayutbo/RedPitayaCore-MCP.git
cd RedPitayaCore-MCP
python3.11 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .

When using uv, install exactly the reviewed lock file included in the clone:

uv sync --frozen

Run the server directly with either entry point:

.venv/bin/redpitayacore-mcp
# or
.venv/bin/python -m redpitayacore_mcp

The stdio transport reserves stdout for MCP protocol messages. Operational logs must go to stderr; do not wrap the command with scripts that print to stdout.

Add to Claude Code

For safe mock mode at project scope:

claude mcp add --scope project --transport stdio \
  -e RP_MODE=mock \
  redpitaya-core -- \
  /absolute/path/to/RedPitayaCore-MCP/.venv/bin/redpitayacore-mcp

Environment options must appear before the server name. Replace the absolute path with your clone location. You can also adapt examples/claude-mcp.json as a project .mcp.json. The committed example is mock-only and contains no credentials or local address.

Confirm registration, then ask Claude Code to call rp_profile or rp_connection_status. These remain local mock operations.

Configuration

Configuration belongs to the server process, not MCP tool arguments.

Variable

Default

Meaning

RP_MODE

mock

mock or live

RP_HOST

unset

Required explicit unicast IPv4 in live mode

RP_PORT

1001

SDR TCP port

RP_HTTP_PORT

80

HTTP metadata port

RP_TIMEOUT

3

I/O timeout from 0.1 through 10 seconds

RP_ALLOW_RX

false

Operator permission for live RX state changes

RP_ALLOW_LIFECYCLE

false

Permission for mock lifecycle execution only

RP_SSH_USER

unset

Enables optional fixed read-only SSH diagnostics

RP_SSH_PORT

22

SSH port

RP_PROJECT_ROOT

unset

Absolute existing local FPGA workspace directory

RP_ALLOW_PROJECT_WRITE

false

Allows bounded HDL/XDC writes inside the project root

RP_ALLOW_LOCAL_BUILD

false

Allows real local Vivado jobs; also requires project-write permission

RP_VIVADO_EXECUTABLE

unset

Absolute path to the operator-selected Vivado executable

RP_BUILD_TIMEOUT

300

Local build timeout from 0.1 through 3,600 seconds

The sample .env.example is documentation; the server reads its process environment and does not need an environment file. Do not commit a live address, username, credentials, private key, or captured device output.

For a live board, prefer user scope so target details stay out of a shared project configuration:

claude mcp add --scope user --transport stdio \
  -e RP_MODE=live \
  -e 'RP_HOST=<BOARD_IPV4>' \
  -e RP_ALLOW_RX=false \
  redpitaya-core -- \
  /absolute/path/to/RedPitayaCore-MCP/.venv/bin/redpitayacore-mcp

Replace <BOARD_IPV4> before running that command. Start with RX disabled. This registration permits safe diagnostics only. If you later enable live RX, do so in your user-local configuration after completing hardware acceptance. SSH is optional and unavailable until RP_SSH_USER is set; it uses fixed read-only commands, strict host-key checking, and existing key authentication. The project does not store keys or passwords.

MCP tools

The server exposes 25 tools: the original nine SDR/device tools and 16 offline FPGA-development tools. The FPGA tools are prefixed rp_fpga_.

Device and RX tools

Tool

Behavior

rp_profile

Reports configured mode and operator-reported compatibility target

rp_device_diagnostics

Reads bounded HTTP application/device metadata

rp_connection_probe

Connects to the configured SDR port, sends no bytes, and closes

rp_system_diagnostics

Runs fixed read-only OS/app/process/FPGA SSH checks; unavailable unless configured

rp_app_lifecycle

Plans start or stop; dry_run=true by default; execution is mock-only

rp_rx_connect

Opens RX control/data with validated frequency and rate; live use requires both permission gates

rp_rx_read

Reads bounded little-endian float32 I/Q; defaults to 2,048 samples and 8 previews

rp_rx_disconnect

Closes RX sockets; closing control resets tuning upstream

rp_connection_status

Reports local socket state and explicitly unknown hardware TX state

FPGA development tools

Tool

Behavior

rp_fpga_capabilities

Reports workspace/toolchain availability and explicit hardware limits

rp_fpga_diagnostics

Reads the same fixed SSH FPGA/overlay/installed-file evidence without MMIO

rp_fpga_register_map

Shows the source-pinned instance-1 register profile; performs no access

rp_fpga_register_plan

Validates one named, width-limited read/write proposal; never executes it

rp_fpga_hardware_plan

Lists blockers and interlocks for image load, register write, or TX burst

rp_fpga_project_info

Lists bounded HDL, XDC, and artifact paths below RP_PROJECT_ROOT

rp_fpga_read_source

Reads bounded UTF-8 RTL/XDC and returns its SHA-256

rp_fpga_write_source

Creates or SHA-guardedly replaces bounded RTL/XDC when locally enabled

rp_fpga_inspect_artifact

Hashes a bounded .bit, .bin, .dtbo, .ltx, .rpt, or .dcp file

rp_fpga_read_report

Reads bounded .rpt or .ltx text as untrusted output

rp_fpga_manifest

Binds local hashes to a claimed part/source revision in an unapproved proposal

rp_fpga_build

Dry-runs by default; real trusted-code execution also needs explicit per-call acknowledgement

rp_fpga_build_status

Returns state and a bounded output tail for an owned job

rp_fpga_build_cancel

Cancels an owned job and terminates its process group on POSIX

rp_fpga_build_report

Reads the timing, utilization, or DRC report from an owned job

rp_fpga_ila_plan

Generates exact-net ILA insertion Tcl; does not rebuild, deploy, or capture

Artifact inspection checks extension, size, and SHA-256 only. It does not parse the format or prove the target board. A manifest is not signed or approved, and its claimed source revision is not verified against the artifact. A successful Vivado process does not by itself establish timing closure, correct logic, board compatibility, or safe RF behavior.

Source replacement uses an advisory lock for cooperating RedPitayaCore-MCP processes and an expected SHA-256. External editors and build tools must be quiescent during the write; this is not a filesystem-wide compare-and-swap.

Run real build jobs on an isolated host or container with no route to the Red Pitaya and no USB, JTAG, or other board-device access. In addition to the two operator environment permissions, every dry_run=false call must set acknowledge_trusted_code=true. That acknowledgement records the caller's understanding that HDL, XDC, simulation, and vendor initialization are executable input; it is not a sandbox or independent approval. Build results cannot prove that external hardware activity did or did not occur.

rp_rx_read caps acquisition at 8,192 complex samples and returned previews at 32 samples. A successful probe or connection is reachability evidence, not device, OS, application, build, FPGA-image, or protocol identity.

  1. Keep RP_ALLOW_RX=false and run rp_profile.

  2. Run rp_device_diagnostics and rp_connection_probe.

  3. If separately configured, run rp_system_diagnostics; review OS, app/process, and FPGA state as independent evidence. Unknown remains unknown.

  4. Have the operator start the installed app using their established device procedure. This project does not automate bitstream loading.

  5. Verify the device model, OS release, installed app build, FPGA state, and listening service outside this MCP server.

  6. Enable RX only after reviewing the side effects and local RF setup. Call rp_rx_connect with explicit acknowledgement, make a bounded read, then call rp_rx_disconnect.

No real hardware was used to develop or test this release. Loopback fixtures and mock mode can validate software behavior, but hardware compatibility remains an operator acceptance task.

Offline FPGA quick start

Copy or point RP_PROJECT_ROOT at an existing local workspace. A small self-checking counter example is included in examples/fpga-demo:

export RP_MODE=mock
export RP_PROJECT_ROOT="$PWD/examples/fpga-demo"
export RP_ALLOW_PROJECT_WRITE=false
export RP_ALLOW_LOCAL_BUILD=false
redpitayacore-mcp

Start with rp_fpga_project_info, rp_fpga_read_source, and an rp_fpga_build call using dry_run=true. Simulation uses simple_counter.sv and tb_counter.sv. The XDC only declares the example clock timing; it contains no STEMlab package-pin assignments. Synthesis can exercise the flow, but implementation/bitstream generation needs a reviewed board constraint set and may correctly fail DRC with this example. Real execution additionally requires both local permission flags and an absolute RP_VIVADO_EXECUTABLE on a licensed supported Linux host. Full setup and call examples are in docs/FPGA_DEVELOPMENT.md.

Development

Install development dependencies:

python -m pip install -e '.[dev]'

Run the local checks:

pytest
ruff check .
ruff format --check .
mypy src
bandit -q -r src
pip-audit
python -m build

The test suite includes protocol vectors, mock behavior, loopback TCP/HTTP fixtures, safety failures, and a real MCP stdio client path. CI repeats the repository checks. These checks do not replace hardware validation. See validation evidence and precise limits.

Project status and limitations

  • No real STEMlab was contacted during development.

  • No dedicated MCP TX tool or live hardware mutation adapter exists.

  • Live app start/stop is always blocked.

  • Live FPGA programming, MMIO/register access, ILA capture, and TX remain unimplemented. Hardware-plan tools cannot enable them.

  • The generated Vivado flow is experimental. Vivado was not installed in the development environment. Toolchain tests cover generated Tcl and bounded fixture processes, not real synthesis, implementation, timing closure, bitstream validity, ILA insertion, or board compatibility.

  • Configured local FPGA workspaces/builds require POSIX descriptor features. Default mock startup does not require a workspace; Windows operation is unvalidated.

  • HDL, constraints, and testbenches passed to a build are trusted local code, not an OS sandbox. The generated flow does not source existing project Tcl hooks or request hardware programming, but other trusted code run by Vivado can use the build process's OS, network, and device permissions.

  • TCP roles and settings have no protocol acknowledgement.

  • Metadata and open ports do not guarantee the requested hardware/software target.

  • I/Q units are uncalibrated.

  • Compatibility is limited to the source-verified subset described in docs/PROTOCOL.md.

License

MIT. See LICENSE.

Available Tools

9 tools
rp_app_lifecycleC
Destructive

Plan lifecycle URLs or simulate mock lifecycle. Live start/stop always blocked.

NameRequiredDescriptionDefault
actionYes
dry_runNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.8/5.0
Behavior2/5

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

The description does disclose the critical behavioral fact that live start/stop is always blocked, which is genuinely useful. But this directly conflicts with the annotations, which declare destructiveHint=true and readOnlyHint=false for a tool that reportedly never performs the mutating action; the agent is left unsure which signal governs, and nothing is said about what planning output is produced or whether any state changes.

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?

Two tight sentences with the safety constraint front-loaded in emphasis, no filler. The phrasing 'Plan lifecycle URLs' is a bit cryptic, but nothing is wasted.

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

Completeness3/5

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 needn't be spelled out, and annotations cover the safety profile (albeit inconsistently). Still, for a 2-parameter, zero-coverage schema the description should clarify the dry_run behavior and what a 'plan' result means; that gap is material for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the burden. It only gestures at 'start/stop' and 'mock lifecycle', never explaining the dry_run flag, its default of true, or what happens when it is set to false (given live actions are blocked).

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

Purpose3/5

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

The description uses the verbs 'plan' and 'simulate' against 'lifecycle', and the final sentence clarifies that live start/stop is blocked, so the agent gets a rough sense of the operation. However, it never states the resource plainly (app lifecycle) and does not distinguish this from any of the diagnostic/connection siblings, leaving the actual purpose partly inferred from the tool name.

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?

'Plan lifecycle URLs or simulate mock lifecycle' implies a planning/dry-run use case, and 'Live start/stop always blocked' tells the agent not to expect real execution. There is no explicit statement of when to prefer this over alternatives, no prerequisites, and no mention of the start-vs-stop selection logic.

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

rp_connection_probeB
Read-onlyIdempotent

TCP connect/close with no selector. Briefly occupies server accept; no identity proof.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover safety and idempotency, but the description adds two things they do not: the operation briefly consumes a server accept slot (a real side effect on the remote side) and a successful connect is not proof of identity. Those are meaningful operational caveats beyond readOnlyHint/idempotentHint. It still says nothing about timeouts or failure modes.

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 dense clauses, no filler, with the action front-loaded ahead of the caveats. Every phrase carries information; even the terse 'no selector' is at least positioned as a qualifier rather than padding.

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

Completeness3/5

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 no explanation, and the 'no identity proof' note is a useful interpretation caveat. However, with zero parameters it is unexplained what host/port the probe targets (presumably configured elsewhere) and how long it waits before failing, which matters for an agent interpreting a negative result.

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 no parameter semantics to explain; baseline 4 applies. One could argue the description should explain where the connect target comes from, but that is a completeness rather than a parameter-documentation issue.

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

Purpose3/5

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

It does name a concrete action (open and close a TCP connection) rather than restating the name, but 'with no selector' is unexplained jargon and the phrase 'connection_probe' is never plainly glossed as 'check that the server accepts TCP connections.' Nothing distinguishes it from siblings like rp_rx_connect or rp_connection_status, so an agent must infer the difference.

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

Usage Guidelines2/5

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

There is no statement of when this tool should be chosen over rp_rx_connect, rp_connection_status, or rp_device_diagnostics. The only hint at appropriate use is the implicit 'no identity proof' caveat, which tells an agent what it cannot conclude but not when to run it.

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

rp_connection_statusB
Read-onlyIdempotent

Report local sockets/requested RX settings. No device setting or TX state readback.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds genuine scope information by explicitly excluding device-setting and TX-state readback, which prevents over-trusting the result, but says nothing about freshness, caching, or whether sockets are merely requested versus established.

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?

Two short sentences with zero filler, and the scope limit is placed immediately after the purpose. It is efficient, though the terseness borders on under-specification rather than optimal density.

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

Completeness3/5

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

The presence of an output schema means return values need not be described, which compensates for part of the brevity. Still, for a status tool sitting among rp_connection_probe and three diagnostics siblings, the description does not supply enough to select it confidently or to know what question it answers.

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 and the schema-level burden is nil. Baseline 4 applies for a no-argument tool.

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

Purpose3/5

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

"Report local sockets/requested RX settings" gives a verb and a resource, but "local sockets/requested RX settings" is jargon that a caller cannot easily resolve into a concrete outcome. It is not distinguishable from rp_connection_probe or rp_device_diagnostics on the strength of the description alone.

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

Usage Guidelines2/5

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

The clause "No device setting or TX state readback" implies the tool should not be used for device-level or transmit-side information, so there is a partial when-not. However, no sibling is named as the alternative, so an agent has to guess whether rp_connection_probe, rp_device_diagnostics, or rp_system_diagnostics is the right substitute.

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

rp_device_diagnosticsA
Read-onlyIdempotent

Read bounded HTTP app metadata. Cannot verify running app/OS/FPGA identity.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior. The description adds a useful negative capability ('Cannot verify running app/OS/FPGA identity') and hints at bounded scope, but lacks further behavioral context such as what the metadata includes or any rate/permission constraints. With annotations covering safety, this is adequate but not rich.

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, front-loaded with the purpose and then the key limitation. Every word earns its place with no redundancy.

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

Completeness4/5

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

Given zero parameters, a full output schema, and rich annotations, the description is nearly complete. It conveys the core action and a critical limitation. A brief mention of what 'app metadata' entails could push it to a 5, but for this complexity level it is sufficient.

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. The description does not need to explain any input semantics, and the schema coverage is 100%.

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

Purpose3/5

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

The description states a verb ('Read') and a resource ('bounded HTTP app metadata'), but 'bounded HTTP app metadata' is jargon that does not clearly differentiate this tool from siblings like rp_system_diagnostics or rp_connection_status. The negative scope statement ('Cannot verify running app/OS/FPGA identity') adds some clarity but leaves the core purpose somewhat vague.

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?

The description implies usage (read app metadata) and gives one explicit 'when not' condition (identity verification), but it does not name alternatives or specify when to choose this tool over rp_system_diagnostics or other siblings. Guidance is only implied.

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

rp_profileA
Read-onlyIdempotent

Report configured capabilities and operator-reported target, without hardware I/O.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds the meaningful nuance that no hardware is touched and that the target value is operator-reported rather than measured, but says nothing about freshness or scope of the reported configuration.

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?

A single front-loaded sentence with no filler. The only shortfall is that no clause routes the agent toward or away from the sibling tools.

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

Completeness3/5

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

With an output schema present and annotations covering safety, the description needn't explain returns. However, in a cluster of five diagnostics/status siblings it leaves the agent guessing how 'profile' differs from 'diagnostics' and 'status'.

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.

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 concrete verb+resource: reports configured capabilities and the operator-reported target. The 'without hardware I/O' clause sharply separates it from the diagnostics siblings, though the vague name 'rp_profile' still leans on the description to be understood.

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?

The 'without hardware I/O' qualifier implies when to prefer this over rp_device_diagnostics or rp_system_diagnostics, but no sibling is named and there is no explicit when-not guidance.

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

rp_rx_connectA
Destructive

Open RX only, resetting RX config/FIFO. Live requires RP_ALLOW_RX and acknowledgement.

Requires exclusive app ownership. Closing resets tuning/rate. No server ACK/readback. sample_rate: 20000, 50000, 100000, 250000, 500000 or 1250000 samples/second.

NameRequiredDescriptionDefault
sample_rateNo
frequency_hzNo
acknowledge_side_effectsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Beyond the annotations, the description discloses important behavior: it resets RX config/FIFO, requires exclusive app ownership, closing resets tuning/rate, and there is no server ACK/readback. These are meaningful operational caveats for a destructive, non-idempotent tool, though 'RP_ALLOW_RX' could be explained more precisely.

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?

The text is short, front-loaded, and mostly free of waste. The fragmentary style is dense but generally earns its place by packing in lifecycle and safety caveats.

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?

Given the annotations and an output schema, the description covers the major behavioral risks: destructive reset behavior, exclusivity, live-mode gating, and lack of readback. The main gap is that frequency_hz is never addressed, but overall it is sufficient for an agent to call the tool cautiously.

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

Parameters2/5

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. It helpfully enumerates valid sample_rate values, but it omits frequency_hz entirely and only indirectly gestures at acknowledge_side_effects via 'acknowledgement', leaving two of three parameters under-explained.

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 states a specific verb and resource ('Open RX') and clarifies that it resets RX config/FIFO. It is distinguishable from siblings like rp_rx_disconnect and rp_rx_read, though the phrase 'RX only' is terse and could be clearer about whether it means receive-only rather than only the RX subsystem.

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?

The description gives prerequisites for opening RX in live mode ('RP_ALLOW_RX and acknowledgement') and notes exclusive app ownership. However, it does not explicitly say when to use this tool versus rp_connection_probe, rp_connection_status, or rp_rx_read, leaving usage largely implied.

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

rp_rx_disconnectA
Destructive

Close owned RX sockets. Server resets RX tuning/rate; never opens TX sockets.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the agent knows this mutates state irreversibly. The description adds genuinely useful context beyond that: the server resets RX tuning/rate and TX sockets are untouched, bounding the blast radius. It does not cover what happens if no owned socket exists or whether repeated calls error.

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, front-loaded with the action, followed by the side-effect clarification. No filler or redundancy.

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

Completeness4/5

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

For a zero-parameter tear-down tool with an output schema and rich annotations, the description covers the essential unknowns: what is closed, what side effect occurs server-side, and what is deliberately not touched. Only error/idempotency edge cases are left unaddressed, and idempotency is already in the annotations.

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 schema-completeness baseline of 4 applies; there is no parameter ambiguity to resolve. The description correctly implies the target set is implicit (owned RX sockets).

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?

Names a specific verb and resource: "Close owned RX sockets," which is clearly distinct from the sibling rp_rx_connect and clarifies that only sockets this client owns are affected. It stops short of explicitly naming an alternative tool, but the action and scope are unambiguous.

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

Usage Guidelines2/5

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

There is no explicit statement of when to call this versus alternatives such as rp_rx_connect or rp_rx_read, nor any prerequisites or conditions (e.g., must a socket be open first?). The word "owned" hints at a validity constraint but is not expanded into usable guidance.

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

rp_rx_readB
Destructive

Consume bounded buffered float32 IQ and return summary/preview; not calibrated RF.

NameRequiredDescriptionDefault
sample_countNo
preview_samplesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior4/5

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

The annotations declare destructiveHint=true/readOnlyHint=false, and the word 'consume' explains that reason: the read drains buffered data rather than being a harmless peek. 'not calibrated RF' is genuinely useful context beyond the annotations, warning that returned values have no absolute units. It still omits that a live session is required and what happens when the buffer is empty.

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?

One compact, front-loaded sentence with no filler, and the calibration caveat is placed as a trailing qualifier where it belongs. It is efficient but telegraphic, which is part of why the guidance gaps exist.

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

Completeness3/5

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

An output schema exists, so return structure need not be spelled out, and the annotations cover the safety profile. However, for a hardware-touching destructive read the description never states the session precondition or the drain/empty-buffer behavior, leaving a meaningful gap for the caller.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry both parameters, but neither sample_count nor preview_samples is named or explained. 'Bounded' and 'preview' only loosely gesture at them; units, defaults, and the meanings of the 1-8192 and 0-32 caps are left entirely to the schema titles.

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+resource: consume buffered float32 IQ samples and return a summary/preview. That clearly separates it from the sibling connect/disconnect/diagnostics tools. It stops short of naming a sibling or stating the buffer's source, but the action is unambiguous.

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

Usage Guidelines2/5

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

There is no statement of when to call this versus rp_rx_connect, rp_rx_disconnect, or the diagnostics tools, and no precondition such as an active connection or a populated buffer. The agent must infer that consumption only makes sense after connecting and that repeated calls drain the stream.

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

rp_system_diagnosticsA
Read-onlyIdempotent

Read OS/model/process/app/FPGA evidence with optional fixed-command SSH; no writes.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

The annotations already establish readOnly, idempotent, openWorld, and non-destructive behavior, so the description correctly reinforces "no writes" without contradicting them. It adds useful context that fixed-command SSH may be used, but does not explain SSH authentication requirements, command restrictions, or execution limits beyond that phrase.

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?

The definition is a single front-loaded sentence with no wasted language. "Read" comes first, followed by the evidence scope and the optional SSH behavior.

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 parameterless diagnostic tool whose annotations and output schema already cover safety and return structure, the description is largely complete. It could be stronger if it clarified what "fixed-command SSH" permits, but no critical invocation detail 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?

This tool has zero parameters, so parameter semantics have no room for additional description beyond the empty schema. The baseline for a no-parameter tool is therefore 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?

The description uses a specific verb, "Read," and names concrete evidence domains: OS, model, process, app, and FPGA. It is distinguishable from narrower siblings such as rp_device_diagnostics and rp_connection_status, though it does not explicitly contrast itself with them.

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

Usage Guidelines2/5

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

The description implies a read-only diagnostic collection task but never states when to use this tool instead of rp_device_diagnostics, rp_connection_probe, or other siblings. It also gives no exclusions or prerequisites for the optional SSH path.

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. 9 tool updatesv0.2.0
    • First observedrp_app_lifecycle
    • First observedrp_connection_probe
    • First observedrp_connection_status
    • First observedrp_device_diagnostics
    • First observedrp_profile
    • First observedrp_rx_connect
    • First observedrp_rx_disconnect
    • First observedrp_rx_read
    • First observedrp_system_diagnostics

TDQS

A3.5/5.0

Scored across 9 tools

Disambiguation4/5

Most tools are clearly separated by resource and action: diagnostics, connection checks, app lifecycle, and RX lifecycle are distinct. The diagnostics/status cluster (rp_profile, rp_device_diagnostics, rp_system_diagnostics, rp_connection_probe, rp_connection_status) has some conceptual overlap, but the descriptions clarify the boundaries and constraints.

Naming Consistency4/5

All tools use a consistent rp_ prefix and snake_case, making the set predictable. The pattern is mostly rp_<domain>_<action>, though several diagnostic tools are noun-like rather than strict verb_noun, which is a minor deviation.

Tool Count5/5

Nine tools is well-scoped for a hardware diagnostics and RX-control server. Each tool covers a distinct capability area without an excessive or thin surface.

Completeness4/5

The surface covers profile/diagnostics, connection checks, app lifecycle planning, and RX connect/read/disconnect. Minor gaps remain around live lifecycle operation and TX or deeper RX configuration/readback, but the core safe diagnostic and RX workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    F
    maintenance
    Read-only MCP server for diagnosing H7-TOOL hardware via Modbus, USB HID, and Lua diagnostics, exposing only safe read operations.
    15
    -
  • F
    license
    A
    quality
    C
    maintenance
    Enables observation-only system inspection through MCP, exposing system identity, resources, process summary, and network summary without any mutation or command execution.
    4
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP clients to observe and inspect Sierra Chart chartbooks, charts, studies, drawings, and data, read diagnostics, and apply validated configuration changes via a local bridge, without any order execution or trading features.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A read-only MCP server that lets an AI agent inspect a ROS2 graph, its underlying DDS participants, readers, writers and QoS mismatches, and recorded bag files, with twelve typed tools that behave the same against a live robot or built-in mock fixtures. It has no write path at all, so it can never publish to the bus or command a robot.
    16
    219 PyPI
    3
    MIT