{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://ocxly.com/llms.manifest.json",
  "title": "OCXLY Tools Manifest",
  "description": "Machine-readable schema for OCXLY free tools. Use this for input validation, auto-routing, and LLM tool-calling integration.",
  "version": "1.0.0",
  "lastUpdated": "2025-06-08",
  "baseUrl": "https://ocxly.com",
  "definitions": {
    "paramSchema": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "type": { "type": "string", "enum": ["string", "number", "boolean", "file", "array"] },
        "description": { "type": "string" },
        "required": { "type": "boolean", "default": true },
        "default": {},
        "enum": { "type": "array" },
        "min": { "type": "number" },
        "max": { "type": "number" },
        "regex": { "type": "string" },
        "accept": { "type": "string" },
        "items": { "type": "object" }
      },
      "required": ["name", "type"]
    },
    "toolEntry": {
      "type": "object",
      "properties": {
        "id": { "type": "string", "description": "Stable tool identifier. Never changes." },
        "name": { "type": "string" },
        "url": { "type": "string", "format": "uri" },
        "category": { "type": "string", "enum": ["AI & Productivity", "Developer Tools", "Accessibility & Wellness", "Calculators & Utilities", "Reference", "Legal"] },
        "description": { "type": "string" },
        "params": {
          "type": "array",
          "items": { "$ref": "#/definitions/paramSchema" }
        },
        "outputs": {
          "type": "array",
          "items": { "type": "string" }
        },
        "triggers": {
          "type": "array",
          "items": { "type": "string" },
          "description": "Natural-language intents that should route to this tool."
        },
        "requiresFileUpload": { "type": "boolean", "default": false },
        "isReference": { "type": "boolean", "default": false },
        "queryParams": {
          "type": "array",
          "items": { "type": "string" },
          "description": "URL query parameters this tool accepts for deep-linking."
        }
      },
      "required": ["id", "name", "url", "category"]
    }
  },
  "properties": {
    "tools": {
      "type": "array",
      "items": { "$ref": "#/definitions/toolEntry" }
    }
  },
  "tools": [
    {
      "id": "llm-cost-calculator",
      "name": "LLM Cost Calculator",
      "url": "/llm-cost-calculator.html",
      "category": "AI & Productivity",
      "description": "Estimate API costs across OpenAI, Anthropic, Google, Meta, Mistral, and Cohere models.",
      "params": [
        { "name": "provider", "type": "string", "description": "API provider name", "required": true, "enum": ["openai", "anthropic", "google", "meta", "mistral", "cohere"] },
        { "name": "model", "type": "string", "description": "Model identifier (e.g. gpt-4o, claude-3-opus)", "required": true },
        { "name": "input_tokens", "type": "number", "description": "Number of input tokens per request", "required": true, "min": 0 },
        { "name": "output_tokens", "type": "number", "description": "Number of output tokens per request", "required": true, "min": 0 },
        { "name": "requests_per_month", "type": "number", "description": "Estimated requests per month", "required": false, "default": 1, "min": 1 }
      ],
      "outputs": ["estimated cost per request", "monthly cost", "per-provider comparison"],
      "triggers": ["how much will this prompt cost", "compare GPT-4 vs Claude pricing", "estimate API bill", "LLM pricing calculator"]
    },
    {
      "id": "token-counter",
      "name": "Token Counter",
      "url": "/token-counter.html",
      "category": "AI & Productivity",
      "description": "Count tokens in text for popular LLM models.",
      "params": [
        { "name": "text", "type": "string", "description": "Text to tokenize", "required": true },
        { "name": "model", "type": "string", "description": "Model for token counting", "required": false, "default": "gpt-4", "enum": ["gpt-4", "gpt-3.5", "claude", "llama"] }
      ],
      "outputs": ["token count", "character count", "approximate cost"],
      "triggers": ["count tokens", "will this fit in context window", "how many tokens is this prompt"]
    },
    {
      "id": "prompt-builder",
      "name": "Prompt Builder",
      "url": "/prompt-builder.html",
      "category": "AI & Productivity",
      "description": "Structure and improve LLM prompts with role, context, task, and constraints.",
      "params": [
        { "name": "role", "type": "string", "description": "Persona or role for the AI", "required": true },
        { "name": "context", "type": "string", "description": "Background information", "required": true },
        { "name": "task", "type": "string", "description": "Specific task to perform", "required": true },
        { "name": "constraints", "type": "string", "description": "Limitations or rules", "required": false },
        { "name": "examples", "type": "string", "description": "Few-shot examples", "required": false },
        { "name": "output_format", "type": "string", "description": "Desired output structure", "required": false }
      ],
      "outputs": ["structured prompt ready to paste into an LLM"],
      "triggers": ["help me write a prompt", "structure this prompt", "improve my prompt", "prompt engineering"]
    },
    {
      "id": "llm-guide",
      "name": "LLM Guide",
      "url": "/llm-guide.html",
      "category": "Reference",
      "description": "Reference article explaining how large language models work.",
      "params": [],
      "outputs": ["explanations of tokens, temperature, top-p, context windows, sampling"],
      "triggers": ["how do LLMs work", "what is temperature", "explain top-p", "context window size"],
      "isReference": true
    },
    {
      "id": "ai-music-generation",
      "name": "AI Music Generation Guide",
      "url": "/ai-music-generation.html",
      "category": "Reference",
      "description": "Guide to AI music tools and workflows.",
      "params": [],
      "outputs": ["AI music tool recommendations and workflows"],
      "triggers": ["how to generate music with AI", "AI music tools", "text-to-music"],
      "isReference": true
    },
    {
      "id": "json-formatter",
      "name": "JSON Formatter",
      "url": "/json-formatter.html",
      "category": "Developer Tools",
      "description": "Format, validate, and prettify JSON with collapsible tree view.",
      "params": [
        { "name": "json_input", "type": "string", "description": "Raw JSON string to format", "required": true }
      ],
      "outputs": ["pretty-printed JSON", "validation errors", "collapsible tree view"],
      "triggers": ["format JSON", "validate JSON", "pretty print", "fix my JSON", "JSON beautifier"]
    },
    {
      "id": "regex-tester",
      "name": "Regex Tester",
      "url": "/regex-tester.html",
      "category": "Developer Tools",
      "description": "Test regular expressions with highlights, capture groups, and replacement preview.",
      "params": [
        { "name": "pattern", "type": "string", "description": "Regular expression pattern", "required": true },
        { "name": "flags", "type": "string", "description": "Regex flags", "required": false, "default": "", "regex": "^[gimsuy]*$" },
        { "name": "test_string", "type": "string", "description": "Text to test against", "required": true },
        { "name": "replacement", "type": "string", "description": "Replacement string for replace mode", "required": false }
      ],
      "outputs": ["matches with highlights", "capture groups", "replacement preview"],
      "triggers": ["test regex", "build a regular expression", "match pattern", "regex validator"]
    },
    {
      "id": "base64",
      "name": "Base64 Encoder/Decoder",
      "url": "/base64.html",
      "category": "Developer Tools",
      "description": "Encode or decode Base64 strings and convert images to data URLs.",
      "params": [
        { "name": "input", "type": "string", "description": "Text to encode or Base64 string to decode", "required": true },
        { "name": "mode", "type": "string", "description": "Operation mode", "required": true, "enum": ["encode", "decode"] }
      ],
      "outputs": ["encoded or decoded text", "data URL support"],
      "triggers": ["base64 encode", "decode base64", "convert image to data URL"],
      "requiresFileUpload": true
    },
    {
      "id": "markdown",
      "name": "Markdown Editor",
      "url": "/markdown.html",
      "category": "Developer Tools",
      "description": "Live GitHub-flavoured markdown preview with export.",
      "params": [
        { "name": "markdown_input", "type": "string", "description": "Markdown source text", "required": true }
      ],
      "outputs": ["live GitHub-flavoured HTML preview", "exportable HTML"],
      "triggers": ["markdown editor", "preview markdown", "convert MD to HTML", "markdown preview"]
    },
    {
      "id": "case-convert",
      "name": "Case Converter",
      "url": "/case-convert.html",
      "category": "Developer Tools",
      "description": "Convert text between snake_case, camelCase, PascalCase, and more.",
      "params": [
        { "name": "text", "type": "string", "description": "Text to convert", "required": true },
        { "name": "target_case", "type": "string", "description": "Target case format", "required": true, "enum": ["upper", "lower", "title", "sentence", "snake", "kebab", "camel", "pascal", "constant"] }
      ],
      "outputs": ["converted text"],
      "triggers": ["convert to snake_case", "change to camelCase", "title case this", "kebab-case"]
    },
    {
      "id": "lorem-ipsum-gen",
      "name": "Lorem Ipsum Generator",
      "url": "/lorem-ipsum-gen.html",
      "category": "Developer Tools",
      "description": "Generate placeholder text for design mockups and testing.",
      "params": [
        { "name": "unit", "type": "string", "description": "Unit of generation", "required": true, "enum": ["words", "sentences", "paragraphs"] },
        { "name": "count", "type": "number", "description": "Number of units to generate", "required": true, "min": 1 },
        { "name": "start_with_lorem", "type": "boolean", "description": "Start with 'Lorem ipsum dolor sit amet'", "required": false, "default": true },
        { "name": "html_tags", "type": "boolean", "description": "Wrap output in <p> tags", "required": false, "default": false }
      ],
      "outputs": ["placeholder text"],
      "triggers": ["lorem ipsum", "placeholder text", "dummy paragraphs", "fake text generator"]
    },
    {
      "id": "typescale",
      "name": "Type Scale Generator",
      "url": "/typescale.html",
      "category": "Developer Tools",
      "description": "Generate responsive typographic scales with CSS clamp() values.",
      "params": [
        { "name": "base_size", "type": "number", "description": "Base font size in pixels", "required": true, "min": 1 },
        { "name": "scale_ratio", "type": "number", "description": "Scale multiplier (e.g. 1.25 for major third, 1.5 for perfect fifth)", "required": true, "min": 1 },
        { "name": "steps", "type": "number", "description": "Number of scale steps above base", "required": true, "min": 1 }
      ],
      "outputs": ["typographic scale with CSS clamp() values for responsive headings"],
      "triggers": ["type scale", "responsive font sizes", "clamp() generator", "CSS typography scale"]
    },
    {
      "id": "image-compressor",
      "name": "Image Compressor",
      "url": "/image-compressor.html",
      "category": "Developer Tools",
      "description": "Compress images client-side with quality control.",
      "params": [
        { "name": "image_file", "type": "file", "description": "Image to compress", "required": true, "accept": "image/jpeg,image/png,image/webp" },
        { "name": "quality", "type": "number", "description": "Compression quality (0-100)", "required": false, "default": 80, "min": 0, "max": 100 }
      ],
      "outputs": ["compressed image with before/after size comparison"],
      "triggers": ["compress image", "reduce file size", "shrink photo", "image optimizer"],
      "requiresFileUpload": true
    },
    {
      "id": "scientific-cal",
      "name": "Scientific Calculator",
      "url": "/scientific-cal.html",
      "category": "Developer Tools",
      "description": "Evaluate mathematical expressions with trig, log, and constants support.",
      "params": [
        { "name": "expression", "type": "string", "description": "Mathematical expression to evaluate", "required": true }
      ],
      "outputs": ["result", "history", "supports trig/log/constants"],
      "triggers": ["scientific calculator", "evaluate expression", "calculate sin/cos/log", "math solver"]
    },
    {
      "id": "unit-converter",
      "name": "Unit Converter",
      "url": "/unit-converter.html",
      "category": "Developer Tools",
      "description": "Convert between units of length, weight, temperature, speed, data, volume, area, and time.",
      "params": [
        { "name": "value", "type": "number", "description": "Value to convert", "required": true },
        { "name": "from_unit", "type": "string", "description": "Source unit", "required": true },
        { "name": "to_unit", "type": "string", "description": "Target unit", "required": true },
        { "name": "category", "type": "string", "description": "Unit category", "required": true, "enum": ["length", "weight", "temperature", "speed", "data", "volume", "area", "time"] }
      ],
      "outputs": ["converted value"],
      "triggers": ["convert km to miles", "celsius to fahrenheit", "MB to GB", "unit conversion"]
    },
    {
      "id": "modern-css-features",
      "name": "Modern CSS Features",
      "url": "/modern-css-features.html",
      "category": "Reference",
      "description": "Interactive examples of container queries, :has(), nesting, and cascade layers.",
      "params": [],
      "outputs": ["interactive examples of container queries, :has(), nesting, cascade layers"],
      "triggers": ["modern CSS", "container queries", ":has() selector", "CSS nesting", "cascade layers"],
      "isReference": true
    },
    {
      "id": "contrast-checker",
      "name": "Contrast Checker",
      "url": "/contrast-checker.html",
      "category": "Accessibility & Wellness",
      "description": "Check WCAG contrast ratios between foreground and background colours.",
      "params": [
        { "name": "foreground", "type": "string", "description": "Foreground colour (hex or rgb)", "required": true, "regex": "^(#([0-9A-Fa-f]{3}){1,2}|rgb\\(.*\\))$" },
        { "name": "background", "type": "string", "description": "Background colour (hex or rgb)", "required": true, "regex": "^(#([0-9A-Fa-f]{3}){1,2}|rgb\\(.*\\))$" }
      ],
      "outputs": ["WCAG contrast ratio", "AA/AAA pass/fail for normal and large text"],
      "triggers": ["check contrast", "WCAG ratio", "is this color accessible", "contrast accessibility"]
    },
    {
      "id": "color-blindness-simulator",
      "name": "Color Blindness Simulator",
      "url": "/color-blindness-simulator.html",
      "category": "Accessibility & Wellness",
      "description": "Simulate how colours appear to users with colour vision deficiencies.",
      "params": [
        { "name": "image_file", "type": "file", "description": "Image to simulate (alternative to colour input)", "required": false, "accept": "image/*" },
        { "name": "color", "type": "string", "description": "Colour to simulate (alternative to image upload)", "required": false, "regex": "^#([0-9A-Fa-f]{3}){1,2}$" },
        { "name": "simulation_type", "type": "string", "description": "Type of colour blindness to simulate", "required": true, "enum": ["protanopia", "deuteranopia", "tritanopia", "achromatopsia"] }
      ],
      "outputs": ["simulated view for selected color blindness type"],
      "triggers": ["color blindness preview", "simulate protanopia", "accessible colors", "CVD simulator"],
      "requiresFileUpload": true
    },
    {
      "id": "readability-analyser",
      "name": "Readability Analyser",
      "url": "/readability-analyser.html",
      "category": "Accessibility & Wellness",
      "description": "Analyse text readability with multiple scoring algorithms.",
      "params": [
        { "name": "text", "type": "string", "description": "Text to analyse", "required": true }
      ],
      "outputs": ["Flesch-Kincaid grade", "SMOG index", "Gunning Fog index", "reading level"],
      "triggers": ["readability score", "reading level", "is my text too complex", "Flesch-Kincaid"]
    },
    {
      "id": "adhd-ui-patterns",
      "name": "ADHD UI Patterns",
      "url": "/adhd-ui-patterns.html",
      "category": "Reference",
      "description": "UX pattern library for ADHD-friendly interface design.",
      "params": [],
      "outputs": ["UX pattern library for ADHD-friendly interfaces"],
      "triggers": ["ADHD UX", "neurodivergent design", "distraction-free patterns", "accessible UI patterns"],
      "isReference": true
    },
    {
      "id": "focus-soundscape",
      "name": "Focus Soundscape",
      "url": "/focus-soundscape.html",
      "category": "Accessibility & Wellness",
      "description": "Mix ambient sounds for focus, relaxation, or sleep.",
      "params": [
        { "name": "sounds", "type": "array", "description": "Sound types to mix", "required": true, "items": { "type": "string", "enum": ["rain", "brown_noise", "cafe", "forest", "waves"] } },
        { "name": "volume_per_sound", "type": "number", "description": "Volume level per sound (0-100)", "required": true, "min": 0, "max": 100 },
        { "name": "timer_minutes", "type": "number", "description": "Auto-stop timer in minutes", "required": false, "min": 1 }
      ],
      "outputs": ["ambient audio mix"],
      "triggers": ["focus sounds", "brown noise", "ambient noise for work", "white noise generator"]
    },
    {
      "id": "breathing-timer",
      "name": "Breathing Timer",
      "url": "/breathing-timer.html",
      "category": "Accessibility & Wellness",
      "description": "Guided visual breathing exercises with customizable patterns.",
      "params": [
        { "name": "pattern", "type": "string", "description": "Breathing pattern preset", "required": true, "enum": ["box", "4-7-8", "custom"] },
        { "name": "inhale", "type": "number", "description": "Inhale duration in seconds", "required": true, "min": 1 },
        { "name": "hold", "type": "number", "description": "Hold duration in seconds", "required": true, "min": 0 },
        { "name": "exhale", "type": "number", "description": "Exhale duration in seconds", "required": true, "min": 1 },
        { "name": "cycles", "type": "number", "description": "Number of breathing cycles", "required": true, "min": 1 }
      ],
      "outputs": ["visual breathing pacer"],
      "triggers": ["breathing exercise", "box breathing", "4-7-8 timer", "mindfulness breathing"]
    },
    {
      "id": "pomodoro",
      "name": "Pomodoro Timer",
      "url": "/pomodoro.html",
      "category": "Accessibility & Wellness",
      "description": "Focus timer with work/break intervals and session tracking.",
      "params": [
        { "name": "work_minutes", "type": "number", "description": "Work session length in minutes", "required": false, "default": 25, "min": 1 },
        { "name": "short_break", "type": "number", "description": "Short break length in minutes", "required": false, "default": 5, "min": 1 },
        { "name": "long_break", "type": "number", "description": "Long break length in minutes", "required": false, "default": 15, "min": 1 },
        { "name": "cycles_before_long_break", "type": "number", "description": "Work cycles before a long break", "required": false, "default": 4, "min": 1 }
      ],
      "outputs": ["focus timer with session tracking"],
      "triggers": ["pomodoro timer", "focus timer", "25 minute work timer", "productivity timer"]
    },
    {
      "id": "sleep-calculator",
      "name": "Sleep Calculator",
      "url": "/sleep-calculator.html",
      "category": "Accessibility & Wellness",
      "description": "Calculate optimal bedtimes and wake times based on 90-minute sleep cycles.",
      "params": [
        { "name": "mode", "type": "string", "description": "Calculation mode", "required": true, "enum": ["bedtime", "wakeup"] },
        { "name": "time", "type": "string", "description": "Target time in HH:MM format", "required": true, "regex": "^([01]?\\d|2[0-3]):([0-5]\\d)$" },
        { "name": "age", "type": "number", "description": "Age in years for sleep recommendations", "required": false, "min": 0, "max": 120 }
      ],
      "outputs": ["recommended bedtimes/wake times based on 90-min sleep cycles"],
      "triggers": ["what time should I sleep", "wake up refreshed", "sleep cycle calculator", "optimal bedtime"]
    },
    {
      "id": "reaction-time-test",
      "name": "Reaction Time Test",
      "url": "/reaction-time-test.html",
      "category": "Accessibility & Wellness",
      "description": "Measure visual reaction speed with multiple trials.",
      "params": [
        { "name": "trials", "type": "number", "description": "Number of trials to run", "required": false, "default": 5, "min": 1 }
      ],
      "outputs": ["reaction time in ms", "average", "percentile rank"],
      "triggers": ["test reaction time", "how fast are my reflexes", "reaction speed test"]
    },
    {
      "id": "bmi",
      "name": "BMI Calculator",
      "url": "/bmi.html",
      "category": "Calculators & Utilities",
      "description": "Calculate Body Mass Index with health category.",
      "params": [
        { "name": "weight", "type": "number", "description": "Weight value", "required": true, "min": 0 },
        { "name": "height", "type": "number", "description": "Height value", "required": true, "min": 0 },
        { "name": "units", "type": "string", "description": "Measurement system", "required": true, "enum": ["metric", "imperial"] }
      ],
      "outputs": ["BMI value", "health category"],
      "triggers": ["calculate BMI", "body mass index", "health calculator"]
    },
    {
      "id": "loancalculator",
      "name": "Loan Calculator",
      "url": "/loancalculator.html",
      "category": "Calculators & Utilities",
      "description": "Calculate EMI, total interest, and amortisation schedule.",
      "params": [
        { "name": "principal", "type": "number", "description": "Loan principal amount", "required": true, "min": 0 },
        { "name": "annual_interest_rate", "type": "number", "description": "Annual interest rate in percent", "required": true, "min": 0 },
        { "name": "tenure_months", "type": "number", "description": "Loan duration in months", "required": true, "min": 1 }
      ],
      "outputs": ["EMI", "total interest", "total payable", "amortisation schedule"],
      "triggers": ["EMI calculator", "loan payment", "mortgage calculator", "loan interest"]
    },
    {
      "id": "word-counter",
      "name": "Word Counter",
      "url": "/word-counter.html",
      "category": "Calculators & Utilities",
      "description": "Count words, characters, sentences, paragraphs, and estimate reading time.",
      "params": [
        { "name": "text", "type": "string", "description": "Text to analyse", "required": true }
      ],
      "outputs": ["word count", "character count", "sentences", "paragraphs", "reading time"],
      "triggers": ["count words", "character count", "reading time", "text statistics"]
    },
    {
      "id": "dateandagefinder",
      "name": "Date & Age Finder",
      "url": "/dateandagefinder.html",
      "category": "Calculators & Utilities",
      "description": "Calculate age, date differences, or add/subtract days from dates.",
      "params": [
        { "name": "mode", "type": "string", "description": "Calculation mode", "required": true, "enum": ["age", "difference", "add_subtract"] },
        { "name": "date_1", "type": "string", "description": "Primary date (YYYY-MM-DD)", "required": true, "regex": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" },
        { "name": "date_2", "type": "string", "description": "Secondary date (YYYY-MM-DD)", "required": false, "regex": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$" },
        { "name": "offset_days", "type": "number", "description": "Days to add or subtract", "required": false }
      ],
      "outputs": ["age in years/months/days", "difference", "resulting date"],
      "triggers": ["calculate age", "days between dates", "add days to date", "date calculator"]
    },
    {
      "id": "pdf-to-word",
      "name": "PDF to Word Guide",
      "url": "/pdf-to-word.html",
      "category": "Reference",
      "description": "Guide and recommendations for converting PDF to DOCX.",
      "params": [],
      "outputs": ["recommendations for PDF to DOCX conversion"],
      "triggers": ["convert PDF to Word", "PDF to DOCX", "PDF converter guide"],
      "isReference": true
    },
    {
      "id": "strooptest",
      "name": "Stroop Test",
      "url": "/strooptest.html",
      "category": "Calculators & Utilities",
      "description": "Measure cognitive interference and processing speed.",
      "params": [
        { "name": "trials", "type": "number", "description": "Number of trials", "required": false, "min": 1 }
      ],
      "outputs": ["cognitive interference score", "processing speed"],
      "triggers": ["stroop test", "cognitive test", "attention test", "brain test"]
    },
    {
      "id": "home",
      "name": "Home",
      "url": "/",
      "category": "Reference",
      "description": "OCXLY innovation hub overview.",
      "params": [],
      "outputs": ["site overview"],
      "triggers": ["OCXLY home", "what is OCXLY", "innovation hub"],
      "isReference": true
    },
    {
      "id": "tools-directory",
      "name": "Tools Directory",
      "url": "/tools.html",
      "category": "Reference",
      "description": "Browse all free OCXLY tools.",
      "params": [],
      "outputs": ["all tools listing"],
      "triggers": ["browse tools", "all tools", "OCXLY tools list"],
      "isReference": true
    },
    {
      "id": "blog",
      "name": "Blog",
      "url": "/blog.html",
      "category": "Reference",
      "description": "Articles on AI, UX, and cognitive design.",
      "params": [],
      "outputs": ["blog articles"],
      "triggers": ["OCXLY blog", "articles", "AI blog"],
      "isReference": true
    },
    {
      "id": "about",
      "name": "About",
      "url": "/about.html",
      "category": "Reference",
      "description": "Mission, divisions, and team information.",
      "params": [],
      "outputs": ["company information"],
      "triggers": ["about OCXLY", "who is OCXLY", "company mission"],
      "isReference": true
    },
    {
      "id": "help",
      "name": "Help",
      "url": "/help.html",
      "category": "Reference",
      "description": "Help centre and support resources.",
      "params": [],
      "outputs": ["help documentation"],
      "triggers": ["OCXLY help", "support", "help centre"],
      "isReference": true
    },
    {
      "id": "contact",
      "name": "Contact",
      "url": "/contact.html",
      "category": "Reference",
      "description": "Reach the OCXLY team.",
      "params": [],
      "outputs": ["contact information"],
      "triggers": ["contact OCXLY", "reach us", "get in touch"],
      "isReference": true
    },
    {
      "id": "search",
      "name": "Search",
      "url": "/search.html",
      "category": "Reference",
      "description": "Search across all OCXLY pages.",
      "params": [
        { "name": "q", "type": "string", "description": "Search query", "required": false }
      ],
      "outputs": ["search results"],
      "triggers": ["search OCXLY", "find tool", "search site"],
      "queryParams": ["q"],
      "isReference": true
    },
    {
      "id": "consumer-bcis-2026",
      "name": "Consumer BCIs 2026",
      "url": "/consumer-bcis-2026.html",
      "category": "Reference",
      "description": "Brain-computer interface landscape overview.",
      "params": [],
      "outputs": ["BCI landscape information"],
      "triggers": ["brain computer interface", "BCI 2026", "consumer BCI"],
      "isReference": true
    },
    {
      "id": "privacy-policy",
      "name": "Privacy Policy",
      "url": "/privacypolicy.html",
      "category": "Legal",
      "description": "OCXLY privacy policy.",
      "params": [],
      "outputs": ["privacy policy text"],
      "triggers": ["privacy policy", "data protection", "OCXLY privacy"],
      "isReference": true
    },
    {
      "id": "terms",
      "name": "Terms and Conditions",
      "url": "/termsandconditions.html",
      "category": "Legal",
      "description": "OCXLY terms of service.",
      "params": [],
      "outputs": ["terms of service text"],
      "triggers": ["terms of service", "terms and conditions", "OCXLY terms"],
      "isReference": true
    },
    {
      "id": "cookie-policy",
      "name": "Cookie Policy",
      "url": "/cookie-policy.html",
      "category": "Legal",
      "description": "OCXLY cookie usage policy.",
      "params": [],
      "outputs": ["cookie policy text"],
      "triggers": ["cookie policy", "cookies", "OCXLY cookies"],
      "isReference": true
    },
    {
      "id": "accessibility-statement",
      "name": "Accessibility Statement",
      "url": "/accessibilitystatement.html",
      "category": "Legal",
      "description": "OCXLY accessibility commitment.",
      "params": [],
      "outputs": ["accessibility statement text"],
      "triggers": ["accessibility statement", "a11y", "OCXLY accessibility"],
      "isReference": true
    },
    {
      "id": "ai-transparency",
      "name": "AI Transparency",
      "url": "/aitransparency.html",
      "category": "Legal",
      "description": "OCXLY AI transparency disclosure.",
      "params": [],
      "outputs": ["AI transparency text"],
      "triggers": ["AI transparency", "how OCXLY uses AI", "AI disclosure"],
      "isReference": true
    }
  ]
}
