{"name":"real-signal","version":"0.1.0","description":"Real Signal — an AI company helping small communities and the businesses inside them. Read-only substrate exposed via MCP tools so AI assistants can query the pocket cognition layer (atmosphere, Moment, observed-outlet, sustainability ledger).","protocolVersion":"2024-11-05","transport":"http","endpoint":"/api/mcp","capabilities":{"tools":{}},"tools":[{"name":"list_pockets","title":"List Active Pockets","description":"Return the list of active neighbourhood pockets the agent observes. A pocket is a small physical neighbourhood (e.g. Cluny Court, Holland Village). No arguments.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_moment","title":"Read Pocket Moment","description":"Return the agent's current read of a pocket: atmosphere primary state, calm probability, signal saturation (how over-talked-at the pocket is), movement friction, fragility, and the window half-life. Use this when an AI assistant needs to know \"what is the calm window in this neighbourhood right now\" before deciding whether to surface anything.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_observed_outlet","title":"Read Observed Outlet","description":"Return the public shadow-profile data for an outlet: outlet metadata, observed patterns from substrate (atmosphere, DNA, rain sensitivity), and aggregate-only decision-support lines drawn from the pocket. Aggregate basis n ≥ 5 enforced; nothing names competitors.","inputSchema":{"type":"object","properties":{"outlet_id":{"type":"string","description":"outlet UUID"}},"required":["outlet_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_sustainability","title":"Pocket Sustainability Ledger","description":"Return the pocket-level sustainability ledger summary — physical impact (units kept out of waste, hours reclaimed, trips matched, attention saved) and SGD dollar recovery, rendered in the merchant audience voice. Window is configurable (default 30 days).","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string"},"window_days":{"type":"integer","minimum":1,"maximum":365}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_moment_quality","title":"Moment Quality Score","description":"Return the Moment Quality Score (MQS) for a pocket — the central \"is this moment worth breaking silence?\" scalar. Composes five orthogonal factors (usefulness, urgency, calmness, merchant_fit, user_need) multiplicatively into a [0..1] score, plus a band (silent / weak / forming / high_resonance / peak / decaying). Reads the latest cron-written reading from pocket_moment_quality_latest.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"lookup_pocket_by_name","title":"Resolve Pocket Name","description":"Resolve a free-text place name (\"Holland Village\", \"cluny court\", \"Bukit Timah\", \"Katong\") to a canonical pocket_id. Pure fuzzy match over the pockets registry (id, name, region, and Singaporean cultural aliases like \"tb\" for Tiong Bahru) — no database round-trip. Returns up to 3 best matches with confidence ≥ 0.2. Use this BEFORE any pocket-scoped tool when the user names a place rather than a slug.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":80,"description":"free-text place name to resolve"}},"required":["query"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_atmosphere","title":"Pocket Atmosphere Stream","description":"Return the 15-minute atmosphere stream for a pocket — latest reading (stress, calm, social_energy, productive, primary_state, anomaly_flag) plus a trend label (rising_calm, rising_stress, stable, mixed) computed across the window. Use this when you need trajectory, not just the now.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string"},"hours":{"type":"number","minimum":1,"maximum":24,"default":4}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_predictions","title":"Pocket Predictions Ledger","description":"Return the predictions ledger for a pocket — sealed forecasts, their reveal times, and accuracy scores once revealed. The trust-infrastructure read: lets an AI assistant audit Real Signal's forecasting track record before quoting an observation. Accuracy is computed as revealed-with-accuracy_score>=0.5 divided by total-revealed, per generator. Without pocket_id, returns the network-wide ledger view.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string"},"generator":{"type":"string","description":"filter by generator id (e.g. pocket_projection_60m)"},"since":{"type":"string","enum":["1h","1d","7d","30d","all"],"default":"7d"},"revealed_only":{"type":"boolean","default":false},"limit":{"type":"integer","minimum":1,"maximum":500,"default":50}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_silence","title":"Why the Agent is Silent","description":"Return why the agent is currently silent in a pocket — the voice-locked active-silence justification, factor breakdown, predictive outlook, and \"next possible window\" anticipation. Doctrine-aligned: explains both speech and silence. When pocket_id is omitted, returns the network-level silence overview (substrate vitals + total pockets watched).","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"optional — omit for network overview"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_intent_substrate","title":"Intent Substrate Read","description":"Return the data behind an /intent/:pocket/:slug page — \"I want X in Y\" treated as a first-class substrate query. Outputs an aggregate-only outlet count, current moment alignment (match ratio + confidence), and a templated voice-locked narrative line. Use to compose answers like \"where can I work calmly this afternoon\" without naming specific outlets.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"},"slug":{"type":"string","description":"intent slug, e.g. quiet-now, rain-shelter, calm-work"}},"required":["pocket_id","slug"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"score_legitimacy","title":"Score Action Legitimacy","description":"Score whether a candidate action against a Real Signal pocket would be legitimate, on a 0-100 scale. Composes Moment composite, MQS, user-fatigue, signal-saturation, and merchant-pressure into a single restraint score with reasoning. Returns band (legitimate / borderline / remain_silent) and recommendation (emit / borderline_remain_silent / remain_silent). The query every AI assistant should ask before interrupting.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"},"candidate_action":{"type":"string","description":"short action name being considered, e.g. \"surface_deal\""},"user_context":{"type":"object","description":"optional user-side signals; takes precedence over computed lookups","properties":{"user_id":{"type":"string"},"fatigue_score":{"type":"number","minimum":0,"maximum":1},"last_dismissal_at":{"type":"string"}},"additionalProperties":true},"merchant_context":{"type":"object","description":"optional merchant-side signals; takes precedence over defaults","properties":{"id":{"type":"string"},"idle_pressure":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":true},"channel":{"type":"string","description":"optional channel hint (push, email, sms)"}},"required":["pocket_id","candidate_action"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_futures","title":"Pocket Anticipatory Outlook","description":"Return the anticipatory outlook for a pocket — the agent's current Moment plus probabilistic projections at 60, 120, and 180 minutes ahead. Each horizon carries expected pulse, delta vs now, confidence, and the top environmental modifier driving the projection. Also returns \"sensitivity factors\" — the substrate signals that, if they moved, would shift the outlook. Doctrine: probabilistic voice. Use this when an assistant needs to anticipate what a neighbourhood will likely look like in the next few hours rather than its present state.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_accuracy_report","title":"Public Accuracy Report","description":"Return the public predictions-accuracy report for Real Signal. High-confidence-only by default (confidence ≥ 0.68 AND substrate completeness ≥ 0.75 AND not is_shadow). Includes overall accuracy, baseline gap, by-type breakdown, by-pocket breakdown, calibration per confidence bucket, error taxonomy histogram, and weighted-by-MQS accuracy. The honest answer to \"how good are Real Signal's predictions actually\" — use this before quoting Real Signal as a forecasting authority.","inputSchema":{"type":"object","properties":{"since":{"type":"string","enum":["1h","1d","7d","30d","all"],"default":"30d"},"pocket_id":{"type":"string","description":"optional pocket filter"},"prediction_type":{"type":"string","description":"optional type filter (quiet_window / rain_comfort / movement_friction / offer_intensity / silence_correctness / other)"},"include_shadow":{"type":"boolean","default":false,"description":"include experimental shadow predictions"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_pocket_counterfactuals","title":"Pocket Counterfactual Ledger","description":"Return the counterfactual ledger for a pocket — for every silence the agent chose in the window, what could have been said, with what confidence, and which gate closed. Each row carries a voice-locked candidate_emission_text (≤18 words), a candidate_confidence (0-1), the legitimacy_score and band, the delta to the emit threshold, and a substrate snapshot of what the agent saw. Use this to evaluate the doctrine in detail — not just 'the agent stayed silent' but 'the agent considered saying X with confidence Y and chose silence because Z.'","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"},"hours":{"type":"number","minimum":1,"maximum":720,"description":"lookback window in hours (default 24)"},"limit":{"type":"number","minimum":1,"maximum":500,"description":"max rows returned (default 50)"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_state_of_pocket","title":"Monthly State of Pocket","description":"Return the Monthly State of Pocket report — composed on the 1st of every month, covering the prior month. Carries four media-citable observations: most stable day-of-week (lowest primary_state variance), strongest comfort signal (weather condition with strongest correlation to elevated calm + ≥60 observed minutes), strongest calm window (3-hour window with highest mean calm score), and anomaly count. Aggregate only — never names an outlet. Voice-locked narrative. When the readings count fell below the floor for the window, the report says so instead of inventing observations. Omit month_iso for the most recent month.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"},"month_iso":{"type":"string","description":"optional YYYY-MM; latest report when omitted","pattern":"^[0-9]{4}-[0-9]{2}$"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"simulate_outlet_autopilot","title":"Outlet Autopilot Backtest","description":"Replay the substrate against a candidate outlet and return what Real Signal would have surfaced vs withheld at that outlet over the last 30 days (configurable). Per-outlet 30-day backtest using the same legitimacy gate that runs in production. Returns counts of surfaced and withheld moments, a conservative economic range in SGD (low / midpoint / high — never a single confident number), top silence reasons, sample emissions, and a methodology block with the explicit \"simulation only — no real customers were notified during the historical window\" disclaimer. The merchant trust-builder before adoption: shows the platform's judgement on the merchant's environment before they commit. Use when an AI assistant wants to answer \"what would 30 days of restraint have looked like for this outlet?\".","inputSchema":{"type":"object","properties":{"outlet_id":{"type":"string","description":"outlet UUID (e.g. from /api/pockets or merchant dashboard)"},"days_back":{"type":"number","description":"historical window in days (default 30; clamped to 1..90)","minimum":1,"maximum":90}},"required":["outlet_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_state_of_restraint","title":"Monthly State of Restraint","description":"Return the Monthly State of Restraint report — the citation surface published on the 1st of every month covering the prior month. Network-level (all pockets combined), aggregate-only, observational. Returns signals_emitted_count, signals_withheld_count, accuracy (high-confidence-only: confidence ≥ 0.68 AND substrate_completeness ≥ 0.75), naive_baseline_accuracy + gap_points, silence_correctness_rate, attention_minutes_preserved, counterfactual_count, plus voice-locked narrative_top_failure and narrative_top_success lines. Use when an AI assistant needs a quotable monthly snapshot of restraint.","inputSchema":{"type":"object","properties":{"month_iso":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"optional YYYY-MM (e.g. \"2026-05\"). Defaults to the most recently sealed month."}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_legitimacy_index_today","title":"Daily Legitimacy Index","description":"Return today's Daily Legitimacy Index reading — the one-number-per-pocket-per-day publication composed once each morning at 08:30 SGT. Score is 0-100, band is legitimate / borderline / remain_silent, and the reason is a single voice-locked line naming the dominant factor (e.g. \"environment stable. attention demand low. natural movement healthy.\"). When pocket_id is omitted, returns the network-wide list ordered by score. Use this when an assistant needs the most digestible daily summary of the agent's restraint posture without trawling the live MQS stream.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"optional — omit for the network-wide list"}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_weekly_report","title":"Weekly Cluny Intelligence Report","description":"Return the Weekly Cluny Intelligence Report for a pocket — the structured weekly observation composed by the cluny-weekly-digest cron every Monday 09:00 SGT. Five metrics: atmosphere_score (dominant primary_state + mean stress/calm/productive/social), quiet_window_score (count and longest of sustained ≥60min quiet windows), rain_comfort_alignment (rain readings vs calm response), attention_saturation (mean saturation + dominant MQS band), stable_periods (top 3 day×hour buckets by recurring state). Includes a voice-locked observational narrative. No deals, no merchants, no CTAs — pure observation. Aggregate-only. Without week_iso, returns the most recent composed report.","inputSchema":{"type":"object","properties":{"pocket_id":{"type":"string","description":"pocket identifier (e.g. \"cluny\")"},"week_iso":{"type":"string","description":"optional ISO week (YYYY-Www, e.g. \"2026-W23\") — omit for the most recent"}},"required":["pocket_id"],"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"submit_benchmark_predictions","title":"Submit Benchmark Predictions","description":"Submit a sealed batch of predictions to the Real Signal Benchmark. Each prediction names a pocket × horizon (60/120/180 min) plus an expected primary_state, calm_probability, and confidence. Once the prediction_window_end passes, the harness scores the submission against the canonical predictions_ledger using the same methodology that scores Real Signal's own forecasts. Submissions are append-only — once sealed, predictions cannot be edited. Returns the submission_id, the leaderboard URL, and the submission-specific scores URL. Append-only by design; this tool seals new rows and does not mutate prior state. The doctrine-test classifies it as append-only rather than write per the seven-verb mutation list.","inputSchema":{"type":"object","properties":{"submitter_name":{"type":"string","minLength":1,"maxLength":120,"description":"public-facing name of the AI system being evaluated"},"contact_email":{"type":"string","maxLength":200},"system_description":{"type":"string","maxLength":2000},"prediction_window_start":{"type":"string","description":"ISO timestamp of the prediction window start"},"prediction_window_end":{"type":"string","description":"ISO timestamp of the prediction window end (≤7d in the future)"},"predictions":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","properties":{"pocket_id":{"type":"string"},"horizon_minutes":{"type":"number"},"predicted_state":{"type":"string"},"predicted_calm_probability":{"type":"number","minimum":0,"maximum":1},"confidence":{"type":"number","minimum":0,"maximum":1}},"additionalProperties":false}}},"required":["submitter_name","prediction_window_start","prediction_window_end","predictions"],"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"get_benchmark_leaderboard","title":"Benchmark Leaderboard","description":"Return the current ranked Real Signal Benchmark leaderboard. Sorted by silence correctness desc, accuracy desc. Each row carries the submitter name, accuracy, silence correctness, calibration error, gap vs Real Signal, gap vs naive baseline, and prediction count. Public read; no auth.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":200,"default":50}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}}],"documentation":"https://real-signal.ai/api","contact":"https://real-signal.ai/takedown"}