MCPExternalAuthConfig (toolhive.stacklok.dev/v1alpha1)

Type: object

MCPExternalAuthConfig is the deprecated v1alpha1 version of the MCPExternalAuthConfig resource.

Type: string

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

Type: string

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta

Type: object

Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

Type: object

Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. They are not queryable and should be preserved when modifying objects. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations

Each additional property must conform to the following schema

Type: string

io.k8s.apimachinery.pkg.apis.meta.v1.Time

Type: string

CreationTimestamp is a timestamp representing the server time when this object was created. It is not guaranteed to be set in happens-before order across separate operations. Clients may not set this value. It is represented in RFC3339 form and is in UTC.

Populated by the system. Read-only. Null for lists. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

Type: integerFormat: int64

Number of seconds allowed for this object to gracefully terminate before it will be removed from the system. Only set when deletionTimestamp is also set. May only be shortened. Read-only.

io.k8s.apimachinery.pkg.apis.meta.v1.Time

Type: string

DeletionTimestamp is RFC 3339 date and time at which this resource will be deleted. This field is set by the server when a graceful deletion is requested by the user, and is not directly settable by a client. The resource is expected to be deleted (no longer visible from resource lists, and not reachable by name) after the time in this field, once the finalizers list is empty. As long as the finalizers list contains items, deletion is blocked. Once the deletionTimestamp is set, this value may not be unset or be set further into the future, although it may be shortened or the resource may be deleted prior to this time. For example, a user may request that a pod is deleted in 30 seconds. The Kubelet will react by sending a graceful termination signal to the containers in the pod. After that 30 seconds, the Kubelet will send a hard termination signal (SIGKILL) to the container and after cleanup, remove the pod from the API. In the presence of network partitions, this object may still exist after this timestamp, until an administrator or automated process can determine the resource is fully terminated. If not set, graceful deletion of the object has not been requested.

Populated by the system when a graceful deletion is requested. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

Same definition as creationTimestamp

Type: array of string

Must be empty before the object is deleted from the registry. Each entry is an identifier for the responsible component that will remove the entry from the list. If the deletionTimestamp of the object is non-nil, entries in this list can only be removed. Finalizers may be processed and removed in any order. Order is NOT enforced because it introduces significant risk of stuck finalizers. finalizers is a shared field, any actor with permission can reorder it. If the finalizer list is processed in order, then this can lead to a situation in which the component responsible for the first finalizer in the list is waiting for a signal (field value, external system, or other) produced by a component responsible for a finalizer later in the list, resulting in a deadlock. Without enforced ordering finalizers are free to order amongst themselves and are not vulnerable to ordering changes in the list.

No Additional Items

Each item of this array must be:

Type: string

GenerateName is an optional prefix, used by the server, to generate a unique name ONLY IF the Name field has not been provided. If this field is used, the name returned to the client will be different than the name passed. This value will also be combined with a unique suffix. The provided value has the same validation rules as the Name field, and may be truncated by the length of the suffix required to make the value unique on the server.

If this field is specified and the generated name exists, the server will return a 409.

Applied only if Name is not specified. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#idempotency

Type: integerFormat: int64

A sequence number representing a specific generation of the desired state. Populated by the system. Read-only.

Type: object

Map of string keys and values that can be used to organize and categorize (scope and select) objects. May match selectors of replication controllers and services. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels

Each additional property must conform to the following schema

Type: string

Type: array

ManagedFields maps workflow-id and version to the set of fields that are managed by that workflow. This is mostly for internal housekeeping, and users typically shouldn't need to set or understand this field. A workflow can be the user's name, a controller's name, or the name of a specific apply path like "ci-cd". The set of fields is always in the version that the workflow used when modifying the object.

No Additional Items

Each item of this array must be:

io.k8s.apimachinery.pkg.apis.meta.v1.ManagedFieldsEntry

Type: object

ManagedFieldsEntry is a workflow-id, a FieldSet and the group version of the resource that the fieldset applies to.

Type: string

APIVersion defines the version of this resource that this field set applies to. The format is "group/version" just like the top-level APIVersion field. It is necessary to track the version of a field set because it cannot be automatically converted.

Type: string

FieldsType is the discriminator for the different fields format and version. There is currently only one possible value: "FieldsV1"

io.k8s.apimachinery.pkg.apis.meta.v1.FieldsV1

Type: object

FieldsV1 holds the first JSON version format as described in the "FieldsV1" type.

Type: string

Manager is an identifier of the workflow managing these fields.

Type: string

Operation is the type of operation which lead to this ManagedFieldsEntry being created. The only valid values for this field are 'Apply' and 'Update'.

Type: string

Subresource is the name of the subresource used to update that object, or empty string if the object was updated through the main resource. The value of this field is used to distinguish between managers, even if they share the same name. For example, a status update will be distinct from a regular update using the same manager name. Note that the APIVersion field is not related to the Subresource field and it always corresponds to the version of the main resource.

io.k8s.apimachinery.pkg.apis.meta.v1.Time

Type: string

Time is the timestamp of when the ManagedFields entry was added. The timestamp will also be updated if a field is added, the manager changes any of the owned fields value or removes a field. The timestamp does not update when a field is removed from the entry because another manager took it over.

Same definition as creationTimestamp

Type: string

Name must be unique within a namespace. Is required when creating resources, although some resources may allow a client to request the generation of an appropriate name automatically. Name is primarily intended for creation idempotence and configuration definition. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names

Type: string

Namespace defines the space within which each name must be unique. An empty namespace is equivalent to the "default" namespace, but "default" is the canonical representation. Not all objects are required to be scoped to a namespace - the value of this field for those objects will be empty.

Must be a DNS_LABEL. Cannot be updated. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces

Type: array

List of objects depended by this object. If ALL objects in the list have been deleted, this object will be garbage collected. If this object is managed by a controller, then an entry in this list will point to this controller, with the controller field set to true. There cannot be more than one managing controller.

No Additional Items

Each item of this array must be:

io.k8s.apimachinery.pkg.apis.meta.v1.OwnerReference

