Home / Guides / LLM workflows
LLM workflows

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:

ToolArguments
search_filingsquery, size, from
full_text_searchquery, formTypes, startDate, endDate
extract_sectionurl, item
xbrl_to_jsonaccessionNo, cik, htmUrl
financial_statementsticker, formType
company_factsticker
insider_tradesticker, code, minValue, owner, startDate, size
form_13f_holdingscusip, cik, period
events_8kitem, cik, startDate, text
structured_formfamily, cik, startDate, size
company_profilecik
map_tickerticker
map_cusipcusip
shares_outstandingticker
auditorticker
enforcementkind, page, details
sro_filingsorg
pay_vs_performanceticker
equity_dilutionticker
executive_compensationticker
directorsticker
subsidiariesticker
ipo_filingsformType, startDate
mergers_acquisitionsticker, startDate
investment_adviserquery, crd
list_filing_filescik, 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

More llm workflows guides

Run this guide with your own key

500 free API calls a month. Every example on this page works on the free plan.

Get free API key →