A market data MCP server gives an AI assistant a way to look up prices, filings, and on-chain activity without you writing a single tool definition by hand. The plumbing is the real problem it removes. An assistant that answers market questions normally needs an equities feed from one vendor, forex from another, crypto from a third, and SEC filings from a fourth. Each source means another API key to manage, another auth scheme, and another response shape to describe to the model. SiftingIO's MCP server, published on npm as siftingio-mcp, covers six asset classes through one connector and one sft_ API key.
This post walks through what that one connector covers per asset class, how to wire it into an MCP client, and the failure modes worth knowing before an assistant starts calling tools on its own.
What a market data MCP server covers#
Version 1.0.2 of the package exposes 36 tools. They map onto the same six asset classes as the underlying API:
- US equities: latest quotes and historical OHLCV bars for tickers like AAPL or NVDA, plus the fundamentals stack behind them: SEC filings (10-K, 10-Q, 8-K), XBRL financials, standard ratios, Form 4 insider transactions, and 13F institutional holdings.
- Forex: quotes and historical bars for major, minor, and exotic pairs such as EURUSD and USDJPY. FX bars report zero volume by convention and use UTC timestamps.
- Crypto: prices for pairs like BTCUSD, ETHUSD, and SOLUSD, aggregated across multiple independent venues rather than passed through from a single source.
- Commodities: spot pricing and bars for metals, energy, and agriculture, from XAUUSD to WTIUSD to CORNUSD.
- DEX and DeFi: on-chain swap activity and pool TVL across Ethereum, Base, Arbitrum, BSC, and Polygon, addressed as chain-prefixed pairs like
eth:WETH-USDC. - Fundamentals and context: the economic calendar, market hours and holiday calendars for the major markets, and wallet portfolio lookups on EVM chains.
The practical effect shows up in mixed questions. When a user asks an assistant "how did gold move the week of the last CPI print, and what did EURUSD do", the assistant can resolve the CPI date from the economic calendar tool, pull XAUUSD and EURUSD bars, and answer, all against one credential. No tool definition on your side describes any of those endpoints. The MCP server ships the schemas; the model reads them and picks.
Wiring it into an MCP client#
The server runs locally over stdio and needs one environment variable. For Claude Code:
claude mcp add siftingio -e SIFTING_API_KEY=sft_your_key -- npx -y siftingio-mcp
For any other MCP client, the config block is the standard shape:
{
"mcpServers": {
"siftingio": {
"command": "npx",
"args": ["-y", "siftingio-mcp"],
"env": { "SIFTING_API_KEY": "sft_your_key" }
}
}
}
That's the whole integration. The key comes from the SiftingIO dashboard; the free tier issues one without a credit card. The full tool list and per-class coverage are documented on the integration page.
One design detail matters once you move past a demo: the tools return the same data shapes as the REST API. A bars tool result looks like the response of the bars endpoint, cursor pagination included. So when an assistant's answer looks wrong, you can reproduce the exact call outside the assistant:
curl -H "X-API-Key: $SIFTING_KEY" \
"https://api.sifting.io/v1/last/quote/forex/EURUSD"
curl --compressed -H "X-API-Key: $SIFTING_KEY" \
"https://api.sifting.io/v1/hist/crypto/BTCUSD/bars?interval=1h"
The --compressed flag matters on the second call: historical bar endpoints require gzip and return a 406 gzip_required error without it. If the curl output and the tool result agree, the data is fine and the problem is in the prompt. If they disagree, the bug report writes itself. The same property helps later, when a prototype graduates into production code: the REST calls, and the Go, Python, and JavaScript SDKs built on them, use the identical shapes the assistant was already consuming.
Why a consensus price matters for an assistant#
An assistant repeating a price is making a factual claim on your behalf, and prices are messier than they look. Crypto venues disagree with each other. On-chain pools can be thin. A single-source feed can go stale and keep reporting the old number while the market moves. SiftingIO publishes one fair price per instrument, formed as a volume-and-reputation-weighted median across multiple independent venues, with staleness checks and outlier filtering ahead of the aggregation. Every price carries a quality flag, so degraded data is labeled instead of silent.
Two honest bounds apply. The output is a reference price, not an executable quote, so an assistant built on it should present prices as market context, never as a fill anyone could get. And the aggregation defends against a minority of bad feeds; no median survives most venues being wrong the same way. For the job an assistant actually does, answering "what is BTCUSD right now" with a number that holds up, a filtered consensus is the right input.
Common pitfalls#
A 403 on one market while others work is an entitlement gap, not a broken key. SiftingIO pricing is per market, so a key on a crypto-only plan returns 403 for the stocks tools. A bad key would return 401 everywhere. If the assistant reports it "can't access stock data" while crypto answers flow, check which markets the plan includes before rotating credentials.
DEX symbols use a different format from everything else. Spot instruments are plain uppercase with no separator (BTCUSD, XAUUSD, EURUSD), but DEX pairs are chain-prefixed with a hyphen: eth:WETH-USDC, base:WETH-USDC. The tool schemas spell this out and models generally follow them, but hand-written test calls that guess WETHUSDC come back as a 404 unknown_ticker.
Agent loops burn rate limits fast. An assistant asked to check all ten symbols on a watchlist makes ten tool calls in a few seconds, and the free tier allows 60 requests per minute. Past the limit, calls return 429 with a Retry-After header, and every response carries X-RateLimit-Remaining so you can watch headroom shrink before it hits zero. For a personal assistant the free quota is workable; a shared or scheduled one usually needs a paid tier.
Where this fits#
An MCP connector doesn't change what the API can do. It changes who can call it: the model, directly, with no integration layer per data source. Coverage across six asset classes under one key is what makes that useful in practice, since a real market question rarely stays inside one asset class.



