dgb-digiid-mcp
v0.1.0
Published
Give an AI agent a verifiable identity via Digi-ID: sign auth challenges and prove who it is, no passwords. Pairs with DigiByte agent payments.
Maintainers
Readme
dgb-digiid-mcp
Give an AI agent a verifiable identity. An MCP server that lets an agent prove who it is using Digi-ID — DigiByte's passwordless authentication — by signing a challenge with a key it never reveals.
The natural companion to dgb-digidollar-mcp: an agent that can prove who it is and pay for what it uses — the two genuinely chain-shaped problems of the agent era, both on a decentralized rail.
Works on testnet or mainnet. Signing and verifying are pure cryptography, so the node does not need to be synced or funded — any DigiByte node with the identity wallet loaded will do. And because no money is involved, it's safe on mainnet from day one.
The flow
Service ──"prove who you are": digiid://mysite/cb?x=<nonce>──▶ Agent
Agent ──signs the URI with its identity key──────────────▶ (no key revealed)
Agent ──POST { address, uri, signature } ─────────────────▶ Service /callback
Service ──verifies signature + domain + nonce──────────────▶ authenticated as <address>The agent's address is its identity. A service recognises the same agent across sessions without ever handling a password or a shared secret.
Proven end to end (see example/service.js): an agent authenticated to a
service through the MCP server, and a forged response — the correct challenge
signed with the wrong key but claiming the identity address — was rejected with
"signature does not verify."
Why it can't be faked
- The signature is bound to the address. Only the holder of the identity's
private key can produce a signature that
verifymessage(address, sig, uri)accepts. Claiming someone else's address doesn't help — the math won't verify. - Domain-bound. The signed message is the full
digiid://URI including your domain, so a signature the agent made for another site can't be replayed at yours. - Nonce / one-time use. Each challenge carries a random nonce the service issued and burns on use, so a captured response can't be replayed.
- Legacy-address requirement, handled. DigiByte message signing only works with legacy (P2PKH) addresses, not bech32 — the server checks this at startup and fails loudly rather than mysteriously.
Tools (agent side)
| Tool | What it does |
|------|--------------|
| get_identity | Return the agent's Digi-ID address — its stable public identity. Reveals no secret. |
| authenticate | Given a digiid:// challenge, sign it and POST the response to the service's callback. Returns the service's reply. The agent's "log in." |
Library (service side)
src/digiid.js is a dependency-free module a service uses to challenge and verify:
import { buildChallenge, verifyResponse } from "dgb-digiid-mcp";
const { uri, nonce } = buildChallenge({ domain: "mysite.com" });
// ...show uri to the agent (or as a QR to a human's Digi-ID wallet)...
const result = await verifyResponse(
{ address, uri, signature },
{ verifyMessage, expectedDomain: "mysite.com", isNonceValid }
);
if (result.ok) authenticateSession(result.identity);Because Digi-ID is a published standard, the same server works for human Digi-ID wallets too — not just agents.
Setup
Point it at any DigiByte node and give it a legacy identity address:
digibyte-cli -rpcwallet=identity getnewaddress "agent" "legacy" # note the "legacy"
npm install
cp .env.example .env # RPC creds + DIGIID_ADDRESSRun the demo (a passwordless login service + the agent authenticating to it):
node --env-file=.env example/service.js # terminal 1
# then drive the MCP server's `authenticate` tool against the challenge from GET /loginAdd to your MCP client (npx dgb-digiid-mcp), env: DGB_RPC_URL, DGB_RPC_USER,
DGB_RPC_PASSWORD, DGB_WALLET, DIGIID_ADDRESS.
Related
- dgb-digidollar-mcp — the agent pays in DigiDollar.
- dgb-x402 — services accept those payments.
- dgb-chain-mcp — the agent queries DigiByte.
Independent community project. Not affiliated with the DigiByte Foundation. MIT licensed.
