Skip to main content
Glama

Find which signals/entities are covered (free)

find_signal
Read-onlyIdempotent

FREE coverage + freshness manifest: which signal_id lines exist, how many entities each covers, and fresh/recent/stale counts - so you can check "is my entity covered and how fresh" BEFORE paying. Optional filters: industry, signal_id, entity.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fullNotrue = per-entity detail (larger); default compact summary
entityNoobject id, e.g. a USGS site id
industryNorestrict to one domain, e.g. hydrology, agriculture, energy
signal_idNoe.g. hydrology.river-level

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
noteNoScreening-level disclaimer.
errorNoPresent only when the call failed; human-readable reason.
detailNoPresent on some failures: the upstream endpoint's own error text.
natureNoWhat this manifest is.
totalsNosignal_ids / industries / distinct_entities / freshness counts across the whole catalogue.
signalsNoOne entry per signal line. Compact by default; pass full=true for per-entity detail.
cache_noteNoWhat the cache does and does not affect.
cache_ttl_sNoCache lifetime of this manifest in seconds.
cache_policyNoCache policy in force.
freshness_ruleNoHow fresh/recent/stale are decided.
update_status_ruleNoHow on_schedule / overdue / not_published / unknown are decided.
freshness_thresholdsNoThe numeric thresholds behind freshness_rule.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedOutput schema / properties / signals / items / properties / entities / items / properties / overdue_days
      Added value: +{
      +  "description": "How many days past the declared cycle this object is.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / signals / items / properties / entities / items / properties / update_status
      Added value: +{
      +  "description": "on_schedule | overdue | not_published | unknown, for this object.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / signals / items / properties / industry / description
      Previous value: -"Domain the line belongs to."New value: +"Domain the line belongs to; null when the line is not classified."
    • changedOutput schema / properties / signals / items / properties / industry / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / signals / items / properties / latest_observed_at / description
      Previous value: -"ISO timestamp of the newest observation in the line."New value: +"ISO timestamp of the newest observation; null when the line has never published."
    • changedOutput schema / properties / signals / items / properties / latest_observed_at / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / signals / items / properties / max_overdue_days / type
      Previous value: -"integer"New value: +"number"
  2. Changed2 schema fields changed
    • addedInput schema / properties / industry / description
      Added value: +"restrict to one domain, e.g. hydrology, agriculture, energy"
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "description": "Coverage + freshness manifest. On failure this object is an error report instead (see error/detail).",
      +  "properties": {
      +    "cache_note": {
      +      "description": "What the cache does and does not affect.",
      +      "type": "string"
      +    },
      +    "cache_policy": {
      +      "description": "Cache policy in force.",
      +      "type": "string"
      +    },
      +    "cache_ttl_s": {
      +      "description": "Cache lifetime of this manifest in seconds.",
      +      "type": "number"
      +    },
      +    "detail": {
      +      "description": "Present on some failures: the upstream endpoint's own error text.",
      +      "type": "string"
      +    },
      +    "error": {
      +      "description": "Present only when the call failed; human-readable reason.",
      +      "type": "string"
      +    },
      +    "freshness_rule": {
      +      "description": "How fresh/recent/stale are decided.",
      +      "type": "string"
      +    },
      +    "freshness_thresholds": {
      +      "description": "The numeric thresholds behind freshness_rule.",
      +      "type": "object"
      +    },
      +    "nature": {
      +      "description": "What this manifest is.",
      +      "type": "string"
      +    },
      +    "note": {
      +      "description": "Screening-level disclaimer.",
      +      "type": "string"
      +    },
      +    "signals": {
      +      "description": "One entry per signal line. Compact by default; pass full=true for per-entity detail.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "checkup": {
      +            "description": "Latest patrol result for the line (full mode).",
      +            "type": "object"
      +          },
      +          "description": {
      +            "description": "What the line measures (full mode).",
      +            "type": "string"
      +          },
      +          "entities": {
      +            "description": "Per-entity detail; present only when full=true.",
      +            "items": {
      +              "additionalProperties": true,
      +              "properties": {
      +                "data_age_hours": {
      +                  "description": "Age of the observation in hours.",
      +                  "type": "number"
      +                },
      +                "entity": {
      +                  "description": "Object id.",
      +                  "type": "string"
      +                },
      +                "entity_name": {
      +                  "description": "Human-readable object name.",
      +                  "type": "string"
      +                },
      +                "freshness": {
      +                  "description": "fresh | recent | stale.",
      +                  "type": "string"
      +                },
      +                "observed_at": {
      +                  "description": "ISO timestamp of the observation.",
      +                  "type": "string"
      +                },
      +                "vintage_days": {
      +                  "description": "Age of the underlying source vintage in days.",
      +                  "type": "number"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "entities_count": {
      +            "description": "How many objects the line covers.",
      +            "type": "integer"
      +          },
      +          "factory": {
      +            "description": "Internal collector name (full mode).",
      +            "type": "string"
      +          },
      +          "freshness_counts": {
      +            "description": "fresh / recent / stale counts for the line.",
      +            "type": "object"
      +          },
      +          "industry": {
      +            "description": "Domain the line belongs to.",
      +            "type": "string"
      +          },
      +          "latest_observed_at": {
      +            "description": "ISO timestamp of the newest observation in the line.",
      +            "type": "string"
      +          },
      +          "max_overdue_days": {
      +            "description": "Largest overdue gap in the line, in days.",
      +            "type": "integer"
      +          },
      +          "record_type": {
      +            "description": "Kind of record the line emits (full mode).",
      +            "type": "string"
      +          },
      +          "signal_id": {
      +            "description": "e.g. hydrology.river-level",
      +            "type": "string"
      +          },
      +          "signal_id_label": {
      +            "description": "Human-readable line name (full mode).",
      +            "type": "string"
      +          },
      +          "temporal_cycle": {
      +            "description": "Publication cycle declared by the upstream source (full mode).",
      +            "type": "string"
      +          },
      +          "update_status": {
      +            "description": "on_schedule | overdue | not_published | unknown.",
      +            "type": "string"
      +          },
      +          "update_status_counts": {
      +            "description": "Per-status entity counts.",
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "totals": {
      +      "description": "signal_ids / industries / distinct_entities / freshness counts across the whole catalogue.",
      +      "type": "object"
      +    },
      +    "update_status_rule": {
      +      "description": "How on_schedule / overdue / not_published / unknown are decided.",
      +      "type": "object"
      +    }
      +  },
      +  "required": [],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, covering safety and mutability. The description adds behavioral context by noting the tool is 'FREE' and functions as a manifest, which is useful operational information not present in annotations. No contradiction found.

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 sentence that front-loads the key point ('FREE coverage + freshness manifest') and immediately explains the deliverable and use case. No wasted words; every phrase adds value.

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 strong annotations, the description covers the essential context: purpose, use case, and optional filters. It could mention the 'full' parameter's effect, but that is documented in the schema. Overall, it's complete for a read-only lookup tool.

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 fully documents all four parameters. The description only mentions the optional filters (industry, signal_id, entity) without adding new semantic detail beyond what the schema already provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific purpose: it's a 'coverage + freshness manifest' that tells you which signal_id lines exist, how many entities each covers, and fresh/recent/stale counts. This clearly distinguishes it from sibling tools like get_official_record or verify_citation, which serve different functions.

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

Usage Guidelines4/5

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

The description gives clear context: use this to check 'is my entity covered and how fresh' BEFORE paying. This implies a pre-purchase use case. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of full guidance.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.