{
  "markdown": "# MCP Wallet Signer\n\n[![npm version](https://img.shields.io/npm/v/mcp-wallet-signer)](https://www.npmjs.com/package/mcp-wallet-signer)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![MCP Badge](https://lobehub.com/badge/mcp/user-mcp-wallet-signer)](https://lobehub.com/mcp/user-mcp-wallet-signer)\n\n> [!WARNING]\n> **Superseded by [browser-web3-signer](https://github.com/nikicat/browser-web3-signer)** — the same browser-wallet signing flow, reimplemented in Rust with a CLI plus Rust/TypeScript/Go libraries. mcp-wallet-signer still works, but new development happens there.\n\n**Your private keys never leave your browser.** Every transaction requires explicit user approval in your wallet.\n\nMost blockchain MCPs require you to paste a private key into a config file — giving the AI agent full, unsupervised access to your\nfunds. MCP Wallet Signer takes a different approach: it routes every transaction to your actual browser wallet — EVM wallets\n(MetaMask, Rabby, …) via [EIP-6963](https://eips.ethereum.org/EIPS/eip-6963), and TRON via TronLink — so you review and approve\neach action just like any other dapp interaction. No keys in config files, no risk of silent transactions.\n\n### Compatible With\n\n<a href=\"https://claude.ai/download\"><img src=\"https://img.shields.io/badge/Claude_Desktop-available-blue\" alt=\"Claude Desktop\"></a>\n<a href=\"https://docs.anthropic.com/en/docs/claude-code\"><img src=\"https://img.shields.io/badge/Claude_Code-available-blue\" alt=\"Claude Code\"></a>\n<a href=\"https://cursor.com\"><img src=\"https://img.shields.io/badge/Cursor-available-blue\" alt=\"Cursor\"></a>\n<a href=\"https://windsurf.com\"><img src=\"https://img.shields.io/badge/Windsurf-available-blue\" alt=\"Windsurf\"></a>\n\nWorks with any MCP-compatible client via stdio transport.\n\n## Installation\n\n### Claude Code CLI\n\n```bash\nclaude mcp add wallet-signer -- npx -y mcp-wallet-signer\n```\n\n(The name `wallet-signer` is just the MCP server identifier — pick anything you like. Legacy `evm-wallet` still works for users who installed before TRON support landed.)\n\n### Claude Desktop\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"wallet-signer\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-wallet-signer\"]\n    }\n  }\n}\n```\n\n### Run directly\n\n```bash\nnpx -y mcp-wallet-signer\npnpx mcp-wallet-signer\nbunx mcp-wallet-signer\n```\n\n## MCP Tools\n\n### EVM (MetaMask / Rabby / any EIP-6963 wallet)\n\n| Tool               | Description                            | Browser Required |\n| ------------------ | -------------------------------------- | ---------------- |\n| `connect_wallet`   | Connect wallet, return address         | Yes              |\n| `send_transaction` | Send ETH/tokens, call contracts        | Yes              |\n| `sign_message`     | Sign arbitrary message (personal_sign) | Yes              |\n| `sign_typed_data`  | Sign EIP-712 typed data                | Yes              |\n| `get_balance`      | Read ETH balance (via RPC)             | No               |\n| `get_token_balance`| Read ERC-20 balance (`balanceOf`/`decimals`/`symbol`) | No |\n\n### TRON (TronLink)\n\n| Tool                    | Description                                            | Browser Required |\n| ----------------------- | ------------------------------------------------------ | ---------------- |\n| `tron_connect_wallet`   | Connect TronLink, return Base58 (T…) address           | Yes              |\n| `tron_send_transaction` | Native TRX transfer                                    | Yes              |\n| `tron_trigger_contract` | TRC-20 / smart-contract call via `triggerSmartContract`| Yes              |\n| `tron_sign_message`     | Sign arbitrary message (`signMessageV2`)               | Yes              |\n| `tron_sign_typed_data`  | Sign TIP-712 typed data                                | Yes              |\n| `tron_get_balance`      | Read TRX balance (via TronGrid)                        | No               |\n| `tron_get_token_balance`| Read TRC-20 balance (`balanceOf`/`decimals`/`symbol`)  | No               |\n\n## How It Works\n\n1. Agent calls an MCP tool (e.g., `send_transaction` or `tron_send_transaction`)\n2. Server opens browser to a local signing page (EVM and TRON each run their own HTTP bridge on a separate port)\n3. User connects wallet and approves the action — in MetaMask/Rabby/etc. for EVM, in TronLink for TRON\n4. Result (address, tx hash, signature) returned to agent\n\nScreenshots below show the EVM approval UI; the TRON UI mirrors the same card layout with TronLink-specific copy and TRX denomination.\n\n| Connect Wallet | Send Transaction | Sign Message |\n|:-:|:-:|:-:|\n| ![Connect Wallet](https://raw.githubusercontent.com/nikicat/mcp-wallet-signer/master/packages/browser-evm-signer/docs/screenshots/connect-wallet.png) | ![Send Transaction](https://raw.githubusercontent.com/nikicat/mcp-wallet-signer/master/packages/browser-evm-signer/docs/screenshots/send-transaction.png) | ![Sign Message](https://raw.githubusercontent.com/nikicat/mcp-wallet-signer/master/packages/browser-evm-signer/docs/screenshots/sign-message.png) |\n\n## Supported Chains\n\nBuilt-in RPC URLs for:\n\n- Ethereum (1)\n- Sepolia (11155111)\n- Polygon (137)\n- Arbitrum One (42161)\n- Optimism (10)\n- Base (8453)\n- Avalanche (43114)\n- BNB Smart Chain (56)\n\n## Supported TRON Networks\n\n- Tron Mainnet\n- Shasta Testnet\n- Nile Testnet\n\n## Configuration\n\nEnvironment variables (optional):\n\n| Variable                    | Description                          | Default   |\n| --------------------------- | ------------------------------------ | --------- |\n| `EVM_MCP_PORT`              | EVM HTTP server port                 | 3847      |\n| `EVM_MCP_DEFAULT_CHAIN`     | Default EVM chain ID                 | 1         |\n| `TRON_MCP_PORT`             | TRON HTTP server port                | 3848      |\n| `TRON_MCP_DEFAULT_NETWORK`  | Default TRON network (mainnet/shasta/nile) | mainnet |\n\n## Packages\n\nThis is a monorepo with three published packages plus one internal one:\n\n| Package | Published | Description |\n| ------- | --------- | ----------- |\n| [`wallet-signer-core`](packages/wallet-signer-core) | internal | Chain-agnostic primitives (PendingStore, HTTP bridge, errors). Bundled into each chain package at build time — never installed directly. |\n| [`browser-evm-signer`](packages/browser-evm-signer) | npm + JSR | Standalone library — sign EVM transactions via MetaMask/Rabby/any EIP-6963 wallet |\n| [`browser-tron-signer`](packages/browser-tron-signer) | npm + JSR | Standalone library — sign TRON transactions via TronLink |\n| [`mcp-wallet-signer`](packages/mcp-wallet-signer) | npm | MCP server — exposes the EVM and TRON signers as MCP tools for AI agents |\n\nUse the chain-specific packages directly if you want browser-based signing in your own Node.js/Deno app without MCP.\n\n## Development\n\nRequires [Deno](https://deno.land/) v2.0+.\n\n```bash\n# Install all dependencies\ndeno task install:all\n\n# Type check + lint + format check (all packages)\ndeno task check:all\n\n# Run tests\ndeno task test:all\n\n# Build all npm packages\ndeno task build:all\n\n# Format code\ndeno task fmt\n```\n\n### Manual signing CLI\n\nA `signer-cli` script triggers the same flows that the MCP tools do, but from your shell —\nuseful for smoke-testing against a real wallet without going through an MCP client.\n\n```bash\n# Discover subcommands\ndeno task cli                                 # top-level help\ndeno task cli evm help                        # EVM subcommands\ndeno task cli tron help                       # TRON subcommands\ndeno task cli evm send-transaction --help     # subcommand flags\n\n# Examples (each opens a browser; sign in MetaMask / TronLink)\ndeno task cli evm  connect --chain 1\ndeno task cli evm  send-transaction --to 0x... --value 1000000000000000000\ndeno task cli evm  sign-message --message \"hello\"\ndeno task cli tron connect --network mainnet\ndeno task cli tron send-trx --to T... --amount 1000000\ndeno task cli tron trigger-contract --contract T... \\\n    --selector 'transfer(address,uint256)' \\\n    --params '[{\"type\":\"address\",\"value\":\"T...\"},{\"type\":\"uint256\",\"value\":\"1000000\"}]'\ndeno task cli tron get-balance --address T...   # no browser\n```\n\nThe approval URL is always printed up-front, and **every browser-interacting subcommand** (both chains, every flow except `get-balance` which doesn't open a browser) accepts `--browser <name>` and `--print`:\n\n```bash\n# Pick a specific browser (the one that has TronLink / MetaMask installed)\ndeno task cli evm  connect --browser firefox\ndeno task cli evm  sign-message --message \"hi\" --browser chrome\ndeno task cli tron send-trx --to T... --amount 1000000 --browser edge\ndeno task cli tron trigger-contract --contract T... --selector 'transfer(address,uint256)' \\\n    --params '[...]' --browser /usr/bin/brave-browser\n\n# Print the URL only — don't auto-open anything. Open it manually wherever you like\ndeno task cli evm  send-transaction --to 0x... --value 1000 --print\ndeno task cli evm  sign-typed-data --json typed.json --print\ndeno task cli tron connect --network shasta --print\ndeno task cli tron sign-message --message \"hello\" --print\n```\n\n`--browser <name>` accepts `chrome`, `firefox`, `edge`, `safari`, or a binary path. Useful when your system default doesn't have the wallet extension installed.\n\nPer-package `deno task trigger ...` works too if you're already inside `packages/browser-evm-signer/` or `packages/browser-tron-signer/`.\n\n### Project Structure\n\n```\ntools/\n└── signer-cli.ts            # Root dispatcher → per-package trigger CLIs\n\npackages/\n├── wallet-signer-core/      # Chain-agnostic primitives (npm: wallet-signer-core)\n│   ├── src/                  # PendingStore, HTTP bridge, errors, browser opener\n│   ├── tests/                # Core unit tests\n│   └── scripts/build-npm.ts\n│\n├── browser-evm-signer/      # EVM signing library (npm: browser-evm-signer)\n│   ├── src/                  # EVM types, viem transport, EIP-6963 approval UI\n│   ├── tools/trigger.ts      # Manual-trigger CLI\n│   ├── tests/                # Unit, e2e (HTTP), and e2e-browser (Playwright) tests\n│   └── scripts/build-npm.ts\n│\n├── browser-tron-signer/     # TRON signing library (npm: browser-tron-signer)\n│   ├── src/                  # TRON types, TronLink approval UI, TronGrid balance fetch\n│   ├── tools/trigger.ts      # Manual-trigger CLI\n│   ├── tests/                # Unit, e2e (HTTP), and e2e-browser (Playwright) tests\n│   └── scripts/build-npm.ts\n│\n└── mcp-wallet-signer/       # MCP server layer (npm: mcp-wallet-signer)\n    ├── src/                  # MCP tool definitions + CLI entry\n    └── scripts/build-npm.ts\n```\n\nA Deno [workspace](https://docs.deno.com/runtime/fundamentals/workspaces/) declaration at the root makes each member's import map visible to root-level scripts (notably `tools/signer-cli.ts` resolving `wallet-signer-core`).\n\nAll packages are built with [dnt](https://github.com/denoland/dnt) and use `node:` builtins (no Deno-specific APIs) so the npm bundles run under Node.js.\n\n## License\n\nMIT\n",
  "bytes": 11067,
  "sha": "3be101811c08c699f32867eec40af1638b68f3a38663de4327d4aaaa443a579b",
  "repo_slug": "nikicat/mcp-wallet-signer",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_nikicat_mcp_wallet_signer_ef743c39/readme"
}