Skip to main content
ClaudeWave

Check that every fact in an AI-assisted script is backed by a verbatim source quote, and that the prose retells rather than copies.

ToolsOfficial Registry0 stars0 forks● PythonAGPL-3.0Updated today
ClaudeWave Trust Score
87/100
✓ Trusted
Passed
  • ✓Open-source license (AGPL-3.0)
  • ✓Actively maintained (<30d)
  • ✓Clear description
  • ✓Documented (README)
Last scanned: 10/10/2026
Get started
Method: Clone
Terminal
git clone https://github.com/cite-gate/cite-gate
1. Clone the repository.
2. Follow the README for installation and usage instructions.
Use cases

Tools overview

# cite-gate

A small checker for scripts written with AI help. It makes every factual item in a script carry
a quote that appears **word for word** in a source file, and it flags prose that copies the
source instead of retelling it.

It doesn't decide whether a claim is true. It decides whether you can point at the sentence
your claim came from, and whether that sentence actually exists.

```
$ python -m cite_gate check examples/gettysburg/claims.json
5 items · 91 words · 2 failures · 1 warnings
  FAIL [number-not-in-quote] number(s) ['1776', '87'] not in the quotes
  FAIL [quote-not-in-source] quote not found in 'gettysburg': 'this nation shall endure forever and ever'
  warn [copied-not-retold] 26 consecutive words shared with the quotes; retell, don't copy
```

The example fails on purpose: its last three items are mistakes that a language model makes
all the time (a number it worked out itself, a quote it half remembered, a paragraph lifted
from the source).

## Why

Language models write fluent prose with confident details. The details that go wrong are
the small ones: a year that's off by one, a name added "for context", a quote paraphrased into
something the source never said. Reading the whole script against the sources by hand doesn't
scale. This tool turns that reading into a gate you can run on every change.

## What it checks

| Check | Result |
|---|---|
| Each quote exists in its source file (curly quotes, dashes and spacing normalised) | failure |
| Each quote is at least 20 characters | failure |
| Every number in the prose appears in that item's quotes (`1,000` = `1000`) | failure |
| Source ids are plain names (no paths) | failure |
| "hundred / thousand / million" in the prose but not in the quotes | warning |
| A capitalised word mid-sentence that isn't in the quotes (possible unsourced name) | warning |
| 11 or more consecutive words shared with the quotes (copying, not retelling) | warning |
| Optional era rule: the prose names an era but the quotes don't tie the item to it; month names or "X era" phrases not in the quotes; special letters in the prose | warning / failure |

Exit code is 1 when there are failures. `--strict` also fails on warnings.

## Input format

A claims file (JSON) and a folder of plain-text sources, one file per source id.

```json
{
 "config": {"allow": ["Lincoln"], "copy_run": 11},
 "sections": [
  {"title": "The occasion",
   "items": [
    {"id": "opening",
     "text": "He began by looking back four score and seven years ...",
     "claims": [{"src": "gettysburg",
                 "quote": "Four score and seven years ago our fathers brought forth on this continent, a new nation"}]}
   ]}
 ]
}
```

`sources/gettysburg.txt` holds the source text. Keep your own copy of each source (with its
URL and revision noted at the top), so a later run checks against the same text.

### Config

| Key | Default | Meaning |
|---|---|---|
| `allow` | `[]` | names accepted without a quote (the subject of the script, for example) |
| `copy_run` | `11` | shared-word run that counts as copying |
| `min_quote_chars` | `20` | shortest accepted quote |
| `fold_accents` | `false` | compare `Tokaido` in prose with `Tōkaidō` in the source |
| `era` | `null` | `{"name": "Victorian", "tie": "\\b18[3-9]\\d\\b", "months": true, "letters": ""}` |

## Use

Command line (Python 3.10+, no dependencies):

```
pip install .            # from a checkout; adds the `cite-gate` command
cite-gate check path/to/claims.json [--sources DIR] [--json] [--strict]

# or without installing
python -m cite_gate check path/to/claims.json
```

GitHub Actions:

```yaml
- uses: actions/checkout@v4
- uses: cite-gate/cite-gate@v0
  with:
    claims: script/claims.json
    strict: "false"
```

### Use from your agent (MCP)

cite-gate ships a small [Model Context Protocol](https://modelcontextprotocol.io) server, so an
agent can check its own draft before it shows it to you. It runs locally over stdio, has no
dependencies, makes no network calls and collects no telemetry.

```json
{
  "mcpServers": {
    "cite-gate": { "command": "python", "args": ["-m", "cite_gate.mcp_server"],
                   "cwd": "/path/to/cite-gate" }
  }
}
```

Tools:

| Tool | Input | Output |
|---|---|---|
| `check_citations` | `claims` (the format above) and `sources` (`{id: full text}`) | failures, warnings, `passed` |
| `check_numbers` | `text` and `quotes` | numbers in the text that no quote contains |

There's also a hosted endpoint at `https://mcp.mlpc.co.kr/mcp` (MCP Streamable HTTP, same two
tools, up to 3,000 characters of prose per call). It doesn't store your text; what it does log is
listed in [`worker/README.md`](worker/README.md). For zero logging, use the local server above.

Would a hosted version or a review service be useful to you? Tell us in
[Discussions](https://github.com/cite-gate/cite-gate/discussions).

## Limits

* The heuristics are tuned for English prose.
* A quote that exists is not a claim that is correct. Sources can be wrong, and an item can
  cite a real sentence that says something else. The gate makes the review smaller; it
  doesn't replace it.
* Proper-noun and quantity checks are warnings because they have false positives. Fix them or
  add the name to `allow`; don't learn to ignore them.

## Example text

`examples/gettysburg/sources/gettysburg.txt` is the Gettysburg Address (1863), in the public
domain, transcribed here from the Bliss copy. Small wording differences between Lincoln's
manuscript copies exist; the checker compares against this file only.

## License

AGPL-3.0-or-later. Copyright (C) 2026 MLPC Inc. (see `LICENSE`).

What people ask about cite-gate

What is cite-gate/cite-gate?

+

cite-gate/cite-gate is tools for the Claude AI ecosystem. Check that every fact in an AI-assisted script is backed by a verbatim source quote, and that the prose retells rather than copies. It has 0 GitHub stars and its last recorded update is dated 2026-10-09.

How do I install cite-gate?

+

You can install cite-gate by cloning the repository (https://github.com/cite-gate/cite-gate) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.

Is cite-gate/cite-gate safe to use?

+

Our security agent has analyzed cite-gate/cite-gate and assigned a Trust Score of 87/100 (tier: Trusted). See the full breakdown of passed checks and flags on this page.

Who maintains cite-gate/cite-gate?

+

cite-gate/cite-gate is maintained by cite-gate. The last recorded GitHub activity is dated 2026-10-09, with 0 open issues.

Are there alternatives to cite-gate?

+

Yes. On ClaudeWave you can browse similar tools at /categories/tools, sorted by popularity or recent activity.

Deploy cite-gate to your cloud

Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.

Maintain this repo? Add a badge to your README

Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.

Featured on ClaudeWave: cite-gate/cite-gate
[![Featured on ClaudeWave](https://claudewave.com/api/badge/cite-gate-cite-gate)](https://claudewave.com/repo/cite-gate-cite-gate)
<a href="https://claudewave.com/repo/cite-gate-cite-gate"><img src="https://claudewave.com/api/badge/cite-gate-cite-gate" alt="Featured on ClaudeWave: cite-gate/cite-gate" width="320" height="64" /></a>

More Tools

cite-gate alternatives