Type: object

OwnerReference contains enough information to let you identify an owning object. An owning object must be in the same namespace as the dependent, or be cluster-scoped, so there is no namespace field.

Type: boolean

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. See https://kubernetes.io/docs/concepts/architecture/garbage-collection/#foreground-deletion for how the garbage collector interacts with this field and enforces the foreground deletion. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

Type: boolean

If true, this reference points to the managing controller.

Type: string

Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

Type: string

Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#names

Type: string

UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids

Type: string

An opaque value that represents the internal version of this object that can be used by clients to determine when objects have changed. May be used for optimistic concurrency, change detection, and the watch operation on a resource or set of resources. Clients must treat these values as opaque and passed unmodified back to the server. They may only be valid for a particular resource or set of resources.

Populated by the system. Read-only. Value must be treated as opaque by clients and . More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency

Type: string

UID is the unique in time and space value for this object. It is typically generated by the server on successful creation of a resource and is not allowed to change on PUT operations.

Populated by the system. Read-only. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names#uids

Type: object

MCPExternalAuthConfigSpec defines the desired state of MCPExternalAuthConfig.
MCPExternalAuthConfig resources are namespace-scoped and can only be referenced by
MCPServer resources in the same namespace.

Type: object

AWSSts configures AWS STS authentication with SigV4 request signing
Only used when Type is "awsSts"

Type: string

FallbackRoleArn is the IAM role ARN to assume when no role mappings match
Used as the default role when RoleMappings is empty or no mapping matches
At least one of FallbackRoleArn or RoleMappings must be configured (enforced by webhook)

Must match regular expression: ^arn:(aws|aws-cn|aws-us-gov):iam::\d{12}:role/[\w+=,.@\-_/]+$

Type: string

Region is the AWS region for the STS endpoint and service (e.g., "us-east-1", "eu-west-1")

Must match regular expression: ^[a-z]{2}(-[a-z]+)+-\d+$

Must be at least 1 characters long

Type: string

RoleClaim is the JWT claim to use for role mapping evaluation
Defaults to "groups" to match common OIDC group claims

Type: array of object

RoleMappings defines claim-based role selection rules
Allows mapping JWT claims (e.g., groups, roles) to specific IAM roles
Lower priority values are evaluated first (higher priority)

No Additional Items

Each item of this array must be:

Type: object

RoleMapping defines a rule for mapping JWT claims to IAM roles.
Mappings are evaluated in priority order (lower number = higher priority), and the first
matching rule determines which IAM role to assume.
Exactly one of Claim or Matcher must be specified.

Type: string

Claim is a simple claim value to match against
The claim type is specified by AWSStsConfig.RoleClaim
For example, if RoleClaim is "groups", this would be a group name
Internally compiled to a CEL expression: "<claim_value>" in claims["<role_claim>"]
Mutually exclusive with Matcher

Must be at least 1 characters long

Type: string

Matcher is a CEL expression for complex matching against JWT claims
The expression has access to a "claims" variable containing all JWT claims as map[string]any
Examples:
- "admins" in claims["groups"]
- claims["sub"] == "user123" && !("act" in claims)
Mutually exclusive with Claim

Must be at least 1 characters long

Type: integerFormat: int32

Priority determines evaluation order (lower values = higher priority)
Allows fine-grained control over role selection precedence
When omitted, this mapping has the lowest possible priority and
configuration order acts as tie-breaker via stable sort

Value must be greater or equal to 0

Type: string

RoleArn is the IAM role ARN to assume when this mapping matches

Must match regular expression: ^arn:(aws|aws-cn|aws-us-gov):iam::\d{12}:role/[\w+=,.@\-_/]+$

Type: string

Service is the AWS service name for SigV4 signing
Defaults to "aws-mcp" for AWS MCP Server endpoints

Type: integerFormat: int32

SessionDuration is the duration in seconds for the STS session
Must be between 900 (15 minutes) and 43200 (12 hours)
Defaults to 3600 (1 hour) if not specified

Value must be greater or equal to 900 and lesser or equal to 43200

Type: string

SessionNameClaim is the JWT claim to use for role session name
Defaults to "sub" to use the subject claim

Type: string

SubjectProviderName is the name of the upstream provider whose access token
is used as the web identity token for STS AssumeRoleWithWebIdentity.
This field is used exclusively by VirtualMCPServer, where there is no
upstream swap middleware to replace the bearer token before the strategy runs.
When left empty and an embedded authorization server is configured on the
VirtualMCPServer, the controller automatically populates this field with
the first configured upstream provider name. Set it explicitly to override
that default or to select a specific provider when multiple upstreams are
configured.
When no embedded auth server is present, the bearer token from the incoming
request's Authorization header is used instead.

Type: object

BearerToken configures bearer token authentication
Only used when Type is "bearerToken"

Type: object

TokenSecretRef references a Kubernetes Secret containing the bearer token

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: object

EmbeddedAuthServer configures an embedded OAuth2/OIDC authorization server
Only used when Type is "embeddedAuthServer"

Type: string

AuthorizationEndpointBaseURL overrides the base URL used for the authorization_endpoint
in the OAuth discovery document. When set, the discovery document will advertise
{authorizationEndpointBaseUrl}/oauth/authorize instead of {issuer}/oauth/authorize.
All other endpoints (token, registration, JWKS) remain derived from the issuer.
This is useful when the browser-facing authorization endpoint needs to be on a
different host than the issuer used for backend-to-backend calls.
Must be a valid HTTPS URL (or HTTP for localhost, or HTTP for trusted in-cluster hosts
when insecureAllowHTTP is true) without query, fragment, or trailing slash.

Must match regular expression: ^https?://[^\s?#]+[^/\s?#]$

Type: array of string

BaselineClientScopes is a baseline set of OAuth 2.0 scopes guaranteed to be
included in every client registration. The embedded auth server unions these
scopes into the registered set returned by RFC 7591 Dynamic Client
Registration, so a client that narrows the scope field at /oauth/register
can still request the baseline scopes at /oauth/authorize. All values must
be present in the upstream-derived scopesSupported set; the auth server
fails to start if any value is missing.

