Pyth Pro MCP Server
Real-time and historical price feeds for 500+ crypto, equities, FX, and commodities assets.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://mcp.pyth.network/mcp"
}
}
}Remote endpoints
https://mcp.pyth.network/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢get_symbols(access_token, asset_type, include_inactive, instrument_type, limit, ...)
List available Pyth Pro price feeds. Use this FIRST to discover what feeds exist before calling get_latest_price, get_historical_price, get_price_range or get_candlestick_data (those also accept bare pairs like BTC/USD). Filter by asset_type (e.g. crypto, equity, fx, metal, commodity, interest-rate, funding-rate, kalshi) or search by name/symbol. Narrow further with instrument_type (spot, future, ...) or symbol_chain_id (all contracts of one futures chain, e.g. VX). Retired (inactive) feeds are hidden unless include_inactive is true. Returns compact feed metadata: symbol, name, description, pyth_lazer_id, asset_type, instrument_type, state, exponent, min_channel (fastest channel the feed supports), quote_currency, and where set groups (entitlement groups that gate the feed), expiration_time and symbol_chain_id (futures). Pass verbose: true for every catalog field, e.g. market_sessions (trading-hours schedules) and corporate_actions (e.g. stock splits). With an access token, the list also includes feeds visible only to Pro keys, and each feed has `entitled`: true means this key can query the feed right now. When `entitled` is false, `not_entitled_reason` says why: `not_live (...)` means the feed is in beta, not live yet, or retired, so no key can query it (NOT a plan limitation), `requires one of entitlement groups: ...` means the user's plan lacks that entitlement.
Input Schema
{
"type": "object",
"properties": {
"access_token": {
"type": "string",
"minLength": 1,
"pattern": "^[\\x21-\\x7E]+$",
"description": "Optional. The user's own Pyth Pro access token; omit it when the user configured one in their MCP client. With a token the list includes feeds visible only to Pro keys, and each feed gets an `entitled` flag."
},
"asset_type": {
"type": "string",
"enum": [
"crypto",
"crypto-index",
"crypto-redemption-rate",
"fx",
"equity",
"metal",
"rates",
"interest-rate",
"nav",
"commodity",
"funding-rate",
"eco",
"kalshi"
],
"description": "Filter by asset type: crypto, crypto-index, crypto-redemption-rate, fx, equity, metal, rates, interest-rate, nav, commodity, funding-rate, eco, kalshi"
},
"include_inactive": {
"type": "boolean",
"default": false,
"description": "Include retired feeds (state 'inactive'). Default false: inactive feeds are hidden."
},
"instrument_type": {
"type": "string",
"enum": [
"spot",
"future",
"perp",
"rate",
"index",
"nav"
],
"description": "Filter by instrument type: spot, future, perp, rate, index, nav"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"default": 50,
"description": "Results per page (default 50, max 200)"
},
"offset": {
"type": "integer",
"minimum": 0,
"default": 0,
"description": "Pagination offset (default 0)"
},
"query": {
"type": "string",
"description": "Text filter (e.g. 'BTC', 'gold', 'AAPL')"
},
"symbol_chain_id": {
"type": "string",
"minLength": 1,
"description": "Filter futures by chain ID, exact and case-sensitive (e.g. 'VX' for all VIX futures contracts)"
},
"verbose": {
"type": "boolean",
"default": false,
"description": "Return every catalog field (trading schedules, market_sessions, corporate_actions, hermes_id, ...). Default false: compact feeds, about 4x smaller."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢convert_date_to_timestamp(date_string)
Convert a date string to Unix timestamp for use with get_historical_price, get_price_range and get_candlestick_data. Use this tool when you need to compute timestamps — do not calculate Unix timestamps manually. Accepts ISO 8601 dates (e.g. '2026-01-01', '2026-01-01T12:00:00Z'). Returns seconds, microseconds, ISO 8601, and whether the date is within the available data range (April 2025 onward).
Input Schema
{
"type": "object",
"properties": {
"date_string": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"description": "Date to convert. Must be ISO 8601 / RFC 3339 with timezone (e.g. '2026-01-01T00:00:00Z', '2026-01-01'). Bare dates without timezone are interpreted as UTC."
}
},
"required": [
"date_string"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_candlestick_data(access_token, channel, from, resolution, symbol, ...)
Fetch OHLC candlestick bars for one symbol, for charting, technical analysis or backtesting. OHLC values are already human-readable (no exponent). Requires the user's own Pyth Pro access token. If the user configured it in their MCP client, omit `access_token`; otherwise pass it as `access_token`, and if the tool reports it missing, ask the user for it. Symbols can be full names from get_symbols (e.g. 'Crypto.BTC/USD', 'Equity.US.AAPL/USD') or bare pairs like 'BTC/USD'. A bare pair resolves to the live spot feed when there is one, otherwise to the only remaining live match; `resolved_symbols` in the response shows what each input resolved to, and an ambiguous input returns an error listing the candidates. `from` and `to` are Unix seconds only. Resolutions: 1/5/15/30/60 minutes, 120/240/360/720 (multi-hour), D (daily), W (weekly), M (monthly). At most 500 candles are returned; `truncated: true` means narrow the range or use a larger resolution. Historical data is available from April 2025 onward; do not request times before that. Price tools: get_latest_price for now, get_historical_price for one past instant, get_price_range for every update within up to 60 seconds, get_candlestick_data for OHLC bars over longer periods. Timestamp reference (Unix seconds): 2025-04-01 (earliest available) = 1743465600 2026-01-01 = 1767225600 2026-06-01 = 1780272000 Always double-check your timestamp math (year-boundary errors are common), or use convert_date_to_timestamp.
Input Schema
{
"type": "object",
"properties": {
"access_token": {
"type": "string",
"minLength": 1,
"pattern": "^[\\x21-\\x7E]+$",
"description": "The user's own Pyth Pro access token. Omit it when the user configured one in their MCP client; a value here overrides that. Get one at https://docs.pyth.network/price-feeds/pro/acquire-api-key"
},
"channel": {
"type": "string",
"enum": [
"real_time",
"fixed_rate@50ms",
"fixed_rate@200ms",
"fixed_rate@1000ms"
],
"description": "Override the default channel (update rate): real_time, fixed_rate@50ms, fixed_rate@200ms, fixed_rate@1000ms. Must not be faster than the feed's min_channel."
},
"from": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Start time, Unix seconds only (not milliseconds)"
},
"resolution": {
"type": "string",
"enum": [
"1",
"5",
"15",
"30",
"60",
"120",
"240",
"360",
"720",
"D",
"W",
"M"
],
"description": "Candle size: 1, 5, 15, 30, 60 (minutes), 120, 240, 360, 720 (hours), D (daily), W (weekly), M (monthly)"
},
"symbol": {
"type": "string",
"minLength": 1,
"description": "One symbol from get_symbols (e.g. 'Crypto.BTC/USD', 'Equity.US.AAPL/USD') or a bare pair like 'BTC/USD'"
},
"to": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "End time, Unix seconds only (not milliseconds)"
}
},
"required": [
"from",
"resolution",
"symbol",
"to"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_historical_price(access_token, channel, price_feed_ids, symbols, timestamp)
Get the price of one or more feeds at one past instant. Requires the user's own Pyth Pro access token. If the user configured it in their MCP client, omit `access_token`; otherwise pass it as `access_token`, and if the tool reports it missing, ask the user for it. Symbols can be full names from get_symbols (e.g. 'Crypto.BTC/USD', 'Equity.US.AAPL/USD') or bare pairs like 'BTC/USD'. A bare pair resolves to the live spot feed when there is one, otherwise to the only remaining live match; `resolved_symbols` in the response shows what each input resolved to, and an ambiguous input returns an error listing the candidates. If both price_feed_ids and symbols are provided, only price_feed_ids are used. The timestamp accepts Unix seconds, milliseconds or microseconds (auto-detected) and is rounded down to the channel rate (e.g. a multiple of 200 ms for fixed_rate@200ms). Historical data is available from April 2025 onward; do not request times before that. Requested feeds that return no price are listed in `missing_feed_ids` (e.g. beta or coming_soon feeds, or a channel faster than the feed's min_channel). Prices are integers with an exponent field: human-readable price = price * 10^exponent. Pre-computed display_* fields (display_price, display_bid, display_ask, display_confidence, display_ema_price, display_ema_confidence, display_funding_rate) apply the exponent for you. Price tools: get_latest_price for now, get_historical_price for one past instant, get_price_range for every update within up to 60 seconds, get_candlestick_data for OHLC bars over longer periods. Timestamp reference (Unix seconds): 2025-04-01 (earliest available) = 1743465600 2026-01-01 = 1767225600 2026-06-01 = 1780272000 Always double-check your timestamp math (year-boundary errors are common), or use convert_date_to_timestamp.
Input Schema
{
"type": "object",
"properties": {
"access_token": {
"type": "string",
"minLength": 1,
"pattern": "^[\\x21-\\x7E]+$",
"description": "The user's own Pyth Pro access token. Omit it when the user configured one in their MCP client; a value here overrides that. Get one at https://docs.pyth.network/price-feeds/pro/acquire-api-key"
},
"channel": {
"type": "string",
"enum": [
"real_time",
"fixed_rate@50ms",
"fixed_rate@200ms",
"fixed_rate@1000ms"
],
"description": "Override the default channel (update rate): real_time, fixed_rate@50ms, fixed_rate@200ms, fixed_rate@1000ms. Must not be faster than the feed's min_channel."
},
"price_feed_ids": {
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0
},
"maxItems": 50,
"description": "Numeric feed IDs (pyth_lazer_id) from get_symbols. Max 50."
},
"symbols": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Symbols from get_symbols (e.g. ['Crypto.BTC/USD', 'Equity.US.AAPL/USD']) or bare pairs like 'BTC/USD'. Max 50."
},
"timestamp": {
"type": "number",
"exclusiveMinimum": 0,
"description": "The instant to look up. Unix seconds, milliseconds or microseconds (auto-detected by magnitude)."
}
},
"required": [
"timestamp"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_latest_price(access_token, channel, price_feed_ids, properties, symbols)
Get the most recent real-time price for one or more feeds. Requires the user's own Pyth Pro access token. If the user configured it in their MCP client, omit `access_token`; otherwise pass it as `access_token`, and if the tool reports it missing, ask the user for it. Symbols can be full names from get_symbols (e.g. 'Crypto.BTC/USD', 'Equity.US.AAPL/USD') or bare pairs like 'BTC/USD'. A bare pair resolves to the live spot feed when there is one, otherwise to the only remaining live match; `resolved_symbols` in the response shows what each input resolved to, and an ambiguous input returns an error listing the candidates. If both price_feed_ids and symbols are provided, only price_feed_ids are used. Requested feeds that return no price are listed in `missing_feed_ids` (e.g. beta or coming_soon feeds, or a channel faster than the feed's min_channel). Prices are integers with an exponent field: human-readable price = price * 10^exponent. Pre-computed display_* fields (display_price, display_bid, display_ask, display_confidence, display_ema_price, display_ema_confidence, display_funding_rate) apply the exponent for you. Price tools: get_latest_price for now, get_historical_price for one past instant, get_price_range for every update within up to 60 seconds, get_candlestick_data for OHLC bars over longer periods.
Input Schema
{
"type": "object",
"properties": {
"access_token": {
"type": "string",
"minLength": 1,
"pattern": "^[\\x21-\\x7E]+$",
"description": "The user's own Pyth Pro access token. Omit it when the user configured one in their MCP client; a value here overrides that. Get one at https://docs.pyth.network/price-feeds/pro/acquire-api-key"
},
"channel": {
"type": "string",
"enum": [
"real_time",
"fixed_rate@50ms",
"fixed_rate@200ms",
"fixed_rate@1000ms"
],
"description": "Override the default channel (update rate): real_time, fixed_rate@50ms, fixed_rate@200ms, fixed_rate@1000ms. Must not be faster than the feed's min_channel."
},
"price_feed_ids": {
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0
},
"maxItems": 100,
"description": "Numeric feed IDs (pyth_lazer_id) from get_symbols. Max 100."
},
"properties": {
"type": "array",
"items": {
"type": "string",
"enum": [
"price",
"bestBidPrice",
"bestAskPrice",
"exponent",
"publisherCount",
"confidence",
"fundingRate",
"fundingTimestamp",
"fundingRateInterval",
"marketSession",
"emaPrice",
"emaConfidence",
"feedUpdateTimestamp"
]
},
"description": "Properties to return: price, bestBidPrice, bestAskPrice, exponent, publisherCount, confidence, fundingRate, fundingTimestamp, fundingRateInterval, marketSession, emaPrice, emaConfidence, feedUpdateTimestamp. Default: price, bestBidPrice, bestAskPrice, exponent, publisherCount, confidence, marketSession, feedUpdateTimestamp. Use fundingRate, fundingTimestamp and fundingRateInterval for funding-rate feeds; emaPrice and emaConfidence for the exponential moving average."
},
"symbols": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 100,
"description": "Symbols from get_symbols (e.g. ['Crypto.BTC/USD', 'Equity.US.AAPL/USD']) or bare pairs like 'BTC/USD'. Max 100."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_price_range(access_token, after, channel, end, limit, ...)
Get every price update for one or more feeds within a short historical window (at most 60 seconds), e.g. to see exactly how a price moved around an event. Requires the user's own Pyth Pro access token. If the user configured it in their MCP client, omit `access_token`; otherwise pass it as `access_token`, and if the tool reports it missing, ask the user for it. Symbols can be full names from get_symbols (e.g. 'Crypto.BTC/USD', 'Equity.US.AAPL/USD') or bare pairs like 'BTC/USD'. A bare pair resolves to the live spot feed when there is one, otherwise to the only remaining live match; `resolved_symbols` in the response shows what each input resolved to, and an ambiguous input returns an error listing the candidates. If both price_feed_ids and symbols are provided, only price_feed_ids are used. Rows are ordered by time and interleaved across feeds; a fixed_rate@200ms channel yields 5 rows per feed per second. When `has_more` is true, call again with `after` set to `next_cursor` and the same feeds, window and channel. Historical data is available from April 2025 onward; do not request times before that. Prices are integers with an exponent field: human-readable price = price * 10^exponent. Pre-computed display_* fields (display_price, display_bid, display_ask, display_confidence, display_ema_price, display_ema_confidence, display_funding_rate) apply the exponent for you. Price tools: get_latest_price for now, get_historical_price for one past instant, get_price_range for every update within up to 60 seconds, get_candlestick_data for OHLC bars over longer periods.
Input Schema
{
"type": "object",
"properties": {
"access_token": {
"type": "string",
"minLength": 1,
"pattern": "^[\\x21-\\x7E]+$",
"description": "The user's own Pyth Pro access token. Omit it when the user configured one in their MCP client; a value here overrides that. Get one at https://docs.pyth.network/price-feeds/pro/acquire-api-key"
},
"after": {
"type": "string",
"minLength": 1,
"description": "Paging cursor: pass `next_cursor` from the previous response, with the same feeds, window and channel"
},
"channel": {
"type": "string",
"enum": [
"real_time",
"fixed_rate@50ms",
"fixed_rate@200ms",
"fixed_rate@1000ms"
],
"description": "Override the default channel (update rate): real_time, fixed_rate@50ms, fixed_rate@200ms, fixed_rate@1000ms. Must not be faster than the feed's min_channel."
},
"end": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Window end, inclusive. Unix seconds, milliseconds or microseconds (auto-detected by magnitude). At most 60 seconds after `start`; equal to `start` for one instant."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 500,
"default": 100,
"description": "Rows per page (default 100, max 500). Each row is one update for one feed."
},
"price_feed_ids": {
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0
},
"maxItems": 50,
"description": "Numeric feed IDs (pyth_lazer_id) from get_symbols. Max 50."
},
"start": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Window start, inclusive. Unix seconds, milliseconds or microseconds (auto-detected by magnitude)."
},
"symbols": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Symbols from get_symbols (e.g. ['Crypto.BTC/USD', 'Equity.US.AAPL/USD']) or bare pairs like 'BTC/USD'. Max 50."
}
},
"required": [
"end",
"start"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence