Skip to main content

Outrage

A simple retrieval system for coding agents: an MCP server, a data store, and skills that let an agent keep notes, designs and task context in a store local to the project it is working on.

Retrieval is by key rather than by similarity. Keys are hierarchical, slash delimited strings such as context/<guid>/design, and any key may carry metadata such as context/<guid>/design/!title. Since an agent knows the keys it wrote, lexical addressing is enough, and the system stays deterministic and free of external dependencies. Semantic search is a possible later addition, layered on as metadata rather than as a change to the model.

Keys are not paths, but they are shaped like them, so a key can mirror one: notes/src/myfile.py for notes about a source file. A key being written may also use ? in place of a segment - storing at tmp/? writes to tmp/1, and the store reports the key it chose.

Purpose

To provide a hierarchical RAG (Retrieval-Augmented Generation) MCP store to use with LLM based tools.

Features

  • Simple to get started with - built in initialisation configures everything.
  • Hierarchical store of data and metadata.
  • LLM search - LLM subagents add summary metadata to documents, and LLM subagents can search documents and metadata.
  • Multiple data stores including parquet based stores for large-scale reference material.

Status

The store, the MCP server, the key handling, the skill and the command line tool are implemented. The tool covers the store operations (outrage get, set, ls, dump, rm), bulk export and import to a directory of files (outrage export, outrage import), building a read-only parquet store (outrage pack), the MCP configuration (outrage config), a verified backup (outrage backup), the event log (outrage log), and setting a project up (outrage init). See implementation.md for what is done and what is next.

outrage init is the way in: run it in a project and it registers the MCP server, installs the SessionStart hook, and copies the skill and the agents into .claude/. It writes only the entries outrage owns, leaves the rest of those files alone, and is safe to re-run - which is how a project is repaired after an upgrade or after the environment moves. --dry-run reports what it would change without writing.

Documentation

  • design.md - the design. Components, the key namespace and its grammar, tool semantics, and the SQLite schema. Decisions that are deferred or still open are recorded at the end.
  • implementation.md - what is implemented so far, and the planned build order.

Components

  • MCP server - Python, stdio, for local use. Exposes the store as tools.
  • Data store - a Python library, independent of MCP so that it can be tested and reused on its own. One interface with two backends behind it, and which one a store uses follows from its file's extension. SQLite is the read-write default: a store accumulated a document at a time, which is what session context and notes on a codebase are. Parquet is one columnar file, written whole by outrage pack and read many times, for a reference base of tens of thousands of documents - 11× smaller than the same corpus in SQLite, and it seeks a range rather than scanning one. It refuses writes, which is the storage rather than a setting.
  • Skill - src/outrage/skills/rage/SKILL.md, initially for Claude Code, covering when to store and retrieve and what key conventions to follow. It ships inside the package so that an install carries it, and outrage init copies it into a project. A SessionStart hook in .claude/settings.json, installed by the same command, covers the moment a skill would not be reached for on its own.
  • Event log - an optional JSON lines record of the requests made and the store accesses beneath them, for answering afterwards what a session actually did. Off unless outrage config --log or outrage-server --log asks for it.
  • Backup - outrage backup copies the database through SQLite and checks what it wrote. In the library rather than the tool, because a store in WAL mode keeps recent writes in a sidecar file and copying the .sqlite alone yields a near-empty database that still opens cleanly.

Development

conda env create -f environment.yml   # or: conda create -n outrage -c conda-forge python=3.14
conda activate outrage
pip install -e ".[dev]"
pytest
ruff check . && ruff format --check .

The stores live in a directory given to the server by --dir or RAGE_DIR, defaulting to ./.outrage/ in the working directory, each as a file inside it: --root-mount FILE names the one answering for everything (default store.sqlite) and --mount KEY=FILE mounts another under a key. A store file is always relative to the directory, so only --dir is a path. See design.md.

outrage-server --log records requests and store accesses as JSON lines, by default in log.jsonl beside the store. It is off otherwise, since it records document text. --log-content none|excerpt|full controls how much of that text it keeps.

.mcp.json registers the server for this project. Its command is an absolute path into the conda environment, so it is specific to the machine it was written on; adjust it after creating the environment elsewhere.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

outrage-0.1.2.tar.gz (303.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

outrage-0.1.2-py3-none-any.whl (179.3 kB view details)

Uploaded Python 3

File details

Details for the file outrage-0.1.2.tar.gz.

File metadata

  • Download URL: outrage-0.1.2.tar.gz
  • Upload date:
  • Size: 303.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for outrage-0.1.2.tar.gz
Algorithm Hash digest
SHA256 af402585f234e5aa919bed225b0111c1219aa4022735999c22bd57d7369e7171
MD5 c41d1cd1dde819585a4b0de1770f28ba
BLAKE2b-256 14621310cd3c72718302b75c45ec9c3c23d169a3be02bfcdd7ca81c5b9586395

See more details on using hashes here.

File details

Details for the file outrage-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: outrage-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 179.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.6

File hashes

Hashes for outrage-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 2a258b28605a543148a6488b9d76a38f737b4cd7d7fe98ebe2eb9aabc1c1f322
MD5 bfc4d37114762f6988f6e99c3dad620f
BLAKE2b-256 43d9c315853bef6792f4453e1faed8e58c59e62371a7de9f8f546856540df9b4

See more details on using hashes here.

Release history Release notifications | RSS feed

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

This release

0.1.2 This release

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page