io.github.cyanheads/grantsgov-mcp-server

Registre officiel Recherche et web

Search Grants.gov funding opportunities and read full records: eligibility, awards, deadlines.

Que pouvez-vous faire avec io.github.cyanheads/grantsgov-mcp-server ?

  • List inputs accept one whole string or an array; blank values and members read as unset. Strings are never split on commas, spaces, or line breaks
  • Keyless client for the Grants.gov REST API (search2, fetchOpportunity), with retries and at most 4 concurrent upstream requests per process
  • Inputs mapped to the form Grants.gov reads as intended: bare keyword terms joined with AND, hyphenated tokens (COVID-19, K-12) matched as phrases, agency codes expanded to their sub-agency subtree, opportunity numbers matched literally, and filter cod...
  • Deadlines counted from today in US Eastern Time, the zone Grants.gov publishes in; far-future stand-in close dates are flagged placeholder rather than reported as deadlines
  • HTML5 entities decoded in human-readable fields; narrative HTML converted to plain text. In content[], agency prose is HTML-escaped, identifiers retain literal code styling, multi-line fields render as blockquotes, and inline text is flattened to one line
  • Echo of what ran: effective_keyword and applied_filters, including defaulted statuses, the expanded agency filter, and the added code 99
  • Discriminated fields: close_date_kind, doc_type, money_source, and unresolved[].outcome let callers branch on data
  • Empty-result and paging notices that name the next call, such as counts of closed and archived matches when the default statuses found nothing, or the next close date when a closing window is empty

Installation

Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).

Remote (streamable-http)
Claude Code
claude mcp add --transport http grantsgov-mcp-server 'https://grantsgov.caseyjhand.com/mcp'
Configuration JSON (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "grantsgov-mcp-server": {
            "type": "http",
            "url": "https://grantsgov.caseyjhand.com/mcp"
        }
    }
}
NPM package @cyanheads/grantsgov-mcp-server
Claude Code
claude mcp add grantsgov-mcp-server -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/grantsgov-mcp-server@0.2.0
Configuration JSON (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "grantsgov-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "@cyanheads/grantsgov-mcp-server@0.2.0"
            ],
            "env": {
                "MCP_LOG_LEVEL": "info"
            }
        }
    }
}

Variables d'environnement

  • MCP_LOG_LEVEL Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').
NPM package @cyanheads/grantsgov-mcp-server
Claude Code
claude mcp add grantsgov-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_PUBLIC_URL=<MCP_PUBLIC_URL>' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/grantsgov-mcp-server@0.2.0
Configuration JSON (Claude Desktop, Cursor, VS Code)
{
    "mcpServers": {
        "grantsgov-mcp-server": {
            "command": "npx",
            "args": [
                "-y",
                "@cyanheads/grantsgov-mcp-server@0.2.0"
            ],
            "env": {
                "MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
                "MCP_HTTP_HOST": "127.0.0.1",
                "MCP_HTTP_PORT": "3010",
                "MCP_HTTP_ENDPOINT_PATH": "/mcp",
                "MCP_PUBLIC_URL": "<MCP_PUBLIC_URL>",
                "MCP_AUTH_MODE": "none",
                "MCP_LOG_LEVEL": "info"
            }
        }
    }
}

Variables d'environnement

  • MCP_TRANSPORT_TYPE Selects the HTTP transport.
  • MCP_HTTP_HOST The hostname for the HTTP server.
  • MCP_HTTP_PORT The port to run the HTTP server on.
  • MCP_HTTP_ENDPOINT_PATH The endpoint path for the MCP server.
  • MCP_PUBLIC_URL Public origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).
  • MCP_AUTH_MODE Authentication mode to use: 'none', 'jwt', or 'oauth'.
  • MCP_LOG_LEVEL Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

Documentation

Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.

Sommaire
  1. @cyanheads/grantsgov-mcp-server
  2. Overview
  3. Capability reference
  4. Features
  5. Getting started
  6. Configuration
  7. Running the server
  8. Project structure
  9. Development guide
  10. Contributing
  11. Data source
  12. License

@cyanheads/grantsgov-mcp-server

Search Grants.gov federal funding opportunities, read full records (eligibility, awards, deadlines, attachments), and decode filter codes via MCP. STDIO or Streamable HTTP.

3 Tools

Public Hosted Server: https://grantsgov.caseyjhand.com/mcp


Overview

