Skip to content

Agent Authentication (SPIFFE)

Subnoto supports SPIFFE-based machine identity for AI agents and automated services. Instead of sharing API key secrets, your agents authenticate with short-lived JWT SVIDs issued by your own SPIRE infrastructure — verified inside Subnoto’s confidential enclave.

API KeysSPIFFE Agent Auth
Credential typeStatic secret (access key + secret key)Short-lived JWT SVID (auto-rotated)
RotationManualAutomatic (via SPIRE)
IdentityOpaque key IDCryptographic identity (spiffe://your-domain/...)
Audit trailKey ID in logsFull SPIFFE ID in logs
RevocationDelete keySuspend/revoke registration, or stop issuing SVIDs

SPIFFE is ideal when you run workloads in Kubernetes, VMs, or any environment with a SPIRE agent — your services get identity automatically without managing secrets.

Diagram
  1. SPIRE issues a JWT SVID to your agent (automatically, via the Workload API)
  2. Your agent sends API requests with the JWT as a Bearer token
  3. Subnoto’s enclave verifies the JWT signature against the trust bundle you registered
  4. Permissions are enforced — the agent can only perform actions you allowed

Go to Settings > Agent Registrations and click Register Agent. You’ll need:

  • Name — A human-readable label (e.g. “Production NDA Signer”)
  • Trust Domain — Your SPIFFE trust domain (e.g. acmecorp.com)
  • SPIFFE ID — The exact SPIFFE ID your agent will present (e.g. spiffe://acmecorp.com/ns/prod/sa/nda-signer)
  • Trust Bundle — The JWKS containing your SPIRE server’s public keys. You can either:
    • Fetch from a URL — Provide your SPIRE server’s JWKS endpoint or OIDC discovery URL (e.g. https://spire.acmecorp.com/.well-known/openid-configuration). Subnoto fetches the keys automatically.
    • Paste manually — Paste the JWKS JSON directly.
  • Permissions — Select which API actions the agent is allowed to perform (same CASL permission model as API keys).

Your agent needs to send its JWT SVID as a Bearer token in the Authorization header:

Authorization: Bearer <JWT_SVID>

The Subnoto MCP server supports SPIFFE authentication natively. Configure it with environment variables:

Using SPIRE Workload API (recommended):

Terminal window
docker run -i --rm \
-v /run/spire/sockets:/spiffe-workload-api \
-e SPIFFE_ENDPOINT_SOCKET=/spiffe-workload-api/api.sock \
-e SPIFFE_AUDIENCE=subnoto.com \
subnoto/mcp-server:latest

The MCP server automatically fetches and refreshes JWT SVIDs from the SPIRE agent.

Using a JWT SVID file (rotated externally through the spire sidecar):

Terminal window
docker run -i --rm \
-v /path/to/svid.jwt:/svid.jwt \
-e SPIFFE_JWT_SVID_PATH=/svid.jwt \
subnoto/mcp-server:latest

Use the utils_whoami MCP tool to confirm your agent is authenticated. The response will include an agent field with your SPIFFE ID.

Agent permissions use the same model as API keys. When registering an agent, you select which actions it can perform:

PermissionDescription
ReadList and retrieve resources
CreateCreate new resources
UpdateModify existing resources
DeleteDelete resources
ManageFull access (includes all above)

Permissions are scoped per resource type (Template, Envelope, Contact, Workspace, Team, Webhook).

  • Suspend — Temporarily disable an agent. The registration remains and can be reactivated.
  • Revoke — Permanently disable an agent. This cannot be undone. The agent’s SPIFFE ID can be re-registered with a new registration.