Skip to main content
Glama

Try It

  • Cloud -- Use instantly at konbu-cloud.codenica.dev (free, no setup)

  • Self-hosted -- Run on your own server with Docker (see below)

Related MCP server: cairnos

What is konbu?

konbu is a personal digital planner — a Filofax-style system planner, digitized. A self-hostable Go binary that binds your memos, todos, schedule, and structured tables into one notebook, kept by an AI butler, and surfaces everything from a single search interface. It's yours alone — nothing is ever shared out. Not a replacement for Notion + Todoist + Calendar — a replacement for the act of searching four apps to find one thing.

What's different:

  • Native MCP server + CLI client -- Two parallel routes for the AI butler (Claude / Cursor / any MCP client) or shell / scripts to operate your planner.

  • Cross-resource full-text search -- One query across memos, todos, events, and structured tables. This is the core UX, not a side feature.

  • Structured tables (= table-memo, planned) -- Track blood pressure, household budgets, or inventory. Markdown can't express these; tables can.

  • BYOK AI chat -- Bring your own OpenAI/Anthropic API key, or use the included free tier.

  • Personal by design -- One notebook, for you only. Pulls in from outside (Google Calendar), never leaks out.

  • Self-hostable -- One Go binary, Docker compose, or use the hosted version.

End the state of having your day scattered across four different apps.

Features

  • Cross-resource Full-text Search -- Search across memos, todos, events, and structured tables in one query (core UX)

  • CLI & MCP Server -- Built-in CLI client and MCP server. AI agents like Claude and Cursor can read and write your data directly

  • AI Agent Chat -- "Add groceries to my todo" "What's on my schedule tomorrow?" in natural language. BYOK supported, free tier included

  • Memos -- Markdown notes with tagging, live preview

  • ToDo -- Inline task creation with due dates, tags, and notes

  • Calendar -- Monthly view with event CRUD and iCal import (personal, owner-only)

  • Structured Tables (= table-memo, planned) -- Track structured data (blood pressure, household budget, inventory) as rows × columns

  • Export/Import -- JSON export, Markdown ZIP export, iCal import

  • i18n -- English and Japanese

Quick Start

cp .env.example .env
docker compose up -d

Open http://localhost:8080 and create your account. The dev compose file sets DEV_USER=dev@local to skip registration.

Production (with Traefik)

# Edit .env with real credentials and your domain
docker compose -f docker-compose.prod.yml up -d

Native (without Docker)

# Prerequisites: Go 1.25+, Node.js 22+, PostgreSQL 16+

# Build frontend
cd web/frontend && npm ci && npm run build && cd ../..

# Build server
go build -o bin/server ./cmd/server

# Start (runs all SQL migrations automatically on boot)
DATABASE_URL="postgres://..." SESSION_SECRET="..." ./bin/server

Configuration

Variable

Required

Default

Description

DATABASE_URL

Yes

--

PostgreSQL connection string

SESSION_SECRET

Yes

dev fallback

Session signing key

PORT

No

8080

Server port

DEV_USER

No

--

Auto-login as this email (dev only)

OPEN_REGISTRATION

No

--

Set true to allow anyone to register (for Cloud)

BASE_URL

No

--

Public app URL used for OAuth callbacks

GOOGLE_CLIENT_ID

No

--

Enable Google OAuth login

GOOGLE_CLIENT_SECRET

No

--

Enable Google OAuth login

WEBHOOK_SECRET

No

--

GitHub Sponsors webhook secret

STRIPE_SECRET_KEY

No

--

Enable Stripe checkout and subscription billing

STRIPE_WEBHOOK_SECRET

No

--

Verify incoming Stripe webhook events

STRIPE_PRICE_MONTHLY

No

--

Stripe Price ID used for monthly Pro checkout

STRIPE_PRICE_YEARLY

No

--

Stripe Price ID used for yearly Pro checkout

GITHUB_FEEDBACK_TOKEN

No

--

GitHub token used to create anonymized feedback issues

GITHUB_FEEDBACK_REPO

No

--

Repository to receive feedback issues, e.g. krtw00/konbu

GITHUB_FEEDBACK_LABELS

No

--

Comma-separated labels added to forwarded feedback issues

AI_ENCRYPTION_KEY

No

--

64 hex chars used to encrypt BYOK AI keys

DEFAULT_AI_PROVIDER

