io.github.cyanheads/openfec-mcp-server
REMOTE · OPENFEC.CASEYJHAND.COM · 2 COMPONENTS
Access FEC campaign finance data. Query data about candidates, money trails, and election filings.
Available components
Last scanned (5 hours ago)
Scores higher than 95% of remote servers
Reachable. Last reached 6 Nov 2026.
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security83
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability73
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 7215 tokens (~555/item across 13 items; 12 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 12 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Checks we ran (13)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 6 Nov 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 29 Oct 26 0
- New resource “openfec-guide” functional
- Server version: 0.9.2 → 0.10.0 functional
- 25 Oct 26 0
- Server version: 0.9.1 → 0.9.2 functional
- 10 Oct 26 0
- Server version: 0.9.0 → 0.9.1 functional
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- Tool “openfec_search_legal” rewrote its description, which is the text the model reads security
- Tool “openfec_get_legal_document” rewrote its description, which is the text the model reads security
- Schema quality: 531 → 596 ▼ functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- Server version: 0.8.4 → 0.9.0 functional
- “openfec_get_legal_document” added an optional parameter “offset” cosmetic
- “openfec_get_legal_document” added an optional parameter “array” cosmetic
- “openfec_search_legal” reworded the description of “max_penalty_amount” cosmetic
- “openfec_search_legal” reworded the description of “type” cosmetic
- “openfec_search_legal” reworded the description of “statutory_citation” cosmetic
- “openfec_search_legal” reworded the description of “respondent” cosmetic
- “openfec_search_legal” reworded the description of “regulatory_citation” cosmetic
- “openfec_search_legal” reworded the description of “min_penalty_amount” cosmetic
- “openfec_search_legal” reworded the description of “hits_returned” cosmetic
- “openfec_search_legal” reworded the description of “from_hit” cosmetic
- “openfec_search_legal” reworded the description of “case_number” cosmetic
- “openfec_search_legal” reworded the description of “ao_number” cosmetic
- 24 Sept 26 0
- Server version: 0.8.2 → 0.8.4 functional
- “openfec_search_expenditures” added an optional parameter “election_full” cosmetic
- “openfec_lookup_calendar” added an optional parameter “district” cosmetic
- “openfec_search_candidates” reworded the description of “per_page” cosmetic
- “openfec_search_filings” reworded the description of “per_page” cosmetic
- “openfec_search_expenditures” reworded the description of “per_page” cosmetic
- “openfec_search_expenditures” reworded the description of “cycle” cosmetic
- “openfec_search_disbursements” reworded the description of “per_page” cosmetic
- “openfec_search_coordinated_expenditures” reworded the description of “per_page” cosmetic
- “openfec_search_contributions” reworded the description of “per_page” cosmetic
- “openfec_search_committees” reworded the description of “designation” cosmetic
- 22 Sept 26 0
- Server version: 0.8.1 → 0.8.2 functional
- “openfec_search_legal” reworded the description of “from_hit” cosmetic
- “openfec_search_legal” reworded the description of “hits_returned” cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 6 Nov 2026 · Probed https://openfec.caseyjhand.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=caseyjhand.com | CN=WE1,O=Google Trust Services,C=US | 2 Nov 2026 | 31 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 995a30681ab772540e934241ca1d576c |
| SANs: caseyjhand.com, *.caseyjhand.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of openfec.caseyjhand.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| caseyjhand.com. | DS published | 2371 | 13 | Verified |
| openfec.caseyjhand.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| x-content-type-options | nosniff |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://openfec.caseyjhand.com/mcp | Verified | 200 | |
| http (plaintext) | http://openfec.caseyjhand.com/mcp | HTTPS enforced | 301 | https://openfec.caseyjhand.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
openfec_get_committee_totals Openfec Get Committee Totals ~652
Get pre-aggregated committee financial totals — receipts, disbursements, cash on hand, debts, and the itemized/unitemized breakdown — without paginating Schedule A. Use mode "single" (the default) with a committee_id for one committee's totals, one row per two-year cycle it has filed. Use mode "by_entity_type" to rank or screen every committee of one type (presidential, pac, party, pac-party, house-senate, ie-only) by state, designation, or a receipts/disbursements threshold.
| Name | Type | Req | Description |
|---|---|---|---|
| committee_designation | string | – | Committee designation — A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). by_entity_type mode only. |
| committee_id | string | – | Committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required in single mode; in by_entity_type mode it narrows the grouped search to that one committee. |
| committee_state | string | – | Two-letter state code of the committee. by_entity_type mode only. |
| committee_type | string | – | Committee type code — H (House), S (Senate), P (Presidential), O (Super PAC), N/Q (PAC), X/Y (party). by_entity_type mode only. |
| cycle | number | – | Two-year election cycle (e.g., 2024). Even years only. Omit in single mode to get every cycle the committee has filed. |
| entity_type | string | – | Committee entity type for the grouped search. Required in by_entity_type mode. house-senate covers both chambers as one group; ie-only is committees that report only independent expenditures. |
| max_disbursements | number | – | Maximum total disbursements in dollars. by_entity_type mode only. |
| max_receipts | number | – | Maximum total receipts in dollars. by_entity_type mode only. |
| min_disbursements | number | – | Minimum total disbursements in dollars. by_entity_type mode only. |
| min_receipts | number | – | Minimum total receipts in dollars. by_entity_type mode only. |
| mode | string | – | Query mode. "single" returns one committee's totals, one row per cycle. "by_entity_type" returns a page of committees of one entity type, filterable and sortable across committees. |
| organization_type | string | – | Sponsoring organization type — C (corporation), L (labor), M (membership), T (trade), V (cooperative), W (corporation without capital stock). by_entity_type mode only. |
| page | integer | – | Page number (1-indexed). Read pagination.pages in the response to see how many pages exist — a long-running committee can have more cycles than one page holds. |
| per_page | integer | – | Results per page. |
| sort | string | – | Sort field. A "-" prefix sorts descending: "-receipts" ranks the biggest fundraisers first in by_entity_type mode, "-cycle" puts a committee's most recent cycle first in single mode. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. Rows mean different things by mode — single rows are cycles of one committee, by_entity_type rows are different committees — so read this rather than inferring f… |
| notice | string | – | Guidance when the response carries no totals: how to broaden a search that matched nothing, or which requested position ran out when totals did match. |
| pagination | object | – | Page-based pagination metadata. |
| results | array | – | Committee totals result set; one row per cycle in single mode, one row per committee in by_entity_type mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| totalCount | number | – | Total matching totals rows before pagination. |
No examples provided.
openfec_get_legal_document Openfec Get Legal Document ~457
Fetch one FEC legal document — advisory opinion, MUR, ADR, administrative fine, or statute — by its type and number. openfec_search_legal replaces each result's documents and dispositions arrays with a count and category summary and cuts every commission vote down to a date and a 200-character action; this returns the record as upstream sends it, whole when it fits the 100,000-byte response budget. A larger record returns its scalar fields and the arrays that fit, with the rest listed in withheld; page through one by re-calling with array and offset. doc_type is the plural form of the document_type discriminator on a search result (advisory_opinion becomes advisory_opinions, mur becomes murs, adr becomes adrs, admin_fine becomes admin_fines, statute becomes statutes), and no is that result's no field — every document type carries it, and advisory opinions repeat it as ao_no.
| Name | Type | Req | Description |
|---|---|---|---|
| array | string | – | Name of one top-level array field of the record to page through by entry — usually one listed in withheld when the record was too large to return whole (e.g. "dispositions", "documents"). Returns tha… |
| doc_type | string | yes | Legal document type, always plural. openfec_search_legal reports the singular form in each result document_type — advisory_opinion, mur, adr, admin_fine, statute — so add an "s" to get the value this… |
| no | string | yes | Document number, copied from the no field of the matching openfec_search_legal result. Advisory opinions are year-serial (e.g. "2024-01", also repeated as ao_no); murs, adrs, and admin_fines are digi… |
| offset | integer | – | Entry offset (0-indexed) into array. Requires array; defaults to 0 when array is given. Pass the next_offset a previous slice returned to continue. |
| Name | Type | Req | Description |
|---|---|---|---|
| attachedDocumentCount | number | – | Number of related filings in the record documents array — the full count, whether this response carries them in document, in a slice, or holds them back. Compare against the document_count openfec_se… |
| document | object | – | The legal document record, fields as upstream sends them — the full documents array openfec_search_legal summarizes, the complete dispositions and commission_votes entries, and the scalar and date fi… |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | How to continue: which arrays were held back and how to page them, where a slice continues, or that an offset ran past the end of its array. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| slice | object | – | A run of the requested array. Present only when array was given. |
| withheld | array | – | Arrays held back from document because the whole record exceeds the 100,000-byte response budget, smallest first. Page through one by re-calling with array set to its name. Absent when document is th… |
No examples provided.
openfec_lookup_calendar Openfec Lookup Calendar ~462
Look up FEC calendar events, filing deadlines, and election dates. Use to find upcoming filing windows for a committee, locate when a federal election occurred, or scope FEC events by date range and category.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Calendar category ID. 20=Commission Meetings, 21=Reporting Deadlines, 22=Conferences and Outreach, 23=AOs and Rules, 24=Other, 25=Quarterly, 26=Monthly, 27=Pre and Post-Elections, 28=EC Periods, 29=I… |
| description | string | – | Full-text event description search. Events mode. |
| district | string | – | Two-digit House district (e.g., "14", "07"); a single digit is zero-padded. Pair it with state — alone it matches that district number in every state. At-large races carry no district upstream, so a… |
| election_year | integer | – | Election year. Election dates mode. |
| max_date | string | – | Latest date (YYYY-MM-DD). |
| min_date | string | – | Earliest date (YYYY-MM-DD). |
| mode | string | – | events = FEC calendar events. filing_deadlines = report due dates. election_dates = upcoming/past elections. |
| office | string | – | Office sought (H=House, S=Senate, P=President). Election dates mode. |
| page | integer | – | Page number (1-indexed). Default 1. |
| per_page | integer | – | Results per page. Default 20, max 100. |
| report_type | string | – | Report type code (e.g. "Q1", "Q2"). Filing deadlines mode only. |
| report_year | integer | – | Report year. Filing deadlines mode. |
| state | string | – | Two-letter state code (e.g., AZ, CA). Primarily for election_dates mode. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. Each mode reads a different FEC dataset with its own row shape — calendar events, report due dates, or election dates — so read this rather than inferring the da… |
| notice | string | – | Guidance when the response carries no calendar entries: how to broaden a search that matched nothing, or which requested position ran out when entries did match. |
| pagination | object | – | Page-based pagination metadata. |
| results | array | – | Calendar result set; events, filing deadlines, or election dates depending on mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| totalCount | number | – | Total matching calendar entries before pagination. |
No examples provided.
openfec_lookup_elections Openfec Lookup Elections ~295
Look up federal election races and candidate financial summaries. Find who's running in a race with fundraising totals, or get an aggregate race summary.
| Name | Type | Req | Description |
|---|---|---|---|
| cycle | integer | yes | Election cycle year (even years only, e.g. 2024). |
| district | string | – | Two-digit district number (e.g. "07"). Required for house unless zip is provided. |
| election_full | boolean | – | Expand to full election period (4yr president, 6yr senate, 2yr house). Defaults to true when omitted; a ZIP-scoped search rejects it, since that endpoint has no such parameter. Carries no schema defa… |
| mode | string | – | search = candidates in a race with financial totals. summary = aggregate race financial summary. |
| office | string | yes | Office sought: H=House, S=Senate, P=President. |
| page | integer | – | Page number (1-indexed). Search mode only; explicit page is rejected in summary mode. Defaults to 1 for search. |
| per_page | integer | – | Results per page. Search mode only; defaults to 20. |
| state | string | – | Two-letter US state code (e.g., AZ, CA). Required for senate/house unless zip is provided. |
| zip | string | – | ZIP code — finds races covering this ZIP. Search mode only. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. Row shapes differ by mode — search rows are per-candidate financial records, summary is one aggregate race row — so read this rather than inferring the shape fro… |
| notice | string | – | Guidance when the response carries no election results: how to broaden a search that matched nothing, or which requested position ran out when results did match. |
| pagination | object | – | Page-based pagination metadata. |
| results | array | – | Election race result set; candidate financial rows in search mode, a single aggregate summary row in summary mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| totalCount | number | – | Total matching candidates or race summaries. |
No examples provided.
openfec_search_candidates Openfec Search Candidates ~475
Find federal candidates by name, state, office, party, or cycle. Retrieve a specific candidate by FEC ID with financial totals. Candidate IDs start with H (House), S (Senate), or P (President) followed by exactly eight letters or digits.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | FEC candidate ID: H, S, or P followed by exactly eight letters or digits (e.g., P00003392, H2CO07170). Get IDs from openfec_search_candidates results. When provided, returns a single candidate with f… |
| candidate_status | string | – | Candidate status: C=present, F=future, N=not yet, P=prior. |
| cycle | number | – | Two-year election cycle (even year, e.g., 2024). |
| district | string | – | Two-digit district number for House candidates. |
| election_year | number | – | Specific election year the candidate ran in. |
| has_raised_funds | boolean | – | Only candidates whose committee has received receipts. |
| include_totals | boolean | – | Include financial totals (receipts, disbursements, cash on hand). Defaults to true when fetching by candidate_id. |
| incumbent_challenge | string | – | Incumbent status: I=incumbent, C=challenger, O=open seat. |
| office | string | – | Filter by office: H=House, S=Senate, P=President. |
| page | integer | – | Search-results page number (1-indexed). Defaults to 1 on the search path. |
| party | string | – | Three-letter party code (e.g., DEM, REP, LIB). |
| per_page | integer | – | Search results per page. Defaults to 20 on the search path. With include_totals, at most 35 candidates are requested when cycle or election_year scopes the totals and 5 when the totals span every cyc… |
| query | string | – | Full-text candidate name search. |
| state | string | – | Two-letter US state code (e.g., AZ, CA). |
| Name | Type | Req | Description |
|---|---|---|---|
| candidates | array | – | Candidate result set; one record per match. |
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| error | object | – | Present when the call failed. Absent on success. |
| missing_totals | array | – | Candidates whose financial totals were not retrieved because the totals fetch hit its page cap. Re-query each one on its own with candidate_id to get its totals. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when candidates did match, or that the page was bounded below the per_page req… |
| pagination | object | – | Page-based pagination metadata. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching candidates before pagination. |
| totals | array | – | Financial totals (receipts, disbursements, cash_on_hand) when include_totals is true. One row per candidate per cycle. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_committees Openfec Search Committees ~406
Find political committees (campaign, PAC, Super PAC, party) by name, type, candidate affiliation, or state. Retrieve a specific committee by FEC ID. Committee IDs start with C followed by exactly eight digits (e.g., C00358796).
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | Find committees linked to this candidate (authorized, leadership, joint fundraising). Get IDs from openfec_search_candidates results. |
| committee_id | string | – | FEC committee ID: 'C' followed by exactly eight digits (e.g., C00358796). Get IDs from openfec_search_committees results. Returns a single committee with full detail. |
| committee_type | string | – | Committee type code. Common: H (House), S (Senate), P (Presidential), O (Super PAC), N (PAC nonqualified), Q (PAC qualified), X (Party nonqualified), Y (Party qualified). |
| cycle | number | – | Two-year election cycle (even year). |
| designation | string | – | Committee designation. A (authorized), B (lobbyist PAC), D (leadership PAC), J (joint fundraiser), P (principal campaign), U (unauthorized). Matches each committee's current designation only, even wi… |
| page | integer | – | Search-results page number (1-indexed). Defaults to 1 on the search path. |
| party | string | – | Three-letter party code (e.g., DEM, REP). |
| per_page | integer | – | Search results per page. Defaults to 20 on the search path. |
| query | string | – | Full-text committee name search. |
| state | string | – | Two-letter state code. |
| treasurer_name | string | – | Full-text treasurer name search. |
| Name | Type | Req | Description |
|---|---|---|---|
| committees | array | – | Committee result set; one record per match. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Guidance when the response carries no committees: how to broaden a search that matched nothing, or which requested position ran out when committees did match. |
| pagination | object | – | Page-based pagination metadata. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| totalCount | number | – | Total matching committees before pagination. |
No examples provided.
openfec_search_contributions Openfec Search Contributions ~638
Search itemized individual contributions (Schedule A) or get aggregate breakdowns by size, state, employer, or occupation. Use to answer "who is funding this committee?" Itemized mode requires a committee_id. Aggregate by_size/by_state can use candidate_id instead.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | Candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. Enables by_size and by_state aggregates without a committee_id. |
| committee_id | string | – | Receiving committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. |
| contributor_city | string | – | Contributor city. Itemized only. |
| contributor_employer | string | – | Full-text employer search. Itemized only. |
| contributor_name | string | – | Full-text donor name search. Itemized only. |
| contributor_occupation | string | – | Full-text occupation search. Itemized only. |
| contributor_state | string | – | Two-letter state code (e.g., CA). Itemized only. |
| contributor_zip | string | – | ZIP code prefix (starts-with match). Itemized only. |
| cursor | string | – | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejec… |
| cycle | number | – | Two-year election cycle (e.g., 2024). Even years only. Defaults to current cycle for itemized mode. |
| is_individual | boolean | – | Only individual contributions (excludes committee-to-committee transfers). Itemized only. |
| max_amount | number | – | Maximum contribution amount in dollars. Itemized only. |
| max_date | string | – | Latest contribution date (YYYY-MM-DD). Itemized only. |
| min_amount | number | – | Minimum contribution amount in dollars. Itemized only. |
| min_date | string | – | Earliest contribution date (YYYY-MM-DD). Itemized only. |
| mode | string | – | Query mode. "itemized" returns individual contribution records (keyset pagination). "by_size" aggregates by contribution size bucket. "by_state" aggregates by contributor state. "by_employer" aggrega… |
| page | integer | – | Page number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates. |
| per_page | integer | – | Results per page. Itemized mode sends at most 30 upstream, keeping the response under a 100,000-byte budget; a page bounded below your request reports truncated and cap, and next_cursor continues it. |
| sort | string | – | Sort field. A "-" prefix sorts descending: use "-contribution_receipt_amount" for the largest receipts first, since the ascending form leads with the most negative rows (refunds, reattributions, rede… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| committee | object | – | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own co… |
| count | number | – | Total matching contributions (itemized mode). Check count_is_approximate before quoting it as a figure. |
| count_is_approximate | boolean | – | True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally. |
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. "by_size" and "by_state" resolve to "by_size_candidate" / "by_state_candidate" when scoped by candidate_id — a different endpoint with different row shapes — so… |
| next_cursor | string|null | – | Pagination cursor for the next page of itemized results. Null when no more pages. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when contributions did match, that the total is an estimate, or that the page… |
| pagination | object | – | Page-based pagination info (aggregate modes only). |
| results | array | – | Contribution result set; itemized records or aggregate buckets depending on mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching contributions or aggregate rows. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_coordinated_expenditures Openfec Search Coordinated Expenditures ~453
Search coordinated party expenditures (Schedule F) — spending a party committee makes on behalf of a candidate it supports, in coordination with that campaign. Distinct from independent expenditures (openfec_search_expenditures), which cannot be coordinated with the candidate, and from direct contributions: coordinated expenditures carry their own statutory limits and can run into tens of millions per party in a presidential cycle. Scope with a spending committee_id, a benefiting candidate_id, or a cycle; unscoped queries span all years.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | Benefiting candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. |
| committee_id | string | – | Spending party committee ID (e.g., C00003418). Get IDs from openfec_search_committees results — party committees carry committee_type X or Y. |
| cycle | number | – | Two-year election cycle (e.g., 2024). Even years only. Omitting it searches every cycle on record. |
| max_amount | number | – | Maximum expenditure amount in dollars. |
| max_date | string | – | Latest expenditure date (YYYY-MM-DD). |
| min_amount | number | – | Minimum expenditure amount in dollars. |
| min_date | string | – | Earliest expenditure date (YYYY-MM-DD). |
| page | integer | – | Page number (1-indexed). Read pagination.pages in the response to see how many pages exist. |
| payee_name | string | – | Full-text payee name search (the vendor the party paid). |
| per_page | integer | – | Results per page. At most 80 are requested upstream when scoped by committee_id and 25 otherwise, keeping the response under a 100,000-byte budget. A page bounded below your request reports truncated… |
| sort | string | – | Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest coordinated spending first, since the ascending form leads with the most negative rows (corrections and voided ent… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| committee | object | – | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own co… |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when expenditures did match, or that the page was bounded below the per_page r… |
| pagination | object | – | Page-based pagination metadata. |
| results | array | – | Coordinated expenditure result set; one record per itemized transaction. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching coordinated expenditures before pagination. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_disbursements Openfec Search Disbursements ~621
Search itemized committee spending (Schedule B) or get aggregate breakdowns by purpose or recipient. All modes require a committee_id. Use to answer "what is this committee spending money on?" or "who is receiving payments from this committee?"
| Name | Type | Req | Description |
|---|---|---|---|
| committee_id | string | yes | Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. Required for all modes. |
| cursor | string | – | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejec… |
| cycle | number | – | Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted — Schedule B spans all history, and an all-history scan of an active committee times ou… |
| disbursement_description | string | – | Full-text description search (e.g., "media buy", "consulting"). Itemized only. |
| disbursement_purpose_category | string | – | Purpose category code. Itemized only. |
| max_amount | number | – | Maximum amount in dollars. Itemized only. |
| max_date | string | – | Latest disbursement date (YYYY-MM-DD). Itemized only. |
| min_amount | number | – | Minimum amount in dollars. Itemized only. |
| min_date | string | – | Earliest disbursement date (YYYY-MM-DD). Itemized only. |
| mode | string | – | Query mode. "itemized" returns individual disbursement records (keyset pagination). "by_purpose" aggregates by purpose category. "by_recipient" aggregates by recipient name. "by_recipient_id" aggrega… |
| page | integer | – | Page number (1-indexed) for aggregate modes. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for aggregates. |
| per_page | integer | – | Results per page. Itemized mode sends at most 30 upstream, keeping the response under a 100,000-byte budget; a page bounded below your request reports truncated and cap, and next_cursor continues it. |
| recipient_city | string | – | Recipient city. Itemized only. |
| recipient_committee_id | string | – | Recipient committee ID (for committee-to-committee transfers). Itemized only. |
| recipient_name | string | – | Full-text payee name search. Itemized only. |
| recipient_state | string | – | Recipient state. Itemized only. |
| sort | string | – | Sort field. A "-" prefix sorts descending: use "-disbursement_amount" for the biggest payments first, since the ascending form leads with the most negative rows (refunds and voided payments). Itemize… |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| committee | object | – | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own co… |
| count | number | – | Total matching disbursements (itemized mode). Check count_is_approximate before quoting it as a figure. |
| count_is_approximate | boolean | – | True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally. |
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. Row shapes differ by mode — itemized rows are individual payments, aggregate rows are buckets with a total — so read this rather than inferring the shape from th… |
| next_cursor | string|null | – | Pagination cursor for the next page of itemized results. Null when no more pages. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when disbursements did match, that the total is an estimate, or that the page… |
| pagination | object | – | Page-based pagination info (aggregate modes only). |
| results | array | – | Disbursement result set; itemized records or aggregate buckets depending on mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching disbursements or aggregate rows. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_expenditures Openfec Search Expenditures ~1,005
Search independent expenditures (Schedule E) — outside spending supporting or opposing federal candidates. Covers Super PACs, party committees, and other groups. Use itemized mode for individual expenditure records, or by_candidate for aggregated totals per candidate; by_candidate needs either a candidate_id or a full race scope (candidate_office alone for President, plus candidate_office_state for Senate, plus candidate_office_district as well for House).
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | Targeted candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. |
| candidate_office | string | – | Office of the targeted candidate: H=House, S=Senate, P=President. In by_candidate mode this scopes a whole race: P stands alone, S also needs candidate_office_state, H also needs candidate_office_sta… |
| candidate_office_district | string | – | Two-digit House district of the targeted race (e.g., "09"). Required alongside candidate_office=H and candidate_office_state in by_candidate mode; Senate and presidential rows carry no district and m… |
| candidate_office_state | string | – | Two-letter state code of the targeted race. Required alongside candidate_office=H or candidate_office=S in by_candidate mode; leave it off for candidate_office=P, whose aggregate rows carry no state… |
| candidate_party | string | – | Three-letter party code of the targeted candidate (e.g., DEM, REP). Itemized only — by_candidate rejects it, since the aggregate endpoint has no party filter. |
| committee_id | string | – | Spending committee ID (e.g., C00703975). Get IDs from openfec_search_committees results. |
| cursor | string | – | Opaque pagination cursor from a previous response of this tool. Itemized mode only (keyset pagination). Valid only for an otherwise-identical call — changing any other argument, including sort, rejec… |
| cycle | number | – | Two-year election cycle (e.g., 2024). Even years only. Itemized mode defaults to the current cycle when omitted — Schedule E spans all history and an unscoped scan times out upstream. Pass an explici… |
| election_full | boolean | – | by_candidate only: expand cycle to the full election period (4yr president, 6yr senate, 2yr house) instead of the two-year cycle alone. Defaults to true when omitted; itemized mode rejects it, since… |
| is_notice | boolean | – | Only 24/48-hour notice filings (near-election spending). Itemized only. |
| max_amount | number | – | Maximum expenditure amount in dollars. Itemized only. |
| max_date | string | – | Latest expenditure date (YYYY-MM-DD). Itemized only. |
| min_amount | number | – | Minimum expenditure amount in dollars. Itemized only. |
| min_date | string | – | Earliest expenditure date (YYYY-MM-DD). Itemized only. |
| mode | string | – | Query mode. "itemized" returns individual expenditure records (keyset pagination). "by_candidate" returns aggregated totals per candidate by committee (page-based). |
| most_recent | boolean | – | Only the most recent version of amended filings. Itemized only — by_candidate rejects it. Defaults to true in itemized mode when omitted; pass false to see superseded versions of amended filings. |
| page | integer | – | Page number (1-indexed) for by_candidate mode. Explicit page is rejected in itemized mode, which paginates with cursor. Defaults to 1 for by_candidate. |
| payee_name | string | – | Full-text payee name search. Itemized only. |
| per_page | integer | – | Results per page. Itemized mode sends at most 60 upstream when scoped by committee_id and 30 otherwise, keeping the response under a 100,000-byte budget; a page bounded below your request reports tru… |
| sort | string | – | Sort field. A "-" prefix sorts descending: use "-expenditure_amount" for the largest outside spending first, since the ascending form leads with the most negative rows (corrections and voided entries… |
| support_oppose | string | – | S = support, O = oppose. Filter by whether the expenditure supports or opposes the candidate. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| committee | object | – | The committee every row in this response belongs to, carried once instead of repeated in each row. Present only when the query was scoped to a single committee_id; otherwise each row keeps its own co… |
| count | number | – | Total matching independent expenditures (itemized mode). Check count_is_approximate before quoting it as a figure. |
| count_is_approximate | boolean | – | True when OpenFEC reports count as an estimate rather than a tally, which it does on its highest-volume queries. Absent means the count is a tally. |
| error | object | – | Present when the call failed. Absent on success. |
| mode | string | – | Query mode as the server resolved it. Row shapes differ by mode — itemized rows are individual expenditures, by_candidate rows are per-candidate totals — so read this rather than inferring the shape… |
| next_cursor | string|null | – | Pagination cursor for the next page of itemized results. Null when no more pages. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when expenditures did match, that the total is an estimate, or that the page w… |
| pagination | object | – | Page-based pagination info (by_candidate mode only). |
| results | array | – | Expenditure result set; itemized records or per-candidate aggregates depending on mode. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching expenditures or per-candidate aggregates. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_filings Openfec Search Filings ~435
Search FEC filings and reports by committee, candidate, form type, or date range. Covers financial reports (F3/F3P/F3X), statements of candidacy (F2), organizational filings (F1), 24-hour IE notices (F24), and amendments.
| Name | Type | Req | Description |
|---|---|---|---|
| candidate_id | string | – | Associated candidate ID (e.g., P00003392). Get IDs from openfec_search_candidates results. |
| committee_id | string | – | Filing committee ID (e.g., C00358796). Get IDs from openfec_search_committees results. |
| cycle | number | – | Two-year election cycle (even year). |
| filer_name | string | – | Full-text filer name search. |
| form_type | string | – | FEC form type. Common: F3 (House/Senate quarterly), F3P (Presidential), F3X (PAC/party), F24 (24-hour IE notice), F1 (statement of organization), F2 (statement of candidacy), F5 (IE by persons). |
| is_amended | boolean | – | Filter to original or amended filings only. |
| max_receipt_date | string | – | Latest FEC receipt date (YYYY-MM-DD). |
| min_receipt_date | string | – | Earliest date FEC received the filing (YYYY-MM-DD). |
| most_recent | boolean | – | Only the most recent version (filters out superseded amendments). |
| page | integer | – | Page number (1-indexed). |
| per_page | integer | – | Results per page. At most 65 are requested upstream, keeping the response under a 100,000-byte budget. A page bounded below your request reports truncated and cap, and pagination.per_page echoes the… |
| report_type | string | – | Report type code. Common: Q1/Q2/Q3 (quarterly), YE (year-end), M3-M12 (monthly), 12G/12P/30G (pre/post election). |
| report_year | number | – | Filing year. |
| Name | Type | Req | Description |
|---|---|---|---|
| cap | number | – | The per_page this call applied in place of the one requested — the page-size ceiling for this tool and scope. Present only when truncated is true. |
| error | object | – | Present when the call failed. Absent on success. |
| notice | string | – | Guidance when the response needs context: how to broaden a search that matched nothing, which requested position ran out when filings did match, that the total is an estimate, or that the page was bo… |
| pagination | object | – | Page-based pagination metadata. |
| results | array | – | Filing result set; one record per match. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Rows in this page. Present only when truncated is true. |
| totalCount | number | – | Total matching filings before pagination. |
| truncated | boolean | – | True when this page holds fewer rows than the per_page requested because a full page would exceed the 100,000-byte response budget, and more rows remain. Absent on a complete page, including a natura… |
No examples provided.
openfec_search_legal Openfec Search Legal ~1,149
Search FEC legal documents: advisory opinions, enforcement cases (MURs), alternative dispute resolutions, administrative fines, and statutes. The citation, penalty, respondent, ao_number, and case_number filters each apply to only some document types; with type omitted, the search returns only the types every one of them applies to. Each response is held to 100,000 bytes: when a page would exceed it, whole results are held back and nextFromHit gives the from_hit that continues each document type.
| Name | Type | Req | Description |
|---|---|---|---|
| ao_number | string | – | Specific advisory opinion number (e.g. "2024-01"). Applies to advisory_opinions only: rejected with any other type, and with type omitted only advisory opinions are returned. |
| case_number | string | – | Specific MUR, ADR, or administrative fine case number (e.g. "8343"). Applies to murs, adrs, and admin_fines: rejected with advisory_opinions or statutes, and with type omitted only those three types… |
| date_kind | string | – | Which date min_date/max_date bound. Each document type records its own dates, so this must be one the chosen type has: type=advisory_opinions → issue_date (opinion issued), request_date (request rece… |
| from_hit | integer | – | Offset for pagination (0-indexed), counted within each document type rather than across them. Default 0. When a response is bounded, nextFromHit gives the value that continues each type. The search i… |
| hits_returned | integer | – | Results per page, applied per document type. Default 20, max 200. A response is held to 100,000 bytes, so a page of large records can carry fewer, with nextFromHit naming where each type continues. B… |
| max_date | string | – | Latest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind. |
| max_penalty_amount | number | – | Maximum penalty amount in dollars. Applies to murs, adrs, and admin_fines (an administrative fine matches on its reason-to-believe or final-determination amount): rejected with advisory_opinions or s… |
| min_date | string | – | Earliest date (YYYY-MM-DD) for the date_kind selected. Requires type and date_kind. |
| min_penalty_amount | number | – | Minimum penalty amount in dollars. Applies to murs, adrs, and admin_fines (an administrative fine matches on its reason-to-believe or final-determination amount): rejected with advisory_opinions or s… |
| query | string | – | Full-text search across legal documents. |
| regulatory_citation | string | – | CFR citation in the form "<title> CFR <part>.<section>" (e.g. "11 CFR 110.1"; "C.F.R.", "§", and a suffix such as "110.1(b)" are accepted — a bare "110.1" is rejected as invalid_citation). One citati… |
| respondent | string | – | Respondent name. Applies to enforcement cases (murs, adrs) only: rejected with any other type, and with type omitted only MURs and ADRs are returned. |
| statutory_citation | string | – | U.S.C. citation in the form "<title> U.S.C. <section>" (e.g. "52 U.S.C. 30104"; "USC", "§", and a suffix such as "30104(g)" are accepted — a bare "30104" is rejected as invalid_citation). One citatio… |
| type | string | – | Document type filter. Omit to search every type the other filters apply to — all five when only query is given. admin_fines can be slow without a query. |
| Name | Type | Req | Description |
|---|---|---|---|
| error | object | – | Present when the call failed. Absent on success. |
| nextFromHit | object | – | The from_hit that continues each document type with results held back, keyed by the value to pass as type (advisory_opinions, murs, adrs, admin_fines, statutes). Re-call with the same filters, that t… |
| notice | string | – | Guidance on the page returned: how to broaden a search that matched nothing, that from_hit ran past the end when documents did match, or — when truncated is set — how each document type continues. |
| results | array | – | Legal document result set spanning advisory opinions, MURs, ADRs, admin fines, and statutes — only the types searched. Grouped by type in upstream order; when truncated is set, each type holds its fi… |
| retrievalHint | string | – | How to recover the material trimmed out of these results. Present whenever any result was returned, because every result is trimmed. |
| search_criteria | object | – | Echo of the search filters this call applied, as the server parsed them, minus paging arguments. Always present — compare it against what you sent to confirm every filter was honoured. |
| shown | number | – | Results in this response. Present only when truncated is true. |
| totalCount | number | – | Total matching legal documents across the document types searched. |
| total_count | number | – | Total matching documents across the types searched: the requested type, or with type omitted, every type the supplied filters apply to. |
| truncated | boolean | – | True when results upstream returned for this page were held back because the next one would take the response past its 100,000-byte budget. Absent when the page is complete, including a naturally sho… |
No examples provided.
How do I install the io.github.cyanheads/openfec-mcp-server server?
io.github.cyanheads/openfec-mcp-server is a hosted endpoint at https://openfec.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · openfec.caseyjhand.com
claude mcp add --transport http cyanheads-openfec-mcp-server 'https://openfec.caseyjhand.com/mcp'
What is the io.github.cyanheads/openfec-mcp-server server?
io.github.cyanheads/openfec-mcp-server is listed in the public MCP registry as io.github.cyanheads/openfec-mcp-server. Access FEC campaign finance data. Query data about candidates, money trails, and election filings. This page covers its hosted endpoint (https://openfec.caseyjhand.com/mcp).
Is the io.github.cyanheads/openfec-mcp-server server safe to use?
io.github.cyanheads/openfec-mcp-server scores 88 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.cyanheads/openfec-mcp-server server expose?
io.github.cyanheads/openfec-mcp-server exposes 12 tools: openfec_search_candidates, openfec_search_committees, openfec_get_committee_totals, openfec_search_contributions, openfec_search_disbursements, and 7 more. Their descriptions and schemas cost roughly 7,048 tokens of context every time the server is loaded.
Does the io.github.cyanheads/openfec-mcp-server server require authentication?
No. We connected to io.github.cyanheads/openfec-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.cyanheads/openfec-mcp-server server still maintained?
io.github.cyanheads/openfec-mcp-server is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the io.github.cyanheads/openfec-mcp-server server?
VerifyMCP ran 13 checks on io.github.cyanheads/openfec-mcp-server, covering TLS certificate, Authorization, HTTPS, HSTS header and 9 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.