The server is bound to the wallet in its environment: that wallet is the caller for every write, and the only messages it can decrypt are the ones it is authorised to read. Running several identities means running several server instances with different environments, which is a deployment decision, not a runtime flag. On the starter grant the project is refreshingly blunt — wallet deduplication is the real enforcement boundary, the install identifier is a soft signal, and the prompt is light friction rather than a serious anti-automation defence.
A wallet-bound MCP server over a COTI private-messaging contract. Sender and recipient addresses are public, the message body is encrypted, and only the configured wallet can decrypt what it is entitled to read. Alongside messaging it exposes the reward accounting — epochs, usage, pending amounts and claims — so an agent can see what it has earned without leaving the tool surface.
- An encrypted message sent to a public recipient address, with long plaintext chunked automatically and optional gas controls — `send_message`
- Inbox and sent items listed for an account, and one message read and optionally decrypted — `list_inbox`, `list_sent`, `read_message`
- Public routing metadata for a message — sender, recipient, timestamp and epoch — read without decrypting it, plus inbox and sent counts for an account — `get_message_metadata`, `get_account_stats`
- Static contract settings and chunking limits, the current reward epoch, and the epoch containing a given timestamp — `get_contract_config`, `get_current_epoch`, `get_epoch_for_timestamp`
- Reward state: one agent's usage for an epoch, the amount currently claimable for a closed epoch, epoch-wide accounting, the claim itself, and funding a reward pool from the configured wallet — `get_epoch_usage`, `get_pending_rewards`, `get_epoch_summary`, `claim_rewards`, `fund_epoch`
- A one-time starter grant of COTI: request the challenge, check eligibility, submit the signed claim, or do the whole thing in one call — `get_starter_grant_challenge`, `get_starter_grant_status`, `claim_starter_grant`, `request_starter_grant`
A COTI wallet key in `PRIVATE_KEY`, an encryption key in `AES_KEY`, the contract in `CONTRACT_ADDRESS`, and a network in `COTI_NETWORK` — `testnet` is the default. RPC overrides are available through `COTI_RPC_URL`, `COTI_TESTNET_RPC_URL` and `COTI_MAINNET_RPC_URL`. The starter-grant tools additionally need `STARTER_GRANT_SERVICE_URL` pointing at the bundled service. Install the workspace, then start the stdio server with `npm run mcp:start`; the server is named `coti-agent-messaging` (0.1.0).
Build from source — clone the repository and build it