No

openai

Server-side free-tier AI provider

DEFAULT_AI_API_KEY

No

--

Server-side free-tier AI key

DEFAULT_AI_ENDPOINT

No

--

Override free-tier provider endpoint

DEFAULT_AI_MODEL

No

--

Override free-tier provider model

R2_ACCESS_KEY_ID

No

--

Attachment upload credentials

R2_SECRET_ACCESS_KEY

No

--

Attachment upload credentials

R2_ENDPOINT

No

Cloudflare R2 default

Attachment storage endpoint

R2_BUCKET

No

konbu-attachments

Attachment storage bucket

R2_PUBLIC_URL

No

--

Optional public base URL for attachments

SMTP_HOST

No

--

SMTP relay host for reminder emails (e.g. smtp-relay.brevo.com). Notifications are disabled unless all five SMTP_* variables are set.

SMTP_PORT

No

--

SMTP relay port (typically 587 for STARTTLS)

SMTP_USERNAME

No

--

SMTP relay login

SMTP_PASSWORD

No

--

SMTP relay password / API key

SMTP_FROM

No

--

From address for outgoing reminder emails

NOTIFICATION_TICK_INTERVAL

No

1m

Notification sweep interval (Go duration, e.g. 30s, 2m)

Reminders / notifications

When the SMTP_* variables above are all set, the server starts a single in-process sweep loop that sends email reminders for upcoming events and due ToDos. Each user opts in via Settings (user_settings.notifications.enabled = true) and can override the recipient email, lead time, due-time, and timezone.

Notifications are a server-only feature — they run inside the API server process and require PostgreSQL. The MCP --standalone mode (SQLite) does not send reminders.

Docker Compose (prod) variables

Variable

Description

POSTGRES_PASSWORD

PostgreSQL password

KONBU_DOMAIN

Domain for Traefik TLS routing

CLI

The CLI is a standalone client that connects to a remote konbu server via API. Server code is not included in the CLI binary.

go install github.com/krtw00/konbu/cmd/konbu@latest

Setup

# Set environment variables (recommended: add to ~/.zshrc or ~/.bashrc)
export KONBU_API=https://konbu.example.com
export KONBU_API_KEY=your-api-key

# Or pass as flags
konbu --api https://... --api-key your-key memo list

Generate an API key in Settings > Security on the web UI.

Commands

All commands support --json flag for machine-readable output.

konbu memo list                        # List memos
konbu memo show <id>                   # Show memo content
konbu memo add "title" -c "content"    # Create memo (-c - for stdin)
konbu memo edit <id> --title "new"     # Update memo
konbu memo rm <id>                     # Delete memo

konbu todo list                        # List todos
konbu todo show <id>                   # Show todo details
konbu todo add "task" -t "tag1,tag2"   # Create todo
konbu todo add "task" -d 2025-04-01    # Create with due date
konbu todo edit <id> --desc "notes"    # Update todo
konbu todo done <id>                   # Mark done
konbu todo reopen <id>                 # Reopen
konbu todo rm <id>                     # Delete

konbu event list                       # List events
konbu event show <id>                  # Show event details
konbu event add "title" -s <RFC3339>   # Create event
konbu event edit <id> --title "new"    # Update event
konbu event rm <id>                    # Delete

konbu tag list                         # List tags
konbu tag rm <id>                      # Delete tag

konbu search "query"                   # Cross-search

konbu api-key list                     # List API keys
konbu api-key create "key-name"        # Create API key
konbu api-key rm <id>                  # Delete API key

konbu export json -o backup.json       # Export as JSON
konbu export markdown -o backup.zip    # Export as Markdown ZIP
konbu import ical calendar.ics         # Import iCal file

Short IDs (first 8 chars) can be used in place of full UUIDs.

MCP Server

konbu can run as a built-in MCP (Model Context Protocol) server in two modes — pick whichever fits.

Standalone mode (SQLite, no server required)

If you just want konbu as a local MCP backend for Claude Desktop, Cursor, or any MCP client, install the CLI and run it with --standalone. No PostgreSQL, no web server, no API key — everything is stored in a local SQLite file.

go install github.com/krtw00/konbu/cmd/konbu@latest
konbu mcp --standalone

Data is persisted at ~/.konbu/konbu.db by default. Override with --db /path/to/db.sqlite if needed.

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
  "mcpServers": {
    "konbu": {
      "command": "konbu",
      "args": ["mcp", "--standalone"]
    }
  }
}

