Skip to main content
Glama

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.json in project root or ~/.claude.json

  • Claude 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@surf

The 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-mcp

Register 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:http

The server exposes:

  • POST /mcp — stateless MCP Streamable HTTP endpoint

  • GET /healthz — deployment health check

  • GET /.well-known/oauth-protected-resource — OAuth resource metadata (RFC 9728); returns 404 until SURF_OAUTH_AUTHORIZATION_SERVER is 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:

  1. The incoming Authorization header, forwarded as-is

  2. The deployment's SURF_API_KEY service key (Bearer scheme)

  3. Anonymous — the Surf API's per-IP allowance applies

Environment variables for OAuth discovery and login:

Variable

Purpose

SURF_OAUTH_AUTHORIZATION_SERVER

Base URL of the Surf OAuth authorization server. Unset (default) keeps the metadata endpoint dark.

SURF_MCP_RESOURCE_URL

Public URL of this MCP deployment (default https://mcp.asksurf.ai).

SURF_MCP_REQUIRE_AUTH

1/true makes /mcp answer credential-less requests with 401 + WWW-Authenticate, which is what makes MCP clients open the OAuth login in the user's browser. Requires the discovery endpoint to be live.

Deployment modes:

SURF_OAUTH_AUTHORIZATION_SERVER

SURF_MCP_REQUIRE_AUTH

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-mcp

The 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

surf_dex

token-price

DEX-pool-weighted token OHLCV data

surf_market

price, ranking, etf, futures, options, fear-greed, liquidation-*, onchain-indicator, price-indicator

Market overview, rankings, indicators, ETF flows

surf_exchange

depth, klines, funding-history, perp, price, markets, long-short-ratio

Live exchange data from Binance, OKX, Bybit, etc.

surf_hyperliquid

leaderboard, positions, orders, fills, trades, performance

Hyperliquid trader, position, order, fill, and P&L data

surf_wallet

detail, transfers, history, net-worth, protocols, labels-batch

Wallet balances, transfers, DeFi positions

surf_token

holders, dex-trades, transfers, tokenomics

Token holder analysis, DEX trades, unlocks

surf_x

tweets

X post and author details by post ID

surf_project

detail, defi-metrics, defi-ranking

Project profiles, DeFi TVL/fees/revenue

surf_signal

detail, projects, token-of-the-day, token-of-week

Project signal scores and ranked highlights

surf_onchain

sql, tx, gas-price, schema, bridge-ranking, yield-ranking, structured-query

On-chain SQL queries, tx lookup, gas prices

surf_search

project, wallet, news, web, fund, polymarket, kalshi, airdrop, events, social-people, social-posts

Unified search across all data types

surf_prediction_market

kalshi-*, polymarket-*, matching-*, category-metrics

Polymarket and Kalshi prediction markets

surf_fund

detail, portfolio, ranking

Crypto VC fund profiles and portfolios

surf_news

feed, detail

Crypto news from major outlets

surf_web

fetch

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:

  1. Fetches the OpenAPI spec from https://api.asksurf.ai/gateway/openapi.json (cached for 24h)

  2. Groups all operations by their API tag

  3. Registers one MCP tool per tag with auto-generated descriptions and command enums

  4. 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 check

License

MIT

Available Tools

15 tools
surf_dexSurf DEXA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 ExchangeA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 FundA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 HyperliquidA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MarketA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 NewsA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 MarketA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ProjectA
Read-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]

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_signalSurf SignalA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 TokenA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 WalletA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 WebB
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

B3/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 XA
Read-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)

ParametersJSON Schema
NameRequiredDescriptionDefault
paramsNo
commandYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 15 tool updatesv0.2.0
    • First observedsurf_dex
    • First observedsurf_exchange
    • First observedsurf_fund
    • First observedsurf_hyperliquid
    • First observedsurf_market
    • First observedsurf_news
    • First observedsurf_onchain
    • First observedsurf_prediction_market
    • First observedsurf_project
    • First observedsurf_search
    • First observedsurf_signal
    • First observedsurf_token
    • First observedsurf_wallet
    • First observedsurf_web
    • First observedsurf_x

TDQS

A3.9/5.0
Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A comprehensive cryptocurrency market-data MCP server with 49 tools across six data sources, enabling LLMs to answer market questions via natural language.
    49
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Exposes 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.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP-compatible AI clients to access live crypto market data and AI-driven quantitative analysis, with structured outputs and full observability.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables 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

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