Kaption AI MCP API

MCP transport endpoints

GitHub OpenAPI

Operations 5

POST /mcp Send an MCP JSON-RPC message #
GET /mcp Open a server-to-client SSE stream #
DELETE /mcp End an MCP session #
GET /sse Legacy HTTP+SSE transport, for older MCP clients #
POST /sse/message Send a JSON-RPC message on the legacy SSE transport #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/kaptionai-com:kaptionai-com-mcp-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

kaptionai-com-mcp-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Kaption WhatsApp server MCP API
  version: 1.1.0
  summary: Model Context Protocol endpoint that lets AI apps search, summarize and organize a user's WhatsApp chats.
  description: 'This is an MCP server, not a REST API. Every operation is a JSON-RPC 2.0 message sent to one HTTP endpoint (MCP Streamable HTTP transport, protocol revision 2025-06-18 or later). Use an MCP client rather than calling it by hand.


    The tools run in the Kaption extension (WhatsApp Web in Chrome or Edge) or the Kaption desktop app on the user''s own computer, so they only work while the user has Kaption open. No tool sends a message immediately; the AI can leave a draft or schedule one message to one person. Chats the user locked in WhatsApp are never visible.


    Every request, including `initialize` and `tools/list`, needs an OAuth 2.1 bearer token with the `kaption:access` scope. Discover the authorization server through the protected resource metadata (RFC 9728) named in the 401 `WWW-Authenticate` header.


    Errors: every 4xx/5xx the server shapes itself is an RFC 9457 problem document (`application/problem+json`) with a machine-readable `code` (see `Problem`). Inside the MCP transport (`/mcp`, `/sse`), protocol errors are JSON-RPC error objects (see `JsonRpcErrorResponse`). Rate limits, the error codes and the deprecation policy: https://kaptionai.com/developers/#errors'
  termsOfService: https://kaptionai.com/terms/
  contact:
    name: Kaption AI, LLC
    url: https://kaptionai.com/developers/
    email: hey@kaptionai.com
  license:
    name: BUSL-1.1 (relay source)
    url: https://github.com/Kaption-AI/mcp-extension-remote/blob/main/LICENSE
servers:
- url: https://mcp.kaptionai.com
security:
- kaptionOAuth:
  - kaption:access
tags:
- name: MCP
  description: MCP transport endpoints
paths:
  /mcp:
    post:
      tags:
      - MCP
      operationId: mcpMessage
      summary: Send an MCP JSON-RPC message
      description: 'Send one JSON-RPC 2.0 request or notification: `initialize`, `tools/list`, `tools/call`, `ping` and so on. The response is JSON or, for streamed results, an SSE stream. Include the `Mcp-Session-Id` header returned by `initialize` on later requests.'
      parameters:
      - name: Accept
        in: header
        required: true
        schema:
          type: string
          const: application/json, text/event-stream
        description: Must list both application/json and text/event-stream, or the server answers 406.
      - name: Mcp-Session-Id
        in: header
        required: false
        schema:
          type: string
        description: Session ID returned by the server on initialize.
      - name: MCP-Protocol-Version
        in: header
        required: false
        schema:
          type: string
          examples:
          - '2025-06-18'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
              - $ref: '#/components/schemas/JsonRpcRequest'
              - type: array
                items:
                  $ref: '#/components/schemas/JsonRpcRequest'
                minItems: 1
            examples:
              list:
                summary: List tools
                value:
                  jsonrpc: '2.0'
                  id: 1
                  method: tools/list
              call:
                summary: Search messages
                value:
                  jsonrpc: '2.0'
                  id: 2
                  method: tools/call
                  params:
                    name: query
                    arguments:
                      query: invoice
      responses:
        '200':
          description: JSON-RPC response(s), streamed as server-sent events. Each `message` event's data is a `JsonRpcResponse`. The `initialize` answer carries the session ID.
          headers:
            Mcp-Session-Id:
              schema:
                type: string
              description: Returned on initialize; send it on later requests.
          content:
            text/event-stream:
              schema:
                $ref: '#/components/schemas/SseStream'
        '202':
          description: The body held only JSON-RPC notifications or responses. Accepted; the response has no body.
          content:
            text/plain:
              schema:
                type: string
                maxLength: 0
        '400':
          description: 'Invalid JSON-RPC message: parse error (-32700), invalid request (-32600, e.g. a second initialize) or a missing Mcp-Session-Id (-32000).'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Unknown or expired MCP session (-32001). Start again with initialize.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '406':
          description: The Accept header does not list both application/json and text/event-stream.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '413':
          description: Body larger than 4 MiB.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '415':
          description: Content-Type is not application/json.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '500':
          description: Internal error (-32001).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
    get:
      tags:
      - MCP
      operationId: mcpStream
      summary: Open a server-to-client SSE stream
      responses:
        '200':
          description: Server-to-client SSE stream of JSON-RPC messages.
          content:
            text/event-stream:
              schema:
                $ref: '#/components/schemas/SseStream'
        '400':
          description: Missing Mcp-Session-Id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Unknown or expired MCP session.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '406':
          description: Accept does not include text/event-stream.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
      parameters:
      - name: Mcp-Session-Id
        in: header
        required: true
        schema:
          type: string
        description: Session ID returned by initialize.
      description: Opens a stream for messages the server sends on its own (requests and notifications) within an existing session.
    delete:
      tags:
      - MCP
      operationId: mcpEndSession
      summary: End an MCP session
      responses:
        '204':
          description: Session ended; no body.
        '400':
          description: Missing Mcp-Session-Id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Unknown or expired MCP session.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
            text/plain:
              schema:
                $ref: '#/components/schemas/JsonRpcErrorResponse'
      parameters:
      - name: Mcp-Session-Id
        in: header
        required: true
        schema:
          type: string
      description: Ends the session named by Mcp-Session-Id. Later requests with that ID get 404.
  /sse:
    get:
      tags:
      - MCP
      operationId: legacySse
      summary: Legacy HTTP+SSE transport, for older MCP clients
      responses:
        '200':
          description: 'SSE stream: one `endpoint` event, then `message` events carrying JsonRpcResponse objects.'
          content:
            text/event-stream:
              schema:
                $ref: '#/components/schemas/SseStream'
        '401':
          $ref: '#/components/responses/Unauthorized'
      description: Opens the legacy transport. The first event is `endpoint`, whose data is the URL to POST messages to (`/sse/message?sessionId=…`); answers then arrive as `message` events.
  /sse/message:
    post:
      tags:
      - MCP
      operationId: legacySseMessage
      summary: Send a JSON-RPC message on the legacy SSE transport
      parameters:
      - name: sessionId
        in: query
        required: true
        schema:
          type: string
        description: From the `endpoint` event of GET /sse.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/JsonRpcRequest'
      responses:
        '202':
          description: Accepted. The literal body `Accepted`; the answer arrives on the GET /sse stream.
          content:
            text/event-stream:
              schema:
                type: string
                const: Accepted
        '400':
          description: Invalid message or missing sessionId (plain text).
          content:
            text/plain:
              schema:
                type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Unknown session (plain text).
          content:
            text/plain:
              schema:
                type: string
      description: Legacy transport only. POST each JSON-RPC message here; the answer arrives as a `message` event on the GET /sse stream.
