Followin MCP
Server Details
Your AI's market desk — crypto, US equities, macro, and investment-bank research in one MCP endpoint.
- Status
- Healthy
- Uptime
- 1.6% over 48 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 5 tools
The five tools have broadly distinct domains (numbers, commentary, positioning, watchlist, raw Twitter) and the descriptions include unusually detailed BOUNDARIES sections that explicitly resolve the tricky overlaps — metrics vs news for 研报 consumption, signal(kol_call) vs news(twitter) vs twitter for tweet content, and analyst ratings vs KOL calls. Residual ambiguity remains because news, signal, and twitter can all surface tweet-like content about the same entity, forcing the agent to parse long boundary prose to choose correctly.
All five names are single lowercase domain nouns (metrics, news, signal, subscription, twitter), so the style is internally consistent and readable. They are not verb_noun action names, and 'subscription' is a stateful watchlist rather than a data domain like the others, but there is no mixed-convention chaos.
Five tools is a tidy, well-scoped surface for a broad financial-intelligence server and avoids tool bloat. However, each tool is a mega-dispatcher bundling dozens of sub-operations behind query/categories/action parameters, so the apparent count understates the real complexity and pushes heavy routing burden onto long descriptions.
The surface covers an impressive breadth: live/historical market data, technicals, derivatives, macro, full fundamentals (financials, earnings, analyst, research reports, filings, ESG, peers, valuation), news/social, KOL and trader positioning, insider/13F, a watchlist inbox, and raw Twitter ops. Core data and lifecycle needs for a financial insight workflow appear complete with no obvious dead ends.
Available Tools
5 toolsmetricsMarket Data & FundamentalsARead-onlyIdempotentInspect
PURPOSE: Look up live and historical financial market data — prices, charts, technical indicators, macroeconomic data, and company fundamentals. Always call this for current numbers; training data is stale.
COVERS (by intent):
market: [market-quote] live price / quote / snapshot, including optional extended-hours bid/ask quote for US stocks/ETFs · [market-history] OHLCV candles & price history (incl. generic crypto K-line and explicit Binance Futures raw candles) · [market-technical] technical indicators (RSI / MACD / moving averages) · [market-movers] US gainers / losers / most-active board · [market-derivatives] Binance USDT perpetual universe with 24h quote volume, current raw funding-rate board, and daily open-interest history
macro: [macro-indicator] economic series (CPI, GDP, unemployment, fed funds) · [macro-rates] treasury yields & yield curve · [macro-calendar] economic-event calendar, data release dates & important upcoming releases
fundamentals: [fundamentals-financials] income statement / balance sheet / cash flow · [fundamentals-earnings] fiscal-period financial statements, actual-versus-estimate earnings comparisons, and fiscal-period call transcripts · [fundamentals-earnings-calendar] next-earnings date for a ticker AND market-wide earnings calendar (with or without a ticker) · [fundamentals-analyst] sell-side analyst price targets, estimates, and rating upgrades/downgrades · [fundamentals-research-report] structured broker / sell-side research reports, report cards, report thesis/catalysts/caveats, matched mention context, section counts, and a most-mentioned board whose mention_impact counts how distinct reports describe each affected ticker · [fundamentals-valuation] DCF / ratios / key metrics / enterprise value · [fundamentals-growth] revenue & earnings growth · [fundamentals-profile] company profile, sector, shares outstanding / float · [fundamentals-peers] comparable companies / competitors · [fundamentals-filings] SEC filings (10-K, 8-K) · [fundamentals-esg] ESG ratings
BOUNDARIES:
Sell-side analyst ratings, price targets, estimates, and rating upgrades/downgrades → fundamentals-analyst. Structured broker research reports / 研报 / 券商研报 with report cards, thesis, catalysts, caveats, matched mention context, or "most mentioned stocks in research reports" → fundamentals-research-report. Plain "研报" consumption/summary/analysis defaults to metrics. Raw research-source article/document discovery uses news.sources=["research"]. Ratings / targets / "上调评级" / "how Wall Street rates it" / "华尔街怎么看…评级" are fundamentals datapoints.
"Comparable / peer companies" → fundamentals-peers.
Raw numbers / data → metrics; open-ended interpretation / commentary / "怎么看" / "解读" about events, media coverage, or social discussion → news.
Market movers cover US equities and drop sub-$1 penny stocks by default (include_penny_stocks=true to keep them).
USAGE: Argument contract: keywords is the ENTITY FIELD; query is the INTENT FIELD. Whenever the user names assets, companies, indices, commodities, or macro series, put each entity in a separate keywords item and put the requested metric or operation in query. Example: "JBLU next earnings date" → keywords=["JBLU"], query="next earnings date"; a batch uses keywords=["JBLU","CUBI"]. Standalone query serves entity-free screens such as economic calendar, biggest gainers, treasury yield curve, Binance perpetual universe, or current funding rates. categories (market | macro | fundamentals) is optional — omit to auto-detect. interval selects intraday candles; period is the indicator window. For economic events, sort_by="time" follows the schedule and "hot" brings higher-impact releases first, keeping time order within each priority level; omit it for the default order. Other result types keep their existing ordering. English query gives the best recall; up to 5 keywords run in parallel, and omissions are reported in meta.warnings. Contract-specific Binance Futures requests reuse keywords and accept aliases, canonical assets, or exact universe symbols. MCP resolves the common alias first, then checks the authoritative perpetual_universe: exact symbol wins; otherwise a unique baseAsset match selects the universe row's real symbol. MCP never constructs a symbol by appending USDT. An exact universe symbol is needed only when one base asset matches multiple contracts. This applies to OI, explicit Futures candles, and named funding/universe filtering. OI is daily, defaults to 3 points, and supports at most the latest 30 points per symbol. Use time_range="30d" to request the full available OI window; an explicit limit caps the rows inside that window. Explicit Binance Futures candle requests must say Binance Futures or perpetual in query; generic crypto history retains the spot/fallback route. Calendar, Binance perpetual-universe, and current-funding leaves return at most 50 rows per page; meta.pagination supplies an opaque next_cursor, and sending it back unchanged in cursor with the same arguments continues that leaf. A requested page limit above 50 uses 50 and is reported in meta.warnings. Perpetual-universe pages are ordered by 24h quoteVolume descending; current-funding pages are ordered by absolute lastFundingRate descending. Structured research-report asset mode searches every resolved ticker, including multiple listings from one alias; report cards are deduplicated by event_id with subject matches preferred, then ordered by report date descending with subject matches first on the same date; all ticker groups share one card stream, and each page contains at most 10 cards. Continue fundamentals.research_reports with its opaque next_cursor and unchanged arguments, including verbosity. Every card always includes report_subject_target_price and matched_asset_target_price (null when unavailable); legacy target-price aliases are absent. No-ticker research aggregation counts each report/ticker pair once and exposes mention_impact counts for beneficiary, adverse, neutral, and mixed descriptions; dominant is tie when buckets share the highest count and mixed only when the mixed bucket uniquely leads. detail returns capped evidence sections plus original section counts. Both structured research-report modes honor time_range/date_from/date_to by filtering inclusive report_date bounds. Use time_range=24h / 7d / 30d for recent-report views. Because report_date is date-granularity, 24h resolves to an inclusive calendar-date range rather than a sub-day publication timestamp. If no time parameter is supplied, all available reports are used. No-ticker aggregation uses limit as leaderboard item count within the effective window.
RETURNS: results bucketed market.{snapshot,history,technical,movers,perpetual_universe,funding_rate,open_interest}, macro.{indicators,calendar}, fundamentals.{concise,earnings_calendar,research_reports,research_report_most_mentioned} — only fired buckets present. Binance Futures numeric values remain raw decimal strings; MCP does not annualize funding, calculate OI changes, filter weekend bars, or emit scanner/trading judgments. Fundamentals concise output groups corresponding financial_statement and earnings_surprise blocks under fiscal_quarters[].fiscal_period; earnings_surprise is the standard actual-results-versus-consensus comparison. Transcript rows carry their actual date, fiscal_year, fiscal_quarter, and stable freshness. Pagination state is keyed by result leaf in meta.pagination. Per-input failures / no-match notices in meta.warnings[] (reason=not_applicable / kw_not_canonical / no_match).
EXAMPLES (user → args; cross-lingual — translate intent to English):
"BTC 现价" → keywords=["BTC"]
"Binance USDT 永续合约池" → query="Binance USDT perpetual universe", categories=["market"], asset_type="crypto"
"当前永续资金费率" → query="current perpetual funding rates", categories=["market"], asset_type="crypto"
"BTC 的 Binance Futures 日 K" → keywords=["BTC"], query="Binance Futures candles", categories=["market"], asset_type="crypto"
"比特币和 Ethereum 的 OI 日线" → keywords=["比特币","Ethereum"], query="open interest history", categories=["market"], limit=3
"BTC 最近30天的 OI" → keywords=["BTC"], query="open interest history", categories=["market"], asset_type="crypto", time_range="30d"
"苹果近30天走势带 RSI" → keywords=["AAPL"], query="RSI", time_range="30d"
"비트코인 1년 차트" → keywords=["BTC"], asset_type="crypto", time_range="1y"
"Giá Bitcoin hôm nay" → keywords=["BTC"]
"美国 CPI 和 GDP 增速" → keywords=["CPI","GDP"], categories=["macro"]
"国债收益率曲线" → query="treasury yield curve", categories=["macro"]
"经济日历" → query="economic calendar", categories=["macro"]
"先看重要经济事件" → query="economic calendar", categories=["macro"], sort_by="hot"
"分析师给英伟达的目标价" → keywords=["NVDA"], query="analyst price target"
"华尔街最近有没有上调特斯拉评级" → keywords=["TSLA"], query="analyst rating"
"NVDA 的券商研报怎么看" → keywords=["NVDA"], query="broker research reports", categories=["fundamentals"]
"最近7天研报提到最多的美股" → query="most mentioned stocks in research reports", categories=["fundamentals"], time_range="7d"
"最近24小时的 NVDA 研报" → keywords=["NVDA"], query="latest broker research reports", categories=["fundamentals"], time_range="24h"
"美股财报日历" → query="earnings calendar"
"苹果下次财报时间" → keywords=["AAPL"], query="next earnings date"
"和英伟达对标的几家公司" → keywords=["NVDA"], query="peers"
"苹果的自由现金流" → keywords=["AAPL"], query="cash flow"
"AAPL 全面分析" → keywords=["AAPL"], query="comprehensive analysis"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Display records per topic (default 10): snapshot keeps one object per actual asset; technical keeps every asset and indicator series with at most N latest observations each; fundamentals keeps every company and caps each nested record list after calculations. Other per-asset or per-series buckets retain independent limits — e.g. results.market.history holds up to limit OHLCV rows per requested symbol. Binance Futures open-interest history returns at most 30 daily points per symbol; when limit is omitted\, an explicit time_range up to 30d determines its point count\, otherwise OI defaults to 3 points. Structured research-report asset mode searches all resolved tickers, deduplicates reports by event_id with subject matches preferred, and shares one card page across all returned ticker groups. Its maximum page size is 10; more cards continue through meta.pagination.next_cursor. Research-report aggregate mode uses limit as leaderboard item count. Historical price series supports up to 365; other leaf buckets cap at 50. Calendar, Binance perpetual-universe, and current-funding leaves report a limit above 50 in meta.warnings and provide continuation through meta.pagination.next_cursor. | |
| query | No | INTENT FIELD — State the requested metric, operation, analytical angle, or entity-free screen in natural language. Pair with keywords whenever the request names assets or other entities. Examples paired with keywords: 'next earnings date'\, 'RSI'\, 'valuation'\, 'balance sheet'\, 'comprehensive analysis'. Standalone query supports entity-free requests such as 'treasury yield curve'\, 'economic calendar'\, 'biggest gainers'\, and 'most mentioned stocks in research reports'. English usually gives the best recall. Put explicit time constraints in time_range/date_from/date_to. Up to 500 runes; truncation is reported in meta.warnings. | |
| cursor | No | Opaque continuation token returned in meta.pagination by a pagination-capable metrics leaf. Send it back unchanged with the same query\, filters\, sorting\, limit\, and verbosity to fetch the next page. Economic calendar\, earnings calendar\, fundamentals.research_reports\, Binance perpetual-universe\, and current-funding boards support this field; research-report pages contain at most 10 cards. | |
| period | No | Technical-indicator window length (e.g. 14 for RSI\, 50 or 200 for moving averages). | |
| country | No | Request-wide ISO 3166-1 alpha-2 country constraint\, e.g. US\, CA\, GB. Uses issuer domicile from stored company profiles for symbol-bound market/fundamentals rows and event country for economic calendars. Crypto and rows whose country cannot be verified are omitted. | |
| date_to | No | Explicit end date (YYYY-MM-DD). Defaults to today when only date_from is set. Structured research-report results apply it inclusively to report_date. | |
| sort_by | No | Sort order: time orders results by time; hot prioritizes results by importance or popularity\, depending on the data type. Supported modes vary by data type. Leave unset to use the default ordering. | |
| interval | No | Intraday candlestick granularity: 1min | 5min | 15min | 30min | 1hour | 4hour. Set it for intraday candles at that resolution; omit for daily. | |
| keywords | No | ENTITY FIELD — Put every named asset, security, token, ETF, index, commodity, company ticker, macro series code, or Binance Futures contract here as a separate array item. Known complete token addresses are also aliases (e.g. the UNI contract address resolves to UNI). Use aliases or canonical IDs such as Bitcoin\, BTC\, AAPL\, NVDA\, CPI\, GDP\, FEDFUNDS. Contract-specific Binance Futures requests (OI\, Futures candles\, or named funding/universe filtering) use the same field: MCP first resolves aliases to a canonical asset and then selects an authoritative perpetual_universe row by exact symbol or unique baseAsset. It never constructs a contract by appending USDT; pass an exact universe symbol only when one base asset is genuinely ambiguous. Required whenever the request names a specific entity. Example: 'JBLU next earnings date' → keywords=['JBLU']; query carries 'next earnings date'. At most 5 keywords are processed; omissions are reported in meta.warnings. Each keyword supports up to 128 runes; truncation is reported in meta.warnings. Research-report asset mode searches every resolved ticker (including multiple listings resolved from one alias) and applies one shared card limit. | |
| date_from | No | Explicit start date (YYYY-MM-DD). Takes priority over time_range when both are set. Calendar absolute ranges use earliest-first time ordering, including ties within a priority level. Structured research-report results apply it inclusively to report_date. | |
| verbosity | No | Free-text fields (including nested prose) use original prefixes: concise 200 Unicode runes | standard 600 (default for empty or unknown) | detail 2000. Numeric facts, dates, IDs, URLs, tags and technical data are not shortened. Detail still applies this cap; record counts use topic-specific limit. | |
| asset_type | No | crypto | tradfi. Use when a name could be either a crypto token or a traditional asset. Leave empty to get both. | |
| categories | No | Restrict to one or more domains: market (prices / charts / technicals)\, macro (economic data)\, fundamentals (company financials). Omit to auto-detect. | |
| time_range | No | Explicit caller-requested lookback\, written as <number><unit> where unit is h|d|w|m|y — e.g. 24h\, 7d\, 30d\, 1y. Supply this field when a time constraint is required; the server does not infer a window from query text. Internally derives date_from = now - this; explicit date_from wins. Binance Futures OI supports at most the latest 30 daily points; time_range longer than 30d is reported as partial with an effective 30d window. Calendar lookbacks use newest-first time ordering, including ties within a priority level. Structured research-report cards and leaderboards filter inclusively on date-granularity report_date. | |
| include_penny_stocks | No | US-equity movers setting (gainers / losers / most active). Default false drops penny stocks (price < $1); set true to include them. Applies to US-equity movers queries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so safety profile is covered. The description still adds substantial non-obvious behavior: 50-row page caps with opaque next_cursor continuation, per-leaf pagination keyed in meta.pagination, OI capped at 30 daily points, decimal-string non-annualization, no trading judgments, and per-input warnings. Minor deduction only because much of this surfaces in RETURNS/leaf docs rather than being framed as agent-facing caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and cleanly sectioned (PURPOSE / COVERS / BOUNDARIES / USAGE / RETURNS / EXAMPLES), so it is navigable. However it is very long and the USAGE and RETURNS prose substantially duplicates the 100%-covered input schema (pagination caps, OI limits, cursor semantics), so not every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, zero-required aggregator with no output schema and source-specific edge cases, the description supplies result bucket layout, ordering rules, pagination behavior, failure signaling in meta.warnings, and a rich example set. Nothing material an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3 and the schema does the heavy lifting. The description nonetheless supplies the keywords-as-ENTITY / query-as-INTENT contract with a concrete mapping example ('JBLU next earnings date' → keywords=["JBLU"], query="next earnings date") and standalone-query cases, adding relational meaning beyond individual field docs.
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?
Opens with a specific verb+resource ('Look up live and historical financial market data — prices, charts, technical indicators, macroeconomic data, and company fundamentals') and enumerates the covered intents. The BOUNDARIES section explicitly routes to siblings (news, and named leaves like fundamentals-analyst / fundamentals-peers), so an agent can separate it from news/signal/twitter without opening a schema.
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?
Explicit when-to-use ('Always call this for current numbers; training data is stale'), when-not ('open-ended interpretation / commentary / "怎么看" → news'), and which alternative handles specific intents. A long worked-example block maps natural-language requests, including cross-lingual ones, to exact argument shapes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
newsFinancial News SearchARead-onlyIdempotentInspect
PURPOSE: Search financial news, market commentary, social posts, and raw indexed research-source articles/documents — across articles, tweets, Telegram channel posts, blogs, media, and research-source documents.
COVERS (by intent):
[news-search] keyword / topic / event search across media, social content, and raw research-source article/document records (scope with the sources field: twitter | media | research)
[news-telegram] curated Telegram channel posts (sources=["telegram"]) — crypto-focused
[news-trending] browse what is hot with no specific entity — leave query empty (and sources empty) to get trending topics; add asset_type="crypto"|"tradfi" to narrow the trending board to one asset class
BOUNDARIES:
Commentary / interpretation / "解读" / "怎么看" about events, media coverage, or social discussion → news. Raw price or fundamental numbers → metrics. Structured broker research reports / 研报 consumption, report-card fields, thesis/catalysts/caveats, affected-name mentions, most-mentioned stocks in research reports, analyst RATING / price target / "上调评级" → metrics.
sources=["research"] fits raw indexed research-source article/document discovery, original-document browsing, or article-style search. 研报 consumption/summary/analysis by ticker and no-ticker research-report boards fit metrics(categories=["fundamentals"]).
"What are KOLs calling / 喊单 / consensus" → signal(kol_call). News returns articles & posts.
Open-ended "anything worth watching / 有什么热点" with no named entity → call with EMPTY query (returns trending).
A named account's COMPLETE or live raw timeline, or a specific tweet's replies/thread → the twitter tool. News searches the curated/indexed set (recent posts + discovery).
USAGE: English query gives the best recall — translate intent, prefer canonical entity names. Query search defaults to sort_by="time" and accepts "relevance"; both retain BM25+KNN recall, while time orders the candidate pool by published time and relevance applies semantic reranking. For an exact KOL alias when Twitter is eligible (default mixed search or sources includes "twitter"), authored originals and content mentions are independent recall legs: each is filtered/deduped/sorted separately, they split the Twitter visible limit evenly with unused quota backfilled, and only the mention leg uses asset entity admission. Empty-query trending defaults to sort_by="hot" and accepts "time"; scoped source browse is time-only. Empty query with sources=["telegram"] uses ten-category fan-out internally for recall, folds exact cross-category duplicates, and returns one globally newest-first stream. Use source_lang when the user explicitly asks for local-language coverage. To search a specific KOL, put their Twitter handle in query + sources=["twitter"] (e.g. 马斯克→elonmusk).
RETURNS: article/document rows with title, content, source, author, time, and a source-quality tag. Structured ticker-scoped research-report cards live under metrics.fundamentals.research_reports; no-ticker most-mentioned research-report requests return leaderboard items under metrics.fundamentals.research_report_most_mentioned.
EXAMPLES (user → args; cross-lingual):
"比特币最近的新闻" → query="BTC", sort_by="time"
"비트코인 최근 뉴스" → query="BTC"
"Tin tức Bitcoin" → query="BTC"
"美联储利率决议解读" → query="FEDFUNDS rate decision"
"AAPL 财报评论" → query="AAPL earnings"
"TG meme 打新动态" → sources=["telegram"], query="meme launch"
"在资讯库里搜 AAPL 相关 research 原文" → sources=["research"], query="AAPL"
"浏览最近 research source 的原始文章" → sources=["research"]
"今天有什么值得关注的" → query="", time_range="1d", sort_by="hot" (empty → trending)
"最近加密有什么热点" → query="", asset_type="crypto" (trending, crypto only)
"美股今天有什么风向" → query="", asset_type="tradfi", time_range="1d" (trending, tradfi only)
"刷一下推特最新" → sources=["twitter"]
"马斯克最近发的推" → sources=["twitter"], query="elonmusk"
"V神发了什么" → sources=["twitter"], query="VitalikButerin"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 10\, max 50 per independent budget: articles N; social Twitter author/mention posts together N plus Telegram N. Not a total-response limit. | |
| query | No | Keywords / topic / event / question. English usually gives the best recall on this corpus. Prefer canonical names for entities (ticker symbols\, English names for people / concepts). Known complete token addresses are also aliases (e.g. the UNI contract address searches UNI/Uniswap news). Max 500 runes (auto-truncated). Leave empty to browse the latest items in the chosen sources — defaults to trending topics when sources is also empty. | |
| sort_by | No | Ordering depends on route: query search supports time (default) | relevance; empty-query trending supports hot (default) | time; scoped source browse supports time only. | |
| sources | No | Restrict to specific sources: twitter | telegram (channel posts; empty query uses internal ten-category recall and returns global newest-first order) | media (news outlets) | research (raw indexed research-source articles/documents\, tradfi-only; structured broker report cards / 研报消费 belong in metrics.fundamentals). Omit for all-source mix. | |
| verbosity | No | Free-text fields (including nested prose) use original prefixes: concise 200 Unicode runes | standard 600 (default for empty or unknown) | detail 2000. Numeric facts, dates, IDs, URLs, tags and technical data are not shortened. Detail still applies this cap; record counts use topic-specific limit. | |
| asset_type | No | crypto | tradfi — restrict to one asset class. | |
| time_range | No | Explicit caller-requested recency window\, written as <number><unit> where unit is h|d|w|m|y — e.g. 1h\, 4h\, 1d\, 1w\, 1m\, 6m\, 1y. Supply this field when a time constraint is required; the server does not infer a window from query text. | |
| source_lang | No | Restrict to content in a specific language — use when the user explicitly asks for local-language coverage (e.g. 'how Korean media reports it'). Values: zh-cn | en | vi | ko | ja | es | pt | zh-tw. | |
| search_depth | No | Recall strategy for keyword search: quick (precise phrase only\, fastest) | standard (default\, phrase + semantic recall). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description still adds real behavioral context beyond them: route-dependent defaults (query→time, trending→hot, scoped browse→time-only), Telegram's internal ten-category fan-out with cross-category dedup and one global newest-first stream, and Twitter's two independent recall legs with split quota and backfill. It does not cover pagination, rate limits, or failure modes, so it falls short of a 5.
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?
Purpose/COVERS/BOUNDARIES/USAGE/RETURNS/EXAMPLES headers make it navigable and the routing rules are front-loaded, which is a strength for a complex tool. However, the USAGE section duplicates parameter documentation that already lives in the schema (sort_by per route, Telegram fan-out, source_lang), and the 12 cross-lingual examples add bulk; the text is denser than it needs to be.
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 does carry the return burden and discharges it: article/document rows with title, content, source, author, time, and a source-quality tag, plus a pointer that ticker-scoped report cards live under metrics.fundamentals. Combined with the routing guidance and examples, an agent has enough to invoke it correctly; only pagination/error behavior is unaddressed, which keeps it off a 5.
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 100%, so the baseline is 3, and the description largely restates schema content — the sort_by route rules, limit budget semantics, source_lang language list, and the empty-query/trending behavior all already appear in the schema. The one genuinely additive element is the cross-parameter pattern for KOL lookup (handle in query + sources=["twitter"], e.g. 马斯克→elonmusk), which does not fully lift it above the baseline.
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?
Opens with a specific verb+resource ('Search financial news, market commentary, social posts, and raw indexed research-source articles/documents') and immediately scopes the covered content types (articles, tweets, Telegram posts, blogs, media, research documents). It also explicitly separates itself from siblings (metrics, signal, twitter) rather than leaving the agent to guess.
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 BOUNDARIES block gives explicit when-not routing: commentary/interpretation → news, raw numbers and structured 研报/cards/ratings → metrics, KOL consensus/喊单 → signal, a named account's complete timeline or a tweet's replies → twitter. It also states the trigger for the trending route (empty query, no sources) and when source_lang applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalTrader & Insider SignalsARead-onlyIdempotentInspect
PURPOSE: Look up who is trading what — actual positioning and trade calls, with the original content so you can read the reasoning, size, and timing.
COVERS (by intent):
[signal-kol-call] KOL trading calls (Twitter/TG personalities posting calls) — covers BOTH crypto KOLs AND tradfi (stock/ETF) finance influencers; omit asset_type for both, or set asset_type="crypto"|"tradfi" to scope one class; query="consensus" → aggregated bullish/bearish view across KOLs (best with a specific ticker/entity). Watch / subscribe / alert / remind / notify / monitor intents about KOL-call symbols fit subscription; it tracks watched symbols with zero quota cost.
[signal-trader-position] latest directional trader-position legs by symbol/asset, including simultaneous long+short hedge legs, bot-reported notional size, active status, compact trader profile context, and empty-keyword trending symbol groups; covers crypto and tradfi position rows, while asset_type narrows one family
[signal-insider-trading] corporate insider (SEC Form 4) + political / congressional trades (tradfi)
[signal-institutional] A ticker's bounded 13F holder page, a manager's latest reported portfolio, and changes versus its previous available report (tradfi). Manager results disclose the selected filing and bounded evidence when more than one filing version was observed for a report period.
BOUNDARIES:
signal = crypto-social calls + tradfi insider/13F filings. Sell-side Wall Street ANALYST ratings / price targets / rating upgrades-downgrades / "评级" / "华尔街怎么看…评级" fit metrics(fundamentals). "KOL / 喊单" maps to finance influencer calls; "分析师 / analyst" maps to sell-side analyst data. Institutional means 13F holdings.
News articles & commentary → news.
Watch / subscribe / alert / remind / notify / monitor intents about KOL-call symbols → subscription, a free watchlist inbox that lists watched symbols and unread counts. Immediate call content and original posts → signal.
trader_position and kol_call cover BOTH crypto and tradfi (asset_type="crypto"|"tradfi" narrows; omit → both classes). insider_trading & institutional are tradfi-only.
USAGE: Argument contract: keywords is the ENTITY FIELD; query is the INTENT FIELD. Whenever the user names tickers, symbols, KOLs, people, or managers, put each entity in a separate keywords item and put the requested signal view in query. Example: "ETH KOL consensus" → keywords=["ETH"], query="consensus", categories=["kol_call"]. Standalone query serves entity-free discovery; trader_position with empty keywords returns trending symbol groups. Corporate insider trades default to revision_view="effective": only evidence-verified superseded rows are hidden; unresolved amendments remain visible with revision_complete=false and must not be summed as a complete total. Use revision_view="history" to preserve all versions; explicit filing lookup defaults to history. meta.revision.insider_trading reports stored revision coverage independently of pagination or original SEC completeness. For complete stored insider history, put security/person entities in keywords and set paginate=true with categories=["insider_trading"] and sort_by="time" (or omit sort_by); follow meta.pagination.insider_trading.next_cursor with the same request and limit. Add filing= and one security keyword to read one corporate filing across pages. coverage=stored_rows describes database coverage, not a guarantee that FMP supplied every original filing line. Ordinary latest-window requests remain bounded. For insider_trading, a person keyword selects that person’s Congress disclosures; a security keyword selects corporate and Congress trades for that security. Mixed person/security keywords combine those scoped results as a union. Pick categories to scope (omit for all). Up to 5 keywords run in parallel, and omissions are reported in meta.warnings. For institutional, put security tickers and/or manager CIKs or exact legal/common names in keywords. Security and manager matches are additive and may coexist. Explicit keywords are authoritative for Institutional entity execution; with empty keywords, query-derived entities provide compatibility discovery. Each resolved manager returns both manager_portfolio and manager_changes, with query supplying context while the view set stays fixed. English / canonical names match best.
RETURNS: signals with original content, bucketed {kol_call, trader_position, insider_trading, institutional} — only fired buckets present. trader_position returns {top_trader}; groups are by symbol/asset/instrument so multi-keyword requests keep BTC, ETH, MSTR, etc. separate. Each active direction is a separate position leg, so one trader may have both long and short rows for the same symbol. For trader_position, each symbol group returns up to limit position rows, across up to 5 symbol groups from keywords or empty-keyword trending; symbol_rollup metadata is returned per group outside that row budget. top_trader groups contain symbol_rollup + positions; symbol_rollup exposes long/short leg counts, positions_without_notional, gross_notional_value_usd, net_notional_value_usd, long_notional_ratio, short_notional_ratio, net_direction, agreement, actions, and classification. Exposure sums only reported notional_value_usd values: a position with null notional remains in leg counts but is excluded from dollar exposure and increments positions_without_notional; entry_price is never used as notional. Exposure and action totals count position legs; agreement counts distinct canonical traders, with a trader holding both long and short counted once and abstaining from the directional vote. notional_value_usd/value_usd remains bot-reported notional, not an inferred margin value. trader_position profile.status remains available when collected profile fields exist and unavailable otherwise. profile.history_access_status reports whether the trader's TG history is currently accessible or hidden, but hidden access never suppresses already collected profile fields or profile-quality ranking. Every available profile includes history_data_note="Based on collected records; data may be incomplete." because reopening history does not guarantee gap backfill. Institutional returns security_holders for security keywords and both manager_portfolio and manager_changes for each resolved manager; both capability legs may coexist in one response. Ambiguous live manager discovery returns manager_candidates instead of guessing. Every nested list is capped by limit. Manager rows return only the selected filing's bounded positions or cross-period changes, plus every observed filing summary, selected_filing_id, semantic_status, and at most min(limit,10) same-period filing differences when complete version positions are available. The Host does not receive raw multi-megabyte extracts; the filing-aware DB snapshot retains complete normalized positions for all current-response filings while public output remains bounded to one selected portfolio. For trader_position, omitted sort_by ranks positions by profile quality (tier, then profile_confidence) with amount/time tie-breakers; pass sort_by="time" for newest-first or "amount" for largest-position-first. Notices in meta.warnings[] (reason=not_applicable / no_match).
EXAMPLES (user → args; cross-lingual):
"KOL 在喊什么单" → categories=["kol_call"]
"现在 KOL 都在喊什么币" → categories=["kol_call"]
"近 24h KOL 对 ETH 共识" → categories=["kol_call"], keywords=["ETH"], query="consensus", time_range="1d"
"订阅/监控/提醒 BTC 的 KOL 喊单" → use tool subscription(action="set", items=[{"symbol":"BTC","asset_type":"crypto"}]) — zero quota cost
"美股 KOL 在喊什么 / who's calling stocks on Twitter" → categories=["kol_call"], asset_type="tradfi"
"谁在推特喊 NVDA" → categories=["kol_call"], keywords=["NVDA"], asset_type="tradfi"
"BTC 最新交易员仓位 / BTC latest trader positions" → categories=["trader_position"], keywords=["BTC"]
"MSTR 最新持仓动向" → categories=["trader_position"], keywords=["MSTR"], asset_type="tradfi"
"现在交易员都集中在哪些标的" → categories=["trader_position"], keywords=[]
"비트코인 롱숏 포지션" → categories=["trader_position"], keywords=["BTC"]
"AAPL 内部人最近交易" → categories=["insider_trading"], keywords=["AAPL"]
"佩洛西最近交易" → categories=["insider_trading"], keywords=["Pelosi"]
"金额最大的几笔国会交易" → categories=["insider_trading"], sort_by="amount"
"TSLA 13F 机构持仓变化" → categories=["institutional"], keywords=["TSLA"]
"AAPL 的机构持有人" → categories=["institutional"], keywords=["AAPL"]
"Berkshire Hathaway 最新 13F 组合和持仓变化" → categories=["institutional"], keywords=["BERKSHIRE HATHAWAY INC"]
"同时看 AAPL 持有人和 BlackRock 组合" → categories=["institutional"], keywords=["AAPL","BlackRock"]
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 10\, max 50. KOL raw posts: per asset family; consensus top_calls: min(N,5), aggregate counts unchanged. Trader positions: per symbol or complete trending group. Insider trades: merged category list. Institutional: each subject's holdings/positions/changes lists. Not a total-response limit. | |
| query | No | INTENT FIELD — State the requested signal view or routing intent applied to keywords. Pair with keywords whenever the request names tickers, actors, or managers. Canonical kol_call intents: 'consensus' for an aggregated bullish/bearish view and 'detail' for fuller raw posts. Standalone query supports entity-free discovery such as trending trader-position groups. Explicit keywords are authoritative for Institutional entity execution; with empty keywords, query-derived entities provide compatibility discovery. Each resolved Institutional manager returns both manager_portfolio and manager_changes, with query supplying the surrounding intent while the view set stays fixed. Manager responses disclose summaries for observed filing versions. English usually gives the best recall. Use categories\, asset_type\, time_range\, sort_by\, and limit for their respective controls. Up to 500 runes; truncation is reported in meta.warnings. | |
| cursor | No | Opaque next_cursor from meta.pagination.insider_trading. Repeat the original insider_trading filters and limit. Pagination uses a stored-row high-water mark, excludes later inserts, and never falls back to an unrelated latest feed. | |
| filing | No | SEC accession number (18 digits or dashed form) for one corporate filing. Requires categories=[insider_trading], exactly one security keyword, and sort_by omitted or time. Implies paginate=true. Read every page to obtain all stored rows for this filing; separate accessions remain separate. | |
| sort_by | No | Sort order: time (newest first) | amount (largest trades/positions first — meaningful for trader_position latest positions, insider_trading, and institutional). For trader_position, omit sort_by to use profile-quality order (tier then profile_confidence, with amount/time tie-breakers); pass time explicitly for newest-first. kol_call uses time order. | |
| keywords | No | ENTITY FIELD — Put every named ticker, symbol, KOL handle, person, CIK, or institutional manager here as a separate array item. Required whenever the request names a specific entity. Known complete token addresses are also aliases (e.g. the UNI contract address resolves to UNI). Per category: kol_call uses a ticker or KOL handle (without @); trader_position uses ticker/symbol lenses such as BTC\, ETH\, MSTR\, QQQ; insider_trading uses a ticker or person name such as AAPL or Pelosi; institutional uses a security ticker and/or a manager's 1-10 digit CIK or exact legal/common name. Institutional security and manager matches are additive and may coexist. At most 5 keywords are processed; omissions are reported in meta.warnings. Each keyword supports up to 128 runes; truncation is reported in meta.warnings. | |
| paginate | No | Read stored insider_trading history in pages rather than a bounded latest/live window. Requires categories=[insider_trading], a security or person keyword, and sort_by omitted or time. Follow meta.pagination.insider_trading.next_cursor with the same filters and limit. Covers stored rows only; does not certify the original filing is complete. | |
| verbosity | No | Free-text fields (including nested prose) use original prefixes: concise 200 Unicode runes | standard 600 (default for empty or unknown) | detail 2000. Numeric facts, dates, IDs, URLs, tags and technical data are not shortened. Detail still applies this cap; record counts use topic-specific limit. | |
| asset_type | No | crypto | tradfi — restrict to one asset class. kol_call and trader_position cover both crypto and tradfi; insider_trading and institutional are tradfi-only. | |
| categories | No | Which kind of signal: kol_call (what KOLs are calling)\, trader_position (latest trader positions by symbol/asset)\, insider_trading (corporate insider / political filings)\, institutional (13F institutional holdings). Omit to auto-detect from the query. Watch / subscribe / alert / remind / notify / monitor intents about KOL-call symbols fit the subscription tool; it stores a zero-quota watchlist inbox. | |
| time_range | No | Explicit caller-requested recency window\, written as <number><unit> where unit is h|d|w|m|y — e.g. 1h\, 4h\, 1d\, 1w\, 1m\, 6m\, 1y. Supply this field when a time constraint is required; the server does not infer a window from query text. Sources without truthful rolling-window semantics fail closed. | |
| revision_view | No | insider_trading: effective (default) hides only verified superseded transactions and retains unresolved filings with warnings; history preserves all versions. Explicit filing lookup defaults to history. Revision status is evidence-backed; revision_complete=false forbids treating candidate sums as a complete total. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent/open-world, but the description discloses far more: bounded latest windows, pagination high-water-mark semantics, meta.warnings reporting for omissions/truncation, revision_complete=false forbidding sum-as-total, null notional excluded from exposure while remaining in leg counts, and coverage=stored_rows not guaranteeing original FMP completeness. These are non-obvious behavioral traits an agent needs.
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?
It is well front-loaded and headed, but very large, and the USAGE/RETURNS prose substantially duplicates facts already stated in the schema descriptions (revision_view semantics, paginate requirements, filing accession rules, limit behavior). Every sentence does not earn its place when the same content is in the structured fields.
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 12 parameters and no output schema, the description compensates fully: it documents the bucketed return shape, which buckets appear when fired, symbol_rollup fields (gross/net notional, agreement, classification), manager filing-version disclosure, and warning surfaces. An agent has everything needed to call and interpret the result.
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 100%, so the baseline is 3, but the description adds a genuine semantic layer beyond the schema: keywords is the ENTITY FIELD and query is the INTENT FIELD, with a worked example ('ETH KOL consensus' → keywords=['ETH'], query='consensus'). It also clarifies that keyword scope changes meaning per category (person keyword → Congress disclosures) and that Institutional matches are additive.
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?
Opens with a specific verb+resource: 'Look up who is trading what — actual positioning and trade calls.' It enumerates the four concrete buckets (kol_call, trader_position, insider_trading, institutional) and explicitly distinguishes itself from siblings by naming metrics for sell-side analyst ratings and news for commentary. An agent can route to this tool without opening any schema.
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 BOUNDARIES section gives explicit when-to-use/when-not rules (analyst ratings → metrics, articles → news, watch/subscribe intents → subscription) plus the crypto-vs-tradfi scoping rule. The USAGE contract and 18 cross-lingual examples map user phrasings to concrete argument sets, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subscriptionWatchlist InboxAInspect
PURPOSE: Manage a free per-key KOL-call watchlist inbox for watch / subscribe / alert / remind / notify / monitor intents — save symbols, check unread counts, then fetch content with signal when needed.
COVERS (by intent):
[subscription-watchlist] watch / subscribe / alert me / remind me / notify me / monitor a symbol for new KOL calls; save or update a KOL-call watchlist; list watched symbols and unread counts; check whether watched coins or stocks have unseen KOL calls; acknowledge counts I already saw
BOUNDARIES:
Choose subscription when the user asks to watch, subscribe, alert, remind, notify, monitor, list subscriptions, check alerts, show watched symbols, or check unread KOL-call counts. It returns symbols and unread counts with zero monthly quota cost.
For the actual calls and original posts, use signal(categories=["kol_call"], keywords=[...]) after list reports symbols with unread_count > 0; that follow-up signal call is billed as usual.
Phase 1 supports category="kol_call" only, covering both crypto and tradfi KOL calls. Use per-item asset_type="crypto"|"tradfi" only to disambiguate a symbol.
Delivery model: pull-based watchlist inbox for user "alert/remind/notify me" wording; users can check stored unread counts later.
USAGE:
set: action="set", items=[{"symbol":"BTC","asset_type":"crypto"},{"symbol":"AAPL","asset_type":"tradfi"}]; this adds new items, ignores duplicates, and preserves existing items
list: action="list" (free; returns the watchlist with unread_count and folds pending updates into shown; repeated list calls are stable until ack)
ack: action="ack", items=[{"symbol":"BTC","asset_type":"crypto"}] (free; clears shown only)
delete: action="delete" (clears the whole watchlist)
RETURNS: results.watchlist for set/list, results.acknowledged for ack, or results.status for delete. set watchlist rows include symbol and asset_kind; list watchlist rows also include pending, shown, unread_count, and latest_ts where relevant.
EXAMPLES:
"帮我盯一下 BTC 和 ETH 有新喊单就提醒" → action="set", items=[{"symbol":"BTC","asset_type":"crypto"},{"symbol":"ETH","asset_type":"crypto"}]
"watch / subscribe / alert me on NVDA KOL calls" → action="set", items=[{"symbol":"NVDA","asset_type":"tradfi"}]
"我的自选币有新动静吗 / check my alerts" → action="list"
"我订阅的信号有更新吗 / show my subscriptions" → action="list"
"BTC 的提醒我看过了" → action="ack", items=[{"symbol":"BTC","asset_type":"crypto"}]
"列出我的订阅" → action="list"
| Name | Required | Description | Default |
|---|---|---|---|
| items | No | Watchlist items to set or ack. Required for set and ack. set never deletes existing items; use delete to clear the watchlist. Each item has a symbol and optional per-item asset_type for crypto/tradfi disambiguation. | |
| action | Yes | Action to perform: set | list | delete | ack. Use set for user wording like watch, subscribe, alert me, remind me, notify me, or monitor a KOL-call symbol; use list for check/show my alerts, subscriptions, watched symbols, or unread counts; delete removes all items; ack clears shown unread state for supplied items. | |
| category | No | Signal category for this watchlist inbox. Phase 1 supports only kol_call; omitted defaults to kol_call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: zero quota cost for this tool, pull-based delivery model, set preserves existing items while delete clears the whole watchlist, ack clears only shown state. One caveat: the annotations set destructiveHint=false, yet the delete action wipes the entire watchlist, which is a mild tension worth noting rather than a flat 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?
Front-loaded with PURPOSE and cleanly sectioned, but verbose: the COVERS and BOUNDARIES sections both re-list the same trigger keywords, and the EXAMPLES largely restate the USAGE examples. Several sentences duplicate what the schema already states about action semantics.
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?
Despite having no output schema, the RETURNS section documents the response shape per action (results.watchlist / acknowledged / status) and the row fields (pending, shown, unread_count, latest_ts). Combined with phase limitations and billing notes, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description goes further by mapping each action enum value to concrete user phrasings, giving literal call examples with items payloads, and clarifying category="kol_call" is the only supported value in Phase 1.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and scope ("free per-key KOL-call watchlist inbox") and enumerates the four actions it supports. It explicitly distinguishes itself from the sibling signal tool, which retrieves the actual calls. An agent can tell exactly what this tool does versus its 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 BOUNDARIES section states explicit when-to-use triggers (watch/subscribe/alert/list/ack) and routes the follow-up case to signal(categories=["kol_call"]) with the condition (unread_count > 0), including that the follow-up is billed. It also names the when-not case (fetching actual content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
twitterTwitter/X SearchARead-onlyIdempotentInspect
PURPOSE: Direct Twitter/X access — raw operations on a specific account, tweet, search, list, or community.
COVERS (by action): tweet search & user search; a named user's profile / tweets / timeline / mentions; followers, followings & follow checks; a tweet's replies / thread / quotes / retweeters; trends; community & list timelines; spaces; long-form articles.
BOUNDARIES:
Use twitter for RAW ops on a NAMED account or a specific tweet. For "what are KOLs calling / 喊单" use signal(kol_call); for general crypto/news tweet CONTENT use news(sources=["twitter"]).
USAGE — pick an action and supply its required params:
search: query (+ optional query_type, cursor, time_range)
user_info / user_about: user_name
batch_user_info: user_ids (comma-separated)
search_users: query
user_tweets: user_name or user_id (+ optional include_replies, cursor)
user_timeline: user_id (+ optional cursor)
user_mentions: user_name (+ optional cursor)
followers / followings: user_name (+ optional cursor)
verified_followers: user_id (+ optional cursor)
check_follow: user_name + target_user_name
tweets_by_ids: tweet_ids (comma-separated)
tweet_replies / tweet_replies_v2 / tweet_thread / tweet_quotes / tweet_retweeters: tweet_id (+ optional cursor)
trends: woeid (default 1 = worldwide)
community_tweets: community_id (+ optional cursor)
article: tweet_id
space_detail: space_id
list_tweets / list_timeline: list_id (+ optional cursor)
RETURNS: the raw twitterapi.io payload for the chosen action (tweets / users / relationships / trends), paginated via next_cursor.
EXAMPLES:
"搜 BTC 相关推文" → action="search", query="BTC"
"Elon Musk 账号信息" → action="user_info", user_name="elonmusk"
"V神最近发了什么" → action="user_tweets", user_name="VitalikButerin"
"这条推文的回复" → action="tweet_replies", tweet_id="..."
"全球趋势" → action="trends"
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Local records per business list (default 20 and max 20). Does not change upstream page size. Omitted records from a shortened page are not recoverable through the next upstream cursor. | |
| query | No | Search query string. Required for: search\, search_users. Supports Twitter advanced search operators. Up to 500 runes; longer queries silently truncated. | |
| woeid | No | Yahoo WOEID for trends location (1=Worldwide\, 23424977=US). Default 1. | |
| action | Yes | Which Twitter operation to perform: search | user_info | user_about | batch_user_info | search_users | user_tweets | user_timeline | user_mentions | followers | followings | verified_followers | check_follow | tweets_by_ids | tweet_replies | tweet_replies_v2 | tweet_thread | tweet_quotes | tweet_retweeters | trends | community_tweets | article | space_detail | list_tweets | list_timeline | |
| cursor | No | Pagination cursor from previous response's next_cursor field. | |
| list_id | No | Twitter List ID. Required for: list_tweets\, list_timeline. | |
| user_id | No | Numeric Twitter user ID. Required for: user_timeline\, verified_followers. Also accepted by user_tweets as alternative to user_name. | |
| space_id | No | Twitter Space ID. Required for: space_detail. | |
| tweet_id | No | Single tweet ID. Required for: tweet_replies\, tweet_replies_v2\, tweet_thread\, tweet_quotes\, tweet_retweeters\, article. | |
| user_ids | No | Comma-separated numeric user IDs. Required for: batch_user_info. | |
| tweet_ids | No | Comma-separated tweet IDs. Required for: tweets_by_ids. | |
| user_name | No | Twitter handle (without @). Required for: user_info\, user_about\, user_tweets\, user_mentions\, followers\, followings\, check_follow. | |
| verbosity | No | Per logical prose field: concise 200 Unicode characters | standard 600 (default) | detail 2000. Includes nested text; detail remains capped. Independent of record limit. | |
| query_type | No | Search result ordering: Latest (default) | Top. Only for: search. | |
| time_range | No | Explicit caller-requested recency window\, written as <number><unit> where unit is h|d|w|m|y — e.g. 1h\, 4h\, 1d\, 1w\, 1m\, 6m\, 1y. Supply this field when a time constraint is required; the server does not infer a window from query text. Only for: search. | |
| community_id | No | Twitter Community ID. Required for: community_tweets. | |
| include_replies | No | Include reply tweets in results. For: user_tweets. | |
| target_user_name | No | Second user handle for relationship check. Required for: check_follow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds useful behavioral context beyond that: results are the raw twitterapi.io payload and are paginated via next_cursor. It does not cover rate limits or authentication requirements, but with strong annotation coverage this is a solid addition rather than a 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 long but well structured with PURPOSE, COVERS, BOUNDARIES, USAGE, RETURNS, and EXAMPLES sections. For a tool with 24 possible actions and 18 parameters, that length is largely justified. There is minor redundancy between COVERS and USAGE, preventing a perfect score.
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 high complexity, lack of output schema, and single required action parameter, the description is complete enough for correct invocation. It enumerates actions, required parameters, return shape, pagination behavior, boundaries, and examples. Nothing an agent needs to choose an action correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter, including required/optional action mappings and constraints. The description's USAGE list mirrors that mapping and adds usage examples, but it does not introduce substantial meaning beyond what the structured schema provides. Baseline 3 is appropriate.
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 the specific resource and scope: raw Twitter/X operations on a named account, tweet, search, list, or community. It explicitly distinguishes itself from siblings signal(kol_call) and news(sources=["twitter"]) in the BOUNDARIES section. An agent can tell what this tool is for without opening either schema.
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 explicit when-to-use and when-not-to-use guidance: use twitter for raw ops on a named account or specific tweet, use signal for KOL calls, and use news for general crypto/news tweet content. The USAGE block also maps each action to its required parameters, leaving little to inference.
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.
5 tool updates
- First observed
metrics - First observed
news - First observed
signal - First observed
subscription - First observed
twitter
Related MCP Servers
- AlicenseNot gradedqualityBmaintenancePerplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.2Apache 2.0
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npm54 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1611 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.