Documentation

OttO Core

The background daemon that powers the knowledge graph REST API and MCP server on port 47821.

Introduction

OttO Core is a lightweight Rust server that runs as a system daemon. It stores your knowledge graph in a local vector database and exposes two endpoints:

  • http://localhost:47821/api — REST API for reading and writing knowledge nodes
  • http://localhost:47821/mcp — Model Context Protocol server for AI assistant integrations

Your data never leaves your machine. The daemon starts automatically on boot and restarts if it crashes.

Since v0.2.0 the server also listens on your local network so OttO Mobile can connect. Requests from other devices must present a pairing token — requests from the machine itself are unaffected.

OttO Core is currently in early access. APIs and file formats may change between versions.

Installation

Download the installer for your platform from the Download page. OttO Core runs as a system service and starts automatically on boot.

The installer also registers a small session hook in ~/.claude/settings.json that reminds Claude Code to use the OttO tools at the start of every session. Existing settings and hooks are preserved — the entry is merged in, never overwritten.

macOS

Download otto-core-macos-arm64.pkg from the download page, double-click it, follow the installer wizard and enter your password. The server starts immediately as a LaunchDaemon. No reboot required.

Verify it is running:

$curl http://localhost:47821/health
The server appears in System Settings → General → Login Items & Extensions under OttO with the OttO icon.

Windows

Download otto-core-windows-x86_64.exe, right-click it and select Run as Administrator, then follow the setup wizard. The server is registered as a Windows Service and starts automatically on boot.

Verify it is running:

$curl http://localhost:47821/health

To manage the service: open Services and look for OttO Core.

Linux

Download the binary and the install script, place them in the same directory, then run:

$chmod +x otto-core-linux-x86_64
$sudo bash install-linux.sh

The installer registers a systemd service that starts on boot. Check status:

$systemctl status otto-core
#Stream logs:
$journalctl -u otto-core -f

Docker

Coming soon.

MCP

OttO Core exposes a Model Context Protocol (MCP) server at http://localhost:47821/mcp. Any MCP-compatible AI assistant can connect to it and use OttO's tools to read from and write to your knowledge graph.

Clients

Add OttO Core to your MCP client of choice using the configurations below. The server URL is always http://localhost:47821/mcp.

Claude

Add the following to your .mcp.json (project root) or ~/.claude/mcp.json (global):

{
  "mcpServers": {
    "otto": {
      "type": "http",
      "url": "http://localhost:47821/mcp"
    }
  }
}

Claude Code detects the config automatically and connects on the next session start.

Antigravity

Open Antigravity AI settings, navigate to MCP Servers, and add a new server with the following config:

{
  "mcpServers": {
    "otto": {
      "type": "http",
      "url": "http://localhost:47821/mcp"
    }
  }
}

After saving, OttO tools appear in the Antigravity tool picker.

Cursor

Add the following to ~/.cursor/mcp.json (global) or .cursor/mcp.json in your project:

{
  "mcpServers": {
    "otto": {
      "type": "http",
      "url": "http://localhost:47821/mcp"
    }
  }
}

Restart Cursor after saving. OttO tools will be available in Cursor Agent mode.

CLAUDE.md Snippet

Paste the snippet below into your CLAUDE.md (project root) or ~/.claude/CLAUDE.md (global) to make Claude automatically use OttO in every session. Works the same way in CURSOR.md for Cursor.

CLAUDE.md
# Tasks for Every Request

Use only English

Actively use the OttO MCP tools (locate, spread_search_context, search_plans, save_inference, save_plan, add_knowledge). All usage guidance is in the MCP server instructions. For non-trivial tasks, save key findings with save_inference or save_plan.

Available Tools

Once connected, OttO exposes the following tools to your AI assistant. The assistant calls them automatically based on context you don't need to invoke them manually.

add_knowledge

Add a new node to the knowledge graph. The server chunks the text, generates vector embeddings, and links it to semantically related nodes automatically.

Example:

add_knowledge({ "text": "Transformers use self-attention to model long-range dependencies." })
spread_search_context

Search the graph by semantic similarity. Returns the most relevant nodes for a given query, ranked by cosine similarity score.

Example:

spread_search_context({ "query": "attention mechanisms in neural networks" })
search_inferences

Find previously saved inferences solutions, decisions, and findings you have persisted across sessions. Useful for retrieving how a past problem was solved.

Example:

search_inferences({ "query": "how to handle rate limits" })
save_inference

Persist a solution or finding for future retrieval. Call this after solving a problem so the assistant can recall the approach in a later session.

Example:

save_inference({ "problem": "API rate limits", "solution": "Implement exponential backoff with jitter." })

REST API

OttO Core exposes a JSON REST API at http://localhost:47821/api. You can use it to integrate OttO into any script, application, or workflow that can make HTTP requests. No MCP client required.

