A local, free, self-fact-checking multi-agent research assistant (Ollama + MCP + RAG).
Project description
๐ง Skeptic โ a self-fact-checking research agent
Most AI researchers confidently make things up. Skeptic doesn't โ because a dedicated agent's only job is to disprove the others. Every claim ships with a citation and a confidence tag, or it gets flagged and sent back for better sources.
100% local and free. Runs entirely on your machine โ no API keys, no per-token cost, works offline once the models are pulled.
Built with LangGraph ยท Ollama (local Llama 3.2 / Qwen 2.5) ยท MCP (DuckDuckGo search) ยท local RAG ยท Typer + Rich CLI.
How it works
START
โ
โผ
โโโโโโโโโโโ
โ Planner โ splits the question into focused sub-questions
โโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ (parallel) MCP web search + your local docs โโบ RAG re-ranking
โ Researchers โ each sub-question โ claims + real source URLs
โโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโ scores every claim: verified / weak / unverifiable
โ Skeptic โโโโ
โโโโโโโโโโโ โ too many weak claims + retries left?
โ โโโโโโโโโโโโโโโโบ back to Researchers
โผ (good enough)
โโโโโโโโโโโโโโ
โ Human gate โ you approve / reject / revise before it finalizes
โโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโ
โ Synthesizer โ writes the report, tags each claim โ
/ โ ๏ธ / โ
โโโโโโโโโโโโโโโ
โ
โผ
END
The loop back to the researchers is the whole idea: weak evidence doesn't get published, it gets re-investigated. Search is an MCP tool, and each set of hits is RAG-ranked locally so the model reads the passages that matter.
Model routing (all local via Ollama)
| Role | Default model | Why |
|---|---|---|
| Researchers (high volume) | llama3.2:3b |
small + fast for bulk work |
| Planner / Skeptic / Synthesizer | qwen2.5:7b |
need real judgment |
| RAG embeddings | nomic-embed-text |
rank web passages by relevance |
Every model is overridable via env var (see .env.example) โ bump to a bigger
model for better answers, or drop to a smaller one for less RAM.
Quickstart
First install Ollama and start it:
ollama serve # leave running in another terminal
Then install Skeptic as a global command (needs Python 3.10+):
pipx install . # or: pip install .
Bootstrap the local models (one-time download), then ask away โ from any folder:
skeptic setup # pulls the models
skeptic ask "How does caffeine affect sleep quality?"
No keys, ever. The run prints a live agent-by-agent trace, pauses at a human gate
for your approval, and saves the final report to ./reports/<timestamp>.md.
Handy commands:
skeptic doctor # check Ollama + models are ready
skeptic models # show which models each role uses
skeptic docs # list the local documents indexed for retrieval
Prefer not to install? From this folder you can also run
python cli.py ask "your question"inside the venv.
Fact-check against your own documents
Skeptic can ground answers in your own files โ notes, papers, reports โ
right alongside the web. Drop .pdf, .txt, or .md files into ~/.skeptic/docs
(or any folder) and they're chunked, embedded locally, and retrieved per
sub-question just like web hits. Still 100% local; nothing leaves your machine.
mkdir -p ~/.skeptic/docs
cp ~/Downloads/*.pdf ~/.skeptic/docs/
skeptic docs # see what's indexed
skeptic docs --reindex # embed them now (otherwise done on next ask)
skeptic ask "what does my research say about X?"
# or point one run at a specific folder:
skeptic ask --docs ./my-papers "summarize the key findings"
Citations to local files appear as file://โฆ URLs. Embeddings are cached, so
re-runs are fast and only re-embed when the files change. Override the default
folder anytime with SKEPTIC_DOCS_DIR.
Project layout
skeptic/
โโโ state.py # the shared graph state
โโโ models.py # typed contracts every agent speaks in
โโโ config.py # model routing + Ollama LLM factory
โโโ prompts.py # all prompts in one place
โโโ tools.py # web search as an MCP client (async)
โโโ mcp_server.py # the DuckDuckGo MCP search server
โโโ rag.py # local embed + cosine re-ranking of web results
โโโ docs.py # local-document RAG (PDF/txt/md) + on-disk cache
โโโ memory.py # SQLite checkpointer (durable/resumable runs)
โโโ graph.py # wires the agents + the retry loop + human gate
โโโ cli.py # the Typer + Rich `skeptic` command
โโโ agents/
โโโ planner.py
โโโ researcher.py
โโโ skeptic.py # the unique hook
โโโ human_gate.py # pause for human approval
โโโ synthesizer.py
cli.py # backward-compat shim (python cli.py โฆ)
pyproject.toml # packaging โ the global `skeptic` command
Roadmap
- Phase 1 โ Planner โ Researchers โ Synthesizer
- Phase 2 โ Skeptic + the falsify/retry loop
- Phase 3 โ human approval gate + cross-run memory
- Phase 4 โ MCP-native search (DuckDuckGo), local RAG, Ollama, global CLI
- Phase 5 โ RAG over your own PDF/txt/md docs ยท publish-ready packaging
See HANDOFF.md for exact status, and PUBLISHING.md for how to ship it to PyPI.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skeptic_agent-0.5.1.tar.gz.
File metadata
- Download URL: skeptic_agent-0.5.1.tar.gz
- Upload date:
- Size: 23.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9469ec749edf3c64ed9e93cb0439e4559c46b4feac324062325d1ad358ee3790
|
|
| MD5 |
4da2b70fa62b1c6ef117a22c16875011
|
|
| BLAKE2b-256 |
c80c44d5c7cac318968e2f66df94f26e7afd216265af2cb0a72979c7c98addb3
|
File details
Details for the file skeptic_agent-0.5.1-py3-none-any.whl.
File metadata
- Download URL: skeptic_agent-0.5.1-py3-none-any.whl
- Upload date:
- Size: 27.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cd26a5a52bdbe4f4fb60c29a3850fe2ba9e9750df21d67ab7985477145080b3
|
|
| MD5 |
94623236a62625bbe5d66b688fe6a3b4
|
|
| BLAKE2b-256 |
b03223e348161ed7c42bf75f0c5d0d4799e58b8863e8c3fd9f624858b1d08c99
|