91 tools. One endpoint. Talk to your entire Google security stack in plain English.
MCP Boss gives any AI model (Gemini, Claude, GPT) full access to SecOps, SCC, GTI, Cloud Logging, SOAR, BigQuery, IAM, and cross-platform containment — through the Model Context Protocol.
curl -sL https://raw.githubusercontent.com/dadohen/MCP-Boss/main/setup.sh | bash -s -- \
--project your-project-id \
--customer your-secops-customer-id \
--gti-key your-vt-api-keyAfter Cloud Shell opens, run in the terminal:
chmod +x setup.sh && ./setup.shThe wizard will walk you through project ID, customer ID, and deploy everything.
git clone https://github.com/dadohen/MCP-Boss.git
cd MCP-Boss && ./setup.shThe setup wizard handles everything: APIs, service account, IAM roles, container build, Cloud Run deploy, and verification.
You ask a question → Gemini picks the right tools → executes them → chains results across multiple sources → gives you a report. No clicking through UIs, no writing API calls, no switching consoles.
Example: "Hunt for APT28 across all sources" →
- Looks up APT28 threat intel via GTI/VirusTotal
- Searches your SIEM for matching IOCs
- Checks SCC for exploitable vulnerabilities matching their TTPs
- Correlates findings across all sources
- Produces an executive summary with recommended actions
All automatic, up to 20 chained tool calls in a single request.
First benchmark run on a live Cloud Run deployment (2026-04-22, gemini-2.5-flash, 6 scenarios):
| Metric | Value |
|---|---|
| correct_verdict_pct | 83.3% (5/6 scenarios) |
| correct_containment_pct | 13.9% |
| destructive_fp_rate_pct | 0.0% |
| median_alert_to_containment_s | 60.87 |
Full scorecard, scenarios, and raw tool traces live under eval_harness/ (scorecard-2026-04-22.md, results.json). Rerun any time with ./eval_harness/run.sh. Nobody else in this category publishes these numbers credibly; that is the point.
┌──────────────────────────────────────────────────────────────┐
│ USER INTERFACES │
│ Web UI · Gemini CLI · Claude Desktop · Mobile App │
└──────────────────────┬───────────────────────────────────────┘
│
┌────────────┴────────────┐
│ /api/chat (Web UI) │ ← Multi-turn orchestration
│ /mcp (Gemini CLI) │ ← Streamable HTTP
│ /sse (Claude/MCP) │ ← SSE transport
└────────────┬────────────┘
│
┌──────────────────────▼───────────────────────────────────────┐
│ MCP Boss Server (Cloud Run) │
│ 89 Tools · Python · FastMCP · Serverless │
│ │
│ 🔍 Discovery 🧠 Intel 🛡️ Detection 📂 SOAR │
│ ├─ SCC ├─ GTI/VT ├─ YARA-L ├─ Cases │
│ ├─ Cloud Log ├─ Malware ├─ Rules ├─ Playbooks│
│ ├─ UDM Search ├─ Actors ├─ Alerts ├─ Actions │
│ ├─ Ingestion └─ Vertex AI └─ Data Tables └─ Metrics │
│ │
│ 📧 Containment ☁️ Cloud 📊 Analytics │
│ ├─ O365 Purge ├─ AWS Keys ├─ BigQuery │
│ ├─ Okta ├─ GCP SA ├─ MTTx Metrics │
│ ├─ Azure AD ├─ STS Revoke ├─ Audit Logs │
│ └─ CrowdStrike └─ IAM Review └─ Cloud Monitoring │
└──────────────────────────────────────────────────────────────┘
│
┌────────────┴────────────┐
│ Google Cloud APIs │
│ Chronicle · SCC · GTI │
│ Vertex AI · BigQuery │
│ Cloud Logging · IAM │
│ Cloud Monitoring │
└─────────────────────────┘
Zero embedded secrets. All Google API authentication uses Workload Identity Federation (Application Default Credentials). The Cloud Run service account authenticates automatically. Third-party containment APIs (Okta, AWS, Azure AD, CrowdStrike, O365) use environment variables backed by Secret Manager.
MCP Boss handles sensitive security data. Here's how to lock it down.
Auth-off equals policy-off. When
OAUTH_CLIENT_IDis unset, the built-in auth middleware no-ops and the approval role check in/api/approvals/*/decidefalls back to an allow-all path so dev workflows keep working. This means a deployment withoutOAUTH_CLIENT_IDhas no enforcement: anyone with network reach can approve any destructive tool call. Any non-dev deploy MUST setOAUTH_CLIENT_ID(and populate aROLE_MAP_JSONorROLE_MAP_PATH). Seeauth_middleware.pyanddeploy/multi_tenant/README.md.Boot will refuse to start if
LOCAL_DEV_ALL_ROLES=1is set withoutOAUTH_CLIENT_IDunless you also setMCP_BOSS_ENV=dev. That combo grants every caller every approver role.MCP transport (stdio/SSE) session tools (
create_session,get_session,update_session,add_note) still run under a single tenant because those transports carry no HTTP identity. Restrict MCP transport access at the infra layer (Cloud Run IAM invoker on/mcpand/sse).
Remove public access and require Google Cloud IAM authentication:
# Remove unauthenticated access
gcloud run services remove-iam-policy-binding mcp-boss \
--member="allUsers" \
--role="roles/run.invoker" \
--project=$PROJECT_ID \
--region=us-central1
# Grant access to specific users only
gcloud run services add-iam-policy-binding mcp-boss \
--member="user:analyst@yourcompany.com" \
--role="roles/run.invoker" \
--project=$PROJECT_ID \
--region=us-central1
# Grant access to a Google Group (for SOC team)
gcloud run services add-iam-policy-binding mcp-boss \
--member="group:soc-team@yourcompany.com" \
--role="roles/run.invoker" \
--project=$PROJECT_ID \
--region=us-central1How to access after locking down:
# From browser — use Cloud Run Proxy:
gcloud run services proxy mcp-boss --project=$PROJECT_ID --region=us-central1
# Opens http://localhost:8080 → authenticated tunnel to your service
# From curl/API:
TOKEN=$(gcloud auth print-identity-token)
curl -H "Authorization: Bearer $TOKEN" https://YOUR-SERVICE-URL/health
# From Gemini CLI:
TOKEN=$(gcloud auth print-identity-token)
gemini --tool-endpoint https://YOUR-SERVICE-URL/mcp --headers "Authorization=Bearer $TOKEN"Restrict to your VPC — no public internet access at all:
gcloud run services update mcp-boss \
--ingress=internal \
--project=$PROJECT_ID \
--region=us-central1Only accessible from within your VPC, VPN, or Cloud Interconnect.
How to access:
# From your local machine via Cloud Run Proxy (tunnels through IAM):
gcloud run services proxy mcp-boss --project=$PROJECT_ID --region=us-central1
# Opens http://localhost:8080 locally
# Or from a GCE VM / GKE pod inside the VPC:
curl https://YOUR-SERVICE-URL/healthPut Cloud IAP in front for browser-based SSO with your corporate identity provider:
# Enable IAP on the Cloud Run service
gcloud iap web enable \
--resource-type=cloud-run \
--service=mcp-boss \
--project=$PROJECT_ID
# Grant access to your SOC team
gcloud iap web add-iam-policy-binding \
--resource-type=cloud-run \
--service=mcp-boss \
--member="group:soc-team@yourcompany.com" \
--role="roles/iap.httpsResourceAccessor" \
--project=$PROJECT_IDUsers get a Google login prompt in the browser before reaching the Web UI. No code changes needed — IAP handles everything.
How to access: Just open the URL in a browser. IAP shows a Google login page. After sign-in, you're through to the Web UI.
For quick protection, set an API key environment variable and validate in requests:
gcloud run services update mcp-boss \
--set-env-vars="MCP_BOSS_API_KEY=your-secret-key-here" \
--project=$PROJECT_ID \
--region=us-central1How to access:
# curl:
curl -H "X-API-Key: your-secret-key-here" https://YOUR-SERVICE-URL/health
# Gemini CLI:
gemini --tool-endpoint https://YOUR-SERVICE-URL/mcp --headers "X-API-Key=your-secret-key-here"
# Web UI: Add ?key=your-secret-key-here to the URL
# Or the Web UI will prompt for it on first loadThe server validates this automatically when MCP_BOSS_API_KEY is set.
| Practice | How |
|---|---|
| No public access | Remove allUsers invoker binding |
| Least privilege SA | Use dedicated mcp-boss service account, not default compute SA |
| Secret Manager | Store API keys (GTI, Okta, AWS, etc.) in Secret Manager, not env vars |
| Audit logging | Cloud Run request logs are automatic; enable Data Access audit logs |
| VPC SC | Place the project in a VPC Service Controls perimeter |
| Containment approval | Built in: see "Authentication & Approvals" below |
| Network | Use --ingress=internal + Cloud VPN/Interconnect for production |
Application-level controls that sit on top of Cloud Run IAM. All of them are off by default; opt in with env vars.
Set OAUTH_CLIENT_ID and the server rejects any request without a valid Google OIDC ID token whose aud matches.
| Variable | Purpose |
|---|---|
OAUTH_CLIENT_ID |
Primary audience. Usually your browser-flow OAuth 2.0 client ID. |
OAUTH_ADDITIONAL_AUDIENCES |
Comma-separated extra accepted audiences. Add the service URL or 32555940559.apps.googleusercontent.com (gcloud default client) for server-to-server CI calls. |
ALLOWED_EMAILS |
Optional comma-separated allowlist. If set, an authenticated email not on the list is rejected. |
AUTH_EXEMPT_PATHS |
Comma-separated path prefixes that bypass auth (default /health,/static). |
When OAUTH_CLIENT_ID is unset the middleware is a no-op: auth is disabled, principal is local, every role check passes. Do not ship this configuration outside local dev. The server refuses to start if LOCAL_DEV_ALL_ROLES=1 is set without either OAUTH_CLIENT_ID or MCP_BOSS_ENV=dev.
policy_and_approvals/policies.yaml maps each destructive tool (host isolation, key revocation, email purge, etc.) to one or more approver role names. To authorise a caller, map their email to a role set.
| Variable | Format |
|---|---|
ROLE_MAP_JSON |
Inline JSON: {"alice@co.com":["security-oncall"], "@co.com":["soc-manager"]} |
ROLE_MAP_PATH |
Path to a YAML file: roles: {alice@co.com: [security-oncall]} |
Approver role names recognised by the default policies.yaml: security-oncall, soc-manager, identity-team, cloud-platform, detection-engineering, legal, security-leadership.
- Orchestrator wants to invoke a gated tool (e.g.
isolate_crowdstrike_host). - Policy gate checks
policies.yaml. Ifrequire_approval, it freezes the tool call as anApprovalRequest. - The approval is broadcast via any configured channel:
/api/approvals(web UI), Google Chat card (GOOGLE_CHAT_WEBHOOK_URL), generic webhook (APPROVAL_WEBHOOK_URL). - An approver hits
POST /api/approvals/{id}/decidewithapprove/deny. The server 403s unless the authenticated caller's roles intersect the rule'sapprover_groups.decided_byis rebound to the authenticated email so the audit trail cannot be spoofed. - On approve, the tool executes. Every state transition lands in the hash-chained audit log.
Verify the chain any time with GET /api/audit/verify:
{"chain_intact": true, "broken_at_seq": null, "audit_path": "/var/log/mcp-boss/audit.jsonl"}SessionMemory is keyed by (authenticated principal, session_id). Two users on the same Cloud Run instance cannot read each other's investigation history even if they guess session IDs. MCP transport session tools (stdio / SSE) use a distinct mcp-transport namespace; gate that transport at the infra layer (Cloud Run IAM invoker on /mcp and /sse).
Set ENABLE_OUTPUT_REDACTION=1 and every tool result is scanned before it flows back to the LLM or the API response. Luhn-checked CC numbers, SSN-looking strings (with IP/date guards), PEM private keys, AWS access keys, JWTs, and labelled API keys (GTI, Okta, CrowdStrike, Azure AD, O365, api_key, bearer_token, client_secret, access_token) are replaced with [REDACTED:<type>]. The audit log records the un-redacted content; only what crosses the tool-to-LLM boundary is sanitised.
- Web UI — browse to the Cloud Run URL, sign in with Google. Paste an alert or ask a question.
- Gemini CLI —
gemini --tool-endpoint https://YOUR-URL/mcp --headers "Authorization=Bearer $(gcloud auth print-identity-token)". - Claude Desktop — add the
/sseURL toclaude_desktop_config.json(see the Connect section).
Every request produces a chat transcript (in the web UI), a full tool trace (in Cloud Logging), and an audit record for any gated tool call.
export MCP_URL=https://YOUR-SERVICE-URL
export MCP_ID_TOKEN=$(gcloud auth print-identity-token)
./eval_harness/run.shProduces scorecard.md (headline numbers) and results.json (raw tool traces per scenario). Wire this into CI and fail the build if destructive_fp_rate_pct > 0 or verdict accuracy drops.
Records are JSONL at $MCP_BOSS_AUDIT_PATH (default /var/log/mcp-boss/audit.jsonl, falls back to ~/.mcp-boss/audit.jsonl) and mirrored to Cloud Logging under log name mcp-boss-audit. Point a BigQuery sink at the Cloud Logging stream for long-term retention and SIEM ingest.
deploy/multi_tenant/install.sh runs terraform apply with Artifact Registry, Secret Manager stubs, Cloud Run v2, and IAM bindings in one command. Pass --oauth-client-id, --allowed-emails, --role-map-json, and --enable-redaction to set the full auth config at deploy time.
If you prefer to set things up manually instead of using setup.sh:
- Google Cloud project with billing enabled
gcloudCLI installed and authenticated- Chronicle / SecOps instance with a customer ID
PROJECT_ID=your-project-id
gcloud services enable \
run.googleapis.com \
cloudbuild.googleapis.com \
chronicle.googleapis.com \
securitycenter.googleapis.com \
aiplatform.googleapis.com \
logging.googleapis.com \
bigquery.googleapis.com \
monitoring.googleapis.com \
iam.googleapis.com \
cloudresourcemanager.googleapis.com \
--project=$PROJECT_IDSA_NAME=mcp-boss
SA_EMAIL="${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
# Create the service account
gcloud iam service-accounts create $SA_NAME \
--display-name="MCP Boss Service Account" \
--project=$PROJECT_ID
# Grant required roles
ROLES=(
roles/chronicle.admin
roles/securitycenter.findingsViewer
roles/aiplatform.user
roles/logging.viewer
roles/bigquery.dataViewer
roles/bigquery.jobUser
roles/monitoring.viewer
roles/iam.securityReviewer
)
for ROLE in "${ROLES[@]}"; do
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${SA_EMAIL}" \
--role="$ROLE" --quiet
done| Role | What it enables | Required? |
|---|---|---|
roles/chronicle.admin |
UDM search, rules, cases, detections, data tables, feeds, parsers, alerts | ✅ Yes |
roles/securitycenter.findingsViewer |
SCC vulnerability findings, misconfigurations | ✅ Yes |
roles/aiplatform.user |
Vertex AI Gemini — threat analysis, investigation reports | ✅ Yes |
roles/logging.viewer |
Cloud Audit Log queries | ✅ Yes |
roles/bigquery.dataViewer |
BigQuery security data lake reads | ✅ Yes |
roles/bigquery.jobUser |
BigQuery SQL execution | ✅ Yes |
roles/monitoring.viewer |
Cloud Monitoring — ingestion bandwidth stats | ✅ Yes |
roles/iam.securityReviewer |
IAM policy and service account auditing | ✅ Yes |
roles/iam.serviceAccountKeyAdmin |
GCP containment: revoke SA keys | ⚙️ Optional |
roles/storage.admin |
Cloud Build deployment access | ⚙️ Deploy only |
# Build
gcloud builds submit \
--project=$PROJECT_ID \
--tag gcr.io/$PROJECT_ID/mcp-boss:latest
# Deploy
gcloud run deploy mcp-boss \
--image gcr.io/$PROJECT_ID/mcp-boss:latest \
--project=$PROJECT_ID \
--region=us-central1 \
--platform=managed \
--service-account=$SA_EMAIL \
--allow-unauthenticated \
--memory=512Mi \
--timeout=300 \
--set-env-vars="SECOPS_PROJECT_ID=$PROJECT_ID,SECOPS_CUSTOMER_ID=YOUR_CUSTOMER_ID,SECOPS_REGION=us,GTI_API_KEY=YOUR_VT_KEY"curl https://YOUR-SERVICE-URL/health
# {"status":"healthy","tools":89,...}Web UI: Open your Cloud Run URL in a browser.
Gemini CLI:
gemini --tool-endpoint https://YOUR-SERVICE-URL/mcpClaude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"mcp-boss": {
"url": "https://YOUR-SERVICE-URL/sse"
}
}
}| Variable | Description |
|---|---|
SECOPS_PROJECT_ID |
Your GCP project ID |
SECOPS_CUSTOMER_ID |
Chronicle/SecOps customer ID (from Chronicle settings) |
SECOPS_REGION |
us, eu, or asia |
| Variable | Description |
|---|---|
GTI_API_KEY |
VirusTotal / Google Threat Intelligence API key |
| Variable | Description |
|---|---|
OAUTH_CLIENT_ID |
Google OAuth 2.0 client ID. When set, every request must present a valid ID token whose aud matches. Unset = auth disabled (dev only). |
OAUTH_ADDITIONAL_AUDIENCES |
Comma-separated extra accepted audiences. Add the service URL or 32555940559.apps.googleusercontent.com for server-to-server / CI. |
ALLOWED_EMAILS |
Comma-separated allowlist of authenticated emails. If set, other emails are rejected. |
ROLE_MAP_JSON |
Inline JSON mapping email or @domain to approver role lists. |
ROLE_MAP_PATH |
YAML file with roles: block. Same shape as ROLE_MAP_JSON. |
AUTH_EXEMPT_PATHS |
Path prefixes that bypass auth (default /health,/static). |
LOCAL_DEV_ALL_ROLES |
1 grants every caller every approver role. Requires MCP_BOSS_ENV=dev; otherwise server refuses to start. |
MCP_BOSS_ENV |
Operator declaration. Set to dev on a dev machine to allow LOCAL_DEV_ALL_ROLES=1. |
| Variable | Description |
|---|---|
ENABLE_OUTPUT_REDACTION |
1 enables DLP pass on tool results before they flow to the LLM. Off by default. |
MCP_BOSS_AUDIT_PATH |
JSONL audit log path (default /var/log/mcp-boss/audit.jsonl, falls back to ~/.mcp-boss/audit.jsonl). |
GOOGLE_CHAT_WEBHOOK_URL |
Google Chat webhook for approval cards. |
APPROVAL_WEBHOOK_URL |
Generic webhook for approval notifications. |
PUBLIC_BASE_URL |
Public URL used when building links in approval notifications. |
GEMINI_MODEL |
Gemini model for orchestration (default gemini-2.5-flash). |
| Variable | Description |
|---|---|
O365_TENANT_ID, O365_CLIENT_ID, O365_CLIENT_SECRET |
Microsoft Graph — email purge |
OKTA_DOMAIN, OKTA_API_TOKEN |
Okta — user suspension |
AZURE_AD_TENANT_ID, AZURE_AD_CLIENT_ID, AZURE_AD_CLIENT_SECRET |
Azure AD — session revocation |
SOAR_AWS_KEY, SOAR_AWS_SECRET |
AWS — IAM key revocation |
CROWDSTRIKE_CLIENT_ID, CROWDSTRIKE_CLIENT_SECRET |
CrowdStrike — host isolation |
Any sensitive env var accepts sm://PROJECT/SECRET_NAME in place of a plaintext value. The secrets_resolver module transparently fetches the latest version from Google Secret Manager at startup.
| Tool | Description |
|---|---|
get_scc_findings |
Fetch active SCC vulnerabilities by severity |
top_vulnerability_findings |
Top SCC findings sorted by severity |
get_finding_remediation |
Remediation guidance for SCC findings |
query_cloud_logging |
Query Cloud Audit Logs |
search_secops_udm |
Chronicle UDM search (YARA-L or field queries) |
search_security_events |
Search security events by type and time range |
list_secops_detections |
All detections — custom rules + curated rules + cases |
get_security_alerts |
Recent security alerts |
check_ingestion_health |
Unparsed log detection / parser failures |
lookup_entity |
Entity context lookup in Chronicle |
get_last_logins |
Recent login events |
get_last_detections |
Recent detection alerts |
| Tool | Description |
|---|---|
enrich_indicator |
Enrich IP/domain/hash/URL via GTI/VirusTotal |
get_ip_report |
Detailed IP report |
get_domain_report |
Detailed domain report |
get_file_report |
Detailed file hash report |
search_threat_actors |
Threat actor profiles (APT groups) |
search_malware_families |
Malware family profiles |
| Tool | Description |
|---|---|
list_rules |
List all YARA-L rules |
create_rule |
Create a YARA-L 2.0 rule |
get_rule |
Get rule details by ID |
toggle_rule |
Enable/disable a rule |
list_rule_errors |
Rule compilation/execution errors |
create_detection_rule_for_scc_finding |
Auto-generate YARA-L from SCC finding |
extract_iocs_from_detections |
Bulk IOC extraction from detections |
vertex_ai_investigate |
Gemini-powered threat analysis |
| Tool | Description |
|---|---|
list_data_tables |
List all Data Tables |
get_data_table |
Read table contents |
update_data_table |
Write/update rows |
| Tool | Description |
|---|---|
list_cases / secops_list_cases |
List cases |
get_last_cases |
Recent cases summary |
secops_get_case |
Full case report — entities, MITRE, hashes, processes, detections |
secops_update_case |
Update priority, status, description |
get_case_alerts / secops_list_case_alerts |
Alerts for a case |
secops_get_case_alert |
Alert details |
secops_update_case_alert |
Update alert |
add_case_comment / secops_create_case_comment |
Add comments |
secops_list_case_comments |
List comments |
get_case_overview |
Stats and priority breakdown |
update_case_priority |
Change priority |
close_case |
Close with reason |
secops_execute_bulk_close_case |
Bulk close |
secops_execute_manual_action |
Execute SOAR action |
| Tool | Description |
|---|---|
list_playbooks |
List playbooks |
get_playbook |
Playbook details |
create_playbook |
Create playbook |
create_containment_playbook |
Auto-generate containment playbook |
export_playbook_template |
Export as template |
clone_playbook |
Clone existing playbook |
| Tool | Description |
|---|---|
purge_email_o365 |
Delete email from O365 mailbox |
suspend_okta_user |
Suspend + clear Okta sessions |
revoke_azure_ad_sessions |
Revoke Azure AD / Entra ID sessions |
revoke_aws_access_keys |
Disable AWS IAM keys |
revoke_aws_sts_sessions |
Deny STS assumed-role sessions |
revoke_gcp_sa_keys |
Delete GCP service account keys |
isolate_crowdstrike_host |
Network-isolate via CrowdStrike |
| Tool | Description |
|---|---|
list_log_names |
Available log names |
list_log_entries |
Log entries with filters |
list_log_buckets |
Logging buckets |
get_log_bucket |
Bucket details |
list_log_views |
Log views |
query_ingestion_stats |
Daily ingestion bandwidth (GB) from Cloud Monitoring |
| Tool | Description |
|---|---|
list_parsers |
Parsers / log types |
validate_parser |
Test parser against raw log |
list_feeds |
Ingestion feeds |
get_feed |
Feed details |
list_data_access_labels |
Data access labels |
list_data_access_scopes |
Data access scopes |
query_secops_audit_logs |
Platform audit logs |
| Tool | Description |
|---|---|
get_mttx_metrics |
MTTR / MTTC response metrics |
bigquery_list_dataset_ids |
BigQuery datasets |
bigquery_list_table_ids |
Tables in a dataset |
bigquery_get_dataset_info / bigquery_get_table_info |
Metadata |
bigquery_execute_sql |
Execute SQL |
| Tool | Description |
|---|---|
get_iam_policy |
Full project IAM policy |
get_service_accounts |
List SAs with key counts |
check_iam_permissions |
Check roles for a specific user/SA |
| Tool | Description |
|---|---|
create_session |
Create investigation session |
get_session |
Retrieve session state |
set_session_context |
Update session context |
add_investigation_note |
Timestamped investigation notes |
autonomous_investigate |
Flagship: End-to-end pipeline — enrich → hunt → assess → detect → respond → report |
| Endpoint | Transport | Client |
|---|---|---|
GET / |
HTTP | Web UI (built-in chat) |
GET /health |
HTTP | Health check (exempt from auth) |
GET /api/tools |
HTTP | Tool listing |
POST /api/chat |
HTTP | Multi-turn orchestration (Web UI) |
GET /sse |
SSE | Claude Desktop / MCP clients |
POST /messages/ |
HTTP | SSE message handler |
POST /mcp |
Streamable HTTP | Gemini CLI |
GET /api/approvals |
HTTP | List approval requests (filter with ?state=pending) |
GET /api/approvals/{id} |
HTTP | Fetch a specific approval |
POST /api/approvals/{id}/decide |
HTTP | Approve or deny (caller roles must intersect rule's approver_groups) |
GET /api/audit/verify |
HTTP | Verify the hash-chained audit log is intact |
David Adohen — Google SecOps / Google Threat Intelligence