Documentation
How to connect your AI agent to KeyVex and query the 60+ tools. The free public endpoint needs no account or API key — point your MCP client at it and go. It's rate-limited; accounts and higher-quota tiers are rolling out (see below).
What is KeyVex
KeyVex is a public-data API for US financial and government disclosures —
SEC filings, congressional trades, FEC campaign finance, federal contracts and grants,
lobbying, regulatory enforcement, sanctions, macroeconomic indicators, and more. It's
built agent-first and delivered as a remote
Model Context Protocol
(MCP) server, so any MCP client — Claude, Cursor, or your own agent — connects once and
can query all 60+ tools with no glue code. And because the endpoint is
plain HTTP, you can also call it directly with curl or any HTTP client —
handy for non-agent, programmatic use.
All data is public-record information sourced directly from US government agencies. KeyVex normalizes and indexes it; KeyVex does not provide investment advice, derived signals, or trading recommendations.
Quickstart
1. Start on the free tier — no signup needed
KeyVex's free public MCP endpoint is openly accessible — no account, no API key, no consent flow. Point your client at the URL below and start calling tools. The free endpoint is rate-limited (see Rate limits); for higher volume, see Accounts & tiers.
2. Choose your AI
KeyVex has two MCP endpoints — same 60+ tools on both:
https://mcp.keyvex.com # free public endpoint — no account, rate-limited per IP
https://mcp.keyvex.com/pro # sign in with your KeyVex account — your plan's quota + history
Pick your client for step-by-step setup:
Using something else? Any client that speaks MCP's standard Streamable HTTP transport
works — point it at https://mcp.keyvex.com; the free endpoint needs no
authentication headers.
Set up: Claude
claude.ai or Claude Desktop — the easiest path, no files to edit:
- 1. Open claude.ai (or Claude Desktop) and go to Settings → Connectors.
- 2. Click Add custom connector.
- 3. Name it
KeyVexand paste this as the URL, then click Add:https://mcp.keyvex.com - 4. That's it — no sign-in or consent step. To check it worked, start a new chat and ask: "What are the biggest congressional trades this month?" Claude should call a KeyVex tool and answer with real filings.
Have a KeyVex account? In step 3, paste
https://mcp.keyvex.com/pro instead. The first time Claude calls a tool,
it shows a Connect card — sign in with your keyvex.com login and your plan's
quota and history apply from then on. Full details:
Use your plan in Claude.
Claude Desktop via config file (advanced — only if you prefer editing
config by hand). Desktop's claude_desktop_config.json only accepts local
servers, so a remote url entry is silently ignored; bridge it with
mcp-remote instead (needs Node.js installed):
- 1. Open the config file — Windows:
%APPDATA%\Claude\claude_desktop_config.json· Mac:~/Library/Application Support/Claude/claude_desktop_config.json(create it if it doesn't exist). - 2. Paste this and save:
{ "mcpServers": { "keyvex": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.keyvex.com"] } } } - 3. Fully quit and reopen Claude Desktop. KeyVex appears in the tools menu of a new chat.
Claude Code (the terminal tool) — one command, done:
claude mcp add --transport http keyvex https://mcp.keyvex.com
Or with your plan, using the API key from your KeyVex account:
claude mcp add --transport http keyvex https://mcp.keyvex.com/pro \
--header "Authorization: Bearer kvx_live_YOUR_KEY"
Set up: ChatGPT
ChatGPT supports custom MCP connectors on paid plans (Plus / Pro / Business / Enterprise / Edu) with Developer mode enabled:
- 1. Enable Developer mode. Settings → Apps & Connectors (on some plans: Connectors → Advanced) → turn on Developer mode. On Business / Enterprise a workspace admin has to enable it first.
- 2. Add the connector. In the same Connectors / Apps settings,
choose Create / Add custom connector, name it
KeyVex, and pastehttps://mcp.keyvex.comas the MCP server URL. No authentication — leave auth set to none. - 3. Turn it on in chat. In a new chat, open the composer's tool picker (the + / tools button) and enable the KeyVex connector — it's also available as a source in Deep Research.
- 4. Try it. Ask: "What are the biggest congressional trades this month?" ChatGPT should call a KeyVex tool and answer with real filings.
OpenAI has been renaming this surface (Connectors ↔ Apps), so labels may differ slightly — look for "custom connector" plus "developer mode."
Set up: Cursor
- 1. In Cursor, open Settings → MCP and click
Add new global MCP server — this opens
~/.cursor/mcp.json. (For one project only, create.cursor/mcp.jsonin the project folder instead.) - 2. Paste this and save:
{ "mcpServers": { "keyvex": { "url": "https://mcp.keyvex.com" } } } - 3. Back in Settings → MCP, KeyVex should show a green dot with its tools listed. To try it, ask the agent chat: "What are the biggest congressional trades this month?"
On a KeyVex plan? Use this version instead — it sends your API key
with every request, so your plan's daily quota and history window apply. Replace
kvx_live_YOUR_KEY with the key from your
KeyVex account:
{
"mcpServers": {
"keyvex": {
"url": "https://mcp.keyvex.com/pro",
"headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
}
}
}
Set up: Windsurf
- 1. In Windsurf, open Settings → Cascade → MCP and choose
to add / configure a server — this opens
~/.codeium/windsurf/mcp_config.json(you can also edit that file directly). - 2. Paste this and save — note Windsurf's field is
serverUrl, noturl:{ "mcpServers": { "keyvex": { "serverUrl": "https://mcp.keyvex.com" } } } - 3. Click the refresh button in Cascade's MCP toolbar. KeyVex and its tools appear in the list. To try it, ask Cascade: "What are the biggest congressional trades this month?"
On a KeyVex plan? Use this version instead — it sends your API key
with every request, so your plan's daily quota and history window apply. Replace
kvx_live_YOUR_KEY with the key from your
KeyVex account:
{
"mcpServers": {
"keyvex": {
"serverUrl": "https://mcp.keyvex.com/pro",
"headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
}
}
}
Set up: VS Code
VS Code uses MCP through GitHub Copilot Chat, so you need a Copilot subscription with the Copilot Chat extension installed.
- 1. In your project folder, create a file at
.vscode/mcp.json. - 2. Paste this and save — note VS Code's top-level key is
servers, notmcpServers:{ "servers": { "keyvex": { "type": "http", "url": "https://mcp.keyvex.com" } } } - 3. VS Code shows a Start hint above the server entry — click it (or just save; it starts on demand).
- 4. Open Copilot Chat, switch to Agent mode, and check the tools picker — KeyVex's tools are listed. Try: "What are the biggest congressional trades this month?"
On a KeyVex plan? Use this version instead — it sends your API key
with every request, so your plan's daily quota and history window apply. Replace
kvx_live_YOUR_KEY with the key from your
KeyVex account:
{
"servers": {
"keyvex": {
"type": "http",
"url": "https://mcp.keyvex.com/pro",
"headers": { "Authorization": "Bearer kvx_live_YOUR_KEY" }
}
}
}
Heads-up: .vscode/mcp.json lives inside your project — if the project is
in a shared git repo, don't commit your key.
3. Make a query
Ask your agent something that touches KeyVex data:
"Show me the largest congressional trades in the past 30 days
with party and committee context."
The agent will pick the right tools (get_congressional_trades and
get_member_profile), run them in parallel, and synthesize an answer.
4. Verify with curl (optional)
You can hit the endpoint directly without any client. Health check:
curl https://mcp.keyvex.com/
Returns server version, tool count, and the full tool list as JSON. List all tools via MCP:
curl -X POST https://mcp.keyvex.com/ \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
No Authorization header is needed. The response is a JSON-RPC envelope containing the full schema of every tool.
Authentication, accounts & tiers
The free public endpoint is authless. KeyVex's free MCP endpoint at mcp.keyvex.com is openly accessible — no account, no API key, no OAuth flow, and no consent screen. Any MCP client can connect and call any tool. It advertises this in its health-check response: {"auth":"none",...}.
It's rate-limited (60 requests / 60-second window per IP) — generous for evaluation and light use. For sustained higher volume you create an account and use an API key.
The free endpoint stays open because every tool serves data already public by federal mandate (SEC filings, USAspending records, congressional disclosures, etc.) — there's nothing user-specific to gate on, and skipping auth removes a setup step for the agent developer.
Abuse prevention. Because the free endpoint is open, two mechanisms protect it from runaway use:
- A per-IP rate limit caps each calling IP at 60 requests per 60-second sliding window. Exceed it and the endpoint returns HTTP 429 with a
Retry-Afterheader. - A Cloud Run instance cap bounds the worst-case server load even under a coordinated flood.
Accounts & higher tiers. You can create a free account at
keyvex.com (email, Google, or phone) and we'll
issue you an API key — keys are stored only as a hash, never in the clear. Your
account's plan (Free / Pro / Premium) sets your daily call quota and history window
on both the REST API and the /pro MCP endpoint below. The free public
endpoint at mcp.keyvex.com stays authless and free.
Use your plan in Claude — the /pro connector
To use your KeyVex account's tier through Claude (or any OAuth-capable MCP client), connect to the account-aware endpoint instead of the public one:
https://mcp.keyvex.com/pro
Here's the flow, step by step:
- 1. Add the connector. In Claude's Connectors settings,
add a custom connector pointing at
https://mcp.keyvex.com/pro. It connects immediately — the tool list loads without signing in. - 2. Sign in on first use. The first time Claude actually calls a tool, it shows an inline Connect card. Click it, sign in with your KeyVex account (the same login as keyvex.com), and Claude retries the call automatically. One-time step per client.
- 3. Your plan applies live. Every call is metered at your account's current tier — daily quota and history window (Free: 1 year · Pro: 5 years · Premium: full archive). Upgrades and downgrades take effect on your very next call; there's nothing to reconnect or refresh.
Prefer your API key? Header-capable clients — Claude Code, Cursor,
scripts — can skip OAuth entirely and send the same kvx_live_ key you use
on the REST API, as either header:
# Claude Code
claude mcp add --transport http keyvex https://mcp.keyvex.com/pro \
--header "Authorization: Bearer kvx_live_YOUR_KEY"
# or raw HTTP — x-api-key works too
curl -X POST https://mcp.keyvex.com/pro \
-H "x-api-key: kvx_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_congressional_trades","arguments":{"ticker":"NVDA"}}}'
An expired or invalid credential returns 401 — Claude responds by
refreshing its token or re-showing the Connect card, so a stale session heals itself.
The tool surface is identical on both endpoints; the only differences are quota and
history depth.
REST API (HTTP)
Besides the MCP connector, KeyVex exposes the same data as a plain REST API at
https://api.keyvex.com — for AI-generated scripts, agents, and apps that
make ordinary HTTP requests instead of speaking MCP. If you ask an AI to "build
me something with KeyVex," this is the surface its code calls.
Base URL & OpenAPI spec
The machine-readable OpenAPI 3.1 spec lists every endpoint and parameter — point any AI at it and it can write correct code on the first try:
https://api.keyvex.com/openapi.json
Authentication
The REST API is key-only (unlike the free MCP endpoint). Create a free
account at keyvex.com, generate a key, and send it
on every request in the x-api-key header:
curl "https://api.keyvex.com/v1/congressional-trades?ticker=NVDA" \
-H "x-api-key: YOUR_KEY"
Free key = every dataset, 1 year of history, 60 requests/day. A free
key returns complete rows (not a preview) across all datasets within a 1-year history
window; Pro extends the window to 5 years, Premium to the full archive, and paid tiers
raise the daily cap, which resets at midnight Eastern. A missing or invalid key returns
401.
Endpoints
All 60+ tools are exposed as GET /v1/<name> — the tool name without the
get_ prefix, hyphenated. A few examples:
GET /v1/congressional-trades?ticker=NVDA
GET /v1/insider-transactions?ticker=AAPL
GET /v1/institutional-holdings
GET /v1/federal-contracts
GET /v1/lobbying-filings
GET /v1/material-events
Responses are JSON — { "results": [...], "count": N, "has_more": bool }. See
the OpenAPI spec for the full list of all
54 endpoints and their parameters.
Tool reference
KeyVex exposes 60+ tools. All are read-only. Every tool's full schema (parameters,
filters, response shape) is returned by the MCP tools/list method.
The table below is a one-line summary.
SEC filings & market structure
| get_insider_transactions | SEC Form 4 / 5 — executive insider buys, sells, option exercises, RSU activity |
| get_planned_insider_sales | SEC Form 144 — planned insider sales with 10b5-1 plan flag |
| get_institutional_holdings | SEC Form 13F — quarterly institutional fund holdings |
| get_activist_stakes | SEC Schedule 13D / 13G — activist and 5%+ beneficial ownership |
| get_nport_filings | SEC Form N-PORT — mutual fund monthly portfolio metadata |
| get_fund_holdings | SEC N-PORT primary-document XML — per-security fund holdings + derivatives |
| get_registration_statements | SEC Form S-1 / S-3 — IPO and shelf registration statements |
| get_tender_offers | SEC Schedule TO — third-party + issuer tender offers |
| get_private_placements | SEC Form D — Regulation D exempt offerings |
| get_material_events | SEC Form 8-K — M&A, executive changes, earnings, material events |
| get_proxy_filings | SEC Schedule 14A — proxy statements (DEF 14A annual + merger) |
| get_fundamentals | SEC EDGAR XBRL — income statement, balance sheet, cash flow per filing |
| get_sec_fails_to_deliver | SEC bi-monthly Fails-to-Deliver settlement data |
| get_sec_comment_letters | SEC EDGAR UPLOAD / CORRESP — comment-letter correspondence between SEC staff and filers |
| get_reg_a_offerings | SEC Form 1-A — Regulation A+ offering statements |
| get_crowdfunding_offerings | SEC Form C — Regulation Crowdfunding offerings |
| get_money_market_funds | SEC Form N-MFP3 — monthly money market fund portfolio reports |
| get_investment_advisers | SEC Form ADV — registered investment adviser registry (monthly extract) |
| get_delistings | SEC Form 25 / Form 15 — exchange delistings and deregistrations |
Congressional activity
| get_congressional_trades | Senate eFD + House Clerk Periodic Transaction Reports (member stock trades) |
| get_member_profile | Current senators, representatives, committee assignments, contact info |
| get_annual_financial_disclosures | Form 278 / Public Financial Disclosure (Senate eFD) |
| get_bills | Congress.gov bills + resolutions (HR / S / HJ / SJ / HC / SC / HR / SRes) |
| get_roll_call_votes | House + Senate roll-call votes |
Campaign finance & influence
| get_fec_candidate_profile | FEC candidates and linked principal committees |
| get_fec_contributions | FEC Schedule A — aggregated campaign contributions (totals by candidate / committee / employer / state + donor leaderboard) |
| get_fec_disbursements | FEC Schedule B — itemized committee disbursements (vendors, media buys, transfers) |
| get_fec_independent_expenditures | FEC Schedule E — super-PAC ads supporting/opposing candidates |
| get_lobbying_filings | Senate LDA — quarterly lobbying registrations and spend |
| get_foreign_agents | DOJ FARA — foreign agent registrations and principal relationships |
| get_lobbyist_contributions | Senate LD-203 — lobbyist political contribution reports |
Federal awards
| get_federal_contracts | USAspending — federal procurement contract awards |
| get_federal_grants | USAspending — federal grant + assistance awards |
Regulatory & compliance
| get_enforcement_actions | SEC + DOJ + CFTC + OCC + FDIC + FTC + Federal Reserve + FinCEN enforcement press releases |
| get_ofac_sdn | US Treasury OFAC Specially Designated Nationals sanctions list |
| get_screening_list | US Consolidated Screening List — 12 export-control / sanctions lists |
| get_federal_register_documents | Federal Register — rules, proposed rules, notices, presidential documents |
| get_osha_enforcement | DOL/OSHA — workplace-safety inspections and violations with penalties (1980s→present) |
| get_epa_enforcement | EPA ECHO — federal civil environmental enforcement cases with penalties (1977→present) |
| get_nlrb_cases | NLRB — unfair-labor-practice charges + union representation petitions |
| get_ferc_filings | FERC eLibrary — energy-regulatory dockets (rate cases, certificates, hydro) |
| get_oig_exclusions | HHS-OIG LEIE — list of excluded healthcare individuals / entities |
| get_consumer_complaints | CFPB Consumer Complaint Database |
| get_product_recalls | FDA (drug / device / food) + CPSC consumer-product recalls |
| get_government_publications | GovInfo — committee reports, public laws, hearings, GAO reports |
| get_fda_approvals | FDA — drug approvals (Drugs@FDA) plus device 510(k) clearances and PMA approvals |
| get_bank_financials | FDIC BankFind Suite — quarterly bank call-report financials |
| get_open_payments | CMS Open Payments — industry payments to physicians and teaching hospitals (live passthrough) |
| get_nonprofit_filings | IRS Form 990 / 990-EZ / 990-PF / 990-T — nonprofit filings with financials and officer compensation |
| get_drug_adverse_events | openFDA FAERS — drug adverse-event reports (live passthrough) |
| get_fema_disasters | OpenFEMA — federal disaster declarations |
| get_h1b_filings | DOL OFLC — H-1B Labor Condition Application disclosures |
Macroeconomic & markets
| get_economic_indicators | BLS + FRED + EIA — employment, CPI, rates, GDP, energy series |
| get_treasury_auctions | US Treasury Bills / Notes / Bonds / TIPS / FRN auctions |
| get_cftc_cot_reports | CFTC Commitments of Traders — weekly futures + options positioning |
Innovation & IP
| get_corporate_patents | USPTO Open Data Portal — US patent applications keyed on the corporate applicant (IP owner); live-first over any company |
Reference & market data
| get_aircraft_registry | FAA releasable aircraft database — registered aircraft and owners |
| get_company_profile | Assembled company reference profile — name, CIK, tickers, SIC, addresses, business summary, CEO + board, per-field provenance |
unified_search
unified_search is the cross-source meta-tool. Pass one or more identifiers
(ticker, company_name, cusip, company_cik, bioguide_id, recipient_uei) and it
fans out across every applicable tool in parallel, returning a unified envelope.
Useful when you want a full picture of an entity without manually calling 10 tools:
{
"method": "tools/call",
"params": {
"name": "unified_search",
"arguments": { "ticker": "NVDA" }
}
}
The fan-out hits insider transactions, congressional trades, institutional holdings,
activist stakes, federal contracts, material events, fundamentals, and more —
whichever tools match the identifier you passed. get_lobbying_filings
is the one collection deliberately excluded from the fan-out (substring scans on 51K+
filings are too slow to parallelize); call it directly for lobbying queries.
Rate limits
How KeyVex meters usage depends on how you connect.
Authless public endpoint. The open mcp.keyvex.com
endpoint needs no account or key — it exists so MCP clients and connectors (for
example the Claude Connector, where users can't sign up to test) can call it
immediately. Access is restricted, and it's rate-limited per IP at 60
requests per 60-second sliding window. Exceed the window and the endpoint
returns HTTP 429 with a Retry-After header indicating how long to wait.
Authenticated tiers. Create an account and send an API key for a higher, per-account daily quota that resets at midnight Eastern:
- Free — 60 calls / day, all datasets, 1 year of history.
- Pro — 10,000 calls / day, all datasets, 5 years of history.
- Premium — 100,000 calls / day, all datasets, full historical archive.
History windows. Time-series datasets return records within your
tier's window (Free/keyless: 1 year · Pro: 5 years · Premium: full archive).
Every response subject to a window carries a history_floor field plus a
history_note so agents always know the range they're seeing. Reference
datasets (member profiles, sanctions & screening lists, OIG exclusions, foreign-agent
registrations, economic indicators) are always served in full — capping a current-state
compliance list would make it wrong, so we don't.
Exceed your daily quota and calls return HTTP 429 with a Retry-After
header until the next reset. A server-side concurrent instance cap
additionally bounds worst-case load under coordinated traffic — you should never see
it unless you're actively trying to flood the server.
For most agent workflows (a few tool calls per user question, the occasional batch catch-up) you'll never hit a limit. To raise your quota or extend your history window, see Accounts & tiers or compare plans.
Data freshness
Two different clocks govern how current a record is, and it helps to keep them separate.
1. Poll cadence — how often KeyVex re-checks each source. KeyVex caches normalized data in Firestore and refreshes it on this schedule:
- SEC filings (most types): hourly
- SEC Form 4: every 30 minutes
- 13F: every 4 hours
- Congressional trades: daily, 6 AM ET
- FEC contributions, federal contracts, lobbying: daily
- Bills, votes, member profiles: daily
- XBRL fundamentals: weekly
- FARA, OFAC, screening lists, recalls: daily
- Economic indicators: daily
2. Source-publication lag — how recent the data itself can be. Several agencies publish in batches well after the events they describe, so the newest record a tool can return is bounded by the source's own release schedule — not by how often KeyVex polls. Polling every 30 minutes cannot surface data the SEC has not published yet. The main lagged sources:
- Fails-to-deliver (
get_sec_fails_to_deliver): SEC publishes a half-month batch ~2-4 weeks after that half-month closes, so the latest settlement date typically trails today by 2-4 weeks. - Product recalls (
get_product_recalls): FDA / CPSC datasets commonly post 4-6 weeks after a recall is initiated. - 13F institutional holdings (
get_institutional_holdings): funds file quarterly, up to 45 days after quarter-end — a quarterly snapshot, never intraday. - N-PORT fund holdings (
get_fund_holdings,get_nport_filings): monthly filings released on a ~30-60 day public-availability delay. - Congressional PTRs (
get_congressional_trades): members may file up to 30-45 days after a trade, so the disclosure date lags the trade date.
So a record from a few weeks ago on a lagged tool is the source operating
normally, not a stale cache. Each tool response includes a
scraped_at or last_modified_date field showing
exactly when KeyVex last polled, and lagged tools restate their own
publication cadence in the tool description.
Troubleshooting
I get HTTP 429 Too Many Requests
Your IP exceeded the 60-requests-per-minute rate limit. The response body and the
Retry-After header indicate how long to wait. If your legitimate use
case requires higher sustained volume, email
contact@keyvex.com.
A tool returns an empty result set when I expect data
Common causes:
- Filter too narrow. The MCP filter parameters AND together — try widening the date range or removing one filter.
- Source genuinely has no data for that query. Some sources (e.g., FARA, Senate roll-call votes for some sessions) have low overall volume. The empty response is correct.
- Data not yet ingested. If you're querying for events from the last hour, check the refresh cadence — some sources update only daily.
My MCP client is asking for an authentication URL or consent flow
It shouldn't. KeyVex serves auth: none in its health-check response and
does not return a WWW-Authenticate header on any 401 (because we never
return 401 for auth reasons — there's nothing to authenticate). If your client is
forcing an OAuth flow regardless, check the client's MCP server configuration — some
clients default to OAuth discovery and need to be explicitly told the server is
authless. You can also paste a dummy Bearer token if your client requires the field;
we'll ignore it.
Can I get historical data older than what a tool returns by default?
Most tools accept since and until date filters, and
the historical depth varies by source:
- SEC Form 4 insider transactions: back to 2006. KeyVex serves the SEC's quarterly bulk ownership dataset, which begins 2006 Q1. (Electronic Form 4 was mandated in 2003, but the bulk dataset itself starts in 2006 — querying 2003-2005 returns nothing.)
- XBRL fundamentals: back to 2009, when XBRL tagging became mandatory for large filers. (Some period-end values reach 2006 as prior-year comparatives embedded in those early filings.)
- FEC contributions: back to the 1976 cycle.
Reaching older cycles requires the
cycleparameter (e.g.cycle: 1980) —since/untilalone stay within the current cycle, so an old date range with nocyclereturns empty. Paircyclewith asince/untilwindow or a committee / candidate / state / employer filter to scope the result.
If a date range returns less than you expect, check the data freshness section — and note that on lagged sources the newest records trail today by weeks (source-publication lag).
How do I report a bug or request a feature?
Email contact@keyvex.com with the tool name, the exact query parameters you sent, the response you received, and what you expected. We typically reply within one business day.
Support
Primary support contact: contact@keyvex.com
Founders read this inbox directly. Typical response time is within one business day. For urgent issues (production outage, breaking change), include "URGENT" in the subject.
For privacy, terms, and data-handling questions, see the
privacy policy. For status and version, see the public health
check at https://mcp.keyvex.com/
(returns server version and current tool list as JSON, no authentication required).
