TL;DR
REST endpoints
v1 introduces a public JSON REST API under/v1/..., with an OpenAPI 3.1
spec at /v1/openapi.json. See the API reference. A sample
of the common operations:
Capability collapse: read and use
The four legacy capabilities collapse to two canonical actions:
The server stores grants with the canonical names; legacy names are
normalized at the API boundary. Existing rows in
permissions are
upgraded on read. New code should write read or use.
read is the higher-privilege capability — the agent sees plaintext.
use is what you grant when the agent only needs to invoke a process
with a secret. The dashboard’s permission UI surfaces just the two
checkboxes.
Profile-level grants
Grants now have two target shapes:read is the highest-blast-radius grant in abadge. The
dashboard surfaces a confirmation dialog before creating one. Prefer
use or an item-target grant when you can.
Profile externalId
Profiles now carry an optional externalId field — a stable, customer
or tenant-supplied string scoped per-org with a partial-unique index.
Use it when you provision profiles from an external system (per-customer
tenancy, per-environment isolation) and want to address them with your
own identifier instead of abadge’s UUID. The default profile created
when you POST /v1/orgs has externalId: "default".
Onboarding
Creating an org now auto-creates a defaultserver_managed profile in
the same transaction. The response shape:
POST /v1/orgs and use
response.defaultProfile.id directly. Create additional profiles (ZK,
per-customer, etc.) with POST /v1/orgs/{orgId}/profiles.
CLI verb renames
The deprecated verbs print a deprecation notice to stderr and
re-dispatch to the canonical verb. Hidden from
--help. Drop them
whenever you’re rewriting a script.
The new top-level abadge use verb switches active org/profile:
MCP runtime tool unification
run_with_secret and run_with_all_secrets are replaced by
use_secret. It accepts exactly one target:
The output shape adds
injectedCount in bulk mode; everything else
matches the old shapes. Subprocess stdout/stderr is still never returned
to the model.
The legacy tool names are no longer registered. Clients that hard-coded
them must switch to use_secret.
SDK namespace
@abadge/sdk exports a Abadge namespace pointing at the same client
classes. Abadge.User and Abadge.Agent are constructors — call them
with new:
AbadgeUserClient / AbadgeAgentClient names are still
exported and continue to work — Abadge.User is just an alias for
AbadgeUserClient and Abadge.Agent for AbadgeAgentClient. Migration
is purely stylistic.
What still works
- Existing integrations keep working. The official SDK (
@abadge/sdk) and theabadgeCLI are unchanged on the wire, and the request/response shapes of every/v1endpoint are stable — code written against the API does not need to change. - Legacy capability names on the wire (mapped to canonical at write).
- Existing
permissionsrows with legacy capability names (normalized at read). - Authentication surface at
/api/auth/*(unchanged). - Existing keypair agent enrollments and
abs_sessions.