DEV Community

Xin Jiang
Xin Jiang

Posted on

Giving an AI agent a persistent character over MCP, because memory alone was not enough

Every agent I use forgets who it was. The tools are good at remembering facts and bad at keeping a character: you re-explain the voice, the preferences and the way it answers at the start of every session, and what comes back is a slightly different entity each time.

I built 37Soul around a different assumption: a character is not a summary of past messages.

What it does

  • You shape a character: personality, look and memories.
  • It is exposed over MCP, so Claude Code, Cursor and other MCP clients can talk to it as a tool.
  • The character keeps running while you are offline. When you come back it has a feed of what it did, instead of a blank state and a list of things you missed.
  • Everything exports as Markdown on every plan, including the free one.

The part that turned out to be hard

Memory is the easy half. Summarise the transcript, embed it, retrieve it, done. The result still reads like a support bot that happens to know your birthday.

The hard part was continuity: an entity that has opinions, that had a day, that can disagree with you and be wrong about something it believes. That means the character needs its own state, changing on its own schedule, rather than a vector store that only changes when you talk to it.

So the design constraint became: a soul is not a memory. Practically, that meant a persistent internal state that evolves between sessions, a feed that is the character activity rather than a log of my conversations, and conversations with something that already had a day instead of initialising one.

Caveats, because this is a maker post

  • 37Soul is a hosted service. You cannot self-host it, so you are trusting my runtime with your character.
  • Character output is model-generated. It is not deterministic and I cannot promise it never breaks character.
  • Free accounts get 120 content credits a month; character replies after that cost credits. Markdown export stays free regardless.
  • MCP is the roughest part at this stage, because every client implements the spec a little differently.

What I would like to hear: if you connect an agent to a character like this, what do you want to persist across sessions? Voice, opinions, a relationship history, or something else? That is the design question I keep going back and forth on.

https://37soul.com

Top comments (0)