Developers

The federal record, as a tool your agent can call

HillSignal exposes one MCP server. It answers the questions people actually ask about the government and the market: who won this award, what is this agency about to buy, what did this member of Congress trade and where do they hold a board seat, which PAC funds whom, who is buying at this ticker, and how good HillSignal's own calls have been. Every row carries a source URL and a date. Companies are matched to tickers by exact match only; a miss comes back as a miss.

Connect

Server URL, Streamable HTTP, no key needed at the free limit:

https://www.hillsignal.com/api/mcp

Claude.ai and Claude Desktop

Settings → Connectors → Add custom connector → paste the URL. For Claude Desktop's config file:

{
  "mcpServers": {
    "hillsignal": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://www.hillsignal.com/api/mcp"]
    }
  }
}

Cursor, Windsurf, VS Code

In mcp.json:

{
  "mcpServers": {
    "hillsignal": { "url": "https://www.hillsignal.com/api/mcp" }
  }
}

ChatGPT

Settings → Connectors → Create (developer mode) → server URL above, no authentication.

Plain HTTP

It is JSON-RPC 2.0 over POST; any language works:

curl -s https://www.hillsignal.com/api/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_awards","arguments":{"agency":"Navy","min_amount":100000000,"limit":5}}}'

Tools

resolve_entity

Map an organization name (a contract recipient, a subsidiary, a PAC sponsor, a Form D issuer) to its public-company ticker. Exact normalized match against SEC legal names, aliases and the Exhibit 21 subsidiary map; returns the method and a confidence, or the reason for a miss. Never guesses.

args: name

get_entity

One company in the federal record: contracts won, PACs, patents, private raises, members of Congress who hold board seats there, insider trades, and its connections graph. Look up by ticker, entity_id, or a name (resolved exactly).

args: ticker, entity_id, name

search_awards

Search federal contract awards (USAspending, $10M+) by recipient, ticker, awarding agency, keyword, date range or minimum amount. Returns total_matching and pages with offset (up to 50 per call), sorted by date or amount. For "who won the most" questions use award_totals instead, which counts every match.

args: recipient, ticker, agency, keyword, since, until, min_amount, sort, offset, limit

award_totals

Aggregate every matching federal award (same filters as search_awards) into totals per recipient, per resolved ticker, or per awarding agency: award count, total dollars, share, first and last award, largest award. Use this for "who won the most from the Navy this year" and similar questions; it counts all matches, not a page.

args: group_by, recipient, ticker, agency, keyword, since, until, min_amount, limit

search_opportunities

Search SAM.gov notices: Sources Sought and Pre-solicitations (the earliest public signal of a purchase), solicitations and combined synopses. Filter by keyword, NAICS, agency, notice type, date.

args: keyword, naics, agency, notice_type, since, limit

congressional_trades

Stock trades disclosed by members of Congress (House and Senate Periodic Transaction Reports), by member name, ticker, transaction type or date. Returns one row per transaction with the disclosed amount range and the filing PDF.

args: politician, ticker, transaction_type, since, limit

get_politician

A member of Congress: committees, board seats and other positions from annual Financial Disclosures (with resolved tickers), recent stock trades, and top PAC contributors from FEC data. Look up by name or bioguide_id; ambiguous names return candidates.

args: name, bioguide_id

insider_trades

SEC Form 4 insider transactions by ticker or insider name; filter to buys or sells, minimum value, date.

args: ticker, insider, type, min_value, since, limit

search_bills

Full-text search over bills, contract awards and other government events with their analysed sector and ticker exposure. Filter by bill number, ticker, sector, date or event type.

args: query, bill_number, ticker, sector, event_type, since, limit

executive_orders

Executive orders, proclamations and memoranda with affected sectors and tickers.

args: query, sector, since, limit

pac_lookup

Corporate and trade PACs linked to an issuer (by ticker) or by committee name, with their top recipient candidates aggregated from FEC disbursements.

args: ticker, committee_name, limit

pac_totals

Which PACs give the most: contributors to tracked candidates ranked by total dollars (FEC Schedule A), by election cycle, with donor-processing conduits like ActBlue and WinRed separated out. mode=disbursers ranks committees by their own reported disbursements instead. Use for "which PACs donate the most" questions.

args: mode, cycle, query, limit

data_coverage

Row counts and the latest dated row for every dataset behind these tools, plus entity-resolution coverage. Call it when an answer depends on how complete the data is, or before saying something does not exist.

args: none

list_themes

The themes the government is currently funding across bills, contracts, solicitations and filings, each with a permanent page and a verdict.

args: none

get_theme

One theme in full: the setup, the dated chronology with each beat linked to its source record, why it matters, what to watch, and the evidence.

args: theme_id

latest_events

The newest events across every source (awards, trades, filings, bills, orders, themes), with provenance. Optional filters by category, ticker or source id.

args: categories, tickers, sources, limit

track_record

Every forward call HillSignal made since May 2025, verified against SPY 30 days later, with the inclusion rules and the miss rate.

args: none

institutional_holders

Largest institutional holders of a ticker from 13F-HR filings HillSignal has ingested, latest position per institution.

args: ticker, limit

form_d_raises

SEC Form D private placements of $5M and up, by issuer name, resolved ticker, date or minimum amount.

args: query, ticker, since, min_amount, limit

Limits and keys

  • Unkeyed: 60 requests a minute per IP, metered. Enough for a person's assistant.
  • Keyed: pass Authorization: Bearer hw_live_…. Pro keys are 600 a minute; enterprise 6,000 with the convergence sources. Ask press@hillsignal.com for a key; newsletters that credit “data: HillSignal” get one free.
  • Result sets are capped at 25 rows per call; page with since and narrower filters.
  • Read-only. Nothing you send is stored beyond the request log used for the meter.
curl -s https://www.hillsignal.com/api/mcp -H 'Authorization: Bearer hw_live_...' -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Identifiers

  • hs:entity:<uuid> a company, resolved by the same rules everywhere. Page: /entity/<uuid>.
  • hs:theme:<id> a government theme with a permanent, cited page: /themes/<id>.
  • Members of Congress use their Bioguide id. Awards carry the USAspending award id. Filings carry the SEC accession number. PACs carry the FEC committee id.

Methodology

Entity resolution. An organization name is normalized and matched exactly against SEC legal names, the aliases HillSignal has verified, and the Exhibit 21 subsidiary map (45,000 subsidiary lines from annual reports). There is no fuzzy matching. A name claimed by more than one issuer is refused rather than attributed. Each hit states its method (parent_exact, recipient_alias, recipient_subsidiary, and so on) and a fixed confidence for that method. Coverage per source is published at /api/wire/health.

People. Members resolve by exact name or last name and the tool returns candidates when more than one matches. Board seats and positions come from the annual Financial Disclosure report, Schedule E, extracted per filing with the raw line kept.

Track record. Every directional call is logged when it lands and verified against SPY 30 days later. The page states its inclusion rules and prints rates only where the sample is at least 20. Misses are counted. /track-record.

Freshness. Sources are polled on published schedules; the health endpoint reports capture latency per source and flags stale ones rather than hiding them.

Also available

  • The wire: keyed JSON firehose and SSE stream of every source, with provenance.
  • RSS: /feed/signals.xml, /feed/trades.xml, /feed/themes.xml.
  • /api/public/track-record: the record as JSON, CORS-open.