Ask Claude what Berkshire Hathaway owns, or which funds just bought into a stock you cover, and you will get a fluent answer built from training data that could be a year stale. Positions rotate every quarter. For equity research, that gap between "what the model remembers" and "what was actually filed last month" is the difference between a usable read and a wrong one.
In this guide we close that gap. We connect Claude to the official Apify MCP server, expose a single Actor that reads SEC Form 13F institutional-holdings filings, and turn "what does this fund own?" from a guess into a live lookup against the disclosure of record. By the end you will have a working tool that Claude, Cursor, or any MCP client can call mid-conversation to pull any large manager's latest positions, with dollar value, portfolio weight, and quarter-over-quarter change. This is aimed at equity research teams, fund analysts, and allocators.
Everything below is a real setup with real output. No mocked responses.
What is the Apify MCP server?
Model Context Protocol (MCP) is an open standard that lets AI clients call external tools. The Apify MCP server (https://mcp.apify.com) implements that standard on top of the Apify platform, which means every one of the thousands of Actors in the Apify Store becomes a tool an agent can invoke.
Why route an Actor through MCP instead of hard-coding an API call?
- The agent decides when to fetch. Claude reads the conversation, notices it needs a holding it does not have, and calls the tool on its own. You do not write glue code for every question.
- Structured input and output. The MCP server hands Claude the Actor's input schema, so the model fills in the parameters correctly, and returns a clean dataset it can reason over.
-
One connection, many tools. The same MCP endpoint exposes
search-actors,fetch-actor-details, andcall-actor, so an agent can discover and run any Actor without new configuration. - No infrastructure. The server is hosted. You add a few lines to a config file and you are done.
The Actor we will use
We will expose the SEC 13F Institutional Holdings Scraper. Give it a manager, either by name (for example "Berkshire Hathaway", "Bridgewater Associates", "Scion Asset Management") or by SEC CIK number, and it returns that manager's latest quarterly 13F filing broken out position by position: name of issuer, CUSIP, market value in USD, shares held, portfolio weight and rank, the change versus the prior quarter, plus filing metadata like the report period, filing date, and accession number.
That field set is exactly what a holdings analysis needs: the what, the how-much, and the what-changed, all traceable to a specific filing. 13F is a useful dataset to start with because every institutional manager over the reporting threshold must file it, it is public, and it has no login wall.
Step 1: Get your Apify API token
Sign in to the Apify Console, open Settings → Integrations, and copy your personal API token. The MCP server uses it to authenticate and to bill Actor runs to your account.
📌 Note: the token is a secret. Keep it in the client config only, never in a prompt or a committed file.
Step 2: Point Claude Desktop at the Apify MCP server
Open Claude Desktop's config file (Settings → Developer → Edit Config, or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS) and add the Apify server. The tools query parameter is the important part: it tells the server which Actor to expose, so Claude gets one focused tool instead of the entire Store.
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=scrapers_lat/sec-13f-holdings-scraper",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
Cursor uses the same JSON in .cursor/mcp.json. If you prefer to run it locally over stdio instead of the hosted endpoint:
{
"mcpServers": {
"apify": {
"command": "npx",
"args": ["-y", "@apify/actors-mcp-server", "--tools", "scrapers_lat/sec-13f-holdings-scraper"],
"env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
}
}
}
Restart Claude Desktop so it picks up the new server.
Step 3: Confirm the tool is loaded
After the restart, the Actor shows up as a callable tool. If you list the tools the Apify server exposes, you will see the storage helpers plus the Actor itself, named after its Store handle:
get-actor-run, get-dataset-items, get-key-value-store-record,
abort-actor-run, scrapers_lat--sec-13f-holdings-scraper
That last entry, scrapers_lat--sec-13f-holdings-scraper, is our holdings tool. Claude now knows it exists, what it does (from the Actor's README), and what inputs it takes (from the input schema the server passes along).
Step 4: Ask Claude about a fund's positions
Now the payoff. In a normal chat, ask a question that requires the current filing:
"What are Berkshire Hathaway's largest stock holdings right now? Give me the top positions from their latest 13F with dollar value and portfolio weight."
Claude recognizes it cannot answer this reliably from memory, selects the 13F tool, and fills in the input from your question. Under the hood the client sends a tools/call with the Actor's parameters:
{
"name": "scrapers_lat--sec-13f-holdings-scraper",
"arguments": {
"manager": "Berkshire Hathaway",
"maxHoldings": 30
}
}
The Apify MCP server starts the Actor, waits for it to finish, and returns the dataset. Here is the real run metadata it produced:
{
"runId": "hmROrTClgzgQmphDX",
"actorName": "scrapers_lat/sec-13f-holdings-scraper",
"status": "SUCCEEDED",
"startedAt": "2026-07-30T17:43:41.963Z",
"finishedAt": "2026-07-30T17:43:54.414Z",
"stats": { "runTimeSecs": 12.4 }
}
Twelve seconds, straight from the source filing.
Step 5: Read the real output
The dataset the tool returns is one structured row per position. This is an actual record from the run, the fund's single largest holding (trimmed to the fields that matter for a holdings read):
{
"managerName": "BERKSHIRE HATHAWAY INC",
"managerCik": "1067983",
"form": "13F-HR",
"filingDate": "2026-05-15",
"reportPeriod": "2026-03-31",
"accessionNumber": "0001193125-26-226661",
"nameOfIssuer": "APPLE INC",
"cusip": "037833100",
"positionValueUsd": 57843260493,
"portfolioPercent": 21.99,
"portfolioRank": 1,
"portfolioValueUsd": 263095703570,
"holdingsInFiling": 90,
"changeType": "UNCHANGED",
"investmentDiscretion": "DFND"
}
Claude reads that and answers in plain language: Berkshire's biggest position is Apple, worth about $57.8B, which is 21.99% of a reported $263.1B equity book spread over 90 holdings, and the stake was unchanged last quarter. Below it sit American Express at 17.43% and Bank of America at 9.52% (reduced), with a brand-new Alphabet position appearing this quarter. Every one of those facts is traceable to accession number 0001193125-26-226661, not the model's memory.
The changeType field is what makes this more than a snapshot. Because each row carries whether the position was NEW, UNCHANGED, REDUCED, or increased versus the prior period, an agent can immediately separate conviction from drift, and it surfaces the new Alphabet buy that a from-memory answer would never mention.
A real use case: a 13F monitoring agent
Put this in context. An analyst covering a basket of funds wants to know, after each 13F season, what changed: who initiated positions, who exited, and where the crowd is concentrating. Doing that by hand means opening each manager's filing, reading tables of CUSIPs, and reconciling them against last quarter, once per fund.
With the tool wired into Claude, the analyst pastes a watchlist of managers into the chat and asks the agent to pull each one's latest 13F and flag the notable moves. Claude calls the Actor per manager, reads the changeType, portfolioPercent, and portfolioRank on every row, and produces a short brief: new positions worth more than 1% of the book, any holding cut by half, and the top-five concentration for each fund, with the accession number attached as evidence. The mechanical table-reading disappears; the judgment about what the moves mean stays with the analyst.
This is the shape of every good agent tool: it removes the fetch, not the decision.
Going further: chain a second tool
Institutional holdings are one signal. Insider activity is another, and the two read well together. The same MCP connection can expose more Actors by extending the tools parameter:
https://mcp.apify.com?tools=scrapers_lat/sec-13f-holdings-scraper,scrapers_lat/sec-form4-insider-trades-scraper
Now the agent can pull a fund's 13F positions and check recent Form 4 insider buys and sells at the same companies in one conversation, then combine both into a single read: the fund is adding, and the CEO is buying too, or the fund is holding while insiders quietly sell. Because each Actor is a separate tool, the agent picks the right one for each step on its own.
🏹 Troubleshooting: if the tool does not appear in Claude, the two usual causes are a missing or misspelled Actor handle in the tools parameter (it must be the exact username/actor-name from the Store URL) and a config that was edited while Claude was running. Fix the handle, save, and fully restart the client.
📌 Note: each tool call is a real Actor run billed to your Apify account (this Actor is pay-per-result). For one-off research the cost is a fraction of a cent; if you plan to sweep hundreds of managers every filing season, run the Actor directly through the Apify API or a scheduled task instead of one call per chat message.
Wrapping up
You now have an AI agent that can read any large manager's actual institutional holdings, on demand, mid-conversation, with the dollar value, portfolio weight, and quarter-over-quarter change a real holdings analysis needs. The pattern is reusable: pick an Actor that returns authoritative structured data, expose it through the Apify MCP server with the tools parameter, and let the agent decide when to call it.
To take it further:
- Swap in a different filing or dataset by changing the Actor handle. The setup is identical.
- Add insider-trading, filings, or ownership Actors to build a multi-signal research agent.
- Read the Apify MCP server docs for OAuth setup, resource reads, and the
search-actors/call-actortools that let an agent discover Actors it was not preconfigured with.
The Actor used in this guide: SEC 13F Institutional Holdings Scraper.


Top comments (0)