Koskamo

nonprofit-explorer-mcp-server

An MCP server that provides tools to search over 1.8 million US tax-exempt organizations, retrieve detailed organizational profiles by EIN, and access IRS Form 990 filing histories and financial snapshots sourced from the ProPublica Nonprofit Explorer API.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

nonprofit-explorer-mcp-server logo, by cyanheadsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by cyanheads
MCP endpoint (Streamable HTTP)
https://nonprofit-explorer.caseyjhand.com/mcp
Vendor documentation

What its tools do

3 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

3 of 3 have a description · 3 of 3 declare behavior hints · 3 of 3 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for nonprofits by name, keyword, or city with optional state and sector filters
  • Retrieve full organizational profiles including legal identity and financial snapshots
  • Access IRS Form 990 filing history and financial data for specific organizations

Source and maintenance

Community listingRegistry 0.3.0
Maintenance checked

Protocol and capabilities

Server
nonprofit-explorer-mcp-server 0.3.0
MCP protocol negotiated in check
2025-11-25
Tools
3 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "logging": {},
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "subscribe": true,
    "listChanged": true
  },
  "extensions": {
    "io.modelcontextprotocol/skills": {
      "directoryRead": true
    }
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

ProPublica Nonprofit Explorer provides keyless read-only access to IRS Form 990 data on 1.8M+ tax-exempt organizations. Resolve names to EINs with nonprofit_search_organizations; use nonprofit_get_organization for the profile, latest extracted financial snapshot, and newest-return metadata, then nonprofit_get_filings for financial history and source PDF links. The newest return may be PDF-only and newer than the extracted snapshot. Filings can be selected with inclusive fiscal-year bounds; omitted bounds return the full history. Data typically lags 1–2 years: cite tax_prd_yr and distinguish the tax period from the filing date.

Tools

3 advertised

nonprofit_search_organizations — Search Nonprofits
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

nonprofit_search_organizations input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "page": {
      "type": "integer",
      "default": 0,
      "maximum": 9007199254740991,
      "minimum": 0,
      "description": "Zero-indexed page number. 25 results per page. Total pages is in num_pages. Increment to paginate large result sets."
    },
    "query": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "US state or territory name (e.g., \"Washington\", \"Puerto Rico\") or two-letter state, territory, or military postal code. Trimmed and case-insensitive; normalized to a postal code before filtering. Unrecognized values are rejected. Restricts results to headquarters in that state. \"ZZ\" accepts foreign addresses, though no organization in the index currently carries it."
    },
    "ntee_category": {
      "enum": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "A",
        "a",
        "B",
        "b",
        "C",
        "D",
        "c",
        "d",
        "E",
        "F",
        "G",
        "H",
        "e",
        "f",
        "g",
        "h",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N",
        "O",
        "P",
        "i",
        "j",
        "k",
        "l",
        "m",
        "n",
        "o",
        "p",
        "Q",
        "q",
        "R",
        "S",
        "T",
        "U",
        "V",
        "W",
        "r",
        "s",
        "t",
        "u",
        "v",
        "w",
        "X",
        "x",
        "Y",
        "y",
        "Z",
        "z"
      ],
      "type": "string",
      "description": "NTEE major group digit string (1–10) or case-insensitive major letter: A→1 Arts/Culture/Humanities, B→2 Education, C–D→3 Environment/Animals, E–H→4 Health, I–P→5 Human Services, Q→6 International/Foreign Affairs, R–W→7 Public/Societal Benefit, X→8 Religion Related, Y→9 Mutual/Membership Benefit, Z→10 Unknown/Unclassified. Requests and active_filters use the numbered group."
    },
    "subsection_code": {
      "enum": [
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "13",
        "14",
        "15",
        "16",
        "17",
        "18",
        "19",
        "21",
        "22",
        "23",
        "25",
        "26",
        "27",
        "28",
        "92"
      ],
      "type": "string",
      "description": "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."
    }
  },
  "additionalProperties": false
}
nonprofit_search_organizations output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "total_results",
        "num_pages",
        "cur_page",
        "per_page",
        "page_offset",
        "organizations",
        "active_filters",
        "data_source"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "timeout",
                "retry_deadline_exceeded",
                "invalid_state",
                "pagination_ceiling",
                "upstream_error"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `timeout`: A ProPublica API attempt expires before its response body finishes. `retry_deadline_exceeded`: The complete ProPublica API retry exchange exceeds its deadline. `invalid_state`: The state filter is not a recognized state or territory name, postal code, 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."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Current page (zero-indexed)."
    },
    "per_page": {
      "type": "number",
      "description": "Results per page applied by the API (25)."
    },
    "num_pages": {
      "type": "number",
      "description": "Total pages available (total_results / 25, ceiling). The last valid page is num_pages - 1."
    },
    "data_source": {
      "type": "string",
      "description": "ProPublica + IRS attribution text."
    },
    "page_offset": {
      "type": "number",
      "description": "Zero-indexed offset of the first result on this page. Requests are refused once this reaches 10,000."
    },
    "organizations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "ein",
          "strein",
          "name",
          "sub_name",
          "city",
          "state",
          "ntee_code",
          "subseccd",
          "score"
        ],
        "properties": {
          "ein": {
            "type": "number",
            "description": "Employer Identification Number — use with nonprofit_get_organization and nonprofit_get_filings."
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "description": "Headquarters city. Null when not on record."
          },
          "name": {
            "type": "string",
            "description": "Legal org name per IRS."
          },
          "score": {
            "type": "number",
            "description": "Relevance score — higher = better match."
          },
          "state": {
            "type": [
              "string",
              "null"
            ],
            "description": "Two-letter state abbreviation. Null when not on record."
          },
          "strein": {
            "type": "string",
            "description": "EIN in \"XX-XXXXXXX\" format (preserves leading zeros)."
          },
          "sub_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Upstream legal name with an optional IRS Business Master File secondary name line appended — a division, service-center, or chapter identifier. Can repeat name; null when upstream omits this value."
          },
          "subseccd": {
            "type": [
              "number",
              "null"
            ],
            "description": "501(c) subsection code (e.g., 3 = charitable organization). Null when not classified."
          },
          "ntee_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Full NTEE code (e.g., \"E210\" = hospital). More specific than the ntee_category filter."
          }
        },
        "description": "A matched tax-exempt organization.",
        "additionalProperties": false
      },
      "description": "Matching organizations for the current page."
    },
    "total_results": {
      "type": "number",
      "description": "Total matching orgs (up to 10,000 — the API ceiling). If 10000, actual count may be higher."
    },
    "active_filters": {
      "type": "object",
      "required": [
        "query",
        "state",
        "ntee_category",
        "subsection_code"
      ],
      "properties": {
        "query": {
          "type": "string",
          "description": "Search query as submitted."
        },
        "state": {
          "type": [
            "string",
            "null"
          ],
          "description": "State filter applied, or null."
        },
        "ntee_category": {
          "type": [
            "string",
            "null"
          ],
          "description": "NTEE major group filter applied, or null."
        },
        "subsection_code": {
          "type": [
            "string",
            "null"
          ],
          "description": "501(c) subsection filter applied, or null."
        }
      },
      "description": "Active filters echoed back for verification.",
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}
nonprofit_search_organizations annotations
{
  "readOnlyHint": true
}
nonprofit_get_organization — Get Nonprofit Organization
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full profile for a tax-exempt org by EIN: legal identity, IRS classification and BMF filing requirements, latest extracted financial snapshot, and latest return metadata across extracted and PDF-only histories. Use nonprofit_search_organizations first to resolve a name to an EIN. latest_filing is the latest extracted snapshot; latest_return may be newer. Data lags 1–2 years; always cite the fiscal year. Data from ProPublica Nonprofit Explorer and IRS Form 990 filings.

