---
title: "Register"
method: POST
path: "/api/v1/apps/{app_id}/mcp_servers"
tags: ["MCP Servers"]
---

# Register

`POST /api/v1/apps/{app_id}/mcp_servers`

Register a new MCP server under an application. Set server_type to HOSTED
 (C1 runs a catalog integration) or EXTERNAL (a third-party MCP server you
 point C1 at by URL). Auth credentials are validated and stored securely.

## Path parameters

- `app_id` string, required — App to register the MCP server under. When empty and app_managed_state_binding_ref is not set, a new managed app is created automatically.

## Request body

- C1ApiAiGovernanceV1MCPServerServiceRegisterRequestInput — MCPServerServiceRegisterRequest creates a new MCP server (Connector + config).
  - `acknowledgedFindingIds` string[], nullable — finding_ids from the diagnostic the admin acknowledged. Each must cover a blocking-relaxable finding on oauth_diagnostic_id.
  - `appManagedStateBindingRef` C1ApiAppV1AppManagedStateBindingRef — AppManagedStateBindingRef identifies an application discovered by a connector.
    - `appId` string — ID of the application that owns the connector.
    - `resourceId` string — Resource ID of the discovered application.
    - `resourceTypeId` string — ID of the resource type used for discovered applications.
  - `dataSensitivity` 'MCP_SERVER_DATA_SENSITIVITY_UNSPECIFIED' | 'MCP_SERVER_DATA_SENSITIVITY_PUBLIC' | 'MCP_SERVER_DATA_SENSITIVITY_INTERNAL' | 'MCP_SERVER_DATA_SENSITIVITY_CONFIDENTIAL' | 'MCP_SERVER_DATA_SENSITIVITY_RESTRICTED' — Data sensitivity classification.
  - `description` string — Admin-provided description.
  - `displayName` string — Admin-provided display name.
  - `externalConfig` C1ApiAiGovernanceV1MCPServerExternalConfig — MCPServerExternalConfig configures an external MCP server accessed via HTTP transport. The server is routed through the MCP gateway for credential decryption. This message contains a oneof named auth_config. Only a single field of the following list may be set at a time: - none - bearerToken - oauth2 - customHeader - basicAuth
    - `basicAuth` C1ApiAiGovernanceV1MCPServerAuthBasicAuth — MCPServerAuthBasicAuth provides HTTP Basic authentication (RFC 7617). The gateway encodes `username:password` as base64 and sends it as `Authorization: Basic <encoded>` on every outbound request.
      - `password` string — Password. Sealed before storage; never returned on read. ignore_empty for the same PER_USER reason as username above.
      - `username` string — Username. Sent in plaintext over TLS; stored unsealed on the connector config (mirrors how MCPAuthOAuth2.client_id is plaintext). ignore_empty mirrors MCPServerAuthBearerToken.token — PER_USER admin submits don't carry a username; the handler enforces non-empty for SHARED.
    - `bearerToken` C1ApiAiGovernanceV1MCPServerAuthBearerToken — MCPServerAuthBearerToken provides bearer token authentication.
      - `token` string — The bearer token value.
    - `customHeader` C1ApiAiGovernanceV1MCPServerAuthCustomHeader — MCPServerAuthCustomHeader provides custom header authentication.
      - `headerName` string — HTTP header name.
      - `headerValue` string — HTTP header value.
    - `none` C1ApiAiGovernanceV1MCPServerAuthNone — MCPServerAuthNone indicates no authentication is required.
    - `oauth2` C1ApiAiGovernanceV1MCPServerAuthOAuth2 — MCPServerAuthOAuth2 provides OAuth2 client credentials or JWT Bearer authentication.
      - `authorizeUrl` string — OAuth2 authorization endpoint URL (for service and passthrough modes).
      - `clientId` string — OAuth2 client identifier. Required for CLIENT_CREDENTIALS mode; not used for JWT_BEARER mode.
      - `clientIdMode` 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_DCR' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_CIMD' — How the client_id is acquired for authorization_code mode. When DCR (or CIMD), client_id / client_secret are not required on input — the gateway registers itself with the authorization server during Register and injects the result. UNSPECIFIED means manual (admin-entered client_id).
      - `clientSecret` string — OAuth2 client secret. Required for CLIENT_CREDENTIALS mode; not used for JWT_BEARER mode.
      - `codeChallengeMethodsSupported` string[], nullable — PKCE code challenge methods supported by the authorization server, as returned by DiscoverOIDCEndpoints. Optional registration-time shortcut that lets the gateway skip the per-flow xjwks.Cache lookup. Capped at 8 entries because RFC 7636 / RFC 8414 only define a tiny enumerated set ("plain", "S256") and we don't want to be a dumping ground for arbitrary strings the IdP might emit.
      - `extraAuthorizeParams` object — Static query params appended to the authorize URL on top of the standard OAuth2 fields (e.g. Notion "owner=user"). Applies to authorization_code mode only. Inherited from MCPServerCatalogAuthMode.extra_authorize_params at registration time.
      - `extraTokenParams` object — Extra body params POSTed to the token endpoint on top of the standard OAuth2 fields. Provider-specific (e.g. Auth0/Wiz "audience"). Applies to client_credentials mode only; other modes ignore it. Inherited from MCPServerCatalogAuthMode.extra_token_params at registration time; admins can add, edit, or remove entries on the edit form.
      - `issuerUrl` string — OIDC issuer URL (no trailing path). Used as the cache key for live PKCE-methods discovery via xjwks.Cache on the gateway. Populated by the Discover button or hand-entered alongside authorize_url/token_url. Required for SERVICE / PASSTHROUGH modes.
      - `jwtAudience` string — Audience claim for the JWT. When empty, token_url is used as the audience.
      - `jwtIssuer` string — The service account email / issuer claim.
      - `jwtPrivateKey` string — PEM-encoded RSA private key (plaintext in API; sealed before storage).
      - `jwtSubject` string — Optional subject for domain-wide delegation.
      - `mode` 'MCP_SERVER_AUTH_OAUTH2_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_MODE_SERVICE' | 'MCP_SERVER_AUTH_OAUTH2_MODE_PASSTHROUGH' | 'MCP_SERVER_AUTH_OAUTH2_MODE_CLIENT_CREDENTIALS' | 'MCP_SERVER_AUTH_OAUTH2_MODE_JWT_BEARER' | 'MCP_SERVER_AUTH_OAUTH2_MODE_GOOGLE_SERVICE_ACCOUNT' | 'MCP_SERVER_AUTH_OAUTH2_MODE_AUTHORIZATION_CODE' — OAuth2 mode.
      - `pkce` string — PKCE behavior for authorization_code mode: "discover" (or empty), "s256", or "disabled". Inherited from MCPServerCatalogAuthMode.pkce.
      - `scopes` string[], nullable — OAuth2 scopes to request.
      - `scopesSupported` string[], nullable — Full list of OAuth scopes the IdP advertises in its discovery doc (`scopes_supported`). Distinct from the `scopes` field above, which is the curated subset the admin wants requested on the authorize URL. Captured at registration time so the edit form can offer autocomplete suggestions on the Scopes input without forcing the admin to re-run Discover. Capped at 256 because providers like Salesforce return ~36; 256 leaves headroom without inviting abuse.
      - `tokenEndpointAuthMethod` string — RFC 7591 token_endpoint_auth_method the authorization server assigned. Read-only / ignored on write: server-set from the DCR result, never copied from the API request into the stored model. Surfaced for display only.
      - `tokenUrl` string — OAuth2 token endpoint URL. Required for all modes when creating or rotating; uses ignore_empty so partial UpdateCredentials calls that omit this path pass protovalidate. The handler enforces required-on-create.
    - `requireToolApproval` 'OPTIONAL_BOOL_UNSPECIFIED' | 'OPTIONAL_BOOL_TRUE' | 'OPTIONAL_BOOL_FALSE' — Optional per-server override for tool auto-approval. See MCPServerView.require_tool_approval for semantics.
    - `tokenSharing` 'MCP_SERVER_TOKEN_SHARING_UNSPECIFIED' | 'MCP_SERVER_TOKEN_SHARING_SHARED' | 'MCP_SERVER_TOKEN_SHARING_PER_USER' — Token sharing model. SHARED = admin authorizes once; PER_USER = each user authenticates independently. PER_USER is supported for OAuth2 authorization_code, bearer_token, custom_header, and basic_auth. Defaults to SHARED at runtime.
    - `transportType` 'MCP_SERVER_TRANSPORT_TYPE_UNSPECIFIED' | 'MCP_SERVER_TRANSPORT_TYPE_STREAMABLE_HTTP' | 'MCP_SERVER_TRANSPORT_TYPE_SSE' — Transport type for the MCP connection.
    - `url` string — The HTTP endpoint URL of the external MCP server (HTTPS required).
  - `hostedConfig` C1ApiAiGovernanceV1MCPServerHostedConfig — MCPServerHostedConfig configures a hosted MCP server backed by the MCP gateway. This message contains a oneof named auth_config. Only a single field of the following list may be set at a time: - none - bearerToken - oauth2 - customHeader - googleServiceAccount - awsSigv4 - basicAuth
    - `awsSigv4` C1ApiAiGovernanceV1MCPServerAuthAWSSigV4 — MCPServerAuthAWSSigV4 provides AWS Signature Version 4 authentication. Used for hosted MCP servers backed by AWS service impls (the amazonaws_com_* catalog entries). Outbound requests from the gateway are signed per-request with the supplied access key + secret, against the service+region scope sourced from the impl bundle's connect.auth. Only the SHARED token-sharing model is supported — every caller in the tenant signs with the same admin-configured credentials. Per-user AWS (STS / Web Identity / IAM Identity Center) is a separate future surface.
      - `accessKeyId` string — AWS access key ID (the IAM user / role's public identifier, e.g. "AKIAIOSFODNN7EXAMPLE"). Persisted in plaintext form; the secret half is sealed.
      - `secretAccessKey` string — AWS secret access key. Sealed by the backend on write; never returned on read.
      - `sessionToken` string — Optional AWS session token. Set only when the credential is a short-lived STS temporary credential. Static IAM-user keys leave this empty.
    - `basicAuth` C1ApiAiGovernanceV1MCPServerAuthBasicAuth — MCPServerAuthBasicAuth provides HTTP Basic authentication (RFC 7617). The gateway encodes `username:password` as base64 and sends it as `Authorization: Basic <encoded>` on every outbound request.
      - `password` string — Password. Sealed before storage; never returned on read. ignore_empty for the same PER_USER reason as username above.
      - `username` string — Username. Sent in plaintext over TLS; stored unsealed on the connector config (mirrors how MCPAuthOAuth2.client_id is plaintext). ignore_empty mirrors MCPServerAuthBearerToken.token — PER_USER admin submits don't carry a username; the handler enforces non-empty for SHARED.
    - `bearerToken` C1ApiAiGovernanceV1MCPServerAuthBearerToken — MCPServerAuthBearerToken provides bearer token authentication.
      - `token` string — The bearer token value.
    - `configFields` object — Extra config field values keyed by catalog config field name. Sent as plaintext over TLS; the backend seals secret fields based on catalog schema.
    - `customHeader` C1ApiAiGovernanceV1MCPServerAuthCustomHeader — MCPServerAuthCustomHeader provides custom header authentication.
      - `headerName` string — HTTP header name.
      - `headerValue` string — HTTP header value.
    - `googleServiceAccount` C1ApiAiGovernanceV1MCPServerAuthGoogleServiceAccount — MCPServerAuthGoogleServiceAccount provides Google service account authentication. The admin uploads the raw JSON key file from the GCP console; the backend parses it to extract the private key, client email (issuer), and token URI.
      - `credentialsJson` string — Raw JSON content of the Google service account key file.
      - `scopes` string[], nullable — OAuth2 scopes to request when exchanging the JWT for an access token.
    - `mcpServerCatalogId` string — Opaque catalog entry ID (27-character KSUID). Obtain valid IDs from the ListCatalog or GetCatalog RPCs.
    - `none` C1ApiAiGovernanceV1MCPServerAuthNone — MCPServerAuthNone indicates no authentication is required.
    - `oauth2` C1ApiAiGovernanceV1MCPServerAuthOAuth2 — MCPServerAuthOAuth2 provides OAuth2 client credentials or JWT Bearer authentication.
      - `authorizeUrl` string — OAuth2 authorization endpoint URL (for service and passthrough modes).
      - `clientId` string — OAuth2 client identifier. Required for CLIENT_CREDENTIALS mode; not used for JWT_BEARER mode.
      - `clientIdMode` 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_DCR' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_CIMD' — How the client_id is acquired for authorization_code mode. When DCR (or CIMD), client_id / client_secret are not required on input — the gateway registers itself with the authorization server during Register and injects the result. UNSPECIFIED means manual (admin-entered client_id).
      - `clientSecret` string — OAuth2 client secret. Required for CLIENT_CREDENTIALS mode; not used for JWT_BEARER mode.
      - `codeChallengeMethodsSupported` string[], nullable — PKCE code challenge methods supported by the authorization server, as returned by DiscoverOIDCEndpoints. Optional registration-time shortcut that lets the gateway skip the per-flow xjwks.Cache lookup. Capped at 8 entries because RFC 7636 / RFC 8414 only define a tiny enumerated set ("plain", "S256") and we don't want to be a dumping ground for arbitrary strings the IdP might emit.
      - `extraAuthorizeParams` object — Static query params appended to the authorize URL on top of the standard OAuth2 fields (e.g. Notion "owner=user"). Applies to authorization_code mode only. Inherited from MCPServerCatalogAuthMode.extra_authorize_params at registration time.
      - `extraTokenParams` object — Extra body params POSTed to the token endpoint on top of the standard OAuth2 fields. Provider-specific (e.g. Auth0/Wiz "audience"). Applies to client_credentials mode only; other modes ignore it. Inherited from MCPServerCatalogAuthMode.extra_token_params at registration time; admins can add, edit, or remove entries on the edit form.
      - `issuerUrl` string — OIDC issuer URL (no trailing path). Used as the cache key for live PKCE-methods discovery via xjwks.Cache on the gateway. Populated by the Discover button or hand-entered alongside authorize_url/token_url. Required for SERVICE / PASSTHROUGH modes.
      - `jwtAudience` string — Audience claim for the JWT. When empty, token_url is used as the audience.
      - `jwtIssuer` string — The service account email / issuer claim.
      - `jwtPrivateKey` string — PEM-encoded RSA private key (plaintext in API; sealed before storage).
      - `jwtSubject` string — Optional subject for domain-wide delegation.
      - `mode` 'MCP_SERVER_AUTH_OAUTH2_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_MODE_SERVICE' | 'MCP_SERVER_AUTH_OAUTH2_MODE_PASSTHROUGH' | 'MCP_SERVER_AUTH_OAUTH2_MODE_CLIENT_CREDENTIALS' | 'MCP_SERVER_AUTH_OAUTH2_MODE_JWT_BEARER' | 'MCP_SERVER_AUTH_OAUTH2_MODE_GOOGLE_SERVICE_ACCOUNT' | 'MCP_SERVER_AUTH_OAUTH2_MODE_AUTHORIZATION_CODE' — OAuth2 mode.
      - `pkce` string — PKCE behavior for authorization_code mode: "discover" (or empty), "s256", or "disabled". Inherited from MCPServerCatalogAuthMode.pkce.
      - `scopes` string[], nullable — OAuth2 scopes to request.
      - `scopesSupported` string[], nullable — Full list of OAuth scopes the IdP advertises in its discovery doc (`scopes_supported`). Distinct from the `scopes` field above, which is the curated subset the admin wants requested on the authorize URL. Captured at registration time so the edit form can offer autocomplete suggestions on the Scopes input without forcing the admin to re-run Discover. Capped at 256 because providers like Salesforce return ~36; 256 leaves headroom without inviting abuse.
      - `tokenEndpointAuthMethod` string — RFC 7591 token_endpoint_auth_method the authorization server assigned. Read-only / ignored on write: server-set from the DCR result, never copied from the API request into the stored model. Surfaced for display only.
      - `tokenUrl` string — OAuth2 token endpoint URL. Required for all modes when creating or rotating; uses ignore_empty so partial UpdateCredentials calls that omit this path pass protovalidate. The handler enforces required-on-create.
    - `requireToolApproval` 'OPTIONAL_BOOL_UNSPECIFIED' | 'OPTIONAL_BOOL_TRUE' | 'OPTIONAL_BOOL_FALSE' — Optional per-server override for tool auto-approval. See MCPServerView.require_tool_approval for semantics.
    - `sourceAppId` string — Source app ID (optional, for connector-backed servers).
    - `tokenSharing` 'MCP_SERVER_TOKEN_SHARING_UNSPECIFIED' | 'MCP_SERVER_TOKEN_SHARING_SHARED' | 'MCP_SERVER_TOKEN_SHARING_PER_USER' — Token sharing model for the configured auth method. SHARED means the admin authorizes once and the credential applies to every tool call; PER_USER means each user authenticates independently. PER_USER is supported for OAuth2 authorization-code, bearer_token, custom_header, and basic_auth methods; sending PER_USER alongside any other auth method is rejected with InvalidArgument.
  - `oauthDiagnosticId` string — When registering a DCR (client_id_mode=DCR) hosted server, the id of the diagnostic returned by DiscoverMCPOAuthConfig that the admin reviewed. When set, the server uses that diagnostic as the canonical discovery result and relaxes only the acknowledged findings. Empty preserves the strict path.
  - `serverType` 'MCP_SERVER_TYPE_UNSPECIFIED' | 'MCP_SERVER_TYPE_HOSTED' | 'MCP_SERVER_TYPE_EXTERNAL' — The type of MCP server being registered.
  - `toolPrefix` string — Optional prefix for tool names in the C1 MCP server. Tools are exposed as "<tool_prefix>_<tool_name>". When empty, the system uses an auto-derived prefix (service name or hostname).
  - `tunnelApplianceId` string — ID of the bridge (TunnelBridge.id, a KSUID) that proxies this server. Only set when tunneled == true; must match a bridge enrolled for this tenant. The server resolves this at register time to an active credential and persists that on the connector config; runtime routing through the wormhole requester is keyed on the resolved credential. Cross-field invariant: proto validation uses ignore_empty:true so an empty value passes the regex check. The service layer enforces that this field is non-empty whenever tunneled==true (see applyTunneledRegisterResolution).
  - `tunnelPath` string — Endpoint path on the appliance-side MCP server (e.g. "/sse", "/mcp"). Only used for EXTERNAL servers when tunneled == true: the service synthesizes external_config.url as http://<tunnel_service_name><tunnel_path>, since the tunnel host is the announced service name and only the admin knows the path. Empty defaults to "/". Ignored for HOSTED and non-tunneled.
  - `tunnelServiceName` string — Service name as declared by the appliance via AnnounceServices. Required when tunneled == true (for both EXTERNAL and HOSTED). The frontend populates this from a dropdown of services the picked appliance has announced. At runtime, mcp-gateway uses this name as the wormhole port-name argument to DialByName.
  - `tunneled` boolean — Whether the MCP server is reached over a tunnel to a private appliance instead of a public URL.
  - `userIds` string[], nullable — Integration owners for the MCP server connector.

## Response `200`

MCPServerServiceRegisterResponse returns the newly created MCP server.

- C1ApiAiGovernanceV1MCPServerServiceRegisterResponse — MCPServerServiceRegisterResponse returns the newly created MCP server.
  - `mcpServer` C1ApiAiGovernanceV1MCPServerView — MCPServerView is the API representation of an MCP server (backed by a Connector).
    - `appId` string — App identifier that owns this MCP server.
    - `authMethod` 'MCP_SERVER_AUTH_METHOD_UNSPECIFIED' | 'MCP_SERVER_AUTH_METHOD_NONE' | 'MCP_SERVER_AUTH_METHOD_BEARER_TOKEN' | 'MCP_SERVER_AUTH_METHOD_OAUTH2' | 'MCP_SERVER_AUTH_METHOD_CUSTOM_HEADER' | 'MCP_SERVER_AUTH_METHOD_AWS_SIGV4' | 'MCP_SERVER_AUTH_METHOD_BASIC_AUTH' — Authentication method in use. Read-only; derived from stored config.
    - `awsAccessKeyId` string — AWS SigV4 access key ID (the public half of the credential pair). Read-only; derived from stored config. Surfaced so the edit form can pre-fill the field on load without exposing the sealed secret.
    - `awsSecretAccessKeyConfigured` boolean — Whether an AWS SigV4 secret access key is configured. Read-only.
    - `awsSessionTokenConfigured` boolean — Whether an AWS SigV4 session token is configured (optional, only for STS temporary credentials). Read-only.
    - `basicAuthPasswordConfigured` boolean — Whether a basic-auth password is configured (admin-supplied for SHARED, irrelevant for PER_USER). Read-only; derived from stored config.
    - `basicAuthUsername` string — The username configured for basic-auth. Read-only.
    - `bearerTokenConfigured` boolean — Whether a bearer-token credential is configured (admin-supplied for SHARED, irrelevant for PER_USER). Read-only; derived from stored config. Mirrors oauth2_credentials_configured for the bearer-token auth method so the edit form can render the password input as "configured" without exposing the sealed bytes.
    - `configFieldValues` object — Non-secret configuration field values keyed by catalog config field name. Read-only; populated from the stored config. Secret fields are omitted.
    - `connectorId` string — Unique identifier (connector ID).
    - `createdAt` string, date-time, nullable
    - `credentialsSetupUrl` string — Deep link to the server's detail page in the C1 admin UI, where an admin enters or rotates credentials in the browser. Lets an agent hand its human a clickable link for credential entry so the secret value never transits the agent transcript. Empty when the tenant frontend URL can't be resolved. Read-only.
    - `customHeaderName` string — The HTTP header name configured for custom-header auth. Read-only; derived from stored config. Surfaced so the admin edit form can pre-fill the field on load — without this, the form shows blank and the admin has to retype it on every edit (which loses the value if they only meant to flip token_sharing).
    - `customHeaderValueConfigured` boolean — Whether a custom-header value is configured (admin-supplied for SHARED, irrelevant for PER_USER). Read-only; derived from stored config.
    - `dataSensitivity` 'MCP_SERVER_DATA_SENSITIVITY_UNSPECIFIED' | 'MCP_SERVER_DATA_SENSITIVITY_PUBLIC' | 'MCP_SERVER_DATA_SENSITIVITY_INTERNAL' | 'MCP_SERVER_DATA_SENSITIVITY_CONFIDENTIAL' | 'MCP_SERVER_DATA_SENSITIVITY_RESTRICTED' — Data sensitivity classification.
    - `defaultToolPrefix` string — Default tool-name prefix used when tool_prefix is unset (the hosted impl's server_prefix / service name); empty for external or legacy servers. Read-only.
    - `description` string — Admin-provided description.
    - `displayName` string — Admin-provided display name.
    - `endpointUrl` string — Endpoint URL for external MCP servers. Read-only.
    - `lastCalledAt` string, date-time, nullable
    - `mcpServerCatalogId` string — Opaque catalog entry ID for hosted MCP servers (27-character KSUID). Obtain valid IDs from the ListCatalog or GetCatalog RPCs.
    - `oauth2AuthorizeUrl` string — OAuth2 authorization URL. Read-only; derived from stored config.
    - `oauth2ClientId` string — OAuth2 client ID (non-secret). Read-only; derived from stored config.
    - `oauth2ClientIdMode` 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_DCR' | 'MCP_SERVER_AUTH_OAUTH2_CLIENT_ID_MODE_CIMD' — How the OAuth2 client_id was acquired (manual / DCR / CIMD). Read-only; derived from stored config. Empty for non-authorization_code servers.
    - `oauth2ClientSecretExpiresAt` string, int64 — RFC 7591 client_secret expiry (unix seconds; 0 = never). Read-only; derived from stored config. Surfaced for display only.
    - `oauth2CodeChallengeMethodsSupported` string[], nullable — PKCE code-challenge methods the IdP advertised at registration. Read-only; derived from stored config. Surfaced so the edit form's change detection can compare against the saved value rather than an implicit empty default — without this, re-running Discover on a server with stable methods always reports the field as changed and fires a spurious UpdateCredentials.
    - `oauth2CredentialsConfigured` boolean — Whether OAuth2 client credentials (client_id + client_secret) are configured. Read-only.
    - `oauth2ExtraAuthorizeParams` object — Static query params appended to the OAuth2 authorize URL. Read-only on the view; the edit form surfaces this as an editable key/value list. Empty for non-authorization_code servers.
    - `oauth2ExtraTokenParams` object — Extra body params POSTed to the OAuth2 token endpoint. Read-only on the view; the edit form takes this value and surfaces it as an editable key/value list. Empty for non-OAuth2 / non-client-credentials servers.
    - `oauth2IssuerUrl` string — OAuth2 issuer URL. Read-only; derived from stored config. Surfaced so the registration UI can prefill the Discover input box on edit.
    - `oauth2JwtAudience` string — JWT audience claim. Read-only.
    - `oauth2JwtIssuer` string — JWT issuer (service account email). Read-only.
    - `oauth2JwtPrivateKeyConfigured` boolean — Whether a JWT private key is configured. Read-only.
    - `oauth2JwtSubject` string — JWT subject (domain-wide delegation). Read-only.
    - `oauth2Mode` 'MCP_SERVER_AUTH_OAUTH2_MODE_UNSPECIFIED' | 'MCP_SERVER_AUTH_OAUTH2_MODE_SERVICE' | 'MCP_SERVER_AUTH_OAUTH2_MODE_PASSTHROUGH' | 'MCP_SERVER_AUTH_OAUTH2_MODE_CLIENT_CREDENTIALS' | 'MCP_SERVER_AUTH_OAUTH2_MODE_JWT_BEARER' | 'MCP_SERVER_AUTH_OAUTH2_MODE_GOOGLE_SERVICE_ACCOUNT' | 'MCP_SERVER_AUTH_OAUTH2_MODE_AUTHORIZATION_CODE' — OAuth2 mode in use. Read-only; derived from stored config.
    - `oauth2Pkce` string — PKCE behavior for authorization_code mode: "discover" (or empty), "s256", or "disabled". Read-only on the view. Empty for non-authorization_code servers.
    - `oauth2Scopes` string[], nullable — OAuth2 scopes. Read-only; derived from stored config.
    - `oauth2ScopesSupported` string[], nullable — OAuth scopes the IdP advertised in its discovery doc at the most recent Discover. Read-only; derived from stored config. Surfaced so the edit form can populate the Scopes chips-input autocomplete from a previously-discovered list without forcing the admin to re-run Discover. Distinct from oauth2_scopes (= the requested subset).
    - `oauth2ServiceAuthorized` boolean — Whether a service-mode OAuth2 credential exists. Read-only.
    - `oauth2ServiceAuthorizedAsEmail` string — Email of the external identity authorized (from ID token). Read-only.
    - `oauth2ServiceAuthorizedAsName` string — Display name of the external identity authorized (from ID token). Read-only.
    - `oauth2ServiceAuthorizedAt` string, date-time, nullable
    - `oauth2ServiceAuthorizedBy` string — Passport user ID of who authorized the service-mode OAuth2 credential. Read-only.
    - `oauth2TokenEndpointAuthMethod` string — RFC 7591 token_endpoint_auth_method the authorization server assigned ("none" for public PKCE-only clients). Read-only; server-set from the DCR result. Empty for manual / non-DCR servers.
    - `oauth2TokenUrl` string — OAuth2 token URL. Read-only; derived from stored config.
    - `requireToolApproval` 'OPTIONAL_BOOL_UNSPECIFIED' | 'OPTIONAL_BOOL_TRUE' | 'OPTIONAL_BOOL_FALSE' — Per-server override for tool auto-approval.
    - `serverType` 'MCP_SERVER_TYPE_UNSPECIFIED' | 'MCP_SERVER_TYPE_HOSTED' | 'MCP_SERVER_TYPE_EXTERNAL' — Whether this is a hosted MCP server.
    - `sourceAppId` string — Source app ID (hosted servers only).
    - `tokenSharing` 'MCP_SERVER_TOKEN_SHARING_UNSPECIFIED' | 'MCP_SERVER_TOKEN_SHARING_SHARED' | 'MCP_SERVER_TOKEN_SHARING_PER_USER' — Token sharing model in use. Read-only; derived from stored config. For rows stored under the legacy SERVICE/PASSTHROUGH OAuth2 modes, this is synthesized as SHARED/PER_USER respectively.
    - `toolPrefix` string — Admin-configured prefix for tool names in the C1 MCP server. Tools are exposed as "<tool_prefix>_<tool_name>". When empty, the system uses an auto-derived prefix (service name or hostname).
    - `transportType` 'MCP_SERVER_TRANSPORT_TYPE_UNSPECIFIED' | 'MCP_SERVER_TRANSPORT_TYPE_STREAMABLE_HTTP' | 'MCP_SERVER_TRANSPORT_TYPE_SSE' — Transport type for external MCP servers. Read-only.
    - `tunnelApplianceId` string — Credential id (cutename) used to route tool calls through the bridge. Set only when tunneled == true. Read-only.
    - `tunnelBridgeId` string — ID of the bridge (TunnelConnection.id, a KSUID) that proxies this server. Set only when tunneled == true. Read-only.
    - `tunnelServiceName` string — Bridge-announced service name used to route to this server. Set only when tunneled == true. Read-only.
    - `tunneled` boolean — Whether the MCP server is reached over a tunnel to a private bridge appliance instead of a public URL. Read-only.
    - `updatedAt` string, date-time, nullable

---

[API](https://skmtc.net/conductorone/apis/c1-api.md) · [All operations](https://skmtc.net/conductorone/apis/c1-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/conductorone/c1-api/revisions/f2cf3228f366/schema)
