Originally published on medium.com

âI asked ChatGPT to pick my next 10-baggerâ is a genre now. Youâve seen the screenshots: a chat window, a confident list of tickers, zero explanation of where the numbers came from.
Most of the time there are no numbers. The model is just pattern-matching on stock names it remembers from training data, dressed up as analysis.
I wanted to see what happens when you remove that shortcut. So I connected Claude directly to a live market data provider through MCP and asked it to screen the S&P 500 universe using real fundamentals and price momentum, not memory.
This is what it picked, and more importantly, how it picked it.
Ask any general-purpose chatbot to rank stocks and it will answer. Thatâs the problem.
It doesnât say âI donât have live data.â It doesnât say âmy training data ends months ago.â It just produces a plausible-sounding list, usually the same five or six mega-caps everyone already knows.
There are three reasons this breaks down:
A ranking with no data behind it isnât a ranking. Itâs a guess wearing a suit.
Hereâs the reframe: Claude ranking stocks badly isnât a reasoning problem. Itâs an access problem.
Give the same model a live fundamentals feed and a screener, and the reasoning step barely changes. What changes is what itâs reasoning over.
An LLM is only as good an analyst as the data pipe you hand it.
MCP (Model Context Protocol) lets Claude call external tools directly during a conversation, the same way it would call a calculator or a code interpreter. Instead of guessing what Appleâs market cap is, it queries an API and gets the actual number back.
For this experiment, I connected Claude to EODHD through their MCP server. That gives Claude direct access to:
No scraping, no stale CSV, no âas of my last update.â Just live numbers Claude can query mid-conversation.
Rank real stocks with real data, not model memory EODHD gives you a fundamentals and screener API built for exactly this kind of workflow. â Get started with EODHD
This part takes about two minutes and you never leave the Claude settings screen.
stock_screener, get_bulk_fundamentals, and get_fundamentals_data to Allow. Those three are what Claude actually needs for a ranking task, and you don't want a confirmation popup on every single screen.Thatâs the whole setup. From there you just talk to Claude normally.

I gave Claude one instruction: screen large-cap, US-listed stocks by 5-day price momentum, filter for market caps above $50B, and explain the top picks using their fundamentals.
Claude called stock_screener directly, no code from me. Here's the equivalent REST call if you want to reproduce it outside the chat:
import requests
API_TOKEN = "YOUR_EODHD_API_TOKEN"
response = requests.get(
"https://eodhd.com/api/screener",
params={
"api_token": API_TOKEN,
"filters": '[["exchange","=","US"],["market_capitalization",">",50000000000]]',
"sort": "refund_5d_p.desc",
"limit": 10,
"fmt": "json",
},
)
for stock in response.json()["data"]:
print(stock["code"], stock["name"], stock["refund_5d_p"], "%")
refund_5d_p is the 5-day percentage return. Sorting by it surfaces momentum instead of just size, which is what turns a static list of mega-caps into an actual ranking.
Pulled live, September 2026, large-cap US stocks (market cap above $50B) ranked by 5-day return:

A quick honesty check before going further: this screen pulls from the broader US large-cap universe, not a literal âS&P 500 constituents onlyâ filter, since that index membership list isnât something the screener exposes directly. A couple of names that show up in the raw feed (MicroStrategy, some ADRs) arenât current S&P 500 members and I filtered those out of the final five. Worth knowing if you rerun this yourself.
Hereâs Claudeâs reasoning for the top three, based on the fundamentals it pulled, not on vibes:
Dell Technologies. Momentum here tracks server demand tied to AI infrastructure buildouts. Claude flagged the EPS of $17.19 against a market cap of $339B as reasonable relative to the sectorâs other hardware names, not stretched.
Sandisk. The move coincides with a memory and storage pricing cycle. Claude noted the earnings-per-share figure of $73.78 stood out sharply against peers in the same screen, worth double-checking against the next earnings print rather than taking at face value.
Bloom Energy. The reframe Claude offered was that this isnât a âclean energy story,â itâs a data center power story. Fuel cells for on-site power generation are getting bid up alongside AI infrastructure spend, not environmental sentiment.
Notice whatâs missing: no mention of âstrong brandâ or âinnovative culture.â Every claim ties back to a number that came from the screener.
I hit three walls running this, and all three were data problems, not Claude problems.
Cross-exchange duplicates. My first pass filtered by sector only, no exchange. The result was a mess: NVIDIA showed up as a separate row for the US listing, the Toronto CDR, the Frankfurt listing, a Brazilian BDR, and an Israeli line, each with a different market cap because each was priced in a different currency and share ratio. If you donât pin exchange = "US" explicitly, half your "top 10" ends up being the same three companies wearing different tickers.
Momentum isnât quality. A stock up 18% in five days can mean genuine re-rating, or it can mean it just reported earnings and got squeezed. The screener will hand you both with equal confidence. Pair momentum filters with something that anchors reality, EPS, dividend history, sector, before you let a ranking stand on its own.
Index membership isnât in the feed. As I mentioned above, âS&P 500 constituentâ isnât a screener field. Market cap and exchange get you close, but you still have to eyeball the output for names that technically qualify by size and sector but arenât in the index (MicroStrategy is the obvious one here, treated by some data feeds as tech-adjacent by market cap alone).
get_fundamentals_data before including it. If the earnings-per-share number looks disconnected from the sector average, that's worth a second look, not an automatic red flag, just a flag.None of this is a knock on EODHD specifically. Itâs true of any market data API: the raw feed is only as useful as the filters you apply to it. Garbage filters in, garbage ranking out, no matter how good the model summarizing it sounds.
Do I need to write code to use the EODHD MCP connector? No. Connecting through Claudeâs Settings â Connectors panel is entirely point-and-click. The Python example in this article is only for people who want to reproduce the query outside of Claude.
Is this list financial advice? No. Itâs a momentum and fundamentals screen run at a specific point in time. Stock rankings built this way change from day to day and should be treated as a research starting point, not a recommendation to buy anything.
Does EODHD have a free tier for the screener? Yes, EODHD offers a free API tier for testing, with paid plans unlocking higher screener limits and bulk fundamentals across full exchanges.
Which data points matter most for a ranking like this? Market cap and momentum (5-day or 20-day return) narrow the universe fast. From there, EPS, dividend yield, and sector context turn a raw list into something you can actually reason about, which is exactly what the screener and fundamentals endpoints are built to surface together.
The five stocks above are a snapshot, not a forecast. Swap the filters (sector, P/E ceiling, dividend yield floor) and youâll get a completely different top five, generated the same reproducible way.
Build your own screener-backed ranking Get an EODHD API token and connect it to Claude via MCP in under two minutes. â Start with EODHD
If youâre a fintech or API company looking to explain a technical product through content like this, not marketing fluff, feel free to connect with me: kevinmeneses.com
Looking for technical content for your company? I can help â LinkedIn · kevinmenesesgonzalez@gmail.com