EVM MCP Server
EVM MCP 服务器
一个全面的模型上下文协议 (MCP) 服务器,可在多个兼容 EVM 的网络中提供区块链服务。该服务器使 AI 代理能够通过统一的接口与以太坊、Optimism、Arbitrum、Base、Polygon 以及许多其他 EVM 链进行交互。
📋 内容
Related MCP server: EVM MCP Server
🔭 概述
MCP EVM 服务器利用模型上下文协议 (MCP) 为 AI 代理提供区块链服务。它支持多种服务,包括:
读取区块链状态(余额、交易、区块等)
与智能合约交互
转移代币(原生代币、ERC20、ERC721、ERC1155)
查询代币元数据和余额
跨 30 多个 EVM 网络的链特定服务
所有地址参数的ENS 名称解析(使用人类可读的名称,如“vitalik.eth”,而不是地址)
所有服务均通过 MCP 工具和资源的统一接口公开,方便 AI 代理发现和使用区块链功能。所有接受以太坊地址的工具也支持 ENS 域名,并在后台自动将其解析为地址。
✨ 特点
区块链数据访问
支持 30 多个 EVM 兼容网络的多链
链信息,包括 blockNumber、chainId 和 RPC
通过数字、哈希或最新数据来阻止数据访问
带有解码日志的交易详细信息和收据
原生代币和所有代币标准的地址余额
ENS 解析人类可读的以太坊地址(使用“vitalik.eth”而不是“0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045”)
代币服务
ERC20代币
获取代币元数据(名称、符号、小数、供应量)
检查代币余额
在地址之间转移代币
批准支出限额
NFT(ERC721)
获取集合和令牌元数据
验证代币所有权
在地址之间转移 NFT
检索代币 URI 并统计持有量
多代币(ERC1155)
获取代币余额和元数据
转移代币数量
访问令牌 URI
智能合约交互
通过视图/纯函数读取合约状态
使用私钥签名编写服务
合同验证以区别于 EOA
事件日志检索和过滤
全面的交易支持
原生代币在所有支持网络上传输
交易规划的Gas 估算
交易状态和收据信息
使用描述性消息进行错误处理
🌐 支持的网络
主网
以太坊(ETH)
乐观主义(OP)
仲裁(ARB)
新仲裁庭
根据
多边形(MATIC)
多边形 zkEVM
雪崩(AVAX)
币安智能链(BSC)
zkSync 时代
莱尼亚
塞洛
Gnosis(xDai)
幻影(FTM)
Filecoin(FIL)
月光
月河
克洛诺斯
滚动
地幔
蝠鲼
爆炸
弗拉克斯塔尔
模式
梅蒂斯人
克罗马
佐拉
极光
坎托
测试网
塞波利亚
乐观塞波利亚
塞波利亚仲裁庭
塞波利亚基地
多边形淘
雪崩富士
BSC 测试网
zkSync Sepolia
线状塞波利亚
滚动塞波利亚
披风
蝠鲼
爆炸棕褐色
Fraxtal 测试网
模式测试网
梅蒂斯·塞波利亚
克罗马塞波利亚
佐拉·塞波利亚
塞洛·阿尔法霍雷斯
戈利
霍莱斯基
🛠️ 先决条件
Bun 1.0.0 或更高版本
Node.js 18.0.0 或更高版本(如果不使用 Bun)
📦安装
# Clone the repository
git clone https://github.com/yourusername/mcp-evm-server.git
cd mcp-evm-server
# Install dependencies with Bun
bun install
# Or with npm
npm install⚙️ 服务器配置
服务器使用以下默认配置:
默认链 ID :1(以太坊主网)
服务器端口:3001
服务器主机:0.0.0.0(可从任何网络接口访问)
这些值在应用程序中是硬编码的。如果需要修改它们,可以编辑以下文件:
对于链配置:
src/core/chains.ts对于服务器配置:
src/server/http-server.ts
🚀 使用方法
使用 npx(无需安装)
您可以使用 npx 直接运行 MCP EVM 服务器,无需安装:
# Run the server in stdio mode (for CLI tools)
npx @mcpdotdirect/evm-mcp-server
# Run the server in HTTP mode (for web applications)
npx @mcpdotdirect/evm-mcp-server --http本地运行服务器
使用 stdio 启动服务器(用于嵌入 CLI 工具):
# Start the stdio server
bun start
# Development mode with auto-reload
bun dev或者使用 SSE 为 Web 应用程序启动 HTTP 服务器:
# Start the HTTP server
bun start:http
# Development mode with auto-reload
bun dev:http连接到服务器
使用任何兼容 MCP 的客户端连接到此 MCP 服务器。您可以使用MCP 检查器进行测试和调试。
从光标连接
要从 Cursor 连接到 MCP 服务器:
打开 Cursor 并转到“设置”(左下角的齿轮图标)
点击左侧边栏中的“功能”
向下滚动到“MCP 服务器”部分
点击“添加新的 MCP 服务器”
输入以下详细信息:
服务器名称:
evm-mcp-server类型:
command命令:
npx @mcpdotdirect/evm-mcp-server
点击“保存”
连接后,您可以直接在 Cursor 中使用 MCP 服务器的功能。该服务器将显示在 MCP 服务器列表中,您可以根据需要启用/禁用。
使用 mcp.json 和 Cursor
为了获得可与团队共享或跨项目使用的更便携的配置,您可以在项目的根目录中创建一个.cursor/mcp.json文件:
{
"mcpServers": {
"evm-mcp-server": {
"command": "npx",
"args": ["-y", "@mcpdotdirect/evm-mcp-server"]
},
"evm-mcp-http": {
"command": "npx",
"args": ["-y", "@mcpdotdirect/evm-mcp-server", "--http"]
}
}
}将此文件放在项目的.cursor目录中(如果不存在,请创建一个),Cursor 会在处理该项目时自动检测并使用这些 MCP 服务器配置。这种方法可以轻松实现以下操作:
与您的团队共享 MCP 配置
版本控制您的 MCP 设置
对不同的项目使用不同的服务器配置
示例:带有 SSE 的 HTTP 模式
如果您正在开发 Web 应用程序并希望使用服务器发送事件 (SSE) 连接到 HTTP 服务器,则可以使用以下配置:
{
"mcpServers": {
"evm-mcp-sse": {
"url": "http://localhost:3001/sse"
}
}
}这直接连接到 HTTP 服务器的 SSE 端点,这对于以下方面很有用:
需要从浏览器连接到 MCP 服务器的 Web 应用程序
不适合运行本地命令的环境
在多个用户或应用程序之间共享单个 MCP 服务器实例
要使用此配置:
如果不存在,请在项目根目录中创建一个
.cursor目录将上述 JSON 保存为
.cursor目录中的mcp.json重新启动 Cursor 或打开您的项目
Cursor 将检测配置并提供启用服务器
示例:在 Cursor 中使用 MCP 服务器
使用mcp.json配置 MCP 服务器后,您可以轻松地在 Cursor 中使用它。以下是示例工作流程:
在您的项目中创建一个新的 JavaScript/TypeScript 文件:
// blockchain-example.js
async function main() {
try {
// Get ETH balance for an address using ENS
console.log("Getting ETH balance for vitalik.eth...");
// When using with Cursor, you can simply ask Cursor to:
// "Check the ETH balance of vitalik.eth on mainnet"
// Or "Transfer 0.1 ETH from my wallet to vitalik.eth"
// Cursor will use the MCP server to execute these operations
// without requiring any additional code from you
// This is the power of the MCP integration - your AI assistant
// can directly interact with blockchain data and operations
} catch (error) {
console.error("Error:", error.message);
}
}
main();在 Cursor 中打开文件后,您可以要求 Cursor 执行以下操作:
“检查 vitalik.eth 的当前 ETH 余额”
“查看以太坊上的 USDC 价格”
“向我展示关于乐观主义的最新区块”
检查 0x1234... 是否为合约地址
Cursor 将使用 MCP 服务器执行这些操作并在您的对话中直接返回结果。
MCP 服务器处理所有区块链通信,同时允许 Cursor 通过自然语言理解和执行与区块链相关的任务。
使用 Claude CLI 进行连接
如果您使用 Claude CLI,则只需两个命令即可连接到 MCP 服务器:
# Add the MCP server
claude mcp add evm-mcp-server npx @mcpdotdirect/evm-mcp-server
# Start Claude with the MCP server enabled
claude示例:使用 ENS 获取代币余额
// Example of using the MCP client to check a token balance using ENS
const mcp = new McpClient("http://localhost:3000");
const result = await mcp.invokeTool("get-token-balance", {
tokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum
ownerAddress: "vitalik.eth", // ENS name instead of address
network: "ethereum",
});
console.log(result);
// {
// tokenAddress: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
// owner: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
// network: "ethereum",
// raw: "1000000000",
// formatted: "1000",
// symbol: "USDC",
// decimals: 6
// }示例:解析 ENS 名称
// Example of using the MCP client to resolve an ENS name to an address
const mcp = new McpClient("http://localhost:3000");
const result = await mcp.invokeTool("resolve-ens", {
ensName: "vitalik.eth",
network: "ethereum",
});
console.log(result);
// {
// ensName: "vitalik.eth",
// normalizedName: "vitalik.eth",
// resolvedAddress: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
// network: "ethereum"
// }📚 API 参考
工具
服务器为代理提供以下 MCP 工具。所有接受地址参数的工具均支持以太坊地址和 ENS 域名。
代币服务
工具名称 | 描述 | 关键参数 |
| 获取 ERC20 代币元数据 |
|
| 检查 ERC20 代币余额 |
|
| 转移 ERC20 代币 |
|
| 批准令牌限额 |
|
| 获取 NFT 元数据 |
|
| 验证 NFT 所有权 |
|
| 转移NFT |
|
| 统计拥有的 NFT 数量 |
|
| 获取 ERC1155 元数据 |
|
| 检查 ERC1155 余额 |
|
| 转移 ERC1155 代币 |
|
区块链服务
工具名称 | 描述 | 关键参数 |
| 获取网络信息 |
|
| 获取原生代币余额 |
|
| 发送原生代币 |
|
| 获取交易详情 |
|
| 读取智能合约状态 |
|
| 写入智能合约 |
|
| 检查地址是否为合约 |
|
| 将 ENS 名称解析为地址 |
|
资源
服务器通过以下 MCP 资源 URI 公开区块链数据。所有接受地址的资源 URI 也支持 ENS 名称,这些名称会自动解析为地址。
区块链资源
资源 URI 模式 | 描述 |
| 特定网络的链信息 |
| 以太坊主网链信息 |
| 按号码阻止数据 |
| 最新区块数据 |
| 原生代币余额 |
| 交易详情 |
| 带有日志的交易收据 |
代币资源
资源 URI 模式 | 描述 |
| ERC20代币信息 |
| ERC20 代币余额 |
| NFT(ERC721)代币信息 |
| NFT 所有权验证 |
| ERC1155 代币 URI |
| ERC1155 代币余额 |
🔒 安全注意事项
私钥仅用于交易签名,服务器永远不会存储
考虑实施额外的身份验证机制以供生产使用
在生产环境中使用 HTTPS 作为 HTTP 服务器
实施速率限制以防止滥用
对于高价值服务,考虑添加确认步骤
📁 项目结构
mcp-evm-server/
├── src/
│ ├── index.ts # Main stdio server entry point
│ ├── server/ # Server-related files
│ │ ├── http-server.ts # HTTP server with SSE
│ │ └── server.ts # General server setup
│ ├── core/
│ │ ├── chains.ts # Chain definitions and utilities
│ │ ├── resources.ts # MCP resources implementation
│ │ ├── tools.ts # MCP tools implementation
│ │ ├── prompts.ts # MCP prompts implementation
│ │ └── services/ # Core blockchain services
│ │ ├── index.ts # Operation exports
│ │ ├── balance.ts # Balance services
│ │ ├── transfer.ts # Token transfer services
│ │ ├── utils.ts # Utility functions
│ │ ├── tokens.ts # Token metadata services
│ │ ├── contracts.ts # Contract interactions
│ │ ├── transactions.ts # Transaction services
│ │ └── blocks.ts # Block services
│ │ └── clients.ts # RPC client utilities
├── package.json
├── tsconfig.json
└── README.md🛠️ 开发
要修改或扩展服务器:
在
src/core/services/下的相应文件中添加新服务在
src/core/tools.ts中注册新工具在
src/core/resources.ts中注册新资源在
src/core/chains.ts中添加新的网络支持要更改服务器配置,请编辑
src/server/http-server.ts中的硬编码值
📄 许可证
该项目根据MIT 许可证条款进行授权。
Available Tools
25 toolsapprove_token_spendingA
Approve a spender (contract) to spend tokens on your behalf. Required before interacting with DEXes, lending protocols, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| tokenAddress | Yes | The ERC20 token contract address | |
| spenderAddress | Yes | The address that will be allowed to spend tokens (usually a contract) | |
| amount | Yes | Amount to approve (in token units). Use '0' to revoke approval. | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond what annotations provide. While annotations indicate this is a non-readOnly, non-destructive, non-idempotent operation, the description clarifies that this is a prerequisite for DeFi interactions and mentions the ability to revoke approval (using '0' amount). It doesn't cover rate limits or authentication needs, but provides practical deployment context that annotations lack.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two sentences that each serve distinct purposes: the first states the core function, the second provides usage context. There's no wasted language, and the most critical information (what the tool does) appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with good annotations and complete schema coverage but no output schema, the description provides adequate context about the tool's purpose and usage. It could be more complete by mentioning what happens after approval (e.g., transaction submission, gas costs, or typical next steps), but covers the essential why and when of using this tool effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already documents all parameters thoroughly. The description doesn't add significant parameter semantics beyond what's in the schema, though it does reinforce the purpose of the 'amount' parameter by mentioning revocation capability. This meets the baseline expectation when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Approve a spender to spend tokens on your behalf') and identifies the resource (tokens). It distinguishes this from sibling tools like 'transfer_erc20' or 'write_contract' by focusing specifically on token spending authorization rather than transfers or general contract interactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool ('Required before interacting with DEXes, lending protocols, etc.'), giving practical examples. However, it doesn't explicitly state when NOT to use it or mention specific alternatives among the sibling tools, such as using 'get_allowance' to check existing approvals first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_allowanceARead-onlyIdempotent
Check the allowance granted to a spender for a token. This tells you how much of a token an address can spend on your behalf.
| Name | Required | Description | Default |
|---|---|---|---|
| tokenAddress | Yes | The ERC20 token contract address | |
| spenderAddress | Yes | The address allowed to spend the token (usually a contract address) | |
| ownerAddress | No | The owner address (defaults to the configured wallet) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, non-destructive, idempotent, and open-world behavior, so the description adds minimal value beyond reinforcing the query nature. It does not disclose additional traits like rate limits, authentication needs, or response format details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences with zero waste, front-loading the core purpose and efficiently explaining the utility without redundancy or unnecessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations and full schema coverage, the description is mostly complete for a read-only query tool. However, the lack of an output schema means it could benefit from hinting at return values, such as allowance amount or units.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all parameters. The description adds no extra meaning beyond implying the tool checks delegated spending, which aligns with but does not expand upon the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Check the allowance') and resource ('granted to a spender for a token'), distinguishing it from siblings like get_balance or get_token_balance by focusing on delegated spending permissions rather than ownership balances.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool ('how much of a token an address can spend on your behalf'), but does not explicitly mention when not to use it or name specific alternatives among siblings, such as get_balance for ownership checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_balanceARead-onlyIdempotent
Get the native token balance (ETH, MATIC, etc.) for an address
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | The wallet address or ENS name | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, covering safety and idempotency. The description adds no additional behavioral context (e.g., rate limits, auth needs, or return format), but it does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose without unnecessary words. Every part of the sentence contributes to clarifying the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, rich annotations, and 100% schema coverage, the description is mostly complete. However, with no output schema, it could benefit from mentioning the return value format (e.g., balance in wei or ether), but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter descriptions in the schema. The description adds no extra parameter details beyond what the schema provides, such as format examples or constraints, so it meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get') and resource ('native token balance for an address'), distinguishing it from siblings like get_token_balance (ERC20 tokens) or get_erc1155_balance (NFTs). It explicitly mentions the token types (ETH, MATIC, etc.) to clarify scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'native token balance' and listing examples (ETH, MATIC), which helps differentiate it from get_token_balance for ERC20 tokens. However, it does not explicitly state when not to use it or mention alternatives like get_erc1155_balance for NFTs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blockBRead-onlyIdempotent
Get block details by block number or hash
| Name | Required | Description | Default |
|---|---|---|---|
| blockIdentifier | Yes | Block number (as string) or block hash | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds the specific lookup mechanism ('by block number or hash') which provides useful context beyond annotations, but doesn't describe rate limits, authentication needs, or what 'block details' actually includes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that communicates the core functionality without any wasted words. It's appropriately sized for a simple lookup tool and front-loads the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with good annotations and full schema coverage, the description is minimally adequate. However, without an output schema, the description doesn't explain what 'block details' includes (transactions, timestamps, gas used, etc.), leaving the agent uncertain about the return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters well-documented in the schema. The description mentions 'block number or hash' which aligns with blockIdentifier, and implies network selection, but adds no additional semantic context beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('block details'), specifying it works 'by block number or hash'. It distinguishes from sibling 'get_latest_block' by requiring a specific identifier, but doesn't explicitly mention this distinction in the description text itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_latest_block' or 'get_transaction'. It doesn't mention prerequisites, error conditions, or typical use cases for retrieving block details versus other blockchain data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chain_infoARead-onlyIdempotent
Get information about an EVM network: chain ID, current block number, and RPC endpoint
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base') or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only, open-world, idempotent, and non-destructive traits, so the description doesn't need to repeat these. It adds value by specifying the exact information returned (chain ID, block number, RPC endpoint), which isn't in annotations, providing useful context for the agent about output content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the purpose and lists key outputs. Every word contributes essential information without redundancy, making it highly concise and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 parameter, no output schema), rich annotations, and clear purpose, the description is mostly complete. It could slightly improve by mentioning the default network more explicitly, but it adequately covers the tool's function and output scope for the agent's needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'network' well-documented in the schema. The description doesn't add further parameter details beyond what's in the schema, so it meets the baseline of 3 for high schema coverage without extra semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get information about') and resource ('an EVM network'), listing the exact data returned (chain ID, current block number, RPC endpoint). It distinguishes from siblings like 'get_supported_networks' (which lists networks) and 'get_block' (which gets block details).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving network metadata, with context from the parameter description suggesting it's for querying specific networks. However, it doesn't explicitly state when to use this versus alternatives like 'get_supported_networks' for listing available networks or 'get_block' for detailed block data, though the purpose differentiation helps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contract_abiARead-onlyIdempotent
Fetch a contract's full ABI from Etherscan/block explorers. Use this to understand verified contracts before interacting. Requires ETHERSCAN_API_KEY. Supports 30+ EVM networks. Works best with verified contracts on block explorers.
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The contract address (0x...) | |
| network | No | Network name or chain ID. Defaults to ethereum. Supported: ethereum, polygon, arbitrum, optimism, base, avalanche, gnosis, fantom, bsc, celo, scroll, linea, zksync, manta, blast, and testnets (sepolia, mumbai, arbitrum-sepolia, optimism-sepolia, base-sepolia, avalanche-fuji) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, repeatable read operation. The description adds valuable context beyond annotations: the API key requirement, network support (30+ EVM networks), and the verification constraint. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, each earning its place: purpose, usage context, prerequisites, and scope. Front-loaded with the core action, no wasted words, and structured logically from what to why to constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with good annotations and full schema coverage, the description provides excellent contextual completeness: purpose, usage guidelines, prerequisites, and scope. The only minor gap is lack of output details (no output schema), but the description implies ABI return, which is reasonable for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters well-documented in the schema. The description doesn't add specific parameter semantics beyond what the schema provides, but it reinforces the contractAddress focus and network flexibility. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('fetch') and resource ('contract's full ABI'), specifies the source ('from Etherscan/block explorers'), and distinguishes it from siblings by focusing on ABI retrieval rather than balances, transactions, or contract interactions. It's specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('to understand verified contracts before interacting') and provides context about prerequisites ('Requires ETHERSCAN_API_KEY') and limitations ('Works best with verified contracts on block explorers'). It clearly differentiates this read-only tool from write operations like write_contract.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_erc1155_balanceBRead-onlyIdempotent
Get ERC1155 token balance for an address
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The ERC1155 contract address | |
| tokenId | Yes | The token ID | |
| address | Yes | The owner address or ENS name | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover key behavioral traits: readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, indicating a safe, repeatable query. The description adds no behavioral context beyond this, such as rate limits, error conditions, or return format details. However, it doesn't contradict annotations, so it meets the lower bar with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no wasted words, front-loading the core purpose ('Get ERC1155 token balance for an address'). It efficiently communicates the essential action without redundancy or unnecessary elaboration, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with rich annotations (readOnlyHint, idempotentHint) and full schema coverage, the description is minimally adequate. However, without an output schema, it doesn't explain return values (e.g., balance format, error responses), and it lacks usage context compared to siblings. This leaves gaps in fully guiding the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for all parameters (e.g., contractAddress, tokenId, address, network). The description adds no additional semantic context beyond the schema, such as explaining ERC1155-specific nuances or format requirements. Given the high schema coverage, the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Get') and resource ('ERC1155 token balance for an address'), making the purpose immediately understandable. It distinguishes from siblings like 'get_balance' (likely for native tokens) and 'get_token_balance' (likely for ERC20 tokens) by specifying ERC1155, though it doesn't explicitly contrast with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_balance' or 'get_token_balance'. It doesn't mention prerequisites, such as needing a valid contract address or network, or specify use cases like checking NFT holdings. This leaves the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_gas_priceARead-only
Get current gas prices (base fee, standard, and fast) for a network
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, and openWorldHint=true, covering safety and scope. The description adds useful context by specifying the exact gas price types returned (base fee, standard, fast), which isn't in annotations. No contradictions with annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose with no wasted words. Every element (verb, resource, data specifics, target) earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 optional parameter), rich annotations covering safety and scope, and no output schema, the description is mostly complete. It specifies the gas price types returned, but could benefit from mentioning default behavior (e.g., network defaults to Ethereum mainnet, as noted in schema) or response format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'network' fully documented in the schema. The description adds no additional parameter details beyond what the schema provides, so it meets the baseline of 3 for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'current gas prices', specifying the exact data returned (base fee, standard, and fast) and the target (for a network). It distinguishes from siblings like get_block or get_chain_info by focusing specifically on gas price metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when gas prices are needed for a network, but provides no explicit guidance on when to use this tool versus alternatives (e.g., no mention of sibling tools like get_chain_info that might include gas data). It lacks when-not-to-use scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_blockBRead-only
Get the latest block from the network
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the agent knows this is a safe, read-only operation that may query external data. The description adds no behavioral context beyond what annotations provide - no information about rate limits, network availability, or response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is maximally concise - a single clear sentence that states exactly what the tool does with zero wasted words. It's perfectly front-loaded with the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read operation with good annotations and full schema coverage, the description is minimally adequate. However, without an output schema, the description doesn't explain what 'latest block' data will be returned (block number, timestamp, transactions, etc.), leaving a gap in understanding the tool's complete behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already fully documents the single optional 'network' parameter. The description adds no parameter information beyond what's in the schema, so it meets but doesn't exceed the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get') and resource ('latest block from the network'), making the purpose immediately understandable. However, it doesn't distinguish this tool from its sibling 'get_block', which likely retrieves specific blocks by number/hash rather than the latest one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'get_block' and 'get_chain_info' available, there's no indication of when this specific 'latest block' retrieval is preferred over other block-related queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nft_infoARead-onlyIdempotent
Get information about an ERC721 NFT including metadata URI
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The NFT contract address | |
| tokenId | Yes | The NFT token ID | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=true, covering safety and idempotency. The description adds value by specifying the scope ('ERC721 NFT' and 'metadata URI'), which isn't in annotations, but doesn't detail rate limits, auth needs, or response format. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the purpose without unnecessary words. It earns its place by clearly stating what the tool does in minimal terms.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, 2 required), rich annotations covering safety and behavior, and 100% schema coverage, the description is mostly complete. However, without an output schema, it could benefit from hinting at return values like metadata structure, but the annotations and schema provide sufficient context for a read-only query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter descriptions in the schema. The description mentions 'ERC721 NFT' and 'metadata URI', which adds context about the resource but doesn't provide additional syntax or format details beyond the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'information about an ERC721 NFT including metadata URI', which is specific and distinguishes it from sibling tools like get_balance, get_contract_abi, or get_erc1155_balance that target different resources or data types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving NFT metadata but provides no explicit guidance on when to use this tool versus alternatives like read_contract for custom queries or get_erc1155_balance for other token standards. It lacks when-not scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_supported_networksARead-onlyIdempotent
Get a list of all supported EVM networks
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false, covering safety and idempotency. The description adds context by specifying it returns 'all supported' networks, which clarifies the scope beyond what annotations indicate, though it doesn't detail output format or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose with no wasted words. It is front-loaded and appropriately sized for a simple tool, making it easy to understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema) and rich annotations, the description is complete enough for basic use. It specifies what is retrieved ('all supported EVM networks'), but could benefit from mentioning the return format (e.g., list of network names or IDs) to enhance clarity, though annotations help cover behavioral aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters with 100% schema description coverage, so the schema fully documents the lack of inputs. The description does not need to add parameter details, and it appropriately focuses on the tool's purpose without redundancy, earning a baseline score for zero-parameter tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Get a list of all supported EVM networks' clearly states the action ('Get a list') and resource ('all supported EVM networks'). It distinguishes from siblings like get_chain_info or get_block by specifying the scope is about network support rather than chain metadata or block data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing to know which EVM networks are supported, but does not explicitly state when to use this tool versus alternatives like get_chain_info or provide exclusions. It offers basic context but lacks detailed guidance on specific scenarios or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_balanceARead-onlyIdempotent
Get the ERC20 token balance for an address
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | The wallet address or ENS name | |
| tokenAddress | Yes | The ERC20 token contract address | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=true, covering safety and idempotency. The description adds no further behavioral context (e.g., rate limits, authentication needs, or return format), but it does not contradict annotations, so it meets the lower bar with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is appropriately sized and front-loaded, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, rich annotations (covering safety and idempotency), and full schema coverage, the description is mostly complete. However, the lack of an output schema means the return value (e.g., balance format) is undocumented, leaving a minor gap in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for address, tokenAddress, and network parameters. The description adds no additional meaning beyond the schema (e.g., format examples or edge cases), so it meets the baseline of 3 where the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get') and resource ('ERC20 token balance for an address'), distinguishing it from siblings like get_balance (likely for native tokens) or get_erc1155_balance (for different token standards). It precisely identifies the tool's function without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for ERC20 token balances, but does not explicitly state when to use this tool versus alternatives like get_balance (for native tokens) or get_allowance (for spending approvals). No guidance on prerequisites or exclusions is provided, leaving the context somewhat inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionBRead-onlyIdempotent
Get transaction details by transaction hash
| Name | Required | Description | Default |
|---|---|---|---|
| txHash | Yes | Transaction hash (0x...) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover key behavioral traits (readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=true), so the description doesn't need to repeat these. It adds minimal context by specifying the lookup mechanism ('by transaction hash'), but doesn't elaborate on rate limits, error handling, or response format, which could be helpful given no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose without unnecessary words. Every part of the sentence ('Get transaction details by transaction hash') contributes directly to understanding the tool's function, making it optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations provide safety and idempotency info, and the schema fully covers parameters, the description is adequate for a read-only lookup tool. However, with no output schema and multiple similar sibling tools (e.g., get_transaction_receipt), it could benefit from more context about return values or differentiation to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema fully documents both parameters (txHash and network). The description mentions 'by transaction hash' which aligns with the txHash parameter but adds no additional semantic meaning beyond what the schema provides, meeting the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get transaction details') and resource ('by transaction hash'), making the purpose immediately understandable. However, it doesn't explicitly differentiate this from sibling tools like 'get_transaction_receipt' or 'get_block', which would require a more specific distinction to earn a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'get_transaction_receipt' or 'get_block' from the sibling list. It lacks context about prerequisites, typical use cases, or exclusions, leaving the agent to infer usage based on the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_receiptARead-onlyIdempotent
Get transaction receipt (confirmation status, gas used, logs). Use this to check if a transaction has been confirmed.
| Name | Required | Description | Default |
|---|---|---|---|
| txHash | Yes | Transaction hash (0x...) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond what annotations provide. While annotations indicate read-only, open-world, idempotent, and non-destructive behavior, the description clarifies the specific purpose ('check if a transaction has been confirmed') and what data is returned ('confirmation status, gas used, logs'). This helps the agent understand the tool's functional scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two sentences that each serve distinct purposes: the first defines what the tool does, and the second provides usage guidance. There's no wasted language, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the comprehensive annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint) and full parameter documentation in the schema, the description provides adequate context. However, without an output schema, the description could benefit from more detail about the return format, though the mention of specific data elements ('confirmation status, gas used, logs') partially addresses this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already fully documents both parameters (txHash and network). The description doesn't add any parameter-specific information beyond what's in the schema, so it meets the baseline expectation without providing additional semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get transaction receipt') and resource ('transaction'), with explicit details about what information is retrieved ('confirmation status, gas used, logs'). It distinguishes from sibling tools like 'get_transaction' by focusing on receipt-specific data rather than transaction details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Use this to check if a transaction has been confirmed.' This clearly differentiates it from alternatives like 'get_transaction' (which might show pending transactions) and 'wait_for_transaction' (which actively waits for confirmation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_addressARead-onlyIdempotent
Get the address of the configured wallet. Use this to verify which wallet is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a read-only, non-destructive, idempotent operation. The description adds useful context by specifying that it retrieves the 'configured' wallet address, implying it returns the currently active wallet without modification. It doesn't contradict annotations but provides additional behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that are front-loaded with the core purpose and followed by usage guidance. Every word earns its place without redundancy, making it highly efficient and easy to understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with rich annotations (read-only, non-destructive, idempotent) and no output schema, the description is complete enough. It clearly states what the tool does and when to use it. A minor deduction because it doesn't specify the return format (e.g., string address), but annotations cover safety aspects adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and schema description coverage is 100%. The description doesn't need to explain parameters, but it implicitly clarifies that no inputs are required to get the configured wallet address. This aligns perfectly with the schema, earning a baseline score with slight bonus for contextual clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get the address') and resource ('configured wallet'), distinguishing it from sibling tools that perform different operations like transfers, approvals, or balance checks. It precisely defines what the tool does without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'to verify which wallet is active.' This provides clear context for its purpose, distinguishing it from alternatives like get_balance or get_transaction that serve different verification or information needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_ens_addressARead-onlyIdempotent
Lookup the ENS name for an Ethereum address (reverse resolution)
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Ethereum address to lookup | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=true, covering safety and idempotency. The description adds no behavioral context beyond what annotations declare (e.g., no rate limits, error conditions, or performance traits). With annotations doing the heavy lifting, the description meets the baseline but adds minimal extra value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose ('Lookup the ENS name for an Ethereum address') and adds clarifying context ('reverse resolution') without redundancy. Every word earns its place, making it optimally concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (simple lookup), rich annotations (covering safety and idempotency), and high schema coverage, the description is mostly complete. However, the lack of an output schema means the description could benefit from hinting at return values (e.g., ENS name or null). It's adequate but has a minor gap in output context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters ('address' and 'network') fully documented in the schema. The description does not add any parameter-specific details beyond what the schema provides (e.g., no format examples for 'address' or default values beyond schema's note). Baseline score of 3 is appropriate when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Lookup the ENS name') and resource ('for an Ethereum address'), with the parenthetical 'reverse resolution' distinguishing it from the sibling 'resolve_ens_name' tool (which presumably does forward resolution from name to address). This precise verb+resource pairing and explicit sibling differentiation earns the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context through 'reverse resolution,' which helps differentiate from 'resolve_ens_name.' However, it lacks explicit guidance on when to use this tool versus alternatives (e.g., when you have an address vs. a name) or any prerequisites. The context is clear but not comprehensive enough for a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
multicallARead-onlyIdempotent
Batch multiple contract read calls into a single RPC request. Significantly reduces latency and RPC usage when querying multiple functions. Uses the Multicall3 contract deployed on all major networks. Perfect for portfolio analysis, price aggregation, and querying multiple contract states efficiently.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes | Array of contract calls to batch together | |
| allowFailure | No | If true, returns partial results even if some calls fail. Defaults to true. | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: it explains the performance benefit ('reduces latency and RPC usage'), mentions the underlying implementation ('Uses the Multicall3 contract'), and notes network compatibility ('deployed on all major networks'). While annotations cover safety (readOnlyHint, idempotentHint), the description provides practical implementation details that help the agent understand when this optimization is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise and front-loaded: the first sentence states the core functionality, the second explains benefits, and the third provides implementation context and use cases. Every sentence adds value with zero wasted words, and the structure moves from general to specific.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations (readOnlyHint, idempotentHint) and comprehensive schema coverage, the description provides excellent contextual completeness. It explains the tool's optimization purpose, implementation details, and ideal use cases. The only minor gap is lack of output format explanation (no output schema exists), but the annotations sufficiently indicate safe read behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents all parameters thoroughly. The description doesn't add specific parameter semantics beyond what's in the schema, but it contextually explains the purpose of batching calls, which helps understand the 'calls' parameter's role. This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('batch multiple contract read calls') and resources ('single RPC request'), distinguishing it from siblings like read_contract (single call) and write_contract (write operations). It explicitly mentions it's for read operations only, which differentiates it from write tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'when querying multiple functions' and for specific use cases like 'portfolio analysis, price aggregation, and querying multiple contract states efficiently.' It implicitly distinguishes from read_contract (single calls) and write_contract (write operations) by focusing on batch read optimization.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_contractARead-onlyIdempotent
Call read-only functions on a smart contract. Automatically fetches ABI from block explorer if not provided (requires ETHERSCAN_API_KEY). Falls back to common functions if contract is not verified. Use this to query contract state and data.
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The contract address | |
| functionName | Yes | Function name (e.g., 'name', 'symbol', 'balanceOf', 'totalSupply', 'owner') | |
| args | No | Function arguments as strings (e.g., ['0xAddress'] for balanceOf) | |
| abiJson | No | Full contract ABI as JSON string (optional - will auto-fetch verified contract ABI if not provided) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds valuable behavioral context beyond annotations: automatic ABI fetching with fallback mechanisms, API key requirement, and network defaults. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste: first states core purpose, second explains ABI fetching behavior, third provides usage guidance. Front-loaded with essential information, appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, rich annotations, and 100% schema coverage, the description is mostly complete. It explains the tool's behavior, usage context, and prerequisites. The main gap is lack of output format details (no output schema), but annotations provide safety context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds minimal semantic context (e.g., 'falls back to common functions'), but doesn't significantly enhance understanding beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('call read-only functions', 'query contract state and data') and distinguishes it from siblings by emphasizing its read-only nature for smart contracts, unlike write_contract or transfer tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('to query contract state and data') and distinguishes it from alternatives by specifying it's for read-only functions, unlike write_contract which is for write operations. Also mentions prerequisites (ETHERSCAN_API_KEY for auto-fetching).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_ens_nameARead-onlyIdempotent
Resolve an ENS name to an Ethereum address
| Name | Required | Description | Default |
|---|---|---|---|
| ensName | Yes | ENS name to resolve (e.g., 'vitalik.eth') | |
| network | No | Network name or chain ID. ENS resolution works best on Ethereum mainnet. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, covering safety and idempotency. The description adds context about network behavior ('ENS resolution works best on Ethereum mainnet') in the schema, which is useful for understanding performance characteristics, though it doesn't detail rate limits or specific error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence that states the tool's purpose without any fluff or redundancy. It's front-loaded and efficiently communicates the core functionality, making it easy for an AI agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations cover safety and idempotency, and the schema fully documents parameters, the description is reasonably complete for a read-only query tool. However, with no output schema, it doesn't explain return values (e.g., address format or error responses), leaving a minor gap in full context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear documentation for both parameters (ensName and network). The description doesn't add any parameter-specific information beyond what's in the schema, so it meets the baseline of 3 for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('resolve') and target resource ('ENS name to an Ethereum address'), distinguishing it from sibling tools like 'lookup_ens_address' (which might be the inverse operation) and other Ethereum query tools. It precisely communicates the tool's function without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for ENS resolution but doesn't explicitly state when to use this tool versus alternatives like 'lookup_ens_address' or other address-related tools. No guidance is provided on prerequisites, error conditions, or specific scenarios where this tool is preferred over others in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sign_messageAIdempotent
Sign an arbitrary message using the configured wallet. Useful for authentication (SIWE), meta-transactions, and off-chain signatures. The signature can be verified on-chain or off-chain.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The message to sign (plain text or hex-encoded data) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true and destructiveHint=false, but the description adds valuable context: it explains the signature's verification scope ('on-chain or off-chain') and mentions the wallet configuration dependency. However, it doesn't detail potential side effects like gas costs or security implications, leaving some behavioral aspects uncovered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by use cases and verification details in two efficient sentences. Every phrase adds value without redundancy, making it highly concise and well-structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (signing operation with cryptographic implications), no output schema, and rich annotations, the description is mostly complete. It covers purpose, usage, and verification but lacks details on error cases or response format, which could enhance completeness for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'message' fully documented in the schema. The description adds no additional parameter details beyond what the schema provides, such as format examples or constraints, so it meets the baseline for high schema coverage without extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Sign an arbitrary message') and resource ('using the configured wallet'), distinguishing it from sibling tools like sign_typed_data (which handles structured data) and other read/write operations. It precisely defines the tool's function without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists three use cases: 'authentication (SIWE), meta-transactions, and off-chain signatures,' providing clear guidance on when to use this tool. It also implicitly distinguishes it from sign_typed_data by focusing on arbitrary messages rather than structured data, though it doesn't explicitly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sign_typed_dataAIdempotent
Sign structured data (EIP-712) using the configured wallet. Used for gasless transactions, meta-transactions, permit signatures, and protocol-specific signatures. The signature follows the EIP-712 standard.
| Name | Required | Description | Default |
|---|---|---|---|
| domainJson | Yes | EIP-712 domain as JSON string with fields: name, version, chainId, verifyingContract, salt (all optional) | |
| typesJson | Yes | EIP-712 types definition as JSON string (exclude EIP712Domain type - it's added automatically) | |
| primaryType | Yes | The primary type name (e.g., 'Mail', 'Permit', 'MetaTransaction') | |
| messageJson | Yes | The message data to sign as JSON string |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable context beyond annotations: it specifies the signature follows EIP-712 standard, mentions use cases, and clarifies the wallet is 'configured' (implying setup requirements). Annotations cover idempotency (true) and non-destructive nature (false), but the description provides practical application context that helps the agent understand when this tool is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with just two sentences. The first sentence states the core purpose, and the second sentence provides essential context about the standard and use cases. Every word earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a cryptographic signing tool with good annotations and full schema coverage, the description provides excellent context about use cases and the EIP-712 standard. The main gap is lack of output information (no output schema), but the description compensates well by explaining what the tool produces ('signature follows the EIP-712 standard').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already fully documents all 4 parameters. The description doesn't add any parameter-specific information beyond what's in the schema descriptions, so it meets the baseline expectation without providing additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Sign structured data'), the standard used ('EIP-712'), and the resource ('using the configured wallet'). It distinguishes this tool from sibling tools like 'sign_message' by specifying it's for structured data following a particular standard rather than plain messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists multiple use cases ('gasless transactions, meta-transactions, permit signatures, and protocol-specific signatures'), providing clear guidance on when to use this tool. It differentiates from 'sign_message' by specifying EIP-712 structured data signing rather than general message signing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_erc20ADestructive
Transfer ERC20 tokens to an address. Uses the configured wallet.
| Name | Required | Description | Default |
|---|---|---|---|
| tokenAddress | Yes | The ERC20 token contract address | |
| to | Yes | Recipient address or ENS name | |
| amount | Yes | Amount to send (in token units, accounting for decimals) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide key behavioral hints (destructiveHint: true, idempotentHint: false, readOnlyHint: false), covering safety and idempotency. The description adds minimal context ('Uses the configured wallet'), which hints at authentication needs but doesn't elaborate on rate limits, error handling, or transaction specifics. It doesn't contradict annotations, so a baseline score is appropriate given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that are front-loaded with the core purpose and essential context. Every word earns its place, with no redundancy or unnecessary elaboration, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive transfer operation), rich annotations, and 100% schema coverage, the description is adequate but minimal. It lacks details on output (no schema provided), error cases, or network defaults beyond schema hints. For a high-stakes tool, more context on behavior or results would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter descriptions in the input schema (e.g., tokenAddress as contract address, amount in token units). The description adds no additional parameter semantics beyond the schema, so it meets the baseline for high coverage without compensating value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Transfer ERC20 tokens') and resource ('to an address'), distinguishing it from sibling tools like transfer_native (for native tokens) and approve_token_spending (for approvals). It precisely identifies the tool's function without being vague or tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'Uses the configured wallet,' which suggests it's for sending tokens from a pre-configured source. However, it doesn't explicitly state when to use this vs. alternatives like transfer_native or write_contract, nor does it mention prerequisites (e.g., wallet setup, token approvals). The guidance is clear but lacks sibling differentiation and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transfer_nativeADestructive
Transfer native tokens (ETH, MATIC, etc.) to an address. Uses the configured wallet.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient address or ENS name | |
| amount | Yes | Amount to send in ether (e.g., '0.5' for 0.5 ETH) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false, destructiveHint=true, openWorldHint=true, and idempotentHint=false. The description adds context about using the configured wallet, which clarifies authentication needs beyond annotations. It doesn't mention rate limits or specific destructive consequences, but aligns with annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with zero waste: first states purpose and scope, second clarifies the wallet mechanism. Front-loaded with essential information, no redundant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a destructive tool with no output schema, the description is reasonably complete—it covers what the tool does and the wallet context. However, it lacks details on return values (e.g., transaction hash) or error cases, which would be helpful for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear parameter documentation. The description adds no additional parameter semantics beyond what's in the schema (e.g., no examples for 'network' beyond the default). Baseline 3 is appropriate since the schema fully covers parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Transfer native tokens') and resource (ETH, MATIC, etc.), with the specific mechanism 'to an address' and 'Uses the configured wallet.' It distinguishes from sibling tools like transfer_erc20 by specifying native tokens, but doesn't explicitly contrast with other tools beyond that implied difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for transferring native tokens (vs. ERC20 tokens via transfer_erc20), but doesn't explicitly state when to use this tool versus alternatives like write_contract for more complex transfers or get_balance for checking balances. No exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_transactionARead-only
Wait for a transaction to be confirmed (mined). Polls the network until confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| txHash | Yes | Transaction hash (0x...) | |
| confirmations | No | Number of block confirmations required. Defaults to 1. | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false, but the description adds valuable behavioral context: it reveals this is a polling operation (not a one-time check) and specifies it waits until confirmation is achieved. This goes beyond what annotations provide about safety characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two clear sentences that front-load the core purpose. Every word earns its place: first sentence states what it does, second sentence explains how it works. No wasted words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polling tool with good annotations and full parameter documentation, the description provides adequate context about its behavior. However, without an output schema, it doesn't describe what the tool returns (e.g., receipt data, confirmation status, error conditions), leaving some uncertainty about the result format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, all parameters are well-documented in the schema itself. The description doesn't add any additional parameter semantics beyond what's already in the schema descriptions (txHash, confirmations with default, network with default). This meets the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Wait for a transaction to be confirmed') and mechanism ('Polls the network until confirmation'), distinguishing it from siblings like get_transaction (which retrieves transaction data without waiting) or get_transaction_receipt (which gets confirmation status without polling).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (after submitting a transaction, when you need to wait for confirmation), but doesn't explicitly state when NOT to use it or name specific alternatives like get_transaction_receipt for checking status without waiting. It provides clear intent but lacks explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_contractADestructive
Execute state-changing functions on a smart contract. Automatically fetches ABI from block explorer if not provided (requires ETHERSCAN_API_KEY). Use this to call any write function on verified contracts. Requires wallet to be configured (via private key or mnemonic).
| Name | Required | Description | Default |
|---|---|---|---|
| contractAddress | Yes | The contract address | |
| functionName | Yes | Function name to call (e.g., 'mint', 'swap', 'stake', 'approve') | |
| args | No | Function arguments as strings (e.g., ['0xAddress', '1000000']) | |
| value | No | ETH value to send with transaction in ether (e.g., '0.1' for payable functions) | |
| abiJson | No | Full contract ABI as JSON string (optional - will auto-fetch verified contract ABI if not provided) | |
| network | No | Network name or chain ID. Defaults to Ethereum mainnet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context beyond annotations: it discloses the automatic ABI fetching capability (with ETHERSCAN_API_KEY requirement), wallet configuration requirements, and the focus on verified contracts. While annotations already indicate destructiveHint=true and readOnlyHint=false, the description provides practical implementation details that help the agent understand execution requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured in three sentences: first states core functionality, second explains ABI auto-fetching, third specifies prerequisites. Each sentence adds distinct value with zero redundancy. The information is front-loaded with the primary purpose stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive tool with no output schema, the description provides good context about requirements (wallet, API key), behavior (ABI auto-fetching), and scope (verified contracts, write functions). It could be more complete by mentioning transaction confirmation or gas handling, but covers the essential operational context given the annotations already indicate destructive nature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the input schema already documents all 6 parameters thoroughly. The description mentions ABI auto-fetching (related to 'abiJson') and wallet requirements (implied for all operations), but doesn't add significant parameter-specific semantics beyond what the schema provides. This meets the baseline expectation when schema coverage is complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verbs ('Execute state-changing functions', 'call any write function') and resources ('on a smart contract'). It distinguishes from sibling tools like 'read_contract' by emphasizing write operations and from 'approve_token_spending' by being a general-purpose contract interaction tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this to call any write function on verified contracts' establishes the primary use case. It also mentions prerequisites ('Requires wallet to be configured') and when not to use alternatives (implied by distinguishing from read operations). The sibling tool list shows clear alternatives like 'read_contract' for non-state-changing calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
38 tool updates
v1.0.0- Changed
approve_token_spending6 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"The amount of tokens to approve in token units, not wei (e.g., '1000' to approve spending 1000 tokens). Use a very large number for unlimited approval."New value: +"Amount to approve (in token units). Use '0' to revoke approval." - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / privateKeyRemoved value: -{ - "description": "Private key of the token owner account in hex format (with or without 0x prefix). SECURITY: This is used only for transaction signing and is not stored.", - "type": "string" -} - changed
Input schema / properties / spenderAddress / descriptionPrevious value: -"The contract address being approved to spend your tokens (e.g., a DEX or lending protocol)"New value: +"The address that will be allowed to spend tokens (usually a contract)" - changed
Input schema / properties / tokenAddress / descriptionPrevious value: -"The contract address of the ERC20 token to approve for spending (e.g., '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' for USDC on Ethereum)"New value: +"The ERC20 token contract address" - changed
Input schema / requiredPrevious value: -[ - "privateKey", - "tokenAddress", - "spenderAddress", - "amount" -]New value: +[ + "tokenAddress", + "spenderAddress", + "amount" +]
- Removed
check_nft_ownership - Removed
estimate_gas - Removed
get_address_from_private_key - Added
get_allowance - Changed
get_balance2 fields changed- changed
Input schema / properties / address / descriptionPrevious value: -"The wallet address or ENS name (e.g., '0x1234...' or 'vitalik.eth') to check the balance for"New value: +"The wallet address or ENS name" - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', etc.) or chain ID. Supports all EVM-compatible networks. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet."
- Added
get_block - Removed
get_block_by_number - Changed
get_chain_info1 field changed- changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', etc.) or chain ID. Supports all EVM-compatible networks. Defaults to Ethereum mainnet."New value: +"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base') or chain ID. Defaults to Ethereum mainnet."
- Added
get_contract_abi - Changed
get_erc1155_balance7 fields changed- added
Input schema / properties / addressAdded value: +{ + "description": "The owner address or ENS name", + "type": "string" +} - added
Input schema / properties / contractAddressAdded value: +{ + "description": "The ERC1155 contract address", + "type": "string" +} - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. ERC1155 tokens exist across many networks. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / ownerAddressRemoved value: -{ - "description": "The wallet address to check the token balance for (e.g., '0x1234...')", - "type": "string" -} - removed
Input schema / properties / tokenAddressRemoved value: -{ - "description": "The contract address of the ERC1155 token collection (e.g., '0x76BE3b62873462d2142405439777e971754E8E77')", - "type": "string" -} - changed
Input schema / properties / tokenId / descriptionPrevious value: -"The ID of the specific token to check the balance for (e.g., '1234')"New value: +"The token ID" - changed
Input schema / requiredPrevious value: -[ - "tokenAddress", - "tokenId", - "ownerAddress" -]New value: +[ + "contractAddress", + "tokenId", + "address" +]
- Removed
get_erc1155_token_uri - Removed
get_erc20_balance - Added
get_gas_price - Removed
get_nft_balance - Changed
get_nft_info5 fields changed- added
Input schema / properties / contractAddressAdded value: +{ + "description": "The NFT contract address", + "type": "string" +} - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. Most NFTs are on Ethereum mainnet, which is the default."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / tokenAddressRemoved value: -{ - "description": "The contract address of the NFT collection (e.g., '0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D' for Bored Ape Yacht Club)", - "type": "string" -} - changed
Input schema / properties / tokenId / descriptionPrevious value: -"The ID of the specific NFT token to query (e.g., '1234')"New value: +"The NFT token ID" - changed
Input schema / requiredPrevious value: -[ - "tokenAddress", - "tokenId" -]New value: +[ + "contractAddress", + "tokenId" +]
- Changed
get_token_balance5 fields changed- added
Input schema / properties / addressAdded value: +{ + "description": "The wallet address or ENS name", + "type": "string" +} - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', etc.) or chain ID. Supports all EVM-compatible networks. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / ownerAddressRemoved value: -{ - "description": "The wallet address or ENS name to check the balance for (e.g., '0x1234...' or 'vitalik.eth')", - "type": "string" -} - changed
Input schema / properties / tokenAddress / descriptionPrevious value: -"The contract address or ENS name of the ERC20 token (e.g., '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' for USDC or 'uniswap.eth')"New value: +"The ERC20 token contract address" - changed
Input schema / requiredPrevious value: -[ - "tokenAddress", - "ownerAddress" -]New value: +[ + "address", + "tokenAddress" +]
- Removed
get_token_balance_erc20 - Removed
get_token_info - Changed
get_transaction2 fields changed- changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - changed
Input schema / properties / txHash / descriptionPrevious value: -"The transaction hash to look up (e.g., '0x1234...')"New value: +"Transaction hash (0x...)"
- Changed
get_transaction_receipt1 field changed- changed
Input schema / properties / txHash / descriptionPrevious value: -"The transaction hash to look up"New value: +"Transaction hash (0x...)"
- Added
get_wallet_address - Removed
is_contract - Added
lookup_ens_address - Added
multicall - Changed
read_contract8 fields changed- removed
Input schema / properties / abiRemoved value: -{ - "description": "The ABI (Application Binary Interface) of the smart contract function, as a JSON array", - "type": "array" -} - added
Input schema / properties / abiJsonAdded value: +{ + "description": "Full contract ABI as JSON string (optional - will auto-fetch verified contract ABI if not provided)", + "type": "string" +} - changed
Input schema / properties / args / descriptionPrevious value: -"The arguments to pass to the function, as an array (e.g., ['0x1234...'])"New value: +"Function arguments as strings (e.g., ['0xAddress'] for balanceOf)" - added
Input schema / properties / args / itemsAdded value: +{ + "type": "string" +} - changed
Input schema / properties / contractAddress / descriptionPrevious value: -"The address of the smart contract to interact with"New value: +"The contract address" - changed
Input schema / properties / functionName / descriptionPrevious value: -"The name of the function to call on the contract (e.g., 'balanceOf')"New value: +"Function name (e.g., 'name', 'symbol', 'balanceOf', 'totalSupply', 'owner')" - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - changed
Input schema / requiredPrevious value: -[ - "contractAddress", - "abi", - "functionName" -]New value: +[ + "contractAddress", + "functionName" +]
- Removed
resolve_ens - Added
resolve_ens_name - Added
sign_message - Added
sign_typed_data - Removed
transfer_erc1155 - Changed
transfer_erc207 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"The amount of tokens to send (in token units, e.g., '10' for 10 tokens)"New value: +"Amount to send (in token units, accounting for decimals)" - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', etc.) or chain ID. Supports all EVM-compatible networks. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / privateKeyRemoved value: -{ - "description": "Private key of the sending account (this is used for signing and is never stored)", - "type": "string" -} - added
Input schema / properties / toAdded value: +{ + "description": "Recipient address or ENS name", + "type": "string" +} - removed
Input schema / properties / toAddressRemoved value: -{ - "description": "The recipient address", - "type": "string" -} - changed
Input schema / properties / tokenAddress / descriptionPrevious value: -"The address of the ERC20 token contract"New value: +"The ERC20 token contract address" - changed
Input schema / requiredPrevious value: -[ - "privateKey", - "tokenAddress", - "toAddress", - "amount" -]New value: +[ + "tokenAddress", + "to", + "amount" +]
- Removed
transfer_eth - Added
transfer_native - Removed
transfer_nft - Removed
transfer_token - Added
wait_for_transaction - Changed
write_contract10 fields changed- removed
Input schema / properties / abiRemoved value: -{ - "description": "The ABI (Application Binary Interface) of the smart contract function, as a JSON array", - "type": "array" -} - added
Input schema / properties / abiJsonAdded value: +{ + "description": "Full contract ABI as JSON string (optional - will auto-fetch verified contract ABI if not provided)", + "type": "string" +} - changed
Input schema / properties / args / descriptionPrevious value: -"The arguments to pass to the function, as an array (e.g., ['0x1234...', '1000000000000000000'])"New value: +"Function arguments as strings (e.g., ['0xAddress', '1000000'])" - added
Input schema / properties / args / itemsAdded value: +{ + "type": "string" +} - changed
Input schema / properties / contractAddress / descriptionPrevious value: -"The address of the smart contract to interact with"New value: +"The contract address" - changed
Input schema / properties / functionName / descriptionPrevious value: -"The name of the function to call on the contract (e.g., 'transfer')"New value: +"Function name to call (e.g., 'mint', 'swap', 'stake', 'approve')" - changed
Input schema / properties / network / descriptionPrevious value: -"Network name (e.g., 'ethereum', 'optimism', 'arbitrum', 'base', 'polygon') or chain ID. Defaults to Ethereum mainnet."New value: +"Network name or chain ID. Defaults to Ethereum mainnet." - removed
Input schema / properties / privateKeyRemoved value: -{ - "description": "Private key of the sending account in hex format (with or without 0x prefix). SECURITY: This is used only for transaction signing and is not stored.", - "type": "string" -} - added
Input schema / properties / valueAdded value: +{ + "description": "ETH value to send with transaction in ether (e.g., '0.1' for payable functions)", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "contractAddress", - "abi", - "functionName", - "args", - "privateKey" -]New value: +[ + "contractAddress", + "functionName" +]
28 tool updates
- First observed
approve_token_spending - First observed
check_nft_ownership - First observed
estimate_gas - First observed
get_address_from_private_key - First observed
get_balance - First observed
get_block_by_number - First observed
get_chain_info - First observed
get_erc1155_balance - First observed
get_erc1155_token_uri - First observed
get_erc20_balance - First observed
get_latest_block - First observed
get_nft_balance - First observed
get_nft_info - First observed
get_supported_networks - First observed
get_token_balance - First observed
get_token_balance_erc20 - First observed
get_token_info - First observed
get_transaction - First observed
get_transaction_receipt - First observed
is_contract - First observed
read_contract - First observed
resolve_ens - First observed
transfer_erc1155 - First observed
transfer_erc20 - First observed
transfer_eth - First observed
transfer_nft - First observed
transfer_token - First observed
write_contract
TDQS
Scored across 25 tools
Most tools have distinct purposes, but there is some overlap between get_block and get_latest_block, and between get_contract_abi and read_contract/write_contract's ABI fetching. The descriptions help clarify, but an agent might occasionally hesitate between these pairs.
Tool names follow a highly consistent verb_noun or verb_noun_noun pattern throughout, such as get_balance, transfer_erc20, and sign_message. There are no deviations in style, making them predictable and easy to parse.
With 25 tools, the count is on the high side for an MCP server, bordering on heavy. While the domain (EVM interactions) is broad, this many tools could overwhelm agents or lead to redundancy, though it covers many use cases.
The tool set provides comprehensive coverage for EVM operations, including token transfers, contract interactions, network queries, and wallet management. It supports full workflows from reading to writing, with no obvious gaps in the domain.
Maintenance
Related MCP Connectors
AI Agent Utility Layer for agent safety, web monitoring, crypto research and tool discovery.
Bitcoin + Ethereum RPC for AI agents. 44 tools. x402 payments in USDC on Base mainnet.
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
Manage your blockchain infrastructure across 80+ chains with your agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables AI agents to interact with 30+ Ethereum-compatible blockchain networks, providing services like token transfers, contract interactions, and ENS resolution through a unified interface.2887 npm378MIT
- -licenseNot gradedqualityNot gradedmaintenanceComprehensive Model Context Protocol server that enables AI agents to interact with 30+ Ethereum-compatible blockchain networks, supporting token transfers, smart contract interactions, and ENS name resolution through a unified interface.1-
- AlicenseNot gradedqualityCmaintenanceAn MCP server that bridges AI models with Ethereum blockchains via all JSON-RPC calls, enabling natural language queries for block numbers, balances, transactions, and smart contract data.12 npm21MIT
- AlicenseCqualityCmaintenanceWeb3 MCP proxy server for AI agents: EVM execution, DeFi swaps, bridges, advanced orders, market data, wallet management, and confirmation-gated writes.10037 npm1MIT