Skip to main content
Glama
README.md
# stafett ๐Ÿƒโ€โ™€๏ธ

*Swedish for "relay race" โ€” because that's what it does: passes the baton between AI assistants.*

A remote MCP server that gives all your AI assistants (Claude, ChatGPT, โ€ฆ) one shared memory. Work on something in one assistant, run out of tokens, open another one and say *"continue where we left off"* โ€” and it actually can.

## The problem

AI assistants don't share anything with each other. If you use multiple accounts or providers, every switch means re-explaining everything. An MCP server can't read your chat history โ€” but it *can* give the assistant tools to save and restore working state. stafett makes that ergonomic:

- **Handoffs** โ€” before switching, ask the assistant to "save a handoff": a structured snapshot (summary, decisions, next steps, open questions, snippets).
- **Journal** โ€” sessions often die *abruptly* (token limits), too late for a handoff. The tool descriptions therefore instruct assistants to proactively log breadcrumb events *during* work, so there is always something to resume from.
- **Notes** โ€” free-form shared memory for ideas, links and reminders.

## Tools

| Tool | Purpose |
|---|---|
| `save_handoff` | Save a structured snapshot of the current session for a project |
| `resume` | Fetch latest handoff + journal to continue in a new session |
| `log_event` | Append a breadcrumb to a project's journal (called proactively) |
| `list_projects` | List projects, most recently active first |
| `save_note` | Save a free-form note |
| `search_notes` | Keyword search across notes |

## Stack

TypeScript ยท official [MCP SDK](https://github.com/modelcontextprotocol/typescript-sdk) (stateless Streamable HTTP) ยท Express ยท Upstash Redis ยท deployed on Vercel.

Auth is a **secret URL**: the server only answers on `/mcp/<long-random-token>`. Claude and ChatGPT custom connectors support OAuth or no auth โ€” a secret URL is the pragmatic middle ground for a personal server. Treat the URL as a password, and don't store anything sensitive.

## Run locally

```bash
npm install
cp .env.example .env   # set MCP_SECRET (openssl rand -hex 32); Upstash optional locally
npm run dev            # http://localhost:3000/mcp/<MCP_SECRET>
```

Without Upstash credentials the server uses in-memory storage โ€” fine for local testing, useless in production.

## Deploy

1. Create a free Redis database at [Upstash](https://upstash.com) (or via Vercel Marketplace).
2. `npx vercel` โ€” set env vars `MCP_SECRET`, `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN`.
3. Your connector URL is `https://<your-app>.vercel.app/mcp/<MCP_SECRET>`.

## Add to your assistants

- **Claude** (claude.ai / Desktop): Settings โ†’ Connectors โ†’ *Add custom connector* โ†’ paste the URL. No auth.
- **ChatGPT**: Settings โ†’ Connectors (requires developer mode) โ†’ *Create* โ†’ paste the URL. No auth.
- **Claude Code**: `claude mcp add --transport http stafett <url>`

Add the same URL everywhere โ€” that's the whole point.