Skip to main content
Glama

Search open federal notices

search_open_notices
Read-onlyIdempotent

Not affiliated with the U.S. government, GSA, or SAM.gov. Not a U.S. government service. Searches open federal contract notices in GovInbox's stored SAM.gov data using the supplied NAICS and optional filters. Returns published notice facts and source information. Results are sorted by posted date or deadline, not by a match score. Map industry or trade words in the request to NAICS prefixes and pass them as naics (construction -> 23; engineering -> 5413; IT services -> 5415; janitorial/housekeeping -> 5617; landscaping -> 5617; security guards -> 5616); a free-text keyword is not a substitute for NAICS. For 'veteran-owned' pass set_aside ['vosb','sdvosb'] (both); for 'service-disabled veteran-owned' pass ['sdvosb'] only. Coverage reflects the stored data and the response's as-of time; results are not a complete live search of SAM.gov. A missing result does not prove that a notice does not exist. Does not recommend bids, determine eligibility, or suggest partners. One accepted search counts as one use, regardless of the number of records returned. Every record carries a direct source link (or source name and record ID) so you can verify and cite the underlying record. Without a connected GovInbox account, both limits apply: 3 searches per UTC calendar day and 10 per UTC calendar month. With a connected free GovInbox account, the limit is 20 searches per UTC calendar month, with no separate daily limit. One accepted search counts as one use, regardless of the number of records returned. Follow-up calls (opening records, comparing versions, listing awards or subawards) within 30 minutes after a search do not count extra, up to 30 follow-ups per search. A follow-up invoked with no active search window counts as one use and opens a new 30-minute window. Empty results consume the search. A lookup for a record that does not exist is not charged. Each retry of a search counts as a new search, as does each call for another page of search results. Daily limits reset at 00:00 UTC each day; monthly limits reset at 00:00 UTC on the first day of each month. Requests rejected for invalid authentication or an exhausted quota do not consume a use.

Input Schema

NameRequiredDescriptionDefault
sortNoposted_date or deadlineposted_date
limitNoMaximum 50 records; minimum 1; default 20.
naicsYesNAICS codes, 2-6 digits each
cursorNoOpaque next_cursor from a previous page
geographyNoRecorded place-of-performance state where the work occurs, e.g. TX for Texas; not buyer address or the user's residence. Unknown work-state records are excluded.
set_asideNoFilter to notices carrying this set-aside restriction: vosb (veteran-owned), sdvosb (service-disabled veteran-owned), 8a, hubzone, wosb, edwosb, small. VOSB and SDVOSB are distinct; do not silently substitute SDVOSB for a veteran-owned request. Multiple values combine (OR): ['sdvosb','wosb'] matches either. 'unrestricted' matches only full-and-open notices with no set-aside restriction. This is the NOTICE's restriction, distinct from certifications (the firm's credentials). Notices with no recorded set-aside code are excluded when this filter is supplied, unless 'unrestricted' is included.
certificationsNoOptional firm certifications explicitly supplied by the user; never infer them from a request for veteran-owned notices. Use set_aside for notice restrictions. Tokens include vosb, sdvosb, 8a, hubzone, wosb, edwosb.

Output Schema

