{
  "components": {
    "schemas": {
      "ActiveCatalog": {
        "description": "The published catalog. Its catalog revision stays internal: no operation accepts it.",
        "properties": {
          "toolCount": {
            "format": "int64",
            "minimum": 0,
            "type": "integer"
          }
        },
        "required": [
          "toolCount"
        ],
        "type": "object"
      },
      "AuthenticationErrorResponseContent": {
        "description": "Authentication credentials are missing, malformed, or invalid.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 401,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/AuthenticationErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "AuthenticationErrorType": {
        "description": "Problem type URI for authentication errors.",
        "enum": [
          "/errors/authentication-failed"
        ],
        "type": "string"
      },
      "AuthenticationInput": {
        "description": "One authentication method per header the Upstream receives. At most one method may send each header, compared case-insensitively; bearer sends Authorization.",
        "properties": {
          "methods": {
            "items": {
              "$ref": "#/components/schemas/AuthenticationMethodInput"
            },
            "type": "array"
          }
        },
        "type": "object"
      },
      "AuthenticationMethodInput": {
        "description": "One member per method kind, each with exactly its own fields. A later kind, such\nas basic or oauth2ClientCredentials, is a new member, which is additive. A method\nsent back as read may keep its kind (BEARER, HEADER), which must be the kind of the\nmethod's one member and is then ignored; any other kind is a 400 on\nmcp.authentication.methods[i].kind.",
        "oneOf": [
          {
            "properties": {
              "bearer": {
                "$ref": "#/components/schemas/BearerMethodInput"
              }
            },
            "required": [
              "bearer"
            ],
            "title": "bearer",
            "type": "object"
          },
          {
            "properties": {
              "header": {
                "$ref": "#/components/schemas/HeaderMethodInput"
              }
            },
            "required": [
              "header"
            ],
            "title": "header",
            "type": "object"
          }
        ]
      },
      "AuthenticationMethodOutput": {
        "description": "One method, discriminated by kind, with its fields under the member named by\nkind. This union may gain members, such as basic, and a client must keep a\nmethod whose kind it does not know rather than fail.",
        "discriminator": {
          "mapping": {
            "BEARER": "#/components/schemas/AuthenticationMethodOutputBearer",
            "HEADER": "#/components/schemas/AuthenticationMethodOutputHeader"
          },
          "propertyName": "kind"
        },
        "oneOf": [
          {
            "$ref": "#/components/schemas/AuthenticationMethodOutputBearer"
          },
          {
            "$ref": "#/components/schemas/AuthenticationMethodOutputHeader"
          }
        ]
      },
      "AuthenticationMethodOutputBearer": {
        "allOf": [
          {
            "$ref": "#/components/schemas/BearerAuthenticationMethodOutput"
          },
          {
            "$ref": "#/components/schemas/AuthenticationMethodOutputMixin"
          }
        ]
      },
      "AuthenticationMethodOutputHeader": {
        "allOf": [
          {
            "$ref": "#/components/schemas/HeaderAuthenticationMethodOutput"
          },
          {
            "$ref": "#/components/schemas/AuthenticationMethodOutputMixin"
          }
        ]
      },
      "AuthenticationMethodOutputMixin": {
        "properties": {
          "kind": {
            "type": "string"
          }
        },
        "required": [
          "kind"
        ],
        "type": "object"
      },
      "AuthenticationOutput": {
        "description": "Shows which headers the Upstream receives, never a value or a credential ID. A rotation shows as a new revision and updatedAt.",
        "properties": {
          "methods": {
            "items": {
              "$ref": "#/components/schemas/AuthenticationMethodOutput"
            },
            "type": "array"
          }
        },
        "required": [
          "methods"
        ],
        "type": "object"
      },
      "BadRequestErrorResponseContent": {
        "description": "Request validation or input decoding failed.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "errors": {
            "description": "Every invalid request member found, when the failure is about members.",
            "items": {
              "$ref": "#/components/schemas/FieldError"
            },
            "type": "array"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 400,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/BadRequestErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "BadRequestErrorType": {
        "description": "Problem type URI for bad request errors.",
        "enum": [
          "/errors/invalid-data",
          "/errors/invalid-cursor",
          "/errors/unknown-request-member",
          "/errors/invalid-model-config",
          "/errors/model-config-immutable",
          "/errors/model-config-not-supported"
        ],
        "type": "string"
      },
      "BearerAuthenticationMethodOutput": {
        "properties": {
          "bearer": {
            "$ref": "#/components/schemas/BearerMethodOutput"
          }
        },
        "required": [
          "bearer"
        ],
        "type": "object"
      },
      "BearerMethodInput": {
        "description": "A secret is required on create and for a new method. Omitted on update keeps the current secret, unless the endpoint changes.",
        "properties": {
          "value": {
            "description": "A secret value. Write-only: no output shape has a member that can carry it.",
            "format": "password",
            "minLength": 1,
            "type": "string"
          }
        },
        "type": "object"
      },
      "BearerMethodOutput": {
        "type": "object"
      },
      "CachePolicy": {
        "properties": {
          "ttlSeconds": {
            "description": "How long a cached result lives, in seconds.",
            "format": "int32",
            "maximum": 86400,
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "ttlSeconds"
        ],
        "type": "object"
      },
      "CatalogFailure": {
        "description": "The outcome of a failed initial catalog (discovery or tool generation), in the RFC 9457 shape. Only CreateUpstreamOutput carries it; it is not stored.",
        "properties": {
          "detail": {
            "type": "string"
          },
          "occurredAt": {
            "format": "date-time",
            "type": "string"
          },
          "status": {
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "type": "string"
          },
          "type": {
            "type": "string"
          }
        },
        "required": [
          "occurredAt",
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "CompressionCapture": {
        "enum": [
          "NEVER"
        ],
        "type": "string"
      },
      "CompressionPolicy": {
        "description": "Set exactly one member. An empty compression is refused with 400.",
        "properties": {
          "capture": {
            "$ref": "#/components/schemas/CompressionCapture"
          },
          "ttlSeconds": {
            "description": "How long a handle of this tool lives, in seconds, in place of the deployment's compression.ttl. Refused together with capture never.",
            "format": "int32",
            "maximum": 86400,
            "minimum": 1,
            "type": "integer"
          }
        },
        "type": "object"
      },
      "ConflictErrorResponseContent": {
        "description": "The request conflicts with the current state of the resource.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "existingId": {
            "description": "The ID of the existing resource the request collided with, when the conflict names one.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 409,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ConflictErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "ConflictErrorType": {
        "description": "Problem type URI for conflict errors.",
        "enum": [
          "/errors/conflict",
          "/errors/entry-not-published",
          "/errors/entry-key-conflict",
          "/errors/content-limit-exceeded",
          "/errors/pinned-entry-unavailable",
          "/errors/proposal-already-exists",
          "/errors/proposal-evidence-conflict",
          "/errors/proposal-evidence-capacity",
          "/errors/proposal-trashed",
          "/errors/proposal-open",
          "/errors/proposal-promotion-locked",
          "/errors/extraction-disabled",
          "/errors/gateway-mutation-in-progress",
          "/errors/surface-mutation-in-progress",
          "/errors/namespace-conflict",
          "/errors/gateway-not-empty",
          "/errors/gateway-deleting",
          "/errors/catalog-publication-conflict",
          "/errors/summary-view-conflict"
        ],
        "type": "string"
      },
      "ContextSurfaceInput": {
        "description": "The settings of a context-surface Upstream on create.",
        "properties": {
          "dataModel": {
            "description": "The data model, a JSON object. The API schema does not describe it: the\ncontrol plane validates it and names each error by its path under\ncontextSurface.dataModel. Omitted, the Surface's catalog has no tools."
          },
          "databaseId": {
            "description": "Required in Redis Cloud. Optional on-prem, where an omitted ID defaults to the configured Surface database; if none is configured, the request is refused with 400 on contextSurface.databaseId. Only an omitted ID is defaulted: an ID sent as an empty string or null is refused with 400 on contextSurface.databaseId. An unknown ID and an ID the tenant does not own are refused with the same 400. It cannot change after create.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9-]+$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ContextSurfaceOutput": {
        "description": "The settings of a context-surface Upstream.",
        "properties": {
          "dataModel": {
            "description": "The data model as the operator sent it. Absent when the Upstream has none."
          },
          "databaseBinding": {
            "$ref": "#/components/schemas/DatabaseBinding"
          }
        },
        "required": [
          "databaseBinding"
        ],
        "type": "object"
      },
      "ContextSurfaceUpdate": {
        "description": "Changes the settings of a context-surface Upstream. Sending neither member is\nrefused with 400.",
        "properties": {
          "dataModel": {
            "description": "Swaps the data model: generates a catalog from the new data model and\ncommits the data model, the catalog, and any other member sent with it\ntogether, or commits nothing. null and {} are refused with 400. The API\nschema does not describe it: the control plane validates it and names each\nerror by its path under contextSurface.dataModel."
          },
          "databaseId": {
            "description": "The stored database, which cannot change: another databaseId is refused with 400.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9-]+$",
            "type": "string"
          }
        },
        "type": "object"
      },
      "CreateGatewayRequestContent": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "databaseId": {
            "description": "Selects the Gateway database for the Gateway's result state. Omitted means the deployment's default Gateway database when one is configured (on-prem). Otherwise the Gateway has no Gateway database. An ID that is not in the registry is refused with 400. The response returns the resolved ID.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9-]+$",
            "type": "string"
          },
          "description": {
            "description": "Free-text description of any API resource. May be empty.",
            "maxLength": 1024,
            "minLength": 0,
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "CreateGatewayResponseContent": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "databaseBinding": {
            "$ref": "#/components/schemas/DatabaseBinding"
          },
          "description": {
            "description": "Free-text description of any API resource. May be empty.",
            "maxLength": 1024,
            "minLength": 0,
            "type": "string"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "mcpEndpoint": {
            "description": "The URL of this Gateway's MCP endpoint on the data plane: the data plane's public base URL, a deployment setting, plus /iris/data/v1/context-gateway/gateways/{gatewayId}/mcp.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "cache",
          "compression",
          "createdAt",
          "gatewayId",
          "mcpEndpoint",
          "name",
          "revision",
          "toolExposureMode",
          "updatedAt"
        ],
        "type": "object"
      },
      "CreateUpstreamRequestContent": {
        "properties": {
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceInput"
          },
          "enabled": {
            "description": "Defaults to true.",
            "type": "boolean"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPInput"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Derived from name when omitted. A collision is a 409 namespace-conflict, whose existingId is the Upstream that holds the namespace; no suffix is generated.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          }
        },
        "required": [
          "kind",
          "name"
        ],
        "type": "object"
      },
      "CreateUpstreamResponseContent": {
        "description": "Only create returns initialCatalogFailure, so no other operation's generated client\nshows it.",
        "properties": {
          "activeCatalog": {
            "$ref": "#/components/schemas/ActiveCatalog"
          },
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceOutput"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "initialCatalogFailure": {
            "$ref": "#/components/schemas/CatalogFailure"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPOutput"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Gateway-unique lowercase kebab-case name of letters, digits and hyphens, so without dots or underscores, of at most 32 characters. It prefixes every exposed tool name, joined by a double underscore as namespace__tool. The whole tool name must fit 64 characters, which model APIs enforce, so a namespace leaves at least 30 characters for the tool name. A namespace derived from a name longer than 32 characters keeps its first 25 characters and ends with a hyphen and six hex digits of a digest of the whole derivation.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "enabled",
          "gatewayId",
          "kind",
          "name",
          "namespace",
          "revision",
          "toolPolicies",
          "updatedAt",
          "upstreamId"
        ],
        "type": "object"
      },
      "Database": {
        "properties": {
          "accessCidrs": {
            "description": "Database CIDR allow-list items",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "controlPlaneAccessible": {
            "description": "Whether the database is accessible from the control plane based on IP restrictions",
            "type": "boolean"
          },
          "databaseId": {
            "description": "ID of the database",
            "type": "string"
          },
          "databaseProvider": {
            "description": "Cloud provider of the database",
            "type": "string"
          },
          "databaseRegion": {
            "description": "Cloud region of the database",
            "type": "string"
          },
          "eligible": {
            "description": "Whether the database is eligible for the service being onboarded",
            "type": "boolean"
          },
          "name": {
            "description": "Name of the database",
            "type": "string"
          },
          "planType": {
            "description": "Plan type of the database",
            "type": "string"
          },
          "ready": {
            "description": "Whether the database is active and ready to be used",
            "type": "boolean"
          },
          "subscriptionId": {
            "description": "Subscription ID of the database",
            "type": "string"
          },
          "tlsEnabled": {
            "description": "Whether Redis Cloud TLS is enabled on the database",
            "type": "boolean"
          }
        },
        "required": [
          "controlPlaneAccessible",
          "databaseId",
          "eligible",
          "name",
          "ready"
        ],
        "type": "object"
      },
      "DatabaseBinding": {
        "description": "Nonsecret database identity, returned by reads. Connection endpoints and credentials remain internal.",
        "properties": {
          "databaseId": {
            "description": "The ID of an entry in the deployment's databases registry: a Gateway database or a Surface database. Matched regardless of letter case; the control plane stores and returns the registry's lower-case ID.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[A-Za-z0-9-]+$",
            "type": "string"
          },
          "name": {
            "description": "The registry entry's name. Absent when the registry no longer holds the database or its record cannot be read.",
            "type": "string"
          }
        },
        "required": [
          "databaseId"
        ],
        "type": "object"
      },
      "DatabasePurpose": {
        "enum": [
          "GATEWAY",
          "CONTEXT_SURFACE"
        ],
        "type": "string"
      },
      "DroppedToolPolicy": {
        "description": "The members of a stored tool policy that an endpoint change or a data model swap deleted, and why.",
        "properties": {
          "notCacheableReason": {
            "$ref": "#/components/schemas/NotCacheableReason"
          },
          "policy": {
            "$ref": "#/components/schemas/ToolPolicy"
          },
          "reason": {
            "$ref": "#/components/schemas/DroppedToolPolicyReason"
          },
          "tool": {
            "description": "The original tool name, exact and case-preserved.",
            "type": "string"
          }
        },
        "required": [
          "policy",
          "reason",
          "tool"
        ],
        "type": "object"
      },
      "DroppedToolPolicyReason": {
        "enum": [
          "NOT_IN_CATALOG",
          "NOT_CACHEABLE"
        ],
        "type": "string"
      },
      "FailedDependencyErrorResponseContent": {
        "description": "A dependent resource required to process the request is unavailable or unhealthy.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 424,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/FailedDependencyErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "FailedDependencyErrorType": {
        "description": "Problem type URI for failed-dependency errors.",
        "enum": [
          "/errors/resource-unavailable",
          "/errors/database-out-of-memory",
          "/errors/invalid-model-credentials",
          "/errors/model-quota-exceeded"
        ],
        "type": "string"
      },
      "FieldError": {
        "description": "One invalid request member. A body member is named by `pointer`, a path or query parameter by `parameter`; exactly one of the two is present.",
        "properties": {
          "detail": {
            "description": "What is wrong with the member, in fixed words about the rule it broke, never the rejected value.",
            "type": "string"
          },
          "parameter": {
            "description": "Name of the invalid path or query parameter, such as `limit`.",
            "type": "string"
          },
          "pointer": {
            "description": "JSON Pointer (RFC 6901) to the invalid body member, such as `/vectorSpace/dimensions`.",
            "type": "string"
          }
        },
        "required": [
          "detail"
        ],
        "type": "object"
      },
      "ForbiddenErrorResponseContent": {
        "description": "The caller is authenticated but not allowed to access the requested resource.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 403,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ForbiddenErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "ForbiddenErrorType": {
        "description": "Problem type URI for authorization errors.",
        "enum": [
          "/errors/insufficient-permissions"
        ],
        "type": "string"
      },
      "GatewayFeatureState": {
        "description": "Whether a Gateway serves one of its features: the cache or\nhandles. Each needs a Gateway database (databaseId), and the data plane\nserves it only while the deployment's own switch for it (cache.enabled\nor compression.enabled) is on as well. Turning a feature off deletes\nnothing: stored entries expire on their TTL, so turning it back on with the\nsame Gateway database finds the ones still live.",
        "enum": [
          "ENABLED",
          "DISABLED"
        ],
        "type": "string"
      },
      "GatewayOutput": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "databaseBinding": {
            "$ref": "#/components/schemas/DatabaseBinding"
          },
          "description": {
            "description": "Free-text description of any API resource. May be empty.",
            "maxLength": 1024,
            "minLength": 0,
            "type": "string"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "mcpEndpoint": {
            "description": "The URL of this Gateway's MCP endpoint on the data plane: the data plane's public base URL, a deployment setting, plus /iris/data/v1/context-gateway/gateways/{gatewayId}/mcp.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "cache",
          "compression",
          "createdAt",
          "gatewayId",
          "mcpEndpoint",
          "name",
          "revision",
          "toolExposureMode",
          "updatedAt"
        ],
        "type": "object"
      },
      "GetGatewayResponseContent": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "databaseBinding": {
            "$ref": "#/components/schemas/DatabaseBinding"
          },
          "description": {
            "description": "Free-text description of any API resource. May be empty.",
            "maxLength": 1024,
            "minLength": 0,
            "type": "string"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "mcpEndpoint": {
            "description": "The URL of this Gateway's MCP endpoint on the data plane: the data plane's public base URL, a deployment setting, plus /iris/data/v1/context-gateway/gateways/{gatewayId}/mcp.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "cache",
          "compression",
          "createdAt",
          "gatewayId",
          "mcpEndpoint",
          "name",
          "revision",
          "toolExposureMode",
          "updatedAt"
        ],
        "type": "object"
      },
      "GetServiceLivenessResponseContent": {
        "description": "A service that can answer the request. Readiness failures use the shared\nHTTP 503 problem response; dependency names and errors are not public.",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/ServiceHealthStatus"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "GetServiceReadinessResponseContent": {
        "description": "A service that can answer the request. Readiness failures use the shared\nHTTP 503 problem response; dependency names and errors are not public.",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/ServiceHealthStatus"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "GetUpstreamResponseContent": {
        "description": "The members that every Upstream response shares.",
        "properties": {
          "activeCatalog": {
            "$ref": "#/components/schemas/ActiveCatalog"
          },
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceOutput"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPOutput"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Gateway-unique lowercase kebab-case name of letters, digits and hyphens, so without dots or underscores, of at most 32 characters. It prefixes every exposed tool name, joined by a double underscore as namespace__tool. The whole tool name must fit 64 characters, which model APIs enforce, so a namespace leaves at least 30 characters for the tool name. A namespace derived from a name longer than 32 characters keeps its first 25 characters and ends with a hyphen and six hex digits of a digest of the whole derivation.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "enabled",
          "gatewayId",
          "kind",
          "name",
          "namespace",
          "revision",
          "toolPolicies",
          "updatedAt",
          "upstreamId"
        ],
        "type": "object"
      },
      "HeaderAuthenticationMethodOutput": {
        "properties": {
          "header": {
            "$ref": "#/components/schemas/HeaderMethodOutput"
          }
        },
        "required": [
          "header"
        ],
        "type": "object"
      },
      "HeaderMethodInput": {
        "properties": {
          "name": {
            "description": "Compared case-insensitively and stored lowercase. Authorization is rejected beside a bearer method.",
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          },
          "value": {
            "description": "Required on create and for a new method. Omitted on update keeps the current secret, unless the endpoint changes.",
            "format": "password",
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "HeaderMethodOutput": {
        "properties": {
          "name": {
            "description": "Lowercase.",
            "pattern": "^[!#$%\u0026'*+.^_`|~0-9A-Za-z-]+$",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "type": "object"
      },
      "ListDatabasesResponseContent": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/Database"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ListGatewaysResponseContent": {
        "properties": {
          "items": {
            "description": "The Gateways, ordered by gatewayId.",
            "items": {
              "$ref": "#/components/schemas/GatewayOutput"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "Present when more Gateways follow; pass it back as cursor.",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ListUpstreamToolsResponseContent": {
        "properties": {
          "items": {
            "description": "The tools of the active catalog on this page, ordered by name. [] when no catalog is published.",
            "items": {
              "$ref": "#/components/schemas/UpstreamTool"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "Present when more tools follow; pass it back as cursor.",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "ListUpstreamsResponseContent": {
        "properties": {
          "items": {
            "description": "The readable Upstreams on this page, ordered by upstreamId. An Upstream that is being deleted is in neither list.",
            "items": {
              "$ref": "#/components/schemas/UpstreamSummary"
            },
            "type": "array"
          },
          "nextCursor": {
            "description": "Present when more Upstreams follow; pass it back as cursor.",
            "maxLength": 1024,
            "minLength": 1,
            "type": "string"
          },
          "unreadable": {
            "description": "Upstream records that do not match the stored format, reported on the first page only. Omitted when empty. A client deletes such a record without expectedRevision.",
            "items": {
              "$ref": "#/components/schemas/UnreadableUpstream"
            },
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "type": "object"
      },
      "LiveResponseContent": {
        "properties": {
          "status": {
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "MCPInput": {
        "description": "The settings of an mcp Upstream on create.",
        "properties": {
          "authentication": {
            "$ref": "#/components/schemas/AuthenticationInput"
          },
          "endpoint": {
            "description": "An absolute http or https URL without user information. Any other scheme, such as redis or rediss, is refused.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "transport": {
            "$ref": "#/components/schemas/Transport"
          }
        },
        "required": [
          "endpoint"
        ],
        "type": "object"
      },
      "MCPOutput": {
        "description": "The settings of an mcp Upstream.",
        "properties": {
          "authentication": {
            "$ref": "#/components/schemas/AuthenticationOutput"
          },
          "endpoint": {
            "description": "An absolute http or https URL without user information. Any other scheme, such as redis or rediss, is refused.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "transport": {
            "$ref": "#/components/schemas/Transport"
          }
        },
        "required": [
          "authentication",
          "endpoint",
          "transport"
        ],
        "type": "object"
      },
      "MCPUpdate": {
        "description": "Changes the settings of an mcp Upstream. Each member is optional, and an\nomitted one keeps its stored value. Sending none is refused with 400.",
        "properties": {
          "authentication": {
            "$ref": "#/components/schemas/AuthenticationInput"
          },
          "endpoint": {
            "description": "Replaces the endpoint and the transport together. A changed endpoint requires authentication with every secret sent again; otherwise 400.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "transport": {
            "$ref": "#/components/schemas/Transport"
          }
        },
        "type": "object"
      },
      "NotCacheableReason": {
        "enum": [
          "DESTRUCTIVE",
          "NOT_READ_ONLY",
          "INVALID_ANNOTATION"
        ],
        "type": "string"
      },
      "NotFoundErrorResponseContent": {
        "description": "The requested resource does not exist.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 404,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/NotFoundErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "NotFoundErrorType": {
        "description": "Problem type URI for not-found errors.",
        "enum": [
          "/errors/resource-not-found",
          "/errors/gateway-not-found",
          "/errors/upstream-not-found"
        ],
        "type": "string"
      },
      "NotImplementedErrorResponseContent": {
        "description": "The requested capability is recognized but not implemented.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 501,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/NotImplementedErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "NotImplementedErrorType": {
        "description": "Problem type URI for not-implemented errors.",
        "enum": [
          "/errors/not-implemented"
        ],
        "type": "string"
      },
      "PayloadTooLargeErrorResponseContent": {
        "description": "The request payload exceeds the maximum supported size.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 413,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/PayloadTooLargeErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "PayloadTooLargeErrorType": {
        "description": "Problem type URI for payload-too-large errors.",
        "enum": [
          "/errors/payload-too-large"
        ],
        "type": "string"
      },
      "PreconditionFailedErrorResponseContent": {
        "description": "The write named an expected revision (expectedRevision or If-Match) that is no longer current. Read the resource again and retry.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "currentRevision": {
            "description": "The resource's current revision, when the service reports it. Read the resource again before retrying; do not send this value back without reading.",
            "type": "string"
          },
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 412,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/PreconditionFailedErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "PreconditionFailedErrorType": {
        "description": "Problem type URI for a write whose expected revision is no longer current. A write guarded by an If-Match header on an HTTP entity tag uses a different type; see the Identity Service API.",
        "enum": [
          "/errors/revision-conflict"
        ],
        "type": "string"
      },
      "ReadyResponseContent": {
        "properties": {
          "status": {
            "type": "string"
          }
        },
        "required": [
          "status"
        ],
        "type": "object"
      },
      "RefreshUpstreamCatalogResponseContent": {
        "description": "The members that every Upstream response shares.",
        "properties": {
          "activeCatalog": {
            "$ref": "#/components/schemas/ActiveCatalog"
          },
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceOutput"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPOutput"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Gateway-unique lowercase kebab-case name of letters, digits and hyphens, so without dots or underscores, of at most 32 characters. It prefixes every exposed tool name, joined by a double underscore as namespace__tool. The whole tool name must fit 64 characters, which model APIs enforce, so a namespace leaves at least 30 characters for the tool name. A namespace derived from a name longer than 32 characters keeps its first 25 characters and ends with a hyphen and six hex digits of a digest of the whole derivation.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "enabled",
          "gatewayId",
          "kind",
          "name",
          "namespace",
          "revision",
          "toolPolicies",
          "updatedAt",
          "upstreamId"
        ],
        "type": "object"
      },
      "ResourceSuspendedErrorResponseContent": {
        "description": "The requested resource exists but is suspended by an administrator.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 423,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ResourceSuspendedErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "ResourceSuspendedErrorType": {
        "description": "Problem type URI for suspended resources.",
        "enum": [
          "/errors/resource-suspended"
        ],
        "type": "string"
      },
      "ServiceHealthStatus": {
        "enum": [
          "UP"
        ],
        "type": "string"
      },
      "ServiceUnavailableErrorResponseContent": {
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 503,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/ServiceUnavailableErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "ServiceUnavailableErrorType": {
        "enum": [
          "/errors/service-unavailable",
          "/errors/playbook-not-ready",
          "/errors/resource-unavailable"
        ],
        "type": "string"
      },
      "TimeoutErrorResponseContent": {
        "description": "The request timed out before the service could complete it.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 408,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/TimeoutErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "TimeoutErrorType": {
        "description": "Problem type URI for timeout errors.",
        "enum": [
          "/errors/timeout"
        ],
        "type": "string"
      },
      "ToolExposureMode": {
        "description": "How a Gateway's clients find tools: the two modes the data plane serves. Adding\nanother mode later is an additive change.",
        "enum": [
          "FULL",
          "SEARCH"
        ],
        "type": "string"
      },
      "ToolPolicies": {
        "additionalProperties": {
          "$ref": "#/components/schemas/ToolPolicy"
        },
        "description": "Maps the original name of a tool in the Upstream's catalog, exact and case-preserved, to its policy.",
        "type": "object"
      },
      "ToolPolicy": {
        "description": "One member per feature, each optional. A policy with no member is refused with 400.",
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/CachePolicy"
          },
          "compression": {
            "$ref": "#/components/schemas/CompressionPolicy"
          }
        },
        "type": "object"
      },
      "Transport": {
        "description": "This enum may gain values, and a client must keep a transport it does not know rather than fail.",
        "enum": [
          "streamable-http"
        ],
        "type": "string"
      },
      "UnexpectedErrorResponseContent": {
        "description": "The service failed with an unexpected internal error.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 500,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/UnexpectedErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "UnexpectedErrorType": {
        "description": "Problem type URI for unexpected internal errors.",
        "enum": [
          "/errors/unexpected-error",
          "/errors/content-integrity-failed"
        ],
        "type": "string"
      },
      "UnprocessableContentErrorResponseContent": {
        "description": "The request is well formed, but the work it asks for cannot succeed until a dependency's configuration is fixed. Nothing was changed.",
        "externalDocs": {
          "description": "RFC 9457",
          "url": "https://www.rfc-editor.org/rfc/rfc9457.html"
        },
        "properties": {
          "detail": {
            "description": "A human-readable explanation specific to this occurrence of the problem.",
            "type": "string"
          },
          "instance": {
            "description": "A URI reference that identifies the specific occurrence of the problem.  It may or may not yield further information if dereferenced.",
            "type": "string"
          },
          "status": {
            "default": 422,
            "description": "The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.",
            "format": "int32",
            "type": "integer"
          },
          "title": {
            "description": "A short, human-readable summary of the problem\n                                      type.  It SHOULD NOT change from occurrence to occurrence of the\n                                      problem, except for purposes of localization (e.g., using\n                                      proactive content negotiation; see [RFC7231], Section 3.4).",
            "type": "string"
          },
          "type": {
            "$ref": "#/components/schemas/UnprocessableContentErrorType"
          }
        },
        "required": [
          "status",
          "title",
          "type"
        ],
        "type": "object"
      },
      "UnprocessableContentErrorType": {
        "description": "Problem type URI for unprocessable-content errors.",
        "enum": [
          "/errors/resource-unavailable"
        ],
        "type": "string"
      },
      "UnreadableReason": {
        "enum": [
          "INVALID_STORED_METADATA"
        ],
        "type": "string"
      },
      "UnreadableUpstream": {
        "description": "An Upstream record that ListUpstreams cannot read. It never carries the stored data.",
        "properties": {
          "reason": {
            "$ref": "#/components/schemas/UnreadableReason"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "reason",
          "upstreamId"
        ],
        "type": "object"
      },
      "UpdateGatewayRequestContent": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "databaseId": {
            "description": "Omitted leaves it unchanged. null clears it, which is refused with 400 on databaseId while cache or compression stays enabled: send them as disabled in the same request. Selecting a database on a Gateway that had none leaves cache and compression as they were, disabled for a Gateway created without one: send them as enabled in the same request to turn them on. An ID that is not in the registry is refused with 400.",
            "maxLength": 32,
            "minLength": 1,
            "nullable": true,
            "pattern": "^[A-Za-z0-9-]+$",
            "type": "string"
          },
          "description": {
            "description": "Omitted leaves it unchanged; null clears it.",
            "maxLength": 1024,
            "minLength": 0,
            "nullable": true,
            "type": "string"
          },
          "expectedRevision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "UpdateGatewayResponseContent": {
        "properties": {
          "cache": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "compression": {
            "$ref": "#/components/schemas/GatewayFeatureState"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "databaseBinding": {
            "$ref": "#/components/schemas/DatabaseBinding"
          },
          "description": {
            "description": "Free-text description of any API resource. May be empty.",
            "maxLength": 1024,
            "minLength": 0,
            "type": "string"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "mcpEndpoint": {
            "description": "The URL of this Gateway's MCP endpoint on the data plane: the data plane's public base URL, a deployment setting, plus /iris/data/v1/context-gateway/gateways/{gatewayId}/mcp.",
            "pattern": "^[Hh][Tt][Tt][Pp][Ss]?://.+$",
            "type": "string"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolExposureMode": {
            "$ref": "#/components/schemas/ToolExposureMode"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          }
        },
        "required": [
          "cache",
          "compression",
          "createdAt",
          "gatewayId",
          "mcpEndpoint",
          "name",
          "revision",
          "toolExposureMode",
          "updatedAt"
        ],
        "type": "object"
      },
      "UpdateUpstreamRequestContent": {
        "properties": {
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceUpdate"
          },
          "enabled": {
            "type": "boolean"
          },
          "expectedRevision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPUpdate"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          }
        },
        "required": [
          "expectedRevision"
        ],
        "type": "object"
      },
      "UpdateUpstreamResponseContent": {
        "description": "The members that every Upstream response shares.",
        "properties": {
          "activeCatalog": {
            "$ref": "#/components/schemas/ActiveCatalog"
          },
          "contextSurface": {
            "$ref": "#/components/schemas/ContextSurfaceOutput"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "droppedToolPolicies": {
            "description": "The stored policies, or policy members, this update deleted, in tool name\norder. Only an mcp.endpoint change or a data model swap (contextSurface.dataModel) that does not send toolPolicies\ndeletes any: it keeps each stored policy the new endpoint's catalog allows\nand deletes the rest in the same commit as the new configuration. For a\ntool the cacheable rule vetoes, only cache is deleted and\ncompression stays stored. A policy is deleted whole only when the tool is\nnot in the catalog or nothing is left. Omitted when nothing was deleted.",
            "items": {
              "$ref": "#/components/schemas/DroppedToolPolicy"
            },
            "type": "array"
          },
          "enabled": {
            "type": "boolean"
          },
          "gatewayId": {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^gw_[0-9a-f]{32}$",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/UpstreamKind"
          },
          "mcp": {
            "$ref": "#/components/schemas/MCPOutput"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Gateway-unique lowercase kebab-case name of letters, digits and hyphens, so without dots or underscores, of at most 32 characters. It prefixes every exposed tool name, joined by a double underscore as namespace__tool. The whole tool name must fit 64 characters, which model APIs enforce, so a namespace leaves at least 30 characters for the tool name. A namespace derived from a name longer than 32 characters keeps its first 25 characters and ends with a hyphen and six hex digits of a digest of the whole derivation.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "toolPolicies": {
            "$ref": "#/components/schemas/ToolPolicies"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "enabled",
          "gatewayId",
          "kind",
          "name",
          "namespace",
          "revision",
          "toolPolicies",
          "updatedAt",
          "upstreamId"
        ],
        "type": "object"
      },
      "UpstreamKind": {
        "description": "Names the one settings object an Upstream carries. This enum may gain values: a\nnew kind adds its own optional object member, named after it, to the Upstream\nrequests and responses. A client must keep a kind it does not know rather than\nfail, and ignore that kind's object.",
        "enum": [
          "MCP",
          "CONTEXT_SURFACE"
        ],
        "type": "string"
      },
      "UpstreamSummary": {
        "properties": {
          "activeCatalog": {
            "$ref": "#/components/schemas/ActiveCatalog"
          },
          "createdAt": {
            "format": "date-time",
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "name": {
            "description": "Display name of any API resource.",
            "maxLength": 128,
            "minLength": 1,
            "type": "string"
          },
          "namespace": {
            "description": "Gateway-unique lowercase kebab-case name of letters, digits and hyphens, so without dots or underscores, of at most 32 characters. It prefixes every exposed tool name, joined by a double underscore as namespace__tool. The whole tool name must fit 64 characters, which model APIs enforce, so a namespace leaves at least 30 characters for the tool name. A namespace derived from a name longer than 32 characters keeps its first 25 characters and ends with a hyphen and six hex digits of a digest of the whole derivation.",
            "maxLength": 32,
            "minLength": 1,
            "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
            "type": "string"
          },
          "revision": {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "pattern": "^[0-9a-f]{32}$",
            "type": "string"
          },
          "updatedAt": {
            "format": "date-time",
            "type": "string"
          },
          "upstreamId": {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "maxLength": 35,
            "minLength": 35,
            "pattern": "^up_[0-9a-f]{32}$",
            "type": "string"
          }
        },
        "required": [
          "createdAt",
          "enabled",
          "name",
          "namespace",
          "revision",
          "updatedAt",
          "upstreamId"
        ],
        "type": "object"
      },
      "UpstreamTool": {
        "description": "A tool of the active catalog. It carries no input or output schema.",
        "properties": {
          "annotations": {
            "description": "The annotations object as stored in the catalog. Present when the tool definition has one."
          },
          "cacheable": {
            "description": "The result of the cacheable rule, which reads only readOnlyHint and\ndestructiveHint. An absent hint vetoes nothing; an annotation never turns\ncaching on, only a cache policy does.",
            "type": "boolean"
          },
          "description": {
            "description": "Present when the tool definition has one.",
            "type": "string"
          },
          "name": {
            "description": "The original tool name, exact and case-preserved.",
            "type": "string"
          },
          "notCacheableReason": {
            "$ref": "#/components/schemas/NotCacheableReason"
          },
          "policy": {
            "$ref": "#/components/schemas/ToolPolicy"
          },
          "title": {
            "description": "Present when the tool definition has one.",
            "type": "string"
          }
        },
        "required": [
          "cacheable",
          "name"
        ],
        "type": "object"
      }
    },
    "securitySchemes": {
      "smithy.api.httpBearerAuth": {
        "description": "HTTP Bearer authentication",
        "scheme": "Bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "description": "Administration API for Context Gateway resources and their Upstreams.\n\nEvery write completes synchronously and returns the final state. Creating an\nUpstream, changing its mcp endpoint or authentication, and refreshing its catalog\nrun live discovery against the Upstream, bounded by the discovery timeout.\n\nAn Upstream carries the members every kind shares at the top level and its\nkind's own settings in one object named after the kind: mcp or contextSurface.\nA new kind adds an optional object member and an UpstreamKind value, so a\nclient that does not know the kind still reads every shared member and ignores\nthe object.\nThe tenant comes from the control-plane configuration, never from the request,\nand no response shows it.\n",
    "title": "ContextGatewayControlPlaneService",
    "version": "0.0.1"
  },
  "openapi": "3.0.2",
  "paths": {
    "/health/liveness": {
      "get": {
        "operationId": "Live",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LiveResponseContent"
                }
              }
            },
            "description": "Live 200 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        },
        "security": []
      }
    },
    "/health/readiness": {
      "get": {
        "operationId": "Ready",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadyResponseContent"
                }
              }
            },
            "description": "Ready 200 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        },
        "security": []
      }
    },
    "/iris/v1/context-gateway/databases": {
      "get": {
        "description": "Redis Cloud only. Lists account databases for the requested resource using the operator's SM session.",
        "operationId": "ListDatabases",
        "parameters": [
          {
            "description": "What the databases are for: a Gateway database or a Surface database.",
            "in": "query",
            "name": "purpose",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DatabasePurpose"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListDatabasesResponseContent"
                }
              }
            },
            "description": "ListDatabases 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "424": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FailedDependencyErrorResponseContent"
                }
              }
            },
            "description": "FailedDependencyError 424 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        },
        "x-deployment": "cloud"
      }
    },
    "/iris/v1/context-gateway/gateways": {
      "get": {
        "operationId": "ListGateways",
        "parameters": [
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "description": "Maximum number of Gateways to return. Defaults to 50.",
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 50,
              "description": "Maximum number of Gateways to return. Defaults to 50.",
              "format": "int32",
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Opaque position from a previous page's nextCursor.",
            "in": "query",
            "name": "cursor",
            "schema": {
              "description": "Opaque position from a previous page's nextCursor.",
              "maxLength": 1024,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListGatewaysResponseContent"
                }
              }
            },
            "description": "ListGateways 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "post": {
        "operationId": "CreateGateway",
        "parameters": [
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateGatewayRequestContent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateGatewayResponseContent"
                }
              }
            },
            "description": "CreateGateway 201 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/gateways/{gatewayId}": {
      "delete": {
        "operationId": "DeleteGateway",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
            "in": "query",
            "name": "expectedRevision",
            "required": true,
            "schema": {
              "description": "Configuration revision. Opaque: each effective change writes a new random value, and a resource never gets a value it had before. Compare for equality only.",
              "pattern": "^[0-9a-f]{32}$",
              "type": "string"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "DeleteGateway 204 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "412": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionFailedErrorResponseContent"
                }
              }
            },
            "description": "PreconditionFailedError 412 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "get": {
        "operationId": "GetGateway",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetGatewayResponseContent"
                }
              }
            },
            "description": "GetGateway 200 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "patch": {
        "operationId": "UpdateGateway",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGatewayRequestContent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateGatewayResponseContent"
                }
              }
            },
            "description": "UpdateGateway 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "412": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionFailedErrorResponseContent"
                }
              }
            },
            "description": "PreconditionFailedError 412 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/gateways/{gatewayId}/upstreams": {
      "get": {
        "operationId": "ListUpstreams",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "description": "Maximum number of Upstreams to return. Defaults to 50.",
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 50,
              "description": "Maximum number of Upstreams to return. Defaults to 50.",
              "format": "int32",
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Opaque position from a previous page's nextCursor.",
            "in": "query",
            "name": "cursor",
            "schema": {
              "description": "Opaque position from a previous page's nextCursor.",
              "maxLength": 1024,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListUpstreamsResponseContent"
                }
              }
            },
            "description": "ListUpstreams 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "post": {
        "description": "Registers the Upstream, then discovers and publishes its first catalog. A failed\nor timed-out initial discovery, or a failed tool generation, still creates the Upstream, with no activeCatalog,\nand reports the failure in initialCatalogFailure.\n",
        "operationId": "CreateUpstream",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateUpstreamRequestContent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateUpstreamResponseContent"
                }
              }
            },
            "description": "CreateUpstream 201 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "423": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResourceSuspendedErrorResponseContent"
                }
              }
            },
            "description": "ResourceSuspendedError 423 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/gateways/{gatewayId}/upstreams/{upstreamId}": {
      "delete": {
        "description": "Marks the Upstream as being deleted, which every reader treats as absent, then\nreleases its namespace, removes its catalogs and current credentials, deletes\nthe record, and removes its Gateway index entry last. A retry of an Upstream\nthat is being deleted resumes the cleanup and returns 204.\n",
        "operationId": "DeleteUpstream",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "upstreamId",
            "required": true,
            "schema": {
              "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^up_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "description": "Required for a readable Upstream; otherwise 400. Omitted for an unreadable record, whose revision cannot be read. Not checked when the Upstream is already being deleted.",
            "in": "query",
            "name": "expectedRevision",
            "schema": {
              "description": "Required for a readable Upstream; otherwise 400. Omitted for an unreadable record, whose revision cannot be read. Not checked when the Upstream is already being deleted.",
              "pattern": "^[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "For a context-surface Upstream whose delete keeps answering 503 because its Surface index sweep fails. true still runs the sweep, but when it fails the delete goes on and leaves every index named idx:\u003cupstreamId\u003e:* on the Surface database, and the control plane logs that prefix. Omitted or false fails the delete with 503 instead. Ignored for an mcp Upstream.",
            "in": "query",
            "name": "ignoreIndexSweepFailure",
            "schema": {
              "description": "For a context-surface Upstream whose delete keeps answering 503 because its Surface index sweep fails. true still runs the sweep, but when it fails the delete goes on and leaves every index named idx:\u003cupstreamId\u003e:* on the Surface database, and the control plane logs that prefix. Omitted or false fails the delete with 503 instead. Ignored for an mcp Upstream.",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "DeleteUpstream 204 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "412": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionFailedErrorResponseContent"
                }
              }
            },
            "description": "PreconditionFailedError 412 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "get": {
        "operationId": "GetUpstream",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "upstreamId",
            "required": true,
            "schema": {
              "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^up_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetUpstreamResponseContent"
                }
              }
            },
            "description": "GetUpstream 200 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      },
      "patch": {
        "description": "name and enabled are metadata-only and run no discovery. A change to\nmcp.endpoint or mcp.authentication discovers with the candidate configuration,\nand a contextSurface.dataModel swaps the data model of a context-surface\nUpstream and generates its catalog; either commits configuration and catalog\ntogether, or commits nothing. Only the stored kind's settings object may be\nsent.\n",
        "operationId": "UpdateUpstream",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "upstreamId",
            "required": true,
            "schema": {
              "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^up_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUpstreamRequestContent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UpdateUpstreamResponseContent"
                }
              }
            },
            "description": "UpdateUpstream 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "408": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeoutErrorResponseContent"
                }
              }
            },
            "description": "TimeoutError 408 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "412": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PreconditionFailedErrorResponseContent"
                }
              }
            },
            "description": "PreconditionFailedError 412 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableContentErrorResponseContent"
                }
              }
            },
            "description": "UnprocessableContentError 422 response"
          },
          "423": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResourceSuspendedErrorResponseContent"
                }
              }
            },
            "description": "ResourceSuspendedError 423 response"
          },
          "424": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FailedDependencyErrorResponseContent"
                }
              }
            },
            "description": "FailedDependencyError 424 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/gateways/{gatewayId}/upstreams/{upstreamId}/refresh": {
      "post": {
        "description": "Discovers with the current configuration and publishes every offered tool, only\nif neither the configuration revision nor the active catalog revision changed\nmeanwhile. A 200 means the active catalog matches this discovery. Allowed on a\ndisabled Upstream.\n",
        "operationId": "RefreshUpstreamCatalog",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "upstreamId",
            "required": true,
            "schema": {
              "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^up_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RefreshUpstreamCatalogResponseContent"
                }
              }
            },
            "description": "RefreshUpstreamCatalog 200 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "408": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TimeoutErrorResponseContent"
                }
              }
            },
            "description": "TimeoutError 408 response"
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConflictErrorResponseContent"
                }
              }
            },
            "description": "ConflictError 409 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnprocessableContentErrorResponseContent"
                }
              }
            },
            "description": "UnprocessableContentError 422 response"
          },
          "423": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ResourceSuspendedErrorResponseContent"
                }
              }
            },
            "description": "ResourceSuspendedError 423 response"
          },
          "424": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FailedDependencyErrorResponseContent"
                }
              }
            },
            "description": "FailedDependencyError 424 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/gateways/{gatewayId}/upstreams/{upstreamId}/tools": {
      "get": {
        "description": "Lists the tools of the active catalog, ordered by name, a page at a time. An Upstream with no published catalog answers an empty list. Each tool\nshows the result of the cacheable rule and, only when one is stored, its policy.\n",
        "operationId": "ListUpstreamTools",
        "parameters": [
          {
            "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "gatewayId",
            "required": true,
            "schema": {
              "description": "Server-generated Gateway identifier: gw_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^gw_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
            "in": "path",
            "name": "upstreamId",
            "required": true,
            "schema": {
              "description": "Server-generated Upstream identifier: up_ followed by 32 lowercase hex characters. Opaque to clients.",
              "maxLength": 35,
              "minLength": 35,
              "pattern": "^up_[0-9a-f]{32}$",
              "type": "string"
            }
          },
          {
            "description": "The project. Not supported yet; omit it.",
            "in": "query",
            "name": "projectId",
            "schema": {
              "description": "The project. Not supported yet; omit it.",
              "maxLength": 64,
              "minLength": 1,
              "type": "string"
            }
          },
          {
            "description": "Maximum number of tools to return. Defaults to 50.",
            "in": "query",
            "name": "limit",
            "schema": {
              "default": 50,
              "description": "Maximum number of tools to return. Defaults to 50.",
              "format": "int32",
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            }
          },
          {
            "description": "Opaque position from a previous page's nextCursor.",
            "in": "query",
            "name": "cursor",
            "schema": {
              "description": "Opaque position from a previous page's nextCursor.",
              "maxLength": 1024,
              "minLength": 1,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListUpstreamToolsResponseContent"
                }
              }
            },
            "description": "ListUpstreamTools 200 response"
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BadRequestErrorResponseContent"
                }
              }
            },
            "description": "BadRequestError 400 response"
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthenticationErrorResponseContent"
                }
              }
            },
            "description": "AuthenticationError 401 response"
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ForbiddenErrorResponseContent"
                }
              }
            },
            "description": "ForbiddenError 403 response"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotFoundErrorResponseContent"
                }
              }
            },
            "description": "NotFoundError 404 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "501": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotImplementedErrorResponseContent"
                }
              }
            },
            "description": "NotImplementedError 501 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        }
      }
    },
    "/iris/v1/context-gateway/health/live": {
      "get": {
        "description": "Reports that this API process can answer requests, independently of downstream dependencies.",
        "operationId": "GetServiceLiveness",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetServiceLivenessResponseContent"
                }
              }
            },
            "description": "GetServiceLiveness 200 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        },
        "security": []
      }
    },
    "/iris/v1/context-gateway/health/ready": {
      "get": {
        "description": "Evaluates the same serving dependencies as the operational readiness probe. Returns 503 without dependency details when the service cannot serve requests.",
        "operationId": "GetServiceReadiness",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetServiceReadinessResponseContent"
                }
              }
            },
            "description": "GetServiceReadiness 200 response"
          },
          "413": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayloadTooLargeErrorResponseContent"
                }
              }
            },
            "description": "PayloadTooLargeError 413 response"
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UnexpectedErrorResponseContent"
                }
              }
            },
            "description": "UnexpectedError 500 response"
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceUnavailableErrorResponseContent"
                }
              }
            },
            "description": "ServiceUnavailableError 503 response"
          }
        },
        "security": []
      }
    }
  },
  "security": [
    {
      "smithy.api.httpBearerAuth": []
    }
  ]
}
