Metadata-Version: 2.4
Name: aura-mnemos
Version: 0.1.0
Summary: A persistent-memory MCP server for AI agents, with an honest health endpoint that survives its store dying.
Author: Reality Optimizer
License-Expression: Apache-2.0
License-File: LICENSE
Requires-Python: >=3.10
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == 'dev'
Provides-Extra: health
Requires-Dist: fastapi>=0.110; extra == 'health'
Requires-Dist: pydantic>=2; extra == 'health'
Requires-Dist: uvicorn>=0.29; extra == 'health'
Description-Content-Type: text/markdown

# aura-mnemos

**A persistent-memory MCP server for AI agents, with an honest health endpoint that survives its store dying.**

> Install name is `aura-mnemos` (`import aura_mnemos`); the plain name `mnemos` was already taken on PyPI by an unrelated project.

---

## Why

Every agent session starts blank. The conversation history is there, but the *knowing* — the things you learned last week, the patterns you noticed, the decisions you made — evaporates when the context window closes. mnemos is the shelf you put those things on. A small, durable, honest shelf.

And honest means honest. When the shelf breaks — the database file is missing, the disk is full, the permissions are wrong — mnemos tells you. It does not crash silently. It does not return empty results that look like "nothing found." It says "I am broken" in a way your agent can hear and act on. This is the disaster test: the server must survive its store dying, and the health endpoint must tell the truth about it.

---

## Install

```bash
pip install aura-mnemos             # MCP server only — stdlib, zero dependencies
pip install "aura-mnemos[health]"   # + FastAPI health sidecar
```

Requires Python ≥ 3.10.

---

## Use as an MCP server

Configure your MCP client to launch `aura-mnemos`:

```json
{
  "mcpServers": {
    "mnemos": {
      "command": "aura-mnemos",
      "args": []
    }
  }
}
```

The store lives at `~/.mnemos/mnemos.db` by default. Override with the `MNEMOS_DB` environment variable.

### Tools

**`remember`** — store a memory with optional tags and source.

```json
{
  "content": "The AURA mesh runs on trust and honest health endpoints.",
  "tags": "philosophy",
  "source": "6E"
}
```

Returns `{"id": 1, "created_at": "2026-07-19T12:00:00+00:00"}`.

**`recall`** — search memories by content substring.

```json
{
  "query": "mesh",
  "limit": 10
}
```

Returns `{"count": 1, "results": [{"id": 1, "content": "...", "tags": "...", "source": "...", "created_at": "..."}]}`.

**`list_recent`** — list the most recent memories.

```json
{
  "limit": 5
}
```

Same result shape as `recall`.

Every tool returns `{"error": "..."}` when the store is unreachable — the server never crashes, never lies.

---

## Honest health

Start the health sidecar:

```bash
aura-mnemos-health
# listens on 127.0.0.1:8080 by default; set PORT to change it
```

When the store is alive:

```bash
curl http://127.0.0.1:8080/health
```

```json
{
  "status": "ok",
  "timestamp": "2026-07-19T16:16:22.486547+00:00",
  "version": "0.1.0",
  "checks": [
    { "name": "sqlite", "status": "ok", "latency_ms": 0.27, "detail": "/home/you/.mnemos/mnemos.db" },
    { "name": "memories_table", "status": "ok", "latency_ms": 0.17, "detail": "/home/you/.mnemos/mnemos.db" }
  ]
}
```

When the store is missing:

```bash
MNEMOS_DB=/nonexistent/db.sqlite aura-mnemos-health &
curl http://127.0.0.1:8080/health
```

```json
{
  "status": "down",
  "timestamp": "2026-07-19T16:16:22.868237+00:00",
  "version": "0.1.0",
  "checks": [
    { "name": "sqlite", "status": "down", "latency_ms": null, "detail": "database not found: /nonexistent/db.sqlite" },
    { "name": "memories_table", "status": "down", "latency_ms": null, "detail": "database not found: /nonexistent/db.sqlite" }
  ]
}
```

The overall `status` is the worst of the individual checks (`ok` < `degraded` < `down`).

The disaster must actually happen. mnemos does not lie about its store. The test suite proves it: `test_health_down_when_db_missing` sets `MNEMOS_DB` to a path that does not exist and asserts the status is not `"ok"`. If that test ever passes when the store is alive, the test is lying — and the test is designed to fail when it lies.

---

## Roadmap (not shipped here)

These are directions the project may grow, but none of them exist yet:

- **Graph layer** — link memories by topic, entity, or relationship (beyond substring search)
- **Native apps** — desktop/mobile clients that read and write the same store
- **Framework adapters** — LangChain, CrewAI, Microsoft Semantic Kernel integrations
- **Mesh bridge** — sync stores across the AURA mesh (Ubuntu ↔ macOS)

If you want one of these, the store schema is stable and documented. The SQLite file is yours.

---

## Attribution / provenance

> Part of the AURA Pattern Library — © Reality Optimizer. Built by a human-led mesh of small models and Claude. Apache-2.0.

---

*The shelf is small. What you put on it is yours.*