NameRequiredDescriptionDefault
countYes
quotaYes
noticesYes
coverageYes
sort_ruleYes
sort_labelNoHuman-readable sort rule; never a rankingSorted by posted date only
next_cursorNo
coverage_noteNosample_size and count describe this returned page, not a source or market total. as_of is the response calculation time, not a source retrieval or ingestion time. Canonical source links are verification pointers; unknown source retrieval, ingestion and version facts remain unknown. Missing results may reflect filters, scan limits or stored-source coverage.
opportunitiesNoThe same returned notices as interactive cards, not a separate search
applied_filtersNo
solicitation_groupsNoStored notice versions per returned solicitation lead; no version is declared controlling
analytical_disclaimerYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedOutput schema / $defs / NoticeCoverage / properties / matched_record_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Matched Record Count"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / matched_solicitation_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Matched Solicitation Count"
      +}
    • addedOutput schema / properties / solicitation_groups
      Added value: +{
      +  "description": "Stored notice versions per returned solicitation lead; no version is declared controlling",
      +  "items": {
      +    "additionalProperties": true,
      +    "type": "object"
      +  },
      +  "title": "Solicitation Groups",
      +  "type": "array"
      +}
  2. Changed40 schema fields changed
    • changedInput schema / properties / certifications / description
      Previous value: -"sdvosb | 8a | hubzone | wosb | edwosb"New value: +"Optional firm certifications explicitly supplied by the user; never infer them from a request for veteran-owned notices. Use set_aside for notice restrictions. Tokens include vosb, sdvosb, 8a, hubzone, wosb, edwosb."
    • changedInput schema / properties / geography / description
      Previous value: -"Uppercase US state, District of Columbia, or territory code, e.g. WA"New value: +"Recorded place-of-performance state where the work occurs, e.g. TX for Texas; not buyer address or the user's residence. Unknown work-state records are excluded."
    • addedInput schema / properties / limit / description
      Added value: +"Maximum 50 records; minimum 1; default 20."
    • changedInput schema / properties / set_aside / description
      Previous value: -"Filter to notices carrying this set-aside restriction, e.g. 8a, sdvosb, hubzone, wosb, edwosb, small. Multiple values combine (OR): ['sdvosb','wosb'] matches either. 'unrestricted' matches only full-and-open notices with no set-aside restriction. This is the NOTICE's restriction, distinct from certifications (the firm's credentials). Notices with no recorded set-aside code are excluded when this filter is supplied, unless 'unrestricted' is included."New value: +"Filter to notices carrying this set-aside restriction: vosb (veteran-owned), sdvosb (service-disabled veteran-owned), 8a, hubzone, wosb, edwosb, small. VOSB and SDVOSB are distinct; do not silently substitute SDVOSB for a veteran-owned request. Multiple values combine (OR): ['sdvosb','wosb'] matches either. 'unrestricted' matches only full-and-open notices with no set-aside restriction. This is the NOTICE's restriction, distinct from certifications (the firm's credentials). Notices with no recorded set-aside code are excluded when this filter is supplied, unless 'unrestricted' is included."
    • addedOutput schema / $defs / NoticeCoverage / properties / as_of / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedOutput schema / $defs / NoticeCoverage / properties / as_of / default
      Added value: +null
    • changedOutput schema / $defs / NoticeCoverage / properties / as_of / description
      Previous value: -"UTC ISO 8601"New value: +"Known source observation time; null when not recorded. Not the query time."
    • removedOutput schema / $defs / NoticeCoverage / properties / as_of / type
      Removed value: -"string"
    • addedOutput schema / $defs / NoticeCoverage / properties / cache_timestamp_basis
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Cache Timestamp Basis"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / cache_timestamp_field
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Cache Timestamp Field"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / exclusions
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "title": "Exclusions",
      +  "type": "array"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_attempt_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Attempt At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_attempt_scope
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Attempt Scope"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_success_record_count
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Success Record Count"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_success_scope
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Success Scope"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_successful_ingest_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Successful Ingest At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / last_successful_refresh_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Last Successful Refresh At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / latest_cached_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Latest Cached At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / latest_stored_fetched_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Latest Stored Fetched At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / latest_stored_ingested_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Latest Stored Ingested At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / oldest_cached_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Oldest Cached At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / oldest_ingested_at
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Oldest Ingested At"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / pagination_note
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Pagination Note"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / population
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Population"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / population_complete
      Added value: +{
      +  "default": false,
      +  "title": "Population Complete",
      +  "type": "boolean"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / population_status
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Population Status"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / query_time
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "When this stored-data query was calculated; not proof of source refresh",
      +  "title": "Query Time"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / record_type
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Record Type"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / refresh_error_code
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Refresh Error Code"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / refresh_status
      Added value: +{
      +  "default": "unknown",
      +  "title": "Refresh Status",
      +  "type": "string"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / scope_note
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Scope Note"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Source"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / source_as_of
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Source As Of"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / source_state
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "matched",
      +        "no_match",
      +        "not_loaded",
      +        "unsupported",
      +        "failed_refresh",
      +        "unknown"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Source State"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / source_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Source Url"
      +}
    • addedOutput schema / $defs / NoticeCoverage / properties / stored_rows
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Stored Rows"
      +}
    • removedOutput schema / $defs / NoticeCoverage / required
      Removed value: -[
      -  "as_of"
      -]
    • addedOutput schema / $defs / OpportunityCard
      Added value: +{
      +  "description": "One opportunity for the visual widget. set_aside_code is the\nrecord's own code, never the caller's filter argument.",
      +  "properties": {
      +    "buyer_office": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Buyer Office"
      +    },
      +    "match_explanation": {
      +      "additionalProperties": true,
      +      "title": "Match Explanation",
      +      "type": "object"
      +    },
      +    "naics": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Naics",
      +      "type": "array"
      +    },
      +    "notice_id": {
      +      "title": "Notice Id",
      +      "type": "string"
      +    },
      +    "notice_type": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Notice Type"
      +    },
      +    "place": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Place"
      +    },
      +    "place_state": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "Recorded structured place-of-performance state, never buyer location",
      +      "title": "Place State"
      +    },
      +    "posted_date": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Posted Date"
      +    },
      +    "provenance": {
      +      "additionalProperties": true,
      +      "title": "Provenance",
      +      "type": "object"
      +    },
      +    "record_status": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Record Status"
      +    },
      +    "recorded_deadline": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Recorded Deadline"
      +    },
      +    "sam_gov_url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Sam Gov Url"
      +    },
      +    "set_aside_code": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Set Aside Code"
      +    },
      +    "solicitation_number": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Solicitation Number"
      +    },
      +    "source_name": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Source Name"
      +    },
      +    "source_url": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Source Url"
      +    },
      +    "title": {
      +      "title": "Title",
      +      "type": "string"
      +    },
      +    "why_matched": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Why Matched"
      +    }
      +  },
      +  "required": [
      +    "notice_id",
      +    "title"
      +  ],
      +  "title": "OpportunityCard",
      +  "type": "object"
      +}
    • addedOutput schema / properties / applied_filters
      Added value: +{
      +  "additionalProperties": true,
      +  "title": "Applied Filters",
      +  "type": "object"
      +}
    • addedOutput schema / properties / opportunities
      Added value: +{
      +  "description": "The same returned notices as interactive cards, not a separate search",
      +  "items": {
      +    "$ref": "#/$defs/OpportunityCard"
      +  },
      +  "title": "Opportunities",
      +  "type": "array"
      +}
  3. Changed10 schema fields changed
    • removedOutput schema / $defs / Coverage
      Removed value: -{
      -  "properties": {
      -    "as_of": {
      -      "description": "UTC ISO 8601",
      -      "title": "As Of",
      -      "type": "string"
      -    },
      -    "empty_reason": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "'not_loaded' (never ingested — not evidence of anything), 'no_match' (ingested, no rows match), or 'thin' (ingested, few rows)",
      -      "title": "Empty Reason"
      -    },
      -    "lanes": {
      -      "items": {
      -        "type": "string"
      -      },
      -      "title": "Lanes",
      -      "type": "array"
      -    },
      -    "sample_size": {
      -      "anyOf": [
      -        {
      -          "type": "integer"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "title": "Sample Size"
      -    }
      -  },
      -  "required": [
      -    "as_of"
      -  ],
      -  "title": "Coverage",
      -  "type": "object"
      -}
    • addedOutput schema / $defs / NoticeCoverage
      Added value: +{
      +  "properties": {
      +    "as_of": {
      +      "description": "UTC ISO 8601",
      +      "title": "As Of",
      +      "type": "string"
      +    },
      +    "empty_reason": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "description": "'not_loaded' (never ingested — not evidence of anything), 'no_match' (ingested, no rows match), or 'thin' (ingested, few rows)",
      +      "title": "Empty Reason"
      +    },
      +    "lanes": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "title": "Lanes",
      +      "type": "array"
      +    },
      +    "open_scan_cap": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Open Scan Cap"
      +    },
      +    "open_scan_truncated": {
      +      "anyOf": [
      +        {
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Open Scan Truncated"
      +    },
      +    "prohibited_screen_excluded": {
      +      "anyOf": [
      +        {
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Prohibited Screen Excluded"
      +    },
      +    "prohibited_screen_version": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Prohibited Screen Version"
      +    },
      +    "sample_scope": {
      +      "const": "returned_page",
      +      "default": "returned_page",
      +      "title": "Sample Scope",
      +      "type": "string"
      +    },
      +    "sample_size": {
      +      "default": 0,
      +      "description": "Notices returned on this page only",
      +      "minimum": 0,
      +      "title": "Sample Size",
      +      "type": "integer"
      +    },
      +    "scan_note": {
      +      "anyOf": [
      +        {
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Scan Note"
      +    }
      +  },
      +  "required": [
      +    "as_of"
      +  ],
      +  "title": "NoticeCoverage",
      +  "type": "object"
      +}
    • changedOutput schema / $defs / NoticeRow / properties / source_fact / items / $ref
      Previous value: -"#/$defs/Statement"New value: +"#/$defs/NoticeStatement"
    • addedOutput schema / $defs / NoticeStatement
      Added value: +{
      +  "properties": {
      +    "source": {
      +      "$ref": "#/$defs/NoticeStatementSource"
      +    },
      +    "statement": {
      +      "description": "Text rendered from the template and values",
      +      "maxLength": 2000,
      +      "minLength": 1,
      +      "title": "Statement",
      +      "type": "string"
      +    },
      +    "template_id": {
      +      "description": "Template identifier from STATEMENT_TEMPLATES; every emitted Statement must match a template",
      +      "title": "Template Id",
      +      "type": "string"
      +    },
      +    "values": {
      +      "additionalProperties": {
      +        "type": "string"
      +      },
      +      "description": "Values substituted into the template",
      +      "title": "Values",
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "template_id",
      +    "source",
      +    "statement"
      +  ],
      +  "title": "NoticeStatement",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / NoticeStatementSource
      Added value: +{
      +  "description": "Search-only provenance; do not change shared/receipt source models.",
      +  "properties": {
      +    "field": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "solicitation_number",
      +            "response_deadline"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "default": null,
      +      "title": "Field"
      +    },
      +    "record_id": {
      +      "title": "Record Id",
      +      "type": "string"
      +    },
      +    "retrieved_at": {
      +      "default": null,
      +      "description": "Official source retrieval time is not recorded for these stored notices; not response time",
      +      "title": "Retrieved At",
      +      "type": "null"
      +    },
      +    "system": {
      +      "const": "sam_gov",
      +      "default": "sam_gov",
      +      "title": "System",
      +      "type": "string"
      +    },
      +    "url": {
      +      "title": "Url",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "record_id",
      +    "url"
      +  ],
      +  "title": "NoticeStatementSource",
      +  "type": "object"
      +}
    • addedOutput schema / $defs / QuotaBlock / properties / mode
      Added value: +{
      +  "default": "ordinary",
      +  "enum": [
      +    "ordinary",
      +    "testing",
      +    "review",
      +    "beta"
      +  ],
      +  "title": "Mode",
      +  "type": "string"
      +}
    • removedOutput schema / $defs / Statement
      Removed value: -{
      -  "properties": {
      -    "source": {
      -      "$ref": "#/$defs/StatementSource",
      -      "description": "Structured provenance"
      -    },
      -    "statement": {
      -      "description": "Text rendered from the template and values",
      -      "maxLength": 2000,
      -      "minLength": 1,
      -      "title": "Statement",
      -      "type": "string"
      -    },
      -    "template_id": {
      -      "description": "Template identifier from STATEMENT_TEMPLATES; every emitted Statement must match a template",
      -      "title": "Template Id",
      -      "type": "string"
      -    },
      -    "values": {
      -      "additionalProperties": {
      -        "type": "string"
      -      },
      -      "description": "Values substituted into the template",
      -      "title": "Values",
      -      "type": "object"
      -    }
      -  },
      -  "required": [
      -    "template_id",
      -    "source",
      -    "statement"
      -  ],
      -  "title": "Statement",
      -  "type": "object"
      -}
    • removedOutput schema / $defs / StatementSource
      Removed value: -{
      -  "properties": {
      -    "field": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Specific field within the record",
      -      "title": "Field"
      -    },
      -    "record_id": {
      -      "description": "Official record identifier",
      -      "title": "Record Id",
      -      "type": "string"
      -    },
      -    "retrieved_at": {
      -      "description": "UTC ISO 8601 when the source was retrieved",
      -      "title": "Retrieved At",
      -      "type": "string"
      -    },
      -    "system": {
      -      "description": "Source system: sam_gov, usaspending, fsrs, govinbox",
      -      "title": "System",
      -      "type": "string"
      -    },
      -    "url": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Canonical URL for the record",
      -      "title": "Url"
      -    }
      -  },
      -  "required": [
      -    "system",
      -    "record_id",
      -    "retrieved_at"
      -  ],
      -  "title": "StatementSource",
      -  "type": "object"
      -}
    • changedOutput schema / properties / coverage / $ref
      Previous value: -"#/$defs/Coverage"New value: +"#/$defs/NoticeCoverage"
    • addedOutput schema / properties / coverage_note
      Added value: +{
      +  "default": "sample_size and count describe this returned page, not a source or market total. as_of is the response calculation time, not a source retrieval or ingestion time. Canonical source links are verification pointers; unknown source retrieval, ingestion and version facts remain unknown. Missing results may reflect filters, scan limits or stored-source coverage.",
      +  "title": "Coverage Note",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnly/idempotent/openWorld annotations, it discloses the quota model in detail (3/day and 10/month unauthenticated; 20/month with a free account), what consumes a use (empty results, retries, additional pages), what does not (rejected auth, exhausted quota, nonexistent record lookups), and the 30-minute follow-up window. It also discloses the data-coverage limitation ('not a complete live search of SAM.gov') and that results are sorted by date, not match score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead disclaimer is correctly front-loaded, but the body is bloated: 'One accepted search counts as one use, regardless of the number of records returned' appears twice verbatim, and the quota passage spans many sentences that could be compressed into two. Signal is present but buried in repetition, working against scannability.

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

Completeness5/5

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

With an output schema present, rich annotations, and full schema parameter coverage, the description fills the remaining gaps an agent needs: licensing/quota constraints, data-coverage caveats, source-link verifiability for citation, and the paging/retry cost model. Nothing needed to invoke it correctly or interpret limits is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description nonetheless adds genuine semantics the schema lacks: the NAICS digit-prefix mapping examples, the instruction that VOSB and SDVOSB are distinct and must not be substituted, and the warning not to infer certifications from a veteran-owned request. The sort-by-date caveat and set_aside/default behavior are already covered by the schema, so it stops short of 5.

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 gives a specific verb and resource: 'Searches open federal contract notices in GovInbox's stored SAM.gov data using the supplied NAICS and optional filters,' and states the return shape ('published notice facts and source information'). It does not explicitly contrast with near-siblings such as search_opportunities or search_open_grants, so the differentiation is implicit rather than stated.

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

Usage Guidelines5/5

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

It gives operative routing rules: map industry words to NAICS prefixes with concrete examples (construction -> 23; IT services -> 5415), states a free-text keyword is not a substitute for NAICS, and specifies exactly how to encode 'veteran-owned' versus 'service-disabled veteran-owned' via set_aside. It also states when-not: no bid recommendations, no eligibility determination, no partner suggestions, and follow-up work belongs to other calls.

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.

Resources