MCP Connector¶
ENTERPRISE Phase 1
The MCP Connector is an ENTERPRISE feature. Phase 1 is read-only and exposes tools only. It does not rotate credentials, start scans, change policy, or manage secrets.
The CertifyClouds MCP Connector lets approved hosted AI clients query your CertifyClouds deployment over the Model Context Protocol (MCP). It is designed for security teams that want natural-language access to expiry, asset, dependency, compliance, and audit data without exposing secret values or granting write access.
CertifyClouds is the MCP resource server. Your Microsoft Entra ID tenant remains the OAuth authorization server. CertifyClouds validates Entra-issued bearer tokens on every MCP request and then applies its own license, role, tenant-scope, tool-policy, audit, and redaction rules.
Protocol and client status
CertifyClouds prefers MCP 2025-11-25 using Streamable HTTP at /api/mcp. For current client interoperability it also negotiates MCP 2025-03-26 when the client explicitly requests that revision. This is a narrow compatibility path; 2025-11-25 remains the preferred CertifyClouds contract.
The MCP Connector Phase 1 is live for ENTERPRISE deployments in CertifyClouds 1.7.2. Hosted ChatGPT custom app and Claude.ai custom connector flows completed Entra authorization, tool discovery, and read-only tool calls during lab validation on 2026-07-13.
ChatGPT developer mode is currently available to Pro, Plus, Business, Enterprise, and Education accounts on ChatGPT web. Confirm the current OpenAI developer-mode requirements before creating a ChatGPT client registration.
Claude currently supports remote custom connectors on Free, Pro, Max, Team, and Enterprise plans; Free accounts are limited to one custom connector. Team and Enterprise connectors must first be added by an organization owner. Confirm the current Claude connector requirements before creating a Claude client registration.
What Phase 1 Provides¶
Phase 1 exposes these read-only MCP tools:
| Tool | Purpose | Required scope |
|---|---|---|
cc_list_tenant_scopes | Lists the home, all, and tenant:<id> scopes the caller may use. | Available after authentication |
cc_list_expiring_credentials | Lists secrets, certificates, App Registration credentials, and B2C credentials expiring within a requested window. | Mcp.Assets.Read |
cc_search_assets | Searches Key Vault assets by vault, subscription, type, tag, status, and expiry. | Mcp.Assets.Read |
cc_get_asset_detail | Returns metadata for one asset or credential. Secret values and value-shaped hints are never returned. | Mcp.Assets.Read |
cc_list_rotation_candidates | Lists due, stale, orphaned, or not-ready rotation records without changing them. | Mcp.Rotation.Read |
cc_get_dependency_blast_radius | Shows dependent Azure resources for a credential or asset. | Mcp.Assets.Read |
cc_get_compliance_summary | Returns compliance score, violations, risky vaults, and trend data. | Mcp.Compliance.Read |
cc_search_audit_events | Searches scoped audit events. Use only for admin-equivalent users and clients. | Mcp.Audit.Read |
There are no write tools in Phase 1. Do not create, grant, or document Mcp.Rotation.Write, Mcp.Discovery.Write, rotation execution tools, or credential-rotation claims for this release.
Architecture¶
AI client -> public HTTPS CertifyClouds MCP endpoint -> Entra token validation
-> CertifyClouds user mapping, tenant scope, tool policy, audit
- A user connects an AI client to
https://<your-certifyclouds-host>/api/mcp. - The client discovers CertifyClouds protected-resource metadata at
/.well-known/oauth-protected-resource. - The metadata points the client to your Entra tenant as the authorization server.
- The user signs in with Entra. MFA, Conditional Access, PIM, sign-in logs, and tenant revocation remain under your control.
- Entra issues a v2 access token whose
audclaim identifies the MCP API. For the standardapi://<resource-app-client-id>setup, this is normally the API app's Application (client) ID GUID. - CertifyClouds validates
iss,tid,aud, signature, expiry, token version, scopes, and accepted client ID on every request. - CertifyClouds maps the Entra identity to an existing CertifyClouds user. Unmapped users are rejected.
- The requested tool runs only inside the caller's allowed tenant scope and is written to the CertifyClouds audit log.
CertifyClouds never issues OAuth tokens for the AI client, never stores third-party access tokens, never stores refresh tokens, and never forwards the received bearer token to Azure or any other system.
Customer-authorized data flow¶
MCP is an optional external data path. When an administrator enables the connector and a user invokes a tool from a hosted AI client, CertifyClouds returns the selected read-only result metadata over TLS to that customer-chosen provider. Depending on the tool, this can include asset names and identifiers, expiry metadata, dependency relationships, compliance findings, or scoped audit events.
CertifyClouds-operated services do not receive those MCP results. The hosted provider processes them under the customer's agreement and configuration with that provider. Secret values, bearer tokens, private keys, certificate material, and value-shaped hints are never returned by Phase 1 tools.
Prerequisites¶
CertifyClouds¶
- ENTERPRISE license with MCP enabled.
- A stable public HTTPS URL for the deployment, for example
https://certifyclouds.example.com. APP_BASE_URLset to the same public URL in Settings -> Network or as theAPP_BASE_URLenvironment variable.- Existing CertifyClouds users mapped to Entra identities. Phase 1 does not auto-provision users.
- Admin access to Settings -> MCP Connector for trusted issuer, client policy, and diagnostic setup.
Network¶
AI clients run from vendor infrastructure, not your browser. They must be able to reach:
https://<your-certifyclouds-host>/.well-known/oauth-protected-resourcehttps://<your-certifyclouds-host>/.well-known/oauth-protected-resource/api/mcpif the client requests the path-aware RFC 9728 metadata aliashttps://<your-certifyclouds-host>/api/mcphttps://<your-certifyclouds-host>/healthif you use it as an external readiness check
The endpoint must use publicly trusted TLS. Self-signed certificates, raw IP URLs, and private-only hostnames are not supported for remote AI clients.
If the deployment is behind Cloudflare Access, Azure Front Door, Application Gateway, API Management, or another gateway, configure the gateway so the MCP paths are reachable by the AI client:
| Path | Requirement |
|---|---|
/.well-known/oauth-protected-resource | Publicly reachable over HTTPS. Must not require an interactive Cloudflare Access login. |
/.well-known/oauth-protected-resource/api/mcp | Same as above. Some clients request the path-aware RFC 9728 alias for /api/mcp. |
/api/mcp | Publicly reachable over HTTPS. Must allow non-browser POST requests with Authorization: Bearer <token>. |
/health | Optional external check. Keep protected if your policy requires it. |
The MCP connector uses the existing CertifyClouds application route. Do not create a separate MCP service or hostname unless your CertifyClouds deployment itself is moving there. Cloudflare, Azure Front Door, Application Gateway, and API Management should route /.well-known/oauth-protected-resource, /.well-known/oauth-protected-resource/api/mcp, and /api/mcp to the same CertifyClouds backend and preserve:
AuthorizationMCP-Protocol-VersionMCP-Session-IdContent-Type- POST bodies
For Cloudflare Access specifically, use a path-bypass or service-auth design for the MCP paths. A browser-only Access policy will block Claude and ChatGPT before CertifyClouds can return OAuth metadata or validate the Entra token.
Do not bypass CertifyClouds authentication. The path bypass is only for the outer access proxy. CertifyClouds must still validate the Entra bearer token on every /api/mcp request.
Reverse proxy and Cloudflare troubleshooting¶
If a hosted client fails before the Entra sign-in page, first determine whether the request reached CertifyClouds at all. A CertifyClouds response for MCP is JSON-RPC, RFC 9728 metadata, or a typed OAuth/MCP error. An HTML block page, Cloudflare challenge, Access login page, or AI Labyrinth honeypot response is generated at the edge; CertifyClouds has not received the request and cannot validate the token or write an auth-failure audit row.
For Cloudflare zones:
- Open Security -> Events for the deployment hostname and filter the timeframe around the connector attempt.
- Filter or search for the hosted-client user agent, especially
Claude-Userfor Claude.ai custom connectors. ChatGPT traffic may appear separately asChatGPT-User. - Check which product produced the action. Bot Fight Mode is separate from Cloudflare's AI bot and AI crawler controls; turning Bot Fight Mode off does not prove that AI bot rules are allowing a hosted connector.
- If
Claude-Useris blocked as AI crawler/assistant/agent traffic, allow user-directed Agent traffic where your plan exposes Cloudflare's current AI bot taxonomy. If the plan supports path-scoped rules, prefer a narrowly scoped exception for the exact MCP transport and metadata paths only: /.well-known/oauth-protected-resource/.well-known/oauth-protected-resource/api/mcp/api/mcp- Do not add a broad
/api/*bypass. Normal CertifyClouds browser/API routes should keep the customer's main Access/WAF policy.
Cloudflare's July 2026 AI bot taxonomy separates Agent traffic, which is automated activity acting for a user, from Training crawlers and Search crawlers. See Cloudflare's current docs for Block AI Bots, Verified bots, AI Crawl Control, and AI Labyrinth. If your zone only has the legacy global Block AI bots switch, allowing it may also reduce training-crawler blocking because the older switch is not path- or behavior-specific. In that case, prefer a plan-supported path exception or custom WAF rule for the MCP paths; if you must change only the global legacy switch, record the training-crawler tradeoff with the customer's security owner before enabling hosted connectors.
Do not make Anthropic or OpenAI source IP ranges the primary security boundary. Vendor IP observations can help diagnose whether traffic is reaching Cloudflare, but hosted-client egress can change and multiple customers may share the same infrastructure. The durable boundary is still: edge allows only the required public MCP paths, then CertifyClouds validates the Entra JWT, issuer, audience, client ID, scopes, mapped user, tenant scope, and tool policy on every request.
Capacity Behavior¶
MCP is optional read-only traffic. During busy periods, the connector can return retryable 429 or 503 responses. Clients should honor Retry-After and use bounded retries rather than increasing concurrency.
MCP POST bodies are limited to 1 MiB and JSON-RPC batches are limited to 25 messages. Requests above either limit are rejected.
Entra Setup¶
Create a resource API App Registration and one client App Registration per approved hosted AI surface:
- CertifyClouds MCP API (Production): a single-tenant resource API app that represents your CertifyClouds MCP resource server.
- CertifyClouds MCP Client - Claude Web (Production): a single-tenant confidential web client used by the Claude custom connector, when approved.
- CertifyClouds MCP Client - ChatGPT (Production): a separate single-tenant confidential web client used by the ChatGPT developer-mode app, when approved.
Do not create client registrations for surfaces your organization has not approved.
Use this naming standard so API and client objects are unambiguous:
Recommended Production names:
CertifyClouds MCP API (Production)CertifyClouds MCP Client - Claude Web (Production)CertifyClouds MCP Client - ChatGPT (Production)
Supported setup helper¶
The CertifyClouds deployment package includes a preview-first Entra setup helper. Run it from an administrator workstation that has Azure CLI and jq installed. Sign in to the customer tenant first:
az login --tenant <tenant-id> --allow-no-subscriptions
./scripts/deploy/setup-mcp-connector.sh \
--tenant <tenant-id> \
--host https://<your-certifyclouds-host> \
--client claude
Preview is the default and makes no Entra changes. Review the tenant, public resource URL, registration names, callback, and read-only scopes, then rerun the same command with --apply. The active Azure CLI tenant must exactly match --tenant.
For ChatGPT, select a separate client and provide the exact callback shown in the current ChatGPT app setup flow:
./scripts/deploy/setup-mcp-connector.sh \
--tenant <tenant-id> \
--host https://<your-certifyclouds-host> \
--client chatgpt \
--chatgpt-redirect-uri https://<exact-callback-from-chatgpt> \
--apply
Repeat --client to configure both hosted clients in one run. Add --with-audit only for clients approved to receive Mcp.Audit.Read.
The helper creates or reuses the resource API, one confidential client per selected hosted surface, their service principals, delegated permissions, admin consent, and an append-only managed client secret. New secret values are shown once on the administrator's terminal and are not written to the script transcript. An identical rerun keeps the current managed secret. Use --renew-client-secrets only when deliberately rotating the selected clients; it appends replacements and does not delete existing credentials.
The helper does not change CertifyClouds settings, enable the connector, change Cloudflare or another edge provider, or acquire a user access token. Complete those steps separately below. If the helper cannot be used, follow the manual registration steps in the next sections.
1. Register the CertifyClouds MCP API¶
- Go to Microsoft Entra ID -> App registrations -> New registration.
- Name it
CertifyClouds MCP API (Production). - Supported account types: Accounts in this organizational directory only.
- Do not add a redirect URI to the API app.
- Open Expose an API.
- Set the Application ID URI to the deployment's exact public MCP resource URL:
https://<your-certifyclouds-host>/api/mcp. The hostname must be a verified custom domain in your Entra tenant. - Open Manifest and set
requestedAccessTokenVersionto2. - Add these delegated scopes exactly:
| Scope | Who can consent | Admin consent display name |
|---|---|---|
Mcp.Assets.Read | Admins only | Read CertifyClouds MCP asset and credential metadata |
Mcp.Rotation.Read | Admins only | Read CertifyClouds MCP rotation readiness metadata |
Mcp.Compliance.Read | Admins only | Read CertifyClouds MCP compliance summaries |
Mcp.Audit.Read | Admins only | Read CertifyClouds MCP audit events |
Do not add write scopes for Phase 1.
The full OAuth scope identifiers are the Application ID URI plus the scope name, for example https://<your-certifyclouds-host>/api/mcp/Mcp.Assets.Read. CertifyClouds publishes these resource-qualified values in RFC 9728 metadata so clients that send an RFC 8707 resource parameter remain compatible with Entra.
2. Register each approved hosted client¶
Create a distinct client registration for each approved hosted client. This keeps callback URIs, secrets, revocation, sign-in logs, and CertifyClouds client policies attributable to one vendor surface.
- Create the App Registration using the matching Production name above.
- Supported account types: Accounts in this organizational directory only.
- Add the exact Web redirect URI required by the client:
- Claude currently publishes
https://claude.ai/api/mcp/auth_callback. - ChatGPT generates a setup-specific callback URI. Copy it from the current app setup flow; do not guess it or reuse the Claude callback.
- Create a separate client secret for each hosted-client registration. Entra does not provide Dynamic Client Registration for this setup, so the vendor needs the configured client ID and secret.
- Copy the secret value into that vendor's connector UI only. Do not paste it into tickets, documentation, logs, or CertifyClouds diagnostics.
- Open API permissions -> Add a permission -> My APIs -> CertifyClouds MCP API (Production).
- Select only the Phase 1 delegated scopes required for the connector.
- Click Grant admin consent. Users should not self-consent to MCP scopes.
Do not reuse a production client ID across independently operated hosted or native clients. A non-production lab may temporarily share one client app while testing callbacks, but use a distinct secret per vendor and do not copy that shape into customer production guidance.
Recommended split:
| Client type | Scopes |
|---|---|
| General operator client | Mcp.Assets.Read, Mcp.Rotation.Read, Mcp.Compliance.Read |
| Security/audit client | General operator scopes plus Mcp.Audit.Read |
| Trial or limited client | Mcp.Assets.Read, Mcp.Compliance.Read |
3. Record the non-secret values¶
Collect these values for CertifyClouds setup:
| CertifyClouds field | Entra value |
|---|---|
| Tenant ID | API app -> Overview -> Directory (tenant) ID |
| Issuer URL | https://login.microsoftonline.com/<tenant-id>/v2.0 |
| JWKS URL | https://login.microsoftonline.com/<tenant-id>/discovery/v2.0/keys |
| Audience | Exact aud claim from a short-lived v2 test token; normally the API app's Application (client) ID GUID |
| Accepted client IDs | Application (client) IDs of the approved AI client apps, not the API app |
Do not record client secrets, access tokens, refresh tokens, authorization codes, secret values, or Key Vault material.
The Application ID URI is still used when clients request delegated scopes, for example https://<your-certifyclouds-host>/api/mcp/Mcp.Assets.Read. Do not assume that URI string is also the v2 token's aud value. Decode a short-lived test token locally, copy its exact aud claim into CertifyClouds, and then use the setup diagnostic to validate it.
CertifyClouds Setup¶
In CertifyClouds:
- Open Settings -> MCP Connector.
- Add a trusted issuer:
- Issuer URL
- JWKS URL
- Tenant ID pin
- Audience
- Accepted client IDs
Every enabled issuer requires at least one accepted client ID. An empty list is rejected and never means "allow any client." 3. Add client policies for each accepted client ID. Use the Production client names above, then set allowed tools, maximum tenant scope, and whether Mcp.Audit.Read is permitted. 4. Map scopes to tool policies. Start with the recommended split above. 5. Restrict Mcp.Audit.Read to admin-equivalent users and approved clients. 6. Configure tenant scope policy: - home for the deployment tenant - tenant:<id> for named onboarded corporate tenants - all only where the user's CertifyClouds role and Entra scope justify it 7. Run the setup diagnostic: - JWKS reachability - Issuer and tenant pin check - Audience check - Accepted client ID check - Paste-a-token validation for signature, issuer, tenant, audience, expiry, token version, and accepted client ID, using a short-lived access token from a test user
Review the decoded scope claims against the configured scope-to-tool policies separately; the token diagnostic does not execute a tool authorization decision.
The diagnostic must not log or store the pasted token. Use it to verify claims and then discard the token.
Phase 1 does not support just-in-time user provisioning. The token's Entra oid must map to an existing, active CertifyClouds user or SSO account link. Create or link the CertifyClouds user before testing MCP access.
Enable or disable the connector¶
The deployment-level MCP switch defaults to off. Configure and save at least one enabled trusted issuer with an accepted client ID before the switch can be turned on.
- Leave Enable MCP connector off while entering issuer, client, scope, and tenant policies.
- Save the configuration and complete Test JWKS plus short-lived token validation.
- Turn on Enable MCP connector and save again only after the diagnostics pass.
- To withdraw the public MCP surface, turn the switch off and save. Remote clients can no longer discover or call the connector.
The saved configuration remains available to administrators while the connector is off, so it can be prepared or reviewed without admitting remote MCP traffic. Re-enabling does not require a restart.
Token diagnostic handling¶
Use a short-lived delegated Entra access token only for diagnostics. Acquire it through your organization's approved OAuth test tool or the current vendor setup flow, requesting the CertifyClouds MCP API (Production) delegated scopes. Keep it local to the administrator's workstation, paste it only into Settings -> MCP Connector, and never publish it in documentation, tickets, chat, shell history, screenshots, or logs.
CertifyClouds validates the pasted token as a resource server. It does not issue access tokens, authorization codes, or refresh tokens, and it does not host OAuth authorize or token endpoints.
Client Setup¶
Use the public MCP URL:
For an individual Claude account, open Customize -> Connectors, select + -> Add custom connector, and enter:
| Claude field | Value |
|---|---|
| Name | CertifyClouds |
| Remote MCP server URL | https://<your-certifyclouds-host>/api/mcp |
| OAuth Client ID | Application (client) ID from CertifyClouds MCP Client - Claude Web (Production) |
| OAuth Client Secret | Current secret value from that client App Registration |
Click Add, then Connect, and complete the Entra sign-in. The authorization and token URLs come from Entra discovery, not from CertifyClouds. Each user authorizes with their own Entra identity and must already map to an active CertifyClouds user.
For Team and Enterprise plans, an Owner or Primary Owner first adds the Web connector under Organization settings -> Connectors -> Add -> Custom -> Web. Members then open Customize -> Connectors and select Connect. Claude's navigation and plan availability can change; use the current Claude connector guide linked above if the labels differ.
Optional ChatGPT web setup¶
ChatGPT is an optional additional client and is not part of the standard Claude Web setup. Use an eligible Pro, Plus, Business, Enterprise, or Education account and keep the app private until the full interoperability gate passes.
- Open Settings -> Security and login and enable Developer mode.
- Open Settings -> Plugins, select the plus button, and create a developer-mode app for
https://<your-certifyclouds-host>/api/mcpusing OAuth authentication. - Copy the exact callback URI that ChatGPT generates. Do not guess it or reuse the Claude callback URI.
- Create a separate single-tenant confidential web client named
CertifyClouds MCP Client - ChatGPT (Production)with that callback URI. - Create a client secret, grant only the required Phase 1 delegated scopes, and grant admin consent.
- Return to ChatGPT, enter the client ID and secret, save the private app, and complete Entra authorization.
- Open the app details and select Refresh to pull the current tools.
- Confirm that exactly the eight Phase 1 read-only tools are discovered. Do not share or publish the app until tool calls, denials, audit attribution, refresh, and disconnect behavior have been verified.
ChatGPT requires refresh-token support for durable OAuth connectivity. Entra's OIDC discovery metadata must advertise offline_access, and the authorization flow must issue a refresh token.
Expected authorization server metadata:
Expected protected-resource metadata:
Hosted ChatGPT custom app and Claude.ai custom connector flows were validated in lab on 2026-07-13. Both clients completed Entra connection and discovered the eight Phase 1 read-only tools; read-only hosted-client calls were also exercised. Keep the connector private until your own Entra, edge, denial, audit-attribution, refresh, and disconnect behavior have been verified for your deployment.
Final connector validation¶
After Entra, gateway, and Settings -> MCP Connector are configured:
- Run Test JWKS and the short-lived token diagnostic. Confirm issuer, tenant, audience, client ID, signature, expiry, and token version all pass. Do not save or publish the token.
- Connect the approved hosted client and complete Entra sign-in with an existing active CertifyClouds user.
- Refresh the connector and confirm it discovers exactly the eight Phase 1 tools listed on this page, with no write or rotation-execution tool.
- Ask the client to call
cc_list_tenant_scopes, then make one scoped asset or compliance query. - Request a deliberately broader tenant scope and confirm it is denied cleanly.
- In Audit Log, confirm the successful and denied MCP calls identify the mapped user, client, tool, and tenant scope without containing bearer tokens or secret values.
CertifyClouds operators use additional internal protocol and all-tool acceptance checks before declaring a release ready. Customers do not need repository scripts or direct database access to complete connector setup.
Troubleshooting¶
| Symptom | Likely cause | Check |
|---|---|---|
| Client never reaches the Entra sign-in page | /.well-known/oauth-protected-resource blocked by Cloudflare Access or another gateway | Fetch the metadata URL from a network outside your VNet without an interactive browser session. |
Entra returns AADSTS9010010 or invalid_target | The MCP metadata resource URL does not match the API app's Application ID URI, or metadata advertised bare scopes | Set the Application ID URI to the exact public /api/mcp URL and confirm every scopes_supported value begins with that resource URL. |
Client signs in but /api/mcp returns 401 | Token issuer, audience, signature, expiry, or client ID failed validation | Run the CertifyClouds trusted-issuer diagnostic with a short-lived token. |
invalid_audience or equivalent token error | The client requested a token for the wrong API, or CertifyClouds was configured with the Application ID URI instead of the v2 token's actual aud claim | Confirm the AI client requested the resource-qualified /api/mcp/<scope> scopes, then compare the token's exact aud claim with the trusted issuer's Audience field. |
| User receives 403 after token validation | Entra identity is not mapped to an existing CertifyClouds user, or the CertifyClouds role lacks the requested tool | Confirm SSO/account linking and tool policy. |
cc_search_audit_events is denied | Missing Mcp.Audit.Read or the caller is not admin-equivalent | Grant the scope only to the approved security/audit client and user group. |
| Client lists tools but calls fail | Tenant scope requested by the model is broader than the user's grant | Call cc_list_tenant_scopes first and retry with an allowed scope. |
| ChatGPT connects but shows no app actions | The current tool descriptors were rejected or the app snapshot is stale | Confirm each tool declares its OAuth securitySchemes and required read-only impact annotations, then refresh the private app and inspect the MCP request logs. |
| Cloudflare Access shows an HTML login page to the client | Browser-only Access policy applies to MCP paths | Add a path bypass or service-auth policy for /.well-known/oauth-protected-resource, /.well-known/oauth-protected-resource/api/mcp, and /api/mcp. |
| Claude.ai fails before Entra and CertifyClouds shows no auth failure | Cloudflare blocked Claude-User at the edge as AI bot/crawler/agent traffic | Inspect Cloudflare Security Events for Claude-User, AI bot actions, and AI Labyrinth responses. Allow user-directed Agent traffic or add a narrow exact-path exception for MCP metadata and /api/mcp; do not bypass /api/*. |
| Tool output appears incomplete | Result caps, pagination, or tenant-scope filtering applied | Narrow the query, request the next page, or check the tenant scope. |
| A response appears to contain a secret value | Treat as a security incident | Stop testing, preserve audit logs, and contact support. Phase 1 tools must never return secret values or value-shaped hints. |
Security Notes¶
- Tokens are validated on every request.
MCP-Session-Idis continuity only and is never trusted as identity. - Issuer and tenant are pinned. CertifyClouds must not accept "any Entra tenant with the right audience".
- Access tokens are not forwarded to Azure, Graph, Key Vault, or third-party systems.
- Secret values, key material, and value-shaped hints are never returned by MCP tools.
- Read-only result metadata is returned to the customer-selected hosted AI provider when a user invokes a tool. Review that provider's retention, training, residency, and access controls before enabling the connector.
- All successful and denied tool calls are auditable in CertifyClouds.
- Revocation is controlled in Entra by disabling the user, removing app consent, removing scopes or roles, or disabling the client app. CertifyClouds can also deny a client or tool policy even when an Entra token is otherwise valid.
Phase 1 is deliberately read-only. Write tools and rotation workflows require a separate design, approval model, and release.