From fact-checker
Systematically verify factual claims in documents using multi-LLM triage and source-grounded verification via MCP servers and web search. Use when user says "fact-check", "fact check", "verify accuracy", "check this document", "accuracy review".
How this skill is triggered — by the user, by Claude, or both
Slash command
/fact-checker:fact-checkThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
**If the user asks to see the banner, NFO, or splash screen, display the following:**
If the user asks to see the banner, NFO, or splash screen, display the following:
▄▄ ▄▄
▄▄▄▄▄▄▄▄██▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄██▄▄▄▄▄▄▄▄
▐░░░▒▒▒▓▓ ▓▓▒▒▒░░░▌
▐░ ████ ████ ████ █████ ░▌
▐░ █ █ █ █ █ ░▌
▐░ ███ ████ █ █ ░▌
▐░ █ █ █ █ █ ░▌
▐░ █ █ █ ████ █ ░▌
▐░ ░▌
▐░ ████ █ █ ████ ████ █ █ ████ ████ ░▌
▐░ █ █ █ █ █ █ █ █ █ █ ░▌
▐░ █ ████ ███ █ ██ ███ ████ ░▌
▐░ █ █ █ █ █ █ █ █ █ █ ░▌
▐░ ████ █ █ ████ ████ █ █ ████ █ █ ░▌
▐░░░▒▒▒▓▓ ▓▓▒▒▒░░░▌
▀▀▀▀▀▀▀▀██▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀██▀▀▀▀▀▀▀▀
▀▀ ▀▀
╔══════════════════════════════════════════════════╗
║ RELEASE INFORMATION ║
╠══════════════════════════════════════════════════╣
║ ║
║ Skill.......: fact-checker ║
║ Author......: machug (hughtec.com) ║
║ Version.....: 1.3.2 ║
║ Released....: 2026 ║
║ License.....: MIT ║
║ Requires....: Python 3.10+, litellm ║
║ ║
╠══════════════════════════════════════════════════╣
║ PIPELINE OVERVIEW ║
╠══════════════════════════════════════════════════╣
║ ║
║ extract ──> triage ──> verify ──> report ──> fix║
║ ║
║ Multi-LLM triage with source-grounded ║
║ verification. MCP-first, web search fallback. ║
║ Claims in. Verdicts out. Trust nothing. ║
║ ║
╚══════════════════════════════════════════════════╝
Verify factual claims in research, governance, and reference documents using a hybrid approach:
All scripts are in the skill's scripts/ directory (relative to the plugin root):
skills/fact-check/scripts/
├── verify.py # Main orchestrator + CLI
├── models.py # LiteLLM calls, parallel execution, cost tracking
├── prompts.py # Claim extraction + verification prompt templates
├── providers.py # Provider config + cost tracking tables
└── sources.py # MCP detection + source resolution + registry
Requires: pip install litellm (or pip3 install litellm / python3 -m pip install litellm if pip is not found)
Follow these steps in order. Each step has a user checkpoint — do NOT skip ahead without confirmation.
Before starting, check what LLM providers are available:
cd ${CLAUDE_PLUGIN_ROOT}/skills/fact-check/scripts && python3 verify.py providers
If no external providers are found (no API keys set, no CLI tools installed), warn the user:
Warning: No external LLM providers detected. Multi-LLM triage works best with 2-3 independent models to cross-check claims. Without external models, I'll use my own knowledge for triage — this still works but you lose the independent verification that catches blind spots.
Recommended setup (pick one):
- Set
OPENROUTER_API_KEYfor access to multiple providers with a single key (openrouter.ai)- Or set API keys for 2+ providers (e.g.
OPENAI_API_KEY,GEMINI_API_KEY)- Or set
AZURE_AI_API_KEY+AZURE_AI_API_BASEfor Azure AI Foundry models (usefoundry/<deployment-name>prefix)- Or install Codex CLI (
npm install -g @openai/codex) or Gemini CLI (npm install -g @google/gemini-cli)
Then ask: "Continue anyway with single-model triage, or set up providers first?" Proceed if the user says to continue.
IMPORTANT — no simulated triage: If no external LLMs are available, do NOT launch subagents that role-play or simulate different LLM perspectives. That is not real independent verification — it's just you (Claude) with extra steps. Instead, skip the multi-model triage entirely and flag ALL claims for deep source-grounded verification in Step 5. Be transparent with the user that triage was skipped because no external models were available.
cd ${CLAUDE_PLUGIN_ROOT}/skills/fact-check/scripts && python3 -c "
from sources import detect_document_domains, find_relevant_mcps, load_registry
content = open('<FILE_PATH>').read()
domains = detect_document_domains(content)
print('Detected domains:', domains)
"
prompts.py, extract all verifiable factual claimsClaim categories: pricing, capability, date, licensing, compliance, architecture, status, number
What to extract:
What NOT to extract:
| # | Category | Claim | Section |
|---|----------|-------|---------|
Check available LLM providers:
cd ${CLAUDE_PLUGIN_ROOT}/skills/fact-check/scripts && python3 verify.py providers
Select 2-3 models from different providers. Pick from whatever is available — run python3 verify.py providers to see current models. Aim for diversity across providers, e.g.:
If user has a saved profile, use that instead:
python3 verify.py profiles list
Run triage — send ALL claims to selected models in parallel:
cd ${CLAUDE_PLUGIN_ROOT}/skills/fact-check/scripts && python3 verify.py triage claims.json --models <model1>,<model2>,<model3> --document <FILE_PATH>
If the CLI triage is not practical (e.g., claims aren't in a file yet), you can orchestrate triage directly:
prompts.py and the claim listTriage aggregation rules:
Present triage results to user (User Checkpoint 2):
Model-verified (all CONFIDENT): X claims
Flagged for deep verification: Y claims
Flagged claims:
| # | Category | Claim | Flagged by | Reason |
Ask: "Proceed with deep verification of these Y claims?"
For each flagged claim, perform source-grounded verification:
Build source plan — match each claim to the best available source:
microsoft_docs_search / microsoft_docs_fetch MCP toolscontext7 MCP toolsdeepwiki MCP tools (if connected)Execute verification in parallel using the Agent tool:
prompts.py (VERIFY_SYSTEM + VERIFY_USER)For each claim, capture:
Verdict definitions:
prompts.py{source_dir}/{source_name}-fact-check-{YYYY-MM-DD}.mdReport structure:
# Navigate to scripts directory first
cd ${CLAUDE_PLUGIN_ROOT}/skills/fact-check/scripts
# Full pipeline analysis
python3 verify.py check <file>
# Extract claims only
python3 verify.py extract <file>
# Triage extracted claims
python3 verify.py triage claims.json --models <model1>,<model2> --document <file>
# List available LLM providers
python3 verify.py providers
# List MCP source registry
python3 verify.py sources
# Manage profiles
python3 verify.py profiles list
python3 verify.py profiles save --name gov-check --models <model1>,<model2>
# Manage MCP registry
python3 verify.py registry list
python3 verify.py registry add --name my-mcp --domains "cloud,infrastructure" --description "My custom MCP"
When executing this skill, you (Claude) are the orchestrator. The Python scripts handle:
But YOU handle:
The scripts are helpers, not the whole pipeline. You drive the workflow.
The skill ships with a default registry of known MCPs. Users can extend it:
| MCP | Domains | Description |
|---|---|---|
| microsoft_docs_mcp | Microsoft, Azure, M365, Entra, etc. | Official Microsoft Learn docs |
| context7 | Libraries, frameworks, SDKs | Up-to-date library documentation |
| deepwiki | GitHub, open-source repos | Repository docs and wikis |
| At runtime: |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub machug/marketplace --plugin fact-checker