Skip to main content
Glama

get_crypto_signal

One complete crypto opportunity by signal_id (from /crypto/scan): classification, opportunity_score (0-100 heuristic, not a win probability), entry zone, stop-loss, take-profit, reward:risk, positive and negative factors, conditions and invalidation conditions, execution economics (net maker/taker), ML horizon scores with evidence status, entry validity versus expected hold, and upstream execution metadata. Market intelligence only: no execution, no custody, no position sizing. Paid per request.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
signal_idYesSignal id from scan_crypto_market, e.g. 'sig_a1b2c3d4e5f6'. Stable across versions of the same opportunity; an unknown id returns 400 and is not charged.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesThe validated input echoed back, i.e. the signal_id you asked for.
adviceYesThe full published advice, passed through 1:1 from the upstream system. entry_zone, stop_loss, take_profit and reward_risk are null for WATCH/NEUTRAL/AVOID, because those classifications carry no concrete entry setup. Buying such a signal is still a valid $0.01 call and a complete answer: you pay for the assessment (classification, score, factors, conditions, economics, ML), not for the presence of a setup.
checked_atYesWhen we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.
disclaimerYesOur product boundary, verbatim in every paid advice response: market intelligence only, no execution, no custody, no position sizing, and opportunity_score is a heuristic rather than a calibrated win probability.
source_as_ofYesUnix seconds — freshness of the upstream advice system's answer.
source_disclaimerNoVerbatim disclaimer of the upstream advice system, passed through unedited.
recommended_next_callYesMachine-readable next step in the chain (scan → signal → validate → evidence → check), so you can follow the workflow without documentation. null means there is explicitly nothing useful to call now; next_check_after then says when to come back.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "advice": {
      +      "description": "The full published advice, passed through 1:1 from the upstream system. entry_zone, stop_loss, take_profit and reward_risk are null for WATCH/NEUTRAL/AVOID, because those classifications carry no concrete entry setup. Buying such a signal is still a valid $0.01 call and a complete answer: you pay for the assessment (classification, score, factors, conditions, economics, ML), not for the presence of a setup.",
      +      "properties": {
      +        "as_of": {
      +          "description": "Unix seconds — market state this advice was computed on.",
      +          "type": "integer"
      +        },
      +        "classification": {
      +          "description": "Spot-long classification derived from opportunity_score (shorts are never advised). Bands: 80-100 STRONG_LONG, 65-79 LONG, 50-64 CONDITIONAL_LONG, 35-49 SPECULATIVE_LONG (concrete entry setup) or WATCH (no concrete setup, so entry_zone/stop_loss/take_profit are null), below 35 AVOID (actively negative signals) or NEUTRAL. EXIT is a fresh strong exit condition. Candidates with internal execution blockers are capped upstream at CONDITIONAL_LONG.",
      +          "enum": [
      +            "STRONG_LONG",
      +            "LONG",
      +            "CONDITIONAL_LONG",
      +            "SPECULATIVE_LONG",
      +            "WATCH",
      +            "NEUTRAL",
      +            "AVOID",
      +            "EXIT"
      +          ],
      +          "type": "string"
      +        },
      +        "coin": {
      +          "description": "Product id of the market, e.g. 'BTC-EUR'.",
      +          "type": "string"
      +        },
      +        "conditions": {
      +          "description": "Conditions under which the setup holds or strengthens, e.g. 'price holds above 58100'.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "disclaimer": {
      +          "description": "Verbatim upstream disclaimer; repeated as source_disclaimer at envelope level.",
      +          "type": "string"
      +        },
      +        "economics": {
      +          "description": "Estimated round-trip economics in percent of position value (1.8 = 1.8%). Taker = crossing the spread for an immediate fill; maker = a cheaper passive limit order that may never fill. Values the source cannot compute are null (e.g. for WATCH/NEUTRAL/AVOID, which have no concrete target).",
      +          "properties": {
      +            "estimated_maker_cost_pct": {
      +              "description": "Estimated round-trip cost in percent assuming passive maker fills on both sides.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "estimated_net_maker_pct": {
      +              "description": "gross_target_pct minus estimated_maker_cost_pct — only realistic if your passive order actually fills.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "estimated_net_taker_pct": {
      +              "description": "gross_target_pct minus estimated_taker_cost_pct — the edge that survives immediate execution. Can be negative.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "estimated_taker_cost_pct": {
      +              "description": "Estimated round-trip cost in percent when entering and exiting as taker (fees plus expected spread/slippage).",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "gross_target_pct": {
      +              "description": "Gross move from entry to take_profit in percent, before costs; null without a concrete setup.",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "maker_fill_not_guaranteed": {
      +              "description": "Always true: the maker figures assume an unguaranteed passive fill, so never plan on them as if the fill were certain.",
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "entry_valid_until": {
      +          "description": "Unix seconds — end of the 30-minute window in which this is a current NEW-entry advice. Not a position deadline; past it the signal is honestly reported STALE.",
      +          "type": "integer"
      +        },
      +        "entry_zone": {
      +          "description": "Price range in which entering is advised; null for WATCH/NEUTRAL/AVOID (no concrete setup).",
      +          "properties": {
      +            "max": {
      +              "description": "Upper bound; above it you would be chasing (price_vs_entry_zone ABOVE).",
      +              "type": "number"
      +            },
      +            "min": {
      +              "description": "Lower bound of the advised entry range, in the quote currency.",
      +              "type": "number"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "estimated_win_probability": {
      +          "description": "Always null until a calibrated probability model exists — we deliberately do not dress opportunity_score up as a probability. Use get_crypto_evidence for the measured win rate.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "execution": {
      +          "description": "Internal eligibility metadata of the UPSTREAM system — informational only, never a permission or prohibition for you. Upstream may block a candidate for its own reasons while the opportunity is perfectly publishable.",
      +          "properties": {
      +            "allowed": {
      +              "description": "Whether the upstream system would trade this itself right now. Says nothing about whether you should.",
      +              "type": "boolean"
      +            },
      +            "blocked_by": {
      +              "description": "snake_case blocker tokens behind allowed=false, e.g. ml_1h_below_threshold, net_edge_below_cost_floor, intraday_trading_disabled, max_positions_reached, not_promoted_for_live, cooldown_active. Empty when allowed is true.",
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "expected_hold_until": {
      +          "description": "Unix seconds — expected holding horizon of the position, always later than entry_valid_until. The entry window can be closed while this horizon still runs.",
      +          "type": "integer"
      +        },
      +        "invalidation_conditions": {
      +          "description": "Conditions that kill the setup; when one triggers, validate_crypto_signal reports invalidation.invalidated=true.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "ml": {
      +          "description": "Machine-learning support behind the advice, per prediction horizon.",
      +          "properties": {
      +            "horizons": {
      +              "description": "One entry per horizon; an empty array means no ML input was available.",
      +              "items": {
      +                "properties": {
      +                  "evidence_status": {
      +                    "description": "How far out-of-sample validation has come. UNVALIDATED = no measured outcomes yet, EARLY_EVIDENCE = too few to lean on, VALIDATED = enough measured evidence, REJECTED = measured and found not to work.",
      +                    "enum": [
      +                      "UNVALIDATED",
      +                      "EARLY_EVIDENCE",
      +                      "VALIDATED",
      +                      "REJECTED"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "horizon_seconds": {
      +                    "description": "Prediction horizon in seconds, e.g. 3600 for the 1-hour model.",
      +                    "type": "integer"
      +                  },
      +                  "model_version": {
      +                    "description": "Identifier of the model, e.g. 'gbdt-intraday-v1-1h'.",
      +                    "type": "string"
      +                  },
      +                  "sample_count": {
      +                    "description": "Measured outcomes behind this evidence_status; 0 means unproven.",
      +                    "type": "integer"
      +                  },
      +                  "score": {
      +                    "description": "Model output for this horizon (0-1); null when the model produced nothing usable.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  },
      +                  "threshold": {
      +                    "description": "Value the score must exceed to count as supportive; below it is a common upstream execution blocker.",
      +                    "type": [
      +                      "number",
      +                      "null"
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "negative_factors": {
      +          "description": "Arguments against the setup; always read these alongside the score. May be empty.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "opportunity_score": {
      +          "description": "0-100 heuristic ranking of setup quality (trend alignment, EMA separation, momentum, volume, breakout/pullback strength, efficiency ratio, regime direction, ML horizon scores, estimated net edge, data/spread quality). NOT a calibrated win probability; the measured win rate lives in get_crypto_evidence.",
      +          "maximum": 100,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "opportunity_type": {
      +          "description": "Setup shape: PULLBACK enters on a retracement inside an existing trend, BREAKOUT enters on a move through resistance.",
      +          "enum": [
      +            "PULLBACK",
      +            "BREAKOUT"
      +          ],
      +          "type": "string"
      +        },
      +        "positive_factors": {
      +          "description": "Arguments in favour of the setup, in plain language. May be empty.",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "publication_status": {
      +          "description": "Publication state of the advice. PUBLISHED = live and current, STALE = retrievable history whose entry window closed, INVALIDATED = an invalidation condition triggered. Expired ids stay retrievable with their real status.",
      +          "enum": [
      +            "PUBLISHED",
      +            "STALE",
      +            "INVALIDATED"
      +          ],
      +          "type": "string"
      +        },
      +        "published_at": {
      +          "description": "Unix seconds — when this version was published.",
      +          "type": "integer"
      +        },
      +        "reward_risk": {
      +          "description": "Distance to take_profit over distance to stop_loss, before costs; null without a concrete setup.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "score_type": {
      +          "description": "Which scheme produced opportunity_score. 'heuristic_v1' is a deterministic, unit-tested heuristic and explicitly signals that the score is not a calibrated probability. Scores are only comparable within one score_type: a 70 of heuristic_v1 says nothing about a 70 of a future heuristic_v2, so any ranking, threshold or history you build resets when this value changes.",
      +          "enum": [
      +            "heuristic_v1"
      +          ],
      +          "type": "string"
      +        },
      +        "setup_timeframe": {
      +          "description": "Candle timeframe the setup was found on, e.g. '15m'; null when not applicable.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "signal_id": {
      +          "description": "Stable id of the opportunity across versions; the input for every other call in the chain.",
      +          "pattern": "^sig_[0-9a-f]{12}$",
      +          "type": "string"
      +        },
      +        "source": {
      +          "additionalProperties": true,
      +          "description": "Provenance for auditing — strategy_version, analyst_model/analyst_prompt_version, critic_model/critic_prompt_version, regime_decision_id (may be null) and snapshot_id. Informational and extensible.",
      +          "type": "object"
      +        },
      +        "stop_loss": {
      +          "description": "Advised invalidation price; null for WATCH/NEUTRAL/AVOID (no concrete setup).",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "strategy": {
      +          "description": "Strategy version that produced this advice, e.g. 'momentum-breakout-v1'; the scope of get_crypto_evidence.",
      +          "type": "string"
      +        },
      +        "take_profit": {
      +          "description": "Advised target price; null for WATCH/NEUTRAL/AVOID (no concrete setup).",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "updated_at": {
      +          "description": "Unix seconds — when this advice was last updated upstream.",
      +          "type": "integer"
      +        },
      +        "version": {
      +          "description": "Version of this advice; increments on every material change (see change_types on check_crypto_signal).",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "checked_at": {
      +      "description": "When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.",
      +      "format": "date-time",
      +      "type": "string"
      +    },
      +    "disclaimer": {
      +      "description": "Our product boundary, verbatim in every paid advice response: market intelligence only, no execution, no custody, no position sizing, and opportunity_score is a heuristic rather than a calibrated win probability.",
      +      "type": "string"
      +    },
      +    "query": {
      +      "description": "The validated input echoed back, i.e. the signal_id you asked for.",
      +      "properties": {
      +        "signal_id": {
      +          "description": "Stable id of the opportunity across versions; the input for every other call in the chain.",
      +          "pattern": "^sig_[0-9a-f]{12}$",
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "recommended_next_call": {
      +      "description": "Machine-readable next step in the chain (scan → signal → validate → evidence → check), so you can follow the workflow without documentation. null means there is explicitly nothing useful to call now; next_check_after then says when to come back.",
      +      "properties": {
      +        "arguments": {
      +          "description": "Arguments to pass verbatim, e.g. {\"signal_id\":\"sig_a1b2c3d4e5f6\"}, plus known_version for check_crypto_signal.",
      +          "type": "object"
      +        },
      +        "reason": {
      +          "description": "Why this is the useful next step, in plain language.",
      +          "type": "string"
      +        },
      +        "tool": {
      +          "description": "Name of the MCP tool to call next.",
      +          "enum": [
      +            "get_crypto_signal",
      +            "validate_crypto_signal",
      +            "get_crypto_evidence",
      +            "check_crypto_signal"
      +          ],
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "source_as_of": {
      +      "description": "Unix seconds — freshness of the upstream advice system's answer.",
      +      "type": "integer"
      +    },
      +    "source_disclaimer": {
      +      "description": "Verbatim disclaimer of the upstream advice system, passed through unedited.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "query",
      +    "checked_at",
      +    "source_as_of",
      +    "advice",
      +    "recommended_next_call",
      +    "disclaimer"
      +  ],
      +  "type": "object"
      +}
  2. Added

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that the opportunity_score is a heuristic (not probability), that the tool provides market intelligence only (no execution, custody, or position sizing), and that it is paid per request with 400 for unknown IDs. This is good behavioral context, though rate limits and authentication are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with core purpose and lists many fields, but remains well-structured with clear sentences. It is slightly verbose but every sentence adds value, earning its place.

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?

Given the single parameter and presence of an output schema, the description is complete. It covers prerequisites (signal from scan), return fields, and constraints (no execution, paid). No important gaps are apparent.

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 100%, and the description adds meaningful context beyond the schema: the signal_id format example, stability across versions, and error handling (unknown ID returns 400 without charge). This enriches understanding of the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

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

The description clearly states the tool retrieves a specific crypto signal by signal_id and lists many fields it returns. It distinguishes from scan_crypto_market by specifying it is for individual signal retrieval, but it does not explicitly differentiate from similar sibling tools like check_crypto_signal or validate_crypto_signal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions that the signal comes from /crypto/scan and is for market intelligence only, providing some usage context. However, it does not explicitly state when to use this tool versus alternatives like validate_crypto_signal, nor does it specify prerequisites beyond having a signal_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.1/5.0
Disambiguation5/5

Every tool targets a distinct action and domain: country-specific company checks (check_ch_company, check_fr_company, etc.), insolvency checks, crypto signals, x402 network tools, etc. Descriptions are detailed and make boundaries clear, with no two tools appearing to do the same thing.

Naming Consistency5/5

Tool names follow very consistent patterns: 'check_<country>_<entity>' for registers, 'crypto_*' for crypto intelligence, 'x402_*' for x402 network functions, 'screen_*' for screening, and a few free-form names like 'verify_eu_vat' and 'lookup_lei' that still fit the verb_noun style. No mixing of conventions.

Tool Count4/5

39 tools is high but justified by the broad scope: the server aggregates many country-specific checks, insolvency registers, crypto tools, x402 monitoring, and auxiliary functions (like phone number buying, LEI lookup). Each tool serves a clear purpose, and the count is not excessive given the coverage. A slight reduction could be possible by merging some country checks, but overall it's reasonable.

Completeness4/5

The server covers major European company registers (CH, UK, FR, NL, NO, PL, CZ, FI), insolvency checks (NL, FR), sanctions screening, VAT validation, crypto market intelligence, and x402 network tools. It acknowledges gaps (e.g., no German check) and provides fallback tools like 'screen_eu_supplier' and 'file_agent_want'. Minor missing pieces (e.g., Italian company check) keep it from a perfect 5.

Resources