components:
  responses:
    Unauthorized:
      description: Missing, expired or invalid bearer token. Follow `resource_metadata` in the `WWW-Authenticate` header to start OAuth.
      headers:
        WWW-Authenticate:
          schema:
            type: string
          example: Bearer realm="OAuth", resource_metadata="https://mcp.kaptionai.com/.well-known/oauth-protected-resource/mcp", scope="kaption:access"
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/BearerProblem'
  schemas:
    JsonRpcRequest:
      type: object
      required:
      - jsonrpc
      - method
      properties:
        jsonrpc:
          const: '2.0'
        id:
          type:
          - string
          - integer
        method:
          type: string
          examples:
          - initialize
          - tools/list
          - tools/call
        params:
          type: object
          properties:
            name:
              type: string
              description: Tool name, for tools/call.
              enum:
              - query
              - list_contacts
              - get_contact
              - get_contact_groups
              - list_groups
              - get_group
              - export_contacts
              - download_media
              - get_analytics
              - summarize_conversation
              - manage_chat
              - manage_reminders
              - manage_lists
              - manage_labels
              - manage_notes
              - manage_scheduled_messages
              - send_message
              - call_recordings
            arguments:
              type: object
              description: Tool arguments. Get each tool's input schema from tools/list.
    BearerProblem:
      allOf:
      - $ref: '#/components/schemas/Problem'
      - type: object
        required:
        - error
        - resource_metadata
        properties:
          code:
            enum:
            - authentication_required
            - invalid_token
          error:
            type: string
            enum:
            - invalid_request
            - invalid_token
            - insufficient_scope
            description: RFC 6750 error code, kept for OAuth clients.
          error_description:
            type: string
          resource_metadata:
            type: string
            format: uri
    ToolResult:
      type: object
      required:
      - content
      properties:
        content:
          type: array
          items:
            type: object
            required:
            - type
            properties:
              type:
                type: string
                examples:
                - text
              text:
                type: string
        structuredContent:
          type: object
          properties:
            result: {}
        isError:
          type: boolean
          description: true when the tool failed; the reason is in content.
    SseStream:
      type: string
      contentMediaType: text/event-stream
      description: Server-sent events. The `data` of each `message` event is one JSON-encoded JsonRpcResponse (contentSchema); on GET /mcp it can also be a server request or notification.
      contentSchema:
        $ref: '#/components/schemas/JsonRpcResponse'
    Problem:
      type: object
      description: RFC 9457 problem document. `code` is stable and snake_case; branch on it, not on `title` or `detail`.
      required:
      - type
      - title
      - status
      - code
      properties:
        type:
          type: string
          format: uri
          examples:
          - https://kaptionai.com/developers/#errors-rate_limited
        title:
          type: string
          examples:
          - Too Many Requests
        status:
          type: integer
          minimum: 400
          maximum: 599
        detail:
          type: string
        code:
          type: string
          pattern: ^[a-z0-9_]+$
          examples:
          - not_found
          - invalid_token
          - rate_limited
          - internal_error
        policy:
          type: string
          description: 'On 429: the rate-limit policy that ran out.'
        retry_after:
          type: integer
          description: 'On 429: seconds to wait, same as the Retry-After header.'
      additionalProperties: true
    JsonRpcError:
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: integer
          examples:
          - -32700
          - -32600
          - -32000
          - -32001
        message:
          type: string
        data: {}
    JsonRpcResponse:
      type: object
      required:
      - jsonrpc
      - id
      properties:
        jsonrpc:
          const: '2.0'
        id:
          type:
          - string
          - integer
          - 'null'
        result:
          description: The method's result. For tools/call it is a ToolResult.
          anyOf:
          - $ref: '#/components/schemas/ToolResult'
          - type: object
        error:
          $ref: '#/components/schemas/JsonRpcError'
    JsonRpcErrorResponse:
      type: object
      required:
      - jsonrpc
      - error
      - id
      properties:
        jsonrpc:
          const: '2.0'
        error:
          $ref: '#/components/schemas/JsonRpcError'
        id:
          type:
          - string
          - integer
          - 'null'
  securitySchemes:
    kaptionOAuth:
      type: oauth2
      description: OAuth 2.1 authorization code flow with PKCE (S256) and dynamic client registration at https://mcp.kaptionai.com/register. The user signs in with their phone number and a code sent to them on WhatsApp. Access tokens expire after one hour.
      flows:
        authorizationCode:
          authorizationUrl: https://mcp.kaptionai.com/authorize
          tokenUrl: https://mcp.kaptionai.com/token
          refreshUrl: https://mcp.kaptionai.com/token
          scopes:
            kaption:access: Use the Kaption MCP tools on the signed-in user's WhatsApp through Kaption.
externalDocs:
  description: Developer guide
  url: https://kaptionai.com/developers/
x-mcp:
  serverCard: https://kaptionai.com/.well-known/mcp.json
  tools:
  - query
  - list_contacts
  - get_contact
  - get_contact_groups
  - list_groups
  - get_group
  - export_contacts
  - download_media
  - get_analytics
  - summarize_conversation
  - manage_chat
  - manage_reminders
  - manage_lists
  - manage_labels
  - manage_notes
  - manage_scheduled_messages
  - send_message
  - call_recordings
x-rate-limits:
  documentation: https://kaptionai.com/developers/#rate-limits
  headers:
  - RateLimit-Limit
  - RateLimit-Remaining
  - RateLimit-Reset
  - RateLimit-Policy
  - Retry-After