US federal funding opportunities from Grants.gov, covering every agency's forecasted, posted, closed, and archived notices. Search by keyword, agency, applicant type, funding category, assistance listing, or deadline window, then read a full record: award range, eligibility, key dates, agency contact, and NOFO attachments. No API key required.

Tools
ToolDescription
grantsgov_search_opportunitiesSearch opportunities by keyword and filters; each row leads with its close date and days left, plus facet counts for narrowing
grantsgov_get_opportunityRead full records for up to 5 opportunities by numeric id or opportunity number
grantsgov_list_referenceList the codes the search filters take (agencies, applicant types, funding categories and instruments), plus statuses, sort options, and keyword syntax

Capability reference

grantsgov_search_opportunities tool
  • Filters: keyword, statuses (default forecasted and posted), agencies (a code includes its sub-agencies), eligibilities, funding_categories, funding_instruments, assistance_listing (one ALN), opportunity_number (exact match), posted_within_days, closing_within_days
  • eligibilities also matches opportunities open to any applicant type (code 99) unless include_unrestricted is false
  • Keyword terms are all required; join alternatives with OR, quote phrases, exclude with NOT or -term, and use a trailing * for prefixes. An ungrouped AND/OR mix or a field prefix (agency:NSF) fails as invalid_keyword
  • closing_within_days (0–365) scans posted opportunities by close date; it allows only the posted status and the close_date_asc sort, and posted_within_days rejects closed and archived (filter_conflict)
  • Up to 100 rows per page (default 25); limit accepts 1–1,000 and values above 100 are capped with a notice. Offset paging uses next_offset; effective_keyword and applied_filters echo what was sent. Sub-agency facets count each subtree under the current upstream query; include_facets: false drops the facet counts
  • Rows carry close_date_kind (fixed, none_listed, placeholder) and days_until_close, but no award amounts. Unknown codes fail as unknown_agency, unknown_eligibility, or unknown_funding_category

grantsgov_get_opportunity tool
  • Accept up to 50 nonblank entries per identifier list and 50 normalized unique identifiers combined. Read the first 5 identifiers, ids before numbers; deferred_ids, deferred_numbers, and an executable continuation carry the remaining queue with the original section offsets. Numbers resolve across all four statuses; selected aliases fetch a record once per call
  • A miss or a number shared by several opportunities comes back in unresolved[] as not_found or ambiguous (with candidates), not as an error
  • Records carry the close date (an estimate on forecasts, flagged by close_date_is_estimate), award ceiling and floor, total funding, expected awards, cost sharing, applicant types with the eligibility narrative, assistance listings, and the agency contact
  • Funding and eligibility fields come from the synopsis or forecast block matching doc_type, named in money_source; forecasts add forecast_estimates
  • Independent pages: description 12,000 characters, eligibility narrative 6,000, funding-category explanation 2,000, attachments 30, application packages 10, and related opportunities 10. The six zero-based inputs are description_offset, eligibility_offset, funding_category_explanation_offset, attachment_offset, application_package_offset, and related_opportunity_offset (default 0). Each record's pages supplies full totals and executable single-opportunity continuations; partial narratives retain *_truncated, and past-end pages are empty. Attachments include download_url and the unchanged upstream created_date when listed
  • last_revision_note and last_revision_changed summarize the active synopsis or forecast's latest revision when listed. Changed names map to public fields; unknown names keep an upstream: prefix. Missing metadata does not mean nothing changed

grantsgov_list_reference tool
  • topic: agencies, eligibilities, funding_categories, funding_instruments, statuses, sort_options, or keyword_syntax
  • Codes come from a live Grants.gov snapshot, cached for 24 hours and dated by snapshot_date, with open_count (forecasted and posted) and total_count per code (statuses carries total_count only); sort_options and keyword_syntax are static
  • agencies lists the top level by default; parent_code lists every code under one agency, and name_contains matches labels and codes on any topic (for agencies, at every level)
  • parent_code with another topic fails as filter_not_applicable; an unknown code fails as unknown_parent_code

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

Grants.gov-specific:

  • List inputs accept one whole string or an array; blank values and members read as unset. Strings are never split on commas, spaces, or line breaks
  • Keyless client for the Grants.gov REST API (search2, fetchOpportunity), with retries and at most 4 concurrent upstream requests per process
  • Inputs mapped to the form Grants.gov reads as intended: bare keyword terms joined with AND, hyphenated tokens (COVID-19, K-12) matched as phrases, agency codes expanded to their sub-agency subtree, opportunity numbers matched literally, and filter codes checked against the live vocabulary
  • Deadlines counted from today in US Eastern Time, the zone Grants.gov publishes in; far-future stand-in close dates are flagged placeholder rather than reported as deadlines
  • HTML5 entities decoded in human-readable fields; narrative HTML converted to plain text. In content[], agency prose is HTML-escaped, identifiers retain literal code styling, multi-line fields render as blockquotes, and inline text is flattened to one line