Cursor accepts the same config at ~/.cursor/mcp.json (or via the settings UI).

Docker

A multi-arch image (linux/amd64, linux/arm64) is published to GitHub Container Registry. Pull it directly — no build step needed:

docker pull ghcr.io/krtw00/konbu-mcp:latest

For reproducible setups, pin to a release tag instead — e.g. docker pull ghcr.io/krtw00/konbu-mcp:v0.2.0.

Then point your MCP client at it. Data persists in a named volume:

{
  "mcpServers": {
    "konbu": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-v", "konbu-data:/data", "ghcr.io/krtw00/konbu-mcp:latest"]
    }
  }
}

Prefer building from source? docker build -f docker/Dockerfile.mcp -t konbu-mcp . from the repo root produces the same image (CGO-free, distroless static, ~22 MB).

Standalone mode exposes memo / todo / calendar event CRUD plus cross-resource search. Tags, attachments, and AI chat are server-only (use the connected mode below for those).

Connected mode (talk to a konbu server)

If you're running a konbu server (self-hosted or konbu Cloud), point the MCP server at it over HTTP. You get the full feature set: tags, attachments, and AI chat.

  1. Install the konbu CLI binary (see CLI section above)

  2. Generate an API key in Settings > Security on the web UI

  3. Add konbu to your MCP client config:

{
  "mcpServers": {
    "konbu": {
      "command": "konbu",
      "args": ["mcp"],
      "env": {
        "KONBU_API": "http://localhost:8080",
        "KONBU_API_KEY": "your-api-key"
      }
    }
  }
}

Usage examples

After restarting your MCP client, interact with konbu in natural language:

  • "What's on my schedule tomorrow?"

  • "Add a dentist appointment next Friday at 1pm"

  • "Create a todo to buy groceries with tag 'shopping'"

  • "Show me notes tagged 'meeting' from last week"

  • "Mark the 'review PR' todo as done"

API

Base path: /api/v1

Resource

Endpoints

Auth

POST /auth/register, POST /auth/login, POST /auth/logout, GET /auth/setup-status, GET /auth/providers, GET /auth/google/login, GET /auth/google/callback

User

GET/PUT /auth/me, GET/PUT /auth/settings, POST /auth/change-password, POST /auth/delete-account

API Keys

GET/POST /api-keys, DELETE /api-keys/:id

Memos

GET/POST /memos, GET/PUT/DELETE /memos/:id, GET/POST /memos/:id/rows, POST /memos/:id/rows/batch, GET /memos/:id/rows/export, PUT/DELETE /memos/:id/rows/:rowId

ToDos

GET/POST /todos, GET/PUT/DELETE /todos/:id, PATCH /todos/:id/done, PATCH /todos/:id/reopen

Events

GET/POST /events, GET/PUT/DELETE /events/:id

Calendars

GET/POST /calendars, GET/PUT/DELETE /calendars/:id (owner-only)

Tags

GET/POST /tags, PUT/DELETE /tags/:id

Search

GET /search?q=...

Chat

GET/POST /chat/sessions, GET/PUT/DELETE /chat/sessions/:id, POST /chat/sessions/:id/messages, GET/PUT /chat/config

Attachments

