nonprofit-explorer-mcp-server

v0.3.0 pre-1.0

Search and explore 1.8M+ US nonprofits, fetch Form 990 financials, and access IRS filing history via MCP. STDIO or Streamable HTTP.

nonprofit-explorer.caseyjhand.com/mcp
claude mcp add --transport http nonprofit-explorer-mcp-server https://nonprofit-explorer.caseyjhand.com/mcp
codex mcp add nonprofit-explorer-mcp-server --url https://nonprofit-explorer.caseyjhand.com/mcp
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "url": "https://nonprofit-explorer.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http nonprofit-explorer-mcp-server https://nonprofit-explorer.caseyjhand.com/mcp
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://nonprofit-explorer.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "nonprofit-explorer-mcp-server": {
      "type": "http",
      "url": "https://nonprofit-explorer.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://nonprofit-explorer.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

3

nonprofit_search_organizations

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "nonprofit_search_organizations",
    "arguments": {
      "query": "<query>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "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": {
      "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.",
      "type": "string"
    },
    "ntee_category": {
      "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.",
      "type": "string",
      "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"
      ]
    },
    "subsection_code": {
      "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.",
      "type": "string",
      "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"
      ]
    },
    "page": {
      "default": 0,
      "description": "Zero-indexed page number. 25 results per page. Total pages is in num_pages. Increment to paginate large result sets.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "query",
    "page"
  ],
  "additionalProperties": false
}
view source ↗

nonprofit_get_organization

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "nonprofit_get_organization",
    "arguments": {
      "ein": "<ein>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ein": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "EIN as integer (e.g., 530196605). Leading zeros are stripped — treat EIN as an integer key."
        },
        {
          "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."
    }
  },
  "required": [
    "ein"
  ],
  "additionalProperties": false
}
view source ↗

nonprofit_get_filings

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "nonprofit_get_filings",
    "arguments": {
      "ein": "<ein>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "ein": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 9007199254740991,
          "description": "EIN as integer (e.g., 530196605). Leading zeros are stripped — treat EIN as an integer key."
        },
        {
          "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."
    },
    "from_year": {
      "description": "Inclusive minimum fiscal year (tax_prd_yr). Omit for no lower bound.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "to_year": {
      "description": "Inclusive maximum fiscal year (tax_prd_yr). Omit for no upper bound.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "ein"
  ],
  "additionalProperties": false
}
view source ↗

Extensions

1

io.modelcontextprotocol/skills

{
  "directoryRead": true
}