Skip to main content
Glama
README.md
# Claudette

**An assistant that answers only from texts written by women — and says so when they did not write about it.**

Claudette is a corpus of thirty-six public-domain works by twenty-seven women
(1694–1922), a search index over them, and an MCP server that hands passages to
whatever model you already use. Every answer is built from those passages and
cites them so you can check. If the women in the corpus did not write about
something, Claudette tells you that, rather than filling the gap from elsewhere.

MIT licensed. The server holds no API key and makes no network call after its
first run. It runs on *your* Claude subscription, not the author's.

---

## Why

Most of what a large language model has read was written by men. That is not
a complaint about any individual author; it is a fact about who got published,
for most of the period the training data covers. And it has a flavour. The
management canon in particular — from Taylor's stopwatch onward — is a
literature of control: how to get more out of people who are treated as inputs.

There was always another literature. Mary Parker Follett was writing about
*power-with* rather than *power-over* in 1918, while scientific management was
at its height; her work was buried for fifty years and is now quietly cited by
everyone who writes about collaboration. Jane Addams ran an institution on the
principle that you cannot judge someone's conduct until you have understood
their situation. Elizabeth Gaskell wrote the industrial novel from inside a
strike and gave both sides faces. Ida Tarbell documented, from the primary
sources, what a very rich man does when nobody stops him.

Claudette does not claim that women are nicer. It makes a narrower, testable
claim: **if you constrain an assistant's evidence to what these women wrote,
and make it cite every line, you get a different and better conversation about
people, work and power** — and you can see exactly where each sentence came from.

## What it is not

It is not a language model trained only on women's writing. Nobody can build
that in an afternoon and anyone who says they have is selling something.
Claudette's *evidence* is constrained; the *prose* is generated by a general
model (Claude, by default). The guarantee is about provenance of what she
tells you, not about the training data of the model that phrases it. The
`corpus_provenance` tool says this too, in every session.

---

## Use it as a connector (recommended)

The server speaks MCP over stdio. Add it to Claude Code:

```bash
claude mcp add claudette -- uvx --from git+https://github.com/michaelcpattinson-star/claudette claudette-mcp
```

Or to Claude Desktop, in `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "claudette": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/michaelcpattinson-star/claudette", "claudette-mcp"]
    }
  }
}
```

On first run it downloads a prebuilt index (~37 MB) from the GitHub release
into `~/.claudette/`; if that is unavailable it fetches the 36 texts from
Project Gutenberg and builds the index itself (a few minutes, once). Then ask:

> *What would Follett say about a manager who thinks in terms of control?*

The model will call `search_corpus`, read the `status`, and answer with
citations like `[Mary Parker Follett, The New State §412]`. Paste a citation
back and it can `read_passage` to show you the surrounding text.

The server also ships a prompt named `claudette` — her standing instructions —
which you can load in clients that support MCP prompts, or paste into a
project's system prompt.

### Hosting it for others

```bash
claudette serve --http --host 0.0.0.0 --port 8000
```

serves streamable HTTP at `/mcp`, suitable for a remote connector. Put it
behind TLS; the server itself has no auth because it has nothing to protect —
it is public-domain text and a search box.

---

## Use it from the command line

```bash
uv sync --group chat            # anthropic SDK; needs credentials
uv run claudette ask "What does George Eliot say about unhistoric acts?"
uv run claudette chat            # multi-turn
```

`ask` and `chat` run the same loop the connector would, but with the
Anthropic SDK against your own credentials (`ant auth login` or
`ANTHROPIC_API_KEY`). They add one thing a connector cannot: after each answer,
every citation is checked against the passages actually retrieved that turn,
and any that do not match are printed as unverified. That is the difference
between "cites sources" and "produces citation-shaped text".

No model is needed for the corpus itself:

```bash
uv run claudette fetch           # download from Gutenberg → ~/.claudette/texts
uv run claudette verify --show 3 # check each header matches the manifest; eyeball the openings
uv run claudette index           # build ~/.claudette/claudette.db
uv run claudette search "power over" -k 3
uv run claudette read follett-new-state§412
uv run claudette works --shelf thought
```

---

## How the guarantee is enforced

There is no classifier deciding whether a text was written by a woman. There is
a list — [`corpus/manifest.toml`](corpus/manifest.toml) — and the index is
built from that list and nothing else. Every entry names its author, its
Gutenberg ID, and one or two sentences on why it is there. A reviewer can read
the whole thing in five minutes, which is the point.

