{
  "version": 3,
  "summary": "Flusterduck: automatic UX friction detection. Confusion scores, ranked UX issues tied to specific elements, and deploy verification, reachable by agents over a REST API, a hosted MCP server, and a CLI.",
  "credentials": {
    "fd_sec": {
      "type": "bearer",
      "label": "Flusterduck secret key",
      "generateUrl": "https://flusterduck.com/settings/keys",
      "setup": "Create a secret key (it starts with `fd_sec_`) in the dashboard under Settings → API keys. Send it on every request as `Authorization: Bearer fd_sec_...`. The REST API also accepts a signed-in user's JWT or an `fd_mcp_` key the same way. For the CLI, run `flusterduck login` (or `duck login`) to store the key locally, or set the `FLUSTERDUCK_SECRET_KEY` environment variable."
    },
    "flusterduck_oauth": {
      "type": "oauth2",
      "label": "Sign in with Flusterduck",
      "setup": "The hosted MCP server uses OAuth 2.1 with PKCE. MCP clients discover the authorization server automatically from the connect URL (RFC 9728 protected-resource metadata and RFC 8414 authorization-server metadata are served at mcp.flusterduck.com) and open a browser consent screen. There is no key to copy."
    }
  },
  "surfaces": [
    {
      "type": "http",
      "slug": "rest-api",
      "name": "Flusterduck REST API",
      "docs": "https://docs.flusterduck.com/rest-api",
      "url": "https://api.flusterduck.com/v1",
      "spec": "https://flusterduck.com/openapi.json",
      "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" },
      "auth": {
        "status": "required",
        "entries": [
          {
            "use": [
              {
                "id": "fd_sec",
                "mechanics": { "source": "http", "in": "header", "headerName": "Authorization", "scheme": "Bearer" }
              }
            ],
            "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" }
          }
        ]
      }
    },
    {
      "type": "mcp",
      "slug": "mcp",
      "name": "Flusterduck MCP server",
      "docs": "https://docs.flusterduck.com/mcp",
      "url": "https://mcp.flusterduck.com/mcp",
      "transports": ["streamable-http"],
      "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" },
      "auth": {
        "status": "required",
        "entries": [
          {
            "use": [
              { "id": "flusterduck_oauth", "mechanics": { "source": "well-known" } }
            ],
            "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" }
          }
        ]
      }
    },
    {
      "type": "cli",
      "slug": "cli",
      "name": "Flusterduck CLI",
      "docs": "https://docs.flusterduck.com/cli",
      "command": "flusterduck",
      "packages": [
        { "registryType": "npm", "identifier": "flusterduck-cli", "runtimeHint": "npx" },
        { "registryType": "npm", "identifier": "@flusterduck/cli", "runtimeHint": "npx" }
      ],
      "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" },
      "auth": {
        "status": "required",
        "entries": [
          {
            "use": [
              {
                "id": "fd_sec",
                "mechanics": { "source": "cli", "command": "flusterduck login", "env": ["FLUSTERDUCK_SECRET_KEY"] }
              }
            ],
            "basis": { "via": "declared", "source": "https://flusterduck.com/.well-known/integrations.json" }
          }
        ]
      }
    }
  ]
}
