Skip to main content
Glama
dhhuston

APRS.fi MCP Server

by dhhuston

APRS.fi MCP Server

A Model Context Protocol (MCP) server that provides access to APRS.fi API for ham radio position tracking and balloon chase operations. Designed specifically for integration with Claude Code to enable AI-powered APRS data analysis and ham radio operations.

Features

  • get_aprs_position: Get current position data for a specific callsign

  • get_aprs_history: Get position history for a callsign with time range

  • track_multiple_callsigns: Track multiple callsigns at once

  • validate_aprs_key: Test if an APRS.fi API key is valid

  • Claude Code Integration: Natural language interface for APRS data analysis

Related MCP server: NASA MCP Server

Quick Installation for Claude Code

Easiest Setup (Claude MCP):

npm run build
claude mcp add aprs-fi node dist/index.js

Alternative (Install Script):

./install.sh

For detailed setup instructions, see SETUP.md.

Manual Installation

  1. Install dependencies:

npm install
  1. Build the server:

npm run build

Usage

Starting the Server

npm start

Development Mode

npm run dev

From Main Project

# Build MCP server
npm run mcp:build

# Start MCP server
npm run mcp:start

# Development mode
npm run mcp:dev

MCP Tools

get_aprs_position

Get current position data for a specific callsign from APRS.fi.

Parameters:

  • callsign (string, required): The callsign to look up (e.g., "W1AW")

  • apiKey (string, optional): APRS.fi API key (can be set via /set-api-key command)

Returns: Array of APRSPosition objects

get_aprs_history

Get position history for a callsign with time range.

Parameters:

  • callsign (string, required): The callsign to look up

  • apiKey (string, optional): APRS.fi API key (can be set via /set-api-key command)

  • lastHours (number, optional): Number of hours to look back (default: 24)

Returns: Array of APRSPosition objects sorted by timestamp

track_multiple_callsigns

Track multiple callsigns at once.

Parameters:

  • callsigns (array, required): Array of callsigns to track

  • apiKey (string, optional): APRS.fi API key (can be set via /set-api-key command)

Returns: Array of APRSPosition objects

validate_aprs_key

Test if an APRS.fi API key is valid.

Parameters:

  • apiKey (string, optional): APRS.fi API key (can be set via /set-api-key command) to validate

Returns: Object with valid boolean property

Data Types

APRSPosition

interface APRSPosition {
  name: string;           // Callsign
  callsign: string;       // Callsign
  lat: number;           // Latitude in decimal degrees
  lng: number;           // Longitude in decimal degrees
  altitude?: number;     // Altitude in meters (optional)
  timestamp: number;     // Unix timestamp in milliseconds
  comment?: string;      // APRS comment (optional)
  speed?: number;        // Speed in km/h (optional)
  course?: number;       // Course in degrees (optional)
  symbol?: string;       // APRS symbol (optional)
  path?: string;         // APRS path (optional)
}

API Key Setup

  1. Get an API key from APRS.fi

  2. Set it once per session using the /set-api-key command in Claude Code

  3. Alternatively, pass the API key as a parameter to each tool call

Rate Limiting

The server respects APRS.fi rate limits with a 1-second delay between requests.

Error Handling

The server provides detailed error messages for:

  • Invalid API keys

  • Network connectivity issues

  • API rate limiting

  • Invalid callsigns

  • API response errors

Claude Code Integration

This MCP server enables Claude Code to access real-time APRS data, making it perfect for:

  • Ham Radio Operations: Track stations, analyze propagation, coordinate activities

  • Emergency Communications: Monitor emergency nets and station positions

  • Balloon Chasing: Track high-altitude balloons and coordinate recovery teams

  • Contest Support: Monitor contest stations and optimize operations

  • Educational Projects: Learn about RF propagation and amateur radio

Setup for Claude Code

Easiest Setup (Claude MCP):

# Build the server first
npm run build

# Add to Claude Code
claude mcp add aprs-fi node dist/index.js

Alternative Setup (Install Script):

./install.sh

Manual Configuration: Add this to your ~/.claude/mcp_settings.json:

{
  "mcpServers": {
    "aprs-fi": {
      "command": "node",
      "args": ["/path/to/aprs_mcp/dist/index.js"],
      "env": {}
    }
  }
}

Using with Claude Code

Once installed, Claude Code can help you with APRS data in natural language:

  • "Show me the current position of W1AW"

  • "Track these contest stations: N1MM, W5ZZZ, K3LR"

  • "Get the position history for the balloon callsign KC1SFR-11"

  • "Find all stations that have been active in the last 2 hours"

  • "Plot the path of station VE3XYZ over the last 6 hours"

