Quote-first, non-custodial x402 text-to-speech with spend policy, MP3 artifacts, and receipts.
Non-custodial, quote-first text-to-speech for AI agents:
@unlimitedtts/core validates live x402 challenges, enforces spend policy, persists sanitized receipts, and writes private MP3 artifacts.@unlimitedtts/mcp exposes tts_list_voices, tts_quote, and irreversible tts_synthesize tools over stdio.@unlimitedtts/openclaw bundles the MCP server and the unlimitedtts agent skill.skills/unlimitedtts supports MCP-guided and direct wallet-aware HTTP workflows.The implemented v1 path is external-signature mode. A separate wallet tool creates the x402 v2 PAYMENT-SIGNATURE; this code never accepts a seed phrase or private key.
Node.js 20 or newer and pnpm are required.
pnpm install --frozen-lockfile
pnpm check
Run the local server from this checkout:
pnpm --filter @unlimitedtts/mcp build
node packages/mcp/dist/cli.js
Generic MCP configuration after npm publication:
{
"mcpServers": {
"unlimitedtts": {
"command": "npx",
"args": ["-y", "@unlimitedtts/mcp@0.1.0"],
"env": {
"UNLIMITEDTTS_MAX_USDC_PER_CALL": "0.10",
"UNLIMITEDTTS_ROLLING_24H_USDC": "1.00",
"UNLIMITEDTTS_OUTPUT_DIRECTORY": "/absolute/approved/output"
}
}
}
}
OpenClaw local development:
pnpm --filter @unlimitedtts/openclaw build
openclaw plugins install -l ./packages/openclaw
openclaw plugins enable unlimitedtts
openclaw gateway restart
openclaw plugins inspect unlimitedtts --runtime --json
openclaw plugins doctor
tts_list_voices retrieves /docs and /tts/voices and caches the result for five minutes.tts_quote sends the exact synthesis body to /x402/tts without payment, validates the returned PAYMENT-REQUIRED, enforces local policy, reserves rolling budget, and returns a short-lived HMAC token.selectedRequirement.tts_synthesize verifies the token, unchanged body hash, complete x402 v2 accepted entry, exact-EVM payee and value, then sends one paid retry.audio/mpeg and PAYMENT-RESPONSE. It commits the budget, writes a sanitized receipt, atomically stores the MP3 with mode 0600, and returns structured metadata plus MCP audio/resource content.PAYMENT_OUTCOME_UNKNOWN permanently quarantines that quote in the local ledger. The server never automatically submits or authorizes a second payment.
| Environment variable | Default |
|---|---|
UNLIMITEDTTS_ENVIRONMENT | production; set staging explicitly for the staging API and Base Sepolia |
UNLIMITEDTTS_API_ORIGIN | https://api.unlimitedtts.com |
UNLIMITEDTTS_ALLOWED_NETWORKS | eip155:8453 |
UNLIMITEDTTS_ALLOWED_ASSETS | Base USDC contract |
UNLIMITEDTTS_ALLOWED_PAYEES | Payee pinned from the verified 30 July 2026 release contract |
UNLIMITEDTTS_MAX_USDC_PER_CALL | 0.10 |
UNLIMITEDTTS_ROLLING_24H_USDC | 1.00 |
UNLIMITEDTTS_APPROVAL_THRESHOLD_USDC | 0.05 |
UNLIMITEDTTS_REQUIRE_APPROVAL | first-payment-and-over-threshold |
UNLIMITEDTTS_OUTPUT_DIRECTORY | .unlimitedtts-artifacts under the server working directory |
UNLIMITEDTTS_QUOTE_TOKEN_SECRET | Random per process; configure a secret for multi-instance deployments |
Payee rotation must be released through trusted configuration. The server never learns an allowed payee from an untrusted challenge.
Production remains the default and is pinned to Base mainnet. For staging validation, set UNLIMITEDTTS_ENVIRONMENT=staging; this selects https://staging-api.unlimitedtts.com, Base Sepolia (eip155:84532), and staging USDC. The core rejects the staging origin, network, or asset when the environment is not explicitly staging.
This checkout implements the portable local MCP, external wallet adapter contract, agent skill, OpenClaw package, tests, and registry metadata. Hosted Streamable HTTP, temporary R2 storage, prepaid-card synthesis, and a concrete managed automatic signer are intentionally not advertised as completed v1 features.
See required and recommended upstream changes before enabling unattended automatic signing or a hosted service.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @unlimitedtts/mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"com-unlimitedtts-tts": {
"command": "npx",
"args": [
"-y",
"@unlimitedtts/mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@unlimitedtts/mcpnpmUnlimitedTTS works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.