Is there an MCP server for fund and ETF data?
Yes: https://fundfactsapi.com/api/mcp is a remote Model Context Protocol server with get_fund, search_funds, compare_funds, analyze_portfolio, fund_overlap and get_scpi tools, authenticated with a bearer API key. Configuration for every client.Updated 12 September 2026 · by FundFacts APIShort answer
Yes. FundFacts API runs a remote MCP server over Streamable HTTP at https://fundfactsapi.com/api/mcp. It authenticates with the same bearer API key as the REST API and exposes get_fund (ISIN → full factsheet JSON), search_funds (name → ISINs, free), compare_funds, analyze_portfolio, fund_overlap and get_scpi. Claude, ChatGPT, Cursor, Claude Code, Codex, VS Code and any MCP-capable framework can use it with a URL and one header.
The server
| URL | https://fundfactsapi.com/api/mcp |
| Transport | Streamable HTTP (stdio clients: npx -y mcp-remote https://fundfactsapi.com/api/mcp --header "Authorization: Bearer ffk_...") |
| Auth | Authorization: Bearer ffk_... (free key at /signup) |
| Cost | One request per ISIN answered, as for REST; search is free |
The MCP server exposes six tools, each counted like the REST endpoint it wraps: get_fund (ISIN → the full factsheet payload), search_funds (name → ISINs, free), compare_funds (side-by-side table for several ISINs), analyze_portfolio (weighted look-through of a list of positions, Pro and above), fund_overlap (shared holdings between funds, Pro and above) and get_scpi (French SCPI data by name or ISIN). Authentication is the same bearer API key as the REST API, sent as an Authorization header.
Universal configuration
Most clients accept this JSON (Claude Desktop, Cursor, Windsurf, Cline and others):
json{"mcpServers": {"fundfacts": {"url": "https://fundfactsapi.com/api/mcp","headers": { "Authorization": "Bearer ffk_..." }}}}
Client-specific steps: ChatGPT, Claude, Claude Code, Cursor, Codex, VS Code / Copilot, LangChain, OpenAI Agents SDK, Vercel AI SDK, n8n.
What a tool call returns
get_fund returns the same envelope as GET /funds/{isin}: name, cached, expiresAt and a data object with key facts, fees, the 1–7 risk indicator, a rule-based profile, holdings, sector, country and asset breakdowns, calendar and annualised returns, a monthly series, risk statistics, SFDR article, PRIIPs costs and dataAsOf. compare_funds flattens several payloads into one table so the model can answer "which is cheaper / more concentrated / more US-heavy" without arithmetic on its side.
Why an MCP server rather than scraping in the agent
Agents that browse fund-house sites hit cookie walls, PDFs and per-issuer layouts, and they burn tokens on parsing. The MCP server returns one normalised JSON shape for every fund house, with a date, and the companion kit gives coding agents the same reference for writing code against it.
Paid plans include an AI companion kit generated from the live field reference: an AGENTS.md with every endpoint, field, rule and a reference client; a Cursor rule; a Claude Code skill; the OpenAPI spec and TypeScript types, with your key baked in or read from an environment variable. Download it from the dashboard; the public edition without a key is at /llms-full.txt.
Verify it yourself
The demo endpoint returns the live payload for a fund that is already in the store, without a key. Everything on this page can be checked against it.bashcurl -s https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 | jq '{name, asOf: .data.dataAsOf, ter: .data.headlineMetrics.ter, risk: .data.riskRating, top: .data.topHoldings[:3]}'