Skip to main content
Glama

nonprofit-explorer-mcp-server

Get Nonprofit Filings

nonprofit_get_filings
Read-onlyIdempotent

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
einYesEmployer Identification Number. Use nonprofit_search to resolve an org name to its EIN.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
einNoEmployer Identification Number as integer.
nameNoLegal org name per IRS.
errorNoPresent when the call failed. Absent on success.
noticeNoPresent 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.
filingsNoFilings with extracted financial data, sorted newest first.
data_sourceNoProPublica + IRS attribution text.
propublica_urlNoProPublica Nonprofit Explorer URL for this org.
filings_pdf_onlyNoOlder filings with a PDF but no extracted financial data.
total_filings_pdf_onlyNoCount of PDF-only filings (no extracted data).
total_filings_with_dataNoCount of filings with extracted financial data.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed26 schema fields changed
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous 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."
    • removedOutput schema / properties / filings / items / properties / contributions_and_grants / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / contributions_and_grants / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / executive_compensation / properties / amount / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / executive_compensation / properties / amount / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / investment_income / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / investment_income / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / net_assets / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / net_assets / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / pdf_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / pdf_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / filings / items / properties / program_expense_ratio / anyOf
      Previous 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"
      +  }
      +]
    • removedOutput schema / properties / filings / items / properties / program_service_revenue / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / program_service_revenue / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / total_assets / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / total_assets / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / total_expenses / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / total_expenses / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / total_liabilities / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / total_liabilities / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / total_revenue / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / total_revenue / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / filings / items / properties / updated / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / updated / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / filings_pdf_only / items / properties / pdf_url / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / filings_pdf_only / items / properties / pdf_url / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added 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"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added 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"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "ein",
      -  "name",
      -  "filings",
      -  "filings_pdf_only",
      -  "total_filings_with_data",
      -  "total_filings_pdf_only",
      -  "data_source",
      -  "propublica_url"
      -]
  3. Changed5 schema fields changed
    • addedOutput schema / properties / filings / items / properties / executive_compensation / additionalProperties
      Added value: +false
    • removedOutput schema / properties / filings / items / properties / executive_compensation / anyOf
      Removed 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"
      -  }
      -]
    • addedOutput schema / properties / filings / items / properties / executive_compensation / properties
      Added 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"
      +  }
      +}
    • addedOutput schema / properties / filings / items / properties / executive_compensation / required
      Added value: +[
      +  "amount",
      +  "field_name",
      +  "form_type",
      +  "note"
      +]
    • addedOutput schema / properties / filings / items / properties / executive_compensation / type
      Added value: +"object"
  4. Changed3 schema fields changed
    • changedOutput schema / properties / filings / items / properties / program_expense_ratio / anyOf
      Previous 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"
      +  }
      +]
    • changedOutput schema / properties / filings / items / properties / program_expense_ratio / description
      Previous 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."
    • addedOutput schema / properties / notice
      Added 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"
      +}
  5. First observed

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.