Atlas / MCP servers / civops-platform / open-signals

open-signalsCAUTION

mcp/civops-platform/open-signals

Public data signals with provenance and licence on every reading: source catalogue, fetchers, REST, MCP, GeoJSON layers

Verdict
CAUTION
Grade
B
Trust score
89 /100
Exposed tools
9 9r · 0w · 0d
Transport
streamable-http
License
Apache-2.0
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Public data, ready for maps and agents. Every reading says where it came from, when it was fetched, and what licence it carries.

open-signals has three parts:

  • A catalogue of public data sources (catalog/sources.json). Each entry gives the API,

coverage, cadence, the key it needs and its licence. Weather, water, ice, hazards, flights, ships, satellites, energy, emissions, filings, trade and more. It's the list to check before writing yet another fetcher.

  • Fetchers for the sources we read today. Each one turns an upstream answer into one shape,

the reading:

{ "id": "noaa-coops:9063085:2026-10-10", "at": "2026-10-10", "metric": "water_level",
"value": 2.762, "unit": "ft above LWD",
"summary": "Lake Erie at Toledo 2026-10-10: mean 2.76 ft above low water datum (...)",
"place": { "id": "coops-toledo", "name": "Lake Erie at Toledo", "lat": 41.6936, "lng": -83.4723 },
"fields": { "station": "9063085", "datum": "LWD", "readings": 155 },
"source": { "id": "noaa-coops", "name": "NOAA CO-OPS water levels", "url": "https://tidesandcurrents.noaa.gov/...",
"fetched_at": "2026-10-10T19:12:03Z", "license": "public_domain" } }
  • Ways in: a CLI, a REST API with an OpenAPI description, an MCP server for agents, and

GeoJSON map layers. There are no runtime dependencies; it needs Node 20 or later.

Use it

A public instance runs at https://open-signals.civops.io (REST under /v1, MCP at /mcp). It serves only public-domain and open sources, holds no upstream keys, and is rate-limited per IP. Try https://open-signals.civops.io/v1/layers/volcanoes?elevated=true.

git clone https://github.com/Civops-Platform/open-signals && cd open-signals   # Node 20+, no npm install needed
alias open-signals='node bin/open-signals.mjs'
open-signals sources fires                     # search the catalogue
open-signals sources --topic water --fetchable
open-signals fetch usgs-earthquake
Read from source at commit f86936fb5940OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add open-signals -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "open-signals": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ]
    }
  }
}
03

Exposed tools (9)

9 read · 0 write · 0 destructive.

ToolRiskDescription
get_dataset_partreadThe URL of one part of a dataset as GeoJSON, plus its description. Fetch the URL for the features; parts can be several megabytes.
get_layerreadOne map layer as a GeoJSON FeatureCollection: one point per place with the reading on the date (else the latest observed before it, never a guess), or one point per event for event layers.
get_readingsreadFetch current readings from one source, each with value, unit, a one-line summary, place and provenance (source, URL, fetch time, licence). Sources this server will not republish (non-commercial, restricted or unreviewed licence) answer with an error naming the licence.
get_sourcereadOne catalogue entry in full.
list_datasetsreadStatic public datasets this server holds as GeoJSON (wildfire burn perimeters, public-land share by county, federal campgrounds, fire-weather stations), with source, licence, feature count and parts (one per state, or
list_hubsreadProjects and catalogues that collect sources (God\
list_layersreadMap layers this server can draw as GeoJSON, with unit, source, licence, whether it is available here, and how to read it.
list_placesreadNamed places the fetchers read for, with their upstream ids (CO-OPS station, USGS gauge, eBird region) and tags.
search_sourcesreadSearch the catalogue of public data sources (weather, water, hazards, flights, ships, energy, filings, trade, ...). Each entry gives the API, coverage, cadence, auth needed and licence. Use it to find where a kind of data comes from before writing a fetcher.
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (6 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
none-found

Findings (8)

MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/live-check.mjs:31
const base = `http://127.0.0.1:${srv.address().port}`;
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/fetchers/zip.js:6
if (!table) table = JSON.parse(readFileSync(new URL('../../catalog/zip-centroids.json', import.meta.url), 'utf8')).zcta;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/service.test.mjs:198
{ id: 'fire', label: 'Fire', kind: 'polygons', part_by: 'state', source: 'NIFC', license: 'public_domain', features: 1, parts: { OH: 'fire/OH.geojson', XX: '../../etc/passwd' } },
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/service.test.mjs:104
const base = `http://127.0.0.1:${srv.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/service.test.mjs:220
const base = `http://127.0.0.1:${srv.address().port}`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/service.test.mjs:249
const base = `http://127.0.0.1:${srv.address().port}/i3x/v1`;
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/service.test.mjs:291
const base = `http://127.0.0.1:${srv.address().port}/i3x/v1`;

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha f86936fb5940full audit observations/trust-audit/mcp-server/civops-platform__open-signals.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10f86936fb5940CAUTIONB89first audit
06

Questions

What is the open-signals MCP server?

Public data signals with provenance and licence on every reading: source catalogue, fetchers, REST, MCP, GeoJSON layers

What tools does open-signals expose?

9 in total: 9 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is open-signals safe to connect to an agent?

With care. The audit graded it B (89/100) and found 8 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does open-signals need?

No credential environment variables were found in its source, so it appears to need none.

How does open-signals run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as open-signals at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (f86936fb5940), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement