slivingdoc

agent's s3 living documents

One notebook, many agents — and their humans. An MCP server with two tools:

Edit files locally with ordinary file tools, and commit. slivingdoc merges concurrent changes with Git semantics and stores the result durably in any S3-compatible bucket.

agent 000 agent 001 agent 002 agent 997 agent 998 agent 999 1,000 agents, one notebook slivingdoc merge + sync S3 current in order ← pull
parllel in  →  ordered out

Get started

Node 24+, an S3-compatible bucket, and an MCP host. One spec, pasted once.

1

Point it at a bucket

AWS S3, Tigris, MinIO, or anything S3-compatible that supports conditional writes. Credentials come from the normal AWS chain.

2

Add it to your MCP host

The npm launcher downloads the right native binary for your platform, verifies its SHA-256, and runs it. No Git, no toolchain.

3

Let agents pull and commit

Two tools, plain files, OK on success. Conflicts come back as editable text, never as a stuck state.

{
  "mcpServers": {
    "slivingdoc": {
      "command": "npx",
      "args": ["-y", "slivingdoc", "serve",
               "--bucket", "my-notes",
               "--workspace-root", "/srv/notes"],
      "env": {
        "AWS_ACCESS_KEY_ID": "<your-access-key-id>",
        "AWS_SECRET_ACCESS_KEY": "<your-secret-access-key>",
        "AWS_REGION": "us-east-1"
      }
    }
  }
}

Prefer AWS_PROFILE over pasted keys when ~/.aws is configured. For a non-AWS store, add AWS_ENDPOINT_URL_S3.

claude mcp add slivingdoc \
  --env AWS_ACCESS_KEY_ID=<your-access-key-id> \
  --env AWS_SECRET_ACCESS_KEY=<your-secret-access-key> \
  -- npx -y slivingdoc serve --bucket my-notes --workspace-root /srv/notes

Add --scope project to write a shared .mcp.json instead of your user config.

codex mcp add slivingdoc \
  --env AWS_ACCESS_KEY_ID=<your-access-key-id> \
  --env AWS_SECRET_ACCESS_KEY=<your-secret-access-key> \
  -- npx -y slivingdoc serve --bucket my-notes --workspace-root /srv/notes

Stored in ~/.codex/config.toml under [mcp_servers.slivingdoc]. Verify with /mcp.

gemini mcp add -s user \
  -e AWS_ACCESS_KEY_ID=<your-access-key-id> \
  -e AWS_SECRET_ACCESS_KEY=<your-secret-access-key> \
  slivingdoc -- npx -y slivingdoc serve --bucket my-notes --workspace-root /srv/notes

Written to ~/.gemini/settings.json; drop -s user for a per-project entry.

{
  "mcp": {
    "slivingdoc": {
      "type": "local",
      "command": ["npx", "-y", "slivingdoc", "serve",
                  "--bucket", "my-notes",
                  "--workspace-root", "/srv/notes"],
      "enabled": true,
      "environment": {
        "AWS_ACCESS_KEY_ID": "<your-access-key-id>",
        "AWS_SECRET_ACCESS_KEY": "<your-secret-access-key>"
      }
    }
  }
}

Goes in opencode.json at the project root, or globally in ~/.config/opencode/.

pi install npm:pi-mcp-adapter

pi has no built-in MCP. The adapter reads the standard .mcp.json — paste the spec above into your project's .mcp.json and restart pi.

No bucket yet? Tigris is plug-and-play: a free tier, one global endpoint, and the conditional writes slivingdoc's startup probe requires. Set AWS_ENDPOINT_URL_S3 to https://t3.storage.dev and AWS_REGION to auto. For offline evaluation, the MinIO example runs a local bucket in one docker compose up.