@sentimentracker/signals-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@sentimentracker/signals-mcpwhat is sniperV3 saying about BTC on 15m right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@sentimentracker/signals-mcp
A Model Context Protocol (MCP) server exposing Sentimentracker's 14 proprietary indicators as LLM-callable tools. Any MCP-aware client (Claude Desktop, Cursor, Cline, Continue, Windsurf, OpenAI Agents SDK) can ask "what is sniperV3 saying about BTC on 15m right now?" and get the actual signal envelope from your premium subscription.
Pairs with @sentimentracker/hyperliquid-mcp — that one signs and submits trades; this one reads signals.
How it works
Thin HTTP wrapper. Tool calls map directly to the existing Sentimentracker backend POST /superchart/indicators/calculate route, which is the single source of truth for every indicator's proprietary signal cascade. No calculator code lives in this package — backend updates ship to every MCP user immediately, no version drift.
LLM client → MCP stdio → this server → HTTPS → sentimentracker backend → cached metadataRelated MCP server: Data Puller MCP Server
Tools
Tool | Purpose |
| Live catalog from the backend registry — key, displayName, signalKind, description. Call once at session start. |
| Latest signal envelope (signals[], trades[], currentTrade) for (indicator, symbol, resolution). ~5KB payload — uses |
| Full per-bar plot arrays + metadata. Typically 100-800 KB; anything over 1 MB of JSON is refused with |
| Fan-fetch up to 20 indicators in parallel for the same (symbol, resolution), return a confluence table. |
| Long-poll for a NEW signal on (indicator, symbol, resolution). Holds up to |
| Pure compute: turn a signal envelope into a payload ready for |
Supported indicators
The catalog is not shipped with this package. list_indicators reads
GET /superchart/indicators on the backend, caches it for five minutes,
and every other tool validates its indicator argument against that
list. When the backend registers a new _specs/<key>.ts, it appears here
on the next deploy with no MCP release. At the time of writing the
backend serves 14 indicators (Sniper v3, Momentum Ultima Plus, Structure
PRO, Strong Buy Strong Sell, MOM Algo V15, Institutional Algo, Momentum
Trend Predictor, Momentum Radar, Momentum Wave, Momentum Balance Finder,
Momentum Insider with Divergences, Momentum Levels V3, Divergences PRO,
Impulse Targets).
Tool annotations follow the MCP spec: every tool is readOnlyHint and
non destructive; propose_trade_from_signal is additionally
openWorldHint: false because it never leaves the process. Results are
returned as both text and structuredContent.
Auth
Two paths; both work today.
Env var | Status | When to use |
| Works today | Quick dev — log into Sentimentracker, copy session JWT, paste. Refresh on expiry (typically 7-30 days). |
| Works (recommended) | Headless credential minted in Settings → API keys (or |
Mint an API key from your account:
# Authenticate via your normal session JWT
curl -X POST https://api.sentimentracker.com/api/api-keys \
-H "Authorization: Bearer <YOUR_SESSION_JWT>" \
-H "Content-Type: application/json" \
-d '{"name": "Claude Desktop — Mac", "scope": "signals:read"}'
# Response: { data: { key: {...}, plaintext: "snt_mcp_<24 chars>", warning: "..." } }The plaintext field is shown once — capture and store securely. Lost keys can only be revoked + reminted, never recovered. List and revoke via GET /api-keys and DELETE /api-keys/:id.
The backend gates every indicator behind a premium subscription, so the JWT / API key must belong to a premium user. The MCP includes Authorization: Bearer <jwt> OR x-sentimentracker-api-key: snt_mcp_<...> automatically depending on which env var you set.
Install + run
# Local dev
cd sentimentracker-signals-mcp
pnpm install
pnpm build
SNT_SIGNALS_SESSION_TOKEN=<your-jwt> node dist/index.jsOnce published to npm:
npx -y @sentimentracker/signals-mcpEnv reference
Env var | Default | Notes |
|
| Override for staging / local dev. |
| (required if no API key) | Bearer JWT from your authenticated session. Expires; refresh manually. |
| (required if no session token) | Long-lived |
|
| One of |
|
| Fetch timeout (1000-60000 ms). |
Error envelope
Every failure returns a structured error:
{
"code": "AUTH_PREMIUM_REQUIRED",
"message": "Premium subscription required for indicators",
"hint": "This indicator requires a Sentimentracker premium subscription.",
"status": 403
}Code | Meaning | Agent action |
| No session/key configured | Operator must set env var |
| 401 from backend | Operator must refresh token |
| 403 from backend | Operator must upgrade subscription |
| Fetch timed out | Retry (sparingly) or raise |
| 5xx or other HTTP failure | Retry with backoff |
| Non-JSON or malformed body | Bug — file an issue |
| Tool was called with a key not in registry | Correct the input |
| Other input validation failure | Correct the input |
Project layout
src/
├── index.ts # stdio entry
├── server.ts # McpServer factory
├── config.ts # env parsing
├── client.ts # HTTP client → /superchart/indicators/calculate
├── indicators.ts # 14-indicator registry
├── errors.ts # error hierarchy + toErrorPayload
└── tools/
├── _shared.ts # defineTool wrapper + shared zod
├── index.ts # registry
├── list-indicators.ts
├── get-indicator-signal.ts
├── get-indicator-full.ts
├── get-signal-confluence.ts
├── subscribe-signal.ts
└── propose-trade-from-signal.tsRate limits and quota
The backend layers three limits on top of the global per-IP limit. All of them are per user, so the same user across machines shares one budget.
Limit | Value | Signal |
| 60 burst + 1/sec sustained (5× for premium) |
|
| 10 burst + 0.5/sec sustained (5× for premium); at most 3 open long polls per user | same headers; |
API key monthly quota | 50,000 successful calls per key per calendar month (UTC); session traffic is not metered |
|
Surfaced to MCP callers as BackendError with code BACKEND_RATE_LIMITED
and a Retry after Ns. hint.
Composing with @sentimentracker/hyperliquid-mcp
The two MCPs are designed to chain — signals MCP reads, hyperliquid MCP signs:
LLM
├── get_indicator_signal(sniperV3 BTC 15m) → signals-mcp
│ ↓ signal envelope
├── propose_trade_from_signal(...) → signals-mcp (pure compute)
│ ↓ HL order payload + sister MCP target
├── propose_order(payload) → hyperliquid-mcp (no signing)
│ ↓ rendered payload + safety check
└── place_order(payload) → hyperliquid-mcp (signs + submits)propose_trade_from_signal emits a next.tool / next.server / next.arguments triple that tells the agent exactly which MCP server + tool to call next, so well-instructed agents handle the chain without explicit narration.
Roadmap
Real WS push (replace long-poll) — eliminates 1s latency floor on subscribe
Multi-symbol watchlists — one
subscribe_watchlistcovering N (indicator, symbol, resolution) tuplesPer-key analytics dashboard — call counts, error rates, top symbols
API-key scopes beyond
signals:read(e.g.signals:subscribe,meta:read); scopes are enforced per route todayHosted remote transport (Streamable HTTP + OAuth 2.1) alongside stdio
Releasing
Bump
versioninpackage.jsonandSERVER_VERSIONinsrc/version.ts(a test keeps them equal).Commit, then
git tag vX.Y.Zandgit push origin main vX.Y.Z.The
publishworkflow runs the tests and publishes to npm through trusted publishing, with provenance. No token or passkey is involved.
License
MIT
Available Tools
6 toolsget_indicator_fullGet full indicator outputARead-onlyIdempotent
FULL calculator output — every per-bar plot array AND the metadata envelope. Large payload (100-300 KB). Use only when the agent needs per-bar context; otherwise prefer get_indicator_signal. Pass from (unix seconds) to load history further back than the default window. Results over 1 MB of JSON are refused with RESULT_TOO_LARGE.
| Name | Required | Description | Default |
|---|---|---|---|
| from | No | ||
| config | No | ||
| symbol | Yes | ||
| provider | No | ||
| indicator | Yes | Indicator key as returned by list_indicators, e.g. sniperV3 | |
| resolution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description correctly aligns with that. It adds significant behavioral context: large payload size (100-300 KB), a refusal condition (results over 1 MB are refused with RESULT_TOO_LARGE), and the need for per-bar context. No contradiction; the description complements the annotations well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: it opens with the core purpose and immediately notes the large payload and sibling alternative. Every sentence adds value, with no fluff or repeated schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description covers what the agent needs to know: what it returns, when to use it, size concerns, failure mode, and how to extend the time range. It's complete for a complex tool with 6 parameters and nested objects.
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 only 17%, so the description must compensate. It explains the 'from' parameter (unix seconds for history) and implies the 'indicator' parameter through 'calculator output'. It doesn't detail 'config' or 'provider' but covers the key ones for usage. This is a strong compensation given the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'FULL calculator output — every per-bar plot array AND the metadata envelope' is specific and distinguishes it from the sibling get_indicator_signal. It also clearly identifies the verb (get) and resource (full indicator output), making the purpose unambiguous.
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?
Explicitly says 'Use only when the agent needs per-bar context; otherwise prefer get_indicator_signal', which routes the agent to the correct sibling. Also provides guidance on the optional 'from' parameter for loading history beyond the default window.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_indicator_signalGet latest signalARead-onlyIdempotent
Latest signal envelope for the given (indicator, symbol, resolution). Returns the proprietary metadata only — signals[], trades[], currentTrade — without the full per-bar plot arrays. Use this for 'what is sniperV3 saying about BTC on 15m right now?'. Optional config overrides the indicator's default params; provider forces a bar provider (auto / hyperliquid / binance / tiingo / intrinio / databento).
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | ||
| symbol | Yes | ||
| provider | No | ||
| indicator | Yes | Indicator key as returned by list_indicators, e.g. sniperV3 | |
| resolution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior; the description goes beyond by disclosing that only the metadata envelope is returned and that config/provider alter indicator defaults and data source. It does not discuss error or absence-of-signal behavior, but given the annotation coverage, the disclosure is solid.
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?
Four short sentences deliver purpose, return-scope, use case, and optional parameters without filler. Core information is front-loaded and every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only signal query with a nested config object and no output schema, the description names the returned top-level fields and key invocation options. It leaves some return-structure detail implicit, but an agent can select and invoke the tool correctly based on this definition.
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 only 20%, so the description must carry parameter meaning, and it does for the two ambiguous optional parameters: config overrides indicator defaults and provider forces a bar provider. The required parameters are illustrated by the BTC/15m example, though the config object's possible keys are still underspecified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb/resource ('latest signal envelope' for indicator, symbol, resolution) and contrasts it with full per-bar plot arrays, which differentiates it from siblings like get_indicator_full. The concrete use-case query makes intent unambiguous.
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 an explicit use case ('what is sniperV3 saying about BTC on 15m right now?') and explains the optional config/provider behavior. It does not explicitly name when not to use it or direct the agent to get_indicator_full for plot arrays, though that alternative is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signal_confluenceMulti indicator confluenceARead-onlyIdempotent
Run N indicators in parallel against the same (symbol, resolution) and return a compact confluence table. Each row: indicator key, displayName, signalKind, latest signal side (BUY/SELL/null), latest signal ts (ms), error (if any). The LLM judges agreement from the table — there's no built-in voting rule. Max 20 indicators per call; unknown keys fail the whole call before any fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | ||
| provider | No | ||
| indicators | Yes | ||
| resolution | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: max 20 indicators per call, unknown keys fail the whole call before any fetch, and there's no built-in voting rule. It also discloses the return structure (rows with indicator key, displayName, signalKind, latest signal side, ts, error). This goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core function, the second details the output structure, and the third covers constraints and failure behavior. Every sentence earns its place with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, idempotent tool with no output schema, the description covers the return format, the key behavioral constraints (max 20, fail-fast on unknown keys), and the interpretation guidance (LLM judges agreement). The only gap is the undocumented 'provider' parameter, which is optional and has an enum in the schema, so the agent can infer valid values. Overall, the description is nearly complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The description explains the 'indicators' parameter implicitly by describing the table rows and the max 20 limit, and it mentions (symbol, resolution) as the shared context. However, it doesn't explain the 'provider' parameter at all, and the schema itself lacks descriptions for symbol, resolution, and provider. The description adds some meaning but leaves the provider parameter undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs N indicators in parallel against the same (symbol, resolution) and returns a compact confluence table. It distinguishes itself from siblings by emphasizing the parallel multi-indicator nature and the absence of a built-in voting rule, which is a key differentiator from get_indicator_signal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need confluence across multiple indicators. It explicitly states the LLM judges agreement from the table, which guides the agent on how to use the output. However, it doesn't explicitly name alternatives like get_indicator_signal for single-indicator queries, though the sibling list makes this inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_indicatorsList indicatorsARead-onlyIdempotent
Catalog of every indicator the Sentimentracker backend can compute, read live from its registry. Returns key, displayName, signalKind (directional / regime / levels / divergence / mixed) and a one-line description per indicator. Call this once at session start so the agent knows which key to ask about.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, covering the safety profile. The description adds 'read live from its registry,' a minor behavioral detail about the dynamic data source, but does not go beyond that. Given the comprehensive annotations, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct purpose: stating what the tool does, describing the output format, and giving usage timing. No redundancy or filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with no parameters, no output schema, and comprehensive annotations, the description fully covers purpose, output fields, and usage guidance. An agent has all necessary information 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?
The tool has zero parameters, so schema coverage is trivially 100% and there is nothing to explain. The description correctly omits parameter details. The baseline of 4 for a no-parameter tool is appropriate, as the description adds no unnecessary filler.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool catalogs every indicator the Sentimentracker backend can compute, read live from its registry, and specifies the exact return fields (key, displayName, signalKind, description). This unambiguous verb+resource pair distinguishes it from sibling tools that retrieve specific indicator data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call this once at session start so the agent knows which key to ask about, providing clear timing and purpose. It doesn't explicitly name alternative tools or exclusions, but the 'once at session start' directive effectively frames it as a discovery step before using other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_trade_from_signalCompose Hyperliquid order payloadARead-onlyIdempotent
PURE COMPUTE: compose a Hyperliquid propose_order payload from a signal envelope + sizing strategy. No IO. The result drops directly into @sentimentracker/hyperliquid-mcp's propose_order tool. Three sizing modes — notionalUsd / fixedBase / riskUsd (with stopLossPx). Optional takeProfitPx + stopLossPx surface a follow-up tip to invoke place_tpsl after the entry fills.
| Name | Required | Description | Default |
|---|---|---|---|
| tif | No | ||
| coin | Yes | ||
| isPerp | No | ||
| markPx | Yes | ||
| signal | Yes | ||
| sizing | Yes | ||
| orderType | No | market | |
| reduceOnly | No | ||
| stopLossPx | No | ||
| takeProfitPx | No | ||
| limitOffsetBps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to cover safety. It adds value by clarifying that the tool performs no IO, does not execute orders, and produces a payload for another tool, plus the follow-up tip about 'place_tpsl'. This is beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose and no-IO claim. Every sentence adds value: the destination, sizing modes, and follow-up tip. It could be slightly more structured but is not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool is a pure compute with a rich schema and multiple enums, the description covers the key aspects: purpose, no IO, sizing modes, and the output flow. It doesn't explain return values, but there is no output schema and the tool hints it drops into another tool, which is sufficient. Minor gap: no mention of how signal is used beyond type, but schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does name the three sizing modes (notionalUsd, fixedBase, riskUsd) and mentions optional takeProfitPx/stopLossPx, which adds meaning. However, it doesn't explain many other parameters like tif, orderType, limitOffsetBps, or the structure of signal envelope, though the schema is fairly descriptive for those.
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 uses a specific verb 'compose' and identifies the exact resource (a Hyperliquid 'propose_order' payload) and its destination. It clearly distinguishes this tool from signal-generation and indicator sibling tools by stating it is 'pure compute' with 'no IO', which is a unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states this tool is for composing a payload for a specific downstream tool, which implies when to use it (when preparing an order from a signal). It does not explicitly mention when not to use it or alternatives, but the strong 'no IO' and destination reference provide clear context and distinguish it from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subscribe_signalWait for next signalARead-onlyIdempotent
Long-poll for a NEW signal on (indicator, symbol, resolution). Holds the call for up to timeoutMs (1000-50000 ms) and resolves the instant a signal with time > lastSeenSignalTs is detected. Returns {signal: null, timedOut: true} if nothing happens within the window. Pair with get_indicator_signal to bootstrap lastSeenSignalTs. Idiomatic agent loop: get → subscribe → react → update watermark → loop.
| Name | Required | Description | Default |
|---|---|---|---|
| config | No | ||
| symbol | Yes | ||
| provider | No | ||
| indicator | Yes | Indicator key as returned by list_indicators, e.g. sniperV3 | |
| timeoutMs | No | ||
| resolution | Yes | ||
| lastSeenSignalTs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, and destructiveHint=false, which already indicate this is a safe read operation. The description adds significant behavioral context: it explains long-polling semantics, the timeout returning {signal: null, timedOut: true}, and the watermark condition. This goes beyond annotations, though it doesn't detail edge cases like network errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and front-loads the most critical information (long-poll, condition, timeout). Every sentence adds value: first states purpose, second explains behavior, third gives operational guidance. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (7 params, nested config object) and no output schema, the description covers the essential usage loop and key parameters. It might benefit from explaining what a 'signal' contains, but the sibling get_indicator_signal likely defines that. Overall, sufficiently complete for an agent 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 very low (14%), so the description must compensate. It explains the critical parameter lastSeenSignalTs (the watermark) and timeoutMs (holds the call up to that time). However, it doesn't explicitly describe config, provider, or the exact format of signal, but those are secondary and possibly inferable from sibling context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: long-poll for a new signal on a specific (indicator, symbol, resolution). It explicitly mentions the timeout behavior and the condition (time > lastSeenSignalTs) for detecting a new signal, which is specific and distinguishes it from any simple fetch operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: it says to pair with get_indicator_signal to bootstrap lastSeenSignalTs, and it outlines the idiomatic agent loop (get → subscribe → react → update watermark → loop). This clearly tells the agent when to use this tool and how it fits with siblings, leaving no ambiguity.
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.
6 tool updates
v0.2.1- First observed
get_indicator_full - First observed
get_indicator_signal - First observed
get_signal_confluence - First observed
list_indicators - First observed
propose_trade_from_signal - First observed
subscribe_signal
TDQS
Scored across 6 tools
Each tool maps to a distinct operation: catalog discovery, single-indicator signal envelope, full per-bar payload, multi-indicator confluence, long-poll subscription, and order composition. The two get_indicator_* tools are clearly separated by payload intent, and get_signal_confluence is explicitly a parallel multi-indicator view.
All tool names follow a clean snake_case verb_noun pattern: list_indicators, get_indicator_signal, get_indicator_full, get_signal_confluence, subscribe_signal, propose_trade_from_signal. The shared get_ prefix and logical object naming make the API predictable.
Six tools is well-scoped for a signals MCP: discovery, light read, heavy read, aggregation, streaming, and downstream trade proposal. No tool feels redundant or missing from the core workflow.
The tool surface covers the full signal lifecycle: enumerate indicators, fetch current signals, retrieve full history, compare confluence, subscribe to changes, and convert signals into trade payloads. There are no obvious dead ends or critical missing operations.
Related MCP Connectors
Real-time market events, sentiment, and technical analysis as MCP tools, backed by real data.
Crypto market signals, technical indicators, and sentiment analysis for AI agents.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
100+ MCP tools for AI agents: content metadata, trade intelligence, business-expertise analysis.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables MCP-compatible AI clients to access live crypto market data and AI-driven quantitative analysis, with structured outputs and full observability.-
- FlicenseNot gradedqualityBmaintenanceEnables fetching live crypto market data from Binance, Bybit, and Hyperliquid via MCP tools, including klines, orderbook, funding rates, technical indicators, and market breadth for real-time analysis by LLMs.-
- FlicenseNot gradedqualityDmaintenanceEnables LLMs to trade on MetaTrader 5 via REST API or MCP tools, supporting market/pending orders, position management, and account info retrieval.-
- AlicenseNot gradedqualityBmaintenanceEnables AI models to pull live market data, including quotes, technical indicators, charts, and TradingView screeners, through MCP tools.1MIT