Skip to main content
Glama
qso-graph

jt-mcp

by qso-graph

jt-mcp

PyPI

Ask an AI app what WSJT-X is hearing. WSJT-X sends what it is doing and every decode to a UDP Server address; jt-mcp listens there and answers: who is calling CQ, and what kind of CQ (DX, POTA, a contest, a region), who has been heard and how well, what WSJT-X is tuned to, recent decodes and WSPR spots.

Read-only, permanently. jt-mcp never sends WSJT-X a message, so it cannot answer a call, key your transmitter or change a setting. No write, no PTT, no transmit control — a permanent constraint, not a first-version limit. The tests assert it against the source.

WSJT-X first, and WSJT-X defines the protocol. The UDP message definitions come from the WSJT-X project — Network/NetworkMessage.hpp, at the schema WSJT-X states — because the project that owns a definition is its authority. The code is qso-graph-lib's, the same that qso-graph-sim plays WSJT-X's messages with. JTDX, WSJT-Z and MSHV are supported where they work with those definitions, and where one does not, its difference is not implemented here. JS8Call, whose API is its own, follows WSJT-X.

This server was js8call-mcp until 2026-10-29. Part of the qso-graph project.

Install

uvx jt-mcp            # run it; nothing to install

Related MCP server: io.github.sbrunner-atx/wsjtx-mcp

Set up WSJT-X

