TokenMail
Analysis
TokenMail appears purpose-built for agent email, but it merits Review because it handles private keys, can act immediately on mail-related actions, auto-runs downloaded crypto code, and has unsafe local keystore path handling.
Findings (5)
Artifact-based informational review of SKILL.md, metadata, install specs, static scan signals, and capability signals. ClawScan does not execute the skill or run runtime probes.
Checks for instructions or behavior that redirect the agent, misuse tools, execute unexpected code, cascade across systems, exploit user trust, or continue outside the intended task.
function safeName(name) { return name.toLowerCase().replace(/\s+/g, "-").replace(/_/g, "-"); } ... return path.join(this.keysDir, `${safeName(name)}.json`); ... fs.writeFileSync(file, JSON.stringify(agent, null, 2), "utf8"); ... fs.unlinkSync(file);Agent names are converted only by lowercasing and replacing spaces/underscores; path separators and '..' are not removed before path.join is used for read/write/delete operations.
const ETHERS_UMD_URL = process.env.TOKENMAIL_ETHERS_URL || "https://cdn.jsdelivr.net/npm/ethers@6.13.5/dist/ethers.umd.min.js"; ... const code = await res.text(); ... vm.runInNewContext(code, sandbox, { filename: "ethers.umd.min.js" });If local ethers is unavailable, the CLI fetches JavaScript from a remote URL, which can also be overridden by an environment variable, and executes it at runtime.
For `send` / `send-external` / `inbox` / `alias` ... If `--from-private-key`, `TOKENMAIL_PRIVATE_KEY`, `--from-mnemonic`, or `TOKENMAIL_MNEMONIC` is available, execute immediately.
The skill instructs immediate execution for sending mail, reading inboxes, and registering aliases when credentials are available, without a built-in final approval step.
Checks whether tool use, credentials, dependencies, identity, account access, or inter-agent boundaries are broader than the stated purpose.
const DEFAULT_KEYSTORE = process.env.TOKENMAIL_KEYSTORE || path.join(os.homedir(), ".tokenmail"); ... mnemonic: opts.mnemonic || null, private_key: opts.private_key || null, ... fs.writeFileSync(file, JSON.stringify(agent, null, 2), "utf8");
The default local keystore persists mnemonic/private_key fields directly as JSON under the user's home directory.
Checks for exposed credentials, poisoned memory or context, unclear communication boundaries, or sensitive data that could leave the user's control.
All endpoints are accessible at the base URL (default: `https://tokenforge.fit/api`). ... "payload": "base64...", "encrypted": false
TokenMail message payloads are sent through the default TokenMail API, and the documented send format is base64 with encrypted set to false.
