Server has 30 tools with complete schemas and reasonable descriptions, but definition quality is inconsistent. All tools are READ_ONLY and properly registered with JSON Schema. However, many descriptions are generic and lack actionable context for LLM selection. Parameter descriptions are often minimal (1-2 words). No output schemas are documented. Error handling is basic (error results returned but no recovery guidance). Tool naming is consistent (verb_noun pattern) but many tools could be better distinguished. No parameter validation guidance for complex filters or dependencies. The server demonstrates basic competence but lacks the polish of production-grade tools.
Tools (30)
get_account_pnlread onlyauthsource verified73/100
Get a trader's P&L and performance metrics from the Beefy P&L subgraph
get_clob_last_trade_priceread only50/100
Get the last trade price for a token (CLOB API)
get_clob_marketread onlysource verified75/100
Get market details from CLOB API
get_clob_midpointread only50/100
Get the midpoint price (average of best bid and ask) for a token (CLOB API)
get_clob_order_bookread only50/100
Get the full order book for a token (CLOB API)
get_clob_priceread only50/100
Get current price for a market outcome (CLOB API)
get_clob_price_historyread only50/100
Get historical price data for a token (CLOB API)
get_clob_prices_batchread only50/100
Get prices for multiple tokens in a single request (CLOB API)
Output schemas not documented. No tools declare what fields they return, forcing LLMs to infer structure from JSON responses. This violates pattern:tool and mxe:response-field-naming.
Document output schemas for ALL tools. Use a TypeScript interface or JSON Schema comment block to declare what fields each tool returns. Example: 'Returns { id: string, price: number, timestamp: ISO8601 }'.
Expand parameter descriptions to 30-60 characters. Include context for when to use the parameter, constraints, and dependencies. Example: 'first: Number of markets to return (1-100). Defaults to 10. Use pagination when expecting >100 results; include orderBy and orderDirection for consistent ordering.'
Add recovery guidance to error messages. Example: errorResult('Account not found. Try search_accounts() or provide a valid Ethereum address (0x...).').
Consolidate overlapping CLOB tools into a single get_clob_data(tokenId, dataType: 'price'|'midpoint'|'spread'|'orderbook'|'history', side?, interval?) tool. This reduces tool count, eliminates ambiguity, and simplifies agent reasoning.
Document pagination strategy in list_* and get_*_history tools. Include: 'Pagination: Results are ordered by [field] in [direction]. Use the 'first' parameter (default 20, max 100). To fetch beyond 100 results, call again with 'after' parameter set to the last ID from the previous response.'
Add input validation and sanitization for query_subgraph. Return a clear error for malformed queries: 'GraphQL query validation failed: [error]. Ensure your query is valid GraphQL syntax and only accesses documented fields from the [subgraph] schema. Call get_subgraph_schema() first to see available fields.'
Score history
Overall score trend
↑ 26 points across a rubric change (v1 → v2)
49/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
49
2026-07-28+
v2
2026-03-09
F
23
-
v1
get_clob_spreadread only50/100
Get bid-ask spread for a token (CLOB API)
get_daily_statsread onlyauthsource verified78/100
Get daily platform statistics (volume, fees, traders, new markets, resolutions) from the Beefy P&L subgraph
get_eventread only50/100
Get event details by ID (Gamma API)
get_market_by_condition_idread only50/100
Get market details by condition ID (Gamma API)
get_market_by_slugread only50/100
Get market details by slug (Gamma API)
get_market_dataread onlyauthsource verified78/100
Get Polymarket market/condition data including outcomes and volumes from the Main subgraph
Get a user's current positions from the Slimmed P&L subgraph. Falls back gracefully if indexers are behind.
get_v2_market_tradesread onlyauth50/100
Get trades from the V2 Orderbook (post-migration 2026-04-28) for a specific market
list_eventsread only50/100
List Polymarket events (Gamma API)
list_subgraphsread onlyauthsource verified85/100
List all available Polymarket subgraphs with descriptions and key entities
query_subgraphread onlyauthsource verified80/100
Execute a custom GraphQL query against a Polymarket subgraph
search_marketsread onlysource verified80/100
Search for Polymarket markets by keyword (Gamma API)
Many parameter descriptions are minimal or generic (1-5 words). Examples: 'Ethereum address of the trader (lowercase)', 'Field to order by', 'Time interval (e.g., 1h, 1d)'. These lack context about when to use the tool, dependencies, or constraints beyond the type annotation.
No error recovery guidance. errorResult() returns a bare error message without actionable next steps. Pattern says: 'Error responses must tell the LLM what to do next'. Example: 'User not found. Try search_users().'
Tool naming has overlapping categories. Multiple get_clob_* tools do similar things (get_clob_price, get_clob_prices_batch, get_clob_midpoint, get_clob_spread, get_clob_last_trade_price). LLMs struggle to disambiguate. Consider grouping into a single get_clob_data tool with a 'dataType' parameter or clearer naming.
No pagination or result-limiting guidance in tool descriptions. Tools like get_market_data, list_events, get_top_traders accept 'first' parameters but descriptions do not explain pagination strategy, total count, or whether results are truncated. Pattern mxe:enforce-result-limits requires explicit limits.
query_subgraph accepts arbitrary 'variables' as an unvalidated object. This is a prompt-injection risk if agents construct queries from user input. No guidance on safe GraphQL query construction or injection prevention.
query_subgraph
Add tool annotations (readOnlyHint, idempotentHint) via toolAnnotations property. All tools are read-only and idempotent, declare this explicitly in the schema so LLMs know these are safe to retry.
Return structured response envelopes. Instead of bare JSON, return { success: true, data: {...}, meta: { totalCount?, nextCursor?, timestamp } } so LLMs can reliably extract metadata and pagination info.
Add context to distinguish Polymarket eras (V1 vs V2). Tool descriptions should mention when data was last updated and which subgraph version is appropriate. Example: 'get_market_trades: Fetches trades from the V1 Orderbook. For post-2026-04-28 trades, use get_v2_market_trades instead.'
Implement rate-limit guidance. Add a comment in server.registerTool blocks: '// Rate limit: 100 req/min. If exceeded, wait before retrying.' So LLMs know when to back off.