> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tai42.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Add or remove single extension combos on a tool

> Granularly edit a tool's extension combos: append ``add`` and drop ``remove``
over the merge of its current combos, then persist through the same pipeline
``set_tool_extensions`` rides.

Pinned order (each check loud, nothing persisted on a reject): the tool must be
REGISTERED (404, as ``get_tool_extensions``); its owning config resolves
(400/400/409, as ``set_tool_extensions``); membership over the OWNING config's
combos in their stored form — adding a present combo → 400, removing an absent
one → 404, each naming the combo; the MERGED list validates against the live
registry (400) before any write. Returns the tool's full new combos in the GET
door's shape.



## OpenAPI

````yaml /openapi.json post /api/tools/{name}/extensions/combos
openapi: 3.1.0
info:
  description: The operator HTTP surface served under /api/*.
  title: tai42-skeleton API
  version: 14.0.2
servers: []
security: []
paths:
  /api/tools/{name}/extensions/combos:
    post:
      tags:
        - extensions
      summary: Add or remove single extension combos on a tool
      description: >-
        Granularly edit a tool's extension combos: append ``add`` and drop
        ``remove``

        over the merge of its current combos, then persist through the same
        pipeline

        ``set_tool_extensions`` rides.


        Pinned order (each check loud, nothing persisted on a reject): the tool
        must be

        REGISTERED (404, as ``get_tool_extensions``); its owning config resolves

        (400/400/409, as ``set_tool_extensions``); membership over the OWNING
        config's

        combos in their stored form — adding a present combo → 400, removing an
        absent

        one → 404, each naming the combo; the MERGED list validates against the
        live

        registry (400) before any write. Returns the tool's full new combos in
        the GET

        door's shape.
      operationId: post_api_tools_name_extensions_combos
      parameters:
        - in: path
          name: name
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ToolExtensionCombosModify'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/ToolExtensionsView'
                required:
                  - data
                type: object
          description: Success.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Malformed request.
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Missing or invalid api key.
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Resource not found.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          description: Conflict with the current resource state.
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReloadingError'
          description: The server is applying a config reload; retry shortly.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ToolExtensionCombosModify:
      description: >-
        Add and/or remove single extension combos on a tool, granular over the
        full

        ``set`` write. Each combo is authored losslessly, exactly as ``combos``
        above.
      properties:
        add:
          items:
            items:
              anyOf:
                - type: string
                - additionalProperties: true
                  type: object
            type: array
          title: Add
          type: array
        remove:
          items:
            items:
              anyOf:
                - type: string
                - additionalProperties: true
                  type: object
            type: array
          title: Remove
          type: array
      title: ToolExtensionCombosModify
      type: object
    ToolExtensionsView:
      description: >-
        A tool's applied extension combos plus the catalog of available
        extensions. Each

        ``available`` entry is a ``{name, kind}`` string map.
      properties:
        available:
          items:
            additionalProperties:
              type: string
            type: object
          title: Available
          type: array
        combos:
          items:
            items:
              anyOf:
                - type: string
                - additionalProperties: true
                  type: object
            type: array
          title: Combos
          type: array
      required:
        - combos
        - available
      title: ToolExtensionsView
      type: object
    Error:
      properties:
        code:
          description: >-
            Stable machine-readable reason a client keys a dedicated error state
            on, present on refusals that opt in (e.g. a 501 not-configured
            refusal). Optional: absent when the error carries only a
            human-readable message.
          type: string
        error:
          type: string
      required:
        - error
      type: object
    ReloadingError:
      properties:
        error:
          const: reloading — the server is applying a config reload; retry shortly
          type: string
        reloading:
          const: true
          type: boolean
      required:
        - error
        - reloading
      type: object
  securitySchemes:
    ApiKeyAuth:
      in: header
      name: x-api-key
      type: apiKey

````