nonprofit-explorer-mcp-server
Server Details
MCP server for nonprofit financials via ProPublica — IRS Form 990 data for 1.8M+ nonprofits.
- Status
- Healthy
- Uptime
- 100.0% over 49 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/nonprofit-explorer-mcp-server
- GitHub Stars
- 2
- Server Listing
- nonprofit-explorer-mcp-server
TDQS
Scored across 3 tools
Each tool has a clearly distinct role: search by name/keyword, fetch an organization profile by EIN, and retrieve detailed filings by EIN. The slight overlap between get_organization's financial snapshot and get_filings is clarified by descriptions emphasizing profile vs. detailed filing history.
All tools share a consistent nonprofit_ prefix followed by a clear verb_noun pattern: search, get_organization, get_filings. The naming is uniform and predictable.
Three tools is on the lean side but appropriate for a focused read-only nonprofit explorer: discover, inspect, and analyze filings. Each tool serves a distinct, necessary purpose without redundancy.
The surface covers the core read-only workflow: search for organizations, retrieve profile details, and access historical filing data. Minor gaps exist (e.g., no direct officer/compensation-only query), but the provided tools handle the primary use cases well.
Available Tools
3 toolsnonprofit_get_filingsGet Nonprofit FilingsARead-onlyIdempotentInspect
All Form 990 filings for a tax-exempt org by EIN: year-by-year revenue, expenses, assets, liabilities, net assets, revenue breakdown, executive compensation, and source PDF links. Use for trend analysis, due diligence, and accessing primary 990 documents. The filing year (tax_prd_yr) is the fiscal year of the return — data lags 1–2 years; always cite the year. An organization that resolves but has filed no 990 returns an empty filings array with a notice, not an error. Also returns filings_pdf_only — older filings with a PDF but no extracted financial data. Data from ProPublica Nonprofit Explorer, sourced from IRS Form 990 filings.
| Name | Required | Description | Default |
|---|---|---|---|
| ein | Yes | Employer Identification Number. Use nonprofit_search to resolve an org name to its EIN. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ein | No | Employer Identification Number as integer. |
| name | No | Legal org name per IRS. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when the organization resolved but Nonprofit Explorer holds no filing of any kind for it — names the org and why the filing history is empty. An empty filings array without this notice means the org has filings that carry a PDF but no extracted data; read filings_pdf_only. |
| filings | No | Filings with extracted financial data, sorted newest first. |
| data_source | No | ProPublica + IRS attribution text. |
| propublica_url | No | ProPublica Nonprofit Explorer URL for this org. |
| filings_pdf_only | No | Older filings with a PDF but no extracted financial data. |
| total_filings_pdf_only | No | Count of PDF-only filings (no extracted data). |
| total_filings_with_data | No | Count of filings with extracted financial data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent, so the description carries relatively low burden there. It adds valuable behavioral context: data lags 1–2 years, always cite the filing year, empty filings array with a notice for organizations with no 990s, and a filings_pdf_only subset for older PDF-only filings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably compact and front-loaded with the main resource and field list, followed by use cases and critical caveats. Every sentence carries useful information; no filler. It is slightly long but justified by the behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover safety, the description supplies all remaining decision context: data lag, citation expectations, the empty-filings behavior, the PDF-only variant, and the data source. An agent has enough to invoke the tool correctly and interpret unusual results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the ein parameter exhaustively, covering integer and string forms, leading-zero handling, and the hint to use nonprofit_search for name resolution. The description only adds 'by EIN' and the tax_prd_yr context, which does not significantly extend the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb and resource: returns 'All Form 990 filings for a tax-exempt org by EIN.' It enumerates the included data fields and the scope clearly separates it from the sibling nonprofit_get_organization and nonprofit_search tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases: 'trend analysis, due diligence, and accessing primary 990 documents.' It also warns about the fiscal-year lag and citation need. It does not explicitly rule out siblings, but the context is clear enough for an agent to select the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nonprofit_get_organizationGet Nonprofit OrganizationARead-onlyIdempotentInspect
Full profile for a single tax-exempt org by EIN: legal name, address, NTEE classification, 501(c) type, IRS ruling date, and a financial snapshot from the most recent Form 990 filing (revenue, expenses, assets, net assets, and the source PDF link). Also returns the IRS Business Master File standing — whether contributions are deductible, exemption status, and public-charity vs. private-foundation classification. Use nonprofit_search first if you only have an org name — this tool requires an EIN. Data lags 1–2 years; the tax year is shown prominently. Data from ProPublica Nonprofit Explorer, sourced from IRS Form 990 filings.
| Name | Required | Description | Default |
|---|---|---|---|
| ein | Yes | Employer Identification Number. Accepts integer (530196605) or string with optional hyphen ("53-0196605"). Obtain from nonprofit_search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ein | No | Employer Identification Number as integer. |
| city | No | City. Null when not on record. |
| name | No | Legal org name per IRS. |
| error | No | Present when the call failed. Absent on success. |
| state | No | Two-letter state abbreviation. Null when not on record. |
| strein | No | EIN in "XX-XXXXXXX" format. |
| address | No | Street address. Null when not on record. |
| zipcode | No | ZIP code. Null when not on record. |
| ntee_code | No | Full NTEE code (e.g., "E210" = hospital). Null when unclassified. |
| sort_name | No | IRS Business Master File secondary name line (SORT_NAME) — an internal sort key such as a division or service-center label, not an alternate organization name. Null for most orgs. |
| deductible | No | Whether contributions to this org are tax-deductible, as "<IRS code> — <meaning>". Three states, not two: code 1 deductible, code 2 not deductible, code 4 deductible by treaty (foreign orgs). Null when the IRS Business Master File records no deductibility code. |
| data_source | No | ProPublica + IRS attribution text. |
| ruling_date | No | ISO date of IRS recognition (e.g., "1946-07"). Null when not on record. |
| asset_amount | No | Most recent IRS BMF total assets in USD. Null when not on record. |
| filing_count | No | Total filings with extracted data on record. |
| exempt_status | No | IRS exemption status as "<IRS code> — <meaning>"; code 1 is an unconditional exemption. This records what the IRS granted, not whether the exemption is still in force — the Business Master File is a lagging snapshot and automatic revocations are published separately. Null when the Business Master File records no status code. |
| income_amount | No | Most recent IRS BMF total income in USD. Null when not on record. |
| latest_filing | No | Financial snapshot from the most recent Form 990. Null if no filings_with_data are available. |
| bmf_tax_period | No | Tax period of the latest return recorded in the IRS Business Master File (e.g. "2025-06-01"). Often more recent than latest_filing.tax_prd_yr, which reflects the newest 990 ProPublica has extracted. Null when not on record. |
| propublica_url | No | ProPublica Nonprofit Explorer URL for this org. |
| revenue_amount | No | Most recent IRS BMF total revenue in USD. Null when not on record. |
| foundation_type | No | IRS foundation classification as "<IRS code> — <meaning>", separating public charities (codes 10–25) from private foundations (codes 2–4). Codes 0 (all organizations except 501(c)(3)) and 9 (suspense) fall outside both groups. Null when the IRS Business Master File records no foundation code. |
| subsection_code | No | 501(c) subsection number (e.g., 3 = charitable organization, covering both public charities and private foundations — see foundation_type to tell them apart). Null when not classified. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so no contradiction exists. The description adds useful behavioral context beyond annotations: data freshness, source attribution, and the fact that the response includes a tax-year indicator. This goes beyond the safety profile already captured by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: it front-loads what the tool returns, then adds routing guidance, data-lag warning, and source attribution. There is no filler or unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one fully documented parameter, an output schema present, and annotations marking the tool read-only and idempotent, the description adds all important context: data lag, source, and the alternative lookup path. Nothing material is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides 100% coverage of the single parameter, including integer/string formats, hyphen handling, leading zeros, and guidance to obtain EIN from nonprofit_search. The description only adds that an EIN is required, so it does not meaningfully enhance the schema's already thorough parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as returning a full profile for a single tax-exempt organization by EIN and enumerates the specific data returned: name, address, NTEE, 501(c) type, ruling date, and Form 990 financial snapshot. This clearly distinguishes it from sibling tools like nonprofit_search and nonprofit_get_filings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: use nonprofit_search first if you only have an org name, because this tool requires an EIN. It also sets expectations about data lag (1–2 years) and where to find the tax year, which helps the agent decide if this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nonprofit_searchSearch NonprofitsARead-onlyInspect
Search 1.8M+ IRS-recognized tax-exempt organizations by name, keyword, city, or phrase. Optionally narrow by US state, NTEE major sector (1–10), or 501(c) subsection type. Returns EINs — pass them to nonprofit_get_organization or nonprofit_get_filings for details. Results are paginated at 25 per page; use the page parameter and num_pages to paginate. Total results cap at 10,000 in the API; if total_results === 10000 the actual count may be higher. A zero-match query and a page past the last one both return an empty organizations array with a notice rather than an error; only a page whose offset reaches that 10,000 cap is refused. Supports quoted phrases ("Red Cross"), required terms (+evanston), excluded terms (-dental). Data from ProPublica Nonprofit Explorer, sourced from IRS Form 990 filings.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Zero-indexed page number. 25 results per page. Total pages is in num_pages. Increment to paginate large result sets. | |
| query | Yes | Keyword search string. Searched against org name, the secondary name line, and city in order of relevance. Supports: quoted phrases ("Red Cross"), required terms (+evanston), excluded terms (-dental). Empty string returns all orgs within the active filters. | |
| state | No | Two-letter US state, territory, or military postal code (e.g., "WA", "NY", "PR"). Case-insensitive — normalized to uppercase before filtering. A code outside that set is rejected rather than silently returning national results. Restricts results to orgs headquartered in that state. "ZZ" (foreign address) is accepted, but no organization in the index currently carries it. | |
| ntee_category | No | NTEE (National Taxonomy of Exempt Entities) major group integer (1–10). 1=Arts/Culture/Humanities, 2=Education, 3=Environment/Animals, 4=Health, 5=Human Services, 6=International/Foreign Affairs, 7=Public/Societal Benefit, 8=Religion Related, 9=Mutual/Membership Benefit, 10=Unknown/Unclassified. | |
| subsection_code | No | 501(c) subsection code. "3" = charitable/religious/educational organization (most common — includes both public charities and private foundations; nonprofit_get_organization returns foundation_type to tell them apart), "4" = social welfare org, "6" = business league/trade association, "92" = 4947(a)(1) nonexempt charitable trust. Filters by tax status, not sector. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when the response needs a caveat the domain fields cannot carry: a page that returned no organizations (distinguishing a zero-match query from a page past the end of the result set, and naming the next call), a total_results sitting on the API result ceiling rather than counting matches, or both at once in one string. Absent when the page is populated and the total is an exact count. |
| cur_page | No | Current page (zero-indexed). |
| per_page | No | Results per page applied by the API (25). |
| num_pages | No | Total pages available (total_results / 25, ceiling). The last valid page is num_pages - 1. |
| data_source | No | ProPublica + IRS attribution text. |
| page_offset | No | Zero-indexed offset of the first result on this page. Requests are refused once this reaches 10,000. |
| organizations | No | Matching organizations for the current page. |
| total_results | No | Total matching orgs (up to 10,000 — the API ceiling). If 10000, actual count may be higher. |
| active_filters | No | Active filters echoed back for verification. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds substantial behavioral context: pagination at 25 per page, a 10,000-result cap, behavior for zero-match queries versus pages past the last, and query syntax. This goes well beyond what the annotation alone conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence earns its place: purpose, filters, pagination, edge cases, query syntax, and data source are all covered without redundancy. The main purpose is front-loaded, followed by operational details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema and output schema, the description fully covers what an agent needs: how to search, what filters exist, how pagination works, how results can be used downstream, and unusual response behaviors. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters well. The description summarizes filters and query operators but does not add significant meaning beyond the schema's detailed parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search 1.8M+ IRS-recognized tax-exempt organizations by name, keyword, city, or phrase. It clearly distinguishes this search tool from the sibling detail tools by noting that it returns EINs to pass to nonprofit_get_organization or nonprofit_get_filings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent: use this search to find nonprofit EINs, then pass them to the sibling detail tools. It also clarifies pagination behavior, result caps, and edge-case responses, making it clear when this tool is appropriate.
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.
3 tool updates
- Changed
nonprofit_get_filings26 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database `upstream_error`: ProPublica API returns a non-JSON body or network error Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database. `upstream_error`: ProPublica API returns a non-JSON body or network error. Other values are possible when a failure originates below the handler." - removed
Output schema / properties / filings / items / properties / contributions_and_grants / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / contributions_and_grants / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / executive_compensation / properties / amount / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / executive_compensation / properties / amount / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / investment_income / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / investment_income / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / net_assets / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / net_assets / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / pdf_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / pdf_url / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / filings / items / properties / program_expense_ratio / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "fundraising_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Professional fundraising fees (profndraising) in USD. Null when not reported." - }, - "management_compensation": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Officer/director/trustee compensation (compnsatncurrofcr) in USD. Null when not reported." - }, - "note": { - "description": "Methodology note naming the source of the functional allocation.", - "type": "string" - }, - "other_salaries": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Other salaries and wages (othrsalwages) in USD. Null when not reported." - }, - "program_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Program-service expenses in USD — Form 990 Part IX column (B), line 25." - }, - "ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Program-service expenses divided by total functional expenses, as a decimal 0.0–1.0. Always null against the current data source, which reports no program-service expense total." - }, - "total_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total functional expenses in USD — Form 990 Part IX column (A). From totfuncexpns." - } - }, - "required": [ - "ratio", - "program_expenses", - "total_expenses", - "management_compensation", - "other_salaries", - "fundraising_expenses", - "note" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "fundraising_expenses": { + "description": "Professional fundraising fees (profndraising) in USD. Null when not reported.", + "type": [ + "number", + "null" + ] + }, + "management_compensation": { + "description": "Officer/director/trustee compensation (compnsatncurrofcr) in USD. Null when not reported.", + "type": [ + "number", + "null" + ] + }, + "note": { + "description": "Methodology note naming the source of the functional allocation.", + "type": "string" + }, + "other_salaries": { + "description": "Other salaries and wages (othrsalwages) in USD. Null when not reported.", + "type": [ + "number", + "null" + ] + }, + "program_expenses": { + "description": "Program-service expenses in USD — Form 990 Part IX column (B), line 25.", + "type": [ + "number", + "null" + ] + }, + "ratio": { + "description": "Program-service expenses divided by total functional expenses, as a decimal 0.0–1.0. Always null against the current data source, which reports no program-service expense total.", + "type": [ + "number", + "null" + ] + }, + "total_expenses": { + "description": "Total functional expenses in USD — Form 990 Part IX column (A). From totfuncexpns.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "ratio", + "program_expenses", + "total_expenses", + "management_compensation", + "other_salaries", + "fundraising_expenses", + "note" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / filings / items / properties / program_service_revenue / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / program_service_revenue / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / total_assets / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / total_assets / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / total_expenses / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / total_expenses / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / total_liabilities / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / total_liabilities / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / total_revenue / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / total_revenue / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / filings / items / properties / updated / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / updated / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / filings_pdf_only / items / properties / pdf_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings_pdf_only / items / properties / pdf_url / typeAdded value: +[ + "string", + "null" +]
- Changed
nonprofit_get_organization32 fields changed- removed
Output schema / properties / address / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / address / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / asset_amount / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / asset_amount / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / bmf_tax_period / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / bmf_tax_period / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / city / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / city / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / deductible / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / deductible / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database `upstream_error`: ProPublica API returns a non-JSON body (HTML 500) or network error Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database. `upstream_error`: ProPublica API returns a non-JSON body (HTML 500) or network error. Other values are possible when a failure originates below the handler." - removed
Output schema / properties / exempt_status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / exempt_status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / foundation_type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / foundation_type / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / income_amount / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / income_amount / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / latest_filing / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "form_type": { - "description": "IRS form type filed.", - "enum": [ - "990", - "990-EZ", - "990-PF" - ], - "type": "string" - }, - "net_assets": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Net assets/fund balances (end of year) in USD. From totnetassetend. Null when not extracted." - }, - "pdf_url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Source Form 990 PDF link. Null for some IRS processing batches — check filings via nonprofit_get_filings." - }, - "tax_prd_yr": { - "description": "Fiscal year of this filing (e.g., 2023). NOT the current year — data lags 1–2 years.", - "type": "number" - }, - "total_assets": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total assets (end of year) in USD. Null when not extracted." - }, - "total_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total expenses in USD. Null when not extracted." - }, - "total_liabilities": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total liabilities (end of year) in USD. Null when not extracted." - }, - "total_revenue": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total revenue in USD. Null when not extracted." - } - }, - "required": [ - "tax_prd_yr", - "form_type", - "total_revenue", - "total_expenses", - "total_assets", - "total_liabilities", - "net_assets", - "pdf_url" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "form_type": { + "description": "IRS form type filed.", + "enum": [ + "990", + "990-EZ", + "990-PF" + ], + "type": "string" + }, + "net_assets": { + "description": "Net assets/fund balances (end of year) in USD. From totnetassetend. Null when not extracted.", + "type": [ + "number", + "null" + ] + }, + "pdf_url": { + "description": "Source Form 990 PDF link. Null for some IRS processing batches — check filings via nonprofit_get_filings.", + "type": [ + "string", + "null" + ] + }, + "tax_prd_yr": { + "description": "Fiscal year of this filing (e.g., 2023). NOT the current year — data lags 1–2 years.", + "type": "number" + }, + "total_assets": { + "description": "Total assets (end of year) in USD. Null when not extracted.", + "type": [ + "number", + "null" + ] + }, + "total_expenses": { + "description": "Total expenses in USD. Null when not extracted.", + "type": [ + "number", + "null" + ] + }, + "total_liabilities": { + "description": "Total liabilities (end of year) in USD. Null when not extracted.", + "type": [ + "number", + "null" + ] + }, + "total_revenue": { + "description": "Total revenue in USD. Null when not extracted.", + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "tax_prd_yr", + "form_type", + "total_revenue", + "total_expenses", + "total_assets", + "total_liabilities", + "net_assets", + "pdf_url" + ], + "type": "object" + }, + { + "type": "null" + } +] - removed
Output schema / properties / ntee_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / ntee_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / revenue_amount / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / revenue_amount / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / ruling_date / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / ruling_date / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / sort_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / sort_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / subsection_code / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / subsection_code / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / zipcode / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / zipcode / typeAdded value: +[ + "string", + "null" +]
- Changed
nonprofit_search17 fields changed- removed
Output schema / properties / active_filters / properties / ntee_category / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / active_filters / properties / ntee_category / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / active_filters / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / active_filters / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / active_filters / properties / subsection_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / active_filters / properties / subsection_code / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state filter is not a US state, territory, or military postal code (or ZZ for foreign entities) `pagination_ceiling`: The requested page is at or beyond ProPublica's 10,000-result offset ceiling `upstream_error`: ProPublica API returns a 500 or network error Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_state`: The state filter is not a US state, territory, or military postal code (or ZZ for foreign entities). `pagination_ceiling`: The requested page is at or beyond ProPublica's 10,000-result offset ceiling. `upstream_error`: ProPublica API returns a 500 or network error. Other values are possible when a failure originates below the handler." - removed
Output schema / properties / organizations / items / properties / city / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / organizations / items / properties / city / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / organizations / items / properties / ntee_code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / organizations / items / properties / ntee_code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / organizations / items / properties / state / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / organizations / items / properties / state / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / organizations / items / properties / sub_name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / organizations / items / properties / sub_name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / organizations / items / properties / subseccd / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / organizations / items / properties / subseccd / typeAdded value: +[ + "number", + "null" +]
3 tool updates
- Changed
nonprofit_get_filings6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "ein", + "name", + "filings", + "filings_pdf_only", + "total_filings_with_data", + "total_filings_pdf_only", + "data_source", + "propublica_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database `upstream_error`: ProPublica API returns a non-JSON body or network error Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "upstream_error" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "ein", - "name", - "filings", - "filings_pdf_only", - "total_filings_with_data", - "total_filings_pdf_only", - "data_source", - "propublica_url" -]
- Changed
nonprofit_get_organization6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "ein", + "strein", + "name", + "sort_name", + "address", + "city", + "state", + "zipcode", + "ntee_code", + "subsection_code", + "ruling_date", + "asset_amount", + "income_amount", + "revenue_amount", + "deductible", + "exempt_status", + "foundation_type", + "bmf_tax_period", + "latest_filing", + "filing_count", + "data_source", + "propublica_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `not_found`: The EIN does not correspond to a known organization in the Nonprofit Explorer database `upstream_error`: ProPublica API returns a non-JSON body (HTML 500) or network error Other values are possible when a failure originates below the handler.", + "examples": [ + "not_found", + "upstream_error" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "ein", - "strein", - "name", - "sort_name", - "address", - "city", - "state", - "zipcode", - "ntee_code", - "subsection_code", - "ruling_date", - "asset_amount", - "income_amount", - "revenue_amount", - "deductible", - "exempt_status", - "foundation_type", - "bmf_tax_period", - "latest_filing", - "filing_count", - "data_source", - "propublica_url" -]
- Changed
nonprofit_search6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "total_results", + "num_pages", + "cur_page", + "per_page", + "page_offset", + "organizations", + "active_filters", + "data_source" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `invalid_state`: The state filter is not a US state, territory, or military postal code (or ZZ for foreign entities) `pagination_ceiling`: The requested page is at or beyond ProPublica's 10,000-result offset ceiling `upstream_error`: ProPublica API returns a 500 or network error Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_state", + "pagination_ceiling", + "upstream_error" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "total_results", - "num_pages", - "cur_page", - "per_page", - "page_offset", - "organizations", - "active_filters", - "data_source" -]
1 tool update
- Changed
nonprofit_get_filings5 fields changed- added
Output schema / properties / filings / items / properties / executive_compensation / additionalPropertiesAdded value: +false - removed
Output schema / properties / filings / items / properties / executive_compensation / anyOfRemoved value: -[ - { - "additionalProperties": false, - "properties": { - "amount": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total executive compensation in USD. Null when not reported." - }, - "field_name": { - "description": "Source API field name for transparency (compnsatncurrofcr or compofficers).", - "type": "string" - }, - "form_type": { - "description": "Form type this compensation field is sourced from.", - "type": "string" - }, - "note": { - "description": "Plain-English description of what this field covers and where to find per-officer detail.", - "type": "string" - } - }, - "required": [ - "amount", - "field_name", - "form_type", - "note" - ], - "type": "object" - }, - { - "type": "null" - } -] - added
Output schema / properties / filings / items / properties / executive_compensation / propertiesAdded value: +{ + "amount": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Total executive compensation in USD. Null when not reported." + }, + "field_name": { + "description": "Source API field the amount was read from — compnsatncurrofcr on 990 and 990-EZ, compofficers on 990-PF.", + "enum": [ + "compnsatncurrofcr", + "compofficers" + ], + "type": "string" + }, + "form_type": { + "description": "Form type this compensation field is sourced from.", + "enum": [ + "990", + "990-EZ", + "990-PF" + ], + "type": "string" + }, + "note": { + "description": "Plain-English description of what this field covers and where to find per-officer detail.", + "type": "string" + } +} - added
Output schema / properties / filings / items / properties / executive_compensation / requiredAdded value: +[ + "amount", + "field_name", + "form_type", + "note" +] - added
Output schema / properties / filings / items / properties / executive_compensation / typeAdded value: +"object"
3 tool updates
- Changed
nonprofit_get_filings3 fields changed- changed
Output schema / properties / filings / items / properties / program_expense_ratio / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "fundraising_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Professional fundraising fees (profndraising) in USD. Null when not reported." - }, - "management_compensation": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Officer/director/trustee compensation (compnsatncurrofcr) in USD. Null when not reported." - }, - "note": { - "description": "Methodology note explaining the computation and its limitations.", - "type": "string" - }, - "other_salaries": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Other salaries and wages (othrsalwages) in USD. Null when not reported." - }, - "program_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Computed program expenses (total − officer comp − other wages − fundraising) in USD." - }, - "ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Program expense ratio as decimal 0.0–1.0. Null if inputs insufficient." - }, - "total_expenses": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "description": "Total functional expenses (denominator) in USD. From totfuncexpns." - } - }, - "required": [ - "ratio", - "program_expenses", - "total_expenses", - "management_compensation", - "other_salaries", - "fundraising_expenses", - "note" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "fundraising_expenses": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Professional fundraising fees (profndraising) in USD. Null when not reported." + }, + "management_compensation": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Officer/director/trustee compensation (compnsatncurrofcr) in USD. Null when not reported." + }, + "note": { + "description": "Methodology note naming the source of the functional allocation.", + "type": "string" + }, + "other_salaries": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Other salaries and wages (othrsalwages) in USD. Null when not reported." + }, + "program_expenses": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Program-service expenses in USD — Form 990 Part IX column (B), line 25." + }, + "ratio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Program-service expenses divided by total functional expenses, as a decimal 0.0–1.0. Always null against the current data source, which reports no program-service expense total." + }, + "total_expenses": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Total functional expenses in USD — Form 990 Part IX column (A). From totfuncexpns." + } + }, + "required": [ + "ratio", + "program_expenses", + "total_expenses", + "management_compensation", + "other_salaries", + "fundraising_expenses", + "note" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / filings / items / properties / program_expense_ratio / descriptionPrevious value: -"Program-expense ratio with inputs. Null for 990-PF (different field set). Approximation — consult the source PDF for the full expense schedule."New value: +"Always null against the current data source. ProPublica returns no Form 990 Part IX column (B) program-service expense total, and the functional allocation across program, management, and fundraising cannot be reconstructed from the fields it does return. Read Part IX of the filing at pdf_url for the split." - added
Output schema / properties / noticeAdded value: +{ + "description": "Present when the organization resolved but Nonprofit Explorer holds no filing of any kind for it — names the org and why the filing history is empty. An empty filings array without this notice means the org has filings that carry a PDF but no extracted data; read filings_pdf_only.", + "type": "string" +}
- Changed
nonprofit_get_organization10 fields changed- changed
Output schema / properties / asset_amount / descriptionPrevious value: -"Most recent IRS BMF total assets in USD. Null when not reported."New value: +"Most recent IRS BMF total assets in USD. Null when not on record." - added
Output schema / properties / bmf_tax_periodAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Tax period of the latest return recorded in the IRS Business Master File (e.g. \"2025-06-01\"). Often more recent than latest_filing.tax_prd_yr, which reflects the newest 990 ProPublica has extracted. Null when not on record." +} - added
Output schema / properties / deductibleAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Whether contributions to this org are tax-deductible, as \"<IRS code> — <meaning>\". Three states, not two: code 1 deductible, code 2 not deductible, code 4 deductible by treaty (foreign orgs). Null when the IRS Business Master File records no deductibility code." +} - added
Output schema / properties / exempt_statusAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "IRS exemption status as \"<IRS code> — <meaning>\"; code 1 is an unconditional exemption. This records what the IRS granted, not whether the exemption is still in force — the Business Master File is a lagging snapshot and automatic revocations are published separately. Null when the Business Master File records no status code." +} - added
Output schema / properties / foundation_typeAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "IRS foundation classification as \"<IRS code> — <meaning>\", separating public charities (codes 10–25) from private foundations (codes 2–4). Codes 0 (all organizations except 501(c)(3)) and 9 (suspense) fall outside both groups. Null when the IRS Business Master File records no foundation code." +} - changed
Output schema / properties / income_amount / descriptionPrevious value: -"Most recent IRS BMF total income in USD. Null when not reported."New value: +"Most recent IRS BMF total income in USD. Null when not on record." - changed
Output schema / properties / revenue_amount / descriptionPrevious value: -"Most recent IRS BMF total revenue in USD. Null when not reported."New value: +"Most recent IRS BMF total revenue in USD. Null when not on record." - changed
Output schema / properties / sort_name / descriptionPrevious value: -"Alternate or subtitle name from the org record. Null when absent."New value: +"IRS Business Master File secondary name line (SORT_NAME) — an internal sort key such as a division or service-center label, not an alternate organization name. Null for most orgs." - changed
Output schema / properties / subsection_code / descriptionPrevious value: -"501(c) subsection number (e.g., 3 = public charity). Null when not classified."New value: +"501(c) subsection number (e.g., 3 = charitable organization, covering both public charities and private foundations — see foundation_type to tell them apart). Null when not classified." - changed
Output schema / requiredPrevious value: -[ - "ein", - "strein", - "name", - "sort_name", - "address", - "city", - "state", - "zipcode", - "ntee_code", - "subsection_code", - "ruling_date", - "asset_amount", - "income_amount", - "revenue_amount", - "latest_filing", - "filing_count", - "data_source", - "propublica_url" -]New value: +[ + "ein", + "strein", + "name", + "sort_name", + "address", + "city", + "state", + "zipcode", + "ntee_code", + "subsection_code", + "ruling_date", + "asset_amount", + "income_amount", + "revenue_amount", + "deductible", + "exempt_status", + "foundation_type", + "bmf_tax_period", + "latest_filing", + "filing_count", + "data_source", + "propublica_url" +]
- Changed
nonprofit_search5 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Keyword search string. Searched against org name, alternate name, and city in order of relevance. Supports: quoted phrases (\"Red Cross\"), required terms (+evanston), excluded terms (-dental). Empty string returns all orgs within the active filters."New value: +"Keyword search string. Searched against org name, the secondary name line, and city in order of relevance. Supports: quoted phrases (\"Red Cross\"), required terms (+evanston), excluded terms (-dental). Empty string returns all orgs within the active filters." - changed
Input schema / properties / subsection_code / descriptionPrevious value: -"501(c) subsection code. \"3\" = public charity (most common — donations tax-deductible), \"4\" = social welfare org, \"6\" = business league/trade association, \"92\" = 4947(a)(1) nonexempt charitable trust. Filters by tax status, not sector."New value: +"501(c) subsection code. \"3\" = charitable/religious/educational organization (most common — includes both public charities and private foundations; nonprofit_get_organization returns foundation_type to tell them apart), \"4\" = social welfare org, \"6\" = business league/trade association, \"92\" = 4947(a)(1) nonexempt charitable trust. Filters by tax status, not sector." - changed
Output schema / properties / notice / descriptionPrevious value: -"Present when the page carried no organizations — distinguishes a zero-match query from a page past the end of the result set, and names the next call."New value: +"Present when the response needs a caveat the domain fields cannot carry: a page that returned no organizations (distinguishing a zero-match query from a page past the end of the result set, and naming the next call), a total_results sitting on the API result ceiling rather than counting matches, or both at once in one string. Absent when the page is populated and the total is an exact count." - changed
Output schema / properties / organizations / items / properties / sub_name / descriptionPrevious value: -"Alternate or subtitle name, or chapter identifier. Null when absent."New value: +"The legal name with the IRS Business Master File secondary name line appended — a division, service-center, or chapter identifier, not a separate trade name the org operates under. Null when the org has no secondary name line." - changed
Output schema / properties / organizations / items / properties / subseccd / descriptionPrevious value: -"501(c) subsection code (e.g., 3 = public charity). Null when not classified."New value: +"501(c) subsection code (e.g., 3 = charitable organization). Null when not classified."
1 tool update
- Changed
nonprofit_search6 fields changed- changed
Input schema / properties / state / descriptionPrevious value: -"Two-letter US state abbreviation (e.g., \"WA\", \"NY\"). Use \"ZZ\" for foreign entities. Restricts results to orgs headquartered in that state."New value: +"Two-letter US state, territory, or military postal code (e.g., \"WA\", \"NY\", \"PR\"). Case-insensitive — normalized to uppercase before filtering. A code outside that set is rejected rather than silently returning national results. Restricts results to orgs headquartered in that state. \"ZZ\" (foreign address) is accepted, but no organization in the index currently carries it." - added
Output schema / properties / noticeAdded value: +{ + "description": "Present when the page carried no organizations — distinguishes a zero-match query from a page past the end of the result set, and names the next call.", + "type": "string" +} - changed
Output schema / properties / num_pages / descriptionPrevious value: -"Total pages available (total_results / 25, ceiling)."New value: +"Total pages available (total_results / 25, ceiling). The last valid page is num_pages - 1." - added
Output schema / properties / page_offsetAdded value: +{ + "description": "Zero-indexed offset of the first result on this page. Requests are refused once this reaches 10,000.", + "type": "number" +} - added
Output schema / properties / per_pageAdded value: +{ + "description": "Results per page applied by the API (25).", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "total_results", - "num_pages", - "cur_page", - "organizations", - "active_filters", - "data_source" -]New value: +[ + "total_results", + "num_pages", + "cur_page", + "per_page", + "page_offset", + "organizations", + "active_filters", + "data_source" +]
3 tool updates
- First observed
nonprofit_get_filings - First observed
nonprofit_get_organization - First observed
nonprofit_search
Related MCP Connectors
ProPublica Nonprofit MCP — ProPublica Nonprofit Explorer API (free, no auth)
Nonprofit lookup and IRS 990 filing data: revenue, assets, and compensation via ProPublica
MCP server for US nursing facility search and ownership lookup (NursingHomeDatabase).
Federal Audit Clearinghouse (FAC) MCP — US single-audit data, served from a
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server that provides access to ProPublica's Nonprofit Explorer API, enabling AI models to search and analyze nonprofit organizations' Form 990 data for CRM integration and prospect research.1MIT
- AlicenseAqualityAmaintenanceMCP server for US government transparency data (congressional trades, federal contracts, campaign finance, lobbying, regulations) with per-call paid access via x402 USDC.1054 npm1MIT
- AlicenseNot gradedqualityCmaintenanceAggregate US business filings, SEC reports, federal court cases, federal spending awards, and professional licenses through a single MCP server.1MIT
- AlicenseAqualityDmaintenanceProvides tools to search and retrieve nonprofit organization data and IRS filing summaries from ProPublica's Nonprofit Explorer, including side-by-side comparisons.4MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.