Security: every client registered via /oauth/register will gain the
ability to request these scopes at /oauth/authorize, regardless of what
the client itself requested. Keep the baseline narrow (typically
"openid" and "offline_access"). Adding a privileged scope here — e.g.
"admin:read" — would grant it to every DCR-registered client, including
public clients like Claude Code, Cursor, and VS Code.
When cimd.enabled is true, every dynamically resolved CIMD client will
also gain the ability to request these scopes, including third-party
clients resolved from arbitrary HTTPS URLs.

Must contain a maximum of 10 items

No Additional Items

Each item of this array must be:

Type: string
Must match regular expression: ^[\x21\x23-\x5B\x5D-\x7E]+$

Must be at least 1 characters long

Type: object

CIMD configures Client ID Metadata Document support. When omitted, CIMD is disabled.

Type: string

CacheFallbackTTL is the fixed TTL applied to every cached CIMD document.
Cache-Control header parsing is not yet implemented; all entries use this value.
Format: Go duration string (e.g. "5m", "10m", "1h").
Defaults to 5 minutes when Enabled is true and this field is omitted.

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: integer

CacheMaxSize is the maximum number of CIMD documents held in the LRU cache.
Defaults to 256 when Enabled is true and this field is omitted.

Value must be greater or equal to 1

Type: boolean

Enabled activates CIMD client lookup. When false (the default), the AS only
accepts client_id values that were registered via DCR.

Type: boolean

DisableUpstreamTokenInjection prevents the embedded auth server from injecting
upstream IdP tokens into requests forwarded to the backend MCP server.
When true, the embedded auth server still handles OAuth flows for clients,
but instead of swapping ToolHive JWTs for upstream tokens the proxy STRIPS
the client's credential headers (Authorization, Cookie, Proxy-Authorization)
after validating the JWT — the backend receives an unauthenticated request.
Use headerForward to attach static credentials (e.g. an API key) if the
backend needs them. Cannot be combined with token exchange or AWS STS,
which would re-add credentials after the strip.
This is useful when the backend MCP server does not require authentication
(e.g., public documentation servers) but you still want client authentication.

Type: array of object

HMACSecretRefs references Kubernetes Secrets containing symmetric secrets for signing
authorization codes and refresh tokens (opaque tokens).
Current secret must be at least 32 bytes and cryptographically random.
Supports secret rotation via multiple entries (first is current, rest are for verification).
If not specified, an ephemeral secret will be auto-generated (development only -
auth codes and refresh tokens will be invalid after restart).

No Additional Items

Each item of this array must be:

Type: object

SecretKeyRef is a reference to a key within a Secret

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: boolean

InsecureAllowHTTP permits an http:// issuer URL for non-localhost hosts.
Only set this for in-cluster Kubernetes deployments where traffic between
pods traverses a trusted network (e.g. the in-cluster service mesh).
Production deployments reachable outside the cluster MUST use https://.

On VirtualMCPServer: when false (the default), http:// issuers for non-localhost
hosts are rejected at reconcile time with an AuthServerConfigValidated=False condition.

On MCPServer and MCPRemoteProxy (via MCPExternalAuthConfig): this field is
structurally present but enforcement is deferred to pod startup via Config.Validate();
a misconfigured issuer will cause the pod to crash at startup rather than surface
as an operator condition.

Type: string

Issuer is the issuer identifier for this authorization server.
This will be included in the "iss" claim of issued tokens.
Must be a valid HTTPS URL (or HTTP for localhost, or HTTP for trusted in-cluster hosts when
insecureAllowHTTP is true) without query, fragment, or trailing slash (per RFC 8414).

Must match regular expression: ^https?://[^\s?#]+[^/\s?#]$

Type: string

PrimaryUpstreamProvider names the upstream IDP whose access token Cedar
should read claims from when authorising a request. Must match the name
of one of the entries in UpstreamProviders. When empty, the controller
auto-selects the first entry of UpstreamProviders.

Only meaningful on VirtualMCPServer, where multiple upstream providers
can be configured and Cedar needs to pick which token's claims to
evaluate. The VirtualMCPServer controller validates this field against
UpstreamProviders at admission and rejects unresolvable values.

On MCPServer and MCPRemoteProxy this field is structurally present (the
EmbeddedAuthServerConfig struct is shared) but has no runtime effect:
those CRDs are restricted to a single upstream so there is no choice to
make. Setting it on those CRDs is silently ignored.

Must match regular expression: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$

Must be at least 1 characters long

Must be at most 63 characters long

Type: array of object

SigningKeySecretRefs references Kubernetes Secrets containing signing keys for JWT operations.
Supports key rotation by allowing multiple keys (oldest keys are used for verification only).
If not specified, an ephemeral signing key will be auto-generated (development only -
JWTs will be invalid after restart).

Must contain a maximum of 5 items

No Additional Items

Each item of this array must be:

Type: object

SecretKeyRef is a reference to a key within a Secret

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: object

Storage configures the storage backend for the embedded auth server.
If not specified, defaults to in-memory storage.

Type: object

Redis configures the Redis storage backend.
Required when type is "redis".

Type: object

ACLUserConfig configures Redis ACL user authentication.

Type: object

PasswordSecretRef references a Secret containing the Redis ACL password.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: object

UsernameSecretRef references a Secret containing the Redis ACL username.
When omitted, connections use legacy password-only AUTH. Omit for managed
Redis tiers that do not support ACL users (e.g. GCP Memorystore Basic/Standard
HA, Azure Cache for Redis). Set for services that support ACL users (e.g. AWS
ElastiCache non-cluster with Redis 6+ RBAC).

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: string

Addr is the Redis server address (host:port). Required for standalone and cluster modes.
Use for managed Redis services that expose a single endpoint (GCP Memorystore basic tier,
AWS ElastiCache without cluster mode, or cluster-mode services when clusterMode is true).
Mutually exclusive with sentinelConfig.

Type: boolean

ClusterMode enables the Redis Cluster protocol. Set to true when addr points to a
Redis Cluster discovery endpoint (e.g., GCP Memorystore Cluster, AWS ElastiCache
cluster mode enabled). Requires addr to be set.

Type: string

DialTimeout is the timeout for establishing connections.
Format: Go duration string (e.g., "5s", "1m").

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: string

ReadTimeout is the timeout for socket reads.
Format: Go duration string (e.g., "3s", "1m").

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: object

SentinelConfig holds Redis Sentinel configuration.
Use for self-managed Redis with Sentinel-based HA. Mutually exclusive with addr.

Type: integerFormat: int32

DB is the Redis database number.

Type: string

MasterName is the name of the Redis master monitored by Sentinel.

Type: array of string

SentinelAddrs is a list of Sentinel host:port addresses.
Mutually exclusive with SentinelService.

No Additional Items

Each item of this array must be:

Type: object

SentinelService enables automatic discovery from a Kubernetes Service.
Mutually exclusive with SentinelAddrs.

Type: string

Name of the Sentinel Service.

Type: string

Namespace of the Sentinel Service (defaults to same namespace).

Type: integerFormat: int32

Port of the Sentinel service.

Type: object

SentinelTLS configures TLS for connections to Sentinel instances.
Only applies when sentinelConfig is set. Presence of this field enables TLS.

Type: object

CACertSecretRef references a Secret containing a PEM-encoded CA certificate
for verifying the server. When not specified, system root CAs are used.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: boolean

InsecureSkipVerify skips TLS certificate verification.
Use when connecting to services with self-signed certificates.

Type: object

TLS configures TLS for connections to the Redis/Valkey master or cluster nodes.
Presence of this field enables TLS. Omit to use plaintext.

Type: object

CACertSecretRef references a Secret containing a PEM-encoded CA certificate
for verifying the server. When not specified, system root CAs are used.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: boolean

InsecureSkipVerify skips TLS certificate verification.
Use when connecting to services with self-signed certificates.

Type: string

WriteTimeout is the timeout for socket writes.
Format: Go duration string (e.g., "3s", "1m").

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: enum (of string)

Type specifies the storage backend type.
Valid values: "memory" (default), "redis".

Must be one of:

  • "memory"
  • "redis"

Type: object

TokenLifespans configures the duration that various tokens are valid.
If not specified, defaults are applied (access: 1h, refresh: 7d, authCode: 10m).

Type: string

AccessTokenLifespan is the duration that access tokens are valid.
Format: Go duration string (e.g., "1h", "30m", "24h").
If empty, defaults to 1 hour.

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: string

AuthCodeLifespan is the duration that authorization codes are valid.
Format: Go duration string (e.g., "10m", "5m").
If empty, defaults to 10 minutes.

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: string

RefreshTokenLifespan is the duration that refresh tokens are valid.
Format: Go duration string (e.g., "168h", "7d" as "168h").
If empty, defaults to 7 days (168h).

Must match regular expression: ^([0-9]+(\.[0-9]+)?(ns|us|µs|ms|s|m|h))+$

Type: array of object

UpstreamProviders configures connections to upstream Identity Providers.
The embedded auth server delegates authentication to these providers.
MCPServer and MCPRemoteProxy support a single upstream; VirtualMCPServer supports multiple.

Must contain a minimum of 1 items

No Additional Items

Each item of this array must be:

Type: object

UpstreamProviderConfig defines configuration for an upstream Identity Provider.

Exactly one of OIDCConfig or OAuth2Config must be set and must match the
declared Type: oidc-typed providers set OIDCConfig, oauth2-typed providers
set OAuth2Config. The CEL rule below enforces the pairing at admission; the
matching Go-level check in validateUpstreamProvider provides defense-in-depth
for stored objects.

The rule is structured as a chain of equality checks ending in an explicit
false, so adding a new UpstreamProviderType value without extending this
rule fails admission instead of silently demanding the OAuth2 shape. When
adding a new type, extend both this rule and validateUpstreamProvider.

Type: string

Name uniquely identifies this upstream provider.
Used for routing decisions and session binding in multi-upstream scenarios.
Must be lowercase alphanumeric with hyphens (DNS-label-like).

Must match regular expression: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$

Must be at least 1 characters long

Must be at most 63 characters long

Type: object

OAuth2Config contains OAuth 2.0-specific configuration.
Required when Type is "oauth2", must be nil when Type is "oidc".

Type: object

AdditionalAuthorizationParams are extra query parameters to include in
authorization requests sent to the upstream provider.
This is useful for providers that require custom parameters, such as
Google's accesstype=offline for obtaining refresh tokens.
Framework-managed parameters (response
type, clientid, redirecturi,
scope, state, codechallenge, codechallenge_method, nonce) are not allowed.

Each additional property must conform to the following schema

Type: string

Type: string

AuthorizationEndpoint is the URL for the OAuth authorization endpoint.

Must match regular expression: ^https?://.*$

Type: string

ClientID is the OAuth 2.0 client identifier registered with the upstream IDP.
Mutually exclusive with DCRConfig: when DCRConfig is set, ClientID is obtained
at runtime via RFC 7591 Dynamic Client Registration and must be left empty.

Type: object

ClientSecretRef references a Kubernetes Secret containing the OAuth 2.0 client secret.
Optional for public clients using PKCE instead of client secret.

Type: object

DCRConfig enables RFC 7591 Dynamic Client Registration against the upstream
authorization server. When set, the client credentials are obtained at
runtime rather than being pre-provisioned, and ClientID must be left empty.
Mutually exclusive with ClientID.

Type: string

DiscoveryURL is the RFC 8414 / OIDC Discovery document URL. The resolver
issues a single GET against this URL (no well-known-path fallback) and
reads registrationendpoint, authorizationendpoint, tokenendpoint,
token
endpointauthmethodssupported, and scopessupported from the
response.
Mutually exclusive with RegistrationEndpoint.
HTTPS is required because the registration endpoint resolved from this
document carries the initial access token and the issued client_secret
(RFC 7591 §3, RFC 8414 §3). MaxLength is a defensive size cap (etcd
object budget, regex evaluation cost) and matches the conventional URL
length cap.

