skills/fact-check/SKILL.md
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".
npx skillsauth add machug/fact-checker fact-checkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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:
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.