Claude Code will use the MCP tools to fetch real-time data and provide analysis, mapping suggestions, and operational insights.

Slash Commands

  • /set-api-key <your-key> - Set APRS.fi API key for the session

Development

The server is built using:

License

MIT

Available Tools

4 tools
get_aprs_historyC

Get position history for a callsign with time range

ParametersJSON Schema
NameRequiredDescriptionDefault
callsignYesThe callsign to look up
apiKeyNoAPRS.fi API key (optional if set via /set-api-key)
lastHoursNoNumber of hours to look back (default: 24)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden but only states what the tool does, not how it behaves. It doesn't mention authentication requirements (though the apiKey parameter hints at this), rate limits, error conditions, response format, or whether this is a read-only operation versus something that might modify data.

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 description is a single, efficient sentence that states the core functionality without any unnecessary words. It's appropriately sized and front-loaded with the essential information.

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

Completeness2/5

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

For a tool with no annotations and no output schema, the description is insufficient. It doesn't explain what the tool returns (position history format), authentication requirements, error handling, or how it differs from sibling tools. The agent would need to guess about important behavioral aspects.

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?

With 100% schema description coverage, the input schema already documents all three parameters thoroughly. The description adds no additional parameter information beyond what's in the schema, so it meets the baseline but doesn't provide extra value.

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 clearly states the action ('Get position history') and resource ('for a callsign with time range'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'get_aprs_position' which presumably retrieves current rather than historical position data.

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 provides no guidance about when to use this tool versus alternatives like 'get_aprs_position' or 'track_multiple_callsigns'. There's no mention of prerequisites, constraints, or typical use cases beyond the basic functionality stated.

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

get_aprs_positionC

Get current position data for a specific callsign from APRS.fi

ParametersJSON Schema
NameRequiredDescriptionDefault
callsignYesThe callsign to look up (e.g., "W1AW")
apiKeyNoAPRS.fi API key (optional if set via /set-api-key)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool retrieves data but lacks details on rate limits, authentication requirements beyond the optional apiKey, error handling, or response format. This is insufficient for a tool that interacts with an external API.

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 description is a single, clear sentence that directly states the tool's purpose without unnecessary words. It is front-loaded and efficiently conveys the essential information, making it easy to parse.

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

Completeness2/5

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

Given the lack of annotations and output schema, the description is incomplete. It does not explain what the return data includes (e.g., coordinates, timestamp), potential errors, or how the optional apiKey interacts with system settings. For a tool fetching real-time data from an external service, more context is needed.

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?

The schema description coverage is 100%, so the input schema already documents both parameters thoroughly. The description does not add any additional meaning or context beyond what the schema provides, such as examples of valid callsigns or apiKey usage scenarios.

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 clearly states the tool's purpose with a specific verb ('Get') and resource ('current position data for a specific callsign from APRS.fi'), making it immediately understandable. However, it does not explicitly differentiate from sibling tools like 'get_aprs_history' or 'track_multiple_callsigns', which might offer similar or overlapping functionality.

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 provides no guidance on when to use this tool versus alternatives. It does not mention sibling tools or contexts where other tools might be more appropriate, leaving the agent to infer usage based on tool names alone.

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

track_multiple_callsignsC

Track multiple callsigns at once

ParametersJSON Schema
NameRequiredDescriptionDefault
callsignsYesArray of callsigns to track
apiKeyNoAPRS.fi API key (optional if set via /set-api-key)

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states the tool tracks callsigns but doesn't disclose behavioral traits such as what 'track' entails (e.g., real-time monitoring, batch processing), rate limits, authentication needs (beyond the optional apiKey in schema), or output format. This leaves significant gaps for a tool with potential real-time or API interactions.

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 description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, clearly stating the core functionality without unnecessary elaboration.

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

Completeness2/5

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

Given the complexity of tracking multiple callsigns (likely involving API calls and real-time data), no annotations, and no output schema, the description is incomplete. It doesn't explain what 'track' means operationally, what the tool returns, or any constraints, making it inadequate for informed use by an AI agent.

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%, so the schema already documents both parameters (callsigns as an array of strings, apiKey as optional). The description adds no additional meaning beyond what's in the schema, such as format details or usage examples. Baseline 3 is appropriate when the schema does the heavy lifting.

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 clearly states the verb ('track') and resource ('multiple callsigns'), specifying it handles multiple items at once. However, it doesn't distinguish this tool from its siblings (get_aprs_history, get_aprs_position, validate_aprs_key), which appear to be related APRS operations but have different purposes.

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 provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites like needing an API key, nor does it explain how this differs from sibling tools (e.g., tracking vs. getting history or position). Usage context is implied but not explicit.

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

validate_aprs_keyB

Test if an APRS.fi API key is valid

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYesAPRS.fi API key to validate

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool tests API key validity but doesn't describe what 'valid' means (e.g., authentication success, rate limit status), what happens on failure, or any side effects (e.g., logging, rate limiting). For a validation tool with zero annotation coverage, this leaves significant gaps.

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 description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is front-loaded and wastes no space, making it easy to understand quickly.

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 the tool's low complexity (single parameter, no output schema, no annotations), the description is minimally adequate. It covers the basic purpose but lacks details on behavioral traits, usage context, and output expectations. For a validation tool, more information on what constitutes validity and potential outcomes would improve completeness.

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?

The input schema has 100% description coverage, with the parameter 'apiKey' clearly documented. The description adds no additional meaning beyond what the schema provides (e.g., format, examples, validation criteria). With high schema coverage, the baseline score of 3 is appropriate as the schema handles the parameter documentation adequately.

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 clearly states the tool's purpose with a specific verb ('Test') and resource ('APRS.fi API key'), and it specifies the action ('validate'). However, it doesn't explicitly differentiate this tool from its siblings (e.g., get_aprs_history, get_aprs_position), which are likely read operations rather than validation tools.

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 provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an API key), when validation is required, or how it relates to sibling tools like get_aprs_history. Usage is implied only by the tool's name and purpose.

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. 4 tool updates
    • First observedget_aprs_history
    • First observedget_aprs_position
    • First observedtrack_multiple_callsigns
    • First observedvalidate_aprs_key

TDQS

A3.5/5.0

Scored across 4 tools

Disambiguation5/5

Each tool has a clearly distinct purpose with no overlap: get_aprs_history retrieves historical position data, get_aprs_position gets current position, track_multiple_callsigns handles multiple callsigns simultaneously, and validate_aprs_key tests API key validity. The descriptions make it unambiguous which tool to use for each task.

Naming Consistency5/5

All tools follow a consistent snake_case naming pattern with clear verb_noun structure (get_aprs_history, get_aprs_position, track_multiple_callsigns, validate_aprs_key). The naming is predictable and readable throughout the set.

Tool Count5/5

With 4 tools, this server is well-scoped for APRS.fi data access. Each tool serves a distinct and necessary function for the domain, covering key operations without being overly sparse or bloated. The count aligns perfectly with the server's purpose.

Completeness4/5

The tool set covers essential APRS.fi operations well: retrieving current and historical position data, tracking multiple callsigns, and validating API keys. A minor gap exists in not having tools for more advanced APRS features like messaging or telemetry, but the core functionality for position tracking is complete.

Related MCP Connectors

  • Real-time planetary signal engine and Model Context Protocol (MCP) server for autonomous AI agents.

  • A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…

  • The Telnyx MCP server is an official implementation of the Model Context Protocol that enables AI clients (like Claude Desktop, Cursor, and OpenAI Agents) to interact with Telnyx's telephony, messaging, and AI assistant APIs. It provides comprehensive capabilities including making and managing phone calls, sending SMS/MMS messages, purchasing and configuring phone numbers, creating AI assistants with custom instructions, managing cloud storage buckets, scraping and embedding website content, and handling integration secrets. The server exists as both a local implementation and a remotely hosted version, allowing developers to integrate real-world communication infrastructure directly into AI applications.

  • The official Model Context Protocol server for Ambee. It gives any MCP-compatible AI assistant — Claude, ChatGPT, Cursor, VS Code, Ollama, and more direct access to live air quality, pollen, and weather data. To get started, including information on signing up and obtaining your Ambee key, check out the Ambee documentation on https://docs.ambeedata.com

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that enables AI assistants like Claude to perform Python development tasks through file operations, code analysis, project management, and safe code execution.
    9
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    A Model Context Protocol server that provides a standardized interface for AI models to interact with NASA's vast array of data sources including APOD, Mars Rover photos, satellite imagery, and space weather data.
    23
    53 npm
    92
    ISC
  • F
    license
    C
    quality
    D
    maintenance
    A Model Context Protocol server implementation that enables seamless integration with Claude and other MCP-compatible clients to access Prem AI's language models, RAG capabilities, and document management features.
    3
    1
    -
  • A
    license
    C
    quality
    D
    maintenance
    A Model Context Protocol server that provides network analysis tools for security professionals, enabling AI models like Claude to perform tasks such as ASN lookups, DNS analysis, WHOIS retrieval, and IP geolocation for security investigations.
    4
    1
    Apache 2.0