{
  "version": 3,
  "summary": "kennel is a task list you can drive from an agent. It exposes a REST API and a remote MCP server over the same tasks, projects, and labels, authenticated with an API key or an OAuth 2.1 access token scoped to tasks:read and tasks:write.",
  "credentials": {
    "api-key": {
      "type": "api_key",
      "label": "kennel API key",
      "generateUrl": "https://kennel.work/app/keys",
      "setup": "Sign in at https://kennel.work and create a key on the [API keys](https://kennel.work/app/keys) page.\n\nKeys are prefixed `kn_` and are shown once, so copy the value when it is created. Every key carries both `tasks:read` and `tasks:write`; there is no way to scope one down, so use OAuth when a client should hold narrower or shorter-lived access.\n\nSend it either as `Authorization: Bearer kn_...` or as `x-api-key: kn_...`."
    },
    "oauth-token": {
      "type": "oauth2",
      "label": "kennel OAuth 2.1 access token",
      "generateUrl": "https://kennel.work/app/oauth",
      "setup": "Register a client on the [OAuth](https://kennel.work/app/oauth) page, or let the client register itself through dynamic client registration at `https://kennel.work/api/auth/oauth2/register`.\n\nRun the authorization code flow with PKCE against the issuer `https://kennel.work/api/auth`; its metadata lives at `https://kennel.work/.well-known/oauth-authorization-server/api/auth`. Request `tasks:read`, `tasks:write`, or both.\n\nClients that cannot open a browser redirect can use the device authorization grant: POST `https://kennel.work/api/auth/device/code`, send the user to `https://kennel.work/device` with the user code, then poll `https://kennel.work/api/auth/oauth2/token` with `grant_type=urn:ietf:params:oauth:grant-type:device_code`.\n\nSend the resulting access token as `Authorization: Bearer <token>`. Users can revoke authorized apps from the same page."
    }
  },
  "surfaces": [
    {
      "type": "http",
      "slug": "kennel-api",
      "name": "kennel REST API",
      "docs": "https://kennel.work/docs",
      "url": "https://kennel.work/api/v1",
      "spec": "https://kennel.work/openapi.json",
      "basis": {
        "via": "declared",
        "source": "https://kennel.work/.well-known/integrations.json"
      },
      "auth": {
        "status": "required",
        "entries": [
          {
            "use": [
              {
                "id": "api-key",
                "mechanics": {
                  "source": "http",
                  "in": "header",
                  "headerName": "Authorization",
                  "scheme": "Bearer"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          },
          {
            "use": [
              {
                "id": "api-key",
                "mechanics": {
                  "source": "http",
                  "in": "header",
                  "headerName": "x-api-key"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          },
          {
            "use": [
              {
                "id": "oauth-token",
                "mechanics": {
                  "source": "http",
                  "in": "header",
                  "headerName": "Authorization",
                  "scheme": "Bearer"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          }
        ]
      }
    },
    {
      "type": "mcp",
      "slug": "kennel-mcp",
      "name": "kennel MCP server",
      "docs": "https://kennel.work/docs",
      "url": "https://kennel.work/mcp",
      "transports": [
        "streamable-http"
      ],
      "basis": {
        "via": "declared",
        "source": "https://kennel.work/.well-known/integrations.json"
      },
      "auth": {
        "status": "required",
        "entries": [
          {
            "use": [
              {
                "id": "oauth-token",
                "mechanics": {
                  "source": "well-known"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          },
          {
            "use": [
              {
                "id": "api-key",
                "mechanics": {
                  "source": "http",
                  "in": "header",
                  "headerName": "Authorization",
                  "scheme": "Bearer"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          },
          {
            "use": [
              {
                "id": "api-key",
                "mechanics": {
                  "source": "http",
                  "in": "header",
                  "headerName": "x-api-key"
                }
              }
            ],
            "basis": {
              "via": "declared",
              "source": "https://kennel.work/.well-known/integrations.json"
            }
          }
        ]
      }
    }
  ]
}