Must match regular expression: ^https://[^\s?#]+[^/\s?#]$

Must be at most 2048 characters long

Type: object

InitialAccessTokenRef is an optional reference to a Kubernetes Secret
carrying an RFC 7591 §3 initial access token. When set, the resolver
presents the token value as a Bearer credential on the registration
request. Mirrors the ClientSecretRef pattern.

Type: string

RegistrationEndpoint is the RFC 7591 registration endpoint URL used
directly, bypassing discovery. When using this field, the caller is
expected to also supply AuthorizationEndpoint, TokenEndpoint, and an
explicit Scopes list on the parent OAuth2UpstreamConfig.
Mutually exclusive with DiscoveryURL.
HTTPS is required because the registration endpoint carries the initial
access token and the issued client_secret (RFC 7591 §3, RFC 8414 §3).
MaxLength is a defensive size cap (etcd object budget, regex evaluation
cost) and matches the conventional URL length cap.

Must match regular expression: ^https://[^\s?#]+[^/\s?#]$

Must be at most 2048 characters long

Type: string

SoftwareID is the RFC 7591 "software_id" registration metadata value,
identifying the client software independent of any particular
registration instance. Typically a UUID or short identifier.

Must be at most 255 characters long

Type: string

SoftwareStatement is the RFC 7591 "software_statement" JWT asserting
metadata about the client software, signed by a party the authorization
server trusts.

Stored inline on the CR. The JWT is signed but not encrypted, so its
contents are visible to anyone with get/list/watch on this resource and
appear in etcd backups in plaintext. Treat the value as non-confidential
(signed attestation, not a secret). Operators that rotate software
statements like bearer credentials should keep them at the authorization
server side and rely on the registration endpoint's initial access
token (see InitialAccessTokenRef) instead of placing them on the CR.

Bounded to 16384 characters as a defensive size cap (etcd object
budget, regex evaluation cost). Real-world signed statements with
embedded x5c certificate chains, JWKS keys, or OIDC-Federation
trust-framework metadata routinely exceed 4 KB.

Must be at most 16384 characters long

Type: object

IdentityFromToken extracts user identity (subject, name, email) directly
from the OAuth2 token-endpoint response body using gjson dot-notation paths.
When set, the embedded auth server skips the userinfo HTTP call entirely
and resolves identity from the token response. See IdentityFromTokenConfig
for trust-model and uniqueness considerations.

Type: string

EmailPath is the dot-notation path to the email address field in the token response.
If not specified or if the path does not resolve to a string, the email is omitted.
Omit the field entirely rather than setting it to an empty string.

Must be at least 1 characters long

Must be at most 256 characters long

Type: string

NamePath is the dot-notation path to the display name field in the token response.
If not specified or if the path does not resolve to a string, the display name is omitted.
Omit the field entirely rather than setting it to an empty string.

Must be at least 1 characters long

Must be at most 256 characters long

Type: string

SubjectPath is the dot-notation path to the subject (user ID) field in the token response.
Warning: claims read from the token response are trusted only via TLS, not
cryptographically verified; prefer OIDC ID tokens when verifiable claims are required.
Example: "autheduser.id" for Slack (top-level token-response field). For providers
whose token response embeds the access token as a JWT (e.g. Snowflake), use the
"@upstreamjwt" modifier to decode the payload, e.g. "access
token|@upstreamjwt|sub".
The "@upstreamjwt" modifier performs no signature verification either.

Must be at least 1 characters long

Must be at most 256 characters long

Type: string

RedirectURI is the callback URL where the upstream IdP will redirect after authentication.
When not specified, defaults to {resourceUrl}/oauth/callback where resourceUrl is the
URL associated with the resource (e.g., MCPServer or vMCP) using this config.

Type: array of string

Scopes are the OAuth scopes to request from the upstream IdP.

No Additional Items

Each item of this array must be:

Type: string

TokenEndpoint is the URL for the OAuth token endpoint.

Must match regular expression: ^https?://.*$

Type: object

TokenResponseMapping configures custom field extraction from non-standard token responses.
Some OAuth providers (e.g., GovSlack) nest token fields under non-standard paths
instead of returning them at the top level. When set, ToolHive performs the token
exchange HTTP call directly and extracts fields using the configured dot-notation paths.
If nil, standard OAuth 2.0 token response parsing is used.
For extracting user identity from the token response, see IdentityFromToken.

Type: string

AccessTokenPath is the dot-notation path to the access token in the response.
Example: "autheduser.accesstoken"

Must be at least 1 characters long

Type: string

ExpiresInPath is the dot-notation path to the expiresin value (in seconds).
If not specified, defaults to "expires
in".

Type: string

RefreshTokenPath is the dot-notation path to the refresh token in the response.
If not specified, defaults to "refresh_token".

Type: string

ScopePath is the dot-notation path to the scope string in the response.
If not specified, defaults to "scope".

Type: object

UserInfo contains configuration for fetching user information from the upstream provider.
When omitted and IdentityFromToken is also unset, the embedded auth server runs in
synthesis mode for this upstream: a non-PII subject derived from the access token, no
Name/Email. Use this shape for upstreams with no userinfo surface and no identity in
the token response (e.g., MCP authorization servers per the MCP spec). When
IdentityFromToken is set instead, identity is resolved from the token response body
(e.g., Snowflake's "username" field, Slack's "authed_user.id"); the userinfo HTTP call
is skipped entirely.

Type: object

