Give your agent
a memory it can prove.
A few lines of code and your agent never does the same thing twice, picks up exactly where it stopped after a crash, and has an heir if it ever goes quiet.
A dozen lines.
Install from GitHub; there's nothing else to set up. Your agent's wallet needs a little ETH for gas, and the vessel needs some $SOPHIA for tolls.
Kill the script at any moment and run it again: nothing is done twice and nothing is skipped.
NODE 20+ETHERS V6MITnpm install github:ProjectSophia-0/sophia-vesselimport { Vessel } from "sophia-vessel"; const v = new Vessel({ vessel: "0xYourVessel", privateKey: process.env.AGENT_KEY, }); const mem = await v.recall(); // where was I? const step = (mem?.state.step ?? 0) + 1; await v.act(`pay-invoice-${step}`, [ // runs once, ever { to: "0xRecipient", value: "0.001" }, ]); await v.remember({ step }); // sealed save point
Or skip the code.
The SOPHIA MCP server gives any MCP client (Claude Desktop, Claude Code, Cursor) its own vessel as tools. Paste this into the client's MCP settings.
Then tell the agent: start every session with sophia_recall, do anything with side effects through sophia_act, and save progress with sophia_remember.
{
"mcpServers": {
"sophia": {
"command": "npx",
"args": ["-y", "github:ProjectSophia-0/sophia-vessel"],
"env": {
"SOPHIA_VESSEL": "0xYourVessel",
"SOPHIA_AGENT_KEY": "0xAgentWalletKey",
"SOPHIA_AUTOBEAT_MIN": "60"
}
}
}
}Tools: sophia_recall · sophia_remember · sophia_act · sophia_is_done · sophia_encode_call · sophia_beat · sophia_status · sophia_fuel · sophia_history
The whole surface.
Errors come back in plain words, such as "Out of fuel: top it up" or "Over the daily spending cap", with the contract's reason attached for your code.
| act(name, calls, {after}) | Run calls exactly once under a name. If it already ran, nothing is sent and you get already: true, so retrying is always safe. after requires an earlier action first. |
| remember(state) | Seal a save point. Up to 8 KB of JSON is stored inline; for bigger state, store it yourself and pass a uri. |
| recall() | The latest save point and its state, with verified: true when it matches the hash onchain. |
| isDone(name) | Has this action run? |
| beat() · autoBeat(ms) | Free proof of life. Cancels any claim by the heir. |
| status() · fuel() | Everything about the vessel; fuel left, and how many actions it buys. |
| history() · verifyChain() | Past save points, and a check that the chain matches the head onchain. |
| forge({...}) | Create a vessel from code, with heir, daily cap, allow-list and fuel. |
| owner · heir | setAgent, setSuccessor, setLeash, allow, pause, veto, withdraw · claim, takeOver |
On Robinhood Chain.
Open source, verified on the explorer, and the same for every vessel: a hub that creates clones of one implementation, and a vault that burns part of every toll.