Server data from the Official MCP Registry
Reads your macOS Apple Stocks watchlist, quotes and fundamentals locally. Read-only, no network.
Reads your macOS Apple Stocks watchlist, quotes and fundamentals locally. Read-only, no network.
Valid MCP server (2 strong, 3 medium validity signals). 3 known CVEs in dependencies (0 critical, 3 high severity) Package registry verified. Imported from the Official MCP Registry.
4 files analyzed Β· 4 issues found
Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.
This plugin requests these system permissions. Most are normal for its category.
Add this to your MCP configuration file:
{
"mcpServers": {
"io-github-helderpgoncalves-apple-stocks-mcp": {
"args": [
"-y",
"apple-stocks-mcp"
],
"command": "npx"
}
}
}From the project's GitHub README.
A macOS-only Model Context Protocol (MCP) server that lets an AI assistant read your own data from the Stocks app that ships with macOS β your watchlist, and the quotes, fundamentals and intraday charts the app has already cached on your Mac.
100% local and read-only. It reads files that already exist on your own machine, in the Stocks app's container under your home folder. It makes no network requests, uses no external API, needs no API keys, and sends nothing anywhere. The data is whatever the Stocks app last synced β open the app to refresh it.

β οΈ macOS only. The data lives inside the macOS Stocks app's container, so this server does not work on Linux or Windows. On a non-macOS host the server still starts, but exposes a single
platform_infotool that politely explains it's macOS-only and how to remove it β no failing tools, no crashes.
On a Mac, open the Stocks app once (so its data exists), then:
Claude Desktop / any MCP client β add this and restart:
{ "mcpServers": { "apple-stocks": { "command": "npx", "args": ["-y", "apple-stocks-mcp"] } } }
Claude Code:
claude mcp add apple-stocks -- npx -y apple-stocks-mcp
Then ask: "What's the Apple stock doing today?" The first time, your client
asks permission to use the tool β choose Yes (or "Yes, and don't ask again").
That's it. If anything's off, ask it to run stocks_doctor β it tells you
exactly what to fix.
Once connected (see Setup), ask your assistant things like:
This is the most important section, so it's first.
-readonly flag and only
parses the watchlist file. The single write-style action, add_stock, does
not touch any file β it just asks macOS to open a symbol in the Stocks app
so you can add it with a tap.fetch/http/https client call anywhere in src/.~/Library/Group Containers/group.com.apple.stocks/). It does not
access other users' data, remote accounts, or anything outside that container.stderr
(which platform it started on) β that goes to your MCP client's local logs and
is never sent anywhere.All paths are inside your own user container
~/Library/Group Containers/group.com.apple.stocks/:
| Data | File (read-only) |
|---|---|
| Watchlist symbols | Library/Documents/PrivateData/com.apple.stocks.private-production-dbstore.json |
| Quotes, market cap | Library/Caches/shared-database (SQLite, quotes table) |
| Fundamentals (P/E, EPS, rangesβ¦) | same SQLite cache (quote_details table) |
| Company names / exchanges | same SQLite cache (stock_metadata table) |
| Intraday chart (OHLCV) | Library/Caches/sparkline-database (SQLite, sparklines table) |
This is the same "read the app's own local store" approach used by other macOS
MCP servers such as apple-notes-mcp.
It is reading your data from your Mac β analogous to exporting your own
information β and it does not bypass any DRM, access any account, or contact any
Apple service.
| Tool | What it does |
|---|---|
list_watchlist | List every ticker in your Stocks watchlist (in order). |
get_quote | Price + daily change for one or more symbols, from the local cache. |
quote_watchlist | Cached quotes for every symbol in the watchlist. |
stock_details | Fundamentals: day & 52-week range, market cap, volume, P/E, EPS, beta, dividend yield, next earnings. |
stock_chart | Cached intraday OHLCV chart (ASCII sparkline) + change vs previous close. |
apple_stock | Apple (AAPL) fundamentals + whether it's in the watchlist. |
portfolio_summary | Whole-watchlist analysis: up/down counts, top gainers/losers, breakdown by currency & exchange. |
top_movers | The biggest gainers and losers in the watchlist today. |
search_watchlist | Search the watchlist by symbol or company name. |
stocks_doctor | Diagnose your setup (macOS? data present? readable? Full Disk Access?). |
add_stock | Opens a symbol in the Stocks app so you can add it with one tap (no file is written). |
platform_info | Report whether the server can run here (always available; the only tool on non-macOS). |
| Resource URI | Contents |
|---|---|
stocks://watchlist | The watchlist symbols, one per line (text/plain). |
stocks://quotes | Cached quotes for every watchlist symbol (application/json). |
| Prompt | What it does |
|---|---|
analyze_portfolio | Reviews the whole watchlist and highlights what's notable today. |
research_stock | Pulls fundamentals + intraday chart for one symbol and summarizes it. |
add_stock opens the app instead of writing the databaseThe watchlist lives in an encrypted, iCloud-synced store. Editing it by hand
risks corrupting your watchlist and breaking sync, so add_stock deliberately
does not write anything β it uses the stocks:// URL scheme to open the
symbol in the Stocks app, where you add it with one tap and the app keeps its
own data consistent.
These are the actual text results the tools return (symbols shown are generic examples). Numbers come straight from your Stocks app's local cache.
apple_stock / stock_details AAPL β fundamentals at a glance:
AAPL (Apple Inc.): 299.18 USD +3.23 (+1.09%) [open]
Open: 298.44 Day range: 298.07 β 299.75
52-week range: 196.86 β 317.4
Market cap: 4.39T Volume: 11.12M (avg 47.14M)
P/E: 36.27 EPS: 8.26 Beta: 1.09 Div yield: 0.36%
Next earnings: 2026-07-30
AAPL is in the watchlist.
stock_chart NVDA β intraday OHLCV as an ASCII sparkline:
NVDA intraday (7 points)
βββββββ
prev close: 204.65 last: 208.69 day range: 207.36 β 208.69
change vs prev close: +4.04 (+1.97%)
portfolio_summary β whole-watchlist analysis:
Watchlist summary β 98/99 quoted (1 without a cached quote)
Up: 57 Down: 41 Flat: 0
Top gainers:
NVDA: +1.97%
AMD: +4.13%
MSFT: +0.31%
Top losers:
INTC: -2.10%
...
By currency:
USD: 82
EUR: 16
By exchange:
NASDAQ: 38
NYSE: 35
XETRA: 9
...
get_quote ["AAPL","MSFT","BTC-USD","EGL.LS"] β one line per symbol, across
US / crypto / European tickers:
AAPL (Apple Inc.): 299.18 USD +3.23 (+1.09%) [open]
MSFT (Microsoft Corporation): 378.83 USD -0.08 (-0.02%) [open]
BTC-USD (Bitcoin USD): 64291.09 USD -928.50 (-1.42%) [open]
EGL.LS (Mota-Engil, SGPS, S.A.): 4.67 EUR -0.04 (-0.81%) [open]
| Tool | Key fields in the result |
|---|---|
get_quote / quote_watchlist | symbol, name, price, currency, daily change & %, market state |
stock_details | the above plus open, day range, 52-week range, market cap, volume & average volume, P/E, EPS, beta, dividend yield, next earnings date |
stock_chart | per-point open/high/low/close/volume, previous close, day range, change vs previous close, ASCII sparkline |
portfolio_summary | quoted vs total, up/down/flat counts, top gainers/losers, breakdown by currency and exchange |
top_movers | ranked gainers and losers (symbol, price, change %) |
sqlite3 at /usr/bin/sqlite3 (ships with macOS).stocks_doctor tool, then grant
Full Disk Access in System Settings β Privacy & Security β Full Disk Access.Add this to your MCP client config (e.g. Claude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"apple-stocks": {
"command": "npx",
"args": ["-y", "apple-stocks-mcp"]
}
}
}
git clone https://github.com/helderpgoncalves/apple-stocks-mcp.git
cd apple-stocks-mcp
npm install # also builds via the `prepare` hook
{
"mcpServers": {
"apple-stocks": {
"command": "node",
"args": ["/absolute/path/to/apple-stocks-mcp/dist/index.js"]
}
}
}
Add it as an MCP server:
claude mcp add apple-stocks -- npx -y apple-stocks-mcp
β¦or install it as a plugin (this repo is also a Claude Code plugin marketplace), which wires up the MCP server for you:
/plugin marketplace add helderpgoncalves/apple-stocks-mcp
/plugin install apple-stocks-mcp@apple-stocks
Restart the client after editing the config.
This repo is also an OpenAI Codex plugin. Add the marketplace and install:
codex plugin marketplace add helderpgoncalves/apple-stocks-mcp
codex plugin install apple-stocks-mcp
Or add it as a plain MCP server in your Codex config (command: npx,
args: ["-y", "apple-stocks-mcp"]).
The server speaks JSON-RPC over stdio:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"apple_stock","arguments":{}}}' \
| npx -y apple-stocks-mcp
Example output: AAPL (Apple Inc.): 299.18 USD +3.23 (+1.09%) [open]
If anything looks off, run the built-in diagnostics tool β ask your assistant to
run stocks_doctor, or:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"stocks_doctor","arguments":{}}}' \
| npx -y apple-stocks-mcp
The tools' error messages are self-explanatory and tell you exactly what to do,
so you rarely need this section. When in doubt, ask your assistant to run
stocks_doctor β it checks everything and prints the fix.
Yes β that's Claude's standard safety prompt the first time any MCP tool runs. Choose Yes (or "Yes, and don't ask again" to skip it next time). It's not an error and nothing is sent anywhere.
The message tells you which case it is. The two causes:
Run stocks_doctor to re-check.
The very first run downloads the package via npx, which can take a moment. Just
try again, or raise the startup timeout: start your client with
MCP_TIMEOUT=60000 (milliseconds).
This server reads the Stocks app's local cache β the last data the app synced. It intentionally makes no network calls. To refresh, open the Stocks app (or its widget); the cache updates and the next tool call reflects it.
The app hadn't cached a quote for that exact symbol when you asked (some tickers, e.g. certain regional listings, aren't always cached). Open the Stocks app and view the symbol once, then retry. The watchlist still lists it; only its quote was missing.
add_stock opens the symbol in the Stocks app so you add it with one tap. It
deliberately does not write to the app's encrypted, iCloud-synced store β
that would risk corrupting your watchlist and sync. This is a safety decision.
No. The data lives in the macOS Stocks app's container, so the server is macOS-only. (The pure parsing logic is unit-tested on Linux CI using synthetic fixtures, but the real data only exists on macOS.)
No. There are zero network calls in the source β only local sqlite3
(read-only) and open. Everything read is returned solely to the MCP client you
connected. See Privacy.
npm run build # compile to dist/
npm run typecheck # type-check only
npm test # build + run the test suite
Tests run against synthetic fixtures in test/fixtures/ (a generated
dbstore.json and two small SQLite databases) β they never touch your real
Stocks data. STOCKS_TEST_MODE=1 bypasses the macOS gate so the pure
parsing/formatting logic can be tested on any OS, which is what CI does
(GitHub Actions, Linux, Node 18/20/22).
Data paths can be overridden via env vars (used by the tests):
STOCKS_DBSTORE_PATH, STOCKS_SHARED_DB_PATH, STOCKS_SPARKLINE_DB_PATH,
STOCKS_SQLITE_BIN.
src/
index.ts # MCP server: tools, resources, prompts
appleStocks.ts # reads your Stocks app data (read-only): watchlist + quotes/details/chart
bplist-parser.d.ts
test/
appleStocks.test.ts
fixtures/ # synthetic data β no personal holdings
docs/
demo.tape # VHS script that generates demo.gif
run-tool.sh # helper used by the demo
server.json # MCP Registry metadata
.github/workflows/ci.yml
To regenerate the demo GIF (requires VHS):
vhs docs/demo.tape # writes docs/demo.gif
This is an independent, community project. It is not affiliated with, endorsed by, sponsored by, or supported by Apple Inc. "Apple", "Apple Stocks", "Stocks", "macOS", and related marks are trademarks of Apple Inc. They are used here only nominatively β to describe, factually and accurately, which app's local data this software reads. No claim of ownership or endorsement is made or implied.
This project ships no Apple code, assets, or trademarks, and does not bundle or redistribute any Apple data.
The server reads files that already exist on your own Mac, under your own user account, in read-only mode. It does not circumvent any technical protection measure or DRM, does not access any online account or third-party data, and does not transmit data off your machine. The cache file formats may change between macOS versions; if that happens, a tool may simply return "no data" rather than misbehave.
All figures are read from your Stocks app's local cache, may be delayed or inaccurate, and are provided as-is. Nothing here is investment, financial, legal, or tax advice. Do your own research; do not rely on this software for trading decisions. Market data ultimately originates from third-party providers via the Stocks app and is subject to their terms.
This software is provided "AS IS", without warranty of any kind, to the fullest extent permitted by law. See the MIT License. Use at your own risk.
MIT Β© HΓ©lder GonΓ§alves
Be the first to review this server!
by Modelcontextprotocol Β· Developer Tools
Web content fetching and conversion for efficient LLM usage
by Toleno Β· Developer Tools
Toleno Network MCP Server β Manage your Toleno mining account with Claude AI using natural language.
by mcp-marketplace Β· Developer Tools
Create, build, and publish Python MCP servers to PyPI β conversationally.