Back to MCP directory
publicPublicdnsLocal runtime

mcp-wallet-signer

MCP Wallet Signer是一个安全的区块链钱包签名工具,通过浏览器钱包(如MetaMask)进行交易审批,确保私钥永不离开浏览器,为AI代理提供安全的EVM链交互能力。

article

README

🚀 MCP钱包签名器

MCP钱包签名器可确保您的私钥不会离开浏览器,每笔交易都需在钱包中获得用户明确批准。它改变了传统区块链MCP需将私钥粘贴到配置文件的方式,通过EIP - 6963将交易路由到浏览器钱包,让您像与其他dapp交互一样审查和批准每个操作,避免配置文件中私钥的风险和静默交易。

🚀 快速开始

本项目与任何支持MCP的客户端通过标准输入输出传输方式兼容。

✨ 主要特性

  • 私钥安全:私钥不会离开浏览器,每笔交易都需用户明确批准。
  • 安全交易:通过EIP - 6963将交易路由到浏览器钱包,避免配置文件中私钥的风险和静默交易。
  • 多工具支持:提供如连接钱包、发送交易、签署消息等多种MCP工具。
  • 多链支持:内置多个区块链网络的RPC URL。

📦 安装指南

Claude Code CLI

claude mcp add evm-wallet -- npx -y mcp-wallet-signer

Claude Desktop

将以下内容添加到 claude_desktop_config.json

{
  "mcpServers": {
    "evm-wallet": {
      "command": "npx",
      "args": ["-y", "mcp-wallet-signer"]
    }
  }
}

直接运行

npx -y mcp-wallet-signer
pnpx mcp-wallet-signer
bunx mcp-wallet-signer

💻 使用示例

基础用法

MCP工具使用示例: | 工具 | 描述 | 是否需要浏览器 | | ------------------ | -------------------------------------- | ---------------- | | connect_wallet | 连接钱包,返回地址 | 是 | | send_transaction | 发送ETH/代币,调用合约 | 是 | | sign_message | 签署任意消息 (personal_sign) | 是 | | sign_typed_data | 签署EIP - 712类型数据 | 是 | | get_balance | 读取ETH余额 (通过RPC) | 否 |

高级用法

工作流程

  1. 代理调用MCP工具(例如 send_transaction)。
  2. 服务器在浏览器中打开本地签名页面。
  3. 用户连接钱包并批准操作。
  4. 将结果(地址、交易哈希、签名)返回给代理。

📚 详细文档

支持的链

内置以下区块链网络的RPC URL:

  • 以太坊 (1)
  • Sepolia (11155111)
  • 多边形 (137)
  • Arbitrum One (42161)
  • Optimism (10)
  • Base (8453)
  • 雪崩 (43114)
  • BNB智能链 (56)

配置

可通过以下环境变量进行配置(可选): | 变量 | 描述 | 默认值 | | ----------------------- | ---------------- | ------- | | EVM_MCP_PORT | HTTP服务器端口 | 3847 | | EVM_MCP_DEFAULT_CHAIN | 默认链ID | 1 |

开发

需要 Deno v2.0+。

# 安装依赖
deno install
cd web && deno install && cd ..

# 在开发模式下运行MCP服务器
deno task dev

# 运行Web UI开发服务器(在单独的终端中)
deno task dev:web

# 运行测试
deno task test

# 构建Web UI
deno task build:web

# 为npm构建
deno task build:npm

# 格式化代码
deno task fmt

# 代码检查
deno task lint

项目结构

本项目使用 Deno 开发,并通过 dnt 发布到npm。src/ 中的源代码使用 node: 内置模块(无Deno特定API),因此npm包可以在Node.js下运行。

deno.jsonc              # Deno配置 + npm包元数据(版本的单一事实来源)
server.json             # MCP注册表清单(由LobeHub等从git读取)
scripts/build-npm.ts    # dnt构建脚本:读取deno.jsonc,将src/转换为npm/
├── src/                # 服务器源代码(TypeScript,可在Deno和Node下运行)
│   ├── index.ts        # CLI入口点
│   ├── mcp-server.ts   # MCP工具定义
│   ├── http-server.ts  # 用于浏览器批准UI的懒启动HTTP服务器
│   ├── wallet-signer.ts # 核心签名编排
│   ├── pending-store.ts # 基于Promise的请求跟踪
│   ├── schemas.ts      # MCP工具输入的Zod模式
│   ├── transport.ts    # viem自定义传输
│   ├── viem-account.ts # viem本地账户适配器
│   ├── mod.ts          # 库导出(npm: "mcp-wallet-signer")
│   ├── wallet-only.ts  # 库导出(npm: "mcp-wallet-signer/wallet-only")
│   └── version.ts      # 在运行时从package.json读取版本
├── web/                # Svelte UI(钱包批准页面)
│   └── src/
│       ├── App.svelte
│       └── components/ # ConnectWallet, TransactionSigner, MessageSigner
├── tests/
│   ├── *.test.ts       # 单元测试
│   ├── e2e/            # 端到端测试(HTTP API)
│   └── e2e-browser/    # 端到端测试(Playwright,真实浏览器钱包)
└── npm/                # 生成的 — dnt输出 + 构建的Web资产

构建流程

deno task build:npm 运行 scripts/build-npm.ts,该脚本执行以下操作:

  1. 通过dnt将 src/ 转换为ES模块JavaScript → npm/esm/
  2. deno.jsonc 中的元数据生成 npm/package.json
  3. 构建Svelte Web UI (web/web/dist/)。
  4. 将Web资产复制到 npm/web/

开发工作流程

deno task dev        # 直接使用Deno运行MCP服务器
deno task dev:web    # Web UI的Vite开发服务器(在单独的终端中)
deno task test       # 单元 + 端到端API测试
deno task check      # 类型检查 + 代码检查 + 格式化检查

📄 许可证

本项目采用MIT许可证。

help

Runtime guide

cloud

Hosted runtime

Hosted servers run from a provider-managed environment. You usually connect the MCP client to the hosted endpoint or follow the provider's authorization flow, without keeping a local process alive

  1. Open provider connection page
  2. Authorize or copy endpoint
  3. Connect from your MCP client
terminal

Local runtime / other methods

Local servers run on your own machine or infrastructure. You normally copy the server_config into your MCP client, install the required package, and provide env variables from env_schema when needed

  1. Copy server_config
  2. Install required package
  3. Fill env variables and restart client