identity.ts or identity.py compile and deploy unchanged. When you add a declaration, mda wires auth, scoping, and a frozen runtime.identity object into tools and middleware.
Managed Deep Agents is in private beta, available on LangSmith Cloud in the US region only. Join the waitlist to request access.
Why identity matters for agents
Without identity, a Managed Deep Agent has one shared boundary for the whole deployment. That is fine for a personal prototype. It breaks as soon as real users show up:
Deep Agents make this sharper than a simple chatbot: they keep durable memory, resume long-running threads, and call tools on the user’s behalf. Identity turns “who is calling?” into hard isolation instead of hoping the prompt or the UI keeps people apart.
Three ideas to know first
You only need three ideas before you write any config:
A few important clarifications:
- Actor is not the agent. It is the caller the run represents.
- Tenant is not a LangSmith workspace. Single-tenant agents have no tenant.
- Fail closed means a missing required actor or tenant rejects the request. The runtime never falls back to “everyone’s” memory or threads.
- Threads: who can open or resume a conversation
- Memory: which durable Context Hub slice the run can see
- Credentials: whose token downstream tool calls use (the signed-in user, or one shared agent token)
Choose a preset
Presets encode the common product shapes so you do not invent scoping rules on day one. Start here, then override only what differs. Before you read the table, these scope values mean:
Credentials is the product difference many teams care about first:
actor: downstream calls can act as the signed-in user (for example call GitHub as Alice).agent: downstream calls use one shared bot or service token for everyone.
All presets default to
trusted_backend ingress and tenancy: "single", except multi-tenant-saas, which sets tenancy: "multi".
Add an identity declaration
Createidentity.py or identity.ts next to your agent entry and export a named identity. Most projects start from a one-line preset:
mda generates the custom auth handler, injects it into the compiled LangGraph app, and only then enables reserved identity headers and token verification.
Ingress: how Managed Deep Agents learns who is calling
Ingress is only the how: how the runtime learns the actor (and tenant) for this request. Pick one HTTP mode.Trusted backend (recommended default)
Your own API authenticates the user (session, OAuth, or similar), then proxies LangGraph requests with a shared ingress secret and reserved identity headers. The browser never sends the secret or raw identity-provider (IdP) tokens to Managed Deep Agents. This is the default for presets and the usual path when you already have a backend in front of the agent. Required headers (case-insensitive):
Use a preset that defaults to trusted-backend ingress:
MDA_INGRESS_SECRET in .env for mda dev and as a hosted deployment secret for mda deploy. Your production backend should authenticate the user, then attach the headers above when proxying agent traffic.
Example shape for a backend proxy (pseudocode):
Validated token (browser-direct)
Use this when the browser talks to the deployment directly and you do not want a proxy that asserts actor headers. The client sendsAuthorization: Bearer <token>. Managed Deep Agents verifies the token server-side and maps claims (fields inside the token, such as user id) into runtime.identity.
Verification can use:
- JWKS: public keys your IdP publishes so the runtime can verify signed JWTs
- OIDC discovery: standard metadata that points the runtime at those keys
- Opaque introspection: call the IdP to ask whether a non-JWT token is still valid
- Guest tokens: short-lived tokens signed by Managed Deep Agents for anonymous visitors
validated_token mode, your frontend signs the user in with the same IdP you configured, reads an access token (or ID token where applicable), and passes it to the LangGraph client as Authorization: Bearer <token>. Do not send refresh tokens or client secrets to the deployment.
When more than one provider is configured, each entry needs an id. Managed Deep Agents routes JWT providers by token iss (issuer) and fails closed when the issuer is unknown.
For provider-specific options and client examples, see Provider setup guides.
Secrets checklist
Put local values in
.env. mda deploy forwards non-reserved .env values as hosted deployment secrets. Provider-specific secrets (for example Supabase introspection) are listed in Provider setup guides.
Use runtime.identity in tools and middleware
When identity is declared, authored tools and middleware receive a frozen runtime.identity object built from the trusted auth result. Client-supplied spoofable identity keys are stripped from configurable.
The identity object looks like this:
runtime parameter as ManagedDeepAgentRuntime so you get typed access to identity (and optional credentials). Use it whenever a tool or middleware hook needs to know who triggered the run, for personalization, audit logs, or branching on verified claims, without trusting anything from the request body.
runtime.identity over client-supplied configurable keys for actor or tenant ids. For other per-run values such as feature flags, use normal LangChain runtime context.
Customize scoping
Presets cover the common cases. To customize, setscoping explicitly:
If
tenancy is "single", do not set any scoping axis to "tenant", there is no tenant to scope by. If a request is missing the actor or tenant id that scoping needs, Managed Deep Agents rejects it with 403 instead of falling back to shared data.
For how memory paths remount under each scope, see Scope memory with identity.
Custom downstream credentials
Usescoping.credentials: "custom" when your application can securely obtain a per-actor credential for a downstream target. Provide a resolve function; tools then call runtime.credentials.for(target) to obtain the headers for that request. Resolved credentials are kept in memory and are never written to thread state or traces.
The token that proves a caller’s identity is not automatically a credential for downstream APIs. For example, a Supabase access token lets Managed Deep Agents identify the caller, but it is not a GitHub API token. Your backend or credential service must hold (and, when needed, refresh) the caller’s separately authorized GitHub credential.
getGitHubAccessToken is application code: it looks up and refreshes that grant in your server-side credential store.
identity.ts
await runtime.credentials.for({ kind: "connection", name: "github", intent: "write" }) and pass them to your GitHub client.
To expose LangSmith capabilities to browsers or other untrusted callers, add a LangSmith connector. It requires identity so capability routes can resolve the caller and prove ownership before calling LangSmith server-side.
Provider setup guides
These guides cover the built-in providers for validated token ingress. Use one provider, or combine them as in the example in that section.- Guest tokens
- Supabase
- GitHub
Anonymous visitors get a short-lived, actor-scoped session without signing in. Managed Deep Agents signs guest tokens with On success:Reclaim a token when the current one is expired or missing. While a token is still valid, reuse it so the guest keeps the same actor id, threads, and memory scope for the token lifetime.
MDA_GUEST_SIGNING_KEY (HS256) and maps sub → actor.Guest is usually combined with another IdP, as in the validated token example.Set
MDA_GUEST_SIGNING_KEY in .env for mda dev and as a hosted deployment secret for mda deploy.Claim a guest token
With guest issuance enabled, the deployment exposesPOST /identity/guest. Send an empty POST with Content-Type: application/json. If the deployment requires a public app key (LANGGRAPH_AUTH_SECRET), also send X-Auth-Key.Use the guest token
Send the token the same way you send IdP access tokens:Test and deploy
Test the project locally withmda dev, then deploy it with mda deploy. Open deployment traces in LangSmith to inspect model calls, tool calls, errors, and latency.
Identity misconfiguration usually surfaces as 401 (auth) or 403 (store/thread scope) during local Studio or the first authenticated request. Confirm the matching secret is present and that trusted-backend proxies attach the reserved headers.
Next steps
Memory
See how identity remounts per-actor or per-tenant memory.
Custom tools
Read
runtime.identity from authored tools.Schedules
Run cron agents, including the
service preset shape.LangSmith connector
Expose constrained LangSmith capabilities to untrusted callers.
How it works
See how compile and deploy wire auth into the runtime.
CLI reference
Look up project files and identity wiring in
mda.Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

