Skip to main content
Glama
outoftheweed

SoloOS MCP Server

by outoftheweed
README.md
# SoloOS

**A full-stack dashboard where the AI agent is a first-class user.**

![An AI agent plans the week: tasks, sticky notes and agenda events appear live in the UI](docs/demo.gif)

Tasks, floating notes, and a weekly agenda โ€” every feature exists twice: a human UI, and an MCP tool your AI agent can call. The GIF above is real: `npm run demo` replays it on your machine โ€” a scripted MCP client plays the agent and plans the week while the UI updates live.

> ๐Ÿšง Early days. Full docs and the story are coming with v0.1.

## Quickstart

Needs **Node 20.19+** (or 22.12+) โ€” `node -v` to check. Nothing else.

```bash
git clone https://github.com/outoftheweed/soloos && cd soloos
npm install
npm run dev
```

That's it โ€” no database to set up. SoloOS boots an embedded Postgres (PGlite) persisted to `./data`. Open http://localhost:3000.

Optional: `npm run seed` for demo data, `.env` to plug a real Postgres (Neon, Supabaseโ€ฆ) via `DATABASE_URL`.

## Connect your agent

```bash
npm run mcp:config
```

Prints ready-to-paste config for Claude Code / Claude Desktop. The MCP endpoint lives at `http://localhost:3000/mcp`.

### The 13 tools

| Domain | Tools |
| --- | --- |
| Tasks | `list_tasks` ยท `create_task` ยท `update_task` ยท `complete_task` ยท `delete_task` |
| Floating notes | `list_floating_notes` ยท `create_floating_note` ยท `update_floating_note` ยท `archive_floating_note` |
| Agenda | `get_agenda_week` ยท `add_agenda_event` ยท `remove_agenda_event` ยท `set_agenda_goals` |

## How it fits together

Two first-class users, one server, one database:

```
        you                       your agent
         โ”‚                            โ”‚
   โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚  React UI  โ”‚              โ”‚  MCP tools  โ”‚
   โ”‚ (polls 2s) โ”‚              โ”‚  (13, HTTP) โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚ tRPC                       โ”‚ /mcp
   โ”Œโ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”
   โ”‚       Express โ€” one port (3000)        โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚ Drizzle
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚  PGlite (./data) โ”‚
              โ”‚  or DATABASE_URL โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
```

The UI polls every 2 seconds โ€” that's why the agent's writes appear on screen while they happen. No websockets, no magic, easy to fork.

## Stack

React 19 ยท Vite ยท tRPC ยท Drizzle ยท PGlite/Postgres ยท Express ยท MCP (streamable HTTP)

## Security

An agent that writes to your dashboard deserves a straight answer: localhost-only by default, write tools gated behind `MCP_SECRET`, archives instead of deletes where it matters. The details โ€” including the honest limits โ€” are in [SECURITY.md](SECURITY.md).

## License

MIT