# `vote.andre/elections` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/vote.andre/elections
- JSON: https://anlyon.dev/api/v1/servers/vote.andre/elections
- Version: 1.28.1 (active)
- Publisher: vote.andre (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/joelgombin/andre-mcp
- Metadata from the official MCP Registry, synced 2026-10-21T18:55:44.960Z

Title and description, as the publisher wrote them:

```untrusted-server-text
André — Analyse électorale française
Résultats des élections françaises 1999-2026 par bureau de vote, socio-démo INSEE et cartes.
```

Scanned 2026-10-21T19:16:26.872Z over streamable-http.

**11 tools: 5 change things and 6 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 0 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 5 | ask |
| Only reads | read | 6 | allow |

## Exfil surface

No private-data -> untrusted-input -> outbound path in this server alone: no tool is tagged untrusted-input or outbound.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | `mcp__elections__query_sql` |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | none |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | none |

## Findings

- **info** Long descriptions in `query_elections` ([long-description](https://anlyon.dev/methodology#long-description))

```untrusted-server-text
The description is 2,481 characters long, over the 2,000 this check looks for.

description ends: "...ion, with_sociodem optionnel) pour commune_code + election_id."
```


## Changes things (5)

Creates or changes something that can be changed back. Claude Code: ask.

### `create_data_table`

- The name "create_data_table" says "create": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Crée un tableau de données formaté à partir de données structurées.

        Utile pour présenter des résultats calculés ou combinés.
        Retourne un tableau texte formaté.
        
```

### `export_data`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Exporte des données électorales vers un fichier téléchargeable (CSV, JSON, TSV).

        Deux modes : data (contenu inline) ou source_path (chemin vers fichier existant).
        
```

### `generate_map`

- The name "generate_map" says "generate": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Génère une carte électorale (PNG) pour une élection.

        Paramètres :
        - election_id : identifiant élection (ex: '2024_legi_t1', '2020_muni_t2')
        - metric : 'family' (famille politique en tête), 'nuance' (score d'une nuance),
          'abstention' (abstentions / inscrits) ou 'participation' (votants / inscrits).
          Abstention et participation sont en % des inscrits ; au-dessus du bureau,
          somme des abstentions (ou votants) sur la somme des inscrits.
        - geography : 'bv' (bureau de vote, défaut) ou 'commune' (carte nationale)
        - department : code département (ex: '13'). Requis pour geography='bv' sauf si commune fourni.
        - commune : code commune (ex: '13055' pour Marseille). Centre la carte sur cette commune.
        - nuance : code nuance quand metric='nuance' (ex: 'RN', 'LFI', 'ENS')
        - region : code région pour geography='commune' (ex: '93' pour PACA)

        Exemples :
        - Carte par famille, Bouches-du-Rhône : election_id='2024_legi_t1', department='13'
        - Carte score RN, Marseille : election_id='2024_legi_t1', commune='13055', metric='nuance', nuance='RN'
        - Carte nationale : election_id='2024_euro_t1', geography='commune'
        - Carte d'abstention, Marseille : election_id='2024_legi_t1', commune='13055', metric='abstention'
        - Participation par commune, Bouches-du-Rhône : election_id='2024_legi_t1', geography='commune', department='13', metric='participation'
        
```

### `simulate_fusions`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

Description, as the server wrote it:

```untrusted-server-text
Simule les scénarios de fusion de listes municipales entre T1 et T2.

        Actions : 'status' (classer les listes après T1), 'simulate' (projections T2).
        Uniquement pour les élections municipales.
        
```

### `visualize`

- Nothing in its name or description says what it does, so it is counted as a write.

Description, as the server wrote it:

```untrusted-server-text
Crée une visualisation Plotly (retourne le spec JSON).

        Deux modes :
        - Spec libre : fournir 'spec' (dict Plotly complet {data, layout})
        - Assisté : fournir chart_type + data + mappings

        Types supportés : bar, line, scatter, histogram, box, violin, heatmap,
        treemap, grouped_bar, stacked_bar, dumbbell, diverging_bar,
        dual_axis (x + y + y2), sankey (source + target + values),
        hemicycle (x=groupe, y=sièges), ternary (a + b + c = trois parts).
        Paramètres transversaux : subtitle (sous-titre technique),
        reference_line ({value, label, orientation}) pour un seuil/référence.
        
```

## Only reads (6)

Looks things up and changes nothing. Claude Code: allow.

### `query_admin`

- The name "query_admin" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Requête les divisions administratives françaises.

        Actions : search_commune, get_commune, search_postal,
        list_epci, get_epci, list_cantons, list_departements, list_regions.
        
```

### `query_dlp`

- The name "query_dlp" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Requête les données DLP (composition sociale des candidats municipaux 2020).

        ~546 000 candidats dans ~10 000 communes (≥1 000 hab.).
        Classes : CDOM (dominant), CMOY (moyen), CSUB (subalterne), RET (retraité), AUTRES.
        Actions : summary, composition, parite, listes, candidats, professions, sortants.
        
```

### `query_elections`

- The name "query_elections" says "query": a word for reading.
- Findings: info long-description

Description, as the server wrote it:

```untrusted-server-text
Requête les données électorales françaises (1999-2026).

        Niveaux territoriaux : NATIONAL (aucun filtre), RÉGIONAL (region_code),
        DÉPARTEMENTAL (departement_code), COMMUNAL (commune_code).

        Actions de base : list_elections, query_results, list_bureaux, query_bureau,
        query_by_bureau, rank_bureaux, list_circonscriptions, query_circonscription,
        list_cantons, query_canton, search_candidate, query_candidatures, etc.

        Actions « panel » (1 appel = analyse complète, évite les boucles) :
        - compare_elections : compare deux scrutins pour un territoire
          (election_id + compare_to_election + commune_code|departement_code,
          candidate_name optionnel).
        - query_all_circonscriptions : vainqueur de CHAQUE circonscription d'un
          territoire en un appel (election_id + commune_code|departement_code,
          législatives uniquement).
        - vote_reserve : score d'une famille + abstention par bureau de vote sur
          les scrutins récents comparables (commune_code + famille).
        - select_communes : sélectionne/classe des communes par critères géo +
          population + électoraux (region_code/departement_code/epci/commune_codes,
          population_min/max, commune_metric, condition, sort_by, limit, order ;
          commune_metric/condition nécessitent election_id). commune_metric accepte
          PLUSIEURS métriques séparées par des virgules — une colonne chacune, en
          un seul appel ; condition et sort_by portent alors sur la première.
        - cross_election_panel : évolution d'un sujet (famille ou nuance_code) par
          commune sur N scrutins (elections=ids séparés par des virgules + scope
          optionnel commune_code/departement_code/region_code/commune_codes ;
          SANS scope = national, panel complet en data_file). Renvoie aussi
          « ensemble » : score du périmètre entier par scrutin + delta, pondéré
          par les exprimés — ne pas boucler par département. famille et nuance_code
          acceptent PLUSIEURS sujets séparés par des virgules ('Gauche,Droite') :
          tous en un appel, agrégats dans « ensembles ». group_by='region'|
          'departement' ajoute un agrégat pondéré PAR MAILLE dans le même appel —
          ne jamais boucler un appel par région.
        - bureau_breakdown : pivot par bureau (top_n nuances/blocs + participation,
          with_sociodem optionnel) pour commune_code + election_id.
        
```

### `query_elus`

- The name "query_elus" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Requête les élus de la République française (base BRÉF).

        Actions : search_elu, list_mandate_types, list_elus.
        
```

### `query_sociodem`

- The name "query_sociodem" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Requête les données socio-démographiques au niveau bureau de vote.

        Données INSEE RP 2022 + Filosofi 2021, interpolées IRIS→BDV.
        Actions : list_variables, profile, indices, rank, compare.
        
```

### `query_sql`

- The name "query_sql" says "query": a word for reading.
- Tag private-data: The name "query_sql" says "query" and "sql": it reads databases. The description's first sentence says "sql": it reads databases.

Description, as the server wrote it:

```untrusted-server-text
Exécute une requête SQL directe sur la base DuckDB (read-only).

        Tables principales :
        - general_results : résultats généraux par bureau de vote
        - candidats_results : résultats par candidat par bureau de vote
        - elections_disponibles : liste des élections (id_election, nb_bureaux, total_inscrits)
        - candidats_avec_nuances : candidats avec famille politique (si nuances enrichies)
        - resultats_par_famille : résultats agrégés par famille politique
        - communes, epci, departements, regions : divisions administratives
        - bv_sociodemographique : données socio-démo par bureau de vote

        ATTENTION — colonnes de general_results (noms avec espaces, à quoter) :
        id_election, id_brut_miom, "Code du département", "Code de la commune" (SANS préfixe dept, ex: '055' pour Marseille),
        "Libellé de la commune", Inscrits, Abstentions, Votants, Blancs, Nuls, Exprimés.

        PRÉFÉRER query_elections pour les analyses standard — query_sql est pour les requêtes ad hoc avancées.

        Exemple :
        SELECT id_election, ROUND(100.0 * SUM(Abstentions) / NULLIF(SUM(Inscrits), 0), 1) as abstention_pct
        FROM general_results WHERE "Code du département" = '13' AND "Code de la commune" = '055'
        GROUP BY id_election ORDER BY id_election DESC LIMIT 5
        
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `elections`:

```json
{
  "permissions": {
    "allow": [
      "mcp__elections__query_elections",
      "mcp__elections__query_admin",
      "mcp__elections__query_elus",
      "mcp__elections__query_sociodem",
      "mcp__elections__query_dlp",
      "mcp__elections__query_sql"
    ],
    "ask": [
      "mcp__elections__generate_map",
      "mcp__elections__simulate_fusions",
      "mcp__elections__export_data",
      "mcp__elections__visualize",
      "mcp__elections__create_data_table"
    ],
    "deny": []
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__elections__query_sql`: private-data
