Skip to main content
Glama
Thel-Consulting

Federal Funding Finder

Federal Funding Finder

A free, open-source, read-only MCP server for SBIR/STTR and federal grants. It searches Grants.gov, NIH RePORTER and the NSF Award Search API. Every result carries the URL of the record it came from.

  • No accounts, no API keys, no user data stored. See PRIVACY.md.

  • TypeScript, the official @modelcontextprotocol/sdk, streamable HTTP transport, built as a Netlify Function (/mcp) with a Netlify Blobs response cache.

  • MIT licensed. Maintained by Thel Consulting.

The five tools and their data sources

Tools

All tools are read-only (readOnlyHint: true, destructiveHint: false) and validate input with zod.

Tool

What it does

Source

search_open_opportunities

Forecasted and posted funding opportunities. Filters: keyword, agency code (for example HHS-NIH11, NSF, DOD), eligibility codes (23 is small businesses), status, rows, offset, plus the noise filters below.

Grants.gov search2

search_nih_awards

Funded NIH projects. Defaults to SBIR/STTR activity codes R43, R44, R41, R42. Filters: text, org states, institutes (IC), fiscal years, activity codes.

NIH RePORTER v2

search_nsf_awards

NSF awards. Defaults to SBIR/STTR (fundProgramName=SBIR OR STTR). Filters: keyword (supports AND, OR, NOT), awardee state, award date range, rows, offset.

NSF Award Search

similar_funded_projects

Takes a project description, extracts key terms, searches NIH and NSF, and ranks funded projects by term overlap.

NIH and NSF

agency_sbir_summary

SBIR/STTR counts and dollar totals by fiscal year, activity code or program, top organizations, and by state when no state is given.

NIH or NSF

Grants.gov noise filters (search_open_opportunities). Grants.gov keeps listing some records long after they stopped being useful, so these run on the server after each upstream page:

Parameter

Default

Drops

open_only

true

Posted opportunities whose close date is before today (America/Denver).

forecast_max_age_days

365

Forecasts posted more than this many days ago, for example 2024 and early 2025 forecasts that never turned into a posting. 0 turns it off.

rolling_max_age_days

1460

Posted opportunities with no close date that were posted more than 4 years ago, for example the FY 2021 to FY 2023 EDA regional notices. Rolling programs from the last 4 years, such as EDA Public Works (posted 2023), are kept. 0 turns it off.

exclude_no_close_date

false

Every posted opportunity with no close date. Off by default because many are real rolling programs. Forecasts never have a close date on Grants.gov, so it does not apply to them.

posted_after

none

Anything, posted or forecast, with an open date before this YYYY-MM-DD date.

domestic_only

true

State Department overseas posts: agency code DOS-* with an agency or title naming a U.S. Mission, Embassy or Consulate (for example DOS-TUN, U.S. Mission to Tunisia). Washington bureaus such as DOS-ECA stay.

Each result reports dropped (a count per filter), scanned, next_offset and a note, so nothing is hidden silently. rows counts results after filtering: the tool pages through Grants.gov 250 records at a time, up to 1,000 records per call, until it has rows results. Pass next_offset as offset to continue. On 2026-10-17 the research park query (eligibility 12, 06, 00, 02, 04, 966 matches) kept 812 records with the defaults and dropped 136 stale forecasts, 9 stale rolling notices and 9 overseas mission notices. Grants.gov already omitted posted records past their close date, so open_only dropped none that day.

Notes on the data:

  • NIH RePORTER returns one record per project per fiscal year, so a multi-year award appears once per year. Amounts are that year's award_amount.

  • NSF multi-word keywords are ORed by the API. Use AND to require every word.

  • NSF summary amounts are total funds obligated to each award, grouped by the fiscal year of the award date.

  • agency_sbir_summary is built to finish within about 7 seconds, under Netlify's 10 second function limit. It pulls at most 2,000 NIH records (4 pages) or 600 NSF awards (24 pages, 8 in parallel). When the upstream total is larger it returns partial: true with a partialNote, and byFiscalYear[].upstreamCount gives the exact per-year count from the API. Dollar totals then cover only the aggregated records. Measured locally, cold cache: NSF all states over 25 fiscal years took 4.1 s, NIH all states over 25 fiscal years took 2.8 s.

  • SBIR.gov's public API returned HTTP 403 when checked on 2026-10-16, so it is not used.

Related MCP server: SBIR

Example prompts

  • NIH SBIR awards to South Dakota companies since 2020

  • Open Grants.gov SBIR opportunities that small businesses can apply to

  • Open grants a research park can apply to (nonprofit, higher education, state, city and special district eligibility)

  • NSF SBIR awards in South Dakota

  • Funded projects similar to a biofilm wound dressing

  • NIH SBIR/STTR totals by year for South Dakota

Connect

Hosted endpoint on Netlify:

{
  "mcpServers": {
    "funding-finder": { "url": "https://federal-funding-finder.netlify.app/mcp" }
  }
}

A custom domain (https://<subdomain>.thelconsulting.com/mcp) is planned and not set up yet (TODO). Docs: https://federal-funding-finder.netlify.app

The same config ships as mcp.json for the Cursor plugin (.cursor-plugin/plugin.json) and the Grok plugin (.grok-plugin/plugin.json).

Local development

Requires Node 20 or later and the Netlify CLI (npm i -g netlify-cli). Local dev needs no Netlify account or login.

npm install
npm run dev            # netlify dev --offline: docs/ on http://localhost:8888, MCP at http://localhost:8888/mcp, local Blobs store
npm run inspect        # MCP Inspector CLI, tools/list against the local server
npm run demo           # calls each tool with the demo prompts and reports timings, writes artifacts/demo-output.json
npm run stdio          # stdio transport, for clients or Inspector setups that launch a command
npm test               # unit tests plus contract tests that call the real APIs
npm run test:unit      # unit tests only, no network
npm run scan:secrets   # gitleaks if installed, plus grep checks

Layout:

  • netlify/functions/mcp.ts: the MCP endpoint, POST /mcp (stateless streamable HTTP, JSON responses).

  • netlify/functions/health.ts: GET /health.

  • src/: tools, upstream clients, cache and rate limiter, shared by the function and the stdio entry (src/stdio.ts).

  • docs/: the static site (landing and privacy pages), published as is.

Deploying

The production site is federal-funding-finder on Netlify (https://federal-funding-finder.netlify.app), deployed from the CLI with netlify deploy --prod (publish directory docs, functions in netlify/functions, both set in netlify.toml). Netlify Blobs needs no extra setup on a deployed site.

Rate limiting is per IP, 60 requests per minute. On Netlify it is enforced at the edge by the rateLimit rule in netlify/functions/mcp.ts (Netlify may take up to about 10 seconds to start blocking). A second limiter in function memory (RATE_LIMIT_PER_MINUTE, default 60) also applies per function instance and is what netlify dev and the stdio entry use.

Data sources

  • Grants.gov search2 API: POST https://api.grants.gov/v1/api/search2 (docs)

  • NIH RePORTER API v2: POST https://api.reporter.nih.gov/v2/projects/search (docs). NIH asks clients to keep to about one request per second; summaries page sequentially.

  • NSF Award Search API: GET https://www.research.gov/awardapi-service/v1/awards.json, falling back to https://api.nsf.gov/services/v1/awards.json (docs). The service moved to Research.gov; the old host still answers.

This project is not affiliated with or endorsed by any federal agency.

Design

Visuals follow the Quartz design system by Arlan Marat (MIT). docs/vendor/quartz/tokens.css is an unchanged copy with its license. Token notes are in design/quartz-tokens.md. The logo is a draft pending approval.

License

MIT. See LICENSE.

Available Tools

5 tools
agency_sbir_summarySummarize SBIR/STTR awards by year and stateA
Read-onlyIdempotent

Read-only. Aggregates SBIR/STTR award counts and dollar totals by fiscal year (and by state when no state is given) from NIH RePORTER (activity codes R43, R44, R41, R42) or NSF Award Search (fundProgramName SBIR OR STTR). Finishes within about 7 seconds: pulls at most 2,000 NIH records or 600 NSF awards and marks the result partial, with a note, when the upstream total is larger.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateNo
agencyYes
keywordNo
fiscal_year_toNoDefaults to the current fiscal year
fiscal_year_fromNoDefaults to five years before the current fiscal year

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so 'Read-only' earns nothing. What the description adds is genuinely useful and not in the annotations: an expected latency (~7 seconds), hard result caps (2,000 NIH records or 600 NSF awards), and the disclosure that wider queries return a partial-marked result with an accompanying note.

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?

Two dense sentences, front-loaded with the aggregation purpose, then the source filters, then the performance and truncation caveats. No filler sentences and no restatement of the title.

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 no output schema, the description does the work of describing the return shape (counts, dollar totals, partial flag plus note) and the cost/limits. Only gaps are the undocumented keyword parameter and the precise semantics of omitting state versus supplying it.

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 coverage is 40% and only fiscal_year_from/to carry descriptions (their defaults). The description compensates partially by explaining what the state parameter does to grouping and how agency maps to each upstream source's filter syntax, but keyword is undocumented in both schema and description, and the state-as-grouping phrasing is slightly ambiguous.

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 (aggregates) plus the resource (SBIR/STTR awards) and the aggregation axes (counts and dollar totals by fiscal year, and by state). It also names the two upstream sources with their exact filter mechanics (NIH activity codes R43/R44/R41/R42; NSF fundProgramName SBIR OR STTR), which cleanly separates it from the search_nih_awards / search_nsf_awards siblings.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: 'aggregates ... counts and dollar totals' suggests the summary role versus the raw-search siblings, but no sibling is named and there is no explicit when-to-use / when-not-to-use rule. The state-grouping behavior is described, but that is a behavior note, not routing guidance.

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

search_nih_awardsSearch NIH awards (NIH RePORTER)A
Read-onlyIdempotent

Read-only. Searches funded NIH projects in NIH RePORTER v2. Defaults to SBIR/STTR activity codes R43, R44, R41, R42. Each row is one project in one fiscal year, so a multi-year project can appear more than once. Every result links to RePORTER.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoWords to match in title, abstract and terms
limitNo
offsetNo
institutesNoNIH institute or center abbreviations, for example NCI, NIGMS, NIAID
org_statesNoTwo-letter state codes of the awardee organization
fiscal_yearsNo
text_operatorNoand
activity_codesNoNIH activity codes. Omit for R43, R44, R41, R42. Pass [] for all activity codes.
fiscal_year_toNo
fiscal_year_fromNo
include_abstractNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the bar is lower, and the description still adds real behavioral context: the default activity-code filter (R43/R44/R41/R42) that silently shapes results, the row granularity caveat that a multi-year project can appear more than once, and that every result links back to RePORTER. It stops short of noting rate limits, auth, or pagination behavior.

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?

Three short, front-loaded sentences: scope, then default-filter gotcha, then result-shape caveats. 'Read-only' is a slight duplication of the readOnlyHint annotation, but otherwise each line carries information an agent needs.

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

Completeness3/5

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

With no output schema, 11 parameters, and low schema coverage, the description covers purpose, default filtering, and result granularity but omits pagination guidance (offset max 14999), the []-for-all-activity-codes escape hatch beyond the schema, and any auth/rate-limit expectations. Adequate for selection, thin for correct invocation.

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

Parameters2/5

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

Schema description coverage is only 36% across 11 parameters, so the description is expected to compensate, yet it only restates the activity_codes default that the schema already documents. Nothing is said about text matching, limit/offset bounds, institutes, org_states, or fiscal year filters, leaving most parameters without added meaning.

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 and resource ('Searches funded NIH projects in NIH RePORTER v2') and immediately pins the default scope to SBIR/STTR activity codes, which naturally separates it from siblings like search_nsf_awards and search_open_opportunities. An agent can tell what this returns without opening the schema.

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

Usage Guidelines3/5

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

Usage is implied by the scope statement (funded projects, not open opportunities) and the default-filter note, but no explicit when-to-use/when-not guidance or named alternatives are given despite four siblings in the same family. The agent must infer routing from the 'NIH funded projects' framing.

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

search_nsf_awardsSearch NSF awards (NSF Award Search API)A
Read-onlyIdempotent

Read-only. Searches NSF awards through the NSF Award Search API on Research.gov. Defaults to SBIR/STTR awards (fundProgramName 'SBIR OR STTR'). Multi-word keywords are ORed by NSF; use AND between words to require all. Every result links to NSF.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNo
stateNoAwardee state, for example SD
offsetNo
keywordNoFree text; supports AND, OR, NOT and quoted phrases
award_date_toNoLatest award date, YYYY-MM-DD
sbir_sttr_onlyNo
award_date_fromNoEarliest award date, YYYY-MM-DD
include_abstractNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds real context beyond that: the upstream API, the implicit SBIR/STTR filter applied by default, and NSF's OR-between-words keyword behavior. Rate limits, pagination behavior (offset caps at 2999), and result shape are not disclosed.

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?

Four short sentences, front-loaded with the read-only signal and zero filler. The closing 'Every result links to NSF' is the weakest sentence but still conveys an output detail, which matters given no output schema.

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

Completeness3/5

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

Covers source, default filter, and keyword syntax for an 8-parameter tool, but with no output schema and half the parameters undocumented, it says nothing about result fields, page-size limits, or how include_abstract changes the response. Adequate but with clear gaps for a search tool of this breadth.

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 coverage is only 50%, and the description compensates where it matters: it explains that sbir_sttr_only defaults on (why results are SBIR/STTR-heavy) and clarifies NSF's multi-word OR semantics beyond the schema's generic 'supports AND, OR, NOT' note. It leaves rows, offset, and include_abstract entirely to the bare schema.

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 (Searches) and resource (NSF awards) plus the exact backend (NSF Award Search API on Research.gov). The resource scope inherently separates it from search_nih_awards, search_open_opportunities, and agency_sbir_summary without the agent opening any schema.

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

Usage Guidelines2/5

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

No when-to-use, when-not-to-use, or named alternative appears. The default SBIR/STTR scoping hints at a typical use case but is framed as behavior, not routing guidance, so the agent gets no help choosing between this and its four siblings.

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

search_open_opportunitiesSearch open federal funding opportunities (Grants.gov)B
Read-onlyIdempotent

Read-only. Searches forecasted and posted funding opportunities on Grants.gov (search2 API). Use it to find open SBIR/STTR solicitations and other grants. Every result links to its Grants.gov page.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNo
agencyNoGrants.gov agency code, for example HHS-NIH11 (NIH), NSF, DOD, USDA. Pipe-separate several.
offsetNo
statusNoDefaults to both forecasted and posted
keywordNoFree text, for example 'SBIR' or 'wound care'
eligibilityNoGrants.gov eligibility codes. 23 = small businesses. Codes: 11 Native American tribal organizations (other than Federally recognized tribal governments); 12 Nonprofits having a 501(c)(3) status with the IRS, other than institutions of higher education; 13 Nonprofits that do not have a 501(c)(3) status with the IRS, other than institutions of higher education; 20 Private institutions of higher education; 21 Individuals; 22 For profit organizations other than small businesses; 23 Small businesses; 25 Others; 99 Unrestricted; 00 State governments; 01 County governments; 02 City or township governments; 04 Special district governments; 05 Independent school districts; 06 Public and State controlled institutions of higher education; 07 Native American tribal governments (Federally recognized); 08 Public housing authorities/Indian housing authorities

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description does add real context beyond them — that coverage spans forecasted and posted records and that each result links to its Grants.gov page — but says nothing about pagination behavior or result size, which is the main behavioral unknown for a search tool.

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?

Four short sentences, front-loaded with the read-only signal and then purpose, usage and output note. Efficient overall, though the leading 'Read-only.' partially duplicates readOnlyHint=true already supplied as structured data.

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

Completeness3/5

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

There is no output schema, so the description carries the burden of describing returns; it does so only in one line ('every result links to its Grants.gov page') and never explains pagination across rows/offset, which matters for a 6-parameter search tool. Purpose and basic usage are covered, but the operational guidance is thin.

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 67%: agency, status, keyword and eligibility are well documented in the schema (eligibility even enumerates all codes), while rows and offset carry no descriptions. The description adds no parameter-level meaning at all; the undocumented pair are self-evident pagination fields with defaults and bounds, so this is baseline-adequate rather than deficient.

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?

States a specific verb and resource — searching forecasted and posted funding opportunities on Grants.gov — plus the backing API (search2) and result shape. It implicitly separates itself from the award-search siblings by scoping to 'open opportunities,' but it never names a sibling explicitly, so it falls short of full differentiation.

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

Usage Guidelines3/5

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

'Use it to find open SBIR/STTR solicitations and other grants' gives a clear intended scenario, which is stronger than nothing. However, there is no when-not guidance and no reference to the sibling tools (search_nih_awards, search_nsf_awards, agency_sbir_summary), so the agent must infer the boundary between opportunity search and award search.

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

similar_funded_projectsFind similar funded projects (NIH + NSF)A
Read-onlyIdempotent

Read-only. Given a project description or keywords, extracts key terms, searches NIH RePORTER and NSF Award Search, and ranks funded projects by term overlap with your description. Scores are a simple keyword overlap, not a semantic judgment.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sourcesNo
descriptionYesProject description or keywords
sbir_sttr_onlyNoLimit to SBIR/STTR awards
fiscal_year_fromNoNIH fiscal year and NSF award year lower bound

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: the tool fans out to two external award databases and the returned scores are a naive keyword overlap rather than semantic similarity, which is a material caveat about result quality that no annotation conveys.

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?

Three tight sentences with the safety marker front-loaded, then the mechanism, then the scoring caveat — no padding. The leading 'Read-only' duplicates the readOnlyHint annotation, a small redundancy, but the ordering is otherwise well front-loaded.

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 no output schema, the description does the necessary work of describing the return conceptually (ranked funded projects with overlap scores) and warns that those scores are not semantic judgments. It stops short of describing result fields or empty-result behavior, but an agent has enough to call it correctly.

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?

At 60% schema description coverage, three of five parameters (description, sbir_sttr_only, fiscal_year_from) are documented in the schema. The description reinforces that the `description` parameter drives keyword extraction and clarifies that it covers both NIH fiscal years and NSF award years, but says nothing about `limit` or `sources`, leaving the coverage gap unclosed.

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 concrete verb chain (extracts key terms, searches NIH RePORTER and NSF Award Search, ranks by term overlap) over a specific resource (funded projects), so the mechanism is unambiguous. It implicitly separates itself from single-source siblings like search_nih_awards and search_nsf_awards by searching both and ranking rather than just listing, but no sibling is named explicitly, which keeps it short of a 5.

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

Usage Guidelines3/5

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

The trigger condition is implied by 'Given a project description or keywords,' which tells the agent what input shape to supply, but there is no explicit when-to-use statement, no when-not-to-use, and no routing guidance against the sibling award-search tools. Usage is inferable but not spelled out.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedagency_sbir_summary
    • First observedsearch_nih_awards
    • First observedsearch_nsf_awards
    • First observedsearch_open_opportunities
    • First observedsimilar_funded_projects

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation4/5

The two agency search tools (search_nih_awards, search_nsf_awards) and the aggregator (agency_sbir_summary) are clearly distinct in purpose, and search_open_opportunities covers a separate source. However, similar_funded_projects overlaps meaningfully with the two award-search tools since it queries the same NIH/NSF sources and only adds ranking, which could cause misselection.

Naming Consistency3/5

Three tools follow a clean search_noun pattern (search_open_opportunities, search_nih_awards, search_nsf_awards), but agency_sbir_summary leads with a noun and similar_funded_projects with an adjective, breaking the verb-first convention. The names remain readable despite the mixed patterns.

Tool Count4/5

Five tools is a lean but sensible set for an SBIR/STTR funding discovery server, with each tool covering a distinct source or aggregation. It is slightly thin—no per-award detail or cross-source rollup tool—but nothing feels redundant.

Completeness4/5

The surface covers the core lifecycle of SBIR/STTR discovery: open opportunities, funded awards from two major agencies, aggregate counts, and similarity search. Minor gaps exist (no detail/lookup by award ID, no coverage of other SBIR agencies like DOD/DOE), but results link out and core workflows are supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Provides access to SBA small business size standards and SBIR/STTR federal R\&D funding data. It enables users to look up NAICS thresholds, verify business eligibility, and search for specific firms or award records across various federal agencies.
    6
    1
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to search and retrieve federal small business research and technology transfer award data, including keyword, company, agency, and phase queries, via a free public API without authentication.
    42 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables asking questions in natural language about live grants.gov funding opportunities, with tools to find, filter, check eligibility, track deadlines, and rank matches—while refusing to guess when data is unavailable.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Read one exact U.S. federal grant opportunity next to its official record with seven MCP tools for cited documents, requirements, amendments, hard gates, award history, and unresolved evidence. Independent UtilityHouse product; limited free beta.
    MIT