AdditionalHeaders contains extra headers to include in the userinfo request.
Useful for providers that require specific headers (e.g., GitHub's Accept header).

Each additional property must conform to the following schema

Type: string

Type: string

EndpointURL is the URL of the userinfo endpoint.

Must match regular expression: ^https?://.*$

Type: object

FieldMapping contains custom field mapping configuration for non-standard providers.
If nil, standard OIDC field names are used ("sub", "name", "email").

Type: array of string

EmailFields is an ordered list of field names to try for the email address.
The first non-empty value found will be used.
Default: ["email"]

No Additional Items

Each item of this array must be:

Type: array of string

NameFields is an ordered list of field names to try for the display name.
The first non-empty value found will be used.
Default: ["name"]

No Additional Items

Each item of this array must be:

Type: array of string

SubjectFields is an ordered list of field names to try for the user ID.
The first non-empty value found will be used.
Default: ["sub"]

No Additional Items

Each item of this array must be:

Type: enum (of string)

HTTPMethod is the HTTP method to use for the userinfo request.
If not specified, defaults to GET.

Must be one of:

  • "GET"
  • "POST"

Type: object

OIDCConfig contains OIDC-specific configuration.
Required when Type is "oidc", must be nil when Type is "oauth2".

Type: object

AdditionalAuthorizationParams are extra query parameters to include in
authorization requests sent to the upstream provider.
This is useful for providers that require custom parameters, such as
Google's accesstype=offline for obtaining refresh tokens.
Note: when using access
type=offline, also set explicit scopes to avoid
the default offlineaccess scope being sent alongside it.
Framework-managed parameters (response
type, clientid, redirecturi,
scope, state, codechallenge, codechallenge_method, nonce) are not allowed.

Each additional property must conform to the following schema

Type: string

Type: string

ClientID is the OAuth 2.0 client identifier registered with the upstream IdP.

Type: object

ClientSecretRef references a Kubernetes Secret containing the OAuth 2.0 client secret.
Optional for public clients using PKCE instead of client secret.

Type: string

IssuerURL is the OIDC issuer URL for automatic endpoint discovery.
Must be a valid HTTPS URL.

Must match regular expression: ^https://.*$

Type: string

RedirectURI is the callback URL where the upstream IdP will redirect after authentication.
When not specified, defaults to {resourceUrl}/oauth/callback where resourceUrl is the
URL associated with the resource (e.g., MCPServer or vMCP) using this config.

Type: array of string

Scopes are the OAuth scopes to request from the upstream IdP.
If not specified, defaults to ["openid", "offlineaccess"].
When using additionalAuthorizationParams with provider-specific refresh token
mechanisms (e.g., Google's access
type=offline), set explicit scopes to avoid
sending both offline_access and the provider-specific parameter.

No Additional Items

Each item of this array must be:

Type: string

SubjectClaim names the validated ID-token claim to use as the upstream
subject. Defaults to "sub" when empty. Set it for IdPs where "sub" isn't
stable per user — e.g. Entra/Azure AD, whose "sub" rotates per application
and whose stable identifier is "oid".

The value is looked up verbatim as a top-level claim name, so it is
constrained to a claim-name shape: it must start with a letter or
underscore and contain only letters, digits, and underscores. This rejects
dotted, colon-namespaced, or whitespace-containing values at admission
rather than letting a typo silently miss the claim at login, and keeps the
field aligned with the directory service's per-issuer bindingClaim.

Changing this on a live deployment re-keys existing users (the value
resolves to the internal user ID), so treat it as immutable once users
exist.

Per-IdP notes:
- Entra/Azure AD: use "oid"; it is only emitted when the upstream scopes
include "profile". "oid" is unique within a single tenant — multi-tenant
apps need oid+tid, which this single-claim field cannot express.
- Okta: the org auth server already puts the stable id in "sub" (default
works). A custom auth server's "sub" is the mutable login/email and the
stable "uid" lives only in the access token, not the ID token — map a
custom ID-token claim and point subjectClaim at it.
The pattern matches the claim-name shape and allows empty (defaults to
"sub"). Using Pattern rather than a CEL XValidation rule keeps this off the
CRD's CEL cost budget — a single-field format check via CEL is rejected by
the apiserver as too expensive once multiplied across the upstreams list.

Must match regular expression: ^([a-zA-Z_][a-zA-Z0-9_]*)?$

Must be at most 128 characters long

Type: object

UserInfoOverride allows customizing UserInfo fetching behavior for OIDC providers.
By default, the UserInfo endpoint is discovered automatically via OIDC discovery.
Use this to override the endpoint URL, HTTP method, or field mappings for providers
that return non-standard claim names in their UserInfo response.

Type: object

AdditionalHeaders contains extra headers to include in the userinfo request.
Useful for providers that require specific headers (e.g., GitHub's Accept header).

Each additional property must conform to the following schema

Type: string

Type: string

EndpointURL is the URL of the userinfo endpoint.

Must match regular expression: ^https?://.*$

Type: object

FieldMapping contains custom field mapping configuration for non-standard providers.
If nil, standard OIDC field names are used ("sub", "name", "email").

Type: array of string

EmailFields is an ordered list of field names to try for the email address.
The first non-empty value found will be used.
Default: ["email"]

No Additional Items

Each item of this array must be:

Type: array of string

NameFields is an ordered list of field names to try for the display name.
The first non-empty value found will be used.
Default: ["name"]

No Additional Items

Each item of this array must be:

Type: array of string

SubjectFields is an ordered list of field names to try for the user ID.
The first non-empty value found will be used.
Default: ["sub"]

No Additional Items

Each item of this array must be:

Type: enum (of string)

HTTPMethod is the HTTP method to use for the userinfo request.
If not specified, defaults to GET.

Must be one of:

  • "GET"
  • "POST"

Type: enum (of string)

Type specifies the provider type: "oidc" or "oauth2"

Must be one of:

  • "oidc"
  • "oauth2"

Type: object

HeaderInjection configures custom HTTP header injection
Only used when Type is "headerInjection"

Type: string

HeaderName is the name of the HTTP header to inject

Must be at least 1 characters long

Type: object

ValueSecretRef references a Kubernetes Secret containing the header value

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: object

OBO configures On-Behalf-Of (OBO) authentication.
Only used when Type is "obo". Setting this field on an upstream-only build
causes the MCPExternalAuthConfig to transition to
status.conditions[Valid] = False with Reason: EnterpriseRequired, because
no OBO handler is registered. See OBOConfig for the field-to-runtime
contract mapping.

Type: string

Audience is the backend target identifier requested in the exchanged
token. Used as the exchange target when Scopes is empty. At least one of
audience or scopes must be set; the operator enforces that at reconcile
(it is not an admission-time rule — see the type doc).

Type: string

Authority overrides the default Entra login host
(https://login.microsoftonline.com) for sovereign or national clouds, e.g.
https://login.microsoftonline.us (US Gov) or
https://login.partner.microsoftonline.cn (China). When set, the operator
builds the token endpoint by joining <authority>, <tenantId>, and the
v2.0 token path. Must be an HTTPS URL with no userinfo, query, fragment,
or trailing slash; a path IS permitted and is prefixed before the tenant
segment, as some sovereign / B2C / CIAM endpoints require. The OBO exchange
POSTs the client secret and the end-user assertion to this host, so it is a
credential trust boundary: HTTPS is required and userinfo (user@host) is
rejected to prevent host confusion (per RFC 3986 the real host follows the
"@", so https://login.microsoftonline.com@attacker.example targets
attacker.example). This is intentionally stricter than the downstream
exchanger's validateHTTPSURL, which also accepts http for loopback hosts
and tolerates a trailing slash — rejecting those at admission is the safe
direction.

Must match regular expression: ^https://[^\s?#@]+[^/\s?#@]$

Type: string

CacheSkew overrides the OBO token cache's default expiry skew (the margin
by which a cached token is treated as expired before its real expiry),
e.g. "30s". The operator converts it to the runtime contract's
integer-seconds cacheSkewSeconds. Should not be negative, but the schema
does not enforce that — metav1.Duration carries no numeric minimum — and
upstream builds do not reject it. A negative value is rejected only by an
enterprise build's OBO handler once that handler validates the converted
parameters; it is not enforced at admission or in upstream-only builds.
When omitted, the cache default applies.

Type: string

ClientID is the confidential client's application (client) ID registered
in Entra. Emitted verbatim as the runtime contract's clientId.
Optional at the CRD level so future client-authentication methods (e.g.
certificate or workload-identity credentials, planned fast-follows) can be
added without a breaking schema change. The operator enforces that clientId
and clientSecretRef are both present for the v1 shared-secret flow.

Type: object

ClientSecretRef references a Kubernetes Secret containing the confidential
client's secret. v1 supports a shared client secret only. The operator
injects the resolved value into the proxyrunner pod as an environment
variable and emits only that variable's name in the runtime contract, as
clientSecretEnvVar — the secret value never travels in the contract.
Optional at the CRD level for the same forward-compatibility reason as
clientId (a certificate/workload-identity flow needs no client secret);
the operator enforces presence for the v1 shared-secret flow.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: array of string

Scopes are the delegated scopes to request for the exchanged token, e.g.
["api://<backend>/.default"]. When non-empty they take precedence over
Audience. At least one of audience or scopes must be set; the operator
enforces that at reconcile. The MaxItems and per-item length caps are
defensive bounds on an otherwise unbounded list.

Must contain a maximum of 20 items

No Additional Items

Each item of this array must be:

Type: string

Must be at least 1 characters long

Must be at most 256 characters long

Type: string

SubjectTokenProviderName selects the source of the OBO subject (assertion)
token from the request's authenticated Identity:
- Omitted: use the inbound end-user token the client presented
(Identity.Token) — the deployment with no embedded auth server, where
the client holds an Entra token directly.
- Set: use the named upstream provider's token
(Identity.UpstreamTokens[<name>]) — the embedded-auth-server
deployment, where the inbound token is the proxy's own session token.
The value must match a configured upstream provider name.
The subject is always sourced from the authenticated Identity, never from
an inbound request header, so the upstream auth middleware must run first.

Must match regular expression: ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$

Must be at least 1 characters long

Must be at most 63 characters long

Type: string

TenantID is the Microsoft Entra (Azure AD) directory (tenant) identifier.
Optional at the CRD level (see the type doc); the operator enforces its
presence, since an OBO confidential-client exchange must target a specific
tenant. When set, it must be one of the two forms the Entra v2.0 token
endpoint addresses: a directory GUID, or a verified domain name (e.g.
contoso.onmicrosoft.com). Well-known aliases such as "common",
"organizations", and "consumers" are NOT accepted. The operator
interpolates it into the token endpoint
(<authority>/<tenantId>/oauth2/v2.0/token), so the value is constrained to
the GUID/domain shape (no path metacharacters); the pattern and 253-char
cap mirror the enterprise exchanger's validateTenant, so any tenantId
admitted here is one the runtime can consume.

Must match regular expression: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$

Must be at most 253 characters long

Type: object

TokenExchange configures RFC-8693 OAuth 2.0 Token Exchange
Only used when Type is "tokenExchange"

Type: string

Audience is the target audience for the exchanged token

Type: string

ClientID is the OAuth 2.0 client identifier
Optional for some token exchange flows (e.g., Google Cloud Workforce Identity)

Type: object

ClientSecretRef is a reference to a secret containing the OAuth 2.0 client secret
Optional for some token exchange flows (e.g., Google Cloud Workforce Identity)

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: string

ExternalTokenHeaderName is the name of the custom header to use for the exchanged token.
If set, the exchanged token will be added to this custom header (e.g., "X-Upstream-Token").
If empty or not set, the exchanged token will replace the Authorization header (default behavior).

Type: array of string

Scopes is a list of OAuth 2.0 scopes to request for the exchanged token

No Additional Items

Each item of this array must be:

Type: string

SubjectProviderName is the name of the upstream provider whose token is used as the
RFC 8693 subject token instead of identity.Token when performing token exchange.
When left empty and an embedded authorization server is configured on the VirtualMCPServer,
the controller automatically populates this field with the first configured upstream
provider name. Set it explicitly to override that default or to select a specific
provider when multiple upstreams are configured.

Type: string

SubjectTokenType is the type of the incoming subject token.
Accepts short forms: "accesstoken" (default), "idtoken", "jwt"
Or full URNs: "urn:ietf:params:oauth:token-type:accesstoken",
"urn:ietf:params:oauth:token-type:id
token",
"urn:ietf:params:oauth:token-type:jwt"
For Google Workload Identity Federation with OIDC providers (like Okta), use "id_token"

Must match regular expression: ^(access_token|id_token|jwt|urn:ietf:params:oauth:token-type:(access_token|id_token|jwt))?$

Type: string

TokenURL is the OAuth 2.0 token endpoint URL for token exchange

Type: enum (of string)

Type is the type of external authentication to configure.
When set to "obo", the cluster must run a build that has registered an
OBO handler via controllerutil.RegisterOBOHandler; upstream-only builds
surface status.conditions[Valid] = False with Reason: EnterpriseRequired
for obo-typed configs.

Must be one of:

  • "tokenExchange"
  • "headerInjection"
  • "bearerToken"
  • "unauthenticated"
  • "embeddedAuthServer"
  • "awsSts"
  • "upstreamInject"
  • "obo"
  • "xaa"

Type: object

UpstreamInject configures upstream token injection for backend requests.
Only used when Type is "upstreamInject".

Type: string

ProviderName is the name of the upstream IdP provider whose access token
should be injected as the Authorization: Bearer header.

Must be at least 1 characters long

Type: object

XAA configures XAA (Cross-Application Access) auth for backend requests.
Only used when Type is "xaa".

Type: string

IDPClientID is the OAuth client ID at the IdP for IdP exchange.

Type: object

IDPClientSecretRef references a Kubernetes Secret containing the IdP client secret.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: string

IDPTokenURL is the IdP token endpoint for IdP exchange (RFC 8693).
Must be a valid HTTPS URL.

Must match regular expression: ^https://.*$

Type: boolean

InsecureTargetTokenURL allows plain HTTP for TargetTokenURL.
WARNING: this is insecure and must only be set for in-cluster or
development/testing endpoints — never in production.

Type: array of string

Scopes are the requested scopes for the XAA exchange (IdP exchange and target grant).

No Additional Items

Each item of this array must be:

Type: string

Type: string

SubjectProviderName selects which upstream provider's ID token to use.
When left empty and an embedded authorization server is configured,
the controller automatically populates this field with the first configured
upstream provider name.

Type: enum (of string)

SubjectTokenType is the token-type URN of the upstream subject token
used in IdP exchange. Defaults to "urn:ietf:params:oauth:token-type:id_token"
when empty.

Must be one of:

  • "urn:ietf:params:oauth:token-type:id_token"

Type: string

TargetAudience is the resource AS URL for the ID-JAG audience claim.

Type: string

TargetClientID is the OAuth client ID at the target AS for target grant.
ID-JAG draft §9.1 RECOMMENDS confidential clients for target grant; most
conformant target authorization servers will reject an unauthenticated
JWT-bearer grant per the §4.4.1 client_id continuity requirement.

Type: object

TargetClientSecretRef references a Kubernetes Secret for the target AS client secret.

Type: string

Key is the key within the secret

Type: string

Name is the name of the secret

Type: string

TargetResource is the RFC 8707 resource indicator sent as the resource
parameter in IdP exchange (RFC 8693, draft §4.3, OPTIONAL). It
identifies the target resource server — not the access-token audience, which
is governed by TargetAudience. For MCP backends, set to the MCP server URL.
Some authorization servers (e.g. Okta's early ID-JAG implementation) require
this parameter in practice despite the draft marking it optional — set it
when your IdP needs it.

Type: string

TargetTokenURL is the target AS token endpoint for target grant (RFC 7523).

Type: object

MCPExternalAuthConfigStatus defines the observed state of MCPExternalAuthConfig

Type: array of object

Conditions represent the latest available observations of the MCPExternalAuthConfig's state

No Additional Items

Each item of this array must be:

Type: object

Condition contains details for one aspect of the current state of this API Resource.

Type: stringFormat: date-time

lastTransitionTime is the last time the condition transitioned from one status to another.
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.

Type: string

message is a human readable message indicating details about the transition.
This may be an empty string.

Must be at most 32768 characters long

Type: integerFormat: int64

observedGeneration represents the .metadata.generation that the condition was set based upon.
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
with respect to the current state of the instance.

Value must be greater or equal to 0

Type: string

reason contains a programmatic identifier indicating the reason for the condition's last transition.
Producers of specific condition types may define expected values and meanings for this field,
and whether the values are considered a guaranteed API.
The value should be a CamelCase string.
This field may not be empty.

Must match regular expression: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$

Must be at least 1 characters long

Must be at most 1024 characters long

Type: enum (of string)

status of the condition, one of True, False, Unknown.

Must be one of:

  • "True"
  • "False"
  • "Unknown"

Type: string

type of condition in CamelCase or in foo.example.com/CamelCase.

Must match regular expression: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$

Must be at most 316 characters long

Type: string

ConfigHash is a hash of the current configuration for change detection

Type: integerFormat: int64

ObservedGeneration is the most recent generation observed for this MCPExternalAuthConfig.
It corresponds to the MCPExternalAuthConfig's generation, which is updated on mutation by the API Server.

Type: integerFormat: int32

ReferenceCount is the number of workloads referencing this config.

Type: array of object

ReferencingWorkloads is a list of workload resources that reference this MCPExternalAuthConfig.
Each entry identifies the workload by kind and name. The map key is the
(kind, name) pair so two workloads of different kinds that share a name
(e.g., an MCPServer "foo" and a VirtualMCPServer "foo") are distinct
entries rather than colliding under merge-patch semantics.

No Additional Items

Each item of this array must be:

Type: object

WorkloadReference identifies a workload that references a shared configuration resource.
Namespace is implicit — cross-namespace references are not supported.

Type: enum (of string)

Kind is the type of workload resource

Must be one of:

  • "MCPServer"
  • "VirtualMCPServer"
  • "MCPRemoteProxy"

Type: string

Name is the name of the workload resource

Must be at least 1 characters long