Project releases

Agent Name Service v2 makes an agent prove it owns its name

A name is only useful if someone can prove they control it. The September 10 revival gives Agent Name Service real Ed25519 bindings with a pinned issuer and expiry, a SQLite registry with durable revocation, and audience-bound single-use challenges.

GitHub activity: · Published:

What it does

When agents talk to each other, the first question is who is speaking. Agent Name Service gives an agent a verifiable name and a way to prove control of it, using ordinary public-key cryptography rather than a trust-me identifier.

Identity bindings are real Ed25519 signatures with a pinned issuer and an expiry. The registry is SQLite with unique names, capacity bounds and durable revocation, so a withdrawn name stays withdrawn.

What changed

Commit 0565783, merged as pull request #4 on September 10, replaces a 2025 prototype with a v2 alpha: signed bindings, the registry, audience-bound subject signatures with single-use server challenges, a local CLI, an SDK 2 MCP verification surface with a policy resource, and validation covering tampering, expiry, replay and persistence.

The historical TypeScript in src/ and the sparc-agent prototypes are unsupported. The supported API is v2/identity.mjs and nothing else.

Get started

Node 24, plus Python 3.12 for the Guardrail dependency:

git clone https://github.com/ruvnet/Agent-Name-Service.git
cd Agent-Name-Service
npm ci
npm test
npm run benchmark

Expected result: the test suite passes, including the tampering, expiry and replay cases. That suite is the actual demonstration — there is no hosted demo.

The agent interface runs from the harness runtime:

npm ci --prefix .harness/runtime
node .harness/runtime/cli.mjs status
node .harness/runtime/cli.mjs mcp

This is a local identity library. It is not X.509, not DNS, not a public certificate authority and not Nostr identity. Production issuance needs operator-managed keys and a private database, which installation does not provide.

Use it today

Practical case: a fleet of internal agents that must not be able to impersonate one another. Input is a name and a key pair. Workflow is register the binding, issue a challenge, verify the audience-bound response. Output is a yes or no you can log.

Acceptance test: replay a previously successful challenge response. Verification must fail, because challenges are single use. If a replay succeeds, the whole scheme is decorative.

Push it further

Experimental commentary. Pairing these bindings with the Ruflo federation's per-participant keys is the interesting direction: a name that resolves to a key, and a relay that only accepts events signed by the key that authenticated.

Limitation: nothing here distributes trust. A binding is only as good as the issuer you pinned, and this release does not solve issuer distribution. Falsifiable test: expire a binding, then verify it. It must be refused on expiry alone, without needing revocation.

Read the original on GitHub commit

Commit 0565783 — implement secure v2 domain runtime with tested MCP CLI and MetaHarness governance (#4)

Agent Name Service repository

Back to the newsroom