From f9d08b01945d129aa11be767d0e337a5b2b75a55 Mon Sep 17 00:00:00 2001 From: ltsch <140873092+ltsch@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:01:19 -0500 Subject: [PATCH 1/4] docs(mcp): add Gemini Enterprise connection guide Documents connecting Google Gemini Enterprise to the C1 MCP gateway so tool calls are attributed to individual users rather than a shared service account. Covers the Google Cloud prerequisites, the organization policy that blocks custom MCP data connectors by default, the OAuth client ID C1 publishes for Gemini Enterprise, the data store wizard, and enabling tools. Gives gcloud equivalents alongside the console steps wherever an API exists, and recommends the command line given the number of steps. Agent Registry and Agent Gateway are documented as an optional catalog path rather than a requirement, since Gemini Enterprise data connector traffic does not trigger gateway policy enforcement. Co-Authored-By: Claude Opus 5 --- docs.json | 3 +- .../admin/mcp-server/gemini-enterprise.mdx | 473 ++++++++++++++++++ 2 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 product/admin/mcp-server/gemini-enterprise.mdx diff --git a/docs.json b/docs.json index 31d42e19..7cfb37c2 100644 --- a/docs.json +++ b/docs.json @@ -107,7 +107,8 @@ "group": "C1 MCP", "pages": [ "product/admin/c1-mcp", - "product/admin/mcp-server/copilot-studio" + "product/admin/mcp-server/copilot-studio", + "product/admin/mcp-server/gemini-enterprise" ] }, { diff --git a/product/admin/mcp-server/gemini-enterprise.mdx b/product/admin/mcp-server/gemini-enterprise.mdx new file mode 100644 index 00000000..8aed40c1 --- /dev/null +++ b/product/admin/mcp-server/gemini-enterprise.mdx @@ -0,0 +1,473 @@ +--- +title: Connect Gemini Enterprise to C1 +description: Give Gemini Enterprise users access to C1-governed tools, with every tool call attributed to the person who made it. +og:title: Connect Gemini Enterprise to C1 +og:description: Give Gemini Enterprise users access to C1-governed tools, with every tool call attributed to the person who made it. +sidebarTitle: Connect Gemini Enterprise +--- + +{/* Editor Refresh: 2026-08-17 */} + +Google [Gemini Enterprise](https://cloud.google.com/gemini/enterprise) calls the C1 MCP gateway as a tool source. Your users ask Gemini Enterprise a question, Gemini calls a C1 tool on their behalf, and C1 enforces your access policies against that person's identity. Tool calls are attributed to individual users, not to a shared service account. + + +**Activation required.** AI access management must be enabled for your tenant before you can use it. To get started, [contact the C1 support team](mailto:support@c1.ai) for a walkthrough. + + +## What you'll do + +Setup spans two products and three roles. Plan for a Google Cloud administrator with organization-level permissions to be available. + +| Stage | Where | Who | +| :--- | :--- | :--- | +| Get the MCP server URL | C1 | C1 administrator | +| Enable APIs and adjust organization policy | Google Cloud | Google Cloud administrator | +| Create the data store and authorize | Gemini Enterprise | Gemini Enterprise administrator | +| Enable tools | Gemini Enterprise | Gemini Enterprise administrator | + + +Most of the Google Cloud steps have `gcloud` equivalents, and this page gives both. The command line is faster and easier to repeat across environments, so use it where you can. Two steps near the end have no API equivalent and must be done in the Google Cloud console. + + +## Before you begin + +- A Google Cloud project with a Gemini Enterprise app already created. +- The [gcloud CLI](https://cloud.google.com/sdk/docs/install), authenticated with `gcloud auth login`. +- The `beta` component, which the gateway commands need: + + ```bash + gcloud components install beta + ``` + + + Install this before you start. Without it, `gcloud beta` commands stop at an interactive install prompt. In a script, that looks like a hang rather than an error. + + +- A Google Cloud administrator who can grant `roles/orgpolicy.policyAdmin` at the organization or folder level. Project **Owner** is not sufficient for the organization policy change in [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). + +### Required roles + +Grant these on the Google Cloud project: + +| Role | Why | +| :--- | :--- | +| `roles/serviceusage.serviceUsageAdmin` | Enable the required APIs | +| `roles/discoveryengine.admin` | Create the data store and authorize the connection | +| `roles/orgpolicy.policyAdmin` | Allow custom MCP data connectors. Must be granted at the organization or folder level | +| `roles/agentregistry.admin` | Register the server in Agent Registry. Only for [Optional: Publish through Agent Registry](#optional-publish-through-agent-registry) | +| `roles/compute.networkAdmin` and `roles/networksecurity.admin` | Create the gateway and its policy. Only for the optional Agent Registry path | + +## Get your C1 MCP server URL + +Every C1 tenant has its own MCP server URL and its own OAuth endpoints. + + + +In C1, open your user profile menu and select **AI & API** > **AI connections**. + + +Copy the MCP server URL at the top of the page. It looks like this: + +```text +https://-mcp.conductor.one/v1 +``` + + + +Your OAuth endpoints follow from your tenant subdomain. Confirm them against your tenant's published metadata: + +```bash +curl -s https://-mcp.conductor.one/.well-known/oauth-authorization-server +``` + +You need three values from that response: + +| Value | For a tenant named `acme` | +| :--- | :--- | +| MCP server URL | `https://acme-mcp.conductor.one/v1` | +| Authorization URL | `https://acme.conductor.one/auth/v1/authorize` | +| Token URL | `https://acme.conductor.one/auth/v1/token` | + +## Check your region requirements + +Your Gemini Enterprise app location determines every other region you pick. Find it at the top of the **Apps** page in the Google Cloud console, next to **Current location**. + +| App location | Agent Gateway region | Agent Registry region | +| :--- | :--- | :--- | +| `global` | `us-central1` | `us-central1` or `global` | +| `us` | `us-central1` | `us-central1` | +| `eu` | `europe-west1` | `europe-west1` | + + +Agent Registry does not support the `us` and `eu` multi-region locations. Use a specific region such as `us-central1`, or use `global`. These regions matter only if you follow [Optional: Publish through Agent Registry](#optional-publish-through-agent-registry). When regions do not line up, the server never appears in the data store list and no error explains why. + + +## Enable the Google Cloud APIs + +Enable the APIs that back Gemini Enterprise data connectors and their tools. + + + +In the Google Cloud console, go to **APIs & Services** > **Library**. + + +Search for each API by name and select **Enable**. + + + +From the command line: + +```bash +gcloud services enable \ + discoveryengine.googleapis.com \ + connectors.googleapis.com \ + integrations.googleapis.com \ + secretmanager.googleapis.com \ + iam.googleapis.com \ + orgpolicy.googleapis.com \ + --project=YOUR_PROJECT_ID +``` + +To confirm which APIs are enabled: + +```bash +gcloud services list --enabled --project=YOUR_PROJECT_ID +``` + + +`connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` back the tool actions a data connector exposes. Google's setup documentation does not list them, and tool discovery fails without them. + + +## Allow custom MCP data connectors + +Google Cloud blocks custom MCP data connectors by default. Creating the data store fails at the final step until an administrator turns the constraint off: + +```text +Operation denied by org policy on resource '...': +["constraints/discoveryengine.managed.disableCustomMcpServerConnector": +"This constraint, when enforced, restricts the creation of data connectors +that use a custom MCP server as their data source."] +``` + +Save this as `policy.yaml`: + +```yaml +name: projects/YOUR_PROJECT_ID/policies/discoveryengine.managed.disableCustomMcpServerConnector +spec: + rules: + - enforce: false +``` + +Then apply it: + +```bash +gcloud org-policies set-policy policy.yaml +``` + +Confirm the change took effect: + +```bash +gcloud org-policies describe \ + discoveryengine.managed.disableCustomMcpServerConnector \ + --project=YOUR_PROJECT_ID --effective +``` + + +Allow several minutes for the policy to propagate. Until it does, the console returns the same denial message, so a failure right after you apply the policy does not mean the policy is wrong. Setting this policy requires `roles/orgpolicy.policyAdmin` at the organization or folder level. + + +Your organization may also restrict which external hosts a data connector can reach. If so, allow the two hostnames your tenant uses, `-mcp.conductor.one` and `.conductor.one`. Use hostnames only, not full URLs. + +## Get the OAuth client ID + +Gemini Enterprise authenticates each user to C1 with the OAuth 2.0 authorization code flow. It needs an OAuth client that already exists, because it does not register itself the way Claude Code and Cursor do. + +C1 publishes a client metadata document for Gemini Enterprise. Use its URL as the client ID: + +```text +https://.conductor.one/auth/v1/client-metadata/gemini-enterprise +``` + + +A pre-registered client ID does not mean shared access. The client ID identifies Gemini Enterprise as an application. Each user still signs in to C1 through your identity provider, receives their own token, and is governed by their own access profiles. Per-user consent, audit, and revocation all work normally. + + + +This client has no secret, so nothing expires and nothing needs rotating. Configure it once and it keeps working. Do not create a client through C1's dynamic registration endpoint for this integration: those secrets expire one hour after they are issued, and re-registering does not extend the expiry. + + +## Create the data store + +Connect the C1 MCP gateway to your Gemini Enterprise app. + + + +In the Google Cloud console, open **Gemini Enterprise** and select your app. + + +Select **Connected data stores** > **New data store**. + + +In **Select a data source**, search for `Custom MCP`, then select **Add MCP server** on the **Custom MCP Server** card. + + +For **Select your authentication method**, choose **OAuth 2.0** and complete the fields: + +| Field | Value | +| :--- | :--- | +| **MCP Server URL** | `https://-mcp.conductor.one/v1` | +| **Authorization URL** | `https://.conductor.one/auth/v1/authorize` | +| **Authorization URL Parameters** | `&resource=https://-mcp.conductor.one/v1` | +| **Token URL** | `https://.conductor.one/auth/v1/token` | +| **Client ID** | `https://.conductor.one/auth/v1/client-metadata/gemini-enterprise` | +| **Client Secret** | Leave empty | +| **Scopes** | `openid profile email offline_access` | +| **Enable PKCE Support** | Selected | +| **Use HTTP Basic Authentication** | Cleared | + + +Select **Verify Auth**. A window opens for you to sign in through your identity provider and authorize the connection. + + +Select **Continue**, enter a **Data connector name**, and select **Create**. + + + +The form shows **Successfully logged in** after you authorize, and the connector reaches the **Active** state a minute or two after you create it. + + +The data connector name generates an ID that cannot be changed later. Choose the name you want before you select **Create**. + + +Four details on that form are easy to get wrong: + +- **Clear Use HTTP Basic Authentication.** It is selected by default. Leaving it selected sends the client ID and secret in an `Authorization` header, which does not work for a client that has no secret. +- **Leave Client Secret empty.** The field is optional even though Client ID, Authorization URL, and Token URL are marked required. +- **Include `offline_access` in the scopes.** Without it C1 issues no refresh token, and users reauthorize every time their access token expires. +- **Set Authorization URL Parameters.** C1 binds tokens to a specific resource, so the `resource` parameter scopes the issued token to your MCP endpoint. + +## Enable the tools + +Tools import disabled. Turn on the ones you want available to users. + + + +Open the data store and select the **Actions** tab. + + +Select **Reload custom actions**. Gemini Enterprise queries your MCP server for its current tool list. + + +Select the tools to expose, then select **Enable actions**. + + + +Google recommends enabling no more than 100 actions per data store. + + +Wait for the connector state to reach **Active** before selecting **Reload custom actions**. The reload fails while the connector is still creating. + + +## Verify the connection + +Tool discovery runs before authentication is proven, so seeing tools listed does not confirm your credentials are correct. You confirm the setup only when a user successfully calls a C1 tool. + + + +Open your Gemini Enterprise app as an end user and ask a question that needs a C1 tool, such as "Who has access to Salesforce?" + + +Authorize the connection when prompted. Sign in through your identity provider and approve. + + +In C1, open your user profile menu and select **AI & API** > **AI connections**. The Gemini Enterprise connection appears, bound to that user. + + +In C1, go to **Settings** > **System log** and filter on `activity_name starts with "mcp_"`. Tool calls appear as `mcp_tool_call` events attributed to the individual user. + + + +## Optional: Publish through Agent Registry + +Agent Registry gives your organization a catalog of approved MCP servers, and Agent Gateway applies policy to agent traffic. Neither is required to connect Gemini Enterprise to C1, and the setup in the previous sections works without them. Add them when you want the C1 gateway to appear in a shared catalog alongside your other approved servers. + + +Gemini Enterprise supports only **Agent-to-Anywhere (egress)** mode. Google's documentation states that traffic between Gemini Enterprise agents and their data connectors does not trigger Agent Gateway policy enforcement, so treat this path as catalog publishing rather than traffic governance. + + +### Enable the additional APIs + +```bash +gcloud services enable \ + agentregistry.googleapis.com \ + networkservices.googleapis.com \ + networksecurity.googleapis.com \ + compute.googleapis.com \ + dns.googleapis.com \ + iap.googleapis.com \ + aiplatform.googleapis.com \ + modelarmor.googleapis.com \ + --project=YOUR_PROJECT_ID +``` + + +`iap.googleapis.com` is missing from Google's published list of required APIs, and the authorization extension below fails without it. + + +### Register the server + +Describe the tools you want catalogued in a `toolspec.json` file. Each tool needs `name`, `description`, and `inputSchema`, and the file is limited to 10 KB. + +```json +{ + "tools": [ + { + "name": "find_api_objects", + "description": "Query C1 objects by identifiers, search text, or filters.", + "inputSchema": { + "type": "object", + "properties": { + "object_type": { "type": "string" }, + "query": { "type": "string" } + }, + "required": ["object_type"] + }, + "annotations": { + "title": "Find API Objects", + "readOnlyHint": true, + "idempotentHint": true + } + } + ] +} +``` + + +`inputSchema` is required on every tool, even though Google's published example omits it. Without it, registration fails with `invalid MCP tool spec content: tools.0: inputSchema is required`. + + +Register the server: + +```bash +gcloud agent-registry services create c1-mcp-gateway \ + --project=YOUR_PROJECT_ID \ + --location=us-central1 \ + --display-name="C1 MCP Gateway" \ + --mcp-server-spec-type=tool-spec \ + --mcp-server-spec-content="$(cat toolspec.json)" \ + --interfaces="url=https://-mcp.conductor.one/v1,protocolBinding=jsonrpc" +``` + +### Create the gateway + +Save this as `gateway.yaml`: + +```yaml +name: c1-agent-gateway +protocols: + - MCP +googleManaged: + governedAccessPath: AGENT_TO_ANYWHERE +registries: + - //agentregistry.googleapis.com/projects/YOUR_PROJECT_ID/locations/us-central1 +``` + +Then import it: + +```bash +gcloud network-services agent-gateways import c1-agent-gateway \ + --source=gateway.yaml \ + --location=us-central1 \ + --project=YOUR_PROJECT_ID +``` + + +The `registries` value must start with `//agentregistry.googleapis.com/`. A plain `projects/.../locations/...` path is rejected with `does not match the pattern`. There is no separate registry resource to create, because the registry is implicit for each project and location. + + +### Bind the gateway to your app + +Creating the gateway is not enough. Each Gemini Enterprise app must point at it explicitly. Until you do this, the data store list shows a **Configure Agent Gateway** prompt and no registered servers appear. + + + +In your Gemini Enterprise app, go to **Security** > **Configuration**. + + +Under **Agent Gateway configuration**, enter the gateway resource name: + +```text +projects/YOUR_PROJECT_ID/locations/us-central1/agentGateways/c1-agent-gateway +``` + + +Select **Save**. + + + +From the command line: + +```bash +curl -X PATCH \ + -H "Authorization: Bearer $(gcloud auth print-access-token)" \ + -H "Content-Type: application/json" \ + -H "X-Goog-User-Project: YOUR_PROJECT_ID" \ + -d '{"agentGatewaySetting":{"defaultEgressAgentGateway":{"name":"projects/YOUR_PROJECT_ID/locations/us-central1/agentGateways/c1-agent-gateway"}}}' \ + "https://discoveryengine.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/global/collections/default_collection/engines/YOUR_ENGINE_ID?updateMask=agentGatewaySetting.defaultEgressAgentGateway.name" +``` + +The console reports **Agent gateway configuration saved**, and the C1 MCP Gateway card then appears under **MCP servers** when you create a data store. + +## Troubleshoot Gemini Enterprise connection errors + +| Symptom | Cause | Fix | +| :--- | :--- | :--- | +| `Operation denied by org policy ... disableCustomMcpServerConnector` | The organization policy blocks custom MCP data connectors. | Turn the constraint off and wait for propagation. See [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). | +| **We encountered some problems during authentication** | The redirect URI in the client metadata document does not match what Gemini Enterprise sent. | Use the C1-published client ID from [Get the OAuth client ID](#get-the-oauth-client-id). | +| **Failed to reload custom actions** | The connector is still creating, or the tool actions APIs are not enabled. | Wait for the connector state to reach **Active**, then confirm `connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` are enabled. | +| Authorization works, then breaks about an hour later | The client was created through dynamic registration, and its secret expired. | Use the C1-published client ID. See [Get the OAuth client ID](#get-the-oauth-client-id). | +| Users reauthorize constantly | `offline_access` is missing from the scopes, so C1 issues no refresh token. | Add `offline_access` and have users reconnect. | +| `401` from the MCP server | The token is missing or not bound to the right resource. | Set **Authorization URL Parameters** to `&resource=https://-mcp.conductor.one/v1`. | +| The form will not accept an empty **Client Secret** | **Use HTTP Basic Authentication** is still selected. | Clear that checkbox. See [Create the data store](#create-the-data-store). | +| C1 MCP Gateway does not appear under **MCP servers** | The gateway is not bound to the app, or the regions do not line up. | See [Bind the gateway to your app](#bind-the-gateway-to-your-app) and [Check your region requirements](#check-your-region-requirements). | +| A `gcloud beta` command appears to hang | The `beta` component is not installed and the CLI is waiting at an install prompt. | Run `gcloud components install beta`, or add `--quiet`. | + +## Limitations + +- Gemini Enterprise supports egress (**Agent-to-Anywhere**) mode only. +- MCP servers must use StreamableHTTP transport. Server-sent events are not supported. +- VPC Service Controls and Private Service Connect are not supported for custom MCP data stores. +- The MCP server needs a certificate from a publicly trusted authority. Self-signed certificates are rejected. +- A gateway supports at most 5,000 registered resources. +- Google recommends a maximum of 100 enabled actions per data store. + +## Frequently asked questions about connecting Gemini Enterprise + + + +No. The client ID identifies Gemini Enterprise as an application, not as a user. Every person authorizes individually through your identity provider and receives their own token. C1 evaluates each tool call against that person's access profiles, and their activity appears under their own identity in the system log. + + + +The client is a public OAuth client with no secret. Client ID Metadata Document clients cannot use shared secrets, so C1 ignores the field. Security comes from the authorization code flow with PKCE, which you turn on with **Enable PKCE Support**. + + + +No. Connecting Gemini Enterprise to C1 works without it. Agent Gateway and Agent Registry publish the C1 gateway in a shared catalog of approved servers. Google's documentation notes that Gemini Enterprise data connector traffic does not trigger Agent Gateway policy enforcement, so adding it does not change how tool calls are governed. C1 governs the tool calls. + + + +In C1, open **AI access management** > **AI clients**, find the user's Gemini Enterprise connection, and revoke it. Their tokens stop working immediately. Everyone else is unaffected. + + + +Yes. C1 records every MCP session and tool call in the system log. Filter on `activity_name starts with "mcp_"` to see sessions and calls, each attributed to the user who made them. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). + + + +## Related pages + +- [Manage AI clients](/product/admin/ai-clients) covers lifecycle states, the kill switch, and allowed client types. +- [Connect to the C1 MCP](/product/admin/c1-mcp) covers the same gateway from desktop AI assistants. +- [AI access management](/product/admin/aiam-overview) covers the access profiles and toolsets that decide what each user's tools can do. +- [Audit AI tool usage](/product/admin/audit-ai-tool-usage) covers reviewing MCP activity in the system log. From a6320adc4336aca3464c82c7dab9c88ef86246d5 Mon Sep 17 00:00:00 2001 From: ltsch <140873092+ltsch@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:09:39 -0500 Subject: [PATCH 2/4] docs(mcp): apply style guide fixes to Gemini Enterprise guide Corrects placeholder conventions so bash fences use YOUR_TENANT and text fences use angle-bracket values, which also stops the shell from reading angle brackets as redirection. Adds outcome sentences after each procedure, moves the irreversible-ID warning and the connector-state note above the steps they govern, splits bundled actions into single-action steps, and makes the Limitations and Related headings self-describing. Adds the AI access management prerequisite link, corrects the CLI coverage claim to match what the page actually provides, points administrators at AI access management for verification, and uses the documented kill switch terminology. Co-Authored-By: Claude Opus 5 --- .../admin/mcp-server/gemini-enterprise.mdx | 104 ++++++++++++------ 1 file changed, 68 insertions(+), 36 deletions(-) diff --git a/product/admin/mcp-server/gemini-enterprise.mdx b/product/admin/mcp-server/gemini-enterprise.mdx index 8aed40c1..cebdb470 100644 --- a/product/admin/mcp-server/gemini-enterprise.mdx +++ b/product/admin/mcp-server/gemini-enterprise.mdx @@ -26,14 +26,18 @@ Setup spans two products and three roles. Plan for a Google Cloud administrator | Enable tools | Gemini Enterprise | Gemini Enterprise administrator | -Most of the Google Cloud steps have `gcloud` equivalents, and this page gives both. The command line is faster and easier to repeat across environments, so use it where you can. Two steps near the end have no API equivalent and must be done in the Google Cloud console. +Several Google Cloud steps have `gcloud` equivalents, and this page gives both wherever one exists. The command line is faster and easier to repeat across environments, so use it where you can. Creating the data store and enabling tools have no API equivalent and must be done in the Google Cloud console. ## Before you begin +Gather these before you start. + +- AI access management must be enabled for your tenant. See [Enable AI access management](/product/admin/enable-ai-access-management). - A Google Cloud project with a Gemini Enterprise app already created. - The [gcloud CLI](https://cloud.google.com/sdk/docs/install), authenticated with `gcloud auth login`. -- The `beta` component, which the gateway commands need: +- A Google Cloud administrator who can grant `roles/orgpolicy.policyAdmin` at the organization or folder level. Project **Owner** is not sufficient for the organization policy change in [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). +- The `beta` component, which the optional gateway commands need: ```bash gcloud components install beta @@ -43,11 +47,9 @@ Most of the Google Cloud steps have `gcloud` equivalents, and this page gives bo Install this before you start. Without it, `gcloud beta` commands stop at an interactive install prompt. In a script, that looks like a hang rather than an error. -- A Google Cloud administrator who can grant `roles/orgpolicy.policyAdmin` at the organization or folder level. Project **Owner** is not sufficient for the organization policy change in [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). - ### Required roles -Grant these on the Google Cloud project: +Grant these roles on the Google Cloud project. | Role | Why | | :--- | :--- | @@ -74,13 +76,15 @@ https://-mcp.conductor.one/v1 +You now have the MCP server URL for your tenant. + Your OAuth endpoints follow from your tenant subdomain. Confirm them against your tenant's published metadata: ```bash -curl -s https://-mcp.conductor.one/.well-known/oauth-authorization-server +curl -s https://YOUR_TENANT-mcp.conductor.one/.well-known/oauth-authorization-server ``` -You need three values from that response: +You need three values from that response. | Value | For a tenant named `acme` | | :--- | :--- | @@ -134,6 +138,8 @@ To confirm which APIs are enabled: gcloud services list --enabled --project=YOUR_PROJECT_ID ``` +Your project can now create data connectors and expose their tool actions. + `connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` back the tool actions a data connector exposes. Google's setup documentation does not list them, and tool discovery fails without them. @@ -172,6 +178,8 @@ gcloud org-policies describe \ --project=YOUR_PROJECT_ID --effective ``` +The effective policy reports `enforce: false`, and your project can create custom MCP data connectors. + Allow several minutes for the policy to propagate. Until it does, the console returns the same denial message, so a failure right after you apply the policy does not mean the policy is wrong. Setting this policy requires `roles/orgpolicy.policyAdmin` at the organization or folder level. @@ -188,10 +196,6 @@ C1 publishes a client metadata document for Gemini Enterprise. Use its URL as th https://.conductor.one/auth/v1/client-metadata/gemini-enterprise ``` - -A pre-registered client ID does not mean shared access. The client ID identifies Gemini Enterprise as an application. Each user still signs in to C1 through your identity provider, receives their own token, and is governed by their own access profiles. Per-user consent, audit, and revocation all work normally. - - This client has no secret, so nothing expires and nothing needs rotating. Configure it once and it keeps working. Do not create a client through C1's dynamic registration endpoint for this integration: those secrets expire one hour after they are issued, and re-registering does not extend the expiry. @@ -200,6 +204,10 @@ This client has no secret, so nothing expires and nothing needs rotating. Config Connect the C1 MCP gateway to your Gemini Enterprise app. + +The data connector name generates an ID that cannot be changed later. Decide the name before you begin this procedure. + + In the Google Cloud console, open **Gemini Enterprise** and select your app. @@ -208,10 +216,16 @@ In the Google Cloud console, open **Gemini Enterprise** and select your app. Select **Connected data stores** > **New data store**. -In **Select a data source**, search for `Custom MCP`, then select **Add MCP server** on the **Custom MCP Server** card. +In **Select a data source**, search for `Custom MCP`. + + +Select **Add MCP server** on the **Custom MCP Server** card. -For **Select your authentication method**, choose **OAuth 2.0** and complete the fields: +For **Select your authentication method**, choose **OAuth 2.0**. + + +Complete the authentication fields: | Field | Value | | :--- | :--- | @@ -229,16 +243,18 @@ For **Select your authentication method**, choose **OAuth 2.0** and complete the Select **Verify Auth**. A window opens for you to sign in through your identity provider and authorize the connection. -Select **Continue**, enter a **Data connector name**, and select **Create**. +Select **Continue**. + + +Enter a **Data connector name**. + + +Select **Create**. The form shows **Successfully logged in** after you authorize, and the connector reaches the **Active** state a minute or two after you create it. - -The data connector name generates an ID that cannot be changed later. Choose the name you want before you select **Create**. - - Four details on that form are easy to get wrong: - **Clear Use HTTP Basic Authentication.** It is selected by default. Leaving it selected sends the client ID and secret in an `Authorization` header, which does not work for a client that has no secret. @@ -248,7 +264,11 @@ Four details on that form are easy to get wrong: ## Enable the tools -Tools import disabled. Turn on the ones you want available to users. +Gemini Enterprise imports every tool in a disabled state. Turn on the ones you want available to users. + + +Wait for the connector state to reach **Active** before you start. The reload fails while the connector is still creating. + @@ -258,17 +278,16 @@ Open the data store and select the **Actions** tab. Select **Reload custom actions**. Gemini Enterprise queries your MCP server for its current tool list. -Select the tools to expose, then select **Enable actions**. +Select the tools to expose. + + +Select **Enable actions**. -Google recommends enabling no more than 100 actions per data store. +The tools you selected are now available to users in your Gemini Enterprise app. Google recommends enabling no more than 100 actions per data store. - -Wait for the connector state to reach **Active** before selecting **Reload custom actions**. The reload fails while the connector is still creating. - - -## Verify the connection +## Verify the Gemini Enterprise connection Tool discovery runs before authentication is proven, so seeing tools listed does not confirm your credentials are correct. You confirm the setup only when a user successfully calls a C1 tool. @@ -280,13 +299,15 @@ Open your Gemini Enterprise app as an end user and ask a question that needs a C Authorize the connection when prompted. Sign in through your identity provider and approve. -In C1, open your user profile menu and select **AI & API** > **AI connections**. The Gemini Enterprise connection appears, bound to that user. +As that same user in C1, open the user profile menu and select **AI & API** > **AI connections**. The Gemini Enterprise connection appears. Administrators can see connections for everyone under **AI access management** > **AI clients**. In C1, go to **Settings** > **System log** and filter on `activity_name starts with "mcp_"`. Tool calls appear as `mcp_tool_call` events attributed to the individual user. +The connection is working, and every tool call is attributed to the user who made it. + ## Optional: Publish through Agent Registry Agent Registry gives your organization a catalog of approved MCP servers, and Agent Gateway applies policy to agent traffic. Neither is required to connect Gemini Enterprise to C1, and the setup in the previous sections works without them. Add them when you want the C1 gateway to appear in a shared catalog alongside your other approved servers. @@ -297,6 +318,8 @@ Gemini Enterprise supports only **Agent-to-Anywhere (egress)** mode. Google's do ### Enable the additional APIs +Agent Registry and Agent Gateway need networking and platform APIs beyond the ones you already enabled. + ```bash gcloud services enable \ agentregistry.googleapis.com \ @@ -311,7 +334,7 @@ gcloud services enable \ ``` -`iap.googleapis.com` is missing from Google's published list of required APIs, and the authorization extension below fails without it. +`iap.googleapis.com` is missing from Google's published list of required APIs, and the authorization extension fails without it. ### Register the server @@ -355,11 +378,15 @@ gcloud agent-registry services create c1-mcp-gateway \ --display-name="C1 MCP Gateway" \ --mcp-server-spec-type=tool-spec \ --mcp-server-spec-content="$(cat toolspec.json)" \ - --interfaces="url=https://-mcp.conductor.one/v1,protocolBinding=jsonrpc" + --interfaces="url=https://YOUR_TENANT-mcp.conductor.one/v1,protocolBinding=jsonrpc" ``` +Agent Registry catalogs the server and projects it as a read-only entry that consumers can discover. + ### Create the gateway +The gateway routes and governs outbound agent traffic for the registry you just populated. + Save this as `gateway.yaml`: ```yaml @@ -381,6 +408,8 @@ gcloud network-services agent-gateways import c1-agent-gateway \ --project=YOUR_PROJECT_ID ``` +The gateway takes a minute or two to create. + The `registries` value must start with `//agentregistry.googleapis.com/`. A plain `projects/.../locations/...` path is rejected with `does not match the pattern`. There is no separate registry resource to create, because the registry is implicit for each project and location. @@ -397,7 +426,7 @@ In your Gemini Enterprise app, go to **Security** > **Configuration**. Under **Agent Gateway configuration**, enter the gateway resource name: ```text -projects/YOUR_PROJECT_ID/locations/us-central1/agentGateways/c1-agent-gateway +projects//locations/us-central1/agentGateways/c1-agent-gateway ``` @@ -428,18 +457,19 @@ The console reports **Agent gateway configuration saved**, and the C1 MCP Gatewa | Authorization works, then breaks about an hour later | The client was created through dynamic registration, and its secret expired. | Use the C1-published client ID. See [Get the OAuth client ID](#get-the-oauth-client-id). | | Users reauthorize constantly | `offline_access` is missing from the scopes, so C1 issues no refresh token. | Add `offline_access` and have users reconnect. | | `401` from the MCP server | The token is missing or not bound to the right resource. | Set **Authorization URL Parameters** to `&resource=https://-mcp.conductor.one/v1`. | -| The form will not accept an empty **Client Secret** | **Use HTTP Basic Authentication** is still selected. | Clear that checkbox. See [Create the data store](#create-the-data-store). | +| The form rejects an empty **Client Secret** | **Use HTTP Basic Authentication** is still selected. | Clear that checkbox. See [Create the data store](#create-the-data-store). | | C1 MCP Gateway does not appear under **MCP servers** | The gateway is not bound to the app, or the regions do not line up. | See [Bind the gateway to your app](#bind-the-gateway-to-your-app) and [Check your region requirements](#check-your-region-requirements). | | A `gcloud beta` command appears to hang | The `beta` component is not installed and the CLI is waiting at an install prompt. | Run `gcloud components install beta`, or add `--quiet`. | -## Limitations +## Gemini Enterprise integration limitations + +These constraints come from Gemini Enterprise and Google Cloud. - Gemini Enterprise supports egress (**Agent-to-Anywhere**) mode only. - MCP servers must use StreamableHTTP transport. Server-sent events are not supported. - VPC Service Controls and Private Service Connect are not supported for custom MCP data stores. - The MCP server needs a certificate from a publicly trusted authority. Self-signed certificates are rejected. - A gateway supports at most 5,000 registered resources. -- Google recommends a maximum of 100 enabled actions per data store. ## Frequently asked questions about connecting Gemini Enterprise @@ -456,8 +486,8 @@ The client is a public OAuth client with no secret. Client ID Metadata Document No. Connecting Gemini Enterprise to C1 works without it. Agent Gateway and Agent Registry publish the C1 gateway in a shared catalog of approved servers. Google's documentation notes that Gemini Enterprise data connector traffic does not trigger Agent Gateway policy enforcement, so adding it does not change how tool calls are governed. C1 governs the tool calls. - -In C1, open **AI access management** > **AI clients**, find the user's Gemini Enterprise connection, and revoke it. Their tokens stop working immediately. Everyone else is unaffected. + +In C1, open **AI access management** > **AI clients**, find the Gemini Enterprise client, and use the **kill switch**. It revokes all tokens for that client immediately. See [Manage AI clients](/product/admin/ai-clients). @@ -465,7 +495,9 @@ Yes. C1 records every MCP session and tool call in the system log. Filter on `ac -## Related pages +## Pages related to governing AI tool access + +These pages cover the C1 side of the integration. - [Manage AI clients](/product/admin/ai-clients) covers lifecycle states, the kill switch, and allowed client types. - [Connect to the C1 MCP](/product/admin/c1-mcp) covers the same gateway from desktop AI assistants. From 65216d452c7520b387f907875f9d09a7fe27a155 Mon Sep 17 00:00:00 2001 From: ltsch <140873092+ltsch@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:18:30 -0500 Subject: [PATCH 3/4] docs(mcp): rewrite Gemini Enterprise guide after end-to-end review A usability pass and an accuracy pass against Google's and C1's documentation and the C1 source found roughly thirty defects, thirteen of which stopped a reader outright. The page went out console-first in shape but had been written from lab notes, so several console paths named no values and several claims were lab observations presented as documented behavior. Reader-blocking fixes: - The API section named no APIs in the console path. It now leads with a table carrying the console display name, the service ID, and what each API is for, which serves both the console and CLI reader. - The organization policy section was CLI-only, despite being the one step that has to be handed to someone else. It now gives the console path first and a check-before-you-change command. - Added the C1-side prerequisite. A reader could complete every step and still get an empty action list because the authorizing user has no toolset, which was the most likely real-world outcome and appeared nowhere. - Added a table of the four values every step reuses, each with where to obtain it. Nothing previously said where the project ID or tenant came from, and one command referenced an engine ID the page never defined. - Confirmed the client metadata URL resolves before the reader depends on it, since the endpoint ships in a release not all tenants run. Accuracy fixes: - offline_access does not gate refresh-token issuance. Nothing in the token path reads the scope string; the gate is the client declaring the refresh_token grant. The causal claim and the troubleshooting row built on it are gone. - The one-hour dynamic-registration expiry applies to an unapproved registration. Stated unconditionally before. - roles/orgpolicy.policyAdmin is grantable at the organization level only, not organization or folder. - Google asks for roles/discoveryengine.editor, not .admin. - Client Secret is required by the console, so the page now says to enter a placeholder and explains that C1 never reads it. - Dropped the gcloud beta prerequisite and its troubleshooting row. Both commands that needed it are gone and the rest are GA. - The metadata document returns two values, not three. The MCP server URL comes from the C1 UI. - Replaced the borrowed system-log filter. It came from a page covering a different feature; AI access management logs a different schema. Structure: the Agent Registry path consumed a quarter of the page, could not be completed from it, and by Google's own documentation adds no governance to this traffic. It is now a short section that says what it is and links to Google's documentation, which removed the region table, the beta prerequisite, two roles rows and several troubleshooting rows along with it. Form caveats moved into the field table where the reader meets them rather than after the form is submitted, the action limit moved ahead of the selection step, verification gained a failure branch, and the limitations list separates what constrains the reader from what C1 already satisfies. Net 92 lines shorter. Co-Authored-By: Claude Opus 5 --- .../admin/mcp-server/gemini-enterprise.mdx | 460 +++++++----------- 1 file changed, 184 insertions(+), 276 deletions(-) diff --git a/product/admin/mcp-server/gemini-enterprise.mdx b/product/admin/mcp-server/gemini-enterprise.mdx index cebdb470..04037313 100644 --- a/product/admin/mcp-server/gemini-enterprise.mdx +++ b/product/admin/mcp-server/gemini-enterprise.mdx @@ -6,7 +6,7 @@ og:description: Give Gemini Enterprise users access to C1-governed tools, with e sidebarTitle: Connect Gemini Enterprise --- -{/* Editor Refresh: 2026-08-17 */} +{/* Editor Refresh: 2026-08-19 */} Google [Gemini Enterprise](https://cloud.google.com/gemini/enterprise) calls the C1 MCP gateway as a tool source. Your users ask Gemini Enterprise a question, Gemini calls a C1 tool on their behalf, and C1 enforces your access policies against that person's identity. Tool calls are attributed to individual users, not to a shared service account. @@ -16,110 +16,97 @@ Google [Gemini Enterprise](https://cloud.google.com/gemini/enterprise) calls the ## What you'll do -Setup spans two products and three roles. Plan for a Google Cloud administrator with organization-level permissions to be available. +Setup spans two products. Two stages depend on someone other than you, so line those up before you start. -| Stage | Where | Who | +| Stage | Where | Depends on | | :--- | :--- | :--- | -| Get the MCP server URL | C1 | C1 administrator | -| Enable APIs and adjust organization policy | Google Cloud | Google Cloud administrator | -| Create the data store and authorize | Gemini Enterprise | Gemini Enterprise administrator | -| Enable tools | Gemini Enterprise | Gemini Enterprise administrator | - - -Several Google Cloud steps have `gcloud` equivalents, and this page gives both wherever one exists. The command line is faster and easier to repeat across environments, so use it where you can. Creating the data store and enabling tools have no API equivalent and must be done in the Google Cloud console. - +| [Collect the values you'll reuse](#collect-the-values-youll-reuse) | C1 and Google Cloud | Nothing | +| [Enable the Google Cloud APIs](#enable-the-google-cloud-apis) | Google Cloud | A project editor | +| [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors) | Google Cloud | An **organization** policy administrator | +| [Get the OAuth client ID](#get-the-oauth-client-id) | C1 | Nothing | +| [Create the data store](#create-the-data-store) | Gemini Enterprise | Nothing | +| [Enable the actions](#enable-the-actions) | Gemini Enterprise | Tool access already granted in C1 | +| [Verify the connection](#verify-the-gemini-enterprise-connection) | Gemini Enterprise and C1 | A user with C1 tool access | ## Before you begin -Gather these before you start. +Confirm all of these before you start. The organization policy change in particular can take time to arrange. - AI access management must be enabled for your tenant. See [Enable AI access management](/product/admin/enable-ai-access-management). -- A Google Cloud project with a Gemini Enterprise app already created. -- The [gcloud CLI](https://cloud.google.com/sdk/docs/install), authenticated with `gcloud auth login`. -- A Google Cloud administrator who can grant `roles/orgpolicy.policyAdmin` at the organization or folder level. Project **Owner** is not sufficient for the organization policy change in [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). -- The `beta` component, which the optional gateway commands need: - - ```bash - gcloud components install beta - ``` - - - Install this before you start. Without it, `gcloud beta` commands stop at an interactive install prompt. In a script, that looks like a hang rather than an error. - +- **The users who will use Gemini Enterprise need C1 tool access already.** Their access profiles determine which tools they can call, and a user with no toolset sees no tools at all. See [Tools and toolsets](/product/admin/tools-and-toolsets). +- A Google Cloud project with a Gemini Enterprise app already created. See Google's [Create a Gemini Enterprise app](https://docs.cloud.google.com/gemini/enterprise/docs/create-app) documentation. +- Someone who holds `roles/orgpolicy.policyAdmin` at the **organization** level. This is not grantable at the project or folder level, and project **Owner** does not include it. +- **Optional.** The [gcloud CLI](https://cloud.google.com/sdk/docs/install), authenticated with `gcloud auth login`, if you prefer the command line for the Google Cloud steps. ### Required roles -Grant these roles on the Google Cloud project. +Grant these on the Google Cloud project, except where noted. -| Role | Why | -| :--- | :--- | -| `roles/serviceusage.serviceUsageAdmin` | Enable the required APIs | -| `roles/discoveryengine.admin` | Create the data store and authorize the connection | -| `roles/orgpolicy.policyAdmin` | Allow custom MCP data connectors. Must be granted at the organization or folder level | -| `roles/agentregistry.admin` | Register the server in Agent Registry. Only for [Optional: Publish through Agent Registry](#optional-publish-through-agent-registry) | -| `roles/compute.networkAdmin` and `roles/networksecurity.admin` | Create the gateway and its policy. Only for the optional Agent Registry path | +| Role | Scope | Why | +| :--- | :--- | :--- | +| `roles/serviceusage.serviceUsageAdmin` | Project | Enable the required APIs | +| `roles/discoveryengine.editor` | Project | Create the data store and authorize the connection | +| `roles/orgpolicy.policyAdmin` | **Organization** | Allow custom MCP data connectors | -## Get your C1 MCP server URL +To check what you already hold on the project: -Every C1 tenant has its own MCP server URL and its own OAuth endpoints. +```bash +gcloud projects get-iam-policy YOUR_PROJECT_ID \ + --flatten="bindings[].members" \ + --filter="bindings.members:user:YOUR_EMAIL" \ + --format="value(bindings.role)" +``` - - -In C1, open your user profile menu and select **AI & API** > **AI connections**. - - -Copy the MCP server URL at the top of the page. It looks like this: +To grant a project role: -```text -https://-mcp.conductor.one/v1 +```bash +gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ + --member="user:admin@yourdomain.com" \ + --role="roles/discoveryengine.editor" ``` - - -You now have the MCP server URL for your tenant. +## Collect the values you'll reuse -Your OAuth endpoints follow from your tenant subdomain. Confirm them against your tenant's published metadata: +Every step below reuses these four values. Collect them once. + +| Value | Where to get it | Example | +| :--- | :--- | :--- | +| **Tenant** | The subdomain of your C1 URL. It is also the prefix of your MCP server URL. | `acme` | +| **MCP server URL** | In C1, open your user profile menu and select **AI & API** > **AI connections**. Copy the URL shown at the top of the page. | `https://acme-mcp.conductor.one/v1` | +| **Project ID** | The Google Cloud console project picker, or `gcloud config get-value project`. | `acme-gemini` | +| **App location** | At the top of the Gemini Enterprise **Apps** page, next to **Current location**. | `global` | + +Your OAuth endpoints follow from the tenant. Confirm them against your tenant's published metadata: ```bash curl -s https://YOUR_TENANT-mcp.conductor.one/.well-known/oauth-authorization-server ``` -You need three values from that response. +Read two fields from that response: -| Value | For a tenant named `acme` | +| Field in the response | Value for tenant `acme` | | :--- | :--- | -| MCP server URL | `https://acme-mcp.conductor.one/v1` | -| Authorization URL | `https://acme.conductor.one/auth/v1/authorize` | -| Token URL | `https://acme.conductor.one/auth/v1/token` | +| `authorization_endpoint` | `https://acme.conductor.one/auth/v1/authorize` | +| `token_endpoint` | `https://acme.conductor.one/auth/v1/token` | -## Check your region requirements +## Enable the Google Cloud APIs -Your Gemini Enterprise app location determines every other region you pick. Find it at the top of the **Apps** page in the Google Cloud console, next to **Current location**. +Enable all six. In the console, go to **APIs & Services** > **Library**, search for the API by the name in the first column, and select **Enable**. The service ID is the identifier you use with the `gcloud` CLI. -| App location | Agent Gateway region | Agent Registry region | +| API to enable | Service ID | Why | | :--- | :--- | :--- | -| `global` | `us-central1` | `us-central1` or `global` | -| `us` | `us-central1` | `us-central1` | -| `eu` | `europe-west1` | `europe-west1` | +| Discovery Engine API | `discoveryengine.googleapis.com` | Backs Gemini Enterprise apps and data stores | +| Connectors API | `connectors.googleapis.com` | Backs the tool actions a data connector exposes | +| Application Integration API | `integrations.googleapis.com` | Backs the tool actions a data connector exposes | +| Secret Manager API | `secretmanager.googleapis.com` | Stores the connector's OAuth credentials | +| Identity and Access Management (IAM) API | `iam.googleapis.com` | Resolves the roles above | +| Organization Policy API | `orgpolicy.googleapis.com` | Required to read or change the policy in the next section | -Agent Registry does not support the `us` and `eu` multi-region locations. Use a specific region such as `us-central1`, or use `global`. These regions matter only if you follow [Optional: Publish through Agent Registry](#optional-publish-through-agent-registry). When regions do not line up, the server never appears in the data store list and no error explains why. +Google's setup documentation for custom MCP servers does not list any APIs. In C1 testing, tool discovery failed until `connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` were enabled, so enable all six. -## Enable the Google Cloud APIs - -Enable the APIs that back Gemini Enterprise data connectors and their tools. - - - -In the Google Cloud console, go to **APIs & Services** > **Library**. - - -Search for each API by name and select **Enable**. - - - -From the command line: +To enable them from the command line instead: ```bash gcloud services enable \ @@ -132,7 +119,7 @@ gcloud services enable \ --project=YOUR_PROJECT_ID ``` -To confirm which APIs are enabled: +To confirm which APIs are enabled on the project: ```bash gcloud services list --enabled --project=YOUR_PROJECT_ID @@ -140,13 +127,11 @@ gcloud services list --enabled --project=YOUR_PROJECT_ID Your project can now create data connectors and expose their tool actions. - -`connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` back the tool actions a data connector exposes. Google's setup documentation does not list them, and tool discovery fails without them. - - ## Allow custom MCP data connectors -Google Cloud blocks custom MCP data connectors by default. Creating the data store fails at the final step until an administrator turns the constraint off: +Google Cloud blocks custom MCP data connectors by default through the `constraints/discoveryengine.managed.disableCustomMcpServerConnector` organization policy. Turn it off for this project before you create the data store. + +If the policy is enforced, creating the data store fails at the final step with: ```text Operation denied by org policy on resource '...': @@ -155,7 +140,35 @@ Operation denied by org policy on resource '...': that use a custom MCP server as their data source."] ``` -Save this as `policy.yaml`: +Check whether it is enforced on your project: + +```bash +gcloud org-policies describe \ + discoveryengine.managed.disableCustomMcpServerConnector \ + --project=YOUR_PROJECT_ID --effective +``` + +The override is applied at the project level, but the person applying it needs `roles/orgpolicy.policyAdmin` at the organization level. + + + +In the Google Cloud console, go to **IAM & Admin** > **Organization policies**. + + +Filter for `discoveryengine.managed.disableCustomMcpServerConnector` and open it. + + +Select **Manage policy**. + + +Select **Override parent's policy**, then set the enforcement to **Off**. + + +Select **Set policy**. + + + +From the command line, save this as `policy.yaml`: ```yaml name: projects/YOUR_PROJECT_ID/policies/discoveryengine.managed.disableCustomMcpServerConnector @@ -170,34 +183,47 @@ Then apply it: gcloud org-policies set-policy policy.yaml ``` -Confirm the change took effect: +Re-run the `describe` command above. The effective policy reports `enforce: false`, and your project can create custom MCP data connectors. + + +Allow several minutes for the change to propagate. Until it does, the console returns the same denial message, so a failure immediately after you apply the policy does not mean the policy is wrong. + + +### Optional: Allow the C1 hostnames + +If your organization restricts which external hosts a data connector may reach, it enforces `constraints/discoveryengine.allowedEgressFqdns`. Check it the same way: ```bash -gcloud org-policies describe \ - discoveryengine.managed.disableCustomMcpServerConnector \ +gcloud org-policies describe discoveryengine.allowedEgressFqdns \ --project=YOUR_PROJECT_ID --effective ``` -The effective policy reports `enforce: false`, and your project can create custom MCP data connectors. - - -Allow several minutes for the policy to propagate. Until it does, the console returns the same denial message, so a failure right after you apply the policy does not mean the policy is wrong. Setting this policy requires `roles/orgpolicy.policyAdmin` at the organization or folder level. - - -Your organization may also restrict which external hosts a data connector can reach. If so, allow the two hostnames your tenant uses, `-mcp.conductor.one` and `.conductor.one`. Use hostnames only, not full URLs. +If it is set, add the two hostnames your tenant uses, `-mcp.conductor.one` and `.conductor.one`. Use hostnames only, not full URLs. ## Get the OAuth client ID -Gemini Enterprise authenticates each user to C1 with the OAuth 2.0 authorization code flow. It needs an OAuth client that already exists, because it does not register itself the way Claude Code and Cursor do. +Gemini Enterprise authenticates each user to C1 with the OAuth 2.0 authorization code flow. It needs an OAuth client that already exists, because it does not register one itself. -C1 publishes a client metadata document for Gemini Enterprise. Use its URL as the client ID: +C1 publishes a client metadata document for Gemini Enterprise. Its URL is your client ID: ```text https://.conductor.one/auth/v1/client-metadata/gemini-enterprise ``` +Confirm it resolves before you continue. This returns JSON with a `client_id` field matching the URL you requested: + +```bash +curl -s https://YOUR_TENANT.conductor.one/auth/v1/client-metadata/gemini-enterprise +``` + + +A `404` means your tenant is not yet running a release that publishes this document. [Contact the C1 support team](mailto:support@c1.ai) to confirm availability for your tenant before continuing. + + -This client has no secret, so nothing expires and nothing needs rotating. Configure it once and it keeps working. Do not create a client through C1's dynamic registration endpoint for this integration: those secrets expire one hour after they are issued, and re-registering does not extend the expiry. +This client has no secret, so nothing expires and nothing needs rotating. Configure it once and it keeps working. + +Do not register a client through C1's dynamic registration endpoint for this integration. An unapproved dynamic registration's secret expires one hour after it is issued, and rotating it preserves the original expiry rather than extending it, so the connector fails at its first token refresh. ## Create the data store @@ -205,7 +231,7 @@ This client has no secret, so nothing expires and nothing needs rotating. Config Connect the C1 MCP gateway to your Gemini Enterprise app. -The data connector name generates an ID that cannot be changed later. Decide the name before you begin this procedure. +The data connector name generates an ID that cannot be changed later. Choose it before you begin, and keep it short and lowercase with hyphens, such as `c1-mcp-gateway`. @@ -213,31 +239,31 @@ The data connector name generates an ID that cannot be changed later. Decide the In the Google Cloud console, open **Gemini Enterprise** and select your app. -Select **Connected data stores** > **New data store**. +Select **Connected data stores**, then select **New data store**. In **Select a data source**, search for `Custom MCP`. -Select **Add MCP server** on the **Custom MCP Server** card. +On the **Custom MCP Server** card, select **Add MCP server**. -For **Select your authentication method**, choose **OAuth 2.0**. +Under **Authentication settings**, choose **OAuth 2.0**. -Complete the authentication fields: +Complete the fields. The third column is where this form most often goes wrong. -| Field | Value | -| :--- | :--- | -| **MCP Server URL** | `https://-mcp.conductor.one/v1` | -| **Authorization URL** | `https://.conductor.one/auth/v1/authorize` | -| **Authorization URL Parameters** | `&resource=https://-mcp.conductor.one/v1` | -| **Token URL** | `https://.conductor.one/auth/v1/token` | -| **Client ID** | `https://.conductor.one/auth/v1/client-metadata/gemini-enterprise` | -| **Client Secret** | Leave empty | -| **Scopes** | `openid profile email offline_access` | -| **Enable PKCE Support** | Selected | -| **Use HTTP Basic Authentication** | Cleared | +| Field | Value | Watch out for | +| :--- | :--- | :--- | +| **MCP Server URL** | `https://-mcp.conductor.one/v1` | Ends with `/v1`. | +| **Authorization URL** | `https://.conductor.one/auth/v1/authorize` | No trailing parameters. | +| **Authorization URL Parameters** | `&resource=https://-mcp.conductor.one/v1` | Required. C1 binds tokens to a resource, so omitting this yields a token your MCP endpoint rejects. | +| **Token URL** | `https://.conductor.one/auth/v1/token` | Nothing | +| **Client ID** | Your client metadata document URL | The full `https://` URL, not a bare identifier. | +| **Client Secret** | Any placeholder, such as `unused` | The console treats this as required. C1 never reads it, because this client has no secret. | +| **Scopes** | `openid profile email offline_access` | Space-separated, not comma-separated. | +| **Enable PKCE Support** | Selected | Not selected by default. C1 requires PKCE, so the flow fails without it. | +| **Use HTTP Basic Authentication** | Cleared | **Selected by default.** Leaving it selected sends credentials in an `Authorization` header, which does not work for a client with no secret. | Select **Verify Auth**. A window opens for you to sign in through your identity provider and authorize the connection. @@ -246,7 +272,7 @@ Select **Verify Auth**. A window opens for you to sign in through your identity Select **Continue**. -Enter a **Data connector name**. +Enter your **Data connector name**. Select **Create**. @@ -255,16 +281,9 @@ Select **Create**. The form shows **Successfully logged in** after you authorize, and the connector reaches the **Active** state a minute or two after you create it. -Four details on that form are easy to get wrong: - -- **Clear Use HTTP Basic Authentication.** It is selected by default. Leaving it selected sends the client ID and secret in an `Authorization` header, which does not work for a client that has no secret. -- **Leave Client Secret empty.** The field is optional even though Client ID, Authorization URL, and Token URL are marked required. -- **Include `offline_access` in the scopes.** Without it C1 issues no refresh token, and users reauthorize every time their access token expires. -- **Set Authorization URL Parameters.** C1 binds tokens to a specific resource, so the `resource` parameter scopes the issued token to your MCP endpoint. - -## Enable the tools +## Enable the actions -Gemini Enterprise imports every tool in a disabled state. Turn on the ones you want available to users. +Gemini Enterprise calls MCP tools *actions*, and imports every one of them turned off. Turn on only the actions your users need: Google recommends no more than 100 per data store, and a shorter list makes the agent's tool selection more accurate. Wait for the connector state to reach **Active** before you start. The reload fails while the connector is still creating. @@ -278,220 +297,109 @@ Open the data store and select the **Actions** tab. Select **Reload custom actions**. Gemini Enterprise queries your MCP server for its current tool list. -Select the tools to expose. +Select the actions to expose. Select **Enable actions**. -The tools you selected are now available to users in your Gemini Enterprise app. Google recommends enabling no more than 100 actions per data store. +The actions you selected are now available to users in your Gemini Enterprise app. ## Verify the Gemini Enterprise connection -Tool discovery runs before authentication is proven, so seeing tools listed does not confirm your credentials are correct. You confirm the setup only when a user successfully calls a C1 tool. +Seeing actions listed does not confirm your credentials work. You confirm the setup only when a user successfully calls a C1 tool. -Open your Gemini Enterprise app as an end user and ask a question that needs a C1 tool, such as "Who has access to Salesforce?" +Open your Gemini Enterprise app as an end user who has C1 tool access, and ask a question that needs a C1 tool, such as "Who has access to" followed by an application you have connected to C1. Authorize the connection when prompted. Sign in through your identity provider and approve. -As that same user in C1, open the user profile menu and select **AI & API** > **AI connections**. The Gemini Enterprise connection appears. Administrators can see connections for everyone under **AI access management** > **AI clients**. +In C1, go to **AI access management** > **AI clients**. The Gemini Enterprise client appears, bound to that user. Users can see their own connections under their profile menu at **AI & API** > **AI connections**. -In C1, go to **Settings** > **System log** and filter on `activity_name starts with "mcp_"`. Tool calls appear as `mcp_tool_call` events attributed to the individual user. +Confirm the tool call was logged. Every call through C1 MCP records the end user, the tool, the result, and a denial reason when refused. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). The connection is working, and every tool call is attributed to the user who made it. -## Optional: Publish through Agent Registry - -Agent Registry gives your organization a catalog of approved MCP servers, and Agent Gateway applies policy to agent traffic. Neither is required to connect Gemini Enterprise to C1, and the setup in the previous sections works without them. Add them when you want the C1 gateway to appear in a shared catalog alongside your other approved servers. - - -Gemini Enterprise supports only **Agent-to-Anywhere (egress)** mode. Google's documentation states that traffic between Gemini Enterprise agents and their data connectors does not trigger Agent Gateway policy enforcement, so treat this path as catalog publishing rather than traffic governance. - +If the agent does not call a tool, returns nothing, or reports a denial, see [Troubleshoot Gemini Enterprise connection errors](#troubleshoot-gemini-enterprise-connection-errors). A denial that names a missing toolset or access profile is C1 working as configured, not a broken integration. -### Enable the additional APIs +## Optional: Govern the server through Agent Registry -Agent Registry and Agent Gateway need networking and platform APIs beyond the ones you already enabled. - -```bash -gcloud services enable \ - agentregistry.googleapis.com \ - networkservices.googleapis.com \ - networksecurity.googleapis.com \ - compute.googleapis.com \ - dns.googleapis.com \ - iap.googleapis.com \ - aiplatform.googleapis.com \ - modelarmor.googleapis.com \ - --project=YOUR_PROJECT_ID -``` - - -`iap.googleapis.com` is missing from Google's published list of required APIs, and the authorization extension fails without it. - - -### Register the server - -Describe the tools you want catalogued in a `toolspec.json` file. Each tool needs `name`, `description`, and `inputSchema`, and the file is limited to 10 KB. - -```json -{ - "tools": [ - { - "name": "find_api_objects", - "description": "Query C1 objects by identifiers, search text, or filters.", - "inputSchema": { - "type": "object", - "properties": { - "object_type": { "type": "string" }, - "query": { "type": "string" } - }, - "required": ["object_type"] - }, - "annotations": { - "title": "Find API Objects", - "readOnlyHint": true, - "idempotentHint": true - } - } - ] -} -``` +Agent Registry gives your organization a catalog of approved MCP servers, and Agent Gateway is the policy enforcement point for agent traffic. Neither is required here, and the setup above works without both. -`inputSchema` is required on every tool, even though Google's published example omits it. Without it, registration fails with `invalid MCP tool spec content: tools.0: inputSchema is required`. +Adding them does not change how these tool calls are governed. Google's documentation states that traffic to MCP servers added as a data connector does not pass through Agent Gateway, and Agent Gateway policies do not apply to it. C1 governs the tool calls. Use this path when you want the C1 gateway listed in a shared catalog alongside your other approved servers, not to add enforcement. -Register the server: - -```bash -gcloud agent-registry services create c1-mcp-gateway \ - --project=YOUR_PROJECT_ID \ - --location=us-central1 \ - --display-name="C1 MCP Gateway" \ - --mcp-server-spec-type=tool-spec \ - --mcp-server-spec-content="$(cat toolspec.json)" \ - --interfaces="url=https://YOUR_TENANT-mcp.conductor.one/v1,protocolBinding=jsonrpc" -``` - -Agent Registry catalogs the server and projects it as a read-only entry that consumers can discover. +If you want that catalog entry, follow Google's own documentation, which stays current with the regional rules and command surface: -### Create the gateway +- [Register MCP servers in Agent Registry](https://docs.cloud.google.com/agent-registry/register-mcp-servers) +- [Set up an Agent Gateway](https://docs.cloud.google.com/gemini-enterprise-agent-platform/govern/gateways/set-up-agent-gateway) +- [Import MCP servers from Agent Registry](https://docs.cloud.google.com/gemini/enterprise/docs/connectors/custom-mcp-server/import-govern-mcp-server-agent-registry) -The gateway routes and governs outbound agent traffic for the registry you just populated. +Three things that are easy to miss on that path: -Save this as `gateway.yaml`: +- **Your app, gateway, and registry regions must align**, and Google's import documentation has the current table. A `global` or `us` app pairs with a `us-central1` gateway; an `eu` app pairs with `europe-west1`. When they do not align, the server never appears in the data store list and no error explains why. +- **Each app must be pointed at the gateway explicitly**, under **Security** > **Configuration** > **Agent Gateway configuration** in the app. Creating a gateway is not enough, and until an app is bound to one, no registered server appears in its data store list. +- **Every tool in a `toolspec.json` needs an `inputSchema`.** Google's published example omits it, and registration fails with `invalid MCP tool spec content: tools.0: inputSchema is required`. -```yaml -name: c1-agent-gateway -protocols: - - MCP -googleManaged: - governedAccessPath: AGENT_TO_ANYWHERE -registries: - - //agentregistry.googleapis.com/projects/YOUR_PROJECT_ID/locations/us-central1 -``` - -Then import it: - -```bash -gcloud network-services agent-gateways import c1-agent-gateway \ - --source=gateway.yaml \ - --location=us-central1 \ - --project=YOUR_PROJECT_ID -``` +## Troubleshoot Gemini Enterprise connection errors -The gateway takes a minute or two to create. +| Symptom | Cause | Fix | +| :--- | :--- | :--- | +| `Operation denied by org policy ... disableCustomMcpServerConnector` | The organization policy blocks custom MCP data connectors, or the override has not propagated. | Turn the constraint off and wait several minutes. See [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). | +| The override is set but the denial persists | An enforced organization- or folder-level policy overrides your project setting. | Re-run the `describe --effective` command. If it still reports `enforce: true`, ask your organization policy administrator to add the project exception. | +| `PERMISSION_DENIED` on `gcloud services enable` | The caller lacks `roles/serviceusage.serviceUsageAdmin` on the project. | Grant it. See [Required roles](#required-roles). | +| `404` on the client metadata URL | Your tenant is not running a release that publishes the Gemini Enterprise client document. | [Contact the C1 support team](mailto:support@c1.ai). | +| **We encountered some problems during authentication** | The client ID is wrong, or the sign-in window was closed or blocked. | Confirm the client ID resolves, allow popups for the console, and retry **Verify Auth**. | +| The form will not accept an empty **Client Secret** | The console treats the field as required. | Enter any placeholder. C1 never reads it. | +| **Failed to reload custom actions** | The connector is still creating, or the tool action APIs are not enabled. | Wait for **Active**, then confirm `connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` are enabled. | +| **Reload custom actions** succeeds but the list is empty | The authorizing user has no C1 toolset, so C1 exposes no tools to them. | Assign an access profile that includes the tools you expect. See [Tools and toolsets](/product/admin/tools-and-toolsets). | +| A user's tool calls are denied while another user's succeed | C1 is enforcing that user's access profile. This is expected behavior. | Check the denial reason in the audit log. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). | +| Authorization works, then breaks about an hour later | The connector uses a dynamically registered client whose secret expired. | Use the C1-published client ID. See [Get the OAuth client ID](#get-the-oauth-client-id). | +| Tool calls fail immediately after a working **Verify Auth** | The token is not bound to your MCP endpoint. | Set **Authorization URL Parameters** to `&resource=https://-mcp.conductor.one/v1`. | -The `registries` value must start with `//agentregistry.googleapis.com/`. A plain `projects/.../locations/...` path is rejected with `does not match the pattern`. There is no separate registry resource to create, because the registry is implicit for each project and location. +The data connector name cannot be changed after creation. To correct an authentication value, edit the existing connector's settings rather than recreating it. To change the name, create a new data store and remove the old one. -### Bind the gateway to your app - -Creating the gateway is not enough. Each Gemini Enterprise app must point at it explicitly. Until you do this, the data store list shows a **Configure Agent Gateway** prompt and no registered servers appear. - - - -In your Gemini Enterprise app, go to **Security** > **Configuration**. - - -Under **Agent Gateway configuration**, enter the gateway resource name: - -```text -projects//locations/us-central1/agentGateways/c1-agent-gateway -``` - - -Select **Save**. - - - -From the command line: - -```bash -curl -X PATCH \ - -H "Authorization: Bearer $(gcloud auth print-access-token)" \ - -H "Content-Type: application/json" \ - -H "X-Goog-User-Project: YOUR_PROJECT_ID" \ - -d '{"agentGatewaySetting":{"defaultEgressAgentGateway":{"name":"projects/YOUR_PROJECT_ID/locations/us-central1/agentGateways/c1-agent-gateway"}}}' \ - "https://discoveryengine.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/global/collections/default_collection/engines/YOUR_ENGINE_ID?updateMask=agentGatewaySetting.defaultEgressAgentGateway.name" -``` - -The console reports **Agent gateway configuration saved**, and the C1 MCP Gateway card then appears under **MCP servers** when you create a data store. - -## Troubleshoot Gemini Enterprise connection errors - -| Symptom | Cause | Fix | -| :--- | :--- | :--- | -| `Operation denied by org policy ... disableCustomMcpServerConnector` | The organization policy blocks custom MCP data connectors. | Turn the constraint off and wait for propagation. See [Allow custom MCP data connectors](#allow-custom-mcp-data-connectors). | -| **We encountered some problems during authentication** | The redirect URI in the client metadata document does not match what Gemini Enterprise sent. | Use the C1-published client ID from [Get the OAuth client ID](#get-the-oauth-client-id). | -| **Failed to reload custom actions** | The connector is still creating, or the tool actions APIs are not enabled. | Wait for the connector state to reach **Active**, then confirm `connectors.googleapis.com`, `integrations.googleapis.com`, and `secretmanager.googleapis.com` are enabled. | -| Authorization works, then breaks about an hour later | The client was created through dynamic registration, and its secret expired. | Use the C1-published client ID. See [Get the OAuth client ID](#get-the-oauth-client-id). | -| Users reauthorize constantly | `offline_access` is missing from the scopes, so C1 issues no refresh token. | Add `offline_access` and have users reconnect. | -| `401` from the MCP server | The token is missing or not bound to the right resource. | Set **Authorization URL Parameters** to `&resource=https://-mcp.conductor.one/v1`. | -| The form rejects an empty **Client Secret** | **Use HTTP Basic Authentication** is still selected. | Clear that checkbox. See [Create the data store](#create-the-data-store). | -| C1 MCP Gateway does not appear under **MCP servers** | The gateway is not bound to the app, or the regions do not line up. | See [Bind the gateway to your app](#bind-the-gateway-to-your-app) and [Check your region requirements](#check-your-region-requirements). | -| A `gcloud beta` command appears to hang | The `beta` component is not installed and the CLI is waiting at an install prompt. | Run `gcloud components install beta`, or add `--quiet`. | - -## Gemini Enterprise integration limitations +## What this integration cannot do These constraints come from Gemini Enterprise and Google Cloud. -- Gemini Enterprise supports egress (**Agent-to-Anywhere**) mode only. -- MCP servers must use StreamableHTTP transport. Server-sent events are not supported. -- VPC Service Controls and Private Service Connect are not supported for custom MCP data stores. -- The MCP server needs a certificate from a publicly trusted authority. Self-signed certificates are rejected. -- A gateway supports at most 5,000 registered resources. +- **VPC Service Controls and Private Service Connect are not supported** for custom MCP data stores. If your Google Cloud perimeter requires either, this integration cannot run inside it. +- Gemini Enterprise supports **egress mode only**. It calls out to your MCP server; your MCP server cannot call in. +- Google recommends a maximum of **100 enabled actions** per data store. + +C1's gateway already satisfies Google's other requirements for a custom MCP server: it uses StreamableHTTP transport rather than server-sent events, and it presents a certificate from a publicly trusted authority. ## Frequently asked questions about connecting Gemini Enterprise -No. The client ID identifies Gemini Enterprise as an application, not as a user. Every person authorizes individually through your identity provider and receives their own token. C1 evaluates each tool call against that person's access profiles, and their activity appears under their own identity in the system log. +No. The client ID identifies Gemini Enterprise as an application, not as a user. Every person authorizes individually through your identity provider and receives their own token. C1 evaluates each tool call against that person's access profiles, and their activity is logged under their own identity. - -The client is a public OAuth client with no secret. Client ID Metadata Document clients cannot use shared secrets, so C1 ignores the field. Security comes from the authorization code flow with PKCE, which you turn on with **Enable PKCE Support**. + +The client is a public OAuth client with no secret. Client ID Metadata Document clients cannot use shared secrets, so C1 never reads the field. Security comes from the authorization code flow with PKCE, which you turn on with **Enable PKCE Support**. -No. Connecting Gemini Enterprise to C1 works without it. Agent Gateway and Agent Registry publish the C1 gateway in a shared catalog of approved servers. Google's documentation notes that Gemini Enterprise data connector traffic does not trigger Agent Gateway policy enforcement, so adding it does not change how tool calls are governed. C1 governs the tool calls. +No. Google's documentation states that traffic to MCP servers added as a data connector does not pass through Agent Gateway, so adding it does not change how these tool calls are governed. C1 governs the tool calls. See [Optional: Govern the server through Agent Registry](#optional-govern-the-server-through-agent-registry). -In C1, open **AI access management** > **AI clients**, find the Gemini Enterprise client, and use the **kill switch**. It revokes all tokens for that client immediately. See [Manage AI clients](/product/admin/ai-clients). +In C1, open **AI access management** > **AI clients**, find the Gemini Enterprise client, and use its **kill switch**. It revokes all tokens for that client immediately, for every user. See [Manage AI clients](/product/admin/ai-clients). -Yes. C1 records every MCP session and tool call in the system log. Filter on `activity_name starts with "mcp_"` to see sessions and calls, each attributed to the user who made them. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). +Yes. Every tool call through C1 MCP is logged with the end user, the tool, the result, and a denial reason when refused. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). @@ -499,7 +407,7 @@ Yes. C1 records every MCP session and tool call in the system log. Filter on `ac These pages cover the C1 side of the integration. +- [Tools and toolsets](/product/admin/tools-and-toolsets) covers the access profiles that decide which tools each user can call. - [Manage AI clients](/product/admin/ai-clients) covers lifecycle states, the kill switch, and allowed client types. - [Connect to the C1 MCP](/product/admin/c1-mcp) covers the same gateway from desktop AI assistants. -- [AI access management](/product/admin/aiam-overview) covers the access profiles and toolsets that decide what each user's tools can do. -- [Audit AI tool usage](/product/admin/audit-ai-tool-usage) covers reviewing MCP activity in the system log. +- [Audit AI tool usage](/product/admin/audit-ai-tool-usage) covers what C1 logs for every tool call. From 4e030a3e9c29c2240039bf468972e69c7e856318 Mon Sep 17 00:00:00 2001 From: ltsch <140873092+ltsch@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:20:40 -0500 Subject: [PATCH 4/4] docs(mcp): align Gemini Enterprise guide with Google's documented values Follow-up corrections from the accuracy pass. Client Secret now says to enter `none`, which is the value Google's own documentation gives for PKCE clients, rather than an arbitrary placeholder. The field is required by the console even though PKCE needs no secret. The 100-action figure is a documented maximum, not a recommendation. Softened the orgpolicy.policyAdmin claim. Project Owner is genuinely insufficient and an organization-level grant is what worked in testing, but the page asserted that a project-level grant is impossible, which Google does not state. Added the two things most likely to strand someone on the optional Agent Registry path: the gateway denies egress until the calling identity is authorized through IAM, and C1's client metadata self-fetch requires a publicly resolving tenant hostname, which affects self-hosted installations. Co-Authored-By: Claude Opus 5 --- product/admin/mcp-server/gemini-enterprise.mdx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/product/admin/mcp-server/gemini-enterprise.mdx b/product/admin/mcp-server/gemini-enterprise.mdx index 04037313..ce884a26 100644 --- a/product/admin/mcp-server/gemini-enterprise.mdx +++ b/product/admin/mcp-server/gemini-enterprise.mdx @@ -35,7 +35,7 @@ Confirm all of these before you start. The organization policy change in particu - AI access management must be enabled for your tenant. See [Enable AI access management](/product/admin/enable-ai-access-management). - **The users who will use Gemini Enterprise need C1 tool access already.** Their access profiles determine which tools they can call, and a user with no toolset sees no tools at all. See [Tools and toolsets](/product/admin/tools-and-toolsets). - A Google Cloud project with a Gemini Enterprise app already created. See Google's [Create a Gemini Enterprise app](https://docs.cloud.google.com/gemini/enterprise/docs/create-app) documentation. -- Someone who holds `roles/orgpolicy.policyAdmin` at the **organization** level. This is not grantable at the project or folder level, and project **Owner** does not include it. +- Someone who holds `roles/orgpolicy.policyAdmin`. Project **Owner** does not include it. In C1 testing, an organization-level grant was needed before the policy change below would apply. - **Optional.** The [gcloud CLI](https://cloud.google.com/sdk/docs/install), authenticated with `gcloud auth login`, if you prefer the command line for the Google Cloud steps. ### Required roles @@ -46,7 +46,7 @@ Grant these on the Google Cloud project, except where noted. | :--- | :--- | :--- | | `roles/serviceusage.serviceUsageAdmin` | Project | Enable the required APIs | | `roles/discoveryengine.editor` | Project | Create the data store and authorize the connection | -| `roles/orgpolicy.policyAdmin` | **Organization** | Allow custom MCP data connectors | +| `roles/orgpolicy.policyAdmin` | **Organization** | Allow custom MCP data connectors. Project **Owner** is not sufficient. | To check what you already hold on the project: @@ -148,7 +148,7 @@ gcloud org-policies describe \ --project=YOUR_PROJECT_ID --effective ``` -The override is applied at the project level, but the person applying it needs `roles/orgpolicy.policyAdmin` at the organization level. +The override applies at the project level, but the person applying it needs `roles/orgpolicy.policyAdmin`, which project **Owner** does not include. @@ -260,7 +260,7 @@ Complete the fields. The third column is where this form most often goes wrong. | **Authorization URL Parameters** | `&resource=https://-mcp.conductor.one/v1` | Required. C1 binds tokens to a resource, so omitting this yields a token your MCP endpoint rejects. | | **Token URL** | `https://.conductor.one/auth/v1/token` | Nothing | | **Client ID** | Your client metadata document URL | The full `https://` URL, not a bare identifier. | -| **Client Secret** | Any placeholder, such as `unused` | The console treats this as required. C1 never reads it, because this client has no secret. | +| **Client Secret** | `none` | PKCE needs no secret, but the console requires a value in this field, and Google's documentation says to enter `none`. C1 never reads it. | | **Scopes** | `openid profile email offline_access` | Space-separated, not comma-separated. | | **Enable PKCE Support** | Selected | Not selected by default. C1 requires PKCE, so the flow fails without it. | | **Use HTTP Basic Authentication** | Cleared | **Selected by default.** Leaving it selected sends credentials in an `Authorization` header, which does not work for a client with no secret. | @@ -283,7 +283,7 @@ The form shows **Successfully logged in** after you authorize, and the connector ## Enable the actions -Gemini Enterprise calls MCP tools *actions*, and imports every one of them turned off. Turn on only the actions your users need: Google recommends no more than 100 per data store, and a shorter list makes the agent's tool selection more accurate. +Gemini Enterprise calls MCP tools *actions*, and imports every one of them turned off. Turn on only the actions your users need: a data store supports a maximum of 100 enabled actions, and a shorter list makes the agent's tool selection more accurate. Wait for the connector state to reach **Active** before you start. The reload fails while the connector is still creating. @@ -348,6 +348,7 @@ Three things that are easy to miss on that path: - **Your app, gateway, and registry regions must align**, and Google's import documentation has the current table. A `global` or `us` app pairs with a `us-central1` gateway; an `eu` app pairs with `europe-west1`. When they do not align, the server never appears in the data store list and no error explains why. - **Each app must be pointed at the gateway explicitly**, under **Security** > **Configuration** > **Agent Gateway configuration** in the app. Creating a gateway is not enough, and until an app is bound to one, no registered server appears in its data store list. - **Every tool in a `toolspec.json` needs an `inputSchema`.** Google's published example omits it, and registration fails with `invalid MCP tool spec content: tools.0: inputSchema is required`. +- **The gateway denies egress until you authorize it.** By default it allows traffic only to resources explicitly authorized through IAM, so the identity making the call needs the egress role for each destination it should reach. ## Troubleshoot Gemini Enterprise connection errors @@ -364,6 +365,7 @@ Three things that are easy to miss on that path: | A user's tool calls are denied while another user's succeed | C1 is enforcing that user's access profile. This is expected behavior. | Check the denial reason in the audit log. See [Audit AI tool usage](/product/admin/audit-ai-tool-usage). | | Authorization works, then breaks about an hour later | The connector uses a dynamically registered client whose secret expired. | Use the C1-published client ID. See [Get the OAuth client ID](#get-the-oauth-client-id). | | Tool calls fail immediately after a working **Verify Auth** | The token is not bound to your MCP endpoint. | Set **Authorization URL Parameters** to `&resource=https://-mcp.conductor.one/v1`. | +| `failed to fetch client metadata` | C1 fetches its own client metadata document over the public internet, and your tenant hostname does not resolve publicly. | This affects self-hosted installations rather than C1 cloud tenants. [Contact the C1 support team](mailto:support@c1.ai). | The data connector name cannot be changed after creation. To correct an authentication value, edit the existing connector's settings rather than recreating it. To change the name, create a new data store and remove the old one. @@ -375,7 +377,7 @@ These constraints come from Gemini Enterprise and Google Cloud. - **VPC Service Controls and Private Service Connect are not supported** for custom MCP data stores. If your Google Cloud perimeter requires either, this integration cannot run inside it. - Gemini Enterprise supports **egress mode only**. It calls out to your MCP server; your MCP server cannot call in. -- Google recommends a maximum of **100 enabled actions** per data store. +- A data store supports a maximum of **100 enabled actions**. C1's gateway already satisfies Google's other requirements for a custom MCP server: it uses StreamableHTTP transport rather than server-sent events, and it presents a certificate from a publicly trusted authority.