Server definition
- Hash
- sha256:07995bc3442409d19a14ed2912644e64c501b29d1927c9c4d02c2e20431535ad
- What it is
- What a remote MCP server returned when asked what it offers: 13 tools
The blob, as servednamed by its sha256
{
"instructions": "\n Kindora MCP Server - Access foundation and funder data.\n\n This server provides tools to search and analyze philanthropic foundations\n using IRS 990 data. Available tools:\n\n FREE TIER (No authentication required):\n - search_funders: Look up grantmaking organizations by name, topic, or location\n - search_open_grants: Find open grant opportunities by TOPIC, cause area, or keywords\n (full-text search across program names, descriptions, focus areas, beneficiary types,\n and geographic focus; supports natural language queries, quoted phrases, and -term exclusion;\n use state param for geographic targeting)\n - search_funder_jobs: Find OPEN PHILANTHROPY JOBS at foundations — program officers,\n grants managers, foundation CEOs, etc. Filter by category (grantmaking,\n program_leadership, executive_leadership, etc.), state, country (funder HQ —\n \"US\"/\"GB\"/\"Germany\"; the corpus spans European funders), remote status,\n or funder_ein. Backed by a weekly scrape + GPT-5.4-mini classification.\n - get_funder_profile: Get detailed profile for a specific foundation\n - get_990_summary: Get IRS 990 filing financial summary\n - get_foundation_grants: View grants made by a foundation\n - get_ntee_codes: Browse NTEE classification codes\n - get_funder_stats: Get aggregate giving statistics\n\n CRITICAL — CHOOSING THE RIGHT SEARCH TOOL:\n - User wants ACTIVE grant opportunities or RFPs for a topic/cause area\n (e.g., \"criminal justice reform\", \"youth education\", \"climate resilience\")\n → use search_open_grants\n - User wants FUNDER ORGANIZATIONS aligned to a topic/cause area, including\n funders that may not have a live RFP right now → use search_funders\n - User wants JOBS in philanthropy (program officers, grants managers,\n foundation CEOs, etc.) → use search_funder_jobs\n - User names a SPECIFIC ORGANIZATION (e.g., \"Ford Foundation\", \"MacArthur\") →\n use search_funders\n - User wants to BROWSE funders by location or size → use search_funders\n - When exploring a cause area, it is often helpful to run BOTH:\n search_funders for aligned funders and search_open_grants for active opportunities.\n\n BEST PRACTICES for search_open_grants:\n - Always use the state parameter when the user has a known US location\n - For non-US geographies (e.g. India, Kenya, Mexico, Global), use the\n country parameter — pass the country name as plain text, e.g.\n country=\"India\". Mixing state with a non-US country is rejected because\n state implies US-only filtering.\n - Use natural language queries that describe what you're looking for\n (e.g., \"youth after school programs\", \"affordable housing for seniors\")\n - Quoted phrases work for exact matching: '\"mental health\" youth'\n - Use -term to exclude: \"education -higher\" excludes higher education results\n - Run multiple targeted searches with different keywords rather than one broad search\n - Combine state + query (or country + query) for the most relevant results\n - Omit query entirely to browse open programs ordered by upcoming deadline\n - Do NOT filter by source=\"government\" unless specifically asked — the foundation\n corpus is much larger and most topic searches return better results without\n filtering. Omit the source parameter to search both sources together.\n\n BEST PRACTICES for search_funders:\n - Use the `state` parameter to filter by the funder's US HQ state.\n - Use `grantee_country_codes` (FIPS 10-4 codes — \"UK\", \"IN\", \"KE\", \"SF\",\n etc.) to restrict to funders whose actual grantees are based in a given\n non-US country. This is the right filter when the user asks \"who funds\n work in India?\" or \"find me UK-grantee funders\" — it joins against the\n grantee-distribution materialized view rather than the funder's own HQ.\n Pass a list of codes; multiples OR together. Cannot be combined with\n ILIKE-only single-word name lookups (e.g. \"Gates\"); the filter forces\n the hybrid path automatically when set.\n\n All tools are read-only and rate-limited. Exact request ceilings vary by\n traffic tier and tool cost; anonymous users should expect roughly 100\n requests/hour overall with tighter caps on expensive browse-heavy paths.\n\n FAIR USE & BATCH INTEGRATIONS:\n Interactive discovery (a person or assistant researching funders) is free\n and welcome. Automated, scheduled, or batch integrations are welcome too,\n but MUST self-identify by sending an 'X-Kindora-Client: <your-app-name>'\n header on every request. Identifying yourself pays: on serverless platforms\n that rotate egress IPs (e.g. Supabase Edge Functions), apps that do not\n identify themselves share one small pooled allowance, while identified apps\n draw from the platform's larger shared allowance. The label is attribution,\n not authentication.\n\n DEDICATED ACCESS: integrators who need more than the shared free\n allowances can register a Kindora account at\n https://www.kindora.co/developers and send a service key\n ('Authorization: Bearer kdra_org_...') for a dedicated org lane with\n substantially higher velocity limits. For sustained batch volume or data\n licensing, email [email protected] — we are friendly to\n integrators and would rather talk than throttle.\n ",
"tools": [
{
"description": "Find grantmakers that have ACTUALLY funded organizations LIKE the caller's,\nusing the real 7.5M-edge who-funds-whom grant graph (IRS 990-PF, 2022-2026).\nThis is the strongest free-tier prospecting move: collaborative-filtering\npeer prospecting, distinct from search_funders (name/topic lookup) and\nsearch_open_grants (active RFPs).\n\nHOW IT WORKS: for each peer organization, it looks up every foundation that\ngranted to that peer, then merges funders across peers. A funder that gave\nto several of your peers ranks highest. Every result carries real grant\nevidence — which peers the funder funded and for how much.\n\nINPUTS (provide one):\n- peer_orgs (PREFERRED): names or 9-digit EINs of organizations LIKE the one\n you're raising for — peers, aspirational orgs, or orgs with a similar\n mission. The graph is keyed by recipient EIN, so naming real peers yields\n the sharpest evidence. Up to 12 are used.\n- org_description: a SHORT CAUSE PHRASE, not a paragraph — \"food bank\",\n \"mental health\", \"affordable housing\". Fallback for when you cannot name\n peers: it matches the phrase against IRS BMF organization NAMES and, if\n that finds nothing, against the NTEE cause taxonomy, then uses the\n best-funded organizations in that cause (biased to `location`). It does\n NOT search mission text, so a LONGER description matches FEWER orgs, not\n more — keep it to the cause, and prefer peer_orgs. The response reports\n which pass produced the peers in `peer_discovery`.\n\nRECOMMENDED WORKFLOW: establish the org's mission/cause, then name 2-5 peer\norganizations and call this tool. Deepen any candidate with\nget_funder_profile / get_foundation_grants (pass the returned ein).",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 10,
"description": "Maximum number of funders to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional 2-letter state or \"City, ST\". Only biases peer\ndiscovery under org_description; never filters funders."
},
"min_amount": {
"default": 5000,
"description": "Minimum single-grant size in USD (default 5000)",
"minimum": 0,
"type": "integer"
},
"org_description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Short cause phrase for the nonprofit (fallback).\nExample: \"youth mental health\". Adding words narrows the match."
},
"peer_orgs": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Names or EINs of peer / aspirational organizations.\nExample: [\"Greater Chicago Food Depository\", \"Feeding America\"]."
}
},
"type": "object"
},
"name": "find_funders_for_peers",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Find the foundations that have ACTUALLY granted to ONE specific nonprofit —\nthe reverse of get_foundation_grants, over the real 7.5M-edge who-funds-whom\ngrant graph (IRS 990-PF, 2022-2026).\n\nUse this when the question is about a SINGLE org: \"who funds Greater Chicago\nFood Depository?\", \"which foundations support this nonprofit?\", or to\nprospect from one well-funded peer. To aggregate the same signal across\nSEVERAL peer orgs, use find_funders_for_peers instead.\n\nPass recipient_ein when known (most precise). Otherwise pass recipient_name\nand it is resolved to the best IRS-registered match — the response echoes\nwhich nonprofit it resolved to under 'recipient'; confirm it's the org the\ncaller meant.\n\nCOVERAGE: US private-foundation (990-PF) grants only. Government grants,\ncorporate giving, and most donor-advised funding do NOT appear, so an empty\nresult means \"no tracked foundation reported a grant to this org\", not\n\"this org has no funders\" — say exactly that.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 25,
"description": "Maximum number of funders to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"min_amount": {
"default": 1000,
"description": "Minimum single-grant size in USD (default 1000)",
"minimum": 0,
"type": "integer"
},
"nonprofit_ein": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Alias for recipient_ein. The tool name says 'nonprofit', so MCP clients send nonprofit_ein= — accept both; recipient_ein wins when both are set."
},
"nonprofit_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Alias for recipient_name. The tool name says 'nonprofit', so MCP clients send nonprofit_name= (256 rejected calls by 2026-09-30, ticket #1890) — accept both; recipient_name wins when both are set."
},
"recipient_ein": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "EIN of the RECIPIENT nonprofit whose funders you want."
},
"recipient_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Name of the recipient nonprofit (resolved via the IRS\nBMF registry when recipient_ein is not given)."
}
},
"type": "object"
},
"name": "find_funders_of_nonprofit",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Get IRS 990 filing summary and financial trends for a foundation.\n\nThis tool retrieves IRS 990 filing data (Form 990 or 990-PF) for a foundation,\nshowing financial information over time. It calculates year-over-year trends\nfor assets, grants, and revenue.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ein": {
"description": "Foundation EIN (9 digits). Can include hyphens (e.g., \"94-3136777\")\n or be provided as digits only (e.g., \"943136777\").",
"type": "string"
},
"years": {
"default": 5,
"description": "Number of years of filing data to return (1-10)",
"maximum": 10,
"minimum": 1,
"type": "integer"
}
},
"required": [
"ein"
],
"type": "object"
},
"name": "get_990_summary",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "View grants made by a funder across IRS, web-extracted, and registry records.\n\nMerges five stores. **(1) IRS 990-PF filings** — structured grant lines from\nthe ~143K US private foundations that file 990s, keyed by EIN. **(2)\nWeb-extracted grant records** — our enrichment pipeline crawls funder\nwebsites and an LLM extracts their grant lists. This second store covers\n~15K additional US foundations AND ~17K non-990 funders (European\nfoundations, US community foundations, DAFs, corporate giving programs).\n**(3) 360Giving** UK GrantNav rows, **(4) CRA T3010** Canadian rows, and\n**(5) ACRI** Italian banking-foundation erogazioni are structured registry\nsources with original-currency amounts preserved.\n\nUse this for ANY funder when the user asks about grants given, including\nEuropean funders without an EIN (pass ``funder_id`` instead of ``ein``).\nEach row in the response carries a ``source`` field (``\"990\"`` for IRS\ndata, ``\"discovered_web\"`` for crawled, plus ``\"360giving\"``, ``\"t3010\"``,\nand ``\"acri\"`` for structured registries). When web-extracted rows for a\nfunder lack captured amounts (common for European funders that publish PDFs\nrather than open data), the response includes an ``amount_coverage_note``\nin ``data_quality`` — surface that caveat in your reply.\n\nNote: ``recipient_country`` reflects the recipient organization's HQ\ncountry (where the grantee is registered), not necessarily where the\nprogram work is implemented.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ein": {
"default": "",
"description": "Foundation EIN (9 digits, hyphens OK). Required for US 990 path.\n Optional if ``funder_id`` is supplied for a non-990 funder.",
"type": "string"
},
"funder_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional non-990 funder id. Accepts a bare UUID or\n prefixed id like ``n9f:<uuid>`` / ``non990:<uuid>``. Use this\n for European funders, US community foundations, DAFs, and\n other funders that don't file IRS 990-PF. You can get it from\n search_funders or get_funder_profile."
},
"limit": {
"default": 20,
"description": "Maximum number of grants to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"ntee_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional NTEE code to filter recipient organizations.\n Example: \"B41\" (Higher Education), \"E\" (Health).\n Use get_ntee_codes to browse available codes."
},
"purpose_keyword": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional case-insensitive substring to match against\n the grant_purpose field. Useful for narrowing to a topic when\n recipient NTEE code is too coarse — e.g., purpose_keyword=\"vaccine\"\n surfaces Gates grants whose purpose text mentions vaccines, even\n when the recipient is classified outside health (universities,\n think tanks, etc.)."
},
"recipient_country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional recipient country filter. Use ISO\n 3166-1 alpha-2 codes (e.g., \"CH\" Switzerland, \"ZA\" South\n Africa, \"NG\" Nigeria, \"IN\" India). A code that is valid ISO\n is always read as ISO (\"NG\" is Nigeria, never Niger; \"SN\" is\n Senegal, never Singapore); legacy FIPS 10-4 codes match only\n when they are not ISO codes at all (\"UK\", \"SF\"). Output\n codes are emitted in ISO 3166."
},
"recipient_state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional 2-letter US state code to filter by\n recipient state (e.g., \"CA\", \"NY\")."
},
"year": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional year to filter by (filing_year for 990, grant_year\n for discovered). If not provided, returns all available years."
}
},
"type": "object"
},
"name": "get_foundation_grants",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Get detailed profile information for a specific funder.\n\nPolymorphic identifier — pass ``ein`` for US 990 foundations OR\n``funder_id`` (bare UUID / ``n9f:<uuid>``) for non-990 funders such as\nEuropean, UK 360Giving, and Canadian CRA T3010 funders. ``search_funders``\nreturns both fields on every hit, so the caller can hand either one back\nhere. At least one identifier must be supplied.\n\nUse this after searching for funders to get detailed information about a\nspecific one.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ein": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Foundation EIN (9 digits) for US 990 funders. Can include hyphens\n (e.g., \"94-3136777\") or be provided as digits only (e.g., \"943136777\").\n Optional if ``funder_id`` is supplied for a non-990 funder."
},
"funder_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional non-990 funder id. Accepts a bare UUID or\n ``n9f:<uuid>`` / ``non990:<uuid>``. The ``usf:<ein>`` prefix is\n also accepted and routes back to the EIN path."
}
},
"type": "object"
},
"name": "get_funder_profile",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Get comprehensive giving statistics for a funder.\n\nThis tool calculates aggregate statistics about a funder's grantmaking\nfrom IRS 990-PF data, web-extracted grant records, 360Giving rows, CRA\nT3010 rows, and ACRI rows. It provides lifetime totals, focus areas, geographic\ndistribution, and year-over-year trends.\nPass ``ein`` for US 990 foundations, or ``funder_id`` (bare UUID /\n``n9f:<uuid>``) for non-990 funders.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"ein": {
"default": "",
"description": "Foundation EIN (9 digits). Can include hyphens (e.g., \"94-3136777\")\n or be provided as digits only (e.g., \"943136777\"). Optional when\n funder_id is supplied.",
"type": "string"
},
"funder_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional non-990 funder id (bare UUID / ``n9f:<uuid>``)."
}
},
"type": "object"
},
"name": "get_funder_stats",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Browse NTEE (National Taxonomy of Exempt Entities) classification codes.\n\nNTEE codes are used to classify nonprofit organizations by their primary\npurpose. This tool helps you find the right NTEE code for searching or\nunderstanding a foundation's focus area.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Single letter (A-Z) to browse codes in a major category.\n Example: \"A\" for Arts, Culture & Humanities\n \"B\" for Education\n \"E\" for Health Care\n \"P\" for Human Services"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Search term to find codes by description (case-insensitive).\n Example: \"education\", \"youth\", \"environment\""
}
},
"type": "object"
},
"name": "get_ntee_codes",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Check server health and connectivity.\n\nReturns:\n Dictionary with health status including:\n - status: \"healthy\" or \"unhealthy\"\n - version: Server version\n - environment: Current environment (dev/staging/prod)",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "health_check",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "List available MCP tools and get detailed help.\n\nUse this tool to discover what tools are available and how to use them.\nCall without parameters to see all tools, or provide a tool name to get\ndetailed help including parameters, examples, and related tools.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"tool_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional name of a specific tool to get detailed help for.\n Example: \"search_funders\", \"get_funder_profile\""
}
},
"type": "object"
},
"name": "list_tools",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Search OPEN PHILANTHROPY JOBS at grantmaking foundations.\n\nSurfaces roles involved in giving away money, running philanthropic\nprograms, or executive leadership of philanthropic work. Backed by a\nweekly scrape of ~50K funder careers pages + GPT-5.4-mini\nclassification against an 8-category taxonomy.\n\nCategories (use the `category` param to filter):\n - grantmaking: Program officers, grants managers, RFP reviewers\n - program_leadership: VP Programs, Chief Program Officer, Program\n Director (cause-area)\n - executive_leadership: CEO, President, Executive Director at a\n foundation or community foundation\n - philanthropy_operations: Foundation finance/HR/IT/COO\n - program_support: Program associates, M&E officers, learning\n officers, program coordinators\n - development_for_grantmaking: Major gifts officers and development\n roles at community foundations and other regranting entities\n (NOT university or hospital development for the parent's\n operations)\n - philanthropy_communications: Foundation comms staff\n - philanthropy_strategy: Chief Strategy Officer, impact officer,\n equity & inclusion at a foundation\n\nWhat's excluded by design: clinical/medical, retail, academic\nteaching, university advancement for the university itself,\nhospital fundraising for hospital ops, construction/facilities.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "One of the 8 philanthropy categories above."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Funder HQ country — ISO 3166-1 alpha-2 (\"US\", \"GB\", \"DE\") or a\nrecognized name (\"United Kingdom\", \"Germany\"). Filters by where the\nFOUNDATION is headquartered; the corpus spans European funders, not\njust US. Independent of `state` (US foundations are the only ones\nwith state-level location data)."
},
"employment_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "full-time | part-time | contract | internship |\nfellowship | temporary."
},
"exclude_categories": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Categories to hide. Default is no category exclusions; the public jobs board includes operations roles. Pass specific category names to suppress them."
},
"funder_ein": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Restrict to one funder by EIN (9 digits, optional\nprefixes/dashes accepted)."
},
"funder_eins": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Restrict to a LIST of funder EINs (up to 100). The\nrecommended compositional pattern is search_funders →\nsearch_funder_jobs(funder_eins=[...]) for cause-area searches\n(climate, racial equity, youth, etc.) where the cause isn't\ncaptured by the 8 role-family categories."
},
"funder_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Restrict to one funder by the polymorphic id search_funders returns and the other funder tools accept: usf:<ein>, n9f:<uuid>, non990:<uuid>, a bare EIN or a bare UUID. Ignored when funder_ein/funder_eins is given."
},
"limit": {
"default": 20,
"description": "Maximum number of results to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"posted_within_days": {
"default": 365,
"description": "Recency window in days (0-730). Set 0 to disable.",
"maximum": 730,
"minimum": 0,
"type": "integer"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Keyword search on job title (case-insensitive substring).\nExamples: \"program officer\", \"grants manager\", \"CEO\",\n\"communications director\"."
},
"remote": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "remote | hybrid | on-site."
},
"seniority": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Experience level: internship_fellowship | entry_level | mid | senior | executive. Comma-separate for multi-select — 'entry_level,internship_fellowship' is the early-career shelf (new grads, students). Rows not yet leveled by the classifier are excluded when set."
},
"sort_by": {
"default": "funder_giving",
"description": "Result ordering. 'funder_giving' (default) ranks by the foundation's annual average giving so the biggest funders surface first. 'recent' sorts by posted_at desc.",
"type": "string"
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "2-letter US state code (e.g., \"CA\", \"NY\"). Uses a broad SQL\nprefilter plus an exact token-aware post-filter against the\nlocation field."
}
},
"type": "object"
},
"name": "search_funder_jobs",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Look up grantmaking organizations by name, topic, or location.\n\nThis tool searches 174K+ grantmaking organizations from IRS data using\norganization names plus grant-purpose/topic signals. Use it when you know\nthe funder's name, want aligned funders for a cause area, or want to browse\nby location/size/NTEE code. Multi-word searches are ranked by relevance;\nsimple browse/name fallback results are ordered by total assets.\n\nIMPORTANT: Use search_open_grants when the user needs active grant programs\nor RFPs. search_funders is for finding aligned grantmakers, including ones\nthat may fund by relationship, LOI, or annual cycle rather than a live call.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "City name to filter by (case-insensitive).\n Example: \"San Francisco\", \"New York\""
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional HQ country name (or list of names) to restrict to\n funders headquartered in those countries (e.g., \"Germany\",\n [\"United States\", \"Canada\"]). Distinct from\n `grantee_country_codes` (where the funder's grants land) and\n from `state` (US state of HQ). Use when the user asks for\n funders based in a specific country — e.g. \"European-headquartered\n foundations\" → country=[\"Germany\",\"Spain\",\"United Kingdom\",\n \"Switzerland\",\"Netherlands\",\"France\"]. US foundations are\n included only when \"United States\" (or \"USA\") is in the list,\n or when the param is omitted."
},
"exclude_funder_types": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional list of canonical funder_type codes to exclude\n from results. NOTE: this search ALREADY excludes the operating-entity\n types by default — private_operating (pharma patient-assistance\n foundations) and operating_nonprofit (hospital / university group\n returns) post large \"annual_grants\" but aren't grantmakers you can\n apply to. Use this for ADDITIONAL categories; to opt an operating\n type back in, name it in funder_type instead."
},
"funder_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional canonical funder_type to include. Examples:\n \"community_foundation\", \"family_foundation\", \"corporate_foundation\",\n \"private_operating\", \"operating_nonprofit\", \"independent_foundation\". Use this to narrow to\n a specific kind of grantmaker. NOTE: operating entities\n (private_operating, operating_nonprofit) are EXCLUDED BY DEFAULT —\n name one here to include it (e.g. to look up a specific hospital or\n patient-assistance foundation)."
},
"grantee_country_codes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Optional list of FIPS 10-4 country codes\n (e.g., \"UK\" for United Kingdom, \"IN\" for India, \"KE\" for Kenya,\n \"SF\" for South Africa) to restrict to funders whose grantees are\n located in those countries. Use this when the user is asking\n for funders that move money into a specific non-US geography.\n Country here is the grantee's HQ country, derived from\n foundation_grants. When set, the search is forced through the\n hybrid path; the ILIKE-only name-match path cannot filter by\n country. Distinct from `state`, which filters by the funder's\n own US HQ."
},
"has_er_grants": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter to foundations that make expenditure responsibility grants\n (grants to non-501(c)(3) entities like PBCs, for-profits, and foreign orgs).\n Set to True to find only ER-active funders."
},
"has_pris": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter to foundations with known program-related investment\n activity. Set true when looking for PRI-active capital providers."
},
"limit": {
"default": 20,
"description": "Maximum number of results to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"max_assets": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum total assets filter in dollars.\n Example: 100000000 (foundations with up to $100M assets)"
},
"metro": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Colloquial metro / region name for sub-state geography a single\n city can't capture — \"Bay Area\", \"NYC\", \"the DMV\", \"Greater\n Boston\", \"Los Angeles\", \"Chicago\", \"Seattle\". Resolved to its\n MSA/CBSA code set and applied as an HQ pre-filter. PREFER this\n over `city` whenever the user names a metro/region rather than\n one municipality (e.g. \"Bay Area funders that fund drug rehab\"\n → query=\"drug rehab addiction\", metro=\"Bay Area\"). Accepts a\n single name or a list. City names resolve too ('Cleveland',\n 'Knoxville', 'Portland, OR'). An unrecognized name does NOT error:\n the search runs without that metro filter and the result carries\n `geo_notice` saying so (with a did-you-mean when one is close).\n Example: \"Bay Area\", [\"NYC\", \"Greater Boston\"]"
},
"min_assets": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Minimum total assets filter in dollars.\n Example: 10000000 (foundations with $10M+ assets)"
},
"msa_codes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Explicit MSA/CBSA codes when you already know them\n (e.g. [\"41860\", \"41940\"]); unioned with whatever `metro`\n resolves to. Most callers should use `metro`."
},
"ntee_code": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "NTEE classification code to filter by.\n Example: \"A20\" (Arts Organizations), \"B\" (Education), \"E\" (Health)"
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Search term for a funder name or cause-area phrase.\n Example: \"Ford Foundation\", \"global health\", \"community foundation\"\n Topic searches work best with 2+ words."
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Two-letter US state code to filter by funder HQ location.\n Example: \"CA\", \"NY\", \"TX\""
}
},
"type": "object"
},
"name": "search_funders",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Search the ~2M-org universe of US nonprofits (IRS Business Master File) —\nthe RECIPIENT / grantee side, distinct from search_funders (the grantmaker\nside). Use this to benchmark peer organizations, research a cause's\nlandscape, or find well-funded peers and then look up WHO funds them.\n\nEach result carries 990 financials (revenue, program-expense ratio,\nemployees, governance score) and recipient-side funding signals:\n`total_grants_received` (tracked foundation $ received), `funder_count`\n(distinct funders), `avg_grant_size_received`, and `funder_concentration_hhi`.\n\nCHOOSING THE RIGHT TOOL:\n- Want FUNDERS to apply to → use search_funders.\n- Want to research/benchmark RECIPIENT nonprofits (peers, \"who received\n $X\", landscape of a cause) → use search_nonprofits.\n- Found a well-funded peer and want their funders → note its `funder_count`,\n then use get_foundation_grants / search_funders to find who funds that work.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"active_only": {
"default": true,
"description": "Only IRS-active orgs (default True).",
"type": "boolean"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Case-insensitive exact city name."
},
"limit": {
"default": 20,
"description": "Maximum number of results (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"max_received": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum total received."
},
"max_revenue": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"metro": {
"anyOf": [
{
"type": "string"
},
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Colloquial metro/region (\"Bay Area\", \"NYC\", \"Chicago\",\n\"Greater Boston\") or a city name (\"Cleveland\", \"Portland, OR\")\n→ resolved to its MSA codes. Prefer over city for metro-area\nintent. An unrecognized name does not error: the search runs\nwithout the metro filter and the result carries `geo_notice`."
},
"min_employees": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Minimum employee count."
},
"min_funder_count": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Minimum distinct funders."
},
"min_received": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Minimum total grant dollars RECEIVED (the key\ngrantee-benchmarking filter — \"received over $1M\")."
},
"min_revenue": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null
},
"msa_codes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "Explicit CBSA codes if you already know them."
},
"ntee_codes": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"description": "NTEE classification PREFIXES (e.g. [\"K31\"] food banks,\n[\"E\"] health, [\"B20\"] schools). Prefix match, so \"K\" = all\nfood/agriculture, \"K31\" = food banks specifically."
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Case-insensitive substring match on the organization name."
},
"sort_by": {
"default": "received",
"description": "received (default) | revenue | funders | name.",
"type": "string"
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "2-letter US state code (e.g. \"IL\")."
}
},
"type": "object"
},
"name": "search_nonprofits",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
},
{
"description": "Search open grant opportunities from Kindora's active foundation-program corpus plus federal and state government grants.\n\nFOR-PROFIT APPLICANTS: pass for_profit_applicant=true to search capital a\nfor-profit can take (PRIs, loans, revenue-based financing, patient equity)\nfrom CDFIs, impact investors, and PRI-active foundations. The default pool\nis 501(c)(3)-shaped and will NOT contain those programs.\n\nSearches both private foundation grant programs (from IRS data and funder websites)\nand government grant opportunities — federal (Grants.gov) plus state and district\ngrant portals. Uses full-text search\nwith natural language understanding — queries are parsed into individual terms with\nstemming, so \"youth after school programs\" matches programs about youth, after-school,\nand programming even if those exact words don't appear together.\n\nSearch covers program names, descriptions, focus areas, beneficiary types, and\ngeographic focus fields. Use the state parameter to focus on geographically relevant\nopportunities.\n\nQuery syntax:\n- Natural language: \"affordable housing for seniors\" (matches any of these terms)\n- Quoted phrases: '\"after school\"' (matches exact phrase)\n- Exclusion: \"education -higher\" (matches education, excludes higher education)\n- Combine: '\"mental health\" youth -adult' (phrase + term + exclusion)\n- No query: returns broadly open programs sorted by upcoming deadlines (browsing mode)",
"inputSchema": {
"additionalProperties": false,
"properties": {
"agency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter government grants by agency name (case-insensitive).\n Example: \"Department of Education\", \"NSF\", \"NIH\""
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Where the applicant works — a country name or a region.\n Returns funders scoped to that place PLUS regional and global\n funders, with place-specific ones ranked first (a Kenyan\n applicant also sees \"Sub-Saharan Africa\" and worldwide funders).\n Native names work (\"Deutschland\", \"Espana\"). OMIT when the user\n has not named a place: \"Global\"/\"International\" is accepted but\n simply means no geographic restriction, so it is never needed.\n An unrecognised value broadens the search rather than emptying\n it. Use this instead of state for international queries —\n passing \"India\" via state would error because state requires a\n US code. Mixing state with a non-US country is rejected.\n Example: \"India\", \"Kenya\", \"Southeast Asia\", \"Deutschland\""
},
"deadline_days": {
"default": 90,
"description": "Deadline lookahead window in days (1-365)",
"maximum": 365,
"minimum": 1,
"type": "integer"
},
"focus_area": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter foundation programs by focus area (matches values in focus_areas array).\n Example: \"Education\", \"Health\", \"Environment\""
},
"for_profit_applicant": {
"default": false,
"description": "Set TRUE when the applicant is a FOR-PROFIT entity (social enterprise, public benefit corporation, B Corp, L3C, CDFI). Routes foundation-program search to the for-profit capital pool: loans, program-related investments, revenue-based financing, patient equity, guarantees — capital a company can actually take. Default False = the 501(c)(3) grant pool, which deliberately excludes those instruments.",
"type": "boolean"
},
"limit": {
"default": 20,
"description": "Maximum number of results to return (1-50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"max_award": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum grant size filter in dollars.\n Example: 500000 (grants up to $500K)"
},
"min_award": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Minimum grant size filter in dollars.\n Example: 50000 (grants of $50K+)"
},
"nonprofit_only": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "GOVERNMENT-grants applicant filter only. Omit for the entity-aware default: true for nonprofits and false for for-profit applicants. Does not open the foundation pool — use for_profit_applicant."
},
"query": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Natural language search query. Searches across program names, descriptions,\n focus areas, beneficiary types, and geographic focus. Supports quoted phrases\n for exact matching and -term for exclusion.\n Example: \"youth outdoor education\", \"affordable housing\", \"STEM education for girls\",\n \"food bank hunger\", \"climate change environment\", \"domestic violence women\""
},
"source": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Filter by grant source type.\n Options: \"foundation\" (private foundation programs only),\n \"government\" (federal + state government grants only),\n or omit for both sources combined.\n PREFER omitting this — the foundation corpus is much larger, and\n filtering to government-only often returns few or zero results."
},
"state": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Two-letter US state code to filter by geographic relevance.\n Returns programs focused on that state plus nationally available programs.\n Example: \"CA\", \"NY\", \"TX\""
},
"topic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Alias for query. The tool description says 'by TOPIC', so many MCP clients send topic= (32 rejected calls by 2026-07-11) — accept both; query wins when both are set."
}
},
"type": "object"
},
"name": "search_open_grants",
"outputSchema": {
"additionalProperties": true,
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:07995bc3442409d19a14ed2912644e64c501b29d1927c9c4d02c2e20431535ad | sha256sum