Metadata-Version: 2.4
Name: ietf-llm
Version: 0.17.1
Summary: Maintain a local, LLM-queryable corpus of an IETF Working Group's public record (drafts, mailing list, GitHub issues, meetings), with an MCP server, semantic search, and NotebookLM export.
Author-email: Mark Nottingham <mnot@mnot.net>
License-Expression: MIT
Project-URL: Homepage, https://github.com/mnot/ietf-llm
Project-URL: Documentation, https://github.com/mnot/ietf-llm/blob/main/docs/README.md
Project-URL: Source, https://github.com/mnot/ietf-llm
Project-URL: Issues, https://github.com/mnot/ietf-llm/issues
Classifier: Operating System :: OS Independent
Classifier: Development Status :: 4 - Beta
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE.md
Requires-Dist: requests
Requires-Dist: beautifulsoup4
Requires-Dist: pypdf
Requires-Dist: dulwich>=0.21.7
Requires-Dist: llm
Requires-Dist: numpy
Requires-Dist: mcp
Requires-Dist: argcomplete
Provides-Extra: local-embeddings
Requires-Dist: llm-sentence-transformers; extra == "local-embeddings"
Provides-Extra: notebooklm
Requires-Dist: google-auth; extra == "notebooklm"
Requires-Dist: google-auth-oauthlib; extra == "notebooklm"
Requires-Dist: google-auth-httplib2; extra == "notebooklm"
Provides-Extra: s3
Requires-Dist: boto3; extra == "s3"
Provides-Extra: certs
Requires-Dist: pip-system-certs; extra == "certs"
Provides-Extra: dev
Requires-Dist: mypy; extra == "dev"
Requires-Dist: black; extra == "dev"
Requires-Dist: pylint; extra == "dev"
Requires-Dist: pytest; extra == "dev"
Requires-Dist: pytest-md; extra == "dev"
Requires-Dist: validate-pyproject; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: types-requests; extra == "dev"
Requires-Dist: types-beautifulsoup4; extra == "dev"
Requires-Dist: google-auth; extra == "dev"
Requires-Dist: google-auth-oauthlib; extra == "dev"
Requires-Dist: google-auth-httplib2; extra == "dev"
Requires-Dist: boto3; extra == "dev"
Requires-Dist: moto; extra == "dev"
Dynamic: license-file

# ietf-llm

Maintain a local, queryable corpus of an [IETF](https://www.ietf.org/) effort's public record — a
Working Group, an [IRTF](https://irtf.org/) Research Group, a mailing list, or a set of drafts. It
pulls together charter, drafts, RFCs, meeting agendas, minutes, slides, transcripts, attendance,
mailing list archives, and GitHub issues for use with LLM-based tools.

## What it's for

A working group's history is spread across mailing list archives, Datatracker, GitHub, and meeting
materials — too much to hold in your head, and too scattered to search well by hand. With the record
gathered into one queryable corpus, an LLM can help you:

- **Get up to date with the state of discussions** — what's open, what was recently decided, where a
  debate currently stands.
- **Summarise the arguments already made** about an issue — every distinct position on a topic, who
  holds it, and how the chairs ruled.
- **Formulate a new proposal** — surface the objections raised against similar ideas before, so you
  can anticipate them.
- **Fact-check assertions** about what's happened so far — grounded in the actual list traffic and
  chair statements, not someone's recollection.

> **Tip:** for an IRTF Research Group, pass its shortname (e.g. `cfrg`, `hrpc`, `pearg`) wherever
> the docs use `<name>` — it works the same as a WG.


## Modes of operation

There are three supported workflows:

1. **Use it as an MCP server** — register it with Claude, Codex, Cursor, Gemini, Zed,
   etc. and ask questions across any corpus you've gathered. Two ways to run it:
   - **[Local MCP](https://github.com/mnot/ietf-llm/blob/main/docs/mcp-local.md)** — one server
     subprocess per client, on your own machine. <-- **Best starting point**
   - **[As a shared HTTP MCP
     server](https://github.com/mnot/ietf-llm/blob/main/docs/mcp-server.md)** — one process serving
     many concurrent clients (hosted).
3. **[Use it from the CLI](https://github.com/mnot/ietf-llm/blob/main/docs/search-cli.md)** — run
   semantic search over the cache directly with `ietf-llm-search`, no LLM client required.

See the workflow documentation linked above for installation and use instructions, or the
[full documentation listing](https://github.com/mnot/ietf-llm/blob/main/docs/README.md).

All three read a corpus you first **gather** with `ietf-llm <corpus>`.

> **Heads up — gathering reaches the network by default.** To make a first gather fast, `ietf-llm`
> pulls a prebuilt snapshot of covered corpora from the public
> [seed store](https://github.com/mnot/ietf-llm/blob/main/docs/seed-store.md) at
> `seed-store.mnot.net` (and `list_corpora` looks its catalog up there), then freshens only the
> delta — skipping most of the embedding and download cost. **To turn this off:** `ietf-llm <corpus>
> --no-seed` (it *persists* across gathers; re-enable with `--seed`), or set `IETF_LLM_SEED_ENABLED=off`
> (or `IETF_LLM_SEED_URL=off`) in your environment. With seeding off, gathers run fully cold and
> offline. It is best-effort either way — an unreachable or unlisted corpus just gathers from scratch.

