# io.github.vdappdev2/identity (npm · @verusidx/identity-mcp)

MCP server for VerusID identities — register, update, revoke, recover, query, set timelock

- Trust score: 66/100 (medium)
- Change this week: +25
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@verusidx/identity-mcp`: 66/100 (this document), [markdown](https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp.md), [page](https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp)

## Channel facts

- Registry: `npm`
- Package: `@verusidx/identity-mcp`
- Version: `0.1.7`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (96 of 100), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 84 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 61/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4133 tokens (~375/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add vdappdev2-identity -- npx -y @verusidx/identity-mcp
```

### Codex

```bash
codex mcp add vdappdev2-identity -- npx -y @verusidx/identity-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "vdappdev2-identity": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@verusidx/identity-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add vdappdev2-identity --command npx --arg -y --arg @verusidx/identity-mcp
```

### Hermes

```yaml
mcp_servers:
  vdappdev2-identity:
    command: "npx"
    args: ["-y", "@verusidx/identity-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "vdappdev2-identity": {
      "command": "npx",
      "args": [
        "-y",
        "@verusidx/identity-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 65, +48)

- [security regression] Provenance: unverified → fail
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Stability: unverified → 0.20
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → excellent
- [functional] Licence: MIT

### 2026-07-31 (score 17, −7)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 24, −17)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 41)

First indexed and scored.

## MCP tools (11)

### `getidentity` (~210 tokens)

Look up a VerusID by name or i-address. Returns the identity's current state including primary addresses, signing authorities, content data (contentmultimap), revocation/recovery authorities, and wallet relationship (canspendfor/cansignfor). Optionally retrieve the identity as it existed at a specific block height. Use this to check if an identity exists, inspect its configuration, or verify wallet authority before performing write operations.

Input parameters:

- `chain` (string, required): Chain to query (e.g., "VRSC", "vrsctest")
- `height` (number): Return identity as of this block height. Default: current height. Pass -1 to include mempool.
- `identity` (string, required): VerusID name (e.g., "alice@") or i-address
- `txproof` (boolean): If true, returns a proof of the identity. Default: false.
- `txproofheight` (number): Height from which to generate the proof. Default: same as height.

### `getidentitycontent` (~262 tokens)

Get identity content/data with optional VDXF key filter and height range. Returns the cumulative content state — all content across all updates within the specified range. Unlike getidentityhistory, this does not return per-revision snapshots. Use this to read structured data stored on an identity (profiles, timestamps, application data) without needing to process the full revision history.

Input parameters:

- `chain` (string, required): Chain to query (e.g., "VRSC", "vrsctest")
- `heightend` (number): Only return content up to this height (inclusive). Default: 0 (max height). Pass -1 to include mempool.
- `heightstart` (number): Only return content from this height forward (inclusive). Default: 0.
- `identity` (string, required): VerusID name (e.g., "alice@") or i-address
- `keepdeleted` (boolean): If true, include deleted items. Default: false.
- `txproofheight` (number): Height from which to generate proofs.
- `txproofs` (boolean): If true, returns proofs. Default: false.
- `vdxfkey` (string): Filter to a specific VDXF key. The key is automatically bound to the identity and multimap key.

### `getidentityhistory` (~242 tokens)

Get the full revision history of a VerusID. Returns an array of identity snapshots, one per update transaction. Each entry shows the identity state as it was set in that specific transaction, along with the block hash, height, and transaction details. Use this to audit changes to an identity over time — primary address changes (transfers), content updates, authority changes, etc. Note: each history entry's contentmultimap shows only the content set in that specific update, not the cumulative state.

Input parameters:

- `chain` (string, required): Chain to query (e.g., "VRSC", "vrsctest")
- `heightend` (number): Only return history up to this height (inclusive). Default: 0 (max height). Pass -1 to include mempool.
- `heightstart` (number): Only return history from this height forward (inclusive). Default: 0.
- `identity` (string, required): VerusID name (e.g., "alice@") or i-address
- `txproofheight` (number): Height from which to generate proofs.
- `txproofs` (boolean): If true, returns proofs. Default: false.

### `getvdxfid` (~215 tokens)

Get the VDXF key ID from a URI string. Converts a human-readable VDXF URI (e.g., "vrsc::system.currency.export") into its on-chain i-address representation. Optionally combine with additional data (another VDXF key, a 256-bit hash, or an index number) to derive bound keys. Use this to resolve VDXF key names to i-addresses before querying getidentitycontent with a vdxfkey filter.

Input parameters:

- `chain` (string, required): Chain to query (e.g., "VRSC", "vrsctest")
- `indexnum` (number): Integer to combine with the key
- `uint256` (string): 256-bit hex hash to combine with the key
- `vdxfkey` (string): VDXF key or i-address to combine via hash
- `vdxfuri` (string, required): VDXF URI string (e.g., "vrsc::system.currency.export", "idname::userdefinedgroup.subgroup.name")

### `listidentities` (~164 tokens)

List VerusIDs in the local wallet. Returns all identities that this wallet can spend for, sign for, or watch. Use this to discover which identities are available before performing identity operations. By default includes identities we can spend for and sign for, but not watch-only.

Input parameters:

- `chain` (string, required): Chain to query (e.g., "VRSC", "vrsctest")
- `includecansign` (boolean): Include identities we can only sign for but not spend. Default: true.
- `includecanspend` (boolean): Include identities we can spend/authorize for. Default: true.
- `includewatchonly` (boolean): Include identities we can neither sign nor spend, but are watched or are co-signers. Default: false.

### `registernamecommitment` (~322 tokens)

Step 1 of identity registration. Creates a name commitment transaction that reserves a name without revealing it. The commitment hides the name itself while ensuring miners cannot front-run the registration. After this tool succeeds, wait 1 block before calling registeridentity (step 2). The commitment data is saved to disk so it persists across conversations — if a session ends before registration, the next session can pick up the commitment. Names must not have leading, trailing, or multiple consecutive spaces and must not include: \ / : * ? " < > | @

Input parameters:

- `chain` (string, required): Chain to register on (e.g., "VRSC", "vrsctest")
- `controladdress` (string, required): Address that will control this commitment. Must be present in the current wallet. This is not necessarily the address that will control the actual identity.
- `name` (string, required): The unique name to commit to. Creating a commitment is not a registration — if the name already exists, the daemon will reject the transaction.
- `parentnameorid` (string): Parent name or currency i-address. Dictates issuance rules and pricing. Only for PBaaS sub-identities.
- `referralidentity` (string): Friendly name or i-address of a referral identity, used to lower network cost of the ID.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*"). Sub-ID creation requires a transparent address.

### `registeridentity` (~875 tokens)

Step 2 of identity registration. Uses a confirmed name commitment to register the identity on-chain. The commitment must have been mined (wait 1 block after registernamecommitment). The tool checks for saved commitment data from a previous registernamecommitment call — if available, the agent does not need to pass the commitment details manually. On successful registration, the saved commitment file is cleaned up. IDENTITY DEFINITION: Keep it minimal — only include fields you are explicitly setting to non-default values. Omit revocationauthority/recoveryauthority to default to self. TIMELOCK: Do NOT include timelock in the identity JSON unless you deliberately intend to set an absolute block height lock. Omitting timelock defaults to 0 (unlocked). To configure timelocks safely after registration, use setidentitytimelock which provides setunlockdelay and unlockatblock controls. Setting a timelock value here creates an absolute block height lock that CANNOT be removed by updateidentity — only by revoke+recover. Omit privateaddress unless explicitly assigning one. SAFETY: NEVER set revocationauthority to another identity while leaving recoveryauthority as self — if the identity is revoked by the external authority, it cannot recover itself (recovery requires the recovery authority to act, and a revoked identity cannot authorize its own recovery). This bricks the identity. If delegating revocation, always also delegate recovery to a different identity. POSITIONAL PARAMS: The daemon RPC is positional: registeridentity jsonidregistration (returntx) (feeoffer) (sourceoffunds). If passing sourceoffunds, you must also fill returntx and feeoffer. FEE DISCOVERY: Call getcurrency (chain-mcp) on the parent currency to find idregistrationfees. For basket currencies, if idimportfees is a satoshi-scale value it encodes a reserve currency index: 0.00000000 = first reserve (index 0), 0.00000001 = second reserve (index 1), etc. The idregistrationfees amount is then denominated in tha…

Input parameters:

- `chain` (string, required): Chain to register on (e.g., "VRSC", "vrsctest")
- `feeoffer` (number): Amount to offer miner/staker for the registration fee. Default: standard price.
- `jsonidregistration` (object, required): Registration object containing: txid (from registernamecommitment), namereservation {name, salt, referral}, and identity definition {name, parent, primaryaddresses, minimumsignatures}. Only include r…
- `returntx` (boolean): If true, return the signed transaction hex instead of broadcasting. Default: false.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*"). Sub-ID creation requires a transparent address.

### `updateidentity` (~525 tokens)

Update an identity's fields — primary addresses, content, authorities, or any other mutable property. The wallet must hold authority to update (either primary authority, or token authority if tokenupdate is true). Pass the full identity definition with the desired changes. Fields not included revert to defaults — to preserve existing values, first read them with getidentity and include them in the update. Always include "parent" in the identity definition. PRIVATEADDRESS BEHAVIOR: Omit privateaddress entirely to preserve the existing one (carried over). Pass null to clear/remove it. Include a new zs1... address to change it. Empty string "" does NOT clear — daemon treats it the same as omitting. TIMELOCK: Do NOT include timelock in the identity JSON unless you deliberately intend to set an absolute block height lock. An absolute lock CANNOT be removed by updateidentity — only by revoke+recover. If setting a timelock, ensure revocationauthority and recoveryauthority are set to identities that can perform the revoke+recover to remove it. Omit timelock entirely to preserve the current value. Setting timelock to 0 is ONLY valid when there is no active timelock — it will be rejected if any timelock (delay or absolute) is currently set. Use setidentitytimelock for safe timelock configuration. SAFETY: NEVER set revocationauthority to another identity while leaving recoveryauthority as self — if revoked by the external authority, the identity cannot recover itself (a revoked identity cannot authorize its own recovery). This bricks the identity. If delegating revocation, always also delegate recovery to a different identity.

Input parameters:

- `chain` (string, required): Chain to update on (e.g., "VRSC", "vrsctest")
- `feeoffer` (number): Non-standard fee amount.
- `jsonidentity` (object, required): New identity definition. Must include "name" at minimum. Always include "parent" to ensure correct namespace resolution. revocationauthority/recoveryauthority accept friendly name (e.g., "alice@") or…
- `returntx` (boolean): If true, return signed transaction hex instead of broadcasting. Default: false.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*", or "z*" for private txs).
- `tokenupdate` (boolean): If true, use the tokenized ID control token for authority. Default: false.

### `revokeidentity` (~230 tokens)

Revoke an identity, making it unable to spend funds or sign transactions. Only the revocation authority (or token revocation authority) can perform this action. A revoked identity can only be restored by the recovery authority using recoveridentity. This is a safety mechanism — use it if the identity's private keys are compromised.

Input parameters:

- `chain` (string, required): Chain to revoke on (e.g., "VRSC", "vrsctest")
- `feeoffer` (number): Non-standard fee amount.
- `identity` (string, required): VerusID name (e.g., "alice@") or i-address to revoke
- `returntx` (boolean): If true, return signed transaction hex instead of broadcasting. Default: false.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*", or "z*" for private txs).
- `tokenrevoke` (boolean): If true, use the tokenized ID control token to revoke. Default: false.

### `recoveridentity` (~499 tokens)

Recover a revoked or compromised identity. Only the recovery authority (or token recovery authority) can perform this. Typically used to set new primary addresses after a key compromise, effectively transferring control to new keys. Pass the full identity definition with the desired recovery state (new primary addresses, etc.). Always include "parent" in the identity definition. PRIVATEADDRESS BEHAVIOR: Omit privateaddress entirely to preserve the existing one (carried over). Pass null to clear/remove it. Include a new zs1... address to change it. Empty string "" does NOT clear — daemon treats it the same as omitting. TIMELOCK: Do NOT include timelock in the identity JSON unless you deliberately intend to set an absolute block height lock or clear an existing one. Omitting timelock resets it to 0 (unlocked) — timelock does NOT carry over like privateaddress does. To clear a timelock via recovery, simply omit the timelock field. If setting a timelock value, ensure revocationauthority and recoveryauthority are set to identities that can perform a future revoke+recover to remove it, since absolute locks CANNOT be removed by updateidentity. Use setidentitytimelock after recovery for safe timelock configuration. SAFETY: When setting new authorities during recovery, NEVER set revocationauthority to another identity while leaving recoveryauthority as self — if later revoked by the external authority, the identity cannot recover itself. This bricks the identity. If delegating revocation, always also delegate recovery to a different identity.

Input parameters:

- `chain` (string, required): Chain to recover on (e.g., "VRSC", "vrsctest")
- `feeoffer` (number): Non-standard fee amount.
- `jsonidentity` (object, required): New identity definition for the recovered state. Always include "parent" for correct namespace resolution. revocationauthority/recoveryauthority accept friendly name (e.g., "alice@") or i-address.
- `returntx` (boolean): If true, return signed transaction hex instead of broadcasting. Default: false.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*", or "z*" for private txs).
- `tokenrecover` (boolean): If true, use the tokenized ID control token to recover. Default: false.

### `setidentitytimelock` (~589 tokens)

Set or modify a timelock on a VerusID. Timelocking restricts when an identity can spend funds on this chain. This only affects the identity on the current chain. Two modes:

\- setunlockdelay: Set a delay (in blocks) that must pass after an unlock request. Sets flags=2 (delay lock active), timelock=N (the delay in blocks). The identity cannot spend until an unlock is triggered and the delay passes.

\- unlockatblock: Set an absolute block height at which the identity unlocks. When used with unlockatblock=0 on a delay-locked identity (flags=2), it TRIGGERS the unlock countdown — the daemon converts the delay into an absolute block height (approximately current_block + delay) and clears the delay flag. This is the standard way to initiate unlocking a delay-locked identity. unlockatblock=0 does NOT work on absolute block height locks (flags=0, timelock > 0) — those can only be removed by revoke+recover.

Exactly one of unlockatblock or setunlockdelay must be specified.

TIMELOCK WORKFLOW: 1) Set delay: setunlockdelay=N → identity locked with N-block delay. 2) Trigger unlock: unlockatblock=0 → countdown starts, identity unlocks at ~current_block+N. 3) Wait for block to pass. 4) Identity can spend again. To cancel a countdown (e.g., attacker triggered unlock), the revocation authority can revoke — revocation destroys the countdown entirely. Then recover to restore the identity with no timelock.

REMOVING TIMELOCKS: Delay locks (flags=2) can be cleared by revoke+recover (omit timelock in recovery JSON). Absolute locks (flags=0, timelock > 0) can ONLY be cleared by revoke+recover. updateidentity CANNOT modify or remove any timelock once set.

Input parameters:

- `chain` (string, required): Chain to set timelock on (e.g., "VRSC", "vrsctest")
- `feeoffer` (number): Non-standard fee amount.
- `identity` (string, required): VerusID name (e.g., "alice@") or i-address
- `returntx` (boolean): If true, return signed transaction hex instead of broadcasting. Default: false.
- `setunlockdelay` (number): Number of blocks to delay after unlock request. Mutually exclusive with unlockatblock.
- `sourceoffunds` (string): Source address for funds. If the user has not specified a preferred address, ask which address to use or if they prefer a wildcard ("*", "R*", "i*", or "z*" for private txs).
- `unlockatblock` (number): Absolute block height to unlock at. Mutually exclusive with setunlockdelay.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp#diagnostics

## Score history

- 2026-08-03: 66
- 2026-08-02: 65
- 2026-08-01: 17
- 2026-07-31: 17
- 2026-07-30: 24
- 2026-07-28: 41
- 2026-07-27: 41

## Links

- npm package: https://www.npmjs.com/package/@verusidx/identity-mcp
- Socket report: https://socket.dev/npm/package/@verusidx/identity-mcp
- Repository: https://github.com/vdappdev2/verusidx-mcp
- Changelog RSS feed: https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/vdappdev2-identity/verusidx-identity-mcp
