{"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?}]. Returns total g and lb.","inputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"grams":{"type":"number"},"qty":{"type":"number"}},"required":["grams"]}}},"required":["items"]},"free":true,"localOnly":false,"example":{"items":[{"name":"tent","grams":1200,"qty":1},{"name":"stove","grams":340,"qty":1},{"name":"water","grams":1000,"qty":2}]},"examples":[{"items":[{"name":"tent","grams":1200,"qty":1},{"name":"stove","grams":340,"qty":1},{"name":"water","grams":1000,"qty":2}]}]},{"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":[{}]}],"mcp":"/mcp"}