Skip to main content
Glama
Aether-Grid

@sentimentracker/signals-mcp

by Aether-Grid

@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 metadata

Related MCP server: Data Puller MCP Server

Tools

Tool

Purpose

list_indicators

Live catalog from the backend registry — key, displayName, signalKind, description. Call once at session start.

get_indicator_signal

Latest signal envelope (signals[], trades[], currentTrade) for (indicator, symbol, resolution). ~5KB payload — uses metadataOnly=true. The everyday tool.

get_indicator_full

Full per-bar plot arrays + metadata. Typically 100-800 KB; anything over 1 MB of JSON is refused with RESULT_TOO_LARGE (use get_indicator_signal instead). Use only when the LLM needs per-bar context.

get_signal_confluence

Fan-fetch up to 20 indicators in parallel for the same (symbol, resolution), return a confluence table.

subscribe_signal

Long-poll for a NEW signal on (indicator, symbol, resolution). Holds up to timeoutMs (1-50s) and resolves the instant a signal newer than lastSeenSignalTs is detected.

propose_trade_from_signal

Pure compute: turn a signal envelope into a payload ready for @sentimentracker/hyperliquid-mcp's propose_order. Three sizing modes (notionalUsd / fixedBase / riskUsd) + optional TP/SL follow-up.

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

SNT_SIGNALS_SESSION_TOKEN

Works today

Quick dev — log into Sentimentracker, copy session JWT, paste. Refresh on expiry (typically 7-30 days).

SNT_SIGNALS_API_KEY

Works (recommended)

Headless credential minted in Settings → API keys (or POST /api-keys). Premium only. Expires one year after minting; rotate any time from the same page (the old key keeps working for 24 hours). Use this for production / cron / agent loops.

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.js

Once published to npm:

npx -y @sentimentracker/signals-mcp

Env reference

Env var

Default

Notes

SNT_SIGNALS_ENDPOINT

https://api.sentimentracker.com/api

Override for staging / local dev.

SNT_SIGNALS_SESSION_TOKEN

(required if no API key)

Bearer JWT from your authenticated session. Expires; refresh manually.

SNT_SIGNALS_API_KEY

(required if no session token)

Long-lived snt_mcp_… key minted via POST /api-keys. Recommended for headless / production.

SNT_SIGNALS_DEFAULT_PROVIDER

auto

One of auto / hyperliquid / binance / tiingo / intrinio / databento. Per-call override via tool input.

SNT_SIGNALS_REQUEST_TIMEOUT_MS

15000

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

AUTH_MISSING

No session/key configured

Operator must set env var

AUTH_EXPIRED

401 from backend

Operator must refresh token

AUTH_PREMIUM_REQUIRED

403 from backend

Operator must upgrade subscription

BACKEND_TIMEOUT

Fetch timed out

Retry (sparingly) or raise SNT_SIGNALS_REQUEST_TIMEOUT_MS

BACKEND_HTTP_ERROR

5xx or other HTTP failure

Retry with backoff

BACKEND_INVALID_RESPONSE

Non-JSON or malformed body

Bug — file an issue

INPUT_UNKNOWN_INDICATOR

Tool was called with a key not in registry

Correct the input

INPUT_INVALID

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.ts

Rate 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

POST /superchart/indicators/calculate

60 burst + 1/sec sustained (5× for premium)

X-RateLimit-Limit / -Remaining / -Reset (ISO 8601) on every response; 429 + Retry-After when exceeded

POST /superchart/indicators/subscribe

10 burst + 0.5/sec sustained (5× for premium); at most 3 open long polls per user

same headers; 429 when a 4th subscription is opened

API key monthly quota

50,000 successful calls per key per calendar month (UTC); session traffic is not metered

X-RateLimit-Monthly-Limit / -Remaining; 429 + Retry-After until the 1st

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_watchlist covering N (indicator, symbol, resolution) tuples

  • Per-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 today

  • Hosted remote transport (Streamable HTTP + OAuth 2.1) alongside stdio

Releasing

  1. Bump version in package.json and SERVER_VERSION in src/version.ts (a test keeps them equal).

  2. Commit, then git tag vX.Y.Z and git push origin main vX.Y.Z.

  3. The publish workflow runs the tests and publishes to npm through trusted publishing, with provenance. No token or passkey is involved.

License

MIT

Available Tools

6 tools
get_indicator_fullGet full indicator outputA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNo
configNo
symbolYes
providerNo
indicatorYesIndicator key as returned by list_indicators, e.g. sniperV3
resolutionYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '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.

Usage Guidelines5/5

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 signalA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
symbolYes
providerNo
indicatorYesIndicator key as returned by list_indicators, e.g. sniperV3
resolutionYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 confluenceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
symbolYes
providerNo
indicatorsYes
resolutionYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. 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.

Purpose5/5

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.

Usage Guidelines4/5

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 indicatorsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 payloadA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tifNo
coinYes
isPerpNo
markPxYes
signalYes
sizingYes
orderTypeNomarket
reduceOnlyNo
stopLossPxNo
takeProfitPxNo
limitOffsetBpsNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It 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.

Purpose5/5

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.

Usage Guidelines4/5

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 signalA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
configNo
symbolYes
providerNo
indicatorYesIndicator key as returned by list_indicators, e.g. sniperV3
timeoutMsNo
resolutionYes
lastSeenSignalTsNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 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.

Usage Guidelines5/5

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.

  1. 6 tool updatesv0.2.1
    • First observedget_indicator_full
    • First observedget_indicator_signal
    • First observedget_signal_confluence
    • First observedlist_indicators
    • First observedpropose_trade_from_signal
    • First observedsubscribe_signal

TDQS

A4.5/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables MCP-compatible AI clients to access live crypto market data and AI-driven quantitative analysis, with structured outputs and full observability.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables fetching live crypto market data from Binance, Bybit, and Hyperliquid via MCP tools, including klines, orderbook, funding rates, technical indicators, and market breadth for real-time analysis by LLMs.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to trade on MetaTrader 5 via REST API or MCP tools, supporting market/pending orders, position management, and account info retrieval.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI models to pull live market data, including quotes, technical indicators, charts, and TradingView screeners, through MCP tools.
    1
    MIT