In WSJT-X: File, Settings, Reporting, UDP Server: 127.0.0.1, port 2237 (WSJT-X's defaults). That is all jt-mcp needs when WSJT-X runs on the same PC.

Only one program can listen on a UDP port. If GridTracker, JTAlert or another logger already listens on 2237, give jt-mcp a different port (--udp-port) and point WSJT-X at that one.

Tools

Tool

Answers

jt_cq

Who is calling CQ, and what kind: plain, DX, activity (POTA, SOTA, WWFF, IOTA), contest (TEST, FD, RU, WW), region (NA, EU, ...), or a frequency (CQ 290). The latest per station

jt_status

What each WSJT-X is doing: dial frequency and band, mode, DX call and grid, Tx enabled or transmitting, your call and grid

jt_decodes

Recent decodes, each read into its parts (who is calling whom, grid, report, sign-off); filter by callsign, CQ only, SNR, band

jt_heard

Stations heard: how often, last SNR, last grid, mode and band

jt_wspr

WSPR spots WSJT-X decoded: call, grid, power, SNR, drift

jt_diagnostics

The listener: where it listens, who may send, what arrived, what was dropped and from where, each WSJT-X's version

get_version_info

Service version and status

Times are UTC. Several WSJT-X instances (two radios, two bands) are kept apart by the Id each sends, such as WSJT-X - FT-991A.

Questions it will answer

"Who's calling CQ POTA on 20 m right now?"

"Any DX calling CQ in the last ten minutes, strongest first?"

"Has W9XYZ been heard, and how strong?"

"What is WSJT-X tuned to, and is Tx enabled?"

"Why isn't anything showing up?" — jt_diagnostics

Configure your MCP client

jt-mcp works with any MCP-compatible client. Add the server and restart the client.

Claude Desktop

Add to claude_desktop_config.json (~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):

{
  "mcpServers": {
    "jt": {
      "command": "uvx",
      "args": ["jt-mcp"]
    }
  }
}

Claude Code

claude mcp add jt -- uvx jt-mcp

ChatGPT Desktop

Configure via Settings > Apps & Connectors, or in your agent definition, with the same command and args as above.

WSJT-X on another PC

By default jt-mcp listens on 127.0.0.1, this PC alone. For WSJT-X on another PC, give one address of this PC with --bind, and name each PC that may send with --allow:

"args": ["jt-mcp", "--bind", "192.168.1.50", "--allow", "192.168.1.40"]

and set WSJT-X's UDP Server to 192.168.1.50. Listening on every interface at once (0.0.0.0) is refused, --allow is required with a network address, and names are not accepted, only IP addresses. A datagram from anyone else is dropped unread and counted, and jt_diagnostics shows the count and the addresses.

What the allow list does not do. It keeps other machines out. It is not proof of who sent: a UDP sender's address can be forged by anything on the same network. What contains that is that jt-mcp only reads, so a forged datagram can mislead about what WSJT-X is doing and cannot make anything happen.

Options

jt-mcp [--bind ADDR] [--allow ADDR ...] [--udp-port N]
       [--transport stdio|streamable-http] [--port N] [--version] [--help]

Option

Default

--bind ADDR

127.0.0.1

where to listen for WSJT-X

--allow ADDR

this PC

a PC that may send; repeatable; required with a network --bind

--udp-port N

2237

WSJT-X's UDP Server port

--transport

stdio

streamable-http binds 127.0.0.1 only

--port N

8031

the streamable-http port

Licence

GPL-3.0-or-later. See LICENSE.

Available Tools

7 tools
get_version_infoGet Version InfoA
Read-onlyIdempotent

Get this server's version, what it does, and where its work is tracked.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/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. The description adds that the response includes the server's purpose and source-tracking location, which is context beyond the annotations, but with an output schema present it does not need to enumerate return fields.

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?

A single front-loaded sentence with no filler; every clause (version, purpose, work tracking) names real content the caller receives.

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-argument read tool with rich annotations and a full output schema, the description supplies enough to call it correctly. The only missing piece is sibling differentiation against jt_status/jt_diagnostics, which is a minor gap given how simple the tool is.

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?

There are zero parameters and the tool takes no arguments, so there is nothing for the description to disambiguate. Baseline 4 applies for a parameterless tool.

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 ('Get') and a concrete resource (this server's version) and expands the payload to include what the server does and where its work is tracked. It is clear what the tool returns, though it never contrasts itself with the nearby jt_status or jt_diagnostics tools, so an agent must infer the boundary.

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

Usage Guidelines3/5

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

Usage is only implied: as a no-parameter, read-only metadata call an agent can guess it is for orientation/discovery. There is no explicit statement of when to prefer it over jt_status or jt_diagnostics, and no exclusions.

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

jt_cqJt CqA
Read-onlyIdempotent

Who is calling CQ, and what kind of CQ: plain, DX, an activity (POTA, SOTA, WWFF, IOTA), a contest (TEST, FD, RU, WW), a region (NA, EU, ...), or a frequency (CQ 290). The latest CQ per station, newest first.

NameRequiredDescriptionDefault
bandNoe.g. "20m".
cq_typeNoone of plain, dx, activity, contest, region, frequency, other.
instanceNoone WSJT-X by its Id; every one if left out.
modifierNothe exact word after CQ, e.g. "POTA" or "NA".
since_minutesNohow far back, 1 to 1440 (default 5).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/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, so the safety profile is covered. The description adds one genuinely useful behavioral trait beyond that — deduplication to the latest CQ per station and newest-first ordering — but says nothing about result volume or the latency implied by openWorldHint.

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 sentences, front-loaded with the core question, and the enumerated CQ forms double as a semantic key for the cq_type filter. The parenthetical lists are dense but each item is informative rather than padding.

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?

An output schema exists, annotations cover safety, and all five parameters are documented in the schema, so the description only needs to add scope and semantics — which it does. The remaining gap is sibling disambiguation against jt_decodes/jt_heard, which matters given how many adjacent tools exist.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description earns credit by explaining what the cq_type values actually mean: 'activity' maps to POTA/SOTA/WWFF/IOTA, 'contest' to TEST/FD/RU/WW, 'region' to NA/EU, and 'frequency' to 'CQ 290'. That is meaning the schema's terse 'one of plain, dx, activity, ...' does not convey.

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 the resource and the question it answers ('Who is calling CQ, and what kind of CQ'), then enumerates the CQ categories with concrete ham-radio examples (POTA, SOTA, TEST, RU, NA, 'CQ 290'). That makes the purpose clear even though the tool name and title ('jt_cq' / 'Jt Cq') are cryptic, but it never explicitly contrasts itself with siblings such as jt_decodes or jt_heard.

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 scope ('latest CQ per station, newest first') implies when the tool is relevant, but there is no explicit statement of when to use this instead of jt_decodes or jt_heard, and no exclusions or prerequisites. An agent must infer the boundary from the word 'CQ' alone.

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

jt_decodesJt DecodesB
Read-onlyIdempotent

Recent decodes, newest first, each read into its parts: CQ (with its type), or who is calling whom, with the grid, report or sign-off it carries.

NameRequiredDescriptionDefault
bandNoe.g. "20m".
limitNoat most this many, 1 to 500 (default 50).
cq_onlyNoCQ calls only.
min_snrNothis SNR in dB or better (-50 to 50).
callsignNodecodes sent by or to this call.
instanceNoone WSJT-X by its Id; every one if left out.
since_minutesNohow far back, 1 to 1440 (default 15).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already cover safety, idempotency, and open-world behavior, and the description adds ordering ('newest first') plus parsed output shape. It does not add permissions, rate-limit, error, or default-time-window context, so the added behavioral value is modest.

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?

It is a single front-loaded sentence with little wasted wording. However, phrases like 'read into its parts' and 'sign-off it carries' are cryptic jargon that reduce immediate clarity.

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?

Rich schema descriptions, annotations, and an output schema reduce what the description must carry, and it does state ordering and output flavor. Still, it omits usage routing against obvious siblings and does not make the default recent window explicit, leaving a meaningful selection gap.

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

Parameters3/5

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

All seven parameters have 100% schema description coverage, so the schema carries parameter semantics. The description only obliquely references CQ calls and does not add band, callsign, SNR, limit, instance, or time-range meaning beyond the schema.

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?

Identifies the resource as 'Recent decodes' with 'newest first' ordering and describes content as CQ or who is calling whom. It is clear but does not explicitly distinguish this tool from siblings such as jt_cq or jt_heard.

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 gives no when-to-use, when-not-to-use, or alternative-tool guidance. With siblings like jt_cq, jt_heard, and jt_wspr present, the agent must infer routing without help.

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

jt_diagnosticsJt DiagnosticsB
Read-onlyIdempotent

The listener itself: where it listens, who may send, what has arrived, what was dropped and from where, and each WSJT-X instance's version and last heartbeat.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior3/5

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

Annotations already cover readOnly, idempotent, non-destructive, and openWorld. The description adds semantic scope—listener configuration, allowed senders, dropped messages, WSJT-X heartbeats—but does not disclose operational behavior like update frequency, response size, or whether it is a live snapshot. With annotations handling safety, this is modest added value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense fragment, not a sentence, and the noun-phrase structure buries the tool's action. The field list is compact but not front-loaded with what the tool does, which costs clarity.

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?

Given no parameters and an output schema, the main missing piece is a clear action statement and sibling differentiation. The description covers data content well but leaves an agent unsure about when to call it versus jt_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 has zero parameters, so there is nothing for the description to explain. Baseline 4 applies because the schema imposes no semantic burden.

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 is a noun-phrase inventory ('The listener itself: where it listens, who may send...') rather than a clear verb+resource statement. An agent can infer it returns listener diagnostics, but it never states what the tool does (e.g., 'returns' or 'reports'), and it makes no attempt to distinguish itself from jt_status.

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 sentence telling when to use this tool versus jt_status or any sibling, nor are there exclusions or prerequisites. The description only enumerates data fields, leaving usage entirely to inference.

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

jt_heardJt HeardB
Read-onlyIdempotent

Stations heard since this server started: how often, last SNR, last grid sent, mode and band, first and last heard.

NameRequiredDescriptionDefault
sortNolast_heard (default), snr or count.last_heard
limitNoat most this many, 1 to 500 (default 50).
callsignNoone station only.
since_minutesNoheard within this many minutes, 1 to 1440 (default 60).

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds that results are cumulative from server start and lists the per-station fields reported, but says nothing about ordering behavior, whether limit truncates stations or rows, or how 'last grid sent' is derived.

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; every listed field earns its place. Slightly fragmentary grammar but appropriately sized for a simple read tool.

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 and annotations cover safety, so return values need not be explained. However, the description leaves the relationship to the other JT tools unaddressed and does not clarify semantics like whether 'heard since this server started' is bounded by since_minutes or how limit interacts with sorting.

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

Parameters3/5

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

Schema description coverage is 100%, and all four parameters (sort, limit, callsign, since_minutes) carry descriptions with defaults and ranges, so the schema does the heavy lifting. The description adds no parameter-level detail beyond the schema, which is the baseline 3.

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

Purpose4/5

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

States a specific resource (stations heard by this server) and enumerates the aggregate fields returned (count, last SNR, last grid, mode/band, first/last heard), which is more concrete than the bare name. It never names a sibling like jt_decodes, so the differentiation from per-decode listing tools is implied rather than explicit.

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 choose this over jt_decodes, jt_wspr, or jt_cq. The phrase 'since this server started' hints at an aggregate/summary scope, but that implication is the only guidance offered.

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

jt_statusJt StatusA
Read-onlyIdempotent

What each running WSJT-X is doing now: dial frequency and band, mode, the station being worked (DX call and grid), whether Tx is enabled or transmitting, and your own call and grid.

NameRequiredDescriptionDefault
instanceNoone WSJT-X by the Id it sends (e.g. "WSJT-X - FT-991A"); every one if left out.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the meaningful nuance that values reflect current live state and that results are per-instance, but says nothing about behavior when no WSJT-X is running (empty result vs. error) or about how multiple instances are keyed. Output schema offloads the return-shape burden, keeping this at a 3.

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?

One front-loaded sentence covering scope and every returned field, with no filler or repetition. The colon-list structure makes it scannable.

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

Completeness4/5

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

With an output schema present and full parameter coverage, the description only needs to convey scope and freshness, which it does. The minor gap is what the agent should expect when the named instance isn't running or when zero instances are active.

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

Parameters3/5

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

Schema description coverage is 100% and the single `instance` parameter is documented in the schema with an example Id format and default-to-all behavior. The description itself adds no parameter guidance beyond the implicit 'each ... ' framing, so baseline 3 applies.

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

Purpose4/5

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

The description names the resource (each running WSJT-X instance) and enumerates the exact fields observed — dial frequency/band, mode, DX call and grid, Tx state, own call/grid. That is a concrete, verifiable statement of what the tool does. It stops short of explicitly contrasting itself with siblings like jt_decodes or jt_heard, so differentiation is inferred from the field list rather than stated.

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

Usage Guidelines3/5

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

The word "now" signals this is a live snapshot rather than a history/log query, which implicitly positions it against jt_decodes and jt_heard. However, there is no explicit when-to-use, no when-not, and no sibling is named as an alternative. Usage is only implied.

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

jt_wsprJt WsprA
Read-onlyIdempotent

WSPR spots WSJT-X has decoded, newest first: call, grid, power, SNR, drift.

NameRequiredDescriptionDefault
bandNoe.g. "30m".
limitNoat most this many, 1 to 500 (default 50).
callsignNoone station only.
since_minutesNohow far back, 1 to 1440 (default 60).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, non-destructive behavior, and the description adds useful ordering ('newest first') and the returned field set. That is real context beyond structured fields, though it says nothing about rate limits or the source of freshness.

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 dense sentence with the key facts front-loaded and no filler. It is arguably too terse for a cryptically named tool ('jt_wspr'), but every clause earns its place.

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

Completeness4/5

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

All four parameters are optional and fully documented in the schema, an output schema exists, and annotations cover the safety profile, so the description only needs to state what the data is and how it's ordered — which it does. The one gap is sibling differentiation.

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

Parameters3/5

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

Schema coverage is 100% and every parameter (band, limit, callsign, since_minutes) carries its own range/default documentation, so the baseline 3 applies. The description adds no filtering syntax or default information beyond what the schema already states.

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 the specific resource (WSPR spots decoded by WSJT-X) and the fields returned, so the agent knows it's a read of WSPR spot data. However, it never distinguishes itself from siblings like jt_decodes or jt_heard, which plausibly overlap.

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

Usage Guidelines3/5

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

Usage is only implied by the word 'WSPR' and 'decoded'; there is no explicit when-to-use or when-to-prefer-jt_decodes statement. With a sibling set full of decode/heard tools, an agent must guess which one to pick for WSPR data.

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. 7 tool updatesv0.2.0
    • First observedget_version_info
    • First observedjt_cq
    • First observedjt_decodes
    • First observedjt_diagnostics
    • First observedjt_heard
    • First observedjt_status
    • First observedjt_wspr

TDQS

A3.5/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have clearly distinct purposes: version info, listener diagnostics, live WSJT-X status, CQ filtering, raw decodes, aggregated heard stations, and WSPR spots. The only mild overlap is between jt_decodes, jt_cq, and jt_heard, since CQs and heard stations are derived from decodes, but the descriptions clarify their different filters and aggregations.

Naming Consistency4/5

Six of seven tools share a consistent `jt_` prefix with resource-oriented names (jt_status, jt_cq, jt_decodes, etc.), and the lone `get_version_info` is a minor deviation. The set is readable and predictable, though it does not follow a strict verb_noun pattern.

Tool Count5/5

Seven tools is a well-scoped size for a read-only WSJT-X monitoring server. Each tool covers a distinct slice of the domain and none feels redundant or missing.

Completeness4/5

The surface covers version info, listener health, live status, CQ monitoring, decoded traffic, heard-station aggregation, and WSPR spots, which is strong for an observational server. It does not offer any control or QSO logging operations, but those may be intentionally out of scope for this monitoring-focused MCP.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables querying WSPR beacon data including live spots, band activity, top beacons, propagation paths, and SNR trends through any MCP-compatible AI assistant.
    9
    695 PyPI
    GPL 3.0
  • A
    license
    A
    quality
    C
    maintenance
    An MCP server that controls WSJT-X for amateur radio weak-signal modes (FT8/FT4, etc.) via UDP, enabling observation of status and decodes, and transmit operations like replying to CQs or sending free text.
    14
    27 PyPI
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server for querying Kismet Wireless systems, enabling AI agents to retrieve network status, datasources, devices, and alerts via REST API.
    MIT
  • 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