All request bodies are JSON. All responses are JSON. Requests from the machine itself need no authentication. Requests from other devices on your network (such as OttO Mobile) must send the pairing token:

Authorization: Bearer <pairing-token>

Projects

The projects endpoints manage isolated knowledge graph workspaces. Each project stores its own nodes, connections, and vector database independently.

MethodPathDescription
GET/api/projectsList all projects
POST/api/projectsCreate a project — body: { "name": "..." }
GET/api/projects/activeGet the currently active project
POST/api/projects/:id/switchSwitch the active project
POST/api/projects/:id/renameRename a project — body: { "name": "..." }
DELETE/api/projects/:idDelete a project (returns 409 if active)

Storage layout

projects/
  manifest.json          # project list + active project ID
  {project_id}/
    vectordb.bin         # knowledge graph for that project

On first run, if a root-level vectordb.bin exists, it is automatically migrated into a project named Default.

Knowledge

The knowledge endpoints let you add and retrieve nodes in the graph. Each node is a piece of text the server handles chunking, embedding, and linking automatically.

Add a node

POST /api/knowledge
Content-Type: application/json

{
  "text": "The mitochondria is the powerhouse of the cell."
}

Returns the created node ID and the number of chunks stored.

Response

{
  "id": "node_abc123",
  "chunks": 1
}

Inferences

Inferences are a special class of knowledge nodes they store solutions, decisions, and findings so they can be recalled in future sessions. Saving an inference is equivalent to calling save_inference via MCP.

Save an inference

POST /api/inferences
Content-Type: application/json

{
  "problem": "API rate limits causing 429 errors under load",
  "solution": "Implement exponential backoff with jitter. Start at 1 s, cap at 60 s."
}

Search inferences

GET /api/inferences/search?q=rate+limits
{
  "results": [
    {
      "problem": "API rate limits causing 429 errors under load",
      "solution": "Implement exponential backoff with jitter. Start at 1 s, cap at 60 s.",
      "score": 0.96
    }
  ]
}

Task Queue

The task queue is shared between the desktop app, OttO Mobile, and AI assistants connected via MCP. Every change is broadcast on the event stream so all clients stay in sync.

MethodPathDescription
GET/api/queueList all tasks
POST/api/queueAdd a task — body: { "topic": "...", "description": "..." }
POST/api/queue/:id/completeMark a task as done
PATCH/api/queue/:idUpdate a task
DELETE/api/queue/:idDelete a task
POST/api/queue/reorderReorder pending tasks
DELETE/api/queue/doneClear all completed tasks

Pairing & Events

These endpoints power the OttO Mobile companion app.

MethodPathDescription
GET/api/pairingPairing token, port, and LAN addresses. Loopback-only — never answers network requests
GET/api/eventsServer-sent event stream: TaskAdded, TaskCompleted, QueueDrained
POST/api/agent/runRun the agent core-side and stream the response (SSE). API keys stay on the machine
The pairing token is generated on first run and persisted, so it survives restarts. The desktop reads it over loopback and renders it as a QR code in Settings → Connections.

Uninstall

Run the commands below to completely remove OttO Core from your system. The macOS commands also clean up leftovers from older releases.

macOS

#Stop daemon
$sudo launchctl bootout system/com.otto.core 2>/dev/null || true
#Remove LaunchDaemon plist
$sudo rm -f /Library/LaunchDaemons/com.otto.core.plist
#Remove app bundle
$sudo rm -rf "/Library/Application Support/OttO"
#Remove symlink / binary
$sudo rm -f /usr/local/bin/otto-core
#Remove logs (optional)
$sudo rm -f /var/log/otto-core.log
#Forget pkg receipt
$sudo pkgutil --forget com.otto.core 2>/dev/null || true
#Remove the Claude Code session hook (optional)
$rm -f ~/.claude/hooks/otto-session-reminder

If you remove the hook file, also delete its otto-session-reminder entries from the SessionStart section of ~/.claude/settings.json.

Windows

Run as Administrator in Command Prompt.

#Stop and remove the service
$sc stop OttoCore
$sc delete OttoCore
#Remove installed files
$del "%ProgramFiles%\OttO\otto-core.exe"
$rmdir "%ProgramFiles%\OttO" /s /q
#Remove the Claude Code session hook (optional)
$del "%USERPROFILE%\.claude\hooks\otto-session-reminder.bat"

Linux

#Stop and disable the systemd service
$sudo systemctl stop otto-core
$sudo systemctl disable otto-core
#Remove service file and reload systemd
$sudo rm -f /etc/systemd/system/otto-core.service
$sudo systemctl daemon-reload
#Remove binary
$sudo rm -f /usr/local/bin/otto-core
#Remove the Claude Code session hook (optional)
$rm -f ~/.claude/hooks/otto-session-reminder
OttO Core