🌐 PortalMCP
通用以太坊 AI 网关
一个服务器。连接所有 AI。掌控整个链。
将任何模型上下文协议 (MCP) 客户端(Claude、ChatGPT、Gemini、Cursor、Windsurf、Cline、自定义代理等)通过自然语言接入以太坊。检查余额、兑换代币、铸造 NFT、生成并部署智能合约。
👁 MCP SDK
👁 Ethers
👁 TypeScript
👁 License
👁 Release
✨ 为什么选择 PortalMCP
大多数 AI 区块链集成将你锁定在单一 LLM 或单一客户端中。PortalMCP 是一个符合规范的 MCP 服务器 —— 同一个服务器,无论是在本地运行还是在 VPS 上运行,都能为所有支持 MCP 的客户端提供支持。
🔐 非托管 —— 私钥永远不会离开你的机器 🛰️ 实时链上上下文 —— 资源将 ETH 余额、交易回执和代币元数据直接流式传输到你的对话中 🛡️ 安全第一 —— 每个工具都声明了读取/破坏性/幂等性提示,以便客户端在广播前进行确认 🧩 通用 —— 支持 stdio 和 HTTP,可与现有的所有 MCP 客户端配合使用
Related MCP server: MCP Crypto Wallet EVM
🧭 兼容客户端
客户端 | 传输方式 | 备注 |
🟣 Claude Desktop (macOS/Windows) | stdio | 下方有直接配置 |
🌐 Claude.ai web + mobile | HTTP | 添加为 自定义连接器 (Pro/Team/Enterprise) |
💻 Claude Code / CLI | 任意 | |
🧠 Cursor · Windsurf · Cline · Continue · Zed AI | stdio | 原生 MCP |
💬 ChatGPT (Team/Enterprise) | HTTP | MCP 连接器 |
🛠️ ChatGPT Custom GPTs | REST | 使用捆绑的 |
✴️ Google Gemini / Vertex Agents | HTTP | MCP 连接器 |
🐍 LangChain · LlamaIndex · OpenAI Agents SDK | 任意 | 通过其 MCP 适配器 |
🤖 任何 HTTP 代理 | HTTP |
|
🎯 功能概览
⚡ 常规
工具 | 操作 |
| 任何地址或默认钱包的 ETH 余额 |
| 针对任何合约 + ABI 的只读调用 |
| 准备通用的未签名交易 |
📜 智能合约
工具 | 操作 |
| 由 Claude 使用自然语言编写 Solidity |
| solc 编译 → 字节码 + ABI |
| 为外部钱包签名准备部署交易 |
| 使用 |
🪙 ERC-20 代币
工具 | 操作 |
| 生成 ERC-20 Solidity |
| 任何持有者的 ERC-20 余额 |
| 已签名转账或准备未签名交易 |
🖼️ ERC-721 NFT
工具 | 操作 |
| 生成 ERC-721 Solidity |
| 准备 |
|
|
🏦 DeFi
工具 | 操作 |
| 生成质押 Solidity |
| 准备批准 + 质押交易 |
| 通用 Uniswap V3 兑换(任何 ERC-20 对) |
| 上述功能的便捷别名 |
URI | 返回内容 |
| 已配置的签名者地址、网络、ETH 余额 |
| 任何地址的实时 ETH 余额 |
| 交易 + 回执(状态、Gas、区块、日志、浏览器 URL) |
| ERC-20 元数据(名称、符号、小数位、总供应量) |
/swap_tokens— 引导式代币兑换流程/deploy_erc20— 生成 → 编译 → 部署端到端流程
🚀 快速开始
git clone https://github.com/PortalFnd/PortalMCP.git
cd PortalMCP/portalmcp
npm install
cp .env.example .env
# fill in .env — ANTHROPIC_API_KEY, DEPLOYER_PRIVATE_KEY,
# and ETHEREUM_RPC_URL (or a real ALCHEMY_API_KEY)
npm run build
npm run smoke # ✓ 17 tools / 1 resource / 3 templates / 2 prompts
npm start # stdio (Claude Desktop, Cursor, …)
# or
npm run start:http # Streamable HTTP on http://0.0.0.0:3333/mcp🔌 客户端设置
编辑 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) 或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"portalmcp": {
"command": "node",
"args": ["/absolute/path/to/PortalMCP/portalmcp/dist/index.js"],
"env": {
"ETHEREUM_NETWORK": "mainnet",
"ETHEREUM_RPC_URL": "https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY",
"DEPLOYER_PRIVATE_KEY": "0x...",
"ANTHROPIC_API_KEY": "sk-ant-..."
}
}
}
}重启 Claude Desktop。17 个工具、eth:// 资源和两个斜杠命令将自动出现。
使用公共 HTTPS URL(Caddy / Cloudflare Tunnel / Nginx)托管 HTTP 服务器。
设置
MCP_HTTP_TOKEN=<long-random-string>以确保只有你能调用它。在 Claude.ai → 设置 → 连接器 → 添加自定义连接器:
URL:
https://your-host.example.com/mcpAuth:
Authorization: Bearer <MCP_HTTP_TOKEN>
同时适用于网页版和移动端 App。
所有这些工具都原生支持 MCP。在它们的 MCP 配置中添加一个指向以下内容的条目:
node /absolute/path/to/PortalMCP/portalmcp/dist/index.js(与 Claude Desktop 的 stdio 命令相同。)
首选 — MCP 连接器 (ChatGPT Team/Enterprise, Gemini/Vertex Agents):
指向 https://your-host/mcp,可选择添加 Bearer token。
传统 REST (ChatGPT 自定义 GPT 操作或任何 HTTP 代理):
npm run start:api
# OpenAPI spec: http://localhost:3001/openapi.json💬 对话示例
从零部署代币
“部署一个名为 PortalToken (PRTL) 的 ERC-20 代币,初始供应量为 1,000,000。”
→
eth_generate_contract→ 显示代码 →eth_compile_contract→eth_deploy_contract_with_signer→ 返回合约地址 + Etherscan 链接。
通用兑换
“将 0.01 ETH 兑换为 USDC。”
→
eth_swap_tokens { tokenIn:"ETH", tokenOut:"USDC", amount:"0.01" }— 批准(如果需要)并通过 Uniswap V3 执行。
实时链上上下文
“
vitalik.eth的余额是多少?”→ 客户端将
eth://balance/0xd8dA…资源直接附加到对话中。
⚙️ 配置
全部通过环境变量(.env 文件或主机环境变量)进行配置。完整列表请见 .env.example。
变量 | 必需 | 用途 |
| – |
|
| ⭐ | 完整的 JSON-RPC URL — 覆盖 Infura/Alchemy 密钥设置 |
| 备选 | 仅密钥 — PortalMCP 会构建现代的 |
| 备选 | Infura 项目 ID |
| 写入 |
|
| 生成 | 用于 |
| – | 覆盖默认的 |
| – | 默认 |
| – | 默认 |
| 🛡️ | HTTP 传输的 Bearer token |
| – | 默认 |
💡 占位符检测 — 任何以
your_,changeme,xxx,placeholder,<…>开头的环境变量值都将被视为未设置。这能有效防止静默配置错误。
🌍 支持的网络
🛡️ 安全性
🚫 切勿提交
.env— 已包含在.gitignore中。🔑
DEPLOYER_PRIVATE_KEY是危险品。 请使用仅包含可承受损失资金的专用代理钱包。🛰️ 在本地主机之外暴露 HTTP 时,务必设置
MCP_HTTP_TOKEN,并在前面加上 TLS (Caddy/Cloudflare)。🧪 优先使用测试网 — 开发时使用
sepolia,仅在验证流程后才使用主网。🏷️ 工具注释允许客户端在执行破坏性交易前进行提示 — 请勿自动批准它们。
👀 审查生成的 Solidity —
eth_generate_contract只是一个起点,而非审计结果。
🧑💻 开发
npm install
npm run dev # stdio, ts-node hot-reload
npm run dev:http # HTTP, ts-node
npm run build # tsc → dist/
npm run smoke # assert MCP surface is registered
npm test # Jest脚本 | 用途 |
| stdio MCP 服务器 (生产环境) |
| 可流式传输的 HTTP MCP 服务器 (生产环境) |
| 用于 ChatGPT 操作 / HTTP 客户端的传统 REST |
| 注册冒烟测试 — 非常适合 CI |
仓库布局
portalmcp/
├── src/
│ ├── index.ts # stdio entrypoint
│ ├── mcp-http.ts # Streamable HTTP entrypoint
│ ├── server-factory.ts # createPortalServer() — shared wiring
│ ├── smoke-test.ts # CI registration check
│ ├── tools/ # general · contracts · defi · tokens · nfts
│ ├── blockchain/ # EthereumService · CompilerService
│ ├── claude/ # ContractGenerator (Anthropic SDK)
│ ├── contracts/ # Solidity templates
│ └── adapters/ # Legacy REST / LangChain / OpenAI adapters
├── dist/ # tsc output
├── .env.example
└── package.json🏗️ 架构
stdio Streamable HTTP (SSE)
┌─────────────────────┐ ┌─────────────────────────────┐
│ Claude Desktop │ │ Claude.ai web + mobile │
│ Cursor · Windsurf │ │ ChatGPT · Gemini │
│ Cline · Continue │ │ Custom agents │
└─────────┬───────────┘ └──────────────┬──────────────┘
│ │
│ ┌──────────────────────┐ │
└───────▶│ PortalMCP server │◀────────────┘
│ (server-factory.ts) │
└──────────┬───────────┘
│
┌──────────────────────┼──────────────────────┐
▼ ▼ ▼
EthereumService Uniswap V3 Anthropic
(ethers v6 + (eth_swap_tokens) (eth_generate_contract)
Alchemy/Infura/
custom RPC)🗺️ 路线图亮点
完整计划请见 ROADMAP.md。
🤝 贡献
欢迎提交 PR!优先领域:更多的 outputSchema 覆盖、额外工具、Docker 打包、Python 客户端、测试覆盖率。对于非琐碎的更改,请先开启一个 issue。
由 Portal Foundation 倾心打造 💜
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/PortalFnd/PortalMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
