Skip to main content
Glama
Orolol

FactCheck MCP Toolkit

by Orolol
README.md
# FactCheck MCP Toolkit

Serveur MCP pour la verification automatisee de declarations politiques chiffrees, connecte aux APIs statistiques institutionnelles.

Le LLM compatible MCP (ex: Claude Desktop) utilise les outils exposes par ce serveur pour verifier des affirmations factuelles contre les donnees officielles de l'INSEE, Eurostat, la Banque mondiale et l'OCDE.

## Fonctionnalites

- **Resolution d'indicateurs** — Traduit les termes courants du debat politique ("chomage", "dette publique", "inflation") vers les codes d'indicateurs officiels via une ontologie de 30 entrees avec regles de desambiguisation
- **Donnees INSEE** — Recherche, metadonnees et series temporelles depuis le BDM (Banque de donnees macroeconomiques) via pynsee
- **Comparaisons internationales** — Donnees Eurostat (UE27), Banque mondiale (217 pays) et OCDE, avec classements par pays
- **Fact-checks existants** — Recherche dans les bases Google Fact Check Tools et scoring de check-worthiness via ClaimBuster
- **Detection de cherry-picking** — Analyse de robustesse temporelle par perturbation des bornes de dates, avec score de robustesse 0-1
- **Comparaison de valeurs** — Ecart absolu/relatif entre valeur declaree et valeur reelle, avec qualification indicative (negligeable/significatif/majeur)
- **Cache persistant** — diskcache avec TTL par source (24h INSEE, 12h Eurostat, 7j Banque mondiale, 1h Google FC)

## Outils MCP exposes (18)

| Module | Outils | Description |
|--------|--------|-------------|
| `resolver` | `resolve_indicator` | Resolution de termes vers codes indicateurs |
| `insee` | `insee_search_indicators`, `insee_get_indicator_metadata`, `insee_get_data`, `insee_search_geography` | Donnees macroeconomiques francaises |
| `eurostat` | `eurostat_search_datasets`, `eurostat_get_data`, `eurostat_get_ranking`, `eurostat_get_dataset_structure` | Donnees europeennes comparatives |
| `worldbank` | `worldbank_search_indicators`, `worldbank_get_data`, `worldbank_get_country_ranking` | Donnees mondiales |
| `oecd` | `oecd_search_datasets`, `oecd_get_data` | Donnees OCDE via SDMX |
| `factcheck` | `lookup_existing_factchecks`, `score_check_worthiness` | Fact-checks existants + scoring |
| `cherry_picking` | `analyze_cherry_picking` | Detection de cherry-picking temporel |
| `compare` | `compare_values` | Comparaison valeur declaree vs reelle |

## Prerequis

