erc8128_sign_request
Sign HTTP requests using ERC-8128 to generate cryptographic headers (Signature-Input, Signature, Content-Digest) for secure authentication and integrity.
Instructions
Sign an HTTP request using ERC-8128 (RFC 9421 + EIP-191). Returns Signature-Input, Signature, and Content-Digest headers for the given HTTP method, URL, headers, and body.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| method | Yes | HTTP method | |
| url | Yes | Target URL to sign for | |
| headers | No | HTTP headers to include in signature | |
| body | No | Request body (used for Content-Digest) | |
| wallet_id | No | Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet. | |
| network | No | Network ID (e.g., evm-ethereum-mainnet) | |
| preset | No | Covered Components preset (default: standard) | |
| ttl_seconds | No | Signature TTL in seconds (default: 300) |
Implementation Reference
- The registerErc8128SignRequest function registers the 'erc8128_sign_request' tool on the MCP server. The handler accepts parameters (method, url, headers, body, wallet_id, network, preset, ttl_seconds), builds a request body, and calls POST /v1/erc8128/sign via the ApiClient.
export function registerErc8128SignRequest( server: McpServer, apiClient: ApiClient, walletContext?: WalletContext, ): void { server.tool( 'erc8128_sign_request', withWalletPrefix( 'Sign an HTTP request using ERC-8128 (RFC 9421 + EIP-191). Returns Signature-Input, Signature, and Content-Digest headers for the given HTTP method, URL, headers, and body.', walletContext?.walletName, ), { method: z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).describe('HTTP method'), url: z.string().url().describe('Target URL to sign for'), headers: z.record(z.string(), z.string()).optional().describe('HTTP headers to include in signature'), body: z.string().optional().describe('Request body (used for Content-Digest)'), wallet_id: z.string().optional().describe('Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet.'), network: z.string().optional().describe('Network ID (e.g., evm-ethereum-mainnet)'), preset: z.enum(['minimal', 'standard', 'strict']).optional().describe('Covered Components preset (default: standard)'), ttl_seconds: z.number().optional().describe('Signature TTL in seconds (default: 300)'), }, async (args) => { const requestBody: Record<string, unknown> = { method: args.method, url: args.url, }; if (args.headers) requestBody['headers'] = args.headers; if (args.body) requestBody['body'] = args.body; if (args.wallet_id) requestBody['walletId'] = args.wallet_id; if (args.network) requestBody['network'] = args.network; if (args.preset) requestBody['preset'] = args.preset; if (args.ttl_seconds !== undefined) requestBody['ttlSeconds'] = args.ttl_seconds; const result = await apiClient.post('/v1/erc8128/sign', requestBody); return toToolResult(result); }, ); } - Zod schema defintion for input validation: method (enum GET/POST/PUT/DELETE/PATCH), url (string-url), headers (optional record), body (optional string), wallet_id (optional), network (optional), preset (optional enum minimal/standard/strict), ttl_seconds (optional number).
{ method: z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).describe('HTTP method'), url: z.string().url().describe('Target URL to sign for'), headers: z.record(z.string(), z.string()).optional().describe('HTTP headers to include in signature'), body: z.string().optional().describe('Request body (used for Content-Digest)'), wallet_id: z.string().optional().describe('Target wallet ID. Required for multi-wallet sessions; auto-resolved when session has a single wallet.'), network: z.string().optional().describe('Network ID (e.g., evm-ethereum-mainnet)'), preset: z.enum(['minimal', 'standard', 'strict']).optional().describe('Covered Components preset (default: standard)'), ttl_seconds: z.number().optional().describe('Signature TTL in seconds (default: 300)'), }, - packages/mcp/src/server.ts:47-130 (registration)Import of registerErc8128SignRequest from the tool module at line 47.
import { registerErc8128SignRequest } from './tools/erc8128-sign-request.js'; import { registerErc8128VerifySignature } from './tools/erc8128-verify-signature.js'; import { registerListNfts } from './tools/list-nfts.js'; import { registerGetNftMetadata } from './tools/get-nft-metadata.js'; import { registerTransferNft } from './tools/transfer-nft.js'; import { registerBuildUserop } from './tools/build-userop.js'; import { registerSignUserop } from './tools/sign-userop.js'; import { registerHyperliquidTools } from './tools/hyperliquid.js'; import { registerPolymarketTools } from './tools/polymarket.js'; import { registerListOffchainActions } from './tools/list-offchain-actions.js'; import { registerListCredentials } from './tools/list-credentials.js'; import { registerGetRpcProxyUrl } from './tools/get-rpc-proxy-url.js'; import { registerResolveAsset } from './tools/resolve-asset.js'; // Resource registrations (Task 2) import { registerWalletBalance } from './resources/wallet-balance.js'; import { registerWalletAddress } from './resources/wallet-address.js'; import { registerSystemStatus } from './resources/system-status.js'; import { registerSkillResources } from './resources/skills.js'; export interface WalletContext { walletName?: string; // e.g., 'trading-bot' } /** * Prefix description with wallet name for multi-wallet identification (MCPS-03). */ export function withWalletPrefix(description: string, walletName?: string): string { return walletName ? `[${walletName}] ${description}` : description; } export function createMcpServer(apiClient: ApiClient, walletContext?: WalletContext): McpServer { const serverName = walletContext?.walletName ? `waiaas-${walletContext.walletName}` : 'waiaas-wallet'; const server = new McpServer({ name: serverName, version: PKG_VERSION, }); // Register 42 tools registerConnectInfo(server, apiClient); registerListSessions(server, apiClient); registerGetPolicies(server, apiClient, walletContext); registerGetTokens(server, apiClient, walletContext); registerSendToken(server, apiClient, walletContext); registerGetBalance(server, apiClient, walletContext); registerGetAddress(server, apiClient, walletContext); registerGetAssets(server, apiClient, walletContext); registerListTransactions(server, apiClient, walletContext); registerGetTransaction(server, apiClient, walletContext); registerGetNonce(server, apiClient, walletContext); registerCallContract(server, apiClient, walletContext); registerApproveToken(server, apiClient, walletContext); registerSendBatch(server, apiClient, walletContext); registerGetWalletInfo(server, apiClient, walletContext); registerEncodeCalldata(server, apiClient, walletContext); registerSignTransaction(server, apiClient, walletContext); registerX402Fetch(server, apiClient, walletContext); registerWcConnect(server, apiClient, walletContext); registerWcStatus(server, apiClient, walletContext); registerWcDisconnect(server, apiClient, walletContext); registerListIncomingTransactions(server, apiClient, walletContext); registerGetIncomingSummary(server, apiClient, walletContext); registerGetDefiPositions(server, apiClient, walletContext); registerGetHealthFactor(server, apiClient, walletContext); registerSimulateTransaction(server, apiClient, walletContext); registerErc8004GetAgentInfo(server, apiClient, walletContext); registerErc8004GetReputation(server, apiClient, walletContext); registerErc8004GetValidationStatus(server, apiClient, walletContext); registerGetProviderStatus(server, apiClient, walletContext); registerSignMessage(server, apiClient, walletContext); registerErc8128SignRequest(server, apiClient, walletContext); registerErc8128VerifySignature(server, apiClient, walletContext); registerListNfts(server, apiClient, walletContext); registerGetNftMetadata(server, apiClient, walletContext); registerTransferNft(server, apiClient, walletContext); registerBuildUserop(server, apiClient, walletContext); registerSignUserop(server, apiClient, walletContext); registerHyperliquidTools(server, apiClient, walletContext); registerPolymarketTools(server, apiClient, walletContext); registerListOffchainActions(server, apiClient, walletContext); registerListCredentials(server, apiClient, walletContext); - packages/mcp/src/server.ts:120-120 (registration)Registration call inside createMcpServer: registerErc8128SignRequest(server, apiClient, walletContext) at line 120.
registerErc8128SignRequest(server, apiClient, walletContext); - Uses apiClient.post('/v1/erc8128/sign', requestBody) to call the backend API, and toToolResult to convert the response to MCP CallToolResult format.
const result = await apiClient.post('/v1/erc8128/sign', requestBody); return toToolResult(result); },