Agent-friendly output:

  • Echo of what ran: effective_keyword and applied_filters, including defaulted statuses, the expanded agency filter, and the added code 99
  • Discriminated fields: close_date_kind, doc_type, money_source, and unresolved[].outcome let callers branch on data
  • Empty-result and paging notices that name the next call, such as counts of closed and archived matches when the default statuses found nothing, or the next close date when a closing window is empty
  • Typed failure reasons with recovery hints, including upstream_unavailable, rate_limited, and upstream_route_unavailable for Grants.gov outages

Getting started

Public Hosted Instance

A public instance is available at https://grantsgov.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

{
  "mcpServers": {
    "grantsgov-mcp-server": {
      "type": "streamable-http",
      "url": "https://grantsgov.caseyjhand.com/mcp"
    }
  }
}
Self-Hosted / Local

Add the following to your MCP client configuration file. No API key is needed.

{
  "mcpServers": {
    "grantsgov-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/grantsgov-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with npx (no Bun required):

{
  "mcpServers": {
    "grantsgov-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/grantsgov-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

Or with Docker:

{
  "mcpServers": {
    "grantsgov-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/grantsgov-mcp-server:latest"]
    }
  }
}

For Streamable HTTP, set the transport and start the server:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
  • Bun v1.4.0 or higher (or Node.js v24+).
  • Network access to api.grants.gov. No account or API key is required.
Installation
  1. Clone the repository:
git clone https://github.com/cyanheads/grantsgov-mcp-server.git
  1. Navigate into the directory:
cd grantsgov-mcp-server
  1. Install dependencies:
bun install
  1. Configure environment (optional):
cp .env.example .env
# every variable is optional; the server has no settings of its own

Configuration

The server reads no configuration of its own: the Grants.gov API is keyless and its endpoints are fixed. These framework variables control transport, auth, and logging.

VariableDescriptionDefault
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto. The server declares stateless; set this only to override it.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<app-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for the full list of optional overrides.

Running the server

Local development
  • Build and run the production version:
    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:http
    # or
    bun run start:stdio
  • Run checks and tests:
    bun run devcheck  # Lints, formats, type-checks, and more
    bun run test      # Runs the test suite
Docker
docker build -t grantsgov-mcp-server .
docker run --rm -p 3010:3010 grantsgov-mcp-server

The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/grantsgov-mcp-server. OpenTelemetry peer dependencies are installed by default; build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point: registers the tools and starts and disposes the Grants.gov service.
src/mcp-server/tools/definitionsTool definitions (*.tool.ts).
src/mcp-server/toolsShared input schemas (input-schemas.ts) and format() rendering helpers (render.ts).
src/services/grants-govGrants.gov API client, keyword compiler, reference snapshot, date and money normalization, HTML-to-text.
tests/Unit and tool tests mirroring src/, with trimmed Grants.gov response fixtures.
docs/design.mdDesign notes: probed API behavior and the decisions behind the tool surface.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for logging and ctx.fail with the tool's declared error reasons
  • Register new tools in src/mcp-server/tools/definitions/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

bun run devcheck
bun run test

Data source

Opportunity data comes from Grants.gov, where federal agencies post their funding opportunities. The records are US government works. This project is not affiliated with or endorsed by Grants.gov or any federal agency.

License

This project is licensed under the Apache 2.0 License. See the LICENSE file for details.

Questions fréquentes

Qu'est-ce que io.github.cyanheads/grantsgov-mcp-server ?

Search Grants.gov funding opportunities and read full records: eligibility, awards, deadlines.

Comment installer io.github.cyanheads/grantsgov-mcp-server ?

Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http grantsgov-mcp-server 'https://grantsgov.caseyjhand.com/mcp'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.

Faut-il une clé API pour io.github.cyanheads/grantsgov-mcp-server ?

Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.

io.github.cyanheads/grantsgov-mcp-server est-il open source ?

Oui. Son code est sur GitHub sous licence Apache-2.0.

Qui maintient io.github.cyanheads/grantsgov-mcp-server ?

Il est publié par cyanheads. AI.tn le référence sans le maintenir ni le recommander.

Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.