Connect SecFeed to Claude and other AI agents with MCP
Add the SecFeed MCP server to Claude Code, Cursor or any MCP client, see the 26 SEC data tools it exposes, and call them yourself over JSON-RPC.
The Model Context Protocol (MCP) is the standard way to give an AI assistant tools. SecFeed runs an MCP server at https://secfeedapi.com/mcp, so Claude, Cursor and other MCP clients can search filings, read 10-K sections, pull insider trades and 13F holdings, and look up auditors and executive pay on their own, with your API key.
This tutorial connects a client, then calls the server directly so you can see exactly what the assistant sees.
Step 1: add the server to your client
You need a SecFeed API key from your dashboard. The server speaks MCP over HTTP and authenticates with the same Authorization: Bearer header as the REST API.
Claude Code (the command line agent):
claude mcp add --transport http secfeed https://secfeedapi.com/mcp \
--header "Authorization: Bearer YOUR_KEY"
Cursor and other clients that read an mcpServers JSON file:
{
"mcpServers": {
"secfeed": {
"url": "https://secfeedapi.com/mcp",
"headers": { "Authorization": "Bearer YOUR_KEY" }
}
}
}
Restart the client after editing its configuration. Each tool call the assistant makes counts as one API call on your plan.
Step 2: see the tools
An MCP client starts with initialize, then asks for tools/list. You can do the same with curl:
curl -s https://secfeedapi.com/mcp \
-H "Authorization: Bearer $SECFEED_KEY" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}'
{"jsonrpc": "2.0", "id": 1, "result": {"protocolVersion": "2025-06-18", "capabilities": {"tools": {}}, "serverInfo": {"name": "secfeed", "version": "0.1"}}}
curl -s https://secfeedapi.com/mcp \
-H "Authorization: Bearer $SECFEED_KEY" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
The server returns 26 tools, each with a description and a JSON schema for its arguments. Their names and arguments:
| Tool | Arguments |
|---|---|
search_filings | query, size, from |
full_text_search | query, formTypes, startDate, endDate |
extract_section | url, item |
xbrl_to_json | accessionNo, cik, htmUrl |
financial_statements | ticker, formType |
company_facts | ticker |
insider_trades | ticker, code, minValue, owner, startDate, size |
form_13f_holdings | cusip, cik, period |
events_8k | item, cik, startDate, text |
structured_form | family, cik, startDate, size |
company_profile | cik |
map_ticker | ticker |
map_cusip | cusip |
shares_outstanding | ticker |
auditor | ticker |
enforcement | kind, page, details |
sro_filings | org |
pay_vs_performance | ticker |
equity_dilution | ticker |
executive_compensation | ticker |
directors | ticker |
subsidiaries | ticker |
ipo_filings | formType, startDate |
mergers_acquisitions | ticker, startDate |
investment_adviser | query, crd |
list_filing_files | cik, accessionNo |
The descriptions matter: they are what the model reads to decide which tool fits a question. For example, events_8k is described as "8-K filings by item (1.01, 1.05, 2.02, 4.01, 4.02, 5.02, 5.07...)", which is how an assistant knows to use it for "which companies disclosed a cybersecurity incident this month".
Step 3: call a tool yourself
tools/call takes the tool name and its arguments. Ask for NVIDIA's auditor:
curl -s https://secfeedapi.com/mcp \
-H "Authorization: Bearer $SECFEED_KEY" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"auditor","arguments":{"ticker":"NVDA"}}}'
{"jsonrpc": "2.0", "id": 3, "result": {"content": [{"type": "text", "text": "{\"cik\": 1045810, \"accessionNo\": \"0001045810-26-000021\", \"auditorName\": \"PricewaterhouseCoopers LLP\", \"auditorLocation\": \"San Jose, California\", \"auditorFirmId\": \"238\", \"icfrAuditorAttestation\": \"true\"}"}]}}
The result is a content list with one text block holding JSON. The model reads that text, and the answer comes from the 10-K's audit information, not from the model's memory. The call took 0.6 seconds.
A search works the same way:
-d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"search_filings","arguments":{"query":"ticker:NVDA AND formType:\"8-K\"","size":2}}}'
{"total": {"value": 243, "relation": "eq"}, "filings": [{"accessionNo": "0001045810-26-000078", ..., "formType": "8-K", "filedAt": "2026-09-03", ...}, {"accessionNo": "0001045810-26-000073", ..., "filedAt": "2026-08-26", ...}]}
Prompts that work well
With the server connected, ask questions that need current filings, and name the company or form:
- "Using SecFeed, list NVIDIA's last three 8-K filings and summarize each one's items."
- "Pull Item 1A from Microsoft's latest 10-K and list the new risk factors compared with the prior year."
- "Which directors at AMD bought shares on the open market this year?"
The assistant will chain tools: map a ticker, search filings, then extract a section or read structured data. Ask it to cite accession numbers so you can check its sources on EDGAR.
Next steps
- MCP Server product page
- Analyze SEC comment letters, a good task to hand to an agent
- Lucene query syntax for the
queryargument - MCP setup in the docs