- Python 3.12+
- [uv](https://docs.astral.sh/uv/) (gestionnaire de paquets)
- Cles API (optionnelles) : Google Fact Check (Google Cloud Console), ClaimBuster (idir.uta.edu)

Aucune cle API necessaire pour : INSEE BDM, Eurostat, Banque mondiale, OCDE (gratuits et ouverts).

## Installation

```bash
git clone <repo-url>
cd factcheck-mcp
uv sync
```

## Configuration

Creer un fichier `.env` a la racine du projet :

```env
GOOGLE_FACTCHECK_API_KEY=votre_cle_google
CLAIMBUSTER_API_KEY=votre_cle_claimbuster
FACTCHECK_CACHE_DIR=~/.cache/factcheck-mcp
```

Les outils fonctionnent sans cles API (les fonctions Google FC et ClaimBuster retournent des listes vides au lieu de planter).

## Integration Claude Desktop

Ajouter dans `~/.config/claude/claude_desktop_config.json` :

```json
{
  "mcpServers": {
    "factcheck": {
      "command": "uv",
      "args": ["run", "--directory", "/chemin/vers/factcheck-mcp", "factcheck-mcp"],
      "env": {
        "GOOGLE_FACTCHECK_API_KEY": "votre_cle",
        "CLAIMBUSTER_API_KEY": "votre_cle"
      }
    }
  }
}
```

## Verification

Depuis Claude Desktop, demander :

> "Le chomage en France a baisse de 2 points depuis 2020, verifie cette affirmation."

Le LLM invoquera les outils MCP pour :
1. Chercher des fact-checks existants
2. Resoudre "chomage" vers le taux de chomage BIT de l'INSEE
3. Recuperer les donnees reelles
4. Comparer et produire un rapport avec sources

## Developpement

```bash
# Lancer les tests unitaires (152 tests)
uv run pytest

# Lancer les tests en mode verbose
uv run pytest -v

# Lancer les tests d'integration (APIs reelles, necessite reseau)
uv run pytest -m integration

# Lancer le serveur en mode standalone (debug)
uv run factcheck-mcp

# Lint et formatage
uv run ruff check src/ tests/
uv run ruff format src/ tests/
```

## Architecture

```
src/factcheck_mcp/
├── server.py              # Serveur FastMCP, enregistrement des 18 outils
├── tools/                 # Implementations MCP (un module par source)
│   ├── resolver.py        # Resolution d'indicateurs via ontologie YAML
│   ├── insee.py           # 4 outils INSEE (pynsee)
│   ├── eurostat.py        # 4 outils Eurostat
│   ├── worldbank.py       # 3 outils Banque mondiale (wbgapi)
│   ├── oecd.py            # 2 outils OCDE (sdmx1)
│   ├── factcheck.py       # Google Fact Check + ClaimBuster (httpx)
│   ├── cherry_picking.py  # Analyse de robustesse temporelle
│   └── compare.py         # Comparaison de valeurs avec qualification
├── core/                  # Infrastructure partagee
│   ├── models.py          # 12 modeles Pydantic
│   ├── cache.py           # Cache diskcache avec TTL par source
│   ├── config.py          # Configuration pydantic-settings
│   ├── errors.py          # 6 exceptions metier
│   └── retry.py           # Backoff exponentiel pour rate-limiting
└── ontology/              # Donnees statiques
    ├── indicators.yaml    # 30 indicateurs politiques -> codes sources
    └── geographies.yaml   # Noms geographiques -> codes INSEE/ISO
```

## Principes de conception

- **Serveur unique** — Un seul processus MCP expose tous les outils
- **Verdict LLM-assiste** — Le serveur fournit donnees brutes + metriques, le LLM formule le verdict
- **Fonctions synchrones** — fastmcp les execute automatiquement dans un threadpool
- **Degradation gracieuse** — Cles API manquantes ou APIs indisponibles ne font pas planter le serveur
- **Zero cout** — Toutes les APIs utilisees sont gratuites

## Licence

MIT

TDQS

A3.6/5.0

Scored across 18 tools

Disambiguation4/5

Most tools target a distinct source-action combination (e.g. insee_get_data vs eurostat_get_ranking), and the fact-checking utilities are clearly separated. Some overlap exists between resolve_indicator and source-specific search functions, and between compare_values and analyze_cherry_picking, but the descriptions are sufficient to disambiguate.

Naming Consistency4/5

The dominant naming pattern is source_verb_noun (insee_search_indicators, worldbank_get_data), and generic tools use verb_noun as well. Minor deviations like eurostat_get_ranking vs worldbank_get_country_ranking and lookup_existing_factchecks instead of search_... prevent a perfect score.

Tool Count4/5

18 tools is slightly above the typical 5-15 sweet spot, but the count is justified by four external data providers and the fact-checking workflow endpoints. Each provider needs search/get/ranking tools, so the set does not feel bloated.

Completeness4/5

The toolkit covers the core fact-checking pipeline: check-worthiness scoring, existing lookup, indicator resolution, data retrieval, value comparison, and cherry-picking detection. Minor gaps include lack of OECD ranking/metadata tools and no way to save or publish fact-checks.

Maintenance

ActivityInactive
ResponsivenessNo issues