Skip to main content
Gumstack encrypts all sensitive data at rest and in transit, isolates credentials per-user, and provides comprehensive logging for compliance and monitoring.

Encryption at rest

All sensitive values are encrypted using Google Cloud KMS (AES-256-GCM) before being written to the database.
Data typeStorageEncryption
Environment variablesGoogle Cloud SpannerKMS-encrypted
OAuth tokensGoogle Cloud SpannerKMS-encrypted
API key credentialsGoogle Cloud SpannerKMS-encrypted
User secretsGoogle Cloud SpannerKMS-encrypted
Refresh tokensGoogle Cloud SpannerSHA-256 hashed (never stored in plaintext)
The encryption key is managed entirely within Google Cloud KMS. The key never leaves Google’s infrastructure. Encryption flow: Plaintext → KMS encrypt() → Base64-encode ciphertext → store encrypted blob in Spanner.

Encryption in transit

All external traffic uses TLS 1.2+ with Google-managed certificates. HTTP requests are automatically redirected to HTTPS. See Infrastructure Security for full details.

Secrets management

Environment variables

Environment variables for MCP servers are encrypted with KMS and stored in Spanner. At deployment time:
  1. Encrypted values are loaded from the database and decrypted via KMS
  2. Decrypted values are injected as container environment variables in the Knative pod spec
  3. Values are never written to disk inside the container
Updating an environment variable requires a new deployment to take effect, since values are baked into the pod spec at deploy time.

Reserved prefixes

The GUMSTACK_* and GUMLOOP_* prefixes are reserved for system-injected variables. User-supplied keys with these prefixes are rejected at the API level and filtered again at deployment time (defense-in-depth). System-injected variables include:
VariablePurpose
GUMSTACK_SERVER_IDServer’s unique identifier
GUMSTACK_BACKEND_URLGumstack backend API URL
GUMSTACK_MCP_URLServer’s public MCP endpoint
GUMLOOP_BACKEND_URLGumloop backend URL (for OAuth)

Secret redaction

Secrets are actively redacted across multiple surfaces:
  • Runtime logs: Bearer tokens, Authorization headers, API keys (matching sk-, pk-, api-, key- patterns), and email addresses are redacted before being returned to the UI
  • Error messages: Secret values that appear in tracebacks or error output are replaced with ****SECRET_REDACTED****
  • API responses: Encrypted credential values are never included in API responses. Environment variable values are excluded from server detail responses. Only keys (names) are visible
  • Build logs: GitHub tokens are redacted from build error output

Credential isolation

Credentials are isolated at multiple levels:
ScopeHow it’s enforced
Per-userAll credential queries include user_id in the WHERE clause. One user cannot access another’s credentials
Per-serverGumstack credentials are scoped by user_id + server_id
Per-organizationGumstack servers are scoped by organization_id. Admin/gumstack_admin role is required for management
Per-projectVariables can be owned by project_id with project membership verification
API responses use to_dict_safe() methods that exclude encrypted values entirely.

Authentication security

OAuth 2.0

PropertyValue
Grant typesauthorization_code and refresh_token only
PKCERequired (S256 method)
Authorization code TTL5 minutes
Access token TTL1 hour
Refresh token TTL6 months
Token formatJWT (at+jwt) signed with RS256
Signing keyRSA private key stored in Google Secret Manager
Refresh token storageSHA-256 hashed in Spanner (never stored in plaintext)
Refresh token rotationOld token is revoked on every use, new token issued

OAuth state protection

OAuth state parameters are signed with HMAC-SHA256 using a key stored in Google Secret Manager, with a 10-minute expiry. Verification uses hmac.compare_digest() for timing-safe comparison.

Dynamic client registration

MCP clients (Cursor, Claude, etc.) can register dynamically via the /oauth/register endpoint per RFC 7591. Only authorization_code and refresh_token grants are accepted.

Organization isolation

Every API endpoint enforces organization boundaries:
  • Server operations: Every GumstackServer has an organization_id. Requests from a different org return 403
  • Credential access: Credential queries always include the authenticated user’s org context
  • Tool access control: Tool access ACLs are scoped per server per organization per permission group
  • Analytics queries: All activity queries include an organization_id filter, preventing cross-org data access
  • Audit logs: Only organization admins can access audit logs

Activity logging

Every tool call made through a Gumstack server is logged with the calling user, target server, tool name, full input/output payloads, latency, status (success, error, permission_denied, or timeout), and a unique call identifier. Logging uses a two-phase system:
  1. Before execution: The call is registered with the backend (status: invoked). If registration fails, the tool does not execute
  2. After execution: The call is updated with the final status, outputs, and latency
This means even failed or timed-out calls are captured.
Activity logs are visible in three places: the global Activity dashboard, the server’s Activity tab, and the User detail page.

Audit logging

Beyond tool call activity, Gumstack tracks 50+ administrative event types including:
  • Authentication: Sign-in events
  • Credentials: Retrieval, creation, modification, deletion
  • Organizations: Member management, metadata changes
  • Permission groups: Creation, member changes, deletion, default group changes
  • ACLs: Tool access creation, updates, deletion
  • Servers: Creation, modification, deployment events
  • Variables: Creation, modification, deletion
  • SCIM: Sync operations, user provisioning/deprovisioning
Each audit event captures: event ID, timestamp, event type, user ID, details (JSON), source IP, and user agent.
Comprehensive audit logging is available on the Enterprise plan.

Error handling

Error responses use structured formats (error and error_description fields) without exposing stack traces, internal URLs, or database details. In production, uncaught errors return generic messages to prevent information disclosure.

Security Overview

High-level security posture

Infrastructure Security

Hosting, isolation, and network architecture

Activity & Analytics

Monitor tool usage and analytics

Permission Groups

Configure RBAC and tool access