{"ok":true,"server":"northern-forge-mcp","tools":[{"name":"list_live_products","description":"List Northern Forge live products (title, url, blurb, monetization). Free core tool for agents.","inputSchema":{"type":"object","properties":{"kind":{"type":"string","description":"Optional filter: web_tool | mcp_server | agent_skill"},"limit":{"type":"number","description":"Max products (default 50)"}}},"free":true,"localOnly":false,"example":{"limit":5,"kind":"web_tool"},"examples":[{"limit":5,"kind":"web_tool"}]},{"name":"get_product","description":"Get one product by product_id or slug.","inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"product_id or slug"}},"required":["id"]},"free":true,"localOnly":false,"example":{"id":"mi-golden-hour"},"examples":[{"id":"mi-golden-hour"}]},{"name":"popular_tools","description":"Hot/popular product ranks from conversion analytics (when available). Falls back to catalog seeds.","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Default 12"}}},"free":true,"localOnly":false,"example":{"limit":8},"examples":[{"limit":8}]},{"name":"post_event","description":"Record an analytics event (product_view, product_open, card_click, agent_tool_call).","inputSchema":{"type":"object","properties":{"type":{"type":"string"},"product_id":{"type":"string"},"source":{"type":"string"},"meta":{"type":"object"}},"required":["type","product_id"]},"free":true,"localOnly":false,"example":{"type":"product_view","product_id":"northern-forge-mcp","source":"example"},"examples":[{"type":"product_view","product_id":"northern-forge-mcp","source":"example"}]},{"name":"get_payment_link","description":"Return known Stripe payment link URL for a product if configured (pro unlock).","inputSchema":{"type":"object","properties":{"product_id":{"type":"string"}},"required":["product_id"]},"free":true,"localOnly":false,"example":{"product_id":"mi-golden-hour"},"examples":[{"product_id":"mi-golden-hour"}]},{"name":"forge_status","description":"Public forge status: hub URL, MCP endpoint, conversion API, product count, manifesto surfaces.","inputSchema":{"type":"object","properties":{}},"free":true,"localOnly":false,"example":{},"examples":[{}]},{"name":"list_mcp_tools","description":"List this server tools with schemas (self-describe).","inputSchema":{"type":"object","properties":{}},"free":true,"localOnly":false,"example":{"public_only":true},"examples":[{"public_only":true}]},{"name":"golden_hour_windows","description":"Compute approximate sunrise/sunset/golden-hour windows for lat/lon/date (no API key). MVP solar math.","inputSchema":{"type":"object","properties":{"lat":{"type":"number","description":"Latitude"},"lon":{"type":"number","description":"Longitude"},"date":{"type":"string","description":"ISO date YYYY-MM-DD (default today UTC)"}},"required":["lat","lon"]},"free":true,"localOnly":false,"example":{"lat":46.545,"lon":-87.395,"date":"2026-07-29"},"examples":[{"lat":46.545,"lon":-87.395,"date":"2026-07-29"},{"lat":42.33,"lon":-83.05,"date":"2026-12-21"}]},{"name":"pack_weight_sum","description":"Sum gear pack items in grams. items: [{name, grams, qty?, class?}] where class is base|worn|consumable. Returns total, base weight (the comparable number), pack weight excluding worn, and the three heaviest items.","inputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"grams":{"type":"number"},"qty":{"type":"number"},"class":{"type":"string","description":"base (default) | worn | consumable"}},"required":["grams"]}}},"required":["items"]},"free":true,"localOnly":false,"example":{"items":[{"name":"tent","grams":1200,"qty":1,"class":"base"},{"name":"stove","grams":340,"qty":1,"class":"base"},{"name":"boots","grams":900,"qty":1,"class":"worn"},{"name":"water","grams":1000,"qty":2,"class":"consumable"}]},"examples":[{"items":[{"name":"tent","grams":1200,"qty":1,"class":"base"},{"name":"stove","grams":340,"qty":1,"class":"base"},{"name":"boots","grams":900,"qty":1,"class":"worn"},{"name":"water","grams":1000,"qty":2,"class":"consumable"}]}]},{"name":"prompt_variants","description":"Split a goal+notes blob into Claude / GPT / Grok oriented prompt variants (local, no LLM call).","inputSchema":{"type":"object","properties":{"goal":{"type":"string"},"notes":{"type":"string"}},"required":["goal"]},"free":true,"localOnly":false,"example":{"goal":"Write a launch note for a free JSON→TS tool","notes":"Indie makers · local-first · no account required"},"examples":[{"goal":"Write a launch note for a free JSON→TS tool","notes":"Indie makers · local-first"},{"goal":"Plan a UP day hike with golden hour photos","notes":"Porcupine Mountains · late July"}]},{"name":"diff_text","description":"Line-by-line diff of two text blobs. Returns unified-style +/- lines and add/remove/unchanged counts.","inputSchema":{"type":"object","properties":{"a":{"type":"string","description":"Original text"},"b":{"type":"string","description":"Modified text"}},"required":["a","b"]},"free":true,"localOnly":false,"example":{"a":"hello\nworld\nline three","b":"hello\nforge\nline three"},"examples":[{"a":"hello\nworld","b":"hello\nforge"},{"a":"const x = 1;","b":"const x = 2;\nconst y = 3;"}]},{"name":"cron_explain","description":"Explain a 5-field cron expression (minute hour day-of-month month day-of-week) in plain English.","inputSchema":{"type":"object","properties":{"expr":{"type":"string","description":"Cron expression, e.g. \"0 9 * * 1-5\""}},"required":["expr"]},"free":true,"localOnly":false,"example":{"expr":"0 9 * * 1-5"},"examples":[{"expr":"0 9 * * 1-5"},{"expr":"*/15 * * * *"},{"expr":"0 0 1 * *"},{"expr":"30 18 * * 0"}]},{"name":"unit_convert","description":"Convert a numeric value between units: length, mass, volume, time, data size, and temperature.","inputSchema":{"type":"object","properties":{"value":{"type":"number","description":"Numeric value to convert"},"from":{"type":"string","description":"Source unit, e.g. \"km\", \"lb\", \"celsius\""},"to":{"type":"string","description":"Target unit, e.g. \"mi\", \"kg\", \"fahrenheit\""}},"required":["value","from","to"]},"free":true,"localOnly":false,"example":{"value":5,"from":"km","to":"mi"},"examples":[{"value":5,"from":"km","to":"mi"},{"value":72,"from":"f","to":"c"},{"value":1.5,"from":"lb","to":"kg"},{"value":2048,"from":"mb","to":"gb"}]},{"name":"slug_case","description":"Convert text into slug/kebab, snake_case, camelCase, PascalCase, CONSTANT_CASE, and Title Case variants.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text to convert"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"Northern Forge MCP Server"},"examples":[{"text":"Northern Forge MCP Server"},{"text":"JSON to TypeScript interfaces"}]},{"name":"reading_time","description":"Estimate reading time for a blob of text (word/char counts, minutes and mm:ss at a given or default WPM).","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Text to measure"},"wpm":{"type":"number","description":"Words per minute (default 200)"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"Agents call tools over HTTP. Free cores, clear schemas, no fluff. Ship the smallest working version first and measure what people open.","wpm":200},"examples":[{"text":"Agents call tools over HTTP. Free cores, clear schemas, no fluff. Ship the smallest working version first and measure what people open.","wpm":200}]},{"name":"json_to_ts","description":"Infer TypeScript interfaces from a JSON string (or object). Local, no LLM. Caps depth/size for agent safety.","inputSchema":{"type":"object","properties":{"json":{"type":"string","description":"JSON text to convert (preferred)"},"root_name":{"type":"string","description":"Root interface name (default Root)"}},"required":["json"]},"free":true,"localOnly":false,"example":{"json":"{\"id\":1,\"name\":\"forge\",\"tags\":[\"mcp\",\"tools\"],\"meta\":{\"free\":true}}","root_name":"Product"},"examples":[{"json":"{\"id\":1,\"name\":\"forge\",\"tags\":[\"mcp\"]}","root_name":"Product"},{"json":"[{\"sku\":\"A1\",\"price\":9.99},{\"sku\":\"B2\",\"price\":4.5}]","root_name":"LineItem"}]},{"name":"base64_codec","description":"Encode text to base64 or decode base64 to UTF-8 text.","inputSchema":{"type":"object","properties":{"mode":{"type":"string","description":"encode | decode (default encode)"},"text":{"type":"string","description":"Plain text (encode mode)"},"data":{"type":"string","description":"Base64 string (decode mode)"}}},"free":true,"localOnly":false,"example":{"mode":"encode","text":"northern forge"},"examples":[{"mode":"encode","text":"northern forge"},{"mode":"decode","data":"bm9ydGhlcm4gZm9yZ2U="}]},{"name":"uuid_batch","description":"Generate one or more UUID v4 strings (local crypto.randomUUID / fallback).","inputSchema":{"type":"object","properties":{"count":{"type":"number","description":"How many (default 1, max 50)"}}},"free":true,"localOnly":false,"example":{"count":3},"examples":[{"count":3}]},{"name":"csv_to_markdown","description":"Convert CSV text (comma-separated, optional quoted fields) into a GitHub-flavored markdown table.","inputSchema":{"type":"object","properties":{"csv":{"type":"string","description":"CSV text including header row"},"delimiter":{"type":"string","description":"Field delimiter (default \",\")"}},"required":["csv"]},"free":true,"localOnly":false,"example":{"csv":"name,qty,notes\nanvil,2,steel\nhammer,1,claw"},"examples":[{"csv":"name,qty\nanvil,2\nhammer,1"},{"csv":"tool,kind\ndiff_text,builder\ngolden_hour,outdoor"}]},{"name":"extract_urls","description":"Extract unique http(s) URLs from free text.","inputSchema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"See https://mcp.justindkamen.com and https://forge.justindkamen.com/agents for install docs."},"examples":[{"text":"See https://mcp.justindkamen.com and https://forge.justindkamen.com/agents for install docs."}]},{"name":"wcag_contrast","description":"WCAG relative luminance contrast ratio between two hex colors (#RGB or #RRGGBB). Reports AA/AAA pass for normal and large text.","inputSchema":{"type":"object","properties":{"fg":{"type":"string","description":"Foreground hex color"},"bg":{"type":"string","description":"Background hex color"}},"required":["fg","bg"]},"free":true,"localOnly":false,"example":{"fg":"#e8f1ff","bg":"#070b14"},"examples":[{"fg":"#e8f1ff","bg":"#070b14"},{"fg":"#f6b73c","bg":"#121a2e"},{"fg":"#5ef0c0","bg":"#0a1220"}]},{"name":"hash_text","description":"Hash a string with sha256 / sha1 / md5 (hex). Local crypto — no network.","inputSchema":{"type":"object","properties":{"text":{"type":"string"},"algo":{"type":"string","description":"sha256 | sha1 | md5 (default sha256)"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"northern forge","algo":"sha256"},"examples":[{"text":"northern forge","algo":"sha256"}]},{"name":"html_escape","description":"Escape or unescape HTML entities (& < > \" ').","inputSchema":{"type":"object","properties":{"text":{"type":"string"},"mode":{"type":"string","description":"escape | unescape (default escape)"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"<b>Forge</b> & co","mode":"escape"},"examples":[{"text":"<b>Forge</b> & co","mode":"escape"}]},{"name":"percent_change","description":"Percent change from old → new value (and absolute delta).","inputSchema":{"type":"object","properties":{"from":{"type":"number","description":"Starting value"},"to":{"type":"number","description":"Ending value"}},"required":["from","to"]},"free":true,"localOnly":false,"example":{"from":100,"to":125},"examples":[{"from":100,"to":125}]},{"name":"word_freq","description":"Top word frequencies in text (case-insensitive, simple tokenizer).","inputSchema":{"type":"object","properties":{"text":{"type":"string"},"limit":{"type":"number","description":"Top N words (default 20)"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"Ship free cores. Measure opens. Ship free cores again.","limit":10},"examples":[{"text":"Ship free cores. Measure opens. Ship free cores again.","limit":10}]},{"name":"regex_test","description":"Test a JS-style regex against text. Returns match count and up to 20 match slices.","inputSchema":{"type":"object","properties":{"pattern":{"type":"string","description":"Regex pattern (no /slashes/)"},"text":{"type":"string"},"flags":{"type":"string","description":"Flags e.g. gi (default g)"}},"required":["pattern","text"]},"free":true,"localOnly":false,"example":{"pattern":"\\b[A-Z][a-z]+\\b","text":"Hello Northern Forge","flags":"g"},"examples":[{"pattern":"\\b[A-Z][a-z]+\\b","text":"Hello Northern Forge","flags":"g"}]},{"name":"jwt_decode","description":"Decode JWT header + payload (no signature verify). For inspection only.","inputSchema":{"type":"object","properties":{"token":{"type":"string","description":"JWT string"}},"required":["token"]},"free":true,"localOnly":false,"example":{"token":"eyJhbGciOiJub25lIn0.eyJzdWIiOiJtYWtlciIsInJvbGUiOiJmcmVlIiwiaWF0IjoxNzAwMDAwMDAwfQ."},"examples":[{"token":"eyJhbGciOiJub25lIn0.eyJzdWIiOiJtYWtlciIsInJvbGUiOiJmcmVlIiwiaWF0IjoxNzAwMDAwMDAwfQ."}]},{"name":"now_iso","description":"Current time as ISO-8601 UTC, unix seconds, and optional IANA timezone label (offset only — no full tz DB).","inputSchema":{"type":"object","properties":{"offset_minutes":{"type":"number","description":"Local offset from UTC in minutes (e.g. -240 for EDT)"}}},"free":true,"localOnly":false,"example":{"offset_minutes":-240},"examples":[{"offset_minutes":-240}]},{"name":"lorem_ipsum","description":"Generate placeholder lorem paragraphs/sentences (offline).","inputSchema":{"type":"object","properties":{"paragraphs":{"type":"number","description":"1–6 (default 1)"},"sentences":{"type":"number","description":"Sentences per paragraph 2–8 (default 4)"}}},"free":true,"localOnly":false,"example":{"paragraphs":1,"sentences":3},"examples":[{"paragraphs":1,"sentences":3}]},{"name":"install_config","description":"Return ready-to-paste MCP install snippets for Cursor, Claude Desktop, and generic HTTP clients.","inputSchema":{"type":"object","properties":{"client":{"type":"string","description":"cursor | claude | generic (default all)"}}},"free":true,"localOnly":false,"example":{"client":"cursor"},"examples":[{"client":"cursor"}]},{"name":"forge_loop_status","description":"[Local ops] Read-only always_on/loop_health snapshot for the operator’s ADP host (returns available:false on public Vercel). Not a portable product tool.","inputSchema":{"type":"object","properties":{}},"free":true,"localOnly":true,"example":{},"examples":[{}]},{"name":"list_mesh_snapshot","description":"[Local ops] Read-only mesh snapshot from operator command-center cache (available:false off-host).","inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Max nodes to return (default all)"}}},"free":true,"localOnly":true,"example":{"limit":10},"examples":[{"limit":10}]},{"name":"queue_action","description":"[Local ops] Append a proposed action to a local review queue — does NOT execute. Operator host only.","inputSchema":{"type":"object","properties":{"action":{"type":"string","description":"Plain-English action to queue for review"},"target":{"type":"string","description":"Optional target host/node"},"source":{"type":"string","description":"Optional caller/agent id (default \"agent\")"},"meta":{"type":"object","description":"Optional small structured extra context"}},"required":["action"]},"free":true,"localOnly":true,"example":{"action":"review popular tools strip on hub","target":"local","source":"example"},"examples":[{"action":"review popular tools strip on hub","target":"local","source":"example"}]},{"name":"list_queued_actions","description":"[Local ops] List actions previously appended by queue_action.","inputSchema":{"type":"object","properties":{"status":{"type":"string","description":"Optional filter, e.g. \"queued\""},"limit":{"type":"number","description":"Max rows (default 20, max 200)"}}},"free":true,"localOnly":true,"example":{"limit":10,"status":"queued"},"examples":[{"limit":10,"status":"queued"}]},{"name":"host_memory_set","description":"[Local ops] Save a small per-host note. Local file write only; available:false off operator host.","inputSchema":{"type":"object","properties":{"host_id":{"type":"string"},"key":{"type":"string"},"value":{"type":"string","description":"Note text (max 2000 chars)"}},"required":["host_id","key","value"]},"free":true,"localOnly":true,"example":{"host_id":"LOCAL","key":"deploy_note","value":"vercel --prod from artifacts/nf-mcp"},"examples":[{"host_id":"LOCAL","key":"deploy_note","value":"vercel --prod from artifacts/nf-mcp"}]},{"name":"host_memory_get","description":"[Local ops] Read per-host notes from host_memory_set. Operator host only.","inputSchema":{"type":"object","properties":{"host_id":{"type":"string"},"key":{"type":"string"}},"required":["host_id"]},"free":true,"localOnly":true,"example":{"host_id":"LOCAL"},"examples":[{"host_id":"LOCAL"}]},{"name":"run_safe_cmd","description":"[Local ops] Run one allowlisted read-only status command (uptime, disk, mem, loop board). No arbitrary shell. Public Vercel returns available:false.","inputSchema":{"type":"object","properties":{"command_id":{"type":"string","description":"uptime | disk_usage | mem_usage | always_on_status | loop_board. Omit to list options."}}},"free":true,"localOnly":true,"example":{"command_id":"uptime"},"examples":[{"command_id":"uptime"}]},{"name":"gbrain_search","description":"[Local ops] Search ADP gbrain notes (Justin cache + local NF entities). No secrets. available:false off operator host.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Keywords (e.g. frigate mcp cash)"},"limit":{"type":"number","description":"Max notes (default 6)"}}},"free":true,"localOnly":true,"example":{"query":"mcp frigate","limit":4},"examples":[{"query":"mcp frigate","limit":4}]},{"name":"gbrain_get","description":"[Local ops] Get one gbrain note by name (e.g. northern-forge.md). Operator host only.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Note filename, e.g. nf-mcp-flagship.md"}},"required":["name"]},"free":true,"localOnly":true,"example":{"name":"northern-forge.md"},"examples":[{"name":"northern-forge.md"}]},{"name":"gbrain_list","description":"[Local ops] List cached gbrain note names + utility metrics. Operator host only.","inputSchema":{"type":"object","properties":{}},"free":true,"localOnly":true,"example":{},"examples":[{}]},{"name":"hmac_verify","description":"Verify a webhook HMAC signature (GitHub / Stripe / Slack / raw schemes). Computes the expected digest, compares in constant time, and checks the replay window.","inputSchema":{"type":"object","properties":{"payload":{"type":"string","description":"Raw request body, byte-for-byte"},"secret":{"type":"string","description":"Shared signing secret"},"signature":{"type":"string","description":"Signature header to check (optional; omit to just compute the expected value)"},"scheme":{"type":"string","description":"raw | github | stripe | slack (default raw)"},"algo":{"type":"string","description":"sha256 (default) | sha1 | sha512"},"timestamp":{"type":"string","description":"Unix seconds or ISO time — required for stripe/slack"},"tolerance_seconds":{"type":"number","description":"Replay window (default 300)"}},"required":["secret"]},"free":true,"localOnly":false,"example":{"payload":"{\"event\":\"invoice.paid\",\"id\":\"in_123\"}","secret":"whsec_example","scheme":"github"},"examples":[{"payload":"{\"event\":\"invoice.paid\",\"id\":\"in_123\"}","secret":"whsec_example","scheme":"github"}]},{"name":"timezone_overlap","description":"Find the hours where 2-12 IANA timezones are all inside working hours. Returns the best contiguous window plus a full 24h grid.","inputSchema":{"type":"object","properties":{"zones":{"type":"array","items":{"type":"string"},"description":"IANA zone names, e.g. [\"America/Detroit\",\"Europe/Berlin\"]"},"work_start":{"type":"number","description":"Local start hour, 0-23 (default 9)"},"work_end":{"type":"number","description":"Local end hour, 1-24 (default 17)"},"date":{"type":"string","description":"YYYY-MM-DD (default today) — DST is resolved for that date"}},"required":["zones"]},"free":true,"localOnly":false,"example":{"zones":["America/Detroit","Europe/Berlin","Asia/Tokyo"],"work_start":9,"work_end":17},"examples":[{"zones":["America/Detroit","Europe/Berlin","Asia/Tokyo"],"work_start":9,"work_end":17}]},{"name":"meeting_cost","description":"Cost of a meeting from attendee count or per-role rates. Returns total, burn per minute, per attendee, and annualised cost if it recurs.","inputSchema":{"type":"object","properties":{"attendees":{"description":"Head count, or [{role,count,hourly_rate}]"},"minutes":{"type":"number","description":"Meeting length in minutes"},"hourly_rate":{"type":"number","description":"Default loaded hourly rate (default 75)"},"currency":{"type":"string","description":"Label only (default USD)"},"recurrence":{"type":"string","description":"daily | weekly | biweekly | monthly"}},"required":["attendees","minutes"]},"free":true,"localOnly":false,"example":{"attendees":6,"minutes":45,"hourly_rate":95,"recurrence":"weekly"},"examples":[{"attendees":6,"minutes":45,"hourly_rate":95,"recurrence":"weekly"}]},{"name":"csv_select","description":"Pick and reorder CSV columns by name or 1-based index. Handles quoted fields; emits csv, json, or markdown.","inputSchema":{"type":"object","properties":{"csv":{"type":"string","description":"CSV text"},"columns":{"type":"array","items":{"type":"string"},"description":"Column names or numbers, in output order (default all)"},"delimiter":{"type":"string","description":"Single char (default ,)"},"has_header":{"type":"boolean","description":"First row is a header (default true)"},"output":{"type":"string","description":"csv (default) | json | markdown"}},"required":["csv"]},"free":true,"localOnly":false,"example":{"csv":"sku,name,price,qty\nA1,Anvil,129.99,2\nB2,Bellows,74.50,1","columns":["sku","price"],"output":"markdown"},"examples":[{"csv":"sku,name,price,qty\nA1,Anvil,129.99,2\nB2,Bellows,74.50,1","columns":["sku","price"],"output":"markdown"}]},{"name":"email_clean","description":"Strip an email body down to what was actually written: removes quoted replies, signatures, mobile footers, tracking params, unsubscribe lines, and invisible characters.","inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"Email body (plain text or markdown)"}},"required":["text"]},"free":true,"localOnly":false,"example":{"text":"Sounds good, shipping Friday.\n\n--\nJustin\n\nOn Tue, Aug 19 2026, Dana wrote:\n> Are we still on?"},"examples":[{"text":"Sounds good, shipping Friday.\n\n--\nJustin\n\nOn Tue, Aug 19 2026, Dana wrote:\n> Are we still on?"}]},{"name":"markdown_to_email","description":"Render Markdown to email-safe HTML with inline styles only (no <style>, no external assets), plus a plaintext alternative.","inputSchema":{"type":"object","properties":{"markdown":{"type":"string","description":"Markdown source"}},"required":["markdown"]},"free":true,"localOnly":false,"example":{"markdown":"# Release 2.1\n\n- Faster **cold starts**\n- New `hmac_verify` tool\n\n> Ships Friday."},"examples":[{"markdown":"# Release 2.1\n\n- Faster **cold starts**\n- New `hmac_verify` tool\n\n> Ships Friday."}]},{"name":"habit_streak","description":"Current and longest streak from a list of completed days, with completion rate and the days that were missed.","inputSchema":{"type":"object","properties":{"dates":{"type":"array","items":{"type":"string"},"description":"Completed days as YYYY-MM-DD"},"today":{"type":"string","description":"Evaluate as of this day (default today, UTC)"},"allow_gap_days":{"type":"number","description":"Rest days that do not break a streak (default 0)"}},"required":["dates"]},"free":true,"localOnly":false,"example":{"dates":["2026-08-17","2026-08-18","2026-08-19","2026-08-20","2026-08-21"],"today":"2026-08-21"},"examples":[{"dates":["2026-08-17","2026-08-18","2026-08-19","2026-08-20","2026-08-21"],"today":"2026-08-21"}]}],"mcp":"/mcp"}