About EVM Wallet Signer
An MCP server and library packages for routing EVM signing requests to browser wallets, aimed at users who want to approve transactions in their wallet rather than provide private keys to tooling. The repository is superseded by browser-web3-signer, and its current packages act as compatibility shims.
Key features
- 01Connect a browser wallet and return its address
- 02Submit transactions for wallet approval
- 03Sign messages with personal_sign
- 04Sign EIP-712 typed data
- 05Keep private keys in the browser
- 06Compatibility shims for earlier packages
Use cases
- 01Approve an EVM transaction through a browser wallet
- 02Sign a message without placing a private key in a config file
- 03Sign EIP-712 data using a connected wallet
- 04Continue using existing installs that depend on the shims
MCP support
The stdio MCP server exposes four tools: connect_wallet, send_transaction, sign_message, and sign_typed_data. Signing requests go through browser-web3-signer to the browser wallet for explicit approval.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y mcp-wallet-signerEVM_MCP_PORTHTTP server port for the browser approval UI (default: 3847)EVM_MCP_DEFAULT_CHAINDefault EVM chain ID (default: 1 for Ethereum mainnet)Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
5Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| chainId | number | No | Chain ID to connect to (default: 1 for Ethereum mainnet) |
Details
From the project READMEmcp-wallet-signer
Warning
Superseded by browser-web3-signer — the same browser-wallet signing flow, reimplemented in Rust with a CLI plus Rust/TypeScript/Go libraries. Everything published from this repo is now a thin compatibility shim over it, so existing installs keep working; new code should use
browser-web3-signerdirectly.
Your private keys never leave your browser. Every transaction requires explicit approval in your own wallet (MetaMask, Rabby, TronLink, …).
Most blockchain tooling wants a private key in a config file — full, unsupervised access to your funds. These packages route each request to the browser wallet you already use, so you review and approve it like any other dapp interaction.
Packages
| Package | What it is now |
|---|---|
mcp-wallet-signer | MCP stdio server: four signing tools over browser-web3-signer |
browser-evm-signer | The old WalletSigner EVM library API, re-backed by the Rust bridge |
browser-tron-signer | The same for TRON (TronLink, TRC-20, contract deploys) |
All three spawn browser-web3-signer serve, which owns the localhost bridge, the approval page
and the browser tab. The binary for your platform is installed as a dependency; nothing else to
set up.
MCP server
claude mcp add wallet-signer -- npx -y mcp-wallet-signer
Or, for Claude Desktop / Cursor / Windsurf and any other stdio MCP client:
{
"mcpServers": {
"wallet-signer": {
"command": "npx",
"args": ["-y", "mcp-wallet-signer"]
}
}
}
| Tool | Description |
|---|---|
connect_wallet | Connect a wallet, return the address |
send_transaction | Send value or call a contract, return the tx hash |
sign_message | personal_sign a message, return the signature |
sign_typed_data | Sign EIP-712 typed data, return the signature |
EVM_MCP_DEFAULT_CHAIN sets the chain id used when a call omits one (default: 1).
Libraries
import { WalletSigner } from "browser-evm-signer";
const signer = new WalletSigner({ defaultChainId: 8453 });
const { address } = await signer.connectWallet();
const { txHash } = await signer.sendTransaction({ to: "0x…", value: "1000000000000000000" });
What changed in the shims
- Gone:
PendingStore,pendingStore,createHttpServer,startTestServer,buildConnectUrl,buildSignUrl,openBrowser— the in-process HTTP bridge they drove no longer exists. approvalUrlis now the bridge's base URL. The bridge opens the approval page itself and does not hand the per-request URL back.port(the constructor option) is ignored: the bridge binds its own free port.getPort()/DEFAULT_PORTstill resolve, for source compatibility.- MCP: the balance tools (
get_balance,get_token_balance) and the TRON tools are gone from the MCP server. Balances never needed a wallet — any RPC-reading MCP server orcast calldoes them without an approval prompt — and TRON signing is a CLI away.WalletSigner.getBalanceand.getTokenBalanceare untouched in both libraries. - Deprecated on npm and JSR.
[email protected]never worked at all: itsexportspointed at./esm/mod.jswhile the tarball shipped./esm/browser-evm-signer/src/mod.js, which took[email protected]down with it (#2).
The pre-shim Deno implementation — the in-process bridge, the Svelte approval UI, the
wallet-signer-core package — is in the history, up to commit
636fd3b.
Development
npm install
npm test # builds, then runs each package's tests against a fake bridge
Releases are per package: tag <package>@<version> and publish a GitHub release.
License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.