market-pulse-mcp
Provides live crypto market data from Coinbase Exchange, including spot prices, OHLCV candles, order book snapshots, and locally computed technical indicators such as RSI, EMA, ATR, and realized volatility.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@market-pulse-mcpWhat's the current price and RSI for BTC?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
market-pulse-mcp
A small, focused MCP (Model Context Protocol) server that gives an LLM live crypto market data: spot prices, OHLCV candles, order book snapshots, perpetual funding rates, and a handful of technical indicators, computed from scratch. Every data source is a public, keyless exchange API, so there is nothing to configure and no account to create.
Built by Brandon Perez (@remybanks77) as a portfolio piece demonstrating a clean MCP server implementation: typed Python, a small dependency footprint, and indicator math written by hand instead of pulled in from pandas or ta-lib.
What it does
market-pulse-mcp exposes eight tools over the MCP stdio transport. Tool names are namespaced with the server name so they do not collide with the other market-data servers a client may have installed at the same time:
Tool | Description | Source |
| Current spot price, best bid/ask, 24h volume | Coinbase Exchange |
| OHLCV candles | Coinbase Exchange |
| Best bid/ask, spread in bps, bid/ask imbalance; raw ladder opt-in | Coinbase Exchange |
| Perp funding rate, mark price, open interest | Hyperliquid |
| RSI(14), EMA(20/50), ATR(14), realized volatility | Coinbase Exchange (computed locally) |
| Compact multi-asset table combining the above | Coinbase Exchange + Hyperliquid |
| Spot-perp basis in bps, contango/backwardation, funding agreement | Coinbase Exchange + Hyperliquid |
| Which assets each venue covers, and which support basis | Coinbase Exchange + Hyperliquid |
Symbols are plain base tickers: "BTC", "ETH", "SOL". A trailing -USD or /USD is tolerated and stripped, so "BTC-USD" and "BTC" are equivalent.
Related MCP server: MCP Crypto Market Data Server
Install
From PyPI
uvx market-pulse-mcpuvx fetches and runs the server without installing anything permanently, which is
what an MCP client config should point at. pip install market-pulse-mcp works too.
From source
With uv (recommended)
git clone https://github.com/remybanks77/market-pulse-mcp.git
cd market-pulse-mcp
uv venv
uv pip install -e ".[dev]"With pip
git clone https://github.com/remybanks77/market-pulse-mcp.git
cd market-pulse-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"Both install a market-pulse-mcp console script that runs the server over stdio.
Distribution files
server.json is the official MCP registry
entry, published with mcp-publisher against the PyPI package. manifest.json and
.mcpbignore describe the same server as an MCPB
bundle, which is how Smithery distributes stdio servers and how Claude Desktop installs
one in a click. The bundle declares server.type: "uv", so dependencies are resolved
from pyproject.toml on the user's machine rather than vendored into the archive; that
keeps it around 100 KB and works on every platform without shipping compiled wheels.
Configure in Claude Code
Add this to your project's .mcp.json (or run claude mcp add):
{
"mcpServers": {
"market-pulse": {
"command": "market-pulse-mcp",
"args": []
}
}
}If you did not install into an active virtualenv, point command at the venv's binary directly, for example /path/to/market-pulse-mcp/.venv/bin/market-pulse-mcp.
Configure in Claude Desktop
Add this to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"market-pulse": {
"command": "/absolute/path/to/market-pulse-mcp/.venv/bin/market-pulse-mcp"
}
}
}Restart Claude Desktop after saving. The market-pulse server should appear under the hammer/tools icon with its six tools listed.
Example conversation
User: What's BTC doing right now, and is it overbought?
Claude: [calls get_price("BTC")]
[calls compute_indicators("BTC", granularity="1h", limit=200)]
BTC is at $109,842 (bid $109,838 / ask $109,846). On the 1h chart:
- RSI(14): 68.4, approaching overbought but not there yet (>70)
- EMA(20) $109,510 above EMA(50) $108,220: short-term trend is bullish
- ATR(14): $412, so a typical 1h range is roughly 0.4% of price
- Realized vol (annualized): 47.9%
Not screaming overbought, but RSI is climbing. Want me to check the order
book for signs of resistance near current price, or pull funding rates to
see how leveraged longs are positioned?
User: Check funding, and give me a quick scan of BTC, ETH, and SOL.
Claude: [calls get_funding_rate("BTC")]
[calls market_summary(["BTC", "ETH", "SOL"])]
Funding on BTC perps (Hyperliquid): 0.0057% per 8h (about 6.2% annualized).
Mildly long-skewed, nothing extreme.
Quick scan:
BTC $109,842 RSI 68.4 bullish funding +6.2%/yr
ETH $3,912 RSI 61.2 bullish funding +4.8%/yr
SOL $198.30 RSI 54.9 flat funding +2.1%/yr
All three trending up on the hourly with positive funding. Nothing at a
extreme RSI level right now.Design notes
Why hand-rolled indicator math instead of pandas or ta-lib. The whole point of this server is to be a small, auditable dependency: mcp and httpx, nothing else. Pulling in pandas for four indicator formulas would be a much heavier dependency than the actual server logic. market_pulse_mcp/indicators.py implements SMA, EMA, Wilder's RSI, Wilder's ATR, and annualized realized volatility (from log returns) directly on plain Python lists, with each formula unit-tested against hand-derived fixture values so the math itself is verified, not just the wiring around it.
Why Coinbase and Hyperliquid specifically. Both expose full market data without an API key: Coinbase Exchange's public REST endpoints (api.exchange.coinbase.com) cover ticker, candles, and order book; Hyperliquid's public info API (api.hyperliquid.xyz/info) covers perp funding and mark prices in a single metaAndAssetCtxs request. That keeps this project genuinely zero-config: clone it, install it, run it, no signup.
Rate-limit handling and caching. Coinbase's public tier rate-limits aggressively (a few requests per second). exchanges.py wraps every request in a small retry-with-exponential-backoff loop that retries on HTTP 429 and 5xx responses (up to 3 attempts, doubling the backoff each time) and fails fast on other 4xx errors, since those indicate a bad request rather than a transient condition. Repeat reads are absorbed by short TTL caches (5s tickers, 20s candles, 10s perp universe) rather than by slowing calls down, and concurrent callers asking for the same key collapse into a single upstream request instead of N of them.
Concurrency. market_summary and get_basis fan out across symbols with asyncio.gather over one process-wide pooled HTTP client, rather than opening a fresh connection per call and walking symbols one at a time. Hyperliquid's metaAndAssetCtxs returns the entire perp universe on every request regardless of what was asked for, so it is fetched once per cache window and indexed by coin instead of being re-downloaded and discarded per symbol. An eight-symbol summary went from 2.67s to 0.24s cold, and is served from cache on repeat.
Venue overlap. market_pulse_basis needs an asset quoted on both venues. Coinbase lists roughly 400 USD spot pairs and Hyperliquid roughly 232 perps, overlapping on about 126 assets. Spot-only assets still work for price, candles, order book and indicators; perp-only assets still work for funding. Rather than leaving a model to discover that by watching symbols fail one at a time, market_pulse_supported_assets reports the partition and can be filtered to any one slice of it.
Context cost as a design constraint. Every field a tool returns is a field the calling model pays for. market_pulse_orderbook used to return depth price levels per side by default, which at its maximum meant 100 [price, size] pairs pushed into the context to answer a question that the spread and imbalance almost always answer; the ladder is now behind include_levels. For the same reason 404s are reported as "not listed on Coinbase spot" rather than echoing back a request URL and a JSON error body.
Error handling philosophy. Every tool catches exceptions from the exchange clients and indicator math and returns {"error": "..."} instead of letting a traceback propagate through the MCP transport. That gives the calling model a readable message it can act on (retry, ask the user for a different symbol, etc.) instead of an opaque tool failure.
Tests
pytest # offline tests only (default; see pyproject.toml)
pytest -m integration # also hit live Coinbase / Hyperliquid APIsThe offline suite (tests/test_indicators.py, tests/test_exchanges.py) is fully deterministic: indicator values are checked against fixtures worked out by hand (see the comments in each test), and exchange helper functions (symbol normalization, granularity resolution) are pure functions with no network access. The integration suite (tests/test_integration.py) is marked @pytest.mark.integration and skipped by default, since it depends on live prices and external uptime; run it explicitly when you want to confirm the client code still matches the real API shapes.
Project layout
market_pulse_mcp/
server.py # MCPServer-based server: tool definitions, stdio entry point
exchanges.py # Coinbase + Hyperliquid HTTP clients, symbol/granularity helpers
indicators.py # RSI, EMA, ATR, realized volatility (stdlib only)
tests/
test_indicators.py # offline, fixture-based
test_exchanges.py # offline, pure-function tests
test_integration.py # live API tests, opt-in via -m integrationLicense
MIT, see LICENSE.
Available Tools
8 toolsmarket_pulse_basisARead-onlyIdempotent
Compare Coinbase spot against the Hyperliquid perpetual for each asset: spot-perp basis in basis points, the current funding rate, and what the two together say about positioning.
Positive basis means the perp trades above spot (contango), which usually pairs with positive funding and crowded long positioning; negative basis (backwardation) with negative funding points the other way. Basis and funding disagreeing is the interesting case, so both are always reported rather than collapsed into one score.
Args: symbols: List of base tickers, e.g. ["BTC", "ETH", "SOL"]. Each must be listed on Coinbase spot and as a Hyperliquid perp; assets missing from either venue come back with an error on that row.
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior. The description adds meaningful runtime behavior: assets missing from either venue yield an error on that row, and basis and funding are always reported together rather than folded into one score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core comparison, followed by a short interpretive guide and a compact parameter block. Every sentence contributes; none repeats schema or annotation data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with rich annotations and an output schema, the description covers semantics, constraints, error behavior, and interpretation. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, symbols, has no schema description, but the Args block fully compensates by defining base tickers, giving an example, and stating both-venue listing and per-row error behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resources: compare Coinbase spot against Hyperliquid perp basis, plus funding and positioning. It is unambiguous and clearly distinct from price/candles/orderbook tools, but it never names or contrasts the nearest sibling market_pulse_funding_rate, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys the intended use case: agents needing spot-perp basis, funding, and the joint positioning read, with the 'disagreeing is interesting' line highlighting when the combined view matters. It gives input eligibility constraints but no explicit when-not-to-use or alternative tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_candlesARead-onlyIdempotent
Get OHLCV candles for a crypto asset from Coinbase.
Args: symbol: Base ticker, e.g. "BTC", "ETH", "SOL". granularity: One of "1m", "5m", "15m", "1h", "6h", "1d". limit: Number of candles to return (max 300).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | ||
| granularity | No | 1h |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, and the description is consistent with these. The description adds the Coinbase source, granularity options, and max limit, but does not disclose ordering, pagination, latency, or other runtime behavior beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-line summary and followed by a tightly structured Args list. Every sentence adds useful information and there is no filler or repetition of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only candle fetch, the description covers the key parameters and the output schema supplies return-structure information. It would be slightly more complete with a note on candle ordering or time range behavior, but nothing essential is missing for basic invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the Args section in the description carries the full burden. It gives meaningful semantics for all three parameters: example symbols, valid granularity values, and the max candle limit. This fully compensates for the otherwise bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a clear verb and resource: 'Get OHLCV candles for a crypto asset from Coinbase.' It is specific enough to distinguish from price or orderbook tools, though it does not explicitly name or differentiate a sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus siblings like market_pulse_price, market_pulse_indicators, or market_pulse_summary. The intended use is only implied by the word 'candles', leaving the agent to infer the right context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_funding_rateARead-onlyIdempotent
Get the current perpetual futures funding rate for a crypto asset from Hyperliquid, along with mark price and open interest.
Args: symbol: Base ticker, e.g. "BTC", "ETH", "SOL".
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds that the tool returns funding rate plus mark price and open interest from Hyperliquid, but does not disclose rate limits, freshness, or units; this is acceptable given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, front-loaded with the purpose and followed by an Args section. There is no filler, repetition, or wasted detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one required parameter, a read-only annotation set, and an existing output schema, the description is nearly complete: it states the input format and the returned data categories. It omits minor details such as supported asset discovery or funding-rate period, but these do not block correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It defines symbol as a base ticker and gives concrete uppercase examples (BTC, ETH, SOL), fully compensating for the empty schema and telling the agent exactly how to populate the required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb and resource: it gets the current perpetual futures funding rate from Hyperliquid, and explicitly names the additional returned data (mark price, open interest). This clearly distinguishes it from sibling tools such as price, candles, and orderbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or alternative routing, but the usage is implied: call this tool when you need current funding-rate data. It does not mention alternatives like market_pulse_basis or market_pulse_supported_assets, so the guidance is only implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_indicatorsARead-onlyIdempotent
Compute technical indicators (RSI-14, EMA-20/50, ATR-14, annualized realized volatility) for a crypto asset from recent Coinbase candles. All math is implemented from scratch on the standard library; see market_pulse_mcp/indicators.py.
Args: symbol: Base ticker, e.g. "BTC", "ETH", "SOL". granularity: Candle granularity: one of "1m", "5m", "15m", "1h", "6h", "1d". Determines both the indicator timeframe and the annualization factor used for realized volatility. limit: Number of candles to pull (more history gives a more stable EMA-50; at least 15 candles are required for RSI-14/ATR-14).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| symbol | Yes | ||
| granularity | No | 1h |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations, such as granularity determining the annualization factor, limit affecting EMA-50 stability, and the minimum 15 candles for RSI-14/ATR-14. This goes beyond a simple 'compute' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a clear summary followed by an Args section. It is slightly padded by the implementation note ('All math is implemented from scratch... see file'), which is not directly useful for tool selection or invocation, but the overall length is appropriate for three parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description correctly focuses on input semantics and behavior. It covers the data source (Coinbase candles), indicator timeframes, annualization, and parameter effects, providing everything an agent needs to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully documents all three parameters: symbol with examples, granularity with allowed values and its effect on annualization, and limit with stability and minimum requirements. This completely compensates for the schema's missing descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Compute') and names the exact technical indicators (RSI-14, EMA-20/50, ATR-14, annualized realized volatility) and the asset class (crypto asset). This clearly distinguishes it from siblings like market_pulse_price or market_pulse_candles, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: this tool computes technical indicators from recent Coinbase candles, so an agent can infer when to use it (needing derived indicators). It does not explicitly name alternatives or exclusions, but the sibling names plus this context make the selection straightforward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_orderbookARead-onlyIdempotent
Get an order book snapshot for a crypto asset from Coinbase: best bid
and ask, spread in basis points, and a bid/ask volume imbalance metric
computed over the top depth levels.
Args:
symbol: Base ticker, e.g. "BTC", "ETH", "SOL".
depth: Number of price levels per side to aggregate over (max 50).
include_levels: Return the raw price/size ladder as well. Off by
default because the ladder is depth pairs per side and the
summary fields above answer most questions; turn it on only to
walk the book or size an order against real resting liquidity.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | ||
| symbol | Yes | ||
| include_levels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. The description adds value beyond annotations by disclosing the data source (Coinbase), the per-side depth cap (max 50), and the size cost of include_levels ('the ladder is `depth` pairs per side'), so the agent understands the verbosity trade-off of the heavy option.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is front-loaded with a dense, informative summary sentence followed by a clean Args block. The include_levels rationale is the longest part but earns its place by preventing an unnecessary heavy call, and no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter read-only tool with an output schema and full annotation coverage, nothing needed to select and invoke it correctly is missing: source, return fields, parameter semantics, defaults, and the cost trade-off of the optional ladder are all covered. The only minor blemish is the schema title reading 'get_orderbookArguments' instead of matching the tool name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates: symbol is clarified as the base ticker with examples ('BTC', 'ETH', 'SOL'), depth is defined as levels 'per side' with a max of 50, and include_levels explains its default-false behavior and the ladder cost. Every parameter gains meaning beyond the bare schema property names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource — 'Get an order book snapshot for a crypto asset from Coinbase' — and enumerates the exact return fields (best bid/ask, spread in basis points, bid/ask volume imbalance over depth levels). This makes it easy to distinguish from siblings like market_pulse_price or market_pulse_summary, which cover single quotes and aggregate views rather than ladder depth.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on what the tool returns and says the summary fields 'answer most questions', with include_levels to be enabled 'only to walk the book or size an order against real resting liquidity'. It provides clear context without explicit exclusions, but it never names an alternative sibling or states exactly when to pick this over market_pulse_price or market_pulse_summary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_priceARead-onlyIdempotent
Get the current spot price for a crypto asset from Coinbase.
Args: symbol: Base ticker, e.g. "BTC", "ETH", "SOL". A trailing "-USD" or "/USD" is tolerated and stripped.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is handled. The description adds useful behavioral context beyond that: the data source is Coinbase, and symbol normalization behavior is disclosed ('A trailing -USD or /USD is tolerated and stripped'). This is valuable operating detail without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely compact: one sentence for the tool purpose and a short Args block for the parameter. No repeated schema information, no filler, and the most important semantic detail is front-loaded. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only spot price lookup, the description is complete. Annotations carry the read-only/idempotence guarantees, the output schema handles return-value documentation, and the description covers source, price type, and symbol formatting. The sibling `market_pulse_supported_assets` even covers the complementary concern of which symbols are valid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full explanatory burden for the single parameter. It does this well by defining `symbol` as a base ticker, providing concrete examples ('BTC', 'ETH', 'SOL'), and documenting accepted suffix forms. An agent can confidently construct valid inputs from this description alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get the current spot price for a crypto asset from Coinbase.' The word 'spot' plus 'current' clearly distinguishes it from sibling tools like market_pulse_candles or market_pulse_orderbook. It is immediately obvious what the tool does and where it fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context for when to use it: whenever the agent needs the current spot price. It does not explicitly name alternatives or when-not-to-use cases, but the phrase 'current spot price' implicitly excludes historical candles, order books, funding rates, and derived indicators. A short explicit pointer to a sibling for historical data would make this a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_summaryARead-onlyIdempotent
Compact multi-asset summary table combining price, spread, funding rate, and RSI/trend for each symbol in one call. Useful for a quick market scan without calling the individual tools per asset.
Args: symbols: List of base tickers, e.g. ["BTC", "ETH", "SOL"].
| Name | Required | Description | Default |
|---|---|---|---|
| symbols | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover safety (readOnly, idempotent, non-destructive). The description adds useful behavioral context by explaining that the tool returns one aggregated table containing specific metrics for all requested symbols, which goes beyond what the annotations state. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: one sentence for purpose and use case, followed by a concise Args block. There is no filler or redundant restatement of the schema, and the key aggregation behavior is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only summary tool with one parameter, an output schema, and sibling tools, the description covers why to call it, what it returns, and how to specify symbols. Minor gaps such as exact ticker formatting rules or behavior for unsupported symbols are non-critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no property descriptions, so the 'Args: symbols' documentation carries the burden. It clarifies that symbols are base tickers and provides a concrete list example. It could be more specific about accepted formats or unsupported symbols, but it is sufficient for a single array parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: a compact multi-asset summary table combining price, spread, funding rate, and RSI/trend for each symbol. This clearly differentiates it from the individual market_pulse_* siblings such as price, orderbook, funding_rate, and indicators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a clear use context: a quick market scan, avoiding calls to individual per-asset tools. It does not explicitly enumerate when NOT to use it or name an alternative tool, but the 'without calling individual tools' phrasing establishes the main routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_pulse_supported_assetsARead-onlyIdempotent
List which crypto assets this server can actually answer for, and on which venue. Call this before a scan rather than discovering coverage by watching individual symbols fail.
Coverage is not uniform. Coinbase quotes the spot side and Hyperliquid the perp side, and the two venues list different assets: some are spot-only (price, candles, order book, indicators work; funding does not), some are perp-only (funding works; nothing Coinbase-sourced does), and only assets on both venues support basis.
Args: venue: Which slice to return. "both" (default) is the spot-and-perp intersection, i.e. exactly the assets basis works for. "spot" is every Coinbase USD market, "perp" every Hyperliquid perp, "spot_only" and "perp_only" the two exclusive sets. search: Optional case-insensitive substring filter, e.g. "SOL". limit: Maximum symbols to return. Counts are always exact and are reported regardless of how many symbols the list itself was truncated to.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| venue | No | both | |
| search | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral detail beyond those annotations: coverage is non-uniform across venues, spot-only and perp-only assets have different capabilities, and symbol counts are always exact even when the returned list is truncated. This gives the agent an accurate mental model of expected behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence delivers the core purpose, followed by a concise but necessary caveat about coverage variance, then a structured Args block. Every sentence adds information: venue semantics, search behavior, limit behavior, and exact-count guarantee. There is no filler or redundant restating of schema defaults.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to enumerate return fields. It covers all invocation-relevant context: what the tool lists, why to call it first, venue-specific capabilities, parameter options, and exact-count behavior. The explanation of basis requiring both venues also ties into the sibling market_pulse_basis tool, making the broader tool landscape coherent. Nothing necessary for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for all three parameters. It fully explains 'venue' with every accepted value and their meaning, 'search' as a case-insensitive substring filter with an example, and 'limit' with the note that counts remain exact regardless of truncation. This is exemplary parameter documentation in the absence of schema-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'List which crypto assets this server can actually answer for, and on which venue.' It immediately differentiates this tool from the market_pulse_* data tools by framing it as a coverage-discovery tool, not a market data tool. The phrase 'Call this before a scan rather than discovering coverage by watching individual symbols fail' further clarifies its distinct role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Call this before a scan', and what to avoid: 'rather than discovering coverage by watching individual symbols fail'. It also provides actionable guidance on venue selection by explaining the semantics of 'both', 'spot', 'perp', 'spot_only', and 'perp_only', so an agent can choose the correct slice. This goes beyond vague context and gives a clear decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.2.0- First observed
market_pulse_basis - First observed
market_pulse_candles - First observed
market_pulse_funding_rate - First observed
market_pulse_indicators - First observed
market_pulse_orderbook - First observed
market_pulse_price - First observed
market_pulse_summary - First observed
market_pulse_supported_assets
TDQS
Scored across 8 tools
Each tool targets a distinct market-data concept: spot price, OHLCV candles, order book, funding rate, indicators, multi-asset summary, spot-perp basis, and asset coverage. The summary and basis tools aggregate other data but are clearly positioned as multi-asset scans, so an agent can pick the right granularity without confusion.
All eight tools follow the same market_pulse_<resource> pattern, e.g. market_pulse_price, market_pulse_candles, market_pulse_funding_rate. There is no mixing of conventions or vague verbs, making the set predictable even though names are noun-based rather than verb_noun.
Eight tools is a well-scoped size for a market-data server. Each tool earns its place: price/candles/orderbook/funding provide raw data, indicators add derived analysis, summary and basis offer synthetic views, and supported_assets avoids dead-end queries.
The surface covers the full read-only workflow for crypto market pulse: quote, candles, order book, funding, technical indicators, cross-venue basis, and coverage discovery. There are no obvious dead ends; the only possible additions like historical funding or trade tape are non-essential for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Real-time crypto market data: candles, tickers, orderbooks across 13+ exchanges via MCP.
Live crypto market data: prices, funding, OI, liquidations, regimes, GEX, whales, sentiment, macro.
Live crypto data: funding rates, funding arbitrage, OI pressure, Fear & Greed. Free, no API key.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides real-time and historical cryptocurrency market data from 100+ exchanges including prices, OHLCV data, market statistics, and order books through the CCXT library with intelligent caching.-
- FlicenseNot gradedqualityDmaintenanceProvides real-time and historical cryptocurrency market data from major exchanges through CCXT. Supports live price lookups, historical OHLCV queries, and includes lightweight caching for improved performance.-
- FlicenseNot gradedqualityDmaintenanceProvides real-time and historical cryptocurrency market data using ccxt, enabling users to fetch live prices, historical candlestick data, and stream real-time ticker updates across multiple exchanges.14-
- AlicenseAqualityCmaintenanceProvides live cryptocurrency market data from over 100 exchanges, enabling AI agents to fetch prices, order books, funding rates, and more for trading analysis and arbitrage opportunities.132MIT