Surf MCP Server
OfficialThis server lets AI assistants query Surf's crypto data API through 15 MCP tools covering market data, on-chain analytics, wallets, social, news, and prediction markets.
surf_market– token prices, rankings, Fear & Greed, ETF flows, futures/options, liquidations, and technical/on-chain indicators.surf_exchange– live exchange data (order books, candlesticks, funding history, perpetuals, long/short ratios) from Binance, OKX, Bybit, and more.surf_hyperliquid– Hyperliquid leaderboards, trader positions, orders, fills, closed trades, performance, and trade context.surf_wallet– inspect wallet balances, transfers, transaction history, net worth, DeFi protocol positions, and batch labels.surf_token– token holders, DEX trade history, transfer activity, counterparties, and tokenomics/unlock schedules.surf_onchain– run SQL/structured queries on blockchain data, look up transactions, check gas prices, explore schemas, and rank bridges/yields.surf_search– unified search across projects, wallets, news, web pages, funds, airdrops, prediction markets, events, and social content.surf_prediction_market– Polymarket and Kalshi events, markets, prices, volumes, open interest, trades, orderbooks, analytics, and cross-platform matching.surf_project&surf_signal– deep project profiles, DeFi metrics/rankings, AI news, signal scores, and token-of-day/week highlights.surf_fund– crypto VC fund profiles, portfolios, and rankings.surf_news&surf_x– crypto news feeds, article details, and X post retrieval by ID.surf_web– fetch any URL and convert it to clean, LLM-friendly markdown.surf_dex– DEX-pool-weighted token OHLCV price data.
It can run locally via stdio or as a Streamable HTTP server, with anonymous access, API-key passthrough, and optional OAuth.
Provides access to Binance exchange data including order book depth, klines, perpetual futures, funding history, prices, and market pairs.
Enables on-chain queries, transaction lookup, gas prices, token holder analysis, and social sentiment for Ethereum.
Provides access to OKX exchange data including order book depth, klines, perpetual futures, funding history, prices, and market pairs.
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., "@Surf MCP Serverwhat's the BTC price?"
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.
surf-mcp
MCP server for the Surf crypto data API. Dynamically generates tools from the OpenAPI spec across market data, wallets, social, on-chain queries, and more. It supports stdio for local clients and Streamable HTTP for hosted ChatGPT/Codex integrations.
Quick start
Add to your MCP client config — no clone or install needed:
{
"mcpServers": {
"surf": {
"type": "http",
"url": "https://mcp.asksurf.ai/mcp"
}
}
}To run the stdio package locally instead:
{
"mcpServers": {
"surf": {
"command": "npx",
"args": ["-y", "@surf-ai/surf-mcp"],
"env": {
"SURF_API_KEY": "your-api-key"
}
}
}
}Prerequisites
Node.js 20+ or Bun
Optional: a Surf API key (get one here) for account credits and higher limits. Without a key, Surf's anonymous per-IP allowance applies.
Config file locations
Claude Code:
.mcp.jsonin project root or~/.claude.jsonClaude Desktop:
~/Library/Application Support/Claude/claude_desktop_config.json(macOS)Cursor: MCP settings in the IDE
Related MCP server: musashi-mcp
Claude Code plugin
This repository is also a Claude Code marketplace. Install the Surf plugin with:
claude plugin marketplace add asksurf-ai/surf-mcp
claude plugin install surf@surfThe plugin connects to the hosted anonymous beta. Usage is limited by Surf's anonymous allowance; production deployments should use a dedicated, rate-limited service key or OAuth 2.1.
ChatGPT and Codex plugin
The repository contains a Codex/ChatGPT plugin package under plugins/surf, a Claude package under claude-plugin, and repo marketplaces for both hosts. The two thin package directories are separate because the current hosts validate different .mcp.json root shapes; both connect to the hosted MCP endpoint. Codex can add its marketplace directly:
codex plugin marketplace add asksurf-ai/surf-mcpRegister https://mcp.asksurf.ai/mcp in ChatGPT Plugins. See docs/chatgpt-plugin-submission.md for the submission checklist.
Streamable HTTP deployment
Run the hosted transport locally:
bun run start:httpThe server exposes:
POST /mcp— stateless MCP Streamable HTTP endpointGET /healthz— deployment health checkGET /.well-known/oauth-protected-resource— OAuth resource metadata (RFC 9728); returns 404 untilSURF_OAUTH_AUTHORIZATION_SERVERis configured
Authentication
Each HTTP request's Authorization header is forwarded verbatim to the Surf data API, so callers presenting their own Surf API key (or a Surf-issued OAuth token, once available) are billed and rate-limited on their own account. Resolution order per request:
The incoming
Authorizationheader, forwarded as-isThe deployment's
SURF_API_KEYservice key (Bearerscheme)Anonymous — the Surf API's per-IP allowance applies
Environment variables for OAuth discovery and login:
Variable | Purpose |
| Base URL of the Surf OAuth authorization server. Unset (default) keeps the metadata endpoint dark. |
| Public URL of this MCP deployment (default |
|
|
Deployment modes:
|
| Behavior |
unset | unset | Anonymous allowance + API key passthrough (current beta) |
set | unset | OAuth discoverable for clients that look for it; anonymous still allowed |
set | set | Credential-less requests are challenged into the OAuth login flow |
Build and run the included container:
docker build -t surf-mcp .
docker run --rm -p 3000:3000 -e SURF_API_KEY=your-service-api-key surf-mcpThe limited beta is live at https://mcp.asksurf.ai/mcp. For higher capacity, keep a dedicated, rate-limited SURF_API_KEY in the host's secret manager; never put it in plugin manifests or client-visible responses.
The included Vercel Functions adapter exposes the same endpoints from api/mcp.ts and api/healthz.ts. Deploy it to a Vercel project when a serverless beta is preferable to the container image.
Tools
The server currently exposes 15 tools, one per API domain. Each tool accepts a command and optional params; the exact commands update automatically with the Surf OpenAPI specification:
Tool | Commands | Description |
|
| DEX-pool-weighted token OHLCV data |
|
| Market overview, rankings, indicators, ETF flows |
|
| Live exchange data from Binance, OKX, Bybit, etc. |
|
| Hyperliquid trader, position, order, fill, and P&L data |
|
| Wallet balances, transfers, DeFi positions |
|
| Token holder analysis, DEX trades, unlocks |
|
| X post and author details by post ID |
|
| Project profiles, DeFi TVL/fees/revenue |
|
| Project signal scores and ranked highlights |
|
| On-chain SQL queries, tx lookup, gas prices |
|
| Unified search across all data types |
|
| Polymarket and Kalshi prediction markets |
|
| Crypto VC fund profiles and portfolios |
|
| Crypto news from major outlets |
|
| Fetch any URL as clean markdown |
Usage examples
Once configured, your AI assistant can use the tools directly:
"What's the BTC price?" → surf_market({ command: "price", params: { symbol: "BTC" } })
"Check vitalik's wallet" → surf_wallet({ command: "detail", params: { address: "vitalik.eth" } })
"Search for DeFi projects" → surf_search({ command: "project", params: { q: "defi lending" } })
"Run an on-chain SQL query" → surf_onchain({ command: "sql", params: { sql: "SELECT ..." } })
"Surf's token of the day" → surf_signal({ command: "token-of-the-day" })How it works
On startup, the server:
Fetches the OpenAPI spec from
https://api.asksurf.ai/gateway/openapi.json(cached for 24h)Groups all operations by their API tag
Registers one MCP tool per tag with auto-generated descriptions and command enums
Routes tool calls to the Surf API with native HTTP fetch and optional bearer authentication
The server automatically picks up new API endpoints when the spec is updated — just restart.
Example: AI agent
The repo includes a simple agent that connects Claude to surf-mcp tools in an agentic loop. See examples/agent.ts.
ANTHROPIC_API_KEY=your-key SURF_API_KEY=your-key bun run examples/agent.ts "What's the BTC price and fear & greed index?"Development
git clone https://github.com/asksurf-ai/surf-mcp.git
cd surf-mcp
bun install
bun run start # Run the server
bun run start:http # Run Streamable HTTP on :3000
bun run typecheck # Type checkLicense
MIT
Available Tools
15 toolssurf_dexSurf DEXARead-only
Use this when the user needs dex data from Surf.
Commands: token-price - DEX Token OHLCV Price params: chain* (string), address* (string), interval (string), time_range (string), from (string), to (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the command structure and indicates the tool returns OHLCV price data. It does not disclose additional behaviors such as limitations, prerequisites, or response format, but given the annotations, this level is adequate.
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: a single use case sentence followed by a parameter listing for the one command. Every element contributes to the agent's understanding, with no redundant or filler text.
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 tool with a single command, the description covers purpose, command, and parameter list adequately. It lacks explicit return value structure, but since there is no output schema, the mention of 'OHLCV Price' gives a hint. Minor gaps in parameter semantics and output format prevent a higher score.
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 schema itself has zero descriptions and an unconstrained 'params' object, so the description must compensate. It lists all parameters with types and required markers: chain*, address*, interval, time_range, from, to. This is essential context beyond the empty schema. However, it doesn't explain the meaning or format of each parameter (e.g., valid interval values), so it's not fully rich.
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 clearly states 'Use this when the user needs dex data from Surf' and names the command 'token-price' with its purpose 'DEX Token OHLCV Price.' This identifies the tool as a DEX data retrieval tool. It distinguishes from siblings by the specific 'dex data' domain, though it does not explicitly name sibling tools.
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 provides a clear usage context: 'when the user needs dex data from Surf.' However, it does not mention when not to use it or suggest alternative tools like surf_exchange or surf_market for other data types, so exclusions and alternatives are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_exchangeSurf ExchangeARead-only
Use this when the user needs exchange data from Surf. Access real-time trading data from major exchanges including Binance, OKX, Bybit, and more. Query live ticker prices, order book depth, OHLCV candlestick charts, and perpetual contract data such as funding rates, open interest, and long/short ratios.
Commands: candles - Exchange Historical Candles params: exchange* (string) [bithumb, upbit, hashkey, bitflyer, coinone, korbit], pair* (string), interval (string) [5m, 4h, 1w], from (string), to (string), include_synthetic (boolean), limit (integer), offset (integer) coverage - Exchange Market Coverage params: exchange (string) [bithumb, upbit, hashkey, bitflyer, coinone, korbit], q (string), quote (string), type (string) [spot], status (string) [active, inactive], data_status (string), sort_by (string), order (string) [asc, desc], limit (integer), offset (integer) depth - Exchange Order Book Depth params: pair* (string), type (string) [spot, swap, perpetual, perp], limit (integer), exchange (string) funding-history - Exchange Funding Rate History params: pair* (string), from (string), limit (integer), exchange (string) klines - Exchange OHLCV Candlesticks params: pair* (string), type (string) [spot, swap, perpetual, perp], interval (string), from (string), limit (integer), exchange (string) long-short-ratio - Exchange Long/Short Ratio History params: pair* (string), interval (string) [1h, 4h, 1d], from (string), limit (integer), exchange (string) [binance, okx, bybit, bitget] markets - Exchange Trading Pairs params: exchange (string), type (string) [spot, swap, future, option, perpetual, perp], base (string), quote (string), search (string), limit (integer) perp - Exchange Perpetual Contract Snapshot params: pair* (string), fields (string), exchange (string) price - Exchange Ticker Price params: pair* (string), type (string) [spot, swap, perpetual, perp], exchange (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to cover safety. It adds context about real-time data and available data types (tickers, order books, funding rates), which is valuable. However, it doesn't discuss rate limits, pagination, or authentication, but given the annotations, this is not a major gap.
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 the purpose statement and then provides a structured, scannable list of commands with their parameters. While the list is long, it is efficient and each line serves a purpose; no redundant text.
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?
This is a multi-command tool with many parameters and no output schema. The description lists all commands with brief descriptions and parameter details, which is sufficient for an agent to select and call the right command. It doesn't fully explain return formats, but the command names are self-explanatory and no output schema is expected.
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 only defines a 'command' enum and an opaque 'params' object with no properties. The description compensates fully by listing each command's parameters with types and enums (e.g., exchange, interval, limit), providing essential information the schema omits.
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 begins with 'Use this when the user needs exchange data from Surf' and then details specific data types (ticker prices, order book, OHLCV, funding rates) available from major exchanges. This clearly specifies the tool's function and distinguishes it from sibling tools focused on DEX, prediction markets, etc.
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 gives a clear context: 'Use this when the user needs exchange data from Surf' and lists exchange names, but it does not explicitly exclude alternatives or mention when to use other Surf tools like surf_dex. Thus it has clear context but no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_fundSurf FundARead-only
Use this when the user needs fund data from Surf. Explore crypto venture capital. Look up fund profiles with team info and social links, browse their full investment portfolio with round details, and rank funds by tier or portfolio size.
Commands: detail - Fund Profile Detail params: id (string), q (string) portfolio - Fund Portfolio params: id (string), q (string), limit (integer), offset (integer), is_lead (string) [true, false, ], invested_after (integer), invested_before (integer), sort_by (string) [invested_at, recent_raise, total_raise], order (string) [asc, desc] ranking - Fund Ranking params: metric* (string) [tier, portfolio_count], limit (integer), offset (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by detailing sub-commands and their parameters, revealing that the tool supports three distinct query modes (detail, portfolio, ranking) with specific filter and sort options. This is meaningful behavioral context not captured by the readOnlyHint.
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-structured with a lead-in sentence and a compact command breakdown. It is longer than some but every sentence contributes to understanding tool usage. The command list format is efficient and scannable.
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 the multi-command complexity and absence of an output schema, the description provides solid coverage of commands and parameters. It does not detail return values, but the command names and parameter lists give sufficient context for an agent to select and invoke the tool.
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?
With schema coverage at 0%, the description carries the full burden of documenting parameters. It lists all sub-command parameters, types, enums, and defaults (e.g., is_lead, sort_by, order). However, some parameters like 'q' and 'id' lack semantic explanation, leaving minor gaps.
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 clearly states what the tool does: 'Use this when the user needs fund data from Surf.' It then enumerates specific capabilities (fund profiles, portfolios, rankings), distinguishing it from sibling tools focused on DEX, tokens, etc.
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 opens with an explicit when-to-use statement: 'Use this when the user needs fund data from Surf.' It does not mention exclusions or alternatives, but the sibling list and domain-specific language make the context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_hyperliquidSurf HyperliquidARead-only
Use this when the user needs hyperliquid data from Surf.
Commands: account - Account Portfolio params: address* (string) candles - Market Candles params: symbol* (string), interval (string), from* (string), to* (string) fills - Fills params: address* (string), from (string), to (string), to_ms (integer), to_fill_id (string), order (string) [desc, asc], cursor (string), symbol (string), limit (integer) leaderboard - Trader Leaderboard params: time_range (string) [1d, 7d, 30d, 90d, all], sort_by (string) [total_pnl, win_rate, volume_traded], min_trades (integer), min_days_active (integer), min_account_age_days (integer), min_human_score (integer), dex (string), limit (integer), offset (integer) orders - Open & Recent Orders params: address* (string), open_limit (integer), historical_limit (integer) performance - Trading Performance params: address* (string), dex (string) positions - Open Positions params: address* (string), dex (string) trades - Closed Trades params: address* (string), symbol (string), direction (string) [long, short], dex (string), from (string), to (string), cursor (string), limit (integer) trades-aggregate - Closed Trades Aggregate params: address* (string), group_by (string) [day, symbol, direction, size_bucket, hold_bucket], from (string), to (string), dex (string), fill_gaps (boolean) trade-context - Closed Trade Funding and Leverage params: address* (string), symbol* (string), direction* (string) [long, short], open_time* (integer), close_time* (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safe-read behavior is known. The description adds a comprehensive command reference but does not disclose additional behavioral traits such as data freshness, pagination handling, authentication requirements, or any potential rate limits. It does not contradict 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 efficiently structured as a command list with each line showing the command name and its parameters. The purpose sentence is front-loaded, and there is no filler. Despite its length, every entry earns its place by providing essential invocation details for the tool's many subcommands.
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?
The description covers all ten commands and their parameter lists, providing a complete map of the tool's capabilities. However, it does not explicitly state how the top-level params object should be populated for each command, nor does it describe the return value structure. Since there is no output schema, a brief note on response format would improve completeness, but the command names and parameter lists make the intended calls reasonably clear.
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 only defines a command enum and a free-form params object, providing zero documentation for nested parameters. The description compensates fully by listing every command's parameters, marking required ones with an asterisk, and specifying enums for many fields (e.g., interval, order, time_range). It also disambiguates formats (e.g., to_ms integer) and optionality, adding substantial meaning beyond the 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 opening sentence clearly states 'Use this when the user needs hyperliquid data from Surf', specifying the exact resource and action. It then enumerates all available commands, making the tool's scope unmistakable and distinguishing it from sibling tools that target other data domains (e.g., surf_dex, surf_token).
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 a clear 'Use this when...' context, and the command list provides intra-tool guidance on which command to invoke for specific data needs (e.g., account, candles, trades). However, it does not explicitly mention when not to use this tool or point to alternatives like surf_onchain for other types of data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_marketSurf MarketARead-only
Use this when the user needs market data from Surf. Get a high-level view of the crypto market. Browse token rankings by market cap or volume, track derivatives across all exchanges, monitor spot ETF fund flows, view liquidation events, compute technical indicators (RSI, MACD, Bollinger Bands, and more), explore on-chain valuation metrics (NUPL, MVRV, SOPR), and check the Fear & Greed Index.
Commands: etf - ETF Flow History params: symbol* (string) [BTC, ETH, XRP, SOL, HYPE], sort_by (string) [flow_usd, timestamp], order (string) [asc, desc], from (string), to (string) exchange-flow-exchanges - Exchange Flow Exchanges params: symbol* (string) [BTC, ETH], limit (integer), offset (integer) fear-greed - Fear & Greed Index History params: from (string), to (string) futures - Futures Market Overview params: sort_by (string) [open_interest, funding_rate, volume_24h, long_short_ratio], order (string) [asc, desc] liquidation-chart - Liquidation Chart params: symbol* (string), interval (string), exchange (string), limit (integer), from (string), to (string) liquidation-exchange-list - Liquidation by Exchange params: symbol (string), time_range (string) [1h, 4h, 12h, 24h], sort_by (string) [liquidation_usd, long_liquidation_usd, short_liquidation_usd], order (string) [asc, desc] liquidation-order - Large Liquidation Orders params: exchange (string), symbol (string), min_amount (string), side (string) [long, short], sort_by (string) [usd_value, timestamp, price], order (string) [asc, desc], limit (integer), offset (integer), from (string), to (string) listing - Exchange Listing Events params: from* (string), to (string), symbol (string), exchange (string), product (string) [spot, margin, perp, pre_market_perp, all], type (string) [listing, delisting, cancelled, advanced, postponed], limit (integer), offset (integer) onchain-indicator - On-Chain Indicator params: symbol* (string) [BTC, ETH], metric* (string), granularity (string) [day], from (string), to (string), exchange (string) options - Options Market Data params: symbol* (string), sort_by (string) [open_interest, volume_24h], order (string) [asc, desc] price - Token Price History params: symbol* (string), time_range (string), from (string), to (string), currency (string) price-indicator - Technical Indicator params: indicator* (string), symbol* (string), interval (string), exchange (string) [binance, bybit, coinbase, kraken], from (string), to (string), options (string) public-sale - Public Sale / Crowdsale params: id (string), q (string) ranking - Token Rankings params: sort_by (string) [market_cap, change_24h, volume_24h], order (string) [asc, desc], category (string), limit (integer), offset (integer) tge - Token Generation Event params: id (string), q (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds context about the tool's scope and lists commands, but it does not disclose additional behaviors such as rate limits, pagination, response shapes, or error handling. It does not contradict the annotations, so a mid-level score is appropriate.
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 long but well-structured with a front-loaded purpose sentence and a consistent, readable format for the 15 commands. Each line adds necessary details (params, enums, required markers), though some redundancy exists (e.g., repeating 'string' everywhere). The length is justified by the tool's complexity, and it earns its place without being wasteful.
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 the large number of subcommands (15) and the absence of both an output schema and detailed schema properties, the description provides a solid overview of capabilities and complete parameter lists. However, it does not describe the return format or data structure for individual commands, which is a notable gap since there is no output schema to clarify this. The overview partially addresses this, so a 4 is appropriate.
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 only defines a generic 'params' object with no properties, leaving 0% coverage. The description compensates thoroughly by listing every command with parameter names, required indicators (asterisk), enum values, and types. This is essential, high-value documentation that the schema completely lacks, making the tool usable.
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 an explicit purpose: 'Use this when the user needs market data from Surf,' followed by a detailed enumeration of the data types it covers (rankings, derivatives, ETF flows, liquidations, technical indicators, on-chain metrics, Fear & Greed). This is a specific verb+resource+scope statement that clearly differentiates the tool from sibling tools focused on other domains like DEX, news, or wallets.
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 opening line provides general context ('Use this when the user needs market data'), but it does not explicitly mention when NOT to use it or suggest alternatives. Sibling tools such as surf_onchain, surf_exchange, and surf_token overlap in areas like on-chain indicators and exchange data, and the description does not clarify boundaries. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_newsSurf NewsARead-only
Use this when the user needs news data from Surf. Stay up to date with crypto news. Browse the latest articles from major crypto media outlets, read full article content, and search across all sources by keyword.
Commands: detail - News Article Detail params: id* (string) feed - Crypto News Feed params: source (string), project (string), from (string), to (string), sort_by (string) [recency, trending], limit (integer), offset (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds behavioral context by stating the tool reads articles, fetches full content, and searches sources, which is consistent and adds value 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 efficiently structured with a usage line, a capability summary, and a command list. It is scannable and each line adds operational detail without unnecessary fluff.
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?
The description covers the commands and their parameters but lacks details like date formats, default values, or response structure. Since there is no output schema, this is a notable gap, though the description provides a solid baseline for a read-only news tool.
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 0% coverage for the 'params' object, but the description compensates by listing each command's parameters with types and a few enum values (e.g., sort_by: recency, trending). It also marks id* as required and includes limit/offset for pagination, which is a good compensation.
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 clearly identifies the tool as providing crypto news data, with capabilities to browse articles, read full content, and search by keyword. It distinguishes itself from sibling tools by its focus on news, though it doesn't explicitly name alternatives.
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 starts with 'Use this when the user needs news data from Surf,' which is an explicit usage signal. It also differentiates commands by listing 'detail' and 'feed' with their respective parameters, providing operational guidance, though no alternative tools are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_onchainSurf OnchainA
Use this when the user needs onchain data from Surf. Query blockchain data directly. Look up transaction details by hash, check gas prices, and run structured or raw SQL queries against indexed blockchain datasets spanning Ethereum, Base, Solana, and more.
Commands: bridge-ranking - Bridge Protocol Ranking params: time_range (string) [7d, 30d, 90d, 180d, 1y, all], limit (integer), offset (integer) dex-activity - DEX Protocol Activity params: chain* (string) [ethereum, base, bsc, arbitrum, tron], project (string), address (string), time_range (string) [1d, 7d, 30d, 90d], from (string), to (string), group_by (string) [total, day] gas-price - Current Gas Price params: chain* (string) structured-query - Blockchain Structured Query params: $schema (string), fields (array,null), filters (array,null), limit (integer), offset (integer), sort (array,null), source* (string) schema - On-Chain Table Schema params: table (string) sql - Blockchain SQL Query params: $schema (string), max_rows (integer), sql* (string) sql-job-create - Submit Asynchronous Blockchain SQL Job params: $schema (string), max_rows (integer), sql* (string) sql-job-get - Get Asynchronous Blockchain SQL Job params: job_id* (string) sql-job-results - Download Asynchronous Blockchain SQL Results params: job_id* (string), format (string) [json, csv] sql-preflight - Preflight Blockchain SQL Query params: $schema (string), max_rows (integer), sql* (string) tx - Transaction Details by Hash params: hash* (string), chain* (string), include (string) yield-ranking - Yield Pool Ranking params: project (string), sort_by (string) [apy, tvl_usd], order (string) [asc, desc], limit (integer), offset (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations (readOnlyHint=false, etc.) offer minimal safety context. The description adds command-level detail but does not disclose potential side effects of SQL job submission or rate limits, nor does it specify that queries are read-only. This is adequate but not exemplary.
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 summary paragraph and a structured list of commands. It is relatively long due to 12 commands, but each line is terse and front-loaded with the usage directive. The structure aids quick scanning.
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 the tool's complexity (12 commands) and lack of output schema, the description covers the command inventory and parameter names/types but omits parameter meanings and return values. This leaves gaps for successful invocation without further research.
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 is generic (command + params object), so the description carries the burden. It lists every command's parameters with types and some enums (e.g., chain options for dex-activity and gas-price), which is valuable. Yet many parameters like $schema or source are left unexplained, reducing full semantic clarity.
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 'Use this when the user needs onchain data from Surf' and elaborates with concrete capabilities like transaction hash lookups, gas prices, and SQL queries across Ethereum, Base, Solana, and more. This clearly distinguishes it from sibling tools focused on specific protocols or markets.
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 provides a clear 'Use this when' directive for onchain data needs and enumerates subcommands (e.g., gas-price, tx) for specific use cases. However, it does not explicitly contrast with sibling tools or state when not to use this tool, so it lacks the explicit when-not guidance that would merit a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_prediction_marketSurf Prediction MarketARead-only
Use this when the user needs prediction market data from Surf. Track prediction markets on Polymarket and Kalshi. Browse events and markets, view live prices and odds, analyze trading volume and open interest history, inspect individual trades, and discover top-ranked markets by activity.
Commands: analytics - Prediction Market Analytics params: category (string), platform (string) [polymarket, kalshi], time_range (string) [7d, 30d, 90d, 180d, 1y], top_n (integer), sort_by (string) [volume_7d, whale_flow_net_7d, price_change_7d, oi_change_7d], order (string) [asc, desc], limit (integer), offset (integer) correlations - Market Correlations params: category* (string), condition_id (string), min_correlation (number), limit (integer), offset (integer) kalshi-events - Kalshi Events params: event_ticker (string), limit (integer), offset (integer) kalshi-markets - Kalshi Markets params: market_ticker (string), limit (integer), offset (integer) kalshi-open-interest - Kalshi Open Interest History params: ticker* (string), time_range (string) [7d, 30d, 90d, 180d, 1y] kalshi-orderbooks - Kalshi Orderbook History params: ticker* (string), start_time (integer), end_time (integer), limit (integer), pagination_key (string) kalshi-prices - Kalshi Price History params: ticker* (string), time_range (string) [7d, 30d, 90d, 180d, 1y], interval (string) [1h, 1d, latest] kalshi-trades - Kalshi Trades params: ticker* (string), taker_side (string) [yes, no], min_amount (integer), from (string), to (string), sort_by (string) [timestamp, notional_volume_usd], order (string) [asc, desc], limit (integer), offset (integer) kalshi-volumes - Kalshi Volume History params: ticker* (string), time_range (string) [7d, 30d, 90d, 180d, 1y] matching-market-daily - Cross-Platform Daily Comparison (Polymarket <> Kalshi) params: polymarket_condition_id* (string), kalshi_market_ticker* (string), time_range (string), limit (integer), offset (integer) matching-market-pairs - Cross-Platform Prediction Market Matcher (Polymarket <> Kalshi) params: category (string), match_type (string) [exact, related], active_only (boolean), min_confidence (integer), polymarket_condition_id (string), kalshi_market_ticker (string), sort_by (string) [confidence, polymarket_volume, kalshi_volume, spread_pct], order (string) [asc, desc], limit (integer), offset (integer) polymarket-events - Polymarket Events params: event_slug* (string), limit (integer), offset (integer) polymarket-leaderboard - Polymarket Leaderboard params: sort_by (string) [pnl, volume, trade_count], order (string) [asc, desc], limit (integer), offset (integer) polymarket-markets - Polymarket Markets params: market_slug* (string), limit (integer), offset (integer) polymarket-open-interest - Polymarket Open Interest History params: condition_id* (string), time_range (string) [7d, 30d, 90d, 180d, 1y] polymarket-orderbooks - Polymarket Orderbook History params: token_id* (string), start_time (integer), end_time (integer), limit (integer), pagination_key (string) polymarket-positions - Polymarket Wallet Positions params: address* (string), limit (integer), offset (integer) polymarket-price-ohlcv - Polymarket OHLCV Candlesticks params: condition_id* (string), start_time (integer), end_time (integer), interval (integer) polymarket-prices - Polymarket Price History params: condition_id* (string), time_range (string) [7d, 30d, 90d, 180d, 1y], interval (string) [1h, 1d, latest] polymarket-smart-money - Polymarket Smart Money params: view (string) [positioning, trades], condition_id (string), category (string), direction (string) [bullish, bearish, neutral], whale_tier (string) [whale, large, mega], from (string), to (string), sort_by (string) [smart_wallets_involved, smart_buy_volume_usd, smart_sell_volume_usd, amount_usd, block_time], order (string) [asc, desc], limit (integer), offset (integer) polymarket-trades - Polymarket Trades params: condition_id (string), address (string), type (string) [trade, redemption, all], outcome_label (string) [Yes, No], min_amount (number), from (string), to (string), sort_by (string) [timestamp, notional_volume_usd], limit (integer), offset (integer) polymarket-volume-split - Polymarket Volume Split (YES/NO) params: condition_id* (string), granularity (string) [hour, day, week], start_time (integer), end_time (integer) polymarket-volumes - Polymarket Volume History params: condition_id (string), token_id (string), time_range (string) [7d, 30d, 90d, 180d, 1y], interval (string) [1h, 1d], granularity (string) [day, week, month, year, all], start_time (integer), end_time (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds scope (what data is accessible) but does not disclose additional behavioral aspects such as rate limits, pagination behavior, data freshness, or any side effects. It is consistent with annotations, so 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 long but well-structured as a command reference with consistent formatting and a clear opening purpose statement. Each command line provides necessary parameter information, so length is justified by the tool's 23 subcommands. It is not overly verbose for the complexity it covers.
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 the tool's complexity (23 commands) and minimal schema/annotations, the description provides substantial parameter details and clearly enumerates all available operations. It lacks examples of response structures or workflow guidance, but the command names and parameter lists suffice for basic selection and invocation. The absence of an output schema means return values are not required to be explained.
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 only has a generic 'params' object and a command enum, providing zero parameter-level documentation. The description compensates by listing each command's expected parameters with types and allowed enums (e.g., platform, time_range, sort_by), and marks required parameters with *, enabling an agent to construct valid calls despite the schema being underspecified.
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 clearly identifies the tool as providing prediction market data for Polymarket and Kalshi, with specific actions like browsing events/markets, viewing prices/odds, and analyzing volume/open interest. This distinguishes it from sibling tools focused on other domains (e.g., surf_dex, surf_exchange) by naming a specific resource and scope.
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 opening sentence explicitly states 'Use this when the user needs prediction market data from Surf,' providing a clear usage context. However, it does not directly mention alternatives or when not to use the tool, though the command list internally guides between Polymarket and Kalshi subcommands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_projectSurf ProjectARead-only
Use this when the user needs project data from Surf. Research crypto projects in depth. Retrieve aggregated project profiles covering overview, team, funding rounds, tokenomics, social links, and TGE status. Track DeFi protocol metrics like TVL, fees, revenue, trading volume, and active users over time.
Commands: ai-news - Project AI News params: id (string), q (string), limit (integer), offset (integer), lang (string) [en, zh, ja, kr] defi-metrics - Project DeFi Metrics params: id (string), q (string), metric (string) [volume, fee, fees, revenue, tvl, users], from (string), to (string), chain (string), limit (integer), offset (integer) defi-ranking - DeFi Protocol Ranking params: metric* (string) [tvl, revenue, fees, volume, users], limit (integer), offset (integer) detail - Aggregated Project Detail params: id (string), x_id (string), handle (string), q (string), fields (string) pulse - Project Pulse [Deprecated] params: id (string), q (string), limit (integer), offset (integer), lang (string) [en, zh, ja, kr]
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive. The description adds behavioral context by detailing the command-dispatch structure, listing subcommands, and flagging 'pulse' as deprecated. It does not cover pagination behavior or auth requirements, but adds meaningful value beyond 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 purpose and then provides a structured command reference. Each command is limited to one line with its parameters, and the deprecated command is clearly marked. It is longer than minimal but appropriately sized for a multi-command dispatcher.
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 the tool's complexity (command enum, free-form params, no output schema), the description provides enough command-specific detail, including parameter hints and deprecation, to be usable. It stops short of explaining return values or parameter semantics, but is reasonably complete for tool selection and 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?
The input schema only defines a generic 'params' object, giving 0% coverage. The description compensates by listing parameters for each command, including types and enums (e.g., metric, lang). However, it does not explain the meaning of ambiguous parameters like 'q' or 'fields'.
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 clearly states this tool is for retrieving project data from Surf, covering aggregated profiles, funding, tokenomics, and DeFi metrics. It distinguishes itself from the sibling tools by focusing on 'project data' and 'DeFi protocol metrics', but it does not explicitly name alternatives.
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 opens with 'Use this when the user needs project data from Surf' and then enumerates commands for different project-related queries. It gives clear context for when to use the tool but does not explicitly state when not to use it or name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_searchSurf SearchARead-only
Use this when the user needs search data from Surf. Find anything across Surf's data universe. Search for crypto projects, news articles, wallet addresses, web pages, investment funds, airdrop opportunities, and prediction market events — all from a single unified search interface.
Commands: airdrop - Airdrop Search params: q (string), phase (string), reward_type (string) [airdrop, points, whitelist, nft, role, ambassador], task_type (string), has_open (boolean), sort_by (string) [total_raise, xscore, last_status_update], order (string) [asc, desc], limit (integer), offset (integer), include_tasks (boolean) airdrop-activities - Airdrop Activities params: limit (integer), offset (integer) events - Project Event Search params: id (string), q (string), type (string), limit (integer), offset (integer) fund - Fund Search params: q* (string), limit (integer), offset (integer) fundraising - Fundraising Event Search params: q (string), from (string), to (string), source (string) [social, news], lang (string) [en, zh, ja, kr], min_importance (integer), sort_by (string) [recency, relevance, importance], order (string) [asc, desc], limit (integer), offset (integer) news - News Article Search params: q* (string), limit (integer), offset (integer) prediction-market - Search Prediction Markets params: condition_id (string), market_ticker (string), platform (string) [polymarket, kalshi], category (string), status (string) [active, closed, finalized], sort_by (string) [volume_1d, volume_7d, volume_30d, open_interest, trade_count_7d, days_to_resolution], order (string) [asc, desc], smart_money (string) [bullish, bearish], q (string), limit (integer), offset (integer) project - Project Search params: q* (string), limit (integer), offset (integer) token - Token Symbol Resolution params: q* (string), chain (string), limit (integer), offset (integer) wallet - Wallet Search params: q* (string), limit (integer), offset (integer) web - Web Search params: q* (string), limit (integer), offset (integer), site (string), include_content (boolean)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the multi-command structure and per-command parameter details but does not provide additional behavioral context like pagination behavior, rate limits, or return format.
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 opens with a concise directive, then presents a structured command list. It is somewhat long due to the many subcommands, but the list format is efficient and each line carries necessary parameter information. Front-loading of the core purpose is good.
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 multi-command search tool with no output schema, the description provides substantial detail: all commands, their parameters, and enums. However, it lacks information about return values, pagination defaults, or constraints like how 'params' object is interpreted. Given the complexity, it is fairly complete but not exhaustive.
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 schema only defines 'command' and a generic 'params' object, so description coverage is 0%. The description compensates by listing every command's specific parameters, including required markers (q*) and enums for several fields. It adds significant meaning beyond the schema, though it doesn't explain what each parameter semantically represents.
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 clearly states the tool performs unified search across Surf's data universe, listing specific categories (crypto projects, news, wallets, etc.). This distinguishes it from domain-specific siblings like surf_news or surf_token.
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 explicitly says 'Use this when the user needs search data from Surf' and enumerates search types, giving clear context. However, it does not explicitly mention when not to use it or compare to specific sibling tools, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_signalSurf SignalARead-only
Use this when the user needs signal data from Surf. Explore ranked project signal score snapshots, token-of-day/week highlights, and project-level signal cards with latest price, price-change, dimension scores, compact signals, and AI summaries.
Commands: detail - Signal Detail params: id (string), project_slug (string), time_range (string) [24h, 7d] projects - Signal Projects params: time_range (string) [24h, 7d], limit (integer), offset (integer) token-of-the-day - Signal Token Of The Day params: limit (integer), offset (integer) token-of-week - Signal Token Of The Week params: limit (integer), offset (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description goes beyond annotations by listing the four commands (detail, projects, token-of-the-day, token-of-week) and the data types included (latest price, price-change, dimension scores, compact signals, AI summaries). It does not mention pagination or default time_range values, but the command structure adds real value.
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 the primary use case, followed by a succinct command reference. The command list earns its place due to the multi-command structure. There is no redundant or filler content, making it appropriately sized for the tool's complexity.
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?
There is no output schema, so the description must convey what the tool returns. It provides a high-level overview (signal cards with latest price, price-change, dimension scores, AI summaries) and enumerates commands with parameters. However, it does not detail per-command output differences or response formats, leaving a minor gap for a 4-command tool.
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 schema has 0% description coverage and only provides a generic 'params' object. The description fully compensates by listing each command's parameters explicitly with types and enums (e.g., id, project_slug, time_range with [24h, 7d], limit, offset). This gives the agent complete parameter semantics that the schema alone would not convey.
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 states a specific purpose: 'Use this when the user needs signal data from Surf' and elaborates with 'Explore ranked project signal score snapshots...'. The verb 'explore' and resource 'signal data' distinguish it clearly from sibling tools like surf_dex or surf_news, which focus on other domains.
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 an explicit trigger condition: 'Use this when the user needs signal data from Surf'. This gives clear context for when to use the tool. However, it does not mention alternatives or when not to use it, so it stops short of a full when/when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_tokenSurf TokenARead-only
Use this when the user needs token data from Surf. Analyze individual tokens on-chain. Look up top holders and their share of supply, track ERC-20/SPL token transfers, browse DEX swap history, and view upcoming token unlock schedules with allocation breakdowns.
Commands: dex-trades - Token DEX Trade History params: address* (string), chain (string) [ethereum, base, bsc, arbitrum, tron], limit (integer), offset (integer), include (string) holders - Token Holders params: address* (string), chain* (string), limit (integer), offset (integer), include (string) tokenomics - Token Unlock Schedule params: id (string), symbol (string), from (string), to (string) transfer-counterparties - Top Transfer Counterparties params: address* (string), chain* (string) [ethereum, base, bsc, arbitrum, tron], direction* (string) [to, from], metric (string) [count, amount, amount_usd], time_range (string) [1d, 7d, 30d, 90d], limit (integer), offset (integer), include (string), exclude_labels (string) transfer-stats - Token Transfer Activity Summary params: address* (string), chain* (string) [ethereum, base, bsc, arbitrum, tron], time_range (string) [1d, 7d, 30d, 90d], include (string) transfers - Token Transfer History params: address* (string), chain* (string) [ethereum, base, solana, tron, bsc, arbitrum], from (string), to (string), limit (integer), offset (integer), include (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only and non-destructive. The description adds valuable detail about what operations can be performed (holders, transfers, DEX trades, tokenomics), but does not disclose anything beyond that, such as rate limits, pagination behavior, or response format. It adds some context but not deep behavioral transparency.
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 long but well-structured with command headings and parameter lists, making it scannable. It front-loads the main use case and each section serves a purpose. Slight overhead from repeating chain lists across commands, but overall efficient for the tool's complexity.
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 no output schema, the description covers input parameters thoroughly but offers little about what outputs look like or how results are returned. It mentions the kind of data (top holders, transfer stats) but not structure or pagination details. For a multi-command tool, this leaves some gaps in completeness.
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 only defines 'command' and 'params' as generic objects with zero coverage. The description compensates fully by listing every available command and its parameters, including required markers, allowed enums for chain, direction, metric, and time_range, plus types. This is far beyond what the schema provides, making it highly informative.
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 clearly states the tool's purpose: 'Use this when the user needs token data from Surf.' It specifies exact capabilities like analyzing token holders, transfers, DEX trades, and token unlock schedules. This distinguishes it from sibling tools that focus on DEX, wallet, or market data.
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?
Provides an explicit 'when to use' statement in the first line. It does not explicitly mention when not to use it or name alternative tools, but the specific subcommands and scope make usage context clear. Lacks exclusionary guidance, hence not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_walletSurf WalletARead-only
Use this when the user needs wallet data from Surf. Inspect any wallet on Ethereum, Base, Solana, and other chains. View token balances, NFT holdings, entity labels, transfer history, full transaction logs, DeFi protocol positions (lending, staking, LP), and net worth trends over time.
Commands: detail - Aggregated Wallet Detail params: address* (string), chain (string), fields (string) history - Wallet Transaction History params: address* (string), chain (string), limit (integer), offset (integer), before (integer), sort_by (string) [timestamp, value], order (string) [asc, desc], include (string) labels-batch - Wallet Labels (Batch) params: addresses* (string) net-worth - Wallet Net Worth History params: address* (string) protocols - Wallet DeFi Protocol Positions params: address* (string), limit (integer), offset (integer) transfers - Wallet Transfer History params: address* (string), chain (string) [ethereum, base, solana, tron, bsc, arbitrum], flow (string) [in, out], token (string), limit (integer), offset (integer), include (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context such as the ability to inspect 'any wallet' across multiple chains, view token balances, NFTs, transaction logs, and net worth trends. It doesn't mention rate limits, response pagination, or authentication, but those are less critical given 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 efficiently structured: a brief front-loaded purpose statement followed by a compact command list with parameters. Every sentence earns its place, and the formatting is consistent and scannable. It provides comprehensive information without unnecessary prose.
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 no output schema, the description adequately outlines what data is available (balances, NFTs, labels, history, protocols, net worth) and defines all commands. It lacks explicit return value specifications per command, but the overview is sufficient for most usage. Given the complexity of the tool, the description is quite complete.
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 is minimal (only command and free-form params), and schema coverage is 0%. The description compensates by providing detailed parameter lists for each command, including enums for chain, sort_by, order, and flow, and specifying required fields (address*). This adds significant meaning beyond the schema and enables proper tool invocation.
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 clearly states the tool's function with a specific verb ('Inspect any wallet') and resource ('wallet data from Surf'), and the list of commands (detail, history, etc.) enriches the purpose. It distinguishes from sibling tools by focusing specifically on wallet data across chains and DeFi positions.
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 ('Use this when the user needs wallet data from Surf') and covers a range of sub-uses (balances, NFTs, history, protocols). It doesn't explicitly name alternatives or exclusions, but the context is clear and the commands provide guidance on selecting the right sub-command.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_webSurf WebBRead-only
Use this when the user needs web data from Surf. Fetch and search web content. Retrieve any URL and convert it to clean, LLM-friendly markdown, or search the internet for crypto-related articles, reports, and resources.
Commands: fetch - Web Page Fetch params: url* (string), target_selector (string), remove_selector (string), wait_for_selector (string), timeout (integer)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, so the tool's safety profile is known. The description adds useful context such as converting to 'LLM-friendly markdown' and targeting 'crypto-related' content, which is helpful. However, it does not disclose potential limitations, rate limits, or behavior beyond what annotations imply.
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 reasonably sized and structured with a purpose statement and a Commands section. However, it redundantly states 'Fetch and search web content' immediately before detailing the fetch command, and the search functionality is not properly documented. The structure could be tightened.
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 0% schema coverage and no output schema, the description carries the full burden. It details fetch parameters but omits search parameters, return format, error behavior, and any usage caveats. The tool's complexity (multiple operations) is not fully covered, leaving gaps for the agent.
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 parameter descriptions (coverage 0%), and the description only lists parameter names (url*, target_selector, etc.) without explaining their meaning or format. For example, 'target_selector' is left ambiguous. The description partially compensates by listing names, but it lacks the depth needed for confident invocation.
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 clearly states the tool 'Fetch and search web content' and 'Retrieve any URL and convert it to clean, LLM-friendly markdown'. It distinguishes itself from sibling tools by focusing on general web data rather than a specific domain (e.g., surf_dex, surf_token). The verb+resource combination is specific enough, though 'web data' is broad.
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 opening line 'Use this when the user needs web data from Surf' provides a clear usage context. However, it does not explicitly mention when not to use this tool or alternatives like surf_news or surf_token. The command list gives some guidance (fetch for web page fetching) but lacks a search command, despite search being mentioned in the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
surf_xSurf XARead-only
Use this when the user needs x data from Surf. Retrieve X posts and author details by numeric post ID.
Commands: tweets - X Tweets by IDs params: ids* (string)
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| command | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only nature is covered. The description adds that it retrieves by numeric post ID and returns author details, but does not disclose other behaviors like pagination or error handling. This is adequate but not rich.
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 concise and front-loaded with the usage guideline. The command listing is terse but straightforward, and every part earns its place. No unnecessary filler.
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 tool with one command and good annotations, the description covers the core purpose. However, it lacks details on how to pass multiple IDs, the exact response format, and any limitations. The missing output schema and vague parameter explanation leave some gaps, but overall it is adequate.
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 compensate. It mentions 'params: ids* (string)' which gives the parameter name and type, but it is ambiguous whether ids is a single string or an array, and it does not explain the structure of the params object relative to the command. The description adds some meaning but not enough for full clarity.
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 clearly states the tool retrieves X posts and author details by numeric post ID, which is a specific verb+resource+scope. It distinguishes from sibling tools by focusing on X/Twitter data, though it does not explicitly name alternatives.
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 opens with 'Use this when the user needs x data from Surf', providing a clear context for when to use the tool. It does not mention exclusions or alternatives, but the context is sufficient for a simple read-only tool.
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. Dates show when Glama detected each change.
15 tool updates
v0.2.0- First observed
surf_dex - First observed
surf_exchange - First observed
surf_fund - First observed
surf_hyperliquid - First observed
surf_market - First observed
surf_news - First observed
surf_onchain - First observed
surf_prediction_market - First observed
surf_project - First observed
surf_search - First observed
surf_signal - First observed
surf_token - First observed
surf_wallet - First observed
surf_web - First observed
surf_x
TDQS
Each top-level tool has a distinct domain prefix (dex, exchange, market, prediction_market, etc.), but there is some overlap: surf_dex and surf_hyperliquid both provide DEX data, and surf_market vs surf_exchange could be confused for price/derivatives data. Descriptions generally help clarify the boundaries.
All tools follow the consistent 'surf_<domain>' naming pattern, and subcommands use lowercase hyphenated names. The convention is uniform across the entire set, making it predictable and easy to navigate.
15 tools is within the ideal 3-15 range, and each tool represents a coherent data domain (market, wallet, token, onchain, etc.). The count feels well-scoped for the server's broad crypto data aggregation purpose.
The tool surface covers a wide range of crypto data needs: market, exchange, DEX, prediction markets, onchain, wallet, token, project, fund, news, search, and web. Minor gaps exist (e.g., surf_dex only offers OHLCV, surf_x only fetches tweets by ID), but these are partial gaps within subdomains rather than severe dead ends.
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
Crypto MCP with 21 tools for market data, DeFi, analytics, and sentiment. Post-paid USDC billing.
Production-grade MCP gateway delivering 8 real-time AI tools with instant x402 micropayments settled in USDC on Base Mainnet or SPL-USDC on Solana. Features Basescan contract auditing, wallet analytics, headless browser scraping, and pre-scraped oracle data feeds.
Production-grade MCP gateway delivering 8 real-time AI tools with instant x402 micropayments settled in USDC on Base Mainnet or SPL-USDC on Solana. Features Basescan contract auditing, wallet analytics, headless browser scraping, and pre-scraped oracle data feeds.
Crypto trading intelligence MCP — 34+ endpoints, x402 pay-per-use, AI agent strategy & execution
Related MCP Servers
- AlicenseAqualityDmaintenanceA comprehensive cryptocurrency market-data MCP server with 49 tools across six data sources, enabling LLMs to answer market questions via natural language.49MIT
- FlicenseNot gradedqualityDmaintenanceExposes Musashi market intelligence as MCP tools for clients like Claude and ChatGPT, enabling text analysis, arbitrage detection, market movers, wallet activity, and smart money tracking.-
- FlicenseNot gradedqualityCmaintenanceEnables MCP-compatible AI clients to access live crypto market data and AI-driven quantitative analysis, with structured outputs and full observability.-
- FlicenseNot gradedqualityBmaintenanceEnables fetching live crypto market data from Binance, Bybit, and Hyperliquid via MCP tools, including klines, orderbook, funding rates, technical indicators, and market breadth for real-time analysis by LLMs.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/asksurf-ai/surf-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server