Skip to main content
Glama
wayanvota

Kindora-for-ChatGPT MCP server

by wayanvota

Kindora-for-ChatGPT MCP server

A Python FastMCP server that re-exposes Kindora's public funder and grant tools so you can add them to ChatGPT as a custom MCP connector (Developer mode / Apps). It is a thin proxy: every tool forwards to the live Kindora MCP endpoint and returns the result unchanged.

Easiest install: deploy, then paste the URL into ChatGPT

ChatGPT can't run a local repo; it connects to a hosted HTTPS URL. This server needs no API keys (Kindora's free tier is open), so hosting it is one click, no Terminal, no .env.

Deploy to Render

  1. Click the button, sign in to Render with GitHub, and approve. Render reads render.yaml and builds the container. First deploy takes ~2 minutes.

  2. Copy the service URL Render gives you and add /mcp to the end, e.g. https://kindora-chatgpt-mcp.onrender.com/mcp.

  3. In ChatGPT: Settings -> Connectors (Apps) -> Advanced -> Developer mode, then Create connector, paste the URL, choose No authentication, and save. Enable it from the "+" menu in any chat.

That's the whole install. (Render's free tier sleeps when idle, so the first request after a quiet spell takes 30-60 seconds to wake. Fly.io, below, stays warmer.)

Related MCP server: Personal Assistant MCP Server

What the Kindora MCP does

Kindora is a grant-discovery platform for nonprofits. Its MCP server is a read-only, free-tier service over public IRS 990 / 990-PF filings and Grants.gov opportunities, covering 174K+ US foundations, 32K+ European funders, and 43K+ open grants. The upstream server exposes ten tools across discovery, profile, financials, and reference categories. This wrapper mirrors the nine that matter for ChatGPT (it drops the upstream list_tools helper, which is redundant since MCP clients enumerate tools natively).

Tool

Purpose

search_funders

Find grantmakers by name, cause area, or location

search_open_grants

Find open opportunities / RFPs by topic (foundation + government)

search_funder_jobs

Find open philanthropy jobs at foundations

get_funder_profile

Detailed profile for one foundation (by EIN)

get_990_summary

IRS 990 financial summary and trends (by EIN)

get_foundation_grants

Individual grants a foundation has made (by EIN)

get_funder_stats

Aggregate giving statistics (by EIN)

get_ntee_codes

Browse/search NTEE cause-area codes

health_check

Upstream health probe

All tools are annotated readOnlyHint: true, so ChatGPT runs them without write-confirmation prompts.

Why wrap it instead of pointing ChatGPT at Kindora directly?

ChatGPT Developer mode can connect to any remote MCP server, so a wrapper is optional. It earns its place when you want one endpoint you control: curated tool descriptions, read-only annotations, a place to add auth / rate limiting / logging, header injection for a Kindora key, or to pin a specific upstream URL. If you want none of that, you can skip this and add https://kindora-mcp.azurewebsites.net/mcp/ to ChatGPT directly.

Repository contents

.
├── server.py            # the MCP server (all nine tools)
├── requirements.txt     # runtime dependency (fastmcp)
├── pyproject.toml        # packaging + pytest config
├── test_server.py        # offline tests (no network needed)
├── Dockerfile            # container image for hosting
├── fly.toml              # one-command deploy to Fly.io
├── render.yaml           # one-click deploy to Render
├── .env.example          # configuration reference
├── .github/workflows/    # CI (runs the tests)
├── LICENSE               # MIT
└── README.md

Requirements

  • Python 3.10+

  • A way to host a public HTTPS URL if you want to use it with ChatGPT (Docker + any host, or the included Fly/Render configs).

Get the code

git clone https://github.com/wayanvota/kindora-chatgpt-mcp.git
cd kindora-chatgpt-mcp
pip install -r requirements.txt

Run locally (stdio)

python server.py

Use this for local testing or to add the server to a stdio MCP client (e.g. Claude Desktop).

Run the tests

pip install -e ".[dev]"
pytest

The suite is offline: it checks tool registration, the read-only annotations, and the upstream-response normalization with a stubbed client. It does not make a live call to Kindora.

Run as a public HTTP endpoint (required for ChatGPT)

