Skip to main content
The production revamp (PR series #124–#128) ships abadge’s canonical production surface. Existing integrations keep working. New integrations should target the changes below.

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:
A profile-target grant means the agent has the capability on every item currently in the profile and every item added in the future. This is the right shape when you want a stable contract with an agent and don’t want to add a grant every time you rotate a credential. Profile + 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 default server_managed profile in the same transaction. The response shape:
The web dashboard’s onboarding flow is now a single screen. To start storing items immediately, hit 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:
The original 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 the abadge CLI are unchanged on the wire, and the request/response shapes of every /v1 endpoint are stable — code written against the API does not need to change.
  • Legacy capability names on the wire (mapped to canonical at write).
  • Existing permissions rows with legacy capability names (normalized at read).
  • Authentication surface at /api/auth/* (unchanged).
  • Existing keypair agent enrollments and abs_ sessions.
If you find a behavior that broke without a deprecation path, open an issue — that’s a bug.