POST /attachments, GET /attachments/*

Export

GET /export/json, GET /export/markdown

Import

POST /import/ical

Development

# Start PostgreSQL
docker compose up -d postgres

# Frontend dev server
cd web/frontend && npm run dev

# Run server
DEV_USER=dev@local go run ./cmd/server

# Build CLI
go build -o bin/konbu ./cmd/konbu

# Run tests
go test ./...
cd web/frontend && npm test
cd web/frontend && npm run test:e2e

Project Structure

cmd/
  server/       # API server
  konbu/        # CLI client
internal/
  handler/      # HTTP handlers
  service/      # Business logic
  repository/   # DB access (sqlc)
  middleware/   # Auth, logging
  client/       # API client (used by CLI)
  mcp/          # MCP server
web/frontend/   # React + Vite SPA
sql/            # Schema and migrations
docker/         # Dockerfile

Roadmap

  • Browser push reminders (email reminders are already supported when SMTP_* env is configured)

  • Mobile UI improvements

  • CI test coverage

  • AI chat enhancements (context improvements, new model support)

Sponsors

If you find konbu useful, consider sponsoring the project.

License

MIT

Available Tools

18 tools
create_eventA

Create a calendar event with a fixed start time (and optional end time). Use this for time-bound items such as meetings or appointments; use create_todo for deadline-style tasks without a specific time, and create_memo for free-form notes. Returns the created event with its assigned UUID. Example: {"title":"Dentist","start_at":"2026-06-15T13:00:00+09:00","end_at":"2026-06-15T14:00:00+09:00","tags":["health"]} → {"id":"...","title":"Dentist",...}. Side effects: writes a new record on each call — calling twice creates two events. Not idempotent.

Inputs: start_at (required), title (required), all_day, description, +2 more.

create_memoA

Create a new memo (free-form Markdown note) in the konbu planner. Returns the created memo with its assigned UUID. Use this for notes without a due date or completion state; use create_todo for actionable tasks, and create_event for time-bound calendar items. Example: {"title":"Q3 plans","content":"## Goals\n- ship MCP","tags":["work","planning"]} → {"id":"...","title":"Q3 plans",...}. Side effects: writes a new record on each call — calling twice creates two memos. Not idempotent.

Inputs: title (required), content, tags.

create_todoA

Create a new todo (actionable task) in the konbu planner. Returns the created todo with its assigned UUID and status="open". Use this for tasks that need completion tracking; use create_memo for free-form notes, and create_event for items with a specific start time. Example: {"title":"Buy groceries","due_date":"2026-06-01","tags":["shopping"]} → {"id":"...","title":"Buy groceries","status":"open",...}. Side effects: writes a new record on each call — calling twice creates two todos. Not idempotent.

Inputs: title (required), description, due_date, tags.

delete_eventA

Permanently delete a calendar event by ID. This action cannot be undone. Example: {"id":"ghi09876"} → "deleted". Side effects: destructive, irreversible. The first call deletes; subsequent calls with the same id error.

Inputs: id (required).

delete_memoA

Permanently delete a memo by ID. This action cannot be undone. Returns the string "deleted" on success. Example: {"id":"abc12345"} → "deleted". Side effects: destructive, irreversible. The first call deletes; subsequent calls with the same id error because the memo no longer exists.

Inputs: id (required).

delete_todoA

Permanently delete a todo by ID. This action cannot be undone. Prefer mark_todo_done if you only want to record completion — completed todos remain searchable and visible in history. Example: {"id":"def67890"} → "deleted". Side effects: destructive, irreversible. The first call deletes; subsequent calls with the same id error.

Inputs: id (required).

get_eventA

Fetch the full details of a single calendar event by ID, including description, all-day flag, and tags. Example: {"id":"ghi09876"} → {"id":"ghi09876-...","title":"...","description":"...","start_at":"...","end_at":"...","all_day":false,"tags":[...]}. Side effects: read-only. Errors if the id does not exist.

Inputs: id (required).

get_memoA

Fetch the full details of a single memo by ID, including the Markdown content body. Typically called after list_memos or search to read a memo's body. Example: {"id":"abc12345"} returns {"id":"abc12345-...","title":"...","content":"# heading...","tags":[...]}. Side effects: read-only. Errors if the id does not exist or belongs to another user.

Inputs: id (required).

get_todoA

Fetch the full details of a single todo by ID, including description, status, due date, and tags. Example: {"id":"def67890"} → {"id":"def67890-...","title":"...","description":"...","status":"open","due_date":"2026-06-01","tags":[...]}. Side effects: read-only. Errors if the id does not exist.

Inputs: id (required).

list_eventsA

List calendar events belonging to the user, ordered by start time. Returns id, title, start_at, end_at, all_day flag, and tags for each event. For tasks without a fixed time use list_todos; for free-form notes use list_memos. Example: returns [{"id":"ghi09876-...","title":"Standup","start_at":"2026-05-28T10:00:00+09:00","end_at":"2026-05-28T10:15:00+09:00","all_day":false,"tags":["work"]}, ...]. Workflow: typically followed by get_event(id) for full details or update_event(id, ...) to reschedule. Side effects: read-only.

Inputs: no named parameters.

list_memosA

List all memos (free-form Markdown notes) belonging to the user, newest first. Returns id, title, tags, and timestamps for each memo, but NOT the full Markdown body — call get_memo to read a specific memo's body. Memos have no status or due date; for actionable tasks use list_todos. Example: returns [{"id":"abc12345-...","title":"Daily notes","tags":["work"],"created_at":"2026-05-27T..."}, ...]. Workflow: typically followed by get_memo(id) when the user wants to read a specific memo's content. Side effects: read-only.

Inputs: no named parameters.

list_todosA

List all todos (actionable tasks with status and optional due date), newest first. Returns id, title, status (open / done), due_date, and tags for each todo. For free-form notes without status use list_memos; for time-bound calendar items use list_events. Example: returns [{"id":"def67890-...","title":"Buy groceries","status":"open","due_date":"2026-06-01","tags":["shopping"]}, ...]. Workflow: typically followed by mark_todo_done(id) when the user reports completion, or get_todo(id) to read the full description. Side effects: read-only.

Inputs: no named parameters.

mark_todo_doneA

Mark a todo as completed (status="done"). Convenience shortcut for the most common state transition; equivalent to update_todo with status="done" but communicates intent more clearly. Returns the string "marked as done" on success. Example: {"id":"def67890"} → "marked as done". Side effects: idempotent — calling on an already-completed todo is a no-op that still returns success.

Inputs: id (required).

reopen_todoA

Reopen a completed todo (transition status from "done" back to "open"). Use this when the user wants to undo a completion. Returns the string "reopened" on success. Example: {"id":"def67890"} → "reopened". Side effects: idempotent — calling on an already-open todo is a no-op that still returns success.

Inputs: id (required).

update_eventA

Update an existing calendar event. Only the fields provided are modified; omitted fields are left unchanged. The tags array (if provided) REPLACES the existing tag set. Returns the updated event. Example: {"id":"ghi09876","start_at":"2026-06-16T13:00:00+09:00","end_at":"2026-06-16T14:00:00+09:00"} reschedules the event by one day. Side effects: idempotent for the same input; only specified fields change. Errors if the id does not exist.

Inputs: id (required), all_day, description, end_at, +3 more.

update_memoA

Update an existing memo's title, content, and/or tags. Only the fields provided are modified; omitted fields are left unchanged. Note that the tags array (if provided) REPLACES the existing tag set — pass the full desired list, not a delta. Returns the updated memo. Example: {"id":"abc12345","title":"New title"} renames the memo and leaves content/tags untouched. Side effects: idempotent for the same input; only specified fields change. Errors if the id does not exist.

Inputs: id (required), content, tags, title.

update_todoA

Update an existing todo's fields. Only the fields provided are modified; omitted fields are left unchanged. For toggling completion state alone, prefer mark_todo_done / reopen_todo for clearer intent; use update_todo when you also need to change title, description, due_date, or tags. The tags array (if provided) REPLACES the existing tag set. Example: {"id":"def67890","due_date":"2026-07-01","description":"Updated context"} changes only those two fields. Side effects: idempotent for the same input; only specified fields change. Errors if the id does not exist.

Inputs: id (required), description, due_date, status, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.5/5.0

    Scored across 18 tools

    Disambiguation5/5

    Each tool targets a distinct resource (event, memo, todo) and action (create, get, list, update, delete, mark done, reopen). The descriptions explicitly differentiate between resource types, eliminating any ambiguity.

    Naming Consistency4/5

    All tools follow a verb_noun pattern (e.g., create_event, delete_todo), but list operations use plural nouns (list_events, list_memos, list_todos) while other operations use singular, causing a minor inconsistency.

    Tool Count5/5

    With 18 tools covering CRUD for three resource types plus status transitions and a cross-resource search, the count is well-scoped and each tool serves a clear, necessary purpose.

    Completeness5/5

    The tool set provides full lifecycle management for events, memos, and todos (create, read, update, delete) plus status toggles and search. No obvious gaps exist for the planner domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server for AI agents to read, write, and organize notes in a local-first, human-in-the-loop note-taking app.
      9 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Local MCP server for CairnOS, a local-first productivity app. Exposes 13 tools that let Claude read and write the same local SQLite "brain" the app uses — create and update tasks, projects, reminders, ideas, and notes; classify natural-language brain dumps; and query overdue/today tasks and project context.
      13 npm
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Task and project management MCP server with OAuth for Claude Desktop, Cursor bridge, semantic search, staged write approval
      18 npm
      MIT