agentdata-nl
このMCPでできること
Provides paid company, insolvency, sanctions, regulatory, crypto-market, news, payment-counterparty, and structured web research tools.
ツール
入力スキーマ
{'type': 'object', 'required': ['payment', 'expected'], 'properties': {'payer': {'type': 'object', 'properties': {'wallet': {'type': 'string', 'description': 'the paying 0x-wallet, for on-chain history'}}}, 'payment': {'type': 'object', 'required': ['tx_hash'], 'properties': {'network': {'type': 'string', 'description': 'CAIP-2; defaults to eip155:8453 (Base)'}, 'tx_hash': {'type': 'string', 'description': '0x-prefixed 64-hex settlement tx hash from the PAYMENT-RESPONSE'}}}, 'purpose': {'type': 'string', 'description': 'optional non-identifying label'}, 'expected': {'type': 'object', 'required': ['pay_to'], 'properties': {'amount': {'type': 'string', 'description': 'expected amount in atomic USDC (6 decimals); optional'}, 'pay_to': {'type': 'string', 'description': '0x-address that should have received the payment (yours)'}}}, 'counterparty_name': {'type': 'string', 'description': 'name you know for the payer; screened against EU/UN sanctions, stored only as SHA-256'}}}
入力スキーマ
{'type': 'object', 'required': ['service'], 'properties': {'country': {'type': 'string', 'description': "Optional country slug, e.g. 'england', 'usa' (default: server config)"}, 'service': {'type': 'string', 'description': "Platform to verify for, lowercase, e.g. 'telegram', 'whatsapp', 'google', 'discord', 'openai'"}, 'operator': {'type': 'string', 'description': "Optional operator slug, default 'any'"}}}
入力スキーマ
{'type': 'object', 'properties': {'uid': {'type': 'string', 'description': "Swiss UID (exact), e.g. CHE-105.909.036; provide this or 'name'"}, 'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}}}
入力スキーマ
{'type': 'object', 'properties': {'lei': {'type': 'string', 'description': '20-character LEI code (ISO 17442)'}, 'name': {'type': 'string', 'description': "Crypto firm name; provide this, 'website' or 'lei'"}, 'website': {'type': 'string', 'description': 'Platform website or domain (strongest match)'}}}
入力スキーマ
{'type': 'object', 'required': ['signal_id'], 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': "Signal id you are monitoring, e.g. 'sig_a1b2c3d4e5f6'"}, 'known_version': {'type': 'integer', 'minimum': 1, 'description': 'Version you already hold, e.g. 4; omit it and the answer is always changed=true (no baseline). Poll no earlier than the next_check_after you received.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'required': ['query', 'checked_at', 'source_as_of', 'signal_id', 'known_version', 'current_version', 'changed', 'change_types', 'next_check_after', 'recommended_next_call', 'disclaimer'], 'properties': {'query': {'type': 'object', 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'known_version': {'type': 'integer', 'minimum': 1}}, 'description': 'The validated input echoed back, i.e. signal_id and (if you sent one) known_version.'}, 'status': {'enum': ['ACTIVE', 'STALE', 'INVALIDATED'], 'type': 'string', 'description': 'Live status at call time. ACTIVE = published AND entry window still open, STALE = entry window closed (the hold horizon may still run), INVALIDATED = an invalidation condition triggered. Only ACTIVE is a current new-entry advice.'}, 'changed': {'type': 'boolean', 'description': 'True when current_version differs from your known_version (or when you supplied no baseline); then call get_crypto_signal for the updated advice.'}, 'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'change_types': {'type': 'array', 'items': {'enum': ['score_changed', 'classification_changed', 'entry_zone_changed', 'economics_changed', 'execution_blockers_changed', 'status_changed'], 'type': 'string', 'description': "score_changed = opportunity_score moved; classification_changed = the classification band changed; entry_zone_changed = entry zone, stop-loss or take-profit moved; economics_changed = the cost/net-edge estimate moved; execution_blockers_changed = upstream's internal blockers changed (informational only); status_changed = ACTIVE/STALE/INVALIDATED changed."}, 'description': 'Which kinds of change occurred between your baseline and current_version; empty when nothing changed or no baseline was supplied.'}, 'source_as_of': {'type': 'integer', 'description': 'Unix seconds — freshness of the upstream answer; falls back to our own clock because the check is computed on call.'}, 'known_version': {'type': ['integer', 'null'], 'description': 'The baseline version YOU sent, echoed so the answer can never contradict your input; null when you sent none, and then changed is always true.'}, 'current_version': {'type': 'integer', 'description': 'The version the upstream advice system holds right now.'}, 'next_check_after': {'type': 'integer', 'description': 'Unix seconds — do not poll again before this. Upstream uses now + 300 while ACTIVE and now + 1800 otherwise.'}, 'source_disclaimer': {'type': 'string', 'description': 'Verbatim disclaimer of the upstream advice system, passed through unedited.'}, 'recommended_next_call': {'type': ['object', 'null'], 'properties': {'tool': {'enum': ['get_crypto_signal', 'validate_crypto_signal', 'get_crypto_evidence', 'check_crypto_signal'], 'type': 'string', 'description': 'Name of the MCP tool to call next.'}, 'reason': {'type': 'string', 'description': 'Why this is the useful next step, in plain language.'}, 'arguments': {'type': 'object', 'description': 'Arguments to pass verbatim, e.g. {"signal_id":"sig_a1b2c3d4e5f6"}, plus known_version for check_crypto_signal.'}}, '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.'}}}
入力スキーマ
{'type': 'object', 'properties': {'ico': {'type': 'string', 'description': "8-digit Czech ICO (exact), e.g. 45274649; provide this or 'name'"}, 'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}}}
入力スキーマ
{'type': 'object', 'required': ['name'], 'properties': {'city': {'type': 'string'}, 'name': {'type': 'string', 'description': 'Company name'}, 'kvk_number': {'type': 'string', 'description': '8-digit KVK number (strongly recommended; exact match)'}}}
入力スキーマ
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}, 'business_id': {'type': 'string', 'description': "Finnish Business ID (exact), e.g. 0112038-9; provide this or 'name'"}}}
入力スキーマ
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}, 'siren': {'type': 'string', 'description': "9-digit SIREN (exact), e.g. 552081317; provide this or 'name'"}}}
入力スキーマ
{'type': 'object', 'required': ['siren'], 'properties': {'siren': {'type': 'string', 'description': '9-digit SIREN (exact match; resolve a name via check_fr_company first)'}}}
入力スキーマ
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}, 'organisation_number': {'type': 'string', 'description': "9-digit Norwegian organisation number (exact), e.g. 923609016; provide this or 'name'"}}}
入力スキーマ
{'type': 'object', 'required': ['nip'], 'properties': {'nip': {'type': 'string', 'description': '10-digit Polish NIP (tax id)'}, 'bank_account': {'type': 'string', 'description': 'Optional 26-digit account number (NRB) to verify against the tax register'}}}
入力スキーマ
{'type': 'object', 'properties': {'dti': {'type': 'string', 'description': 'Digital Token Identifier (ISO 24165)'}, 'lei': {'type': 'string', 'description': '20-character LEI of the issuer'}, 'issuer': {'type': 'string', 'description': "Token issuer name; provide this, 'lei' or 'dti'"}}}
入力スキーマ
{'type': 'object', 'properties': {'name': {'type': 'string', 'description': 'Company name to search (up to 5 candidates)'}, 'company_number': {'type': 'string', 'description': "UK company number (exact), e.g. 08804411; provide this or 'name'"}}}
入力スキーマ
{'type': 'object', 'properties': {'pay_to': {'type': 'string', 'description': "0x-address that receives the payment; provide this and/or 'resource'"}, 'resource': {'type': 'string', 'description': 'URL of the x402 service to check'}}}
入力スキーマ
{'type': 'object', 'required': ['feed_handle'], 'properties': {'kinds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional filter: new_signal, classification_changed, status_changed, score_changed, entry_zone_changed, economics_changed, execution_blockers_changed'}, 'limit': {'type': 'number', 'description': 'Max events per page (default 100, max 500)'}, 'cursor': {'type': 'number', 'description': 'Sequence you last saw; omit to continue from your subscription start, 0 for the backlog'}, 'feed_handle': {'type': 'string', 'description': 'Handle returned when you subscribed'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'properties': {'note': {'type': 'string'}, 'count': {'type': 'integer', 'description': 'Number of events returned after your kinds filter.'}, 'cursor': {'type': 'integer', 'description': 'The cursor this page started from.'}, 'events': {'type': 'array', 'items': {'type': 'object', 'properties': {'at': {'type': 'integer', 'description': 'Unix seconds the version was written upstream.'}, 'seq': {'type': 'integer', 'description': 'Ledger sequence of this event; strictly increasing. The cursor you poll with.'}, 'coin': {'type': 'string', 'description': 'Product id, e.g. BTC-EUR.'}, 'kinds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The filterable kinds derived from this event: new_signal for version 1, otherwise the change_types.'}, 'version': {'type': 'integer', 'description': 'Version of the advice after this event; 1 means a brand-new signal.'}, 'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'score_type': {'enum': ['heuristic_v1'], 'type': 'string', '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."}, 'change_types': {'type': 'array', 'items': {'type': 'string'}, 'description': 'What changed versus the previous version; empty on a version-1 event.'}, 'classification': {'enum': ['STRONG_LONG', 'LONG', 'CONDITIONAL_LONG', 'SPECULATIVE_LONG', 'WATCH', 'NEUTRAL', 'AVOID', 'EXIT'], 'type': 'string', '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.'}, 'entry_valid_until': {'type': 'integer', 'description': 'Unix seconds until which a NEW entry was advisable at this version.'}, 'opportunity_score': {'type': 'integer', 'maximum': 100, 'minimum': 0, '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.'}, 'publication_status': {'enum': ['PUBLISHED', 'STALE', 'INVALIDATED'], 'type': 'string', '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.'}, 'previous_classification': {'type': ['string', 'null'], 'description': 'Classification of the previous version; null on a brand-new signal. Different from classification = the flip this feed exists for (e.g. NEUTRAL before, CONDITIONAL_LONG now).'}}, 'description': 'One event = one version row in the upstream publication ledger, oldest first.'}}, 'expired': {'type': 'boolean', 'description': 'Present and true when the subscription lapsed; renew via POST /crypto/feed/renew with the same feed_handle.'}, 'has_more': {'type': 'boolean', 'description': 'True when the ledger page was full — poll again immediately rather than waiting.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'expires_at': {'type': 'string', 'format': 'date-time'}, 'latest_seq': {'type': 'integer', 'description': 'The newest ledger position right now.'}, 'feed_handle': {'type': 'string'}, 'next_cursor': {'type': 'integer', 'description': 'Send this back on your next poll. Advances over filtered-out events too — a kinds filter never rewinds the cursor.'}}, 'description': 'Every published change since your cursor, oldest first, across all covered coins — or expired=true when the subscription lapsed.'}
入力スキーマ
{'type': 'object', 'properties': {}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'properties': {'poll': {'type': 'object', 'description': 'Ready-to-send request for crypto_feed_since.'}, 'renew': {'type': 'object', 'description': 'Ready-to-send request body for POST /crypto/feed/renew ($2.00, adds 30 days on top).'}, 'cursor': {'type': 'integer', 'description': "The current ledger position — start polling from here; history is not replayed as 'new'. Pass cursor 0 once if you want the backlog."}, 'coverage': {'type': 'object', 'description': 'The coins the upstream advice system currently tracks; the list rotates with its universe.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'expires_at': {'type': 'string', 'format': 'date-time', 'description': 'When the subscription lapses; polls then return expired=true until you renew.'}, 'event_kinds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'All kinds you can filter on when polling.'}, 'feed_handle': {'type': 'string', 'pattern': '^[0-9a-f]{24}$', 'description': 'Subscription handle; required on every poll and renewal. Not recoverable if lost.'}, 'methodology': {'type': 'string'}}, 'description': 'Your subscription: 30 days of free, unlimited polling of the advice change feed via crypto_feed_since. Keep feed_handle safe — it is not recoverable.'}
入力スキーマ
{'type': 'object', 'properties': {'days': {'type': 'number', 'description': 'Measurement window in days (default 30, clamped 1..365)'}}}
入力スキーマ
{'type': 'object', 'required': ['coin'], 'properties': {'coin': {'type': 'string', 'description': "Coin/product id, e.g. 'BTC-EUR' (see supported coins in the error on an unknown coin)"}, 'layer': {'enum': ['long', 'regime', 'daytrade', 'both'], 'type': 'string', 'default': 'both', 'description': "Which verdict layer to buy ('regime' is an accepted alias for 'long'); no fresh verdict for it means 400 and no charge"}}}
入力スキーマ
{'type': 'object', 'properties': {}}
入力スキーマ
{'type': 'object', 'required': ['want'], 'properties': {'kind': {'type': 'string', 'maxLength': 32, 'description': "Optional coverage kind, typically one of 'coin', 'country', 'vies_country', 'monitor_host', 'sms_service' — free-form values possible. Sending it makes your intent countable in the aggregate"}, 'want': {'type': 'string', 'maxLength': 280, 'minLength': 10, 'description': 'What you want to buy and cannot buy today, in your own words'}, 'value': {'type': 'string', 'maxLength': 80, 'description': "Optional coverage value, e.g. 'PT'. Same character rules as request_capability"}, 'max_price_usd': {'type': 'number', 'maximum': 1000, 'minimum': 0, 'description': 'Optional: USD per call you would actually pay. Budget-backed intents outrank anonymous wishes'}, 'expected_calls_per_month': {'type': 'integer', 'maximum': 10000000, 'minimum': 1, 'description': 'Optional: calls per month you expect to make'}}}
出力スキーマ
{'type': 'object', 'required': ['query', 'intent_id', 'recorded', 'note', 'checked_at'], 'properties': {'note': {'type': 'string', 'description': 'Verbatim boundary of this endpoint: the fee keeps intents honest, it is not a purchase of the capability and no promise that it gets built; your intent is counted aggregated and anonymised in x402_demand_report, and your wallet and text are never resold.'}, 'query': {'type': 'object', 'description': 'The validated input echoed back, so the record can never contradict what you sent.'}, 'recorded': {'type': 'boolean', 'description': 'Always true on a 200: the intent is stored. A failure to store is a 503 and is not charged.'}, 'intent_id': {'type': 'string', 'description': "Opaque reference for this intent, e.g. 'want_a1b2c3d4e5f6'. Quote it if you follow up; it is random rather than sequential, and there is no lookup endpoint."}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}}, 'description': 'Confirmation that your paid intent was recorded. Nothing is delivered besides the record itself — that is what the $0.01 buys.'}
入力スキーマ
{'type': 'object', 'required': ['signal_id'], 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': "Signal id, e.g. 'sig_a1b2c3d4e5f6'; returns the measured track record of its strategy (win rate over completed outcomes only, with Wilson interval)."}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'required': ['query', 'checked_at', 'source_as_of', 'strategy', 'coin', 'ml_models', 'recommended_next_call', 'disclaimer'], 'properties': {'coin': {'type': ['string', 'null'], 'description': 'Coin the evidence is scoped to; null means too few coin-level samples, so the numbers are strategy-wide.'}, 'note': {'type': 'string', 'description': 'Verbatim upstream note on how populations and metrics relate; states that win rate and returns use completed outcomes only.'}, 'query': {'type': 'object', 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}}, 'description': 'The validated input echoed back, i.e. the signal_id you asked for.'}, 'metrics': {'type': 'object', 'properties': {'win_rate_pct': {'type': ['number', 'null'], 'description': 'Percentage of COMPLETED outcomes that were profitable; denominator is completed (WIN+LOSS+TIME), never detected or published.'}, 'distinct_days': {'type': ['integer', 'null'], 'description': 'Distinct calendar days contributing completed outcomes; low values mean the sample is clustered in time.'}, 'distinct_coins': {'type': ['integer', 'null'], 'description': 'Distinct coins contributing completed outcomes; low values mean the sample is concentrated in one market.'}, 'wilson_low_pct': {'type': ['number', 'null'], 'description': 'Lower bound of the 95% Wilson score interval around win_rate_pct; the conservative read.'}, 'win_definition': {'type': ['string', 'null'], 'description': "How a win is counted; currently always 'net_return_gt_0' — net return after costs above zero, so a profitable TIME exit counts as a win even though it is not in populations.wins."}, 'wilson_high_pct': {'type': ['number', 'null'], 'description': 'Upper bound of the 95% Wilson score interval around win_rate_pct.'}, 'avg_net_return_pct': {'type': ['number', 'null'], 'description': 'Mean net return per completed outcome in percent, after taker costs. Can be negative.'}, 'total_net_return_pct': {'type': ['number', 'null'], 'description': 'Sum of net returns over all completed outcomes in percent — not a compounded account return.'}, 'median_net_return_pct': {'type': ['number', 'null'], 'description': 'Median net return per completed outcome in percent; less outlier-sensitive than the mean.'}, 'completed_sample_count': {'type': ['integer', 'null'], 'description': 'Sample size behind every metric below; small samples mean wide Wilson bounds — read them.'}, 'avg_net_return_maker_pct': {'type': ['number', 'null'], 'description': 'Mean net return assuming passive maker fills; optimistic, because a maker fill is never guaranteed.'}}, 'description': 'Measured over completed outcomes only (WIN + LOSS + TIME). Anything the source cannot compute is null — never fabricated.', 'additionalProperties': {'type': ['number', 'string', 'null']}}, 'strategy': {'type': 'string', 'description': "Strategy version the evidence is scoped to, e.g. 'momentum-breakout-v1'."}, 'ml_models': {'type': 'array', 'items': {'type': 'object', 'properties': {'sample_count': {'type': 'integer', 'description': 'Measured outcomes behind this evidence_status; 0 means nothing has been validated yet.'}, 'model_version': {'type': 'string', 'description': "Identifier of the model, e.g. 'gbdt-intraday-v1-1h'."}, 'evidence_status': {'enum': ['UNVALIDATED', 'EARLY_EVIDENCE', 'VALIDATED', 'REJECTED'], 'type': 'string', '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.'}}}, 'description': 'Machine-learning models used by this strategy and how far their own validation has come.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'populations': {'type': 'object', 'properties': {'wins': {'type': 'integer', 'description': 'Exit-status count of positions that exited on their target — a count of exit REASON, not of profitability (see metrics.win_definition).'}, 'losses': {'type': 'integer', 'description': 'Exit-status count of positions that exited on their stop.'}, 'blocked': {'type': 'integer', 'description': 'Candidates blocked internally upstream (never traded); excluded from all metric denominators.'}, 'pending': {'type': 'integer', 'description': 'Entered positions still open; no outcome yet, so counted nowhere in metrics.'}, 'detected': {'type': 'integer', 'description': 'Candidates the strategy detected, before internal filtering.'}, 'completed': {'type': 'integer', 'description': 'Entered positions with a finished outcome (WIN, LOSS or TIME); the denominator of win_rate_pct and the return metrics.'}, 'published': {'type': 'integer', 'description': 'Candidates published externally as advice.'}, 'time_exits': {'type': 'integer', 'description': 'Exit-status count of positions closed because the holding horizon ran out; a profitable one still counts as a win in win_rate_pct.'}, 'expired_without_entry': {'type': 'integer', 'description': 'Published candidates whose entry window closed without a fill; excluded from all metric denominators.'}}, 'description': 'Disjoint counts over the window, reported apart from the metrics so selection effects stay visible. blocked and expired_without_entry are EXCLUDED from every metric denominator.', 'additionalProperties': {'type': 'integer'}}, 'window_days': {'type': 'integer', 'description': 'Length of the measurement window in days.'}, 'source_as_of': {'type': 'integer', 'description': "Unix seconds — freshness of the upstream advice system's answer."}, 'measured_since': {'type': 'integer', 'description': 'Unix seconds — start of the measurement window.'}, 'source_disclaimer': {'type': 'string', 'description': 'Verbatim disclaimer of the upstream advice system, passed through unedited.'}, 'recommended_next_call': {'type': ['object', 'null'], 'properties': {'tool': {'enum': ['get_crypto_signal', 'validate_crypto_signal', 'get_crypto_evidence', 'check_crypto_signal'], 'type': 'string', 'description': 'Name of the MCP tool to call next.'}, 'reason': {'type': 'string', 'description': 'Why this is the useful next step, in plain language.'}, 'arguments': {'type': 'object', 'description': 'Arguments to pass verbatim, e.g. {"signal_id":"sig_a1b2c3d4e5f6"}, plus known_version for check_crypto_signal.'}}, '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.'}, 'strategy_evidence_status': {'enum': ['UNVALIDATED', 'EARLY_EVIDENCE', 'VALIDATED', 'REJECTED'], 'type': 'string', '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.'}}}
入力スキーマ
{'type': 'object', 'required': ['signal_id'], 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': "Signal 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."}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'required': ['query', 'checked_at', 'source_as_of', 'advice', 'recommended_next_call', 'disclaimer'], 'properties': {'query': {'type': 'object', 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}}, 'description': 'The validated input echoed back, i.e. the signal_id you asked for.'}, 'advice': {'type': 'object', 'properties': {'ml': {'type': 'object', 'properties': {'horizons': {'type': 'array', 'items': {'type': 'object', 'properties': {'score': {'type': ['number', 'null'], 'description': 'Model output for this horizon (0-1); null when the model produced nothing usable.'}, 'threshold': {'type': ['number', 'null'], 'description': 'Value the score must exceed to count as supportive; below it is a common upstream execution blocker.'}, 'sample_count': {'type': 'integer', 'description': 'Measured outcomes behind this evidence_status; 0 means unproven.'}, 'model_version': {'type': 'string', 'description': "Identifier of the model, e.g. 'gbdt-intraday-v1-1h'."}, 'evidence_status': {'enum': ['UNVALIDATED', 'EARLY_EVIDENCE', 'VALIDATED', 'REJECTED'], 'type': 'string', '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.'}, 'horizon_seconds': {'type': 'integer', 'description': 'Prediction horizon in seconds, e.g. 3600 for the 1-hour model.'}}}, 'description': 'One entry per horizon; an empty array means no ML input was available.'}}, 'description': 'Machine-learning support behind the advice, per prediction horizon.'}, 'coin': {'type': 'string', 'description': "Product id of the market, e.g. 'BTC-EUR'."}, 'as_of': {'type': 'integer', 'description': 'Unix seconds — market state this advice was computed on.'}, 'source': {'type': 'object', '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.', 'additionalProperties': True}, 'version': {'type': 'integer', 'description': 'Version of this advice; increments on every material change (see change_types on check_crypto_signal).'}, 'strategy': {'type': 'string', 'description': "Strategy version that produced this advice, e.g. 'momentum-breakout-v1'; the scope of get_crypto_evidence."}, 'economics': {'type': 'object', 'properties': {'gross_target_pct': {'type': ['number', 'null'], 'description': 'Gross move from entry to take_profit in percent, before costs; null without a concrete setup.'}, 'estimated_net_maker_pct': {'type': ['number', 'null'], 'description': 'gross_target_pct minus estimated_maker_cost_pct — only realistic if your passive order actually fills.'}, 'estimated_net_taker_pct': {'type': ['number', 'null'], 'description': 'gross_target_pct minus estimated_taker_cost_pct — the edge that survives immediate execution. Can be negative.'}, 'estimated_maker_cost_pct': {'type': ['number', 'null'], 'description': 'Estimated round-trip cost in percent assuming passive maker fills on both sides.'}, 'estimated_taker_cost_pct': {'type': ['number', 'null'], 'description': 'Estimated round-trip cost in percent when entering and exiting as taker (fees plus expected spread/slippage).'}, 'maker_fill_not_guaranteed': {'type': 'boolean', 'description': 'Always true: the maker figures assume an unguaranteed passive fill, so never plan on them as if the fill were certain.'}}, '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).'}, 'execution': {'type': 'object', 'properties': {'allowed': {'type': 'boolean', 'description': 'Whether the upstream system would trade this itself right now. Says nothing about whether you should.'}, 'blocked_by': {'type': 'array', 'items': {'type': 'string'}, '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.'}}, '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.'}, 'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'stop_loss': {'type': ['number', 'null'], 'description': 'Advised invalidation price; null for WATCH/NEUTRAL/AVOID (no concrete setup).'}, 'conditions': {'type': 'array', 'items': {'type': 'string'}, 'description': "Conditions under which the setup holds or strengthens, e.g. 'price holds above 58100'."}, 'disclaimer': {'type': 'string', 'description': 'Verbatim upstream disclaimer; repeated as source_disclaimer at envelope level.'}, 'entry_zone': {'type': ['object', 'null'], 'properties': {'max': {'type': 'number', 'description': 'Upper bound; above it you would be chasing (price_vs_entry_zone ABOVE).'}, 'min': {'type': 'number', 'description': 'Lower bound of the advised entry range, in the quote currency.'}}, 'description': 'Price range in which entering is advised; null for WATCH/NEUTRAL/AVOID (no concrete setup).'}, 'score_type': {'enum': ['heuristic_v1'], 'type': 'string', '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."}, 'updated_at': {'type': 'integer', 'description': 'Unix seconds — when this advice was last updated upstream.'}, 'reward_risk': {'type': ['number', 'null'], 'description': 'Distance to take_profit over distance to stop_loss, before costs; null without a concrete setup.'}, 'take_profit': {'type': ['number', 'null'], 'description': 'Advised target price; null for WATCH/NEUTRAL/AVOID (no concrete setup).'}, 'published_at': {'type': 'integer', 'description': 'Unix seconds — when this version was published.'}, 'classification': {'enum': ['STRONG_LONG', 'LONG', 'CONDITIONAL_LONG', 'SPECULATIVE_LONG', 'WATCH', 'NEUTRAL', 'AVOID', 'EXIT'], 'type': 'string', '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.'}, 'setup_timeframe': {'type': ['string', 'null'], 'description': "Candle timeframe the setup was found on, e.g. '15m'; null when not applicable."}, 'negative_factors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Arguments against the setup; always read these alongside the score. May be empty.'}, 'opportunity_type': {'enum': ['PULLBACK', 'BREAKOUT'], 'type': 'string', 'description': 'Setup shape: PULLBACK enters on a retracement inside an existing trend, BREAKOUT enters on a move through resistance.'}, 'positive_factors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Arguments in favour of the setup, in plain language. May be empty.'}, 'entry_valid_until': {'type': 'integer', '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.'}, 'opportunity_score': {'type': 'integer', 'maximum': 100, 'minimum': 0, '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.'}, 'publication_status': {'enum': ['PUBLISHED', 'STALE', 'INVALIDATED'], 'type': 'string', '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.'}, 'expected_hold_until': {'type': 'integer', '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.'}, 'invalidation_conditions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Conditions that kill the setup; when one triggers, validate_crypto_signal reports invalidation.invalidated=true.'}, 'estimated_win_probability': {'type': ['number', 'null'], '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.'}}, '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.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'source_as_of': {'type': 'integer', 'description': "Unix seconds — freshness of the upstream advice system's answer."}, 'source_disclaimer': {'type': 'string', 'description': 'Verbatim disclaimer of the upstream advice system, passed through unedited.'}, 'recommended_next_call': {'type': ['object', 'null'], 'properties': {'tool': {'enum': ['get_crypto_signal', 'validate_crypto_signal', 'get_crypto_evidence', 'check_crypto_signal'], 'type': 'string', 'description': 'Name of the MCP tool to call next.'}, 'reason': {'type': 'string', 'description': 'Why this is the useful next step, in plain language.'}, 'arguments': {'type': 'object', 'description': 'Arguments to pass verbatim, e.g. {"signal_id":"sig_a1b2c3d4e5f6"}, plus known_version for check_crypto_signal.'}}, '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.'}}}
入力スキーマ
{'type': 'object', 'required': ['handle'], 'properties': {'handle': {'type': 'string', 'description': 'The handle returned by buy_phone_number'}}}
入力スキーマ
{'type': 'object', 'required': ['messages'], 'properties': {'model': {'enum': ['fast', 'smart', 'reasoning'], 'type': 'string', 'default': 'fast', 'description': 'Price tier: fast $0.002 (DeepSeek v4 Flash), smart $0.02 (GPT-5.4 mini), reasoning $0.03 (DeepSeek v4 Pro)'}, 'messages': {'type': 'array', 'items': {'type': 'object', 'required': ['role', 'content'], 'properties': {'role': {'enum': ['system', 'user', 'assistant'], 'type': 'string'}, 'content': {'type': 'string', 'minLength': 1}}}, 'maxItems': 40, 'minItems': 1, 'description': 'OpenAI-style chat messages; combined content capped at 16k chars (fast) or 32k chars (smart/reasoning)'}, 'max_tokens': {'type': 'integer', 'minimum': 1, 'description': 'Output token cap; tier maxima: fast 1024 (default 512), smart 2048 (default 1024), reasoning 4096 (default 2048, minimum 256 — thinking tokens are spent first)'}, 'temperature': {'type': 'number', 'maximum': 2, 'minimum': 0, 'description': 'Optional sampling temperature (0-2)'}}}
入力スキーマ
{'type': 'object', 'properties': {'lei': {'type': 'string', 'description': "20-character LEI code (ISO 17442); provide this or 'name'"}, 'name': {'type': 'string', 'description': 'Legal entity name to search for'}, 'jurisdiction': {'type': 'string', 'description': 'Optional 2-letter country filter, e.g. NL'}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Number of results to return (1-10, default 5)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}}}
入力スキーマ
{'type': 'object', 'required': ['resource'], 'properties': {'pay_to': {'type': 'string', 'description': "Optional 0x-address you intend to pay; verified against the service's live 402"}, 'resource': {'type': 'string', 'description': 'Full https URL of the x402 endpoint you intend to pay (live probe + monitoring history)'}}}
入力スキーマ
{'type': 'object', 'properties': {}}
入力スキーマ
{'type': 'object', 'required': ['form'], 'properties': {'cik': {'type': 'string', 'maxLength': 10, 'description': 'SEC CIK, 1-10 digits. Provide exactly one of ticker or cik.'}, 'form': {'enum': ['10-K', '10-Q', '8-K'], 'type': 'string', 'description': 'SEC form type: 10-K annual report, 10-Q quarterly report or 8-K material events'}, 'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Maximum filings to return (1-50)'}, 'since': {'type': 'string', 'description': 'Optional inclusive lower bound on filing date, YYYY-MM-DD'}, 'ticker': {'type': 'string', 'maxLength': 10, 'description': 'Stock ticker, case-insensitive (e.g. AAPL). Provide exactly one of ticker or cik.'}}}
入力スキーマ
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'maxLength': 400, 'description': 'Keyword or phrase to search; wrap a multi-word phrase in double quotes for exact match'}, 'sort': {'enum': ['relevance', 'top', 'new', 'hot', 'comments'], 'type': 'string', 'description': 'Result ranking (default relevance)'}, 'time': {'enum': ['hour', 'day', 'week', 'month', 'year', 'all'], 'type': 'string', 'description': 'Time window — applies to sort=top'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Maximum posts to return (1-100)'}, 'subreddit': {'type': 'string', 'description': 'Optional — scope the search to this subreddit (r/ prefix optional); omit for a sitewide search'}}}
入力スキーマ
{'type': 'object', 'required': ['kind', 'value'], 'properties': {'kind': {'type': 'string', 'maxLength': 32, 'description': "What sort of coverage you are missing, e.g. 'coin', 'country', 'monitor_host', 'network', 'sms_service'"}, 'note': {'type': 'string', 'maxLength': 280, 'description': 'Optional free text for us; stored, never resold verbatim, never part of the demand report'}, 'value': {'type': 'string', 'maxLength': 80, 'description': "The exact value that is not covered, e.g. 'DOGE-EUR', 'PT', 'api.example.com'. Letters, digits, space and . _ : / - only — names, registration numbers and free text are rejected on purpose"}, 'endpoint': {'type': 'string', 'description': "Optional: the paid endpoint path you were calling, e.g. '/crypto/verdict'. Unknown paths are stored as null"}}}
入力スキーマ
{'type': 'object', 'properties': {}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'required': ['query', 'checked_at', 'source_as_of', 'count', 'opportunities', 'recommended_next_call', 'disclaimer'], 'properties': {'count': {'type': 'integer', 'description': 'Number of items in opportunities[].'}, 'query': {'type': 'object', 'description': 'The validated input echoed back; this tool takes no input, so it is always an empty object.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'source_as_of': {'type': 'integer', 'description': "Unix seconds — freshness of the upstream advice system's answer."}, 'opportunities': {'type': 'array', 'items': {'type': 'object', 'properties': {'coin': {'type': 'string', 'description': "Product id of the market, e.g. 'BTC-EUR'."}, 'version': {'type': 'integer', 'description': 'Version of this advice; starts at 1 and increments on every material change.'}, 'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'score_type': {'enum': ['heuristic_v1'], 'type': 'string', '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."}, 'published_at': {'type': 'integer', 'description': 'Unix seconds — when this version was published.'}, 'classification': {'enum': ['STRONG_LONG', 'LONG', 'CONDITIONAL_LONG', 'SPECULATIVE_LONG', 'WATCH', 'NEUTRAL', 'AVOID', 'EXIT'], 'type': 'string', '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.'}, 'opportunity_type': {'enum': ['PULLBACK', 'BREAKOUT'], 'type': 'string', 'description': 'Setup shape: PULLBACK enters on a retracement inside an existing trend, BREAKOUT enters on a move through resistance.'}, 'entry_valid_until': {'type': 'integer', 'description': 'Unix seconds — end of the 30-minute new-entry window; after it this is no longer a current entry advice.'}, 'freshness_seconds': {'type': 'integer', 'description': 'Age in seconds at scan time (now minus published_at); lower is fresher.'}, 'opportunity_score': {'type': 'integer', 'maximum': 100, 'minimum': 0, '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.'}, 'publication_status': {'enum': ['PUBLISHED', 'STALE', 'INVALIDATED'], 'type': 'string', '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.'}}, 'description': 'Compact opportunity — enough to rank and pick, not enough to act on; call get_crypto_signal for the full advice.'}, 'description': 'Compact items sorted by opportunity_score descending; an empty array is a valid paid answer meaning nothing is published right now.'}, 'next_check_after': {'type': 'integer', 'description': 'Only present when opportunities[] is empty — unix seconds before which scanning again is pointless (now + 900).'}, 'source_disclaimer': {'type': 'string', 'description': 'Verbatim disclaimer of the upstream advice system, passed through unedited.'}, 'recommended_next_call': {'type': ['object', 'null'], 'properties': {'tool': {'enum': ['get_crypto_signal', 'validate_crypto_signal', 'get_crypto_evidence', 'check_crypto_signal'], 'type': 'string', 'description': 'Name of the MCP tool to call next.'}, 'reason': {'type': 'string', 'description': 'Why this is the useful next step, in plain language.'}, 'arguments': {'type': 'object', 'description': 'Arguments to pass verbatim, e.g. {"signal_id":"sig_a1b2c3d4e5f6"}, plus known_version for check_crypto_signal.'}}, '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.'}}}
入力スキーマ
{'type': 'object', 'required': ['legal_name', 'kvk_number', 'vat_number'], 'properties': {'kvk_number': {'type': 'string', 'description': '8-digit KVK number'}, 'legal_name': {'type': 'string'}, 'vat_number': {'type': 'string', 'description': 'e.g. NL123456789B01'}}}
入力スキーマ
{'type': 'object', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Company/organisation name to screen (entities only, no persons)'}}}
入力スキーマ
{'type': 'object', 'required': ['country', 'name', 'registration_number'], 'properties': {'name': {'type': 'string', 'description': 'Legal/company name (used for sanctions screening and name verification)'}, 'country': {'enum': ['NL', 'FR', 'UK', 'NO', 'CH', 'CZ', 'FI', 'PL'], 'type': 'string', 'description': 'Country of the supplier; coverage differs per country and is reported in the response'}, 'vat_number': {'type': 'string', 'description': 'Optional EU VAT number for VIES validation (NL/FR/CZ/FI only; PL is covered via the whitelist)'}, 'registration_number': {'type': 'string', 'description': 'National register number: KVK (NL), SIREN (FR), company number (UK), orgnr (NO), UID (CH), ICO (CZ), Business ID (FI), NIP (PL)'}}}
入力スキーマ
{'type': 'object', 'required': ['signal_id'], 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': "Signal id to re-check right now, e.g. 'sig_a1b2c3d4e5f6'. Returns status ACTIVE|STALE|INVALIDATED, remaining entry window and economics at the current price."}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'required': ['query', 'checked_at', 'source_as_of', 'signal_id', 'status', 'current_price', 'spread_bps', 'recommended_next_call', 'disclaimer'], 'properties': {'query': {'type': 'object', 'properties': {'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}}, 'description': 'The validated input echoed back, i.e. the signal_id you asked for.'}, 'status': {'enum': ['ACTIVE', 'STALE', 'INVALIDATED'], 'type': 'string', 'description': 'Live status at call time. ACTIVE = published AND entry window still open, STALE = entry window closed (the hold horizon may still run), INVALIDATED = an invalidation condition triggered. Only ACTIVE is a current new-entry advice.'}, 'version': {'type': 'integer', 'description': 'Version of the advice this validation describes.'}, 'economics': {'type': 'object', 'properties': {'gross_target_pct': {'type': ['number', 'null'], 'description': 'Gross move from entry to take_profit in percent, before costs; null without a concrete setup.'}, 'estimated_net_maker_pct': {'type': ['number', 'null'], 'description': 'gross_target_pct minus estimated_maker_cost_pct — only realistic if your passive order actually fills.'}, 'estimated_net_taker_pct': {'type': ['number', 'null'], 'description': 'gross_target_pct minus estimated_taker_cost_pct — the edge that survives immediate execution. Can be negative.'}, 'estimated_maker_cost_pct': {'type': ['number', 'null'], 'description': 'Estimated round-trip cost in percent assuming passive maker fills on both sides.'}, 'estimated_taker_cost_pct': {'type': ['number', 'null'], 'description': 'Estimated round-trip cost in percent when entering and exiting as taker (fees plus expected spread/slippage).'}, 'maker_fill_not_guaranteed': {'type': 'boolean', 'description': 'Always true: the maker figures assume an unguaranteed passive fill, so never plan on them as if the fill were certain.'}}, '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).'}, 'execution': {'type': 'object', 'properties': {'allowed': {'type': 'boolean', 'description': 'Whether the upstream system would trade this itself right now. Says nothing about whether you should.'}, 'blocked_by': {'type': 'array', 'items': {'type': 'string'}, '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.'}}, '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.'}, 'signal_id': {'type': 'string', 'pattern': '^sig_[0-9a-f]{12}$', 'description': 'Stable id of the opportunity across versions; the input for every other call in the chain.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', '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.'}, 'spread_bps': {'type': ['number', 'null'], 'description': 'Observed bid/ask spread in basis points; null when not measurable. A wide spread eats the net edge in economics.'}, 'price_as_of': {'type': 'integer', 'description': 'Unix seconds — when current_price was observed.'}, 'data_quality': {'enum': ['GOOD', 'DEGRADED', 'STALE'], 'type': 'string', 'description': 'Quality of the market data behind this validation: GOOD = fresh and complete, DEGRADED = usable but partial or wide/uncertain, STALE = too old to rely on (treat the price-derived fields with caution).'}, 'invalidation': {'type': 'object', 'properties': {'reasons': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Reasons behind invalidated=true; empty array when not invalidated.'}, 'invalidated': {'type': 'boolean', 'description': 'True when at least one published invalidation condition has been met; the setup is off.'}}, 'description': "Whether the advice's own invalidation conditions have triggered."}, 'source_as_of': {'type': 'integer', 'description': "Unix seconds — freshness of the upstream advice system's answer."}, 'current_price': {'type': ['number', 'null'], 'description': 'Last observed price of the coin upstream; null when no usable price was available (then price_vs_entry_zone is UNKNOWN).'}, 'next_check_after': {'type': 'integer', 'description': 'Only present when status is not ACTIVE — unix seconds before which polling again is pointless (now + 1800).'}, 'entry_valid_until': {'type': 'integer', 'description': 'Unix seconds — end of the 30-minute new-entry window (not a position deadline; the hold horizon lives on the advice as expected_hold_until).'}, 'source_disclaimer': {'type': 'string', 'description': 'Verbatim disclaimer of the upstream advice system, passed through unedited.'}, 'publication_status': {'enum': ['PUBLISHED', 'STALE', 'INVALIDATED'], 'type': 'string', '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.'}, 'price_vs_entry_zone': {'enum': ['BELOW', 'INSIDE', 'ABOVE', 'UNKNOWN'], 'type': 'string', 'description': 'Where current_price sits relative to the advised entry zone: BELOW entry_zone.min, INSIDE the zone, ABOVE entry_zone.max (chasing), or UNKNOWN when there is no price or no concrete entry zone.'}, 'recommended_next_call': {'type': ['object', 'null'], 'properties': {'tool': {'enum': ['get_crypto_signal', 'validate_crypto_signal', 'get_crypto_evidence', 'check_crypto_signal'], 'type': 'string', 'description': 'Name of the MCP tool to call next.'}, 'reason': {'type': 'string', 'description': 'Why this is the useful next step, in plain language.'}, 'arguments': {'type': 'object', 'description': 'Arguments to pass verbatim, e.g. {"signal_id":"sig_a1b2c3d4e5f6"}, plus known_version for check_crypto_signal.'}}, '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.'}, 'execution_blockers_changed': {'type': 'boolean', 'description': "True when the upstream system's internal execution blockers differ from those published with the advice; informational only, never a permission."}, 'entry_window_remaining_seconds': {'type': 'integer', 'description': 'Seconds left in that entry window; 0 or below means it closed and status is no longer ACTIVE.'}}}
入力スキーマ
{'type': 'object', 'required': ['vat_number'], 'properties': {'mode': {'enum': ['fast', 'consultation_proof'], 'type': 'string', 'default': 'fast'}, 'vat_number': {'type': 'string', 'description': 'Country code + national VAT number, e.g. NL123456789B01'}, 'requester_vat_number': {'type': 'string', 'description': 'Required in consultation_proof mode'}}}
入力スキーマ
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'maxLength': 2048, 'description': 'The http(s) URL of the page to read. Literal IP addresses, localhost and non-http(s) schemes are rejected.'}, 'format': {'enum': ['markdown', 'text'], 'type': 'string', 'default': 'markdown', 'description': 'markdown (default) keeps #-headings, [text](url) links and - lists; text is flat plain text'}, 'max_chars': {'type': 'integer', 'default': 20000, 'maximum': 100000, 'minimum': 1000, 'description': 'Maximum content length in characters (1000-100000, default 20000); longer pages are cut and flagged truncated'}}}
入力スキーマ
{'type': 'object', 'required': ['url'], 'properties': {'url': {'type': 'string', 'maxLength': 2048, 'description': 'The http(s) start URL of the site to crawl. Literal IP addresses, localhost and non-http(s) schemes are rejected.'}, 'max_pages': {'type': 'integer', 'default': 5, 'maximum': 20, 'minimum': 2, 'description': 'Maximum pages to crawl, breadth-first over same-host links (2-20, default 5). Priced at $0.001 per requested page; finding fewer pages is still a complete delivery.'}, 'max_chars_per_page': {'type': 'integer', 'default': 5000, 'maximum': 20000, 'minimum': 1000, 'description': 'Maximum content length per page in characters (1000-20000, default 5000); longer pages are cut and flagged truncated'}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Number of results to return (1-10, default 5)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Number of results to return (1-10, default 5)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Number of results to return (1-10, default 5)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Number of results to return (1-10, default 5)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}}}
入力スキーマ
{'type': 'object', 'required': ['query'], 'properties': {'num': {'type': 'integer', 'default': 3, 'maximum': 5, 'minimum': 1, 'description': 'Number of results to search and read (1-5, default 3)'}, 'lang': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter language code for the results, e.g. 'en', 'nl'"}, 'query': {'type': 'string', 'maxLength': 400, 'minLength': 1, 'description': 'The search query, plain text, max 400 characters'}, 'format': {'enum': ['markdown', 'text'], 'type': 'string', 'default': 'markdown', 'description': 'markdown (default) keeps #-headings, [text](url) links and - lists; text is flat plain text'}, 'country': {'type': 'string', 'pattern': '^[A-Za-z]{2}$', 'description': "Optional 2-letter country code to localise results, e.g. 'us', 'nl'"}, 'max_chars_per_page': {'type': 'integer', 'default': 8000, 'maximum': 20000, 'minimum': 1000, 'description': 'Maximum content length per read page in characters (1000-20000, default 8000)'}}}
入力スキーマ
{'type': 'object', 'properties': {}}
出力スキーマ
{'type': 'object', 'required': ['unmet_demand', 'filed_requests', 'paid_wants', 'coverage', 'methodology', 'disclaimer', 'checked_at'], 'properties': {'source': {'enum': ['cache', 'live'], 'type': 'string', 'description': 'Whether this answer came from the 6-hour cache or was aggregated on the spot. Same content either way.'}, 'coverage': {'type': 'object', 'properties': {'sources': {'type': 'array', 'items': {'type': 'string'}, 'description': 'The three measurement sources behind the numbers.'}, 'window_days': {'type': 'integer', 'description': 'Length of the window in days (30).'}, 'first_measurement': {'type': ['string', 'null'], 'description': 'Timestamp of the oldest observation across the sources — read it before trusting a trend; a young measurement cannot show one. null means nothing has been observed yet.'}}, 'description': 'What this report was built from and how far back it can see.'}, 'checked_at': {'type': 'string', 'format': 'date-time', 'description': 'When we produced this answer (ISO 8601, UTC). The only ISO timestamp in the payload; every other timestamp is unix seconds.'}, 'disclaimer': {'type': 'string', 'description': 'Verbatim boundary: demand at one provider, shaped by what we happen to sell — absence of demand here is not evidence of absence of a market.'}, 'paid_wants': {'type': 'object', 'properties': {'total': {'type': 'integer', 'description': 'Number of settled paid intents filed in the window.'}, 'with_price': {'type': 'integer', 'description': 'How many of those intents named a price they would pay per call.'}, 'max_price_usd': {'type': 'object', 'properties': {'avg': {'type': ['number', 'null'], 'description': 'Mean of the named prices; a mean over a handful of intents is not a market price. null when withheld or absent.'}, 'max': {'type': ['number', 'null'], 'description': 'Highest named price per call; null when withheld or absent.'}, 'min': {'type': ['number', 'null'], 'description': 'Lowest named price per call; null when withheld or absent.'}}, 'description': "Distribution of the named price points in USD per call. All null when nobody named one, and also all null when fewer than 3 intents named one — then price_stats_suppressed is true, because min/avg/max over one or two intents just discloses a single counterparty's price."}, 'distinct_wallets': {'type': 'integer', 'description': 'How many different wallets filed them — the count only; wallets are stored as keyed hashes and never returned.'}, 'price_stats_suppressed': {'type': 'boolean', 'description': 'Present and true only when price points existed but fewer than 3, so min/avg/max were withheld. Absent when the stats are published or when nobody named a price at all.'}}, 'description': 'Paid $0.01 intents in the window whose payment actually settled and which came from external traffic, as counts only. Deliberately without kind/value rows, wallet hashes or intent text.'}, 'methodology': {'type': 'string', 'description': 'Exactly how each number is counted, including which traffic is excluded and what is never included.'}, 'generated_at': {'type': 'string', 'format': 'date-time', 'description': 'When the aggregate itself was computed; it is cached for up to 6 hours, so this can be older than checked_at.'}, 'unmet_demand': {'type': 'array', 'items': {'type': 'object', 'properties': {'kind': {'type': 'string', 'description': 'What sort of coverage was missing — typically one of coin, country, vies_country, monitor_host, sms_service; free-form values possible.'}, 'calls': {'type': 'integer', 'description': 'Number of rejected paid calls in the window. One busy caller can dominate this — read distinct_days and distinct_wallets too.'}, 'value': {'type': ['string', 'null'], 'description': "The exact value that was asked for, e.g. 'DOGE-EUR'. null means only the kind of the gap was recorded and not the value itself."}, 'distinct_days': {'type': 'integer', 'description': 'Number of distinct days it was asked; sustained demand shows up here, a single burst does not.'}, 'distinct_wallets': {'type': 'integer', 'description': 'How many different paying wallets asked for it, counted over keyed hashes; the wallets themselves are never returned.'}}}, 'description': 'Calls we had to reject because a requested capability value is not covered, counting ONLY rejections where the caller had already presented a verified payment proof — the strongest signal here, because somebody was demonstrably willing to pay. Rejections that happen before the payment proof are free to produce and are excluded on purpose. External traffic only, top 50 by calls.'}, 'filed_requests': {'type': 'array', 'items': {'type': 'object', 'properties': {'kind': {'type': 'string', 'description': 'Coverage kind as filed — typically one of coin, country, vies_country, monitor_host, sms_service; free-form values possible.'}, 'value': {'type': 'string', 'description': 'Coverage value as filed.'}, 'requests': {'type': 'integer', 'description': 'Number of filings in the window.'}, 'distinct_days': {'type': 'integer', 'description': 'Number of distinct days it was filed.'}, 'distinct_senders': {'type': 'integer', 'description': 'How many different senders filed it, counted over keyed IP hashes; one sender filing twenty times is not twenty parties.'}}}, 'description': 'Coverage gaps agents filed themselves via the free request_capability tool, per (kind, value), top 50 by count. Free-text notes are never included. Free intake is capped per sender per day through an eventually consistent store, so that cap is approximate.'}}, 'description': 'Demand observed at ONE provider over 30 days, aggregates only. No wallet, no free text and no subject identifier appears anywhere in this payload.'}
入力スキーマ
{'type': 'object', 'required': ['feed_handle', 'hosts'], 'properties': {'hosts': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Hostnames or full URLs, max 50'}, 'cursor': {'type': 'number', 'description': 'Sequence you last saw; omit to use your subscription start'}, 'feed_handle': {'type': 'string', 'description': 'Handle returned when you subscribed'}}}
入力スキーマ
{'type': 'object', 'required': ['feed_handle'], 'properties': {'kinds': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional filter: down, up, payto_drift, amount_drift, manifest_gained, manifest_lost'}, 'limit': {'type': 'number', 'description': 'Max events per page (default 100, max 500)'}, 'cursor': {'type': 'number', 'description': 'Sequence you last saw; omit to continue from your subscription start, 0 for the backlog'}, 'feed_handle': {'type': 'string', 'description': 'Handle returned when you subscribed'}}}
入力スキーマ
{'type': 'object', 'properties': {}}
入力スキーマ
{'type': 'object', 'properties': {}}
入力スキーマ
{'type': 'object', 'required': ['host'], 'properties': {'host': {'type': 'string', 'description': 'Hostname of the x402 service (e.g. api.example.com) or a full URL; 30-day monitoring history'}}}
最近のツール変更
類似のMCPサーバー
aether-developer
Searches SEC filings, earnings transcripts, institutional holdings, partner research, and EU financial regulations, with cited re…
Insurers Global
Provides a source-linked directory of licensed insurers, regulators, insurance groups, ownership relationships, historical names …
Official Source Evidence
Provides paid public-source snapshots, SEC Form D funding signals, and exact-address OFAC payment preflight checks through x402 p…
CVM: Processos Administrativos Sancionadores
Queries official CVM records for administrative sanctioning proceedings.
CVM Processos Sancionadores
Looks up public CVM enforcement proceedings for individuals or companies using CPF or CNPJ.
CVM: Processos Sancionadores Julgados
Queries official records of adjudicated CVM sanctioning proceedings.
crowdspace
Searches crowdfunding and P2P lending platforms and provides market statistics, industry news, and country-specific regulatory in…
304NotModified
Provides sourced, dated factual answers on regulatory and business topics and performs deterministic financial market calculation…