mcpField
C
cite-gate

cite-gate

Remote
github.com/cite-gateAI & Agents0Updated 3w ago
Repository

About cite-gate

cite-gate is a checker for AI-assisted scripts that verifies quotes against source text and flags unsupported numbers and copied wording. It is for writers and agents that need a repeatable citation check; it does not judge whether a claim or source is true.

Key features

  1. 01Match quotes to source text
  2. 02Check numbers against cited quotes
  3. 03Flag possible unsourced names and quantities
  4. 04Detect wording copied from sources
  5. 05Run checks from CLI or GitHub Actions
  6. 06Use configurable quote and era rules

Use cases

  1. 01Review citations in an AI-written script
  2. 02Catch unsupported figures before publishing
  3. 03Check whether a draft copies source wording
  4. 04Run citation checks on each repository change

MCP support

The local stdio MCP server provides citation and number checks for agents. A hosted Streamable HTTP endpoint offers the same two tools.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://mcp.mlpc.co.kr/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

2
ParameterTypeRequiredDescription
claimsobjectYes{"config": {...}, "sections": [{"title": str, "items": [{"id": str, "text": str, "claims": [{"src": str, "quote": str}]}]}]}
sourcesobjectYesMap of source id -> full source text.

Details

From the project README

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

CheckResult
Each quote exists in its source file (curly quotes, dashes and spacing normalised)failure
Each quote is at least 20 charactersfailure
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 quoteswarning
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 prosewarning / 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.

{
 "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
KeyDefaultMeaning
allow[]names accepted without a quote (the subject of the script, for example)
copy_run11shared-word run that counts as copying
min_quote_chars20shortest accepted quote
fold_accentsfalsecompare Tokaido in prose with Tōkaidō in the source
eranull{"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:

- 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 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.

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

Tools:

ToolInputOutput
check_citationsclaims (the format above) and sources ({id: full text})failures, warnings, passed
check_numberstext and quotesnumbers 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. For zero logging, use the local server above.

Would a hosted version or a review service be useful to you? Tell us in 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).

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.