ChatGPT connects to a publicly reachable HTTPS URL, so the server must run with the streamable-HTTP transport behind a public host.

TRANSPORT=http HOST=0.0.0.0 PORT=8000 python server.py
# serves MCP at http://<host>:8000/mcp

Or with Docker:

docker build -t kindora-chatgpt-mcp .
docker run -p 8000:8000 kindora-chatgpt-mcp

Put it behind TLS (a reverse proxy, or a platform like Fly.io / Render / Railway / Cloud Run) so the final URL is https://your-domain/mcp.

One-click hosting

This repo ships configs for two free-tier hosts that give you a public HTTPS URL:

Fly.io (fly.toml):

fly launch --no-deploy --copy-config --name <your-app>
fly deploy
# URL: https://<your-app>.fly.dev/mcp

Render (render.yaml): push the repo to GitHub, then in Render choose New + -> Blueprint and pick the repo. URL: https://<service>.onrender.com/mcp.

Connect it to ChatGPT

  1. Enable Developer mode: Settings -> Connectors (Apps) -> Advanced -> Developer mode. (Available on Plus, Pro, Business, Enterprise, and Edu plans.)

  2. Connectors -> Create / Add custom connector.

  3. Enter your public URL, e.g. https://your-domain/mcp.

  4. Authentication: No authentication (this proxy and Kindora's free tier are open). Add OAuth here only if you put your own auth in front.

  5. Save, then enable the connector in a chat (the "+" / tools menu in the composer).

Developer mode does not require the search/fetch compatibility tools that ChatGPT's Deep Research connectors need; it accepts arbitrary named tools, which is why all nine Kindora tools are exposed directly.

Configuration

All via environment variables (see .env.example):

Variable

Default

Notes

TRANSPORT

stdio

http for ChatGPT

HOST

0.0.0.0

HTTP bind host

PORT

8000

HTTP port

MCP_PATH

/mcp

HTTP path

KINDORA_MCP_URL

https://kindora-mcp.azurewebsites.net/mcp/

Upstream to proxy

KINDORA_API_KEY

(unset)

Forwarded as Authorization: Bearer ... if set

KINDORA_TIMEOUT

60

Upstream call timeout (seconds)

Confirm the upstream URL against your Kindora connector listing. If Kindora moves the endpoint, set KINDORA_MCP_URL and nothing else changes.

Notes and limits

  • Read-only / public data. Nothing here writes. Data is public IRS 990 and Grants.gov.

  • Rate limits. Kindora's free tier is roughly 100 requests/hour for anonymous users; the proxy inherits that.

  • Country fields in grant data reflect the recipient's HQ country, not where program work is implemented.

  • Verify before publishing facts. Treat tool output as leads, not citations: confirm a foundation's current giving and open RFPs against the funder's own filings or site.

Available Tools

9 tools
get_990_summaryA
Read-only

Get an IRS 990 / 990-PF financial summary and year-over-year trends for a foundation.

Returns per-year revenue, end-of-year assets, grants paid, mission text, and computed trends for assets, grants, and revenue.

ParametersJSON Schema
NameRequiredDescriptionDefault
einYesFoundation EIN, 9 digits, with or without hyphen.
yearsNoNumber of years of filings to return, 1-10 (default 5).

TDQS

A4/5.0
Behavior3/5

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

Annotations already mark as read-only and open-world. Description adds that it computes trends and returns specific fields, but does not disclose potential missing data or edge cases. With annotations covering safety, the description adds moderate context.

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 concise sentences: first states purpose, second lists returned data. No redundant or unnecessary words.

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?

Given two well-described params and no output schema, the description lists returned fields adequately. Missing details on error cases or data freshness, but overall sufficient for a simple retrieval tool.

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?

Input schema has 100% parameter description coverage. The description adds meaning by listing returned fields, which informs how the 'years' parameter affects the output. Provides context beyond the 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?

Description clearly states it retrieves IRS 990 financial summary and year-over-year trends, listing specific data fields (revenue, assets, grants, mission). This distinguishes it from sibling tools like get_foundation_grants or get_funder_profile.

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?

No explicit guidance on when to use this tool versus alternatives. The purpose is implied by name and description, but no when-not-to or alternative directives are provided.

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

get_foundation_grantsA
Read-only

List individual grants a foundation has made, from its 990-PF filings.

Ordered largest-first with aggregate stats. Each grant reports recipient HQ country and US state when known. Note: recipient_country is where the grantee is registered, not necessarily where program work happens.

ParametersJSON Schema
NameRequiredDescriptionDefault
einYesFoundation EIN, 9 digits, with or without hyphen.
yearNoOptional filing year filter (e.g. 2023).
ntee_codeNoOptional NTEE code to filter recipients (e.g. "B41", "E").
recipient_countryNoISO 3166-1 alpha-2 recipient HQ country (e.g. "IN", "CH", "ZA").
recipient_stateNoTwo-letter US state code for recipient HQ.
purpose_keywordNoCase-insensitive substring matched against grant purpose (e.g. "vaccine", "digital health").
limitNoMax grants, 1-50 (default 20).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations indicate readOnlyHint and openWorldHint. The description adds useful behavioral context: grants are ordered largest-first, include aggregate stats, and note the meaning of recipient_country. This goes beyond annotations without contradiction.

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?

The description is highly concise: two sentences plus a note, front-loaded with the main purpose. Every sentence adds value, with no wasted words.

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?

Given the tool has 7 parameters, no output schema, but good annotations, the description covers the main purpose, ordering, and data source. It lacks details on pagination or result limits, but the schema covers those, so it is largely complete.

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 100%, with each parameter already having a clear description. The tool description does not add any extra meaning or context about parameters beyond what the schema provides, earning baseline 3.

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?

The description clearly states 'List individual grants a foundation has made, from its 990-PF filings,' specifying the verb, resource, and data source. It also notes ordering and aggregate stats, distinguishing it from sibling tools like search_open_grants which search across foundations.

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

Usage Guidelines4/5

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

The description implies usage for listing grants from a specific foundation's filings but lacks explicit guidance on when to use this tool versus alternatives like search_open_grants. No exclusions or when-not-to-use are provided.

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

get_funder_profileA
Read-only

Get a detailed profile for one foundation by EIN.

Returns legal name, location, financials (total assets, annual grants), leadership, classification (foundation type, NTEE), and website. Use search_funders first to find the EIN.

ParametersJSON Schema
NameRequiredDescriptionDefault
einYesFoundation EIN, 9 digits, with or without hyphen ("94-3136777" or "943136777").

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so description reasonably focuses on content (fields returned). It adds useful context about financials, leadership, classification, and website, which goes beyond what annotations provide.

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 efficient sentences: first states purpose, second gives usage guidance. No extraneous words, front-loaded with key action.

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

Completeness5/5

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

Given low complexity (1 param, no output schema), description covers all necessary aspects: purpose, prerequisite workflow, and returned fields. No gaps for an agent to use 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?

Schema already has 100% coverage with detailed description (9 digits, hyphen allowed). Description only mentions 'by EIN' without additional semantic value, warranting baseline score.

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?

Description clearly states 'Get a detailed profile for one foundation by EIN' with specific verb 'get' and resource 'foundation profile'. It lists returned fields, distinguishing it from siblings like search_funders (which finds EIN) and get_990_summary (which returns tax form data).

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?

Explicitly instructs to 'Use search_funders first to find the EIN', providing clear when-to-use guidance and implying an alternative workflow. This precludes misuse and clarifies prerequisites.

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

get_funder_statsA
Read-only

Get aggregate giving statistics for a foundation.

Lifetime totals, average/median/min/max grant size, top NTEE focus areas, US-state and recipient-HQ-country distribution (each with avg grant size), a non_us_recipient_pct headline, and a year-by-year breakdown. Useful for prospect targeting.

ParametersJSON Schema
NameRequiredDescriptionDefault
einYesFoundation EIN, 9 digits, with or without hyphen.

TDQS

A4.1/5.0
Behavior4/5

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

The description is consistent with annotations (readOnlyHint, openWorldHint) and adds behavioral context by detailing the types of aggregated statistics returned. It does not introduce contradictions or undisclosed side effects.

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?

The description is a single, well-organized paragraph: a concise summary followed by a list of metrics and a usage statement. Every sentence adds value without redundancy.

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

Completeness5/5

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

Given the tool has one parameter and no output schema, the description adequately explains the return value in detail (lifetime stats, distributions, etc.). It provides sufficient context for an agent to understand 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?

The input schema fully describes the single parameter (ein) with a clear explanation, so schema coverage is 100%. The description does not add extra parameter information, aligning with the baseline score of 3.

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?

The description clearly states the tool gets aggregate giving statistics for a foundation, listing specific metrics like lifetime totals, averages, NTEE areas, and year-by-year breakdowns. This distinguishes it from sibling tools that provide detailed grant lists or funder profiles.

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 description mentions it is 'useful for prospect targeting,' providing a usage hint. However, it does not explicitly state when to use this tool versus alternatives like get_foundation_grants or get_funder_profile, nor does it specify exclusions.

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

get_ntee_codesA
Read-only

Browse or search NTEE classification codes for cause areas.

Call with no arguments to list all 26 major categories. Filter by category letter or search by description to find codes for use with search_funders / get_foundation_grants.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoSingle letter A-Z (e.g. "E" Health Care, "B" Education, "P" Human Services).
queryNoSearch term against code descriptions (e.g. "education", "youth development").

TDQS

A4.5/5.0
Behavior4/5

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

Annotations indicate readOnlyHint and openWorldHint; the description adds that the tool is for browsing/searching and can list all categories with no arguments. It does not contradict annotations and provides reasonable behavioral context, but could detail output format or pagination.

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?

The description is two sentences, front-loading the purpose and providing concise usage instructions with no fluff.

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

Completeness5/5

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

For a simple lookup tool with no output schema, the description is complete: it explains both usage modes, links to sibling tools, and context signals show no missing elements.

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 100% with adequate parameter descriptions. The description adds no new semantic detail beyond the schema, matching the baseline of 3 for full coverage.

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?

The description clearly states the tool browses or searches NTEE classification codes, and distinguishes its purpose by linking to sibling tools like search_funders and get_foundation_grants. It also explains two modes: listing all categories or searching by category/query.

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 description explicitly tells when to use each mode ('Call with no arguments to list all 26 major categories' and 'Filter by category letter or search by description'), and mentions the codes are for use with other tools, providing clear guidance.

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

health_checkA
Read-only

Check that the upstream Kindora service is reachable and healthy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already indicate read-only and open-world behavior. The description adds the specifics of checking for reachability and health, but does not detail what happens if unhealthy or what the exact response includes. It adds some context beyond annotations but not extensive.

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?

The description is a single clear sentence with no extraneous information. It is front-loaded and directly states the purpose.

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 simple health check tool with no parameters, the description provides sufficient context to understand its purpose and operation. However, it does not specify the return format or what constitutes a healthy response, which could be useful given the lack of an output schema.

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?

The tool has zero parameters and the schema coverage is 100% (trivially). No parameter descriptions are needed, so the description does not need to add meaning beyond the schema. Baseline is 4.

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?

The description clearly states the verb 'check' and the resource 'upstream Kindora service', specifying reachability and health. This distinguishes it from sibling tools that deal with data retrieval about funders and grants.

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 description implies that the tool is for verifying service health before other operations, but it does not explicitly state when to use it or when not to. No alternatives are mentioned, leaving the agent to infer usage context.

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

search_funder_jobsA
Read-only

Find OPEN philanthropy jobs at grantmaking foundations.

Roles involved in giving money away, running philanthropic programs, or executive leadership of philanthropic work. Backed by a weekly scrape of ~50K funder career pages plus LLM classification. Use this for jobs/careers/hiring questions, NOT for grant opportunities (use search_open_grants for those).

For a cause area not covered by the categories below, first call search_funders to get matching funder EINs, then pass them here via funder_eins.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoKeyword search on job title (e.g. "program officer", "grants manager", "CEO").
categoryNoOne of grantmaking, program_leadership, executive_leadership, philanthropy_operations, program_support, development_for_grantmaking, philanthropy_communications, philanthropy_strategy.
stateNoTwo-letter US state code.
countryNoFunder HQ country as ISO alpha-2 ("US", "GB", "DE") or name ("Germany").
funder_einNoRestrict to a single funder by EIN.
funder_einsNoRestrict to a list of funder EINs (up to 100).
employment_typeNoe.g. "full_time", "fellowship".
exclude_categoriesNoCategories to hide. Defaults to hiding philanthropy_operations; pass [] to include every category.
remoteNoRemote filter, e.g. "remote", "hybrid", "onsite".
posted_within_daysNoRecency window in days, 0-730 (0 disables; default 365).
sort_byNo"funder_giving" (biggest funders first, default) or "recent".funder_giving
limitNoMax results, 1-50 (default 20).

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses that the data is 'backed by a weekly scrape of ~50K funder career pages plus LLM classification,' indicating data freshness and methodology. This adds context beyond the annotations (readOnlyHint, openWorldHint) which already indicate the tool is read-only and data may change externally. No contradictions.

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?

The description is concise at 8 sentences, with a clear first sentence stating purpose. It front-loads key information, uses bullet-like structure, and avoids redundancy. Every sentence adds value.

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?

Given 12 parameters, 100% schema coverage, no output schema, and no required params, the description covers purpose, scope, data source, usage boundaries, and workflow integration with siblings. It does not detail return format or pagination, but the limit parameter is documented. Overall highly complete for a search tool.

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

Parameters4/5

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

Schema description coverage is 100%, so most parameters are well-documented. The description adds value by explaining the relationship between search_funders and the 'funder_eins' parameter, and notes limits (up to 100). This extra context justifies a score above the baseline of 3.

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?

The description clearly states the tool's purpose: 'Find OPEN philanthropy jobs at grantmaking foundations.' It specifies the verb, resource, and scope, and distinguishes itself from the sibling tool 'search_open_grants' by explicitly specifying that this tool is for jobs, not grants.

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 description explicitly tells when to use ('for jobs/careers/hiring questions'), when not to use ('NOT for grant opportunities'), and provides an alternative ('use search_open_grants for those'). It also gives a multi-step workflow for uncovered cause areas, instructing to call search_funders first and then pass funder EINs.

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

search_fundersA
Read-only

Find grantmaking organizations by name, cause area, or location.

Searches 174K+ US foundations plus 32K+ European funders from IRS 990 data. Use this to find aligned funders (including ones that fund by relationship, LOI, or annual cycle rather than a live RFP), or when the user names a specific funder. For active/open opportunities use search_open_grants instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFunder name or cause-area phrase. Topic searches work best with 2+ words (e.g. "Ford Foundation", "global health", "community foundation").
stateNoTwo-letter US state code for funder HQ (e.g. "CA", "NY").
cityNoCity name for funder HQ (case-insensitive).
ntee_codeNoNTEE classification code to filter by (e.g. "E" Health, "B" Education).
min_assetsNoMinimum total assets in dollars (e.g. 10000000).
max_assetsNoMaximum total assets in dollars.
has_er_grantsNoIf true, only funders that make expenditure-responsibility grants (to non-501(c)(3) entities like PBCs, for-profits, foreign orgs).
funder_typeNoNarrow to one type, e.g. "community_foundation", "family_foundation", "corporate_foundation", "private_operating", "independent_foundation".
exclude_funder_typesNoTypes to hide, e.g. ["operating_nonprofit"] to drop orgs that surface with large annual_grants but are not really grantmakers.
countryNoOne or more funder HQ countries for non-US funders (e.g. ["Germany", "Spain", "Netherlands"]).
grantee_country_codesNoISO 3166-1 alpha-2 codes for where the funder's grantees are based (e.g. ["IN"], ["KE", "SF"]).
limitNoMax results, 1-50 (default 20).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true and openWorldHint=true. The description adds that it searches 174K+ US and 32K+ European funders from IRS 990 data, implying a broad but possibly stale dataset. It does not mention pagination or exact return format, but overall provides useful behavioral context beyond annotations.

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?

The description is concise with two short paragraphs. The first sentence is a clear verb+resource statement. Every sentence serves a purpose: stating what it does, providing data source, and giving usage guidance with sibling differentiation. No wasted words.

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?

Given the complexity (12 parameters) and lack of output schema, the description covers the core purpose, data sources, and when to use. It could mention output format (list of funders with details) for completeness, but the absence is minor given the clarity otherwise.

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 100% with detailed descriptions for all 12 parameters. The description adds no additional parameter-specific meaning beyond the schema, so the baseline of 3 applies.

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?

The description clearly states the tool finds grantmaking organizations by name, cause area, or location. It also distinguishes from the sibling tool search_open_grants by specifying that search_funders is for funders that may not have a live RFP, while the sibling is for active opportunities.

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 description explicitly provides when to use (to find aligned funders, or when user names a specific funder) and when not to use (for active/open opportunities, use search_open_grants instead). It also adds context that these funders may fund by relationship, LOI, or annual cycle.

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

search_open_grantsA
Read-only

Find OPEN grant opportunities and RFPs by topic or cause area.

The primary tool for finding grants. Searches 172K+ foundation programs and federal Grants.gov opportunities across program names, descriptions, focus areas, and beneficiary types, with stemming and natural-language matching.

Query syntax: natural language ("affordable housing for seniors"), quoted phrases ('"after school"'), and exclusion ("education -higher"). Omit query to browse broadly open programs sorted by upcoming deadline.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoNatural-language search (e.g. "STEM education for girls", "food bank hunger").
focus_areaNoFilter foundation programs by focus area (e.g. "Education", "Health").
agencyNoFilter government grants by agency (e.g. "Department of Education", "NSF").
stateNoTwo-letter US state code; returns state-focused plus nationally available programs.
countryNoCountry name for non-US targeting (e.g. "India", "Kenya", "Global").
deadline_daysNoDeadline lookahead window in days, 1-365 (default 90).
min_awardNoMinimum award amount in dollars.
max_awardNoMaximum award amount in dollars.
nonprofit_onlyNoRestrict to nonprofit-eligible opportunities (default true).
sourceNoLimit to one source: "foundation" or "government".
limitNoMax results, 1-50 (default 20).

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true (safe read) and openWorldHint=true (results may change). The description adds valuable behavioral context: it uses stemming, natural-language matching, and searches across program names, descriptions, focus areas, and beneficiary types. No contradictions with annotations. Some limitations (like rate limits) are not mentioned but not critical.

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?

The description is two paragraphs, about 5-6 sentences, front-loaded with purpose and scope. Every sentence adds value: scope, primary designation, search capabilities, query syntax, and browsing behavior. No fluff or repetition.

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?

Given 11 well-documented parameters, no output schema, and appropriate annotations, the description covers purpose, usage, query variants, and browse option. It does not describe return format explicitly, but for a search tool this is acceptable. Overall sufficiently complete for an agent to use 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?

Schema coverage is 100% with thorough parameter descriptions, so baseline is 3. The description adds minimal extra meaning beyond the schema, except for query syntax notes and the ability to browse by omitting query. This is helpful but does not significantly enhance parameter understanding.

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?

Description clearly states the tool finds open grant opportunities and RFPs by topic, and identifies itself as the primary tool for grants. It specifies the scope (172K+ foundation programs and federal Grants.gov), using a specific verb+resource combination that distinguishes it from sibling tools like get_foundation_grants or search_funders.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool (primary tool for finding grants) and query syntax. It offers examples for natural language, quoted phrases, and exclusion. However, it does not explicitly state when to avoid this tool or alternative tools, though the 'primary' implication is strong.

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. 9 tool updatesv0.1.0
    • First observedget_990_summary
    • First observedget_foundation_grants
    • First observedget_funder_profile
    • First observedget_funder_stats
    • First observedget_ntee_codes
    • First observedhealth_check
    • First observedsearch_funder_jobs
    • First observedsearch_funders
    • First observedsearch_open_grants

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool serves a clear, distinct purpose: foundation financials, grants, profiles, stats, search for funders/grants/jobs, NTEE codes, and health check. Descriptions explicitly differentiate between similar tools like search_funders, search_open_grants, and search_funder_jobs.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (e.g., get_990_summary, search_funders, health_check). No mixing of conventions like camelCase or inconsistent verb forms.

Tool Count5/5

9 tools is well-scoped for a philanthropy-focused server, covering all major user needs: exploring foundations, grants, jobs, and NTEE codes, with a health check. Not too many to overwhelm, and each tool earns its place.

Completeness5/5

The tool set covers the full lifecycle of philanthropy research: finding funders and NTEE codes, retrieving detailed profiles and financial trends, listing individual grants, searching open grants and jobs, and system health. No obvious gaps for the intended use.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers