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

# Install an integration of Aether's integration directory

> Installs the integration keyed key. One without skills is added to the catalog as its MCP server (source directory), its auth probed as a server added by hand is probed; any other is installed as a plugin, a marketplace's or one Aether synthesizes from the integration's skills, bundling its servers. Either is enabled on every current project of the organization, and every project created later, with the default credential policy the directory names for it. connect lists the installed servers that take a connection, in key order: how each connects and whose connection the default calls for. Refused, naming the conflict, when another server of the organization holds one of its server keys (plugin_server_key_taken), with integration_not_in_directory for a key the directory does not list, and with integration_auth_unexpected when the server asks for a credential exactly when the directory names no one to connect it.



## OpenAPI

````yaml api-reference/openapi.v1.json POST /integration-directory/{key}/install
openapi: 3.1.0
info:
  title: Aether Public API
  version: 0.1.0
  description: >-
    The versioned, public Aether REST API. Authenticate with an `aether_`
    platform API key or a session token.
servers:
  - url: https://api.runaether.dev/v1
security:
  - bearerAuth: []
paths:
  /integration-directory/{key}/install:
    post:
      tags:
        - plugins
      summary: Install an integration of Aether's integration directory
      description: >-
        Installs the integration keyed key. One without skills is added to the
        catalog as its MCP server (source directory), its auth probed as a
        server added by hand is probed; any other is installed as a plugin, a
        marketplace's or one Aether synthesizes from the integration's skills,
        bundling its servers. Either is enabled on every current project of the
        organization, and every project created later, with the default
        credential policy the directory names for it. connect lists the
        installed servers that take a connection, in key order: how each
        connects and whose connection the default calls for. Refused, naming the
        conflict, when another server of the organization holds one of its
        server keys (plugin_server_key_taken), with integration_not_in_directory
        for a key the directory does not list, and with
        integration_auth_unexpected when the server asks for a credential
        exactly when the directory names no one to connect it.
      operationId: installDirectoryIntegration
      parameters:
        - in: path
          name: key
          required: true
          schema:
            pattern: ^[a-z][a-z0-9_-]{0,31}$
            type: string
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DirectoryInstallResponse'
          description: Created
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Bad Request
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Unauthorized
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrgAuthorizationErrorResponse'
          description: Forbidden
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PluginErrorResponse'
          description: Conflict
        '422':
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/ErrorResponse'
                  - $ref: '#/components/schemas/PluginErrorResponse'
          description: Unprocessable Entity
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Internal Server Error
components:
  schemas:
    DirectoryInstallResponse:
      discriminator:
        mapping:
          mcp_server:
            $ref: '#/components/schemas/DirectoryInstalledServer'
          plugin:
            $ref: '#/components/schemas/DirectoryInstalledPlugin'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/DirectoryInstalledServer'
        - $ref: '#/components/schemas/DirectoryInstalledPlugin'
    ErrorResponse:
      additionalProperties: false
      properties:
        code:
          type: string
        error:
          minLength: 1
          type: string
        errors:
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type: array
      required:
        - error
      type: object
    OrgAuthorizationErrorResponse:
      additionalProperties: false
      properties:
        code:
          enum:
            - org_membership_required
            - org_role_insufficient
            - org_suspended
            - account_deleting
          type: string
        error:
          minLength: 1
          type: string
      required:
        - error
        - code
      type: object
    PluginErrorResponse:
      additionalProperties: false
      properties:
        code:
          enum:
            - plugin_request_invalid
            - plugin_source_address_refused
            - plugin_source_not_public
            - plugin_source_unreachable
            - plugin_source_not_found
            - plugin_source_unsupported
            - plugin_source_too_large
            - plugin_source_invalid
            - plugin_source_empty
            - plugin_skill_invalid
            - plugin_undeliverable
            - plugin_server_probe_failed
            - plugin_server_key_taken
            - plugin_name_taken
            - plugin_moved
            - mcp_credential_policy_required
            - mcp_credential_policy_not_applicable
            - mcp_credential_policy_org_unavailable
            - integration_not_in_directory
            - integration_shape_changed
            - integration_auth_unexpected
          type: string
        conflicts:
          items:
            $ref: '#/components/schemas/PluginKeyHolder'
          type: array
        error:
          minLength: 1
          type: string
      required:
        - error
        - code
        - conflicts
      type: object
    DirectoryInstalledServer:
      additionalProperties: false
      properties:
        connect:
          description: >-
            The server when it takes a connection, under its default credential
            policy; empty when it needs none.
          items:
            $ref: '#/components/schemas/McpServerConnect'
          type: array
        kind:
          enum:
            - mcp_server
          type: string
        mcp_server:
          $ref: '#/components/schemas/McpServer'
      required:
        - kind
        - mcp_server
        - connect
      type: object
    DirectoryInstalledPlugin:
      additionalProperties: false
      properties:
        connect:
          description: >-
            The plugin's servers that take a connection, in key order, under the
            plugin's default credential policy; empty when none does.
          items:
            $ref: '#/components/schemas/McpServerConnect'
          type: array
        kind:
          enum:
            - plugin
          type: string
        plugin:
          $ref: '#/components/schemas/Plugin'
      required:
        - kind
        - plugin
        - connect
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
    PluginKeyHolder:
      additionalProperties: false
      properties:
        key:
          type: string
        plugin:
          type:
            - string
            - 'null'
        source:
          enum:
            - manual
            - aether
            - plugin
            - directory
          type: string
      required:
        - key
        - source
        - plugin
      type: object
    McpServerConnect:
      additionalProperties: false
      properties:
        kind:
          description: >-
            oauth: consent at the server's authorization server, started with
            startMcpServerOAuth (owner viewer) or startOrgMcpServerOAuth (owner
            org). api_key: an API key, saved with connectMcpServer or
            connectOrgMcpServer.
          enum:
            - oauth
            - api_key
          type: string
        mcp_server_id:
          format: uuid
          type: string
        owner:
          description: >-
            Whose connection the default credential policy calls for: viewer,
            the caller's own (creator); org, the organization's, which an org
            admin makes (org).
          enum:
            - viewer
            - org
          type: string
        url:
          description: >-
            The server's URL: the url startMcpServerOAuth and connectMcpServer
            take for it.
          type: string
      required:
        - kind
        - mcp_server_id
        - url
        - owner
      type: object
    McpServer:
      discriminator:
        mapping:
          http:
            $ref: '#/components/schemas/McpHTTPServer'
          stdio:
            $ref: '#/components/schemas/McpStdioServer'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/McpHTTPServer'
        - $ref: '#/components/schemas/McpStdioServer'
    Plugin:
      additionalProperties: false
      properties:
        commit:
          type: string
        created_at:
          format: date-time
          type: string
        default_credential_policy:
          enum:
            - creator
            - org
          type:
            - string
            - 'null'
        delivery:
          $ref: '#/components/schemas/PluginDelivery'
        directory:
          $ref: '#/components/schemas/PluginDirectoryOrigin'
        id:
          format: uuid
          type: string
        manifests:
          $ref: '#/components/schemas/PluginManifests'
        marketplace:
          $ref: '#/components/schemas/PluginMarketplaceOrigin'
        name:
          type: string
        needs_credential:
          type: boolean
        path:
          description: The directory holding the plugin; empty for the repository's root.
          type: string
        ref:
          description: >-
            The branch or tag the source follows; null for the default branch or
            a marketplace entry pinned to a commit.
          type:
            - string
            - 'null'
        repository_url:
          type: string
        servers:
          items:
            discriminator:
              mapping:
                remote:
                  $ref: '#/components/schemas/PluginRemoteServer'
                stdio_unavailable:
                  $ref: '#/components/schemas/PluginStdioServer'
              propertyName: kind
            oneOf:
              - $ref: '#/components/schemas/PluginRemoteServer'
              - $ref: '#/components/schemas/PluginStdioServer'
          type: array
        skills:
          description: >-
            The plugin's skills, ordered by their SKILL.md's path; null until
            Aether reads the skills of a plugin installed before it recorded
            them.
          items:
            $ref: '#/components/schemas/PluginSkill'
          type:
            - array
            - 'null'
        support:
          $ref: '#/components/schemas/PluginSupport'
        updated_at:
          format: date-time
          type: string
      required:
        - id
        - name
        - repository_url
        - path
        - ref
        - commit
        - manifests
        - support
        - needs_credential
        - default_credential_policy
        - skills
        - servers
        - created_at
        - updated_at
      type: object
    McpHTTPServer:
      additionalProperties: false
      properties:
        auth:
          enum:
            - none
            - static_secret
            - oauth
          type: string
        connection_kind:
          enum:
            - static_secret
            - oauth
            - github_user_credential
          type:
            - string
            - 'null'
        created_at:
          format: date-time
          type: string
        default_credential_policy:
          enum:
            - creator
            - org
          type:
            - string
            - 'null'
        display_name:
          type: string
        headers:
          additionalProperties:
            type: string
          type: object
        homepage:
          description: >-
            The integration's homepage, as Aether's integration directory names
            it; null unless source is directory.
          type:
            - string
            - 'null'
        id:
          format: uuid
          type: string
        key:
          type: string
        kind:
          enum:
            - http
          type: string
        plugin_id:
          format: uuid
          type:
            - string
            - 'null'
        required:
          type: boolean
        secret_names:
          items:
            type: string
          type: array
        source:
          enum:
            - manual
            - aether
            - plugin
            - directory
          type: string
        updated_at:
          format: date-time
          type: string
        url:
          type: string
      required:
        - kind
        - id
        - key
        - display_name
        - url
        - headers
        - auth
        - source
        - connection_kind
        - required
        - default_credential_policy
        - secret_names
        - plugin_id
        - homepage
        - created_at
        - updated_at
      type: object
    McpStdioServer:
      additionalProperties: false
      properties:
        args:
          items:
            type: string
          type: array
        auth:
          enum:
            - none
            - static_secret
          type: string
        connection_kind:
          enum:
            - static_secret
          type:
            - string
            - 'null'
        created_at:
          format: date-time
          type: string
        default_credential_policy:
          enum:
            - creator
            - org
          type:
            - string
            - 'null'
        display_name:
          type: string
        env:
          additionalProperties:
            $ref: '#/components/schemas/McpStdioEnvValue'
          type: object
        id:
          format: uuid
          type: string
        key:
          type: string
        kind:
          enum:
            - stdio
          type: string
        package:
          type: string
        required:
          type: boolean
        runtime:
          enum:
            - npx
            - uvx
            - python
          type: string
        secret_names:
          items:
            type: string
          type: array
        source:
          enum:
            - manual
          type: string
        updated_at:
          format: date-time
          type: string
        version:
          type: string
      required:
        - kind
        - id
        - key
        - display_name
        - runtime
        - package
        - version
        - args
        - env
        - auth
        - source
        - connection_kind
        - required
        - default_credential_policy
        - secret_names
        - created_at
        - updated_at
      type: object
    PluginDelivery:
      additionalProperties: false
      properties:
        claude_code:
          description: >-
            deliverable, or why Claude Code cannot load the plugin:
            claude_code_manifest_skills, its .claude-plugin/plugin.json names
            its skills other than as ./ paths inside it.
          enum:
            - deliverable
            - claude_code_manifest_skills
          type: string
        codex:
          description: >-
            deliverable, or why Codex cannot load the plugin: codex_plugin_name,
            its name ends in '.'; codex_no_manifest, it has none of the
            manifests Codex reads; codex_agent_plugins_servers, Codex reads it
            as an Agent Plugins plugin, whose mcp.json cannot carry the
            credential Aether's MCP gateway requires, and it has remote MCP
            servers.
          enum:
            - deliverable
            - codex_plugin_name
            - codex_no_manifest
            - codex_agent_plugins_servers
          type: string
      required:
        - claude_code
        - codex
      type: object
    PluginDirectoryOrigin:
      additionalProperties: false
      properties:
        display_name:
          type: string
        homepage:
          type: string
      required:
        - display_name
        - homepage
      type: object
    PluginManifests:
      additionalProperties: false
      properties:
        agent_plugins:
          description: The Agent Plugins plugin.json at the plugin's root.
          type: boolean
        claude:
          description: .claude-plugin/plugin.json
          type: boolean
        codex:
          description: .codex-plugin/plugin.json
          type: boolean
        synthesized:
          description: >-
            The plugin's directory holds no manifest, so Aether synthesizes one:
            the plugin is the directory's skills, every directory holding a
            SKILL.md, named after the directory.
          type: boolean
      required:
        - claude
        - codex
        - agent_plugins
        - synthesized
      type: object
    PluginMarketplaceOrigin:
      additionalProperties: false
      properties:
        name:
          type: string
        plugin:
          type: string
        url:
          type: string
      required:
        - name
        - url
        - plugin
      type: object
    PluginRemoteServer:
      additionalProperties: false
      properties:
        auth:
          enum:
            - none
            - static_secret
            - oauth
          type: string
        key:
          type: string
        kind:
          enum:
            - remote
          type: string
        mcp_server_id:
          format: uuid
          type: string
        url:
          type: string
      required:
        - kind
        - mcp_server_id
        - key
        - url
        - auth
      type: object
    PluginStdioServer:
      additionalProperties: false
      properties:
        args:
          items:
            type: string
          type: array
        command:
          type: string
        key:
          type: string
        kind:
          enum:
            - stdio_unavailable
          type: string
      required:
        - kind
        - key
        - command
        - args
      type: object
    PluginSkill:
      additionalProperties: false
      properties:
        agents:
          description: The agents that load the skill.
          items:
            enum:
              - claude_code
              - codex
            type: string
          maxItems: 2
          minItems: 1
          type: array
        description:
          description: The description the SKILL.md's frontmatter declares.
          type: string
        name:
          description: The name the SKILL.md's frontmatter declares.
          type: string
      required:
        - name
        - description
        - agents
      type: object
    PluginSupport:
      additionalProperties: false
      properties:
        claude_code:
          items:
            enum:
              - skills
              - commands
              - agents
              - hooks
              - mcp_servers
            type: string
          type: array
        codex:
          items:
            enum:
              - skills
              - commands
              - agents
              - hooks
              - mcp_servers
            type: string
          type: array
      required:
        - claude_code
        - codex
      type: object
    McpStdioEnvValue:
      discriminator:
        mapping:
          plain:
            $ref: '#/components/schemas/McpStdioPlainEnv'
          secret:
            $ref: '#/components/schemas/McpStdioSecretEnv'
        propertyName: kind
      oneOf:
        - $ref: '#/components/schemas/McpStdioPlainEnv'
        - $ref: '#/components/schemas/McpStdioSecretEnv'
    McpStdioPlainEnv:
      additionalProperties: false
      properties:
        kind:
          enum:
            - plain
          type: string
        value:
          type: string
      required:
        - kind
        - value
      type: object
    McpStdioSecretEnv:
      additionalProperties: false
      properties:
        kind:
          enum:
            - secret
          type: string
      required:
        - kind
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: JWT
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.