{
  "markdown": "# xrpl-identity-mcp\n\n[![CI](https://github.com/jarod-vyent/xrpl-identity-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/jarod-vyent/xrpl-identity-mcp/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/xrpl-identity-mcp.svg)](https://www.npmjs.com/package/xrpl-identity-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n`xrpl-identity-mcp` is the first identity-focused MCP server for the XRP Ledger: DIDs ([XLS-40](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0040-decentralized-identity)), credentials ([XLS-70](https://github.com/XRPLF/XRPL-Standards/tree/master/XLS-0070-credentials)), multisig signer lists, and safe transaction prepare/verify/submit workflows. It prepares unsigned transactions, reads ledger state, verifies signed blobs against intent, and can submit pre-signed blobs without ever taking custody of keys.\n\nBuilt by [Jarod Vyent](https://github.com/jarod-vyent), from the team behind [SciPHR](https://sciphr.io).\n\n## Security Model\n\nThese invariants are core behavior:\n\n1. **No key custody.** The server has no seed, private key, mnemonic, wallet import, or signing path. Signing happens in the user's wallet or agent.\n2. **Network is explicit.** `XRPL_NETWORK` is `mainnet`, `testnet`, or `devnet`. The default is `testnet`. Every tool result includes `network`.\n3. **Mainnet submit is opt-in.** `tx_submit_signed` on mainnet is blocked unless `ALLOW_MAINNET_SUBMIT=true` is set.\n4. **Prepare, verify, then submit.** Write workflows return unsigned JSON with instructions to sign externally, call `tx_decode_verify`, and only then call `tx_submit_signed`.\n\n## Quickstart\n\nClaude MCP:\n\n```bash\nclaude mcp add xrpl-identity -- npx -y xrpl-identity-mcp\n```\n\nGeneric MCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"xrpl-identity\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"xrpl-identity-mcp\"],\n      \"env\": {\n        \"XRPL_NETWORK\": \"testnet\"\n      }\n    }\n  }\n}\n```\n\nEnvironment variables:\n\n| Variable | Values | Default | Purpose |\n| --- | --- | --- | --- |\n| `XRPL_NETWORK` | `mainnet`, `testnet`, `devnet` | `testnet` | Selects the XRPL network. |\n| `XRPL_ENDPOINT` | WebSocket URL | Network default | Overrides the rippled WebSocket endpoint. |\n| `ALLOW_MAINNET_SUBMIT` | `true` or unset | unset | Required for `tx_submit_signed` on mainnet. |\n\nDefault endpoints:\n\n| Network | Endpoint |\n| --- | --- |\n| `mainnet` | `wss://xrplcluster.com` |\n| `testnet` | `wss://s.altnet.rippletest.net:51233` |\n| `devnet` | `wss://s.devnet.rippletest.net:51233` |\n\n## Tools\n\n| Tool | What it does | Network writes? |\n| --- | --- | --- |\n| `did_resolve` | Resolve an XLS-40 DID object and fetch an `ipfs://` or `https://` DID document when present. | No |\n| `did_prepare_set` | Prepare an unsigned `DIDSet` transaction. | No |\n| `did_prepare_delete` | Prepare an unsigned `DIDDelete` transaction. | No |\n| `credential_prepare_create` | Prepare an unsigned `CredentialCreate` transaction. | No |\n| `credential_prepare_accept` | Prepare an unsigned `CredentialAccept` transaction. | No |\n| `credential_prepare_delete` | Prepare an unsigned `CredentialDelete` transaction. | No |\n| `credential_verify` | Read a credential object and report existence, acceptance, and expiration. | No |\n| `credential_list` | List up to 400 credential objects visible to an account, with issuer/subject filtering. | No |\n| `account_identity_summary` | Summarize auth posture, signer list, DID presence, and credential counts for an account. | No |\n| `signer_list_prepare_set` | Prepare an unsigned `SignerListSet` transaction for multisig create, replace, or delete. | No |\n| `tx_decode_verify` | Decode a signed blob, compute hash, and compare against expected intent. | No |\n| `tx_submit_signed` | Submit a pre-signed blob and poll for validation. Mainnet requires `ALLOW_MAINNET_SUBMIT=true`. | Yes |\n\n## Example Agent Flows\n\nResolve a DID and read its document:\n\n1. Call `did_resolve` with `address` set to a classic XRPL address or `did:xrpl:<address>`.\n2. Inspect `decoded.URI`, `decoded.Data`, and `decoded.DIDDocument`.\n3. If the URI is `ipfs://` or `https://`, inspect `document` and `documentSource`. Only text and JSON documents are inlined; binary content (for example an image) is reported as `documentSource`, `documentContentType`, and `documentByteLength` with `documentSkipped` explaining why the body was omitted.\n\nIssue and accept a credential on testnet:\n\n1. Set `XRPL_NETWORK=testnet`.\n2. Call `credential_prepare_create` with issuer, subject, credential type, optional expiration, and optional URI.\n3. Sign the returned `unsignedTx` externally with the issuer account.\n4. Call `tx_decode_verify` with the signed blob and the expected intent.\n5. Call `tx_submit_signed`.\n6. Call `credential_prepare_accept` for the subject, sign externally, verify with `tx_decode_verify`, then submit.\n7. Call `credential_verify` to confirm `accepted: true` and `expired: false`.\n\nVerify a signed blob before submitting:\n\n1. Call `tx_decode_verify` with `signedBlob` and an `expectedIntent` partial transaction JSON.\n2. Check `matches` and any `mismatches`.\n3. Submit only when the decoded transaction matches the user's intent.\n\n## Development\n\n```bash\nnpm install\nnpm run typecheck\nnpm run build\nSKIP_INTEGRATION=1 npm test\n```\n\nIntegration tests target testnet and are skipped when `SKIP_INTEGRATION=1`. To run the account summary integration test, set `XRPL_INTEGRATION_ACCOUNT` to a funded testnet account address.\n\n## License\n\nMIT\n",
  "bytes": 5540,
  "sha": "dc53e20ab784cdda5d389221a1b18bbaab40b959708fbc5aa2be22af8fd51ca7",
  "repo_slug": "jarod-vyent/xrpl-identity-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_jarod_vyent_xrpl_identity_mcp_1292a32e/readme"
}