Financial Modeling Prep
HTTP-SSEFinancial data API access and analysis for AI assistants via Model Context Protocol
Financial data API access and analysis for AI assistants via Model Context Protocol
A Model Context Protocol (MCP) implementation for Financial Modeling Prep, enabling AI assistants to access and analyze financial data, stock information, company fundamentals, and market insights.
This MCP server uses a stateful session-based architecture powered by the Smithery SDK for request/session lifecycle. Resource reuse is handled via a client-level cache keyed by clientId (derived from the access token).
McpServer/DynamicToolsetManager is maintained per clientId. Tokenless requests use a per-request anonymous id (no reuse).sessionId./mcp endpointclientId)The server supports multiple configuration methods with a clear precedence hierarchy to ensure predictable behavior.
The server operates in one of three modes:
🔀 Dynamic Mode (DYNAMIC_TOOL_DISCOVERY=true)
enable_toolset, disable_toolset, get_toolset_status🔧 Static Mode (FMP_TOOL_SETS=search,company,quotes)
📚 Legacy Mode (default, no specific configuration)
The server follows a strict precedence hierarchy when determining the operational mode:
🥇 CLI Arguments (highest priority)
↓
🥈 Environment Variables
↓
🥉 Session Configuration (lowest priority)
When server-level configurations are set (CLI arguments or environment variables), they override all session-level configurations for ALL sessions. This ensures consistent behavior across the entire server instance.
Example Override Scenario:
# Server started with CLI argument npm run dev -- --dynamic-tool-discovery # ALL session requests will use Dynamic Mode, regardless of session config # Session config like {"FMP_TOOL_SETS": "search,company"} will be IGNORED
CLI Arguments (Server-level - overrides everything)
npm run dev -- --fmp-token=TOKEN --dynamic-tool-discovery npm run dev -- --fmp-token=TOKEN --fmp-tool-sets=search,company,quotes npm run dev -- --port=4000 --fmp-token=TOKEN
Environment Variables (Server-level - overrides session configs)
DYNAMIC_TOOL_DISCOVERY=true npm run dev FMP_TOOL_SETS=search,company,quotes npm run dev
Session Configuration (Session-level - via HTTP query parameter)
# Base64 encoded JSON config in query parameter curl -X POST "http://localhost:8080/mcp?config=eyJEWU5BTUlDX1RPT0xfRElTQ09WRVJZIjoidHJ1ZSJ9"
While MCP clients can filter tools automatically, large tool sets may impact performance. To optimize your experience, you can specify which tool categories to load instead of loading all 253 tools at once:
| Tool Set | Description | Example Tools |
|---|---|---|
search | Search & Directory | Search stocks, company lookup, symbol directories |
company | Company Profile & Info | Company profiles, executives, employee count |
quotes | Real-time Quotes | Live stock prices, market data, price changes |
statements | Financial Statements | Income statements, balance sheets, cash flow, ratios |
calendar | Financial Calendar | Earnings calendar, dividends, IPOs, stock splits |
charts | Price Charts & History | Historical prices, technical charts, market movements |
news | Financial News | Market news, press releases, financial articles |
analyst | Analyst Coverage | Price targets, ratings, analyst estimates |
market-performance | Market Performance | Sector performance, gainers, losers, most active |
insider-trades | Insider Trading | Corporate insider activity, ownership changes |
institutional | Institutional Holdings | 13F filings, fund holdings, institutional ownership |
indexes | Market Indexes | S&P 500, NASDAQ, Dow Jones, index constituents |
economics | Economic Data | Treasury rates, GDP, inflation, economic indicators |
crypto | Cryptocurrency | Crypto prices, market data, digital assets |
forex | Foreign Exchange | Currency pairs, exchange rates, forex data |
commodities | Commodities | Gold, oil, agricultural products, futures |
etf-funds | ETFs & Mutual Funds | Fund holdings, performance, fund information |
esg | ESG & Sustainability | Environmental, social, governance ratings |
technical-indicators | Technical Indicators | RSI, SMA, EMA, MACD, Bollinger Bands |
senate | Government Trading | Congressional and Senate trading disclosures |
sec-filings | SEC Filings | 10-K, 10-Q, 8-K filings, regulatory documents |
earnings | Earnings & Transcripts | Earnings reports, call transcripts |
dcf | DCF Valuation | Discounted cash flow models, valuations |
bulk | Bulk Data | Large-scale data downloads for analysis |
🚧 This feature is currently in BETA. API and behavior may change in future versions.
The Dynamic Toolset Management feature allows you to enable and disable tool categories at runtime instead of pre-configuring them at startup. This provides more flexibility and can help optimize performance by loading only the tools you need when you need them.
When dynamic toolset management is enabled, each session starts with only 3 meta-tools:
enable_toolset - Enable a specific toolset during runtimedisable_toolset - Disable a previously enabled toolsetget_toolset_status - Check which toolsets are currently activeAI assistants can then use these meta-tools to dynamically load and unload specific tool categories as needed for different tasks within their session.
Command Line Arguments:
# Enable dynamic toolset management for all sessions npm run dev -- --fmp-token=YOUR_TOKEN --dynamic-tool-discovery # Production deployment node dist/index.js --fmp-token=YOUR_TOKEN --dynamic-tool-discovery
Environment Variables:
# Set environment variable export DYNAMIC_TOOL_DISCOVERY=true export FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev # Or inline DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=YOUR_TOKEN npm start
Docker:
# docker-compose.yml version: "3.8" services: fmp-mcp: image: your-image-name ports: - "8080:8080" environment: - FMP_ACCESS_TOKEN=YOUR_FMP_ACCESS_TOKEN - DYNAMIC_TOOL_DISCOVERY=true # Enable for all sessions
When no server-level dynamic mode is set, individual sessions can request dynamic mode:
# Base64 encode: {"DYNAMIC_TOOL_DISCOVERY":"true"} CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize",...}'
Start server with dynamic mode:
DYNAMIC_TOOL_DISCOVERY=true npm start
AI assistant initializes session and gets meta-tools:
// Response includes only 3 meta-tools: { "tools": [ { "name": "enable_toolset", "description": "Enable a specific toolset" }, { "name": "disable_toolset", "description": "Disable a toolset" }, { "name": "get_toolset_status", "description": "Check active toolsets" } ] }
AI assistant enables needed toolsets:
// Enable search toolset {"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"enable_toolset","arguments":{"toolset":"search"}}} // Enable quotes toolset {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"enable_toolset","arguments":{"toolset":"quotes"}}}
AI assistant uses the enabled tools:
// Now can use search and quotes tools {"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"searchSymbol","arguments":{"query":"AAPL"}}} {"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"getQuote","arguments":{"symbol":"AAPL"}}}
AI assistant can disable unused toolsets:
{ "jsonrpc": "2.0", "id": 6, "method": "tools/call", "params": { "name": "disable_toolset", "arguments": { "toolset": "search" } } }
For production environments, you can use this MCP server through various registries that provide hosted and managed MCP servers:
The Financial Modeling Prep MCP Server is available through the official Model Context Protocol Registry, providing standardized installation and discovery for AI platforms.
NPM Installation:
npm install financial-modeling-prep-mcp-server npx fmp-mcp --fmp-token=YOUR_TOKEN
Docker Installation:
docker run -p 8080:8080 -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest
From Source:
git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server cd Financial-Modeling-Prep-MCP-Server npm install && npm run build npm start -- --fmp-token=YOUR_TOKEN
The server supports multiple installation methods through the MCP Registry:
| Method | Command | Best For |
|---|---|---|
| NPM | npm install financial-modeling-prep-mcp-server | Development and local testing |
| Docker | docker run ghcr.io/imbenrabi/financial-modeling-prep-mcp-server | Production deployments |
| Source | git clone && npm install | Customization and contributions |
1. Choose Your Installation Method:
# Option A: NPM (recommended for development) npm install financial-modeling-prep-mcp-server npx fmp-mcp --fmp-token=YOUR_TOKEN # Option B: Docker (recommended for production) docker run -p 8080:8080 -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest # Option C: From source (for customization) git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server cd Financial-Modeling-Prep-MCP-Server && npm install && npm run build npm start -- --fmp-token=YOUR_TOKEN
2. Get Your FMP API Token:
3. Test the Installation:
# Health check curl http://localhost:8080/health # List available tools curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
4. Connect to Your AI Platform:
http://localhost:8080/mcpThis server is compatible with AI platforms that support the Model Context Protocol:
For platform-specific integration instructions, refer to your AI platform's MCP documentation.
The Financial Modeling Prep MCP Server supports multiple installation methods to fit different deployment scenarios and development workflows.
Prerequisites:
Install globally:
npm install -g financial-modeling-prep-mcp-server fmp-mcp --fmp-token=YOUR_TOKEN
Install locally in project:
npm install financial-modeling-prep-mcp-server npx fmp-mcp --fmp-token=YOUR_TOKEN
With configuration options:
# Custom port and dynamic mode npx fmp-mcp --fmp-token=YOUR_TOKEN --port=4000 --dynamic-tool-discovery # Static toolset mode npx fmp-mcp --fmp-token=YOUR_TOKEN --fmp-tool-sets=search,company,quotes
Prerequisites:
Basic Docker run:
docker run -p 8080:8080 \ -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest
With custom configuration:
# Dynamic mode with custom port docker run -p 4000:4000 \ -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ -e PORT=4000 \ -e DYNAMIC_TOOL_DISCOVERY=true \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest # Static toolset mode docker run -p 8080:8080 \ -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ -e FMP_TOOL_SETS=search,company,quotes \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest
Docker Compose:
version: "3.8" services: fmp-mcp: image: ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest ports: - "8080:8080" environment: - FMP_ACCESS_TOKEN=YOUR_FMP_ACCESS_TOKEN - PORT=8080 # Optional: Choose server mode - DYNAMIC_TOOL_DISCOVERY=true # OR: - FMP_TOOL_SETS=search,company,quotes restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3
Prerequisites:
Clone and build:
# Clone repository git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server.git cd Financial-Modeling-Prep-MCP-Server # Install dependencies npm install # Build TypeScript npm run build # Start server npm start -- --fmp-token=YOUR_TOKEN
Development mode:
# Run with hot reload npm run dev -- --fmp-token=YOUR_TOKEN # Run tests npm test # Run with coverage npm run test:coverage # Verify installation methods npm run verify:installation # Type checking npm run typecheck
Custom build configuration:
# Build with specific target npx tsc --target ES2022 # Build and watch for changes npx tsc --watch # Clean build rm -rf dist && npm run build
All installation methods support the same environment variables:
| Variable | Description | Default | Example |
|---|---|---|---|
FMP_ACCESS_TOKEN | Financial Modeling Prep API token | Required | your_fmp_token_here |
PORT | Server port | 8080 | 4000 |
DYNAMIC_TOOL_DISCOVERY | Enable dynamic toolset mode | false | true |
FMP_TOOL_SETS | Static toolsets (comma-separated) | All tools | search,company,quotes |
NODE_ENV | Node.js environment | development | production |
After installation, verify the server is working:
Health check:
curl http://localhost:8080/health
MCP capabilities:
curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "clientInfo": {"name": "test", "version": "1.0.0"}, "capabilities": {} } }'
List available tools:
curl -X POST http://localhost:8080/mcp \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
Common issues and solutions:
Port already in use:
# Use different port PORT=4000 npm start -- --fmp-token=YOUR_TOKEN
Invalid API token:
# Verify token at https://financialmodelingprep.com/developer/docs curl "https://financialmodelingprep.com/api/v3/profile/AAPL?apikey=YOUR_TOKEN"
Memory issues with all tools:
# Use dynamic mode or specific toolsets npm start -- --fmp-token=YOUR_TOKEN --dynamic-tool-discovery
Docker permission issues:
# Run with user permissions docker run --user $(id -u):$(id -g) -p 8080:8080 \ -e FMP_ACCESS_TOKEN=YOUR_TOKEN \ ghcr.io/imbenrabi/financial-modeling-prep-mcp-server:latest
Smithery is a platform that helps developers find and ship AI-native services designed to communicate with AI agents. All services follow the Model Context Protocol (MCP) specification and provide:
When using Smithery, you can configure individual sessions by passing configuration in your MCP client. The Smithery platform handles the HTTP request formatting and session management.
Example configurations for Smithery:
// Dynamic mode session { "DYNAMIC_TOOL_DISCOVERY": "true" } // Static mode session { "FMP_TOOL_SETS": "search,company,quotes" } // Legacy mode (all tools) {}
For detailed integration instructions, follow the Smithery documentation for connecting MCP clients to hosted servers.
The server runs as an HTTP server that exposes a Model Context Protocol endpoint. Each request can include session-specific configuration via query parameters.
Local Development:
# Clone and setup git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server cd Financial-Modeling-Prep-MCP-Server npm install npm run build # Run in development FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev # Or with CLI arguments npm run dev -- --fmp-token=YOUR_TOKEN npm run dev -- --port=4000 --fmp-token=YOUR_TOKEN
🔐 Server-Level Dynamic Mode (All Sessions Use Dynamic Mode):
# CLI argument (highest priority) npm run dev -- --fmp-token=YOUR_TOKEN --dynamic-tool-discovery # Environment variable DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
🔧 Server-Level Static Mode (All Sessions Use Specified Toolsets):
# CLI argument (highest priority) npm run dev -- --fmp-token=YOUR_TOKEN --fmp-tool-sets=search,company,quotes # Environment variable FMP_TOOL_SETS=search,company,quotes FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
📚 Server-Level Legacy Mode (All Sessions Get All Tools):
# Default behavior - no specific configuration npm run dev -- --fmp-token=YOUR_TOKEN FMP_ACCESS_TOKEN=YOUR_TOKEN npm run dev
# Change server port via environment variable PORT=4000 npm run dev -- --fmp-token=YOUR_TOKEN # Change server port via CLI argument npm run dev -- --port=4000 --fmp-token=YOUR_TOKEN
The following system prompts are designed to help AI assistants effectively use this MCP server for financial analysis tasks. Choose the appropriate prompt based on your server configuration mode.
You are an expert financial analyst AI with access to comprehensive market data tools.
CORE RULES:
- Always use tools for current market data; never rely on outdated information or estimates
- Check conversation history to avoid redundant tool calls
- Provide concise, data-driven responses
- Always include: "This is not financial advice"
DYNAMIC TOOLSET MANAGEMENT:
Your tools are organized into categories ("toolsets") that must be enabled before use. You have a 4-toolset maximum at any time.
Available toolsets: search, company, quotes, statements, calendar, charts, news, analyst, market-performance, insider-trades, institutional, indexes, economics, crypto, forex, commodities, etf-funds, esg, technical-indicators, senate, sec-filings, earnings, dcf, bulk
EXECUTION WORKFLOW:
1. ENABLE: Use enable_toolset for required categories based on the user's query
2. VERIFY: Call get_toolset_status to confirm active toolsets. If >4 active, use disable_toolset to remove the least relevant
3. EXECUTE: Call specific tools from enabled toolsets
4. CLEAN UP: Consider disabling unused toolsets when switching to different analysis types
FAILURE PROTOCOL:
If tools fail repeatedly or data is unavailable, state: "I cannot find the requested information with the available tools" and stop attempting.
Begin each analysis by enabling the appropriate toolsets for the user's request.
You are an expert financial analyst AI with access to comprehensive market data tools.
CORE RULES:
- Always use tools for current market data; never rely on outdated information or estimates
- Check conversation history to avoid redundant tool calls
- Provide concise, data-driven responses
- Always include: "This is not financial advice"
STATIC TOOLSET CONFIGURATION:
Your tools are pre-loaded and immediately available. All configured toolsets remain active throughout the session.
EXECUTION WORKFLOW:
1. IDENTIFY: Determine which tools from your available toolsets best address the user's query
2. EXECUTE: Call the appropriate tools directly - no toolset management needed
3. ANALYZE: Process the data and provide insights based on the results
TOOL CATEGORIES:
Your available tools span multiple categories including company profiles, financial statements, market quotes, technical analysis, news sentiment, and economic indicators. Use the most relevant tools for each analysis.
FAILURE PROTOCOL:
If tools fail repeatedly or data is unavailable, state: "I cannot find the requested information with the available tools" and stop attempting.
Proceed directly to analysis using your available tools based on the user's request.
This server provides a human-friendly prompt to list capabilities in one shot.
list_mcp_assetsServer Capabilities, Prompts, Tools (mode-aware), Resources (health snapshot), Quick Start# 1) Initialize (example: dynamic mode session) CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "clientInfo": {"name": "client", "version": "1.0.0"}, "capabilities": {} } }' # 2) List prompts curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":2,"method":"prompts/list","params":{}}' # 3) Get the capabilities prompt curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":3,"method":"prompts/get","params":{"name":"list_mcp_assets","arguments":{}}}'
Notes:
Tools section adapts to the effective mode (Dynamic/Static/Legacy). In legacy mode, it summarizes categories instead of listing all 250+ tools.FMP_TOOL_SETS may request Static mode, but server-level configuration controls the final toolsets.Resources section includes a lightweight health snapshot (uptime, memory summary, version, mode).The server exposes a Model Context Protocol endpoint at /mcp that accepts JSON-RPC formatted requests. Each request can include optional session configuration via query parameters.
POST http://localhost:8080/mcp[?config=BASE64_ENCODED_CONFIG]
Content-Type: application/json Accept: application/json, text/event-stream
Session configurations are passed as Base64-encoded JSON in the config query parameter. This allows each session to have different tool configurations when no server-level mode enforcement is active.
# Configuration: {"DYNAMIC_TOOL_DISCOVERY":"true"} CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) # Result: eyJEWU5BTUlDX1RPT0xfRElTQ09WRVJZIjoidHJ1ZSJ9
# Configuration: {"FMP_TOOL_SETS":"search,company,quotes"} CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,company,quotes"}' | base64) # Result: eyJGTVBfVE9PTF9TRVRTIjoic2VhcmNoLGNvbXBhbnkscXVvdGVzIn0=
# Configuration: {} (empty object) CONFIG_BASE64=$(echo -n '{}' | base64) # Result: e30=
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": "2024-11-05", "clientInfo": { "name": "my-client", "version": "1.0.0" }, "capabilities": {} } }'
Expected Response:
{ "jsonrpc": "2.0", "id": 1, "result": { "protocolVersion": "2024-11-05", "capabilities": { "tools": { "listChanged": true } }, "serverInfo": { "name": "fmp-mcp-server", "version": "1.0.0" } } }
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {} }'
Expected Response (Dynamic Mode):
{ "jsonrpc": "2.0", "id": 2, "result": { "tools": [ { "name": "enable_toolset", "description": "Enable a specific toolset during runtime", "inputSchema": { "type": "object", "properties": { "toolset": { "type": "string", "description": "Name of the toolset to enable" } }, "required": ["toolset"] } }, { "name": "disable_toolset", "description": "Disable a previously enabled toolset" }, { "name": "get_toolset_status", "description": "Check which toolsets are currently active" } ] } }
CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": { "name": "enable_toolset", "arguments": { "toolset": "search" } } }'
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,quotes"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 4, "method": "tools/call", "params": { "name": "searchSymbol", "arguments": { "query": "Apple" } } }'
CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"quotes"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 5, "method": "tools/call", "params": { "name": "getQuote", "arguments": { "symbol": "AAPL" } } }'
config parameter creates a separate session (SDK-managed)clientId across requestsclientIdMcpServer/DynamicToolsetManager per clientIdclientId (derived from token), the server compares each request’s desired mode and static tool sets against the cached instance.McpServer instance is created and the cache entry is replaced.search,company equals company,search).Common error responses:
// Invalid configuration { "jsonrpc": "2.0", "error": { "code": -32000, "message": "Bad Request: Invalid configuration" }, "id": null } // Tool not available { "jsonrpc": "2.0", "error": { "code": -32601, "message": "Tool not found: toolName" }, "id": 1 } // Missing required parameters { "jsonrpc": "2.0", "error": { "code": -32602, "message": "Missing required parameter: symbol" }, "id": 2 }
⚠️ Important: Mode Enforcement Behavior
Server-Level Configurations Override Session Configurations:
- When CLI arguments (
--dynamic-tool-discovery,--fmp-tool-sets) are used, they apply to ALL sessions- When environment variables (
DYNAMIC_TOOL_DISCOVERY,FMP_TOOL_SETS) are set, they apply to ALL sessions- Session-level configurations via query parameters are IGNORED when server-level modes are active
- This ensures consistent behavior across all sessions on a server instance
Configuration Precedence: CLI Arguments > Environment Variables > Session Configuration
Example: If server started with
--dynamic-tool-discovery, ALL sessions will use dynamic mode even if they request{"FMP_TOOL_SETS":"search,company"}in their session config.
This MCP provides the following tools for AI assistants to access financial data:
Important Note: All bulk endpoints return data in CSV format as raw strings rather than parsed JSON objects. This endpoint returns the response as a CSV file. The provided sample response represents an individual record. This design preserves the original FMP API format and provides better performance for large datasets.
To get a Financial Modeling Prep access token:
Financial Modeling Prep offers different pricing tiers with varying levels of data access and API call limits. For more information, visit the FMP Pricing page.
Contributions are welcome! Here's how you can contribute:
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)Every pull request triggers a GitHub Actions workflow that verifies the build process.
# Clone the repository git clone https://github.com/imbenrabi/Financial-Modeling-Prep-MCP-Server cd Financial-Modeling-Prep-MCP-Server # Install dependencies npm install # Build the project npm run build # Run in development mode with your API key FMP_ACCESS_TOKEN=your_api_key npm run dev # Or specify the API key directly via CLI argument npm run dev -- --fmp-token=your_api_key
The development server will start on port 8080 by default. You can configure the port using the PORT environment variable:
PORT=4000 FMP_ACCESS_TOKEN=your_api_key npm run dev
Server-Level Static Mode (All Sessions Use Specific Toolsets):
# Environment variable approach FMP_TOOL_SETS=search,company,quotes FMP_ACCESS_TOKEN=your_api_key npm run dev # CLI argument approach (higher precedence) npm run dev -- --fmp-token=your_api_key --fmp-tool-sets=search,company,quotes
Server-Level Dynamic Mode (All Sessions Start with Meta-Tools):
# Environment variable approach DYNAMIC_TOOL_DISCOVERY=true FMP_ACCESS_TOKEN=your_api_key npm run dev # CLI argument approach (higher precedence) npm run dev -- --fmp-token=your_api_key --dynamic-tool-discovery
Session-Level Configuration (Default - No Server Enforcement):
# Start server without mode enforcement npm run dev -- --fmp-token=your_api_key # Individual sessions can then specify their own configurations via HTTP requests
When developing, you can test different configuration scenarios:
# Start server without enforcement npm run dev -- --fmp-token=your_api_key # Test dynamic mode session CONFIG_BASE64=$(echo -n '{"DYNAMIC_TOOL_DISCOVERY":"true"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...' # Test static mode session CONFIG_BASE64=$(echo -n '{"FMP_TOOL_SETS":"search,quotes"}' | base64) curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...'
# Start with server-level dynamic mode npm run dev -- --fmp-token=your_api_key --dynamic-tool-discovery # ALL sessions will use dynamic mode regardless of session config curl -X POST "http://localhost:8080/mcp?config=${CONFIG_BASE64}" -d '...'
The project uses Vitest for testing. You can run tests in several ways:
# Run tests in watch mode (for development) npm test # Run tests once npm run test:run # Run tests with coverage report npm run test:coverage
The coverage report will be generated in the coverage/ directory and displayed in the terminal. You can open coverage/index.html in your browser to view a detailed HTML coverage report.
If you encounter any bugs, have feature requests, or need help with the project, please open an issue on GitHub:
When reporting issues, please include:
This helps us understand and resolve issues more quickly.
This project is licensed under Apache License Version 2.0