Around the list:

- **Validation refuses an entry without an author.** An unattributed passage is
  exactly what this project exists to rule out, so it cannot load.
- **`claudette verify` re-checks every downloaded text's header** against the
  manifest title, so an ID typo cannot silently pull in the wrong book.
- **Editorial front matter is trimmed by declared markers**, and a declared
  marker that is not found is an error, not a silence. Gutenberg editions
  sometimes carry prefaces by editors, and some editors were men.
- **Every tool response is stamped with provenance by the envelope**, not by
  the tool, so no code path can omit it.
- **`no_coverage` is a status, not an empty list.** A model handed `[]`
  narrates it as "they had nothing to say". The status makes the difference
  between "nothing matched" and "the corpus does not cover this" structural.
  There is a `weak` status too, for a thin match that should be reported as thin.

The corpus is in `~/.claudette/` and is not committed: it is reproducible from
the manifest by anyone with `claudette fetch && claudette index`.

## The corpus

Twenty-seven authors, two shelves. Full list with reasons in the
[manifest](corpus/manifest.toml); `list_works` returns it at runtime.

**Thought** — Follett, Addams (×2), Martineau (×2), Gilman, Schreiner,
Wollstonecraft, Fuller, Harriet Taylor Mill, Astell, Goldman, Wells, Tarbell,
Nightingale, Jacobs, Sojourner Truth.

**Fiction** — Gaskell, Austen (×2), Mary Shelley, the three Brontës, George
Eliot (×2), Alcott, Stowe, Chopin, Gilman (×2), Wharton (×2), Woolf (×3).

### Known limits, stated rather than hidden

- Public domain means the corpus ends in 1922. It is heavily English-language
  and Anglo-American, and it is the canon that survived, which is its own bias.
- Retrieval is BM25 over passages (SQLite FTS5, Porter stemming). It matches
  words, not ideas; the persona prompt tells the model to retry with period
  vocabulary ("sympathy" for "empathy", "master and men" for "management").
  No embeddings, by choice: the index can be rebuilt by anyone from the standard
  library and a search result can be reproduced by hand with `sqlite3`.
- Front-matter trimming is per-work and manual. `claudette verify --show 5`
  exists so a reviewer can look.
- The evals in `evals/` exist and are wired, and have **not yet been run**.
  `evals/results/README.md` says so. Numbers appear when someone runs them.

---

## Adding a work

1. Find it on Project Gutenberg. Confirm the author.
2. Add a `[[work]]` entry to the manifest: `id`, `slug`, `author`, `title`,
   `year`, `shelf`, `why`. Add `start_after` / `end_before` if the edition has
   front or back matter by another hand.
3. `claudette fetch && claudette verify --show 5 && claudette index`.
4. `pytest`. The manifest tests will tell you if the entry is malformed.
5. Open a pull request. The `why` line is the review.

## Layout

```
src/claudette/
  data/manifest.toml   the list. Symlinked at corpus/manifest.toml for reviewers.
  manifest.py          loads and validates it
  fetch.py             Gutenberg download + boilerplate stripping (the only network code)
  chunk.py             paragraphs → citeable passages
  index.py             SQLite FTS5 build and query; the refusal rule
  envelope.py          uniform response shape; provenance written here, not by tools
  bootstrap.py         first-run: prebuilt index or local build
  server.py            the MCP server. Four tools, one prompt. No key.
  persona.py           Claudette's standing instructions
  chat.py              CLI chat client — the only module that calls a model
  cli.py               `claudette` command
tests/                 offline; builds a fixture corpus the same way as the real one
evals/                 questions, runner, mechanical scorer
```

## Licence

MIT for the code. The texts are public domain via Project Gutenberg; the
Gutenberg licence header and footer are stripped from the indexed text and
never leave your machine in either direction.

TDQS

A4.4/5.0

Scored across 4 tools

Disambiguation5/5

Each tool serves a clearly distinct function: searching, reading a specific passage, listing works, and providing provenance. No overlap or ambiguity in purpose.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (search_corpus, read_passage, list_works, corpus_provenance), making the naming predictable and intuitive.

Tool Count5/5

Four tools is well-scoped for a corpus retrieval server; each tool covers a core capability without redundancy or bloat.

Completeness5/5

The surface covers the full lifecycle of corpus interaction: discovery (list_works), retrieval (search_corpus, read_passage), and context (corpus_provenance). No obvious gaps for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues