Skip to main content
Glama

Search Grants & Contracts (Combined)

search_grants_and_procurement
Read-onlyIdempotent

MIXED search across all 28,696 opportunities from 232 sources — combines grants AND procurement/contracts in one query. This mixes funding types which can create noisy results.

ROUTING — use the specialized tool instead: • User wants grants/funding/fellowships/prizes → search_grantsplus • User wants contracts/RFPs/procurement/bids → search_procurement • User explicitly wants BOTH types → search_grants_and_procurement • Intent unclear → ASK the user first

Use search_grantsplus or search_procurement for cleaner, more relevant results. Free tier: 10 searches/month, full results. Paid plans add higher monthly limits. Paid plans show new listings the day they open; the free plan reaches the same listings after 10 days. Counts toward your monthly searches.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default: 10)
queryNoNatural language search query
sinceNoStateless alternative to posted_within_days/new_within_days: ISO 8601 instant. Only opportunities ingested at/after this instant. Store the previous response newSince.newest and pass it here to manage your own watermark.
cursorNoPagination cursor from previous response
sourceNoFilter by source domain or dataSource (e.g., "grants.gov" or "tier0-sam.gov")
statusNoFilter by status
compactNoReturn compact results (default: true). Compact results include essential fields: id, title, organization, category, url, deadline, deadlineType, daysUntilDeadline, deadlineLabel, lastRoundClosedAt, status, qualityScore, and snippet. Set to false for full details including eligibility, amounts, and match explanations.
categoryNoFilter by category
min_qualityNoMinimum record-completeness tier (default: medium). any removes this quality-tier filter; relevance, access and other filters still apply.
organizationNoFilter by organization or funder name
user_contextNoUser context for better filtering
new_within_daysNoBackwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days for recurring/delta checks ("what is new since my last check"). Additive to all other filters. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. The response includes newSince and windowCoverage: sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowCoverage.order is "recency" for the queryless browse digest or "relevance" when a query is present. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records; ceilingTruncated and hardCeiling are present only when order is "recency" and are omitted entirely under "relevance" (query mode never walks past a single bounded fetch, so no ceiling logic runs). Not the opportunity posted date or deadline.
procurement_typeNoFilter SAM.gov contracts by industry type. professional_services = consulting, engineering, R&D (NAICS 54xxxx, excludes manufacturing/construction noise). it_services = software, IT systems (NAICS 5415xx). construction = building projects (NAICS 23xxxx). manufacturing = production (NAICS 31-33xxxx). Use this to avoid irrelevant commodity results like "O-RING" or "VALVE" when searching for service contracts.
posted_within_daysNoPreferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. In windowCoverage, sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowCoverage.order is "recency" for the queryless browse digest or "relevance" when a query is present. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records; ceilingTruncated and hardCeiling are present only when order is "recency" and are omitted entirely under "relevance" (query mode never walks past a single bounded fetch, so no ceiling logic runs). Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins.
deadline_within_daysNoOnly opportunities closing within N days

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / min_quality / description
      Previous value: -"Minimum quality threshold (default: medium)"New value: +"Minimum record-completeness tier (default: medium). any removes this quality-tier filter; relevance, access and other filters still apply."
    • addedInput schema / properties / user_context / properties / location_strict / description
      Added value: +"With a recognized location, requests geographic filtering; nationwide or unspecified records and explicitly broader fallbacks may remain. Check geographyFilterOutcome and warnings. With sam_filters.place_of_performance_state (or pop_state in batch), true additionally excludes records without a confirmed performance location; false demotes and caveats them."
  2. Changed2 schema fields changed
    • changedInput schema / properties / new_within_days / description
      Previous value: -"Backwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. The response includes newSince and windowCoverage: sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records. Not the opportunity posted date or deadline."New value: +"Backwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. The response includes newSince and windowCoverage: sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowCoverage.order is \"recency\" for the queryless browse digest or \"relevance\" when a query is present. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records; ceilingTruncated and hardCeiling are present only when order is \"recency\" and are omitted entirely under \"relevance\" (query mode never walks past a single bounded fetch, so no ceiling logic runs). Not the opportunity posted date or deadline."
    • changedInput schema / properties / posted_within_days / description
      Previous value: -"Preferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. In windowCoverage, sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records. Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins."New value: +"Preferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. In windowCoverage, sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowCoverage.order is \"recency\" for the queryless browse digest or \"relevance\" when a query is present. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records; ceilingTruncated and hardCeiling are present only when order is \"recency\" and are omitted entirely under \"relevance\" (query mode never walks past a single bounded fetch, so no ceiling logic runs). Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins."
  3. Changed1 schema field changed
    • changedInput schema / properties / compact / description
      Previous value: -"Return compact results (default: true). Compact results include only essential fields (id, title, organization, category, url, deadline, status, qualityScore, snippet). Set to false for full details including eligibility, amounts, and match explanations."New value: +"Return compact results (default: true). Compact results include essential fields: id, title, organization, category, url, deadline, deadlineType, daysUntilDeadline, deadlineLabel, lastRoundClosedAt, status, qualityScore, and snippet. Set to false for full details including eligibility, amounts, and match explanations."
  4. Changed2 schema fields changed
    • changedInput schema / properties / new_within_days / description
      Previous value: -"Backwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days — for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. Sorts newest-ingested-first; response includes newSince.newCount and the newest/oldest ingest timestamp in the window. Not the opportunity posted date or deadline."New value: +"Backwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. The response includes newSince and windowCoverage: sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records. Not the opportunity posted date or deadline."
    • changedInput schema / properties / posted_within_days / description
      Previous value: -"Preferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins."New value: +"Preferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. In queryless browse mode without a single source, the recency window is sampled across sources round-robin by ingest recency so one bulk harvester cannot own the digest; each source remains newest first. In windowCoverage, sourcesSampled counts distinct sources returned by the grouped provider query before MCP quality, judge, recency-withhold, and page filters; it is absent when no grouped sample was available, including when sampling was not attempted, and 0 means the grouped query succeeded but returned no sourced rows; sourcesServed counts distinct sources delivered on this page. windowIncomplete/incompleteReason is separate from ceilingTruncated, which is true only when the 2,000-row ceiling excluded records. Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins."
  5. Changed2 schema fields changed
    • addedInput schema / anyOf
      Added value: +[
      +  {
      +    "required": [
      +      "query"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "source"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "organization"
      +    ]
      +  }
      +]
    • removedInput schema / required
      Removed value: -[
      -  "query"
      -]
  6. Changed3 schema fields changed
    • changedInput schema / properties / new_within_days / description
      Previous value: -"Only opportunities WE ADDED (ingested) in the last N days — for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. Sorts newest-ingested-first; response includes newSince.newCount and the newest/oldest ingest timestamp in the window. Not the opportunity posted date or deadline."New value: +"Backwards-compatible alias for posted_within_days. Only opportunities WE ADDED (ingested) in the last N days — for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. Sorts newest-ingested-first; response includes newSince.newCount and the newest/oldest ingest timestamp in the window. Not the opportunity posted date or deadline."
    • addedInput schema / properties / posted_within_days
      Added value: +{
      +  "description": "Preferred alias for new_within_days: only opportunities WE ADDED (ingested) in the last N days. Uses the same ingest freshness field as newSince/recurring checks; not the opportunity posted date or deadline. If both posted_within_days and new_within_days are supplied, posted_within_days wins.",
      +  "type": "number"
      +}
    • changedInput schema / properties / since / description
      Previous value: -"Stateless alternative to new_within_days: ISO 8601 instant. Only opportunities ingested at/after this instant. Store the previous response newSince.newest and pass it here to manage your own watermark."New value: +"Stateless alternative to posted_within_days/new_within_days: ISO 8601 instant. Only opportunities ingested at/after this instant. Store the previous response newSince.newest and pass it here to manage your own watermark."
  7. Changed2 schema fields changed
    • addedInput schema / properties / new_within_days
      Added value: +{
      +  "description": "Only opportunities WE ADDED (ingested) in the last N days — for recurring/delta checks (\"what is new since my last check\"). Additive to all other filters. Sorts newest-ingested-first; response includes newSince.newCount and the newest/oldest ingest timestamp in the window. Not the opportunity posted date or deadline.",
      +  "type": "number"
      +}
    • addedInput schema / properties / since
      Added value: +{
      +  "description": "Stateless alternative to new_within_days: ISO 8601 instant. Only opportunities ingested at/after this instant. Store the previous response newSince.newest and pass it here to manage your own watermark.",
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / user_context / properties / organization_type / description
      Added value: +"Common natural-language phrasing (e.g. \"501(c)(3) nonprofit\") is also parsed; unparseable values are ignored with an explicit note in the response."
  9. First observed

TDQS

A4.3/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 destructiveHint=false, covering the safety profile. The description adds genuinely useful behavioral context beyond that: the noisy-results caveat from mixing funding types, the 10-searches/month free-tier limit, and the freshness delay (free plan sees new listings after 10 days while paid plans see them the day they open). No contradiction with annotations.

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

Conciseness4/5

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

Front-loaded with purpose and the noise caveat in the first line, followed by compact ROUTING bullets, then plan details. Every section earns its place: the rate limit and freshness facts directly inform the choose-this-vs-sibling decision. The paid-plan phrasing is slightly redundant, but the overall structure is clean and scannable.

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?

For a high-complexity tool (15 params, nested objects, no output schema), the description covers the critical non-schema context: routing guidance, noise tradeoff, monthly quota, and free-tier data-freshness delay. Output shape is partly recoverable from the compact parameter's field list. An agent has everything needed to decide whether to call it and what to expect.

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% — all 15 parameters including the extensive new_within_days/windowCoverage semantics and nested user_context are documented in the schema. Baseline 3 applies; the description doesn't add parameter-level meaning, though the 10-day freshness delay loosely contextualizes the recency parameters.

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?

States a specific verb+resource: 'MIXED search across all 28,696 opportunities from 232 sources — combines grants AND procurement/contracts in one query.' The title says 'Combined' and the description immediately names search_grantsplus and search_procurement as the alternatives, so an agent can tell this tool apart from its siblings without opening either schema.

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?

The ROUTING block is explicit and exhaustive: grants/funding/fellowships/prizes → search_grantsplus, contracts/RFPs/procurement/bids → search_procurement, explicit BOTH → this tool, intent unclear → ASK the user first. It names alternatives, states the selection conditions, and even instructs the agent to ask rather than guess.

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