nonprofit_get_organization input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "ein"
  ],
  "properties": {
    "ein": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "EIN as integer (e.g., 530196605). Leading zeros are stripped — treat EIN as an integer key.",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "pattern": "^\\d{2}-?\\d{7}$",
          "description": "EIN as string, with or without hyphen (e.g., \"53-0196605\" or \"530196605\")."
        }
      ],
      "description": "Employer Identification Number. Accepts integer (530196605) or string with optional hyphen (\"53-0196605\"). Obtain from nonprofit_search_organizations results."
    }
  },
  "additionalProperties": false
}
nonprofit_get_organization output schema
{
  "type": "object",
  "anyOf": [
    {
      "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",
        "filing_requirement",
        "pf_filing_requirement",
        "affiliation",
        "group_exemption_number",
        "latest_return",
        "latest_filing",
        "filing_count",
        "filing_count_pdf_only",
        "data_source",
        "propublica_url"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "ein": {
      "type": "number",
      "description": "Employer Identification Number as integer."
    },
    "city": {
      "type": [
        "string",
        "null"
      ],
      "description": "City. Null when not on record."
    },
    "name": {
      "type": "string",
      "description": "Legal org name per IRS."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "timeout",
                "retry_deadline_exceeded",
                "not_found",
                "upstream_error"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `timeout`: A ProPublica API attempt expires before its response body finishes. `retry_deadline_exceeded`: The complete ProPublica API retry exchange exceeds its deadline. `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."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "state": {
      "type": [
        "string",
        "null"
      ],
      "description": "Two-letter state abbreviation. Null when not on record."
    },
    "notice": {
      "type": "string",
      "description": "Present only when both filing histories are empty. Describes dataset absence and BMF context without inferring its cause."
    },
    "strein": {
      "type": "string",
      "description": "EIN in \"XX-XXXXXXX\" format."
    },
    "address": {
      "type": [
        "string",
        "null"
      ],
      "description": "Street address. Null when not on record."
    },
    "zipcode": {
      "type": [
        "string",
        "null"
      ],
      "description": "ZIP code. Null when not on record."
    },
    "ntee_code": {
      "type": [
        "string",
        "null"
      ],
      "description": "Full NTEE code (e.g., \"E210\" = hospital). Null when unclassified."
    },
    "sort_name": {
      "type": [
        "string",
        "null"
      ],
      "description": "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": {
      "type": [
        "string",
        "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."
    },
    "affiliation": {
      "type": [
        "string",
        "null"
      ],
      "description": "IRS BMF affiliation as <raw code> — <meaning>. Group affiliation alone does not prove inclusion in a group return. Null when not on record."
    },
    "data_source": {
      "type": "string",
      "description": "ProPublica + IRS attribution text."
    },
    "ruling_date": {
      "type": [
        "string",
        "null"
      ],
      "description": "ISO date of IRS recognition (e.g., \"1946-07\"). Null when not on record."
    },
    "asset_amount": {
      "type": [
        "number",
        "null"
      ],
      "description": "Most recent IRS BMF total assets in USD. Null when not on record."
    },
    "filing_count": {
      "type": "number",
      "description": "Total filings with extracted data on record."
    },
    "exempt_status": {
      "type": [
        "string",
        "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."
    },
    "income_amount": {
      "type": [
        "number",
        "null"
      ],
      "description": "Most recent IRS BMF total income in USD. Null when not on record."
    },
    "latest_filing": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "tax_prd_yr",
            "form_type",
            "total_revenue",
            "total_expenses",
            "total_assets",
            "total_liabilities",
            "net_assets",
            "pdf_url"
          ],
          "properties": {
            "pdf_url": {
              "type": [
                "string",
                "null"
              ],
              "description": "Source Form 990 PDF link. Null for some IRS processing batches — check filings via nonprofit_get_filings."
            },
            "form_type": {
              "enum": [
                "990",
                "990-EZ",
                "990-PF"
              ],
              "type": "string",
              "description": "IRS form type filed."
            },
            "net_assets": {
              "type": [
                "number",
                "null"
              ],
              "description": "Net assets/fund balances (end of year) in USD. From totnetassetend (990), totnetassetsend (990-EZ), or tfundnworth (990-PF). Null when not extracted."
            },
            "tax_prd_yr": {
              "type": "number",
              "description": "Fiscal year of this filing (e.g., 2023). NOT the current year — data lags 1–2 years."
            },
            "total_assets": {
              "type": [
                "number",
                "null"
              ],
              "description": "Total assets (end of year) in USD. Null when not extracted."
            },
            "total_revenue": {
              "type": [
                "number",
                "null"
              ],
              "description": "Total revenue in USD. Null when not extracted."
            },
            "total_expenses": {
              "type": [
                "number",
                "null"
              ],
              "description": "Total expenses in USD. Null when not extracted."
            },
            "total_liabilities": {
              "type": [
                "number",
                "null"
              ],
              "description": "Total liabilities (end of year) in USD. Null when not extracted."
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Latest extracted financial snapshot, which can predate PDF-only returns. Null if no filings_with_data are available."
    },
    "latest_return": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "tax_prd_yr",
            "tax_prd",
            "form_type",
            "pdf_url"
          ],
          "properties": {
            "pdf_url": {
              "type": [
                "string",
                "null"
              ],
              "description": "Source return PDF link. Null when absent."
            },
            "tax_prd": {
              "type": [
                "number",
                "null"
              ],
              "description": "Full YYYYMM tax period of the newest recorded return. Null when absent."
            },
            "form_type": {
              "type": [
                "string",
                "null"
              ],
              "description": "Normalized known IRS form label, or unchanged unknown label. Null when absent."
            },
            "tax_prd_yr": {
              "type": [
                "number",
                "null"
              ],
              "description": "Fiscal year of the newest recorded return. Null when absent."
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Newest return across extracted and PDF-only histories, ordered by full tax period. Null when no history exists; equal-period entries imply no amendment precedence."
    },
    "bmf_tax_period": {
      "type": [
        "string",
        "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."
    },
    "propublica_url": {
      "type": "string",
      "description": "ProPublica Nonprofit Explorer URL for this org."
    },
    "revenue_amount": {
      "type": [
        "number",
        "null"
      ],
      "description": "Most recent IRS BMF total revenue in USD. Null when not on record."
    },
    "foundation_type": {
      "type": [
        "string",
        "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."
    },
    "subsection_code": {
      "type": [
        "number",
        "null"
      ],
      "description": "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."
    },
    "filing_requirement": {
      "type": [
        "string",
        "null"
      ],
      "description": "IRS BMF filing requirement as <raw code> — <meaning>. Null when not on record; unknown codes retained."
    },
    "filing_count_pdf_only": {
      "type": "number",
      "description": "Total PDF-only filings without extracted financial data. Use nonprofit_get_filings for their PDF links."
    },
    "pf_filing_requirement": {
      "type": [
        "string",
        "null"
      ],
      "description": "IRS BMF private-foundation filing requirement as <raw code> — <meaning>. Null when not on record."
    },
    "group_exemption_number": {
      "type": [
        "number",
        "null"
      ],
      "description": "IRS BMF group exemption number. Zero means none assigned; null means not on record. Does not prove inclusion in a group return."
    }
  },
  "additionalProperties": false
}
nonprofit_get_organization annotations
{
  "readOnlyHint": true,
  "idempotentHint": true
}
nonprofit_get_filings — Get Nonprofit Filings
Advertised by the server during the last successful anonymous check.
Advertised read-only

Form 990 history by EIN with extracted financials, form-specific compensation, and PDF-only returns. Optional inclusive from_year/to_year bounds select fiscal years across both histories; omitted bounds return full history. Unfiltered totals remain available. Records are sorted by full tax period without amendment precedence. Empty dataset history succeeds with BMF context; an empty selected window does not imply no history. Data lags 1–2 years; always cite tax_prd_yr. Data from ProPublica Nonprofit Explorer and IRS Form 990 filings.

nonprofit_get_filings input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "ein"
  ],
  "properties": {
    "ein": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "EIN as integer (e.g., 530196605). Leading zeros are stripped — treat EIN as an integer key.",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "pattern": "^\\d{2}-?\\d{7}$",
          "description": "EIN as string, with or without hyphen (e.g., \"53-0196605\" or \"530196605\")."
        }
      ],
      "description": "Employer Identification Number. Use nonprofit_search_organizations to resolve an org name to its EIN."
    },
    "to_year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Inclusive maximum fiscal year (tax_prd_yr). Omit for no upper bound."
    },
    "from_year": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Inclusive minimum fiscal year (tax_prd_yr). Omit for no lower bound."
    }
  },
  "additionalProperties": false
}
nonprofit_get_filings output schema
{
  "type": "object",
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "ein",
        "name",
        "from_year",
        "to_year",
        "filings",
        "filings_pdf_only",
        "total_filings_with_data",
        "total_filings_pdf_only",
        "data_source",
        "propublica_url"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "ein": {
      "type": "number",
      "description": "Employer Identification Number as integer."
    },
    "name": {
      "type": "string",
      "description": "Legal org name per IRS."
    },
    "error": {
      "type": "object",
      "required": [
        "code",
        "message"
      ],
      "properties": {
        "code": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "examples": [
                "invalid_year_range",
                "timeout",
                "retry_deadline_exceeded",
                "not_found",
                "upstream_error"
              ],
              "description": "Machine-readable failure mode. Declared by this tool: `invalid_year_range`: from_year is greater than to_year. `timeout`: A ProPublica API attempt expires before its response body finishes. `retry_deadline_exceeded`: The complete ProPublica API retry exchange exceeds its deadline. `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."
            },
            "recovery": {
              "type": "object",
              "required": [
                "hint"
              ],
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "description": "Actionable next step for the caller.",
              "additionalProperties": {}
            },
            "retryable": {
              "type": "boolean",
              "description": "Whether retrying may succeed."
            }
          },
          "additionalProperties": {}
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        }
      },
      "description": "Present when the call failed. Absent on success.",
      "additionalProperties": {}
    },
    "notice": {
      "type": "string",
      "description": "Present only when the complete dataset history is empty, with BMF context and no inferred cause. A selected window can be empty while unfiltered totals show existing history."
    },
    "filings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "tax_prd_yr",
          "tax_prd",
          "form_type",
          "pdf_url",
          "updated",
          "total_revenue",
          "total_expenses",
          "total_assets",
          "total_liabilities",
          "net_assets",
          "contributions_and_grants",
          "program_service_revenue",
          "investment_income",
          "other_salaries_and_wages",
          "payroll_taxes",
          "professional_fundraising_fees",
          "fundraising_events_gross",
          "fundraising_events_direct_expenses",
          "fundraising_events_net",
          "gaming_and_fundraising_direct_expenses",
          "gaming_and_fundraising_net",
          "grants_paid",
          "distributable_amount",
          "fair_market_value_assets",
          "net_investment_income",
          "program_expense_ratio",
          "executive_compensation"
        ],
        "properties": {
          "pdf_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Source Form 990 PDF link. Null for some IRS processing batches — check filings_pdf_only."
          },
          "tax_prd": {
            "type": "number",
            "description": "YYYYMM month the fiscal year ended (e.g., 202306 = June 2023 fiscal year end)."
          },
          "updated": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO datetime ProPublica last updated this record. Null when not provided."
          },
          "form_type": {
            "enum": [
              "990",
              "990-EZ",
              "990-PF"
            ],
            "type": "string",
            "description": "IRS form type filed."
          },
          "net_assets": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net assets/fund balances (end of year) in USD. From totnetassetend (990), totnetassetsend (990-EZ), or tfundnworth (990-PF). Null when not extracted."
          },
          "tax_prd_yr": {
            "type": "number",
            "description": "Fiscal year of this filing (e.g., 2023). NOT the filing date — data lags 1–2 years. Always cite."
          },
          "grants_paid": {
            "type": [
              "number",
              "null"
            ],
            "description": "990-PF contributions, gifts, and grants paid in USD, Part I line 25 column (a), contrpdpbks. Null for other forms or when not extracted."
          },
          "total_assets": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total assets (end of year) in USD. Null when not extracted."
          },
          "payroll_taxes": {
            "type": [
              "number",
              "null"
            ],
            "description": "990 Part IX line 10A, payrolltx, USD. Null when unextracted or inapplicable to EZ/PF."
          },
          "total_revenue": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total revenue in USD. Null when not extracted."
          },
          "total_expenses": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total expenses in USD. Null when not extracted."
          },
          "investment_income": {
            "type": [
              "number",
              "null"
            ],
            "description": "Investment income in USD: invstmntinc (990), othrinvstinc (990-EZ), or intrstrvnue plus dividndsamt (990-PF Part I column (a), lines 3–4: savings interest plus dividends and securities interest; excludes capital gains, rents, and net investment income). PF requires both components; null when not extracted."
          },
          "total_liabilities": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total liabilities (end of year) in USD. Null when not extracted."
          },
          "distributable_amount": {
            "type": [
              "number",
              "null"
            ],
            "description": "990-PF required distributable amount in USD, Part X line 7, distribamt. A payout requirement, not actual payments or a compliance measure. Null for other forms or when not extracted."
          },
          "net_investment_income": {
            "type": [
              "number",
              "null"
            ],
            "description": "990-PF net investment income in USD, Part I line 27b, netinvstinc. Null for other forms or when not extracted."
          },
          "program_expense_ratio": {
            "anyOf": [
              {
                "type": "object",
                "required": [
                  "ratio",
                  "program_expenses",
                  "total_expenses",
                  "management_compensation",
                  "other_salaries",
                  "fundraising_expenses",
                  "note"
                ],
                "properties": {
                  "note": {
                    "type": "string",
                    "description": "Methodology note naming the source of the functional allocation."
                  },
                  "ratio": {
                    "type": [
                      "number",
                      "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."
                  },
                  "other_salaries": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Other salaries and wages (othrsalwages) in USD. Null when not reported."
                  },
                  "total_expenses": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Total functional expenses in USD — Form 990 Part IX column (A). From totfuncexpns."
                  },
                  "program_expenses": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Program-service expenses in USD — Form 990 Part IX column (B), line 25."
                  },
                  "fundraising_expenses": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Professional fundraising fees (profndraising) in USD. Null when not reported."
                  },
                  "management_compensation": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Officer/director/trustee compensation (compnsatncurrofcr) in USD. Null when not reported."
                  }
                },
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "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."
          },
          "executive_compensation": {
            "type": "object",
            "required": [
              "amount",
              "field_name",
              "form_type",
              "note"
            ],
            "properties": {
              "note": {
                "type": "string",
                "description": "Plain-English description of what this field covers and where to find per-officer detail."
              },
              "amount": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Total executive compensation in USD. Null when absent on supported 990/PF forms; always null on 990-EZ because the source does not extract it."
              },
              "form_type": {
                "enum": [
                  "990",
                  "990-EZ",
                  "990-PF"
                ],
                "type": "string",
                "description": "Form type this compensation field is sourced from."
              },
              "field_name": {
                "anyOf": [
                  {
                    "enum": [
                      "compnsatncurrofcr",
                      "compofficers"
                    ],
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Source API field: compnsatncurrofcr on 990, compofficers on 990-PF. Null on 990-EZ, which has no extracted officer-compensation field."
              }
            },
            "description": "Executive compensation summary. 990-EZ is unextracted; see Part IV of its PDF. Supported-form missing amounts remain null.",
            "additionalProperties": false
          },
          "fundraising_events_net": {
            "type": [
              "number",
              "null"
            ],
            "description": "990 VIII 8c netincfndrsng, USD; may be negative. Null when unextracted or inapplicable to EZ/PF."
          },
          "program_service_revenue": {
            "type": [
              "number",
              "null"
            ],
            "description": "Program service revenue in USD: totprgmrevnue (990) or prgmservrev (990-EZ). Not applicable for 990-PF."
          },
          "contributions_and_grants": {
            "type": [
              "number",
              "null"
            ],
            "description": "Contributions and grants in USD: totcntrbgfts (990), totcntrbs (990-EZ), or grscontrgifts (990-PF). Null when not extracted."
          },
          "fair_market_value_assets": {
            "type": [
              "number",
              "null"
            ],
            "description": "990-PF end-of-year fair-market-value assets in USD, header Item I, fairmrktvalamt. Null for other forms or when not extracted."
          },
          "fundraising_events_gross": {
            "type": [
              "number",
              "null"
            ],
            "description": "Event gross income excluding separately reported contributions: 990 VIII 8a grsincfndrsng or EZ I 6b grsrevnuefndrsng, USD. Null when unextracted or inapplicable to PF."
          },
          "other_salaries_and_wages": {
            "type": [
              "number",
              "null"
            ],
            "description": "990 Part IX line 7A, othrsalwages, USD. Null when unextracted or inapplicable to EZ/PF."
          },
          "gaming_and_fundraising_net": {
            "type": [
              "number",
              "null"
            ],
            "description": "EZ I 6d netincfndrsng, USD, combined gaming and fundraising net. Null when unextracted or inapplicable to 990/PF."
          },
          "professional_fundraising_fees": {
            "type": [
              "number",
              "null"
            ],
            "description": "990 Part IX line 11eA, profndraising, USD. Null when unextracted or inapplicable to EZ/PF."
          },
          "fundraising_events_direct_expenses": {
            "type": [
              "number",
              "null"
            ],
            "description": "990 VIII 8b lessdirfndrsng, USD. Null when unextracted or inapplicable to EZ/PF; EZ combines gaming and events separately."
          },
          "gaming_and_fundraising_direct_expenses": {
            "type": [
              "number",
              "null"
            ],
            "description": "EZ I 6c direxpns, USD, combined gaming and fundraising expenses. Null when unextracted or inapplicable to 990/PF."
          }
        },
        "description": "Form 990 filing with extracted financial data for one fiscal year.",
        "additionalProperties": false
      },
      "description": "Filings with extracted financial data, sorted newest first."
    },
    "to_year": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Applied inclusive upper fiscal-year bound. Null when omitted."
    },
    "from_year": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": -9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Applied inclusive lower fiscal-year bound. Null when omitted."
    },
    "data_source": {
      "type": "string",
      "description": "ProPublica + IRS attribution text."
    },
    "propublica_url": {
      "type": "string",
      "description": "ProPublica Nonprofit Explorer URL for this org."
    },
    "filings_pdf_only": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "tax_prd_yr",
          "tax_prd",
          "form_type_str",
          "pdf_url"
        ],
        "properties": {
          "pdf_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Source Form 990 PDF link. Null for some batches."
          },
          "tax_prd": {
            "type": [
              "number",
              "null"
            ],
            "description": "YYYYMM tax period. Null when absent from the PDF-only record."
          },
          "tax_prd_yr": {
            "type": "number",
            "description": "Fiscal year of this filing."
          },
          "form_type_str": {
            "type": "string",
            "description": "Form type string as returned by API (\"990\", \"990EZ\", \"990PF\")."
          }
        },
        "description": "Return with a PDF link but no extracted financial data; may be newer than extracted history.",
        "additionalProperties": false
      },
      "description": "PDF-only returns sorted by full tax period, retaining equal-period entries."
    },
    "total_filings_pdf_only": {
      "type": "number",
      "description": "Unfiltered count of PDF-only filings (no extracted data)."
    },
    "total_filings_with_data": {
      "type": "number",
      "description": "Unfiltered count of filings with extracted financial data."
    }
  },
  "additionalProperties": false
}
nonprofit_get_filings annotations
{
  "readOnlyHint": true,
  "idempotentHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

nonprofit-explorer-guide

Advertised by the server during the last successful anonymous check.

Use with nonprofit_* tools for nonprofit diligence, financial trends, peer comparisons, and fundraising or compensation research. Resolve entity identity, distinguish extracted financials from newer returns, and decide when the source Form 990 is required before drawing conclusions.

nonprofit-explorer-guide URI
skill://nonprofit-explorer-guide/SKILL.md

MIME type: text/markdown

io.modelcontextprotocol/skills

Advertised by the server during the last successful anonymous check.

io.modelcontextprotocol/skills URI template
skill://{+path}

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 2 of 2 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1112 ms
95th percentile latency
1112 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1112 ms · metadata changed · 3 tool(s), 1 resource(s), 1 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http nonprofit-explorer-mcp-server https://nonprofit-explorer.caseyjhand.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add nonprofit-explorer-mcp-server --url https://nonprofit-explorer.caseyjhand.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable nonprofit-explorer-mcp-server in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "url": "https://nonprofit-explorer.caseyjhand.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "type": "streamableHttp",
      "url": "https://nonprofit-explorer.caseyjhand.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start nonprofit-explorer-mcp-server and inspect its tools.
VS Code configuration
{
  "servers": {
    "nonprofit-explorer-mcp-server": {
      "type": "http",
      "url": "https://nonprofit-explorer.caseyjhand.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http nonprofit-explorer-mcp-server https://nonprofit-explorer.caseyjhand.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://nonprofit-explorer.caseyjhand.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "serverUrl": "https://nonprofit-explorer.caseyjhand.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like nonprofit-explorer-mcp-server from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.