APRS.fi MCP Server
Runs as a Node.js application that implements the Model Context Protocol to connect Claude with APRS.fi data for real-time amateur radio tracking.
Built using TypeScript to provide type-safe access to APRS.fi data and well-defined interfaces for position tracking.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@APRS.fi MCP Servershow me the current position of W1AW"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.jsAlternative (Install Script):
./install.shFor detailed setup instructions, see SETUP.md.
Manual Installation
Install dependencies:
npm installBuild the server:
npm run buildUsage
Starting the Server
npm startDevelopment Mode
npm run devFrom Main Project
# Build MCP server
npm run mcp:build
# Start MCP server
npm run mcp:start
# Development mode
npm run mcp:devMCP 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-keycommand)
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 upapiKey(string, optional): APRS.fi API key (can be set via/set-api-keycommand)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 trackapiKey(string, optional): APRS.fi API key (can be set via/set-api-keycommand)
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-keycommand) 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
Get an API key from APRS.fi
Set it once per session using the
/set-api-keycommand in Claude CodeAlternatively, 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.jsAlternative Setup (Install Script):
./install.shManual 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:
TypeScript
Node.js fetch API
License
MIT
Available Tools
4 toolsget_aprs_historyC
Get position history for a callsign with time range
| Name | Required | Description | Default |
|---|---|---|---|
| callsign | Yes | The callsign to look up | |
| apiKey | No | APRS.fi API key (optional if set via /set-api-key) | |
| lastHours | No | Number of hours to look back (default: 24) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| callsign | Yes | The callsign to look up (e.g., "W1AW") | |
| apiKey | No | APRS.fi API key (optional if set via /set-api-key) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| callsigns | Yes | Array of callsigns to track | |
| apiKey | No | APRS.fi API key (optional if set via /set-api-key) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | Yes | APRS.fi API key to validate |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
- First observed
get_aprs_history - First observed
get_aprs_position - First observed
track_multiple_callsigns - First observed
validate_aprs_key
TDQS
Scored across 4 tools
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.
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.
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.
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
- AlicenseNot gradedqualityCmaintenanceA 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.9MIT
- AlicenseBqualityBmaintenanceA 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.2353 npm92ISC
- FlicenseCqualityDmaintenanceA 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.31-
- AlicenseCqualityDmaintenanceA 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.41Apache 2.0