{
  "protocolVersion": "0.3.0",
  "name": "Flusterduck",
  "description": "Flusterduck detects UX friction automatically from behavioral signals (rage clicks, dead clicks, form abandonment, navigation loops, and more). It computes a real-time confusion score for every page, clusters repeated signals into ranked UX issues tied to specific elements, and verifies with deploy correlation whether a shipped fix actually reduced friction. No session replay, no DOM recording, no form values, no keystrokes. The browser SDK observes behavioral signals (clicks, scroll, timing), element selectors, visible element labels (PII-redacted in the browser before sending), and acquisition context (UTM parameters, referrer host).",
  "url": "https://flusterduck.com",
  "iconUrl": "https://flusterduck.com/logo.png",
  "documentationUrl": "https://docs.flusterduck.com",
  "version": "1.0.0",
  "provider": {
    "organization": "Flusterduck",
    "url": "https://flusterduck.com"
  },
  "preferredTransport": "HTTP+JSON",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false
  },
  "securitySchemes": {
    "bearerAuth": {
      "type": "http",
      "scheme": "bearer",
      "description": "fd_sec_ secret key, fd_mcp_ MCP key, or a user JWT. See /openapi.json for the REST surface and /.well-known/mcp/server-card.json for the MCP surface."
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "query-confusion-scores",
      "name": "Query confusion scores and UX issues",
      "description": "Read per-page confusion scores (0-100, z-score normalized against a 7-day baseline), ranked UX issues tied to specific elements, active alerts, and deploy verification history for a site.",
      "tags": [
        "ux-analytics",
        "read",
        "monitoring"
      ],
      "examples": [
        "What's broken on /checkout right now?",
        "List open UX issues sorted by severity.",
        "Did the last deploy make confusion on /pricing worse?"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "explore-behavioral-data",
      "name": "Run typed Explore queries over behavioral data",
      "description": "A deterministic, closed-vocabulary query engine (no natural language, no LLM) over session and event data: a time window, up to 12 AND-ed filters (signal, page, source, confused, converted, event_type), and one output mode: list matching sessions or measure a metric (count, avg_pageviews, conversion_rate, avg_dwell_ms, bounce_rate), optionally grouped by page/source/day/signal/cohort.",
      "tags": [
        "ux-analytics",
        "read",
        "query-engine"
      ],
      "examples": [
        "List sessions with a rage click on /checkout in the last 14 days.",
        "What's the conversion rate for sessions that hit a dead click, grouped by traffic source?"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "confused-vs-calm-conversion",
      "name": "Confused-vs-calm conversion analysis",
      "description": "Splits a site's sessions into a confused cohort (produced at least one friction signal) and a calm cohort (zero friction signals), then compares conversion rate, session duration, pages per session, and bounce rate between them, broken down by page and traffic source, with ranked narratable insights.",
      "tags": [
        "ux-analytics",
        "read",
        "revenue"
      ],
      "examples": [
        "How much less do confused sessions convert than calm ones?",
        "Which pages bleed the most conversions to confusion this week?"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "deploy-correlation",
      "name": "Verify deploys against confusion scores",
      "description": "Records a deploy's pre-release confusion snapshot, then compares it against post-release confusion once enough traffic accumulates (typically 5 minutes) to verify whether a shipped fix actually reduced friction or introduced a regression.",
      "tags": [
        "ux-analytics",
        "read",
        "ci-cd"
      ],
      "examples": [
        "Did yesterday's deploy break anything on checkout?",
        "Show me confusion_before and confusion_after for the last release."
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "manage-alerts-and-issues",
      "name": "Triage issues and manage alert rules",
      "description": "Update UX issue status/assignment/notes, acknowledge or resolve alerts, and create or update alert rules (spike, anomaly, trend, co-occurrence, positive, budget) with email, Slack, webhook, or PagerDuty delivery. Requires a manage:write-scoped key or a signed-in user.",
      "tags": [
        "ux-analytics",
        "write",
        "triage"
      ],
      "examples": [
        "Triage the open issues and tell me what to fix first.",
        "Create a spike alert for the pricing page and notify Slack."
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    }
  ],
  "interfaces": {
    "rest": {
      "baseUrl": "https://api.flusterduck.com/v1",
      "openApiUrl": "https://flusterduck.com/openapi.json",
      "documentationUrl": "https://docs.flusterduck.com/rest-api",
      "authentication": "HTTP Bearer: fd_sec_ secret key, fd_mcp_ MCP key (read-only unless manage:write), or a user JWT"
    },
    "mcp": {
      "hostedUrl": "https://mcp.flusterduck.com/mcp",
      "hostedTransport": "streamable-http",
      "hostedAuthentication": "oauth",
      "localPackage": "@flusterduck/mcp-server",
      "localTransport": "stdio",
      "localAuthentication": "fd_mcp_ key",
      "documentationUrl": "https://docs.flusterduck.com/mcp",
      "serverCardUrl": "https://flusterduck.com/.well-known/mcp/server-card.json"
    },
    "cli": {
      "package": "flusterduck-cli",
      "install": "npx flusterduck-cli <command> (binary also answers to `duck`)",
      "authentication": "`duck login` stores a verified fd_sec_ key in a 0600 local file (site remembered, --site optional); or --key / FLUSTERDUCK_SECRET_KEY per call",
      "commands": {
        "init": "Install the SDK into a project (framework auto-detected)",
        "scores": "Per-page confusion scores for a site",
        "issues": "List UX issues (filter by --status, cap with --limit)",
        "insights": "Confused-vs-calm conversion gap",
        "issue resolve|ignore|reopen|start <issue_id>": "Manage a single issue; attach context with --note",
        "deploy notify --site <site_id>": "Record a deploy for before/after confusion verification; commit metadata auto-detected on GitHub Actions, Vercel, GitLab, Bitbucket",
        "login | logout": "Save/remove a verified secret key locally so commands need no --key",
        "status": "Is data flowing for a publishable key? --wait polls for the first event"
      },
      "machineOutput": "every read/manage command accepts --json",
      "documentationUrl": "https://docs.flusterduck.com/cli"
    }
  }
}
