space-defense-osint
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., "@space-defense-osintFind the next ISS pass over Cape Canaveral in the next 24 hours."
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.
mcp-space-defense-osint
A stdio MCP server for public orbital context, geomagnetic conditions and structured airspace envelopes. Built on the official MCP SDK, Skyfield/SGP4 and HTTPX. MIT licensed; Python 3.11+. No API keys required.
Quickstart (30 Seconds)
git clone https://github.com/melgoldstein/mcp-space-defense-osint.git
cd mcp-space-defense-osint
python -m venv .venv
.venv/bin/python -m pip install '.[dev]'
.venv/bin/space-defense-osint --checkWindows equivalents are .venv\Scripts\python.exe and
.venv\Scripts\space-defense-osint.exe. --check performs a local parser check.
Without arguments the CLI serves MCP over stdio; logs go to stderr.
Related MCP server: mcp-celestrak
Claude Desktop configuration
Add this to claude_desktop_config.json, selecting the absolute Python path of the
environment where the package is installed. Restart the host after saving.
{
"mcpServers": {
"space-defense-osint": {
"command": "/absolute/path/to/.venv/bin/python",
"args": ["-m", "space_defense_osint.server"]
}
}
}Windows command example: C:\\Users\\you\\tools\\.venv\\Scripts\\python.exe.
Configuration paths: %APPDATA%\Claude\claude_desktop_config.json on Windows and
~/Library/Application Support/Claude/claude_desktop_config.json on macOS.
Cursor accepts the same mcpServers entry in .cursor/mcp.json.
See the SDK host guide
and Cursor documentation.
Tools
Tool | Inputs | Result |
| Catalog ID, location, horizon, minimum elevation | TLE, epoch age, next pass, source and retrieval timestamp |
| None | Latest observed Kp, SWPC alerts, age and cache metadata |
| Notice with ICAO center/radius | GeoJSON bounding envelope, bbox, center and radius |
Pass defaults: Cape Canaveral 28.4158, -80.6048, ISS 25544, 24-hour horizon and
10-degree minimum elevation. The horizon is bounded to 72 hours. Results identify ongoing
passes and truncated search windows. A null pass means no qualifying pass was found.
These are geometric passes, not optical-visibility forecasts.
TLE requests are cached for one hour, NOAA for 60 seconds. Cache hits retain original retrieval timestamps. Requests have a 15-second timeout and two-megabyte body budget. Errors do not silently substitute stale results. NOAA observation age is reported separately; values older than six hours are marked stale. Current object-based and legacy table-based Kp layouts are both supported.
The NOTAM parser supports Q-line coordinates such as 2825N08036W010 with radius
in nautical miles. Dateline crossings produce a MultiPolygon. This is a bounding
envelope, not a legal TFR boundary. Arbitrary polygons and free-form descriptions are
rejected. The tool parses supplied notices; it does not fetch current airspace restrictions.
Python API
from space_defense_osint.server import fetch_celestrak_tle
from space_defense_osint.airspace import analyze_notam_tfr
geometry = analyze_notam_tfr("Q) KZMA/QWALW/IV/M/W/000/999/2825N08036W010")
pass_context = fetch_celestrak_tle(catalog_id=25544)Benchmark comparison
Local medians over 1,000 iterations on Windows x64:
Operation | Median, us | Network included |
Cached feed read | 0.30 | No |
Reparse small JSON fixture | 0.90 | No |
Q-line to GeoJSON | 2.80 | No |
Caching avoids repeated decoding and upstream requests. These operations differ in
semantics; their timings do not estimate live-feed or orbital-prediction latency.
Run python benchmarks/bench_local.py. Results record the platform.
Validation and sources
python -m pytest runs offline geometry, caching, Kp-layout, pass-ordering and real MCP
stdio handshake/tool-call tests. Live NOAA and CelesTrak checks also passed during development.
Live availability varies; consumers should inspect TLE epoch age before using predictions.
Legacy TLE catalog identifiers above 99999 require an OMM interface and are not supported.
Available Tools
3 toolsanalyze_notam_tfrC
Convert an ICAO Q-line center/radius to a GeoJSON bounding envelope.
| Name | Required | Description | Default |
|---|---|---|---|
| notice | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 output type as a GeoJSON bounding envelope, but does not explain whether the operation is read-only, what validation or parsing occurs, or how errors are handled.
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, front-loaded sentence with no wasted words. It states the input abstraction and output format directly.
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?
Although the tool is simple and has an output schema, the description leaves a critical gap: the required 'notice' parameter is undocumented. An agent knows the transformation type but cannot confidently determine what to pass in.
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 single parameter 'notice' has 0% schema description coverage, and the description does not define what the parameter should contain. The mention of 'ICAO Q-line center/radius' gives a weak hint that the input relates to Q-line data, but does not clarify whether 'notice' is full NOTAM text, a Q-line string, or an identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and transformation: converting an ICAO Q-line center/radius into a GeoJSON bounding envelope. It is clear what the tool does, but it does not differentiate from sibling tools or mention the NOTAM/TFR context implied by the name.
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 gives no explicit when-to-use guidance, prerequisites, or alternatives. The conversion operation implies a use case, but an agent must infer that this tool is appropriate when it has ICAO Q-line center/radius data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_celestrak_tleB
Fetch one TLE and predict the next topocentric pass; returns source and epoch age.
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | No | ||
| longitude | No | ||
| catalog_id | No | ||
| horizon_hours | No | ||
| minimum_elevation_deg | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the burden. It usefully discloses that results include the data source and epoch age (i.e., TLE staleness matters), which is real behavioral value. It says nothing about network fetching from Celestrak, failure modes when no pass occurs within the horizon, or whether fetching and prediction always happen together.
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?
A single sentence with three distinct payloads: the fetch, the prediction, and the returned metadata. No filler, action front-loaded.
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?
Output schema covers the return shape, but for a compound tool with five undescribed parameters and no annotations, the description omits essential context: defaults, whether a pass prediction is always computed, and the no-pass case. An agent cannot confidently parameterize it from this text alone.
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?
All five parameters have 0% schema description coverage and the description never names them. 'Topocentric' hints that observer coordinates drive the prediction, but latitude/longitude units, the meaning of horizon_hours, minimum_elevation_deg thresholds, and the hidden defaults (Norfolk coordinates, catalog 25544 = ISS) are undocumented.
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?
Specific verb+resource: fetch a TLE (orbital elements) and compute the next topocentric pass, plus a note that source and epoch age are returned. This is clearly distinct from the space-weather and NOTAM siblings. It stops short of 5 only because TLE/topocentric jargon is unexplained for a non-expert caller.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to prefer this over querying other sources, no prerequisites, and no note on what happens when no pass exists in the horizon. Usage must be inferred entirely from the tool name and the word 'pass'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_noaa_swpc_kpA
Fetch observed planetary Kp and current SWPC alerts with retrieval timestamps.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load. 'Observed' usefully distinguishes measured values from predicted ones, and 'with retrieval timestamps' tells the agent data freshness is returned, but it omits any mention of auth, rate limits, update cadence, or whether alerts may be empty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and the primary data product, with the secondary product and output note trailing. No wasted words.
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?
Output schema exists, so return values need no explanation, and a no-parameter tool needs no input discussion. What remains thin is operational context (freshness/update cadence of SWPC data), but nothing required for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate; the baseline applies. No parameter text is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch) and two specific resources (observed planetary Kp, current SWPC alerts) plus an output property (retrieval timestamps). It is unambiguous against the space-weather-unrelated siblings (analyze_notam_tfr, fetch_celestrak_tle), though it never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus an alternative source of geomagnetic data, and no mention of conditions such as alert-only checks or historical Kp. 'observed' and 'current' imply present-time monitoring but the agent must infer that.
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.
3 tool updates
v0.1.0- First observed
analyze_notam_tfr - First observed
fetch_celestrak_tle - First observed
query_noaa_swpc_kp
TDQS
Scored across 3 tools
Each tool targets a clearly different data source and task: space-weather Kp/alerts, NOTAM TFR geometry conversion, and satellite TLE/pass prediction. There is no meaningful overlap that would cause misselection.
All names use snake_case and follow a verb_source_or_data pattern: query_noaa_swpc_kp, analyze_notam_tfr, fetch_celestrak_tle. The differing verbs reflect genuinely different operations rather than inconsistent conventions.
Three tools is a reasonable minimal set, and each has a distinct purpose. For a broad 'space-defense-osint' server it still feels somewhat thin, but the count is not excessive or clearly mismatched.
The surface provides only narrow primitives: current Kp/alerts, a NOTAM Q-line conversion, and a single TLE pass prediction. It lacks obvious OSINT operations such as fetching NOTAM/TFR records, querying multiple satellites, historical/forecast space weather, or cross-source correlation.
Maintenance
Related MCP Connectors
N2YO MCP — wraps the N2YO Satellite Tracking REST API (n2yo.com)
MCP server for aerospace calculations: orbital mechanics, ephemeris, DSN operations, ...
CelesTrak MCP — satellite orbital elements (TLE / GP data) for any tracked object.
NASA MCP — wraps NASA Open APIs (api.nasa.gov)
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that wraps the NASA Space-Track API to provide tools for TLE lookup, conjunction query, and satellite catalog search.-
- AlicenseNot gradedqualityBmaintenanceProvides satellite orbital elements (TLE / GP data) for any tracked object via MCP.418 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables discovery, analysis, and explanation of open satellite data through MCP, with support for STAC catalogs and NASA GIBS.1MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that equips LLM clients with authoritative astrodynamics tools including TLE/SGP4 propagation, Lambert solving, ground-station access, time-scale and coordinate-frame conversions, and more.59 PyPI2MIT