france-data-mcp: Skill for Claude Code

.claude/skills/mcp-conventions/SKILL.md

mcp-conventions is a skill for Claude Code from cturkieh/france-data-mcp. It costs 98 tokens per session (3,241 once invoked), scanned B, original, MIT.

A project-specific coding guide for a TypeScript data service, covering database lookups, API boundaries, errors, logging, and tests. An API is an interface that lets other software call the service.

In plain words
What is it for?
Use it when changing the service library, API endpoints, database lookup helpers, or tests.
Why use it?
It keeps new code consistent with established behavior and prevents ambiguous results, hidden errors, and incorrect duplicate handling.

Skill for Claude Code

Written for Claude Code: installed under .claude/. Also seen: mentions CLAUDE.md.

This is cturkieh/france-data-mcp's own configuration. It tells Claude Code how to work on france-data-mcp itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything france-data-mcp configures →

Reuse

Borrowing it

Nothing to install: this file belongs to cturkieh/france-data-mcp. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/cturkieh/france-data-mcp/main/.claude/skills/mcp-conventions/SKILL.md
Clone the repo
git clone --depth 1 https://github.com/cturkieh/france-data-mcp

Made for: Claude Code.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for mcp-conventions

README.md
[![agentmods](https://agentmods.dev/badge/skills/cturkieh/france-data-mcp/mcp-conventions/github.svg)](https://agentmods.dev/skills/cturkieh/france-data-mcp/mcp-conventions)
Your own site
<a href="https://agentmods.dev/skills/cturkieh/france-data-mcp/mcp-conventions"><img src="https://agentmods.dev/badge/skills/cturkieh/france-data-mcp/mcp-conventions/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for mcp-conventions

Your own site · 80×15
<a href="https://agentmods.dev/skills/cturkieh/france-data-mcp/mcp-conventions"><img src="https://agentmods.dev/badge/skills/cturkieh/france-data-mcp/mcp-conventions.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 98 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 3,241 The whole file, excluding the scripts and references it only reads on demand.
Security scan B 2 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00098 $0.03241
Opus 5 $0.00049 $0.01621
Sonnet 5 $0.00020 $0.00648
Haiku 4.5 $0.00010 $0.00324

Measured 5d ago against content hash 51319935d71d, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-12, from the pricing page.

Security

Grade B, and why

mcp-conventions scanned grade B with 2 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 5d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Sends data to an external URLmediumData exfiltration

A POST to an outside endpoint may be telemetry or may be exfiltration; either way the mod talks to somewhere, and you should know where.

- **JSON malformé caller → `-32700 Parse error` classé AU SITE de l'accès `req.body`, JAMAIS par CLASSE d'exception dans le catch root** (fix `FRANCE-DATA-MCP-1`, prouvé prod 2026-07-25 — **SUPERSEDE la règle V0.12.2 `er

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

- **JSON malformé caller → `-32700 Parse error` classé AU SITE de l'accès `req.body`, JAMAIS par CLASSE d'exception dans le catch root** (fix `FRANCE-DATA-MCP-1`, prouvé prod 2026-07-25 — **SUPERSEDE la règle V0.12.2 `er
.claude/skills/mcp-conventions/SKILL.md · 72 lines

How it starts

The opening of the file, as written. The whole thing — 72 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Conventions de code (lib, endpoint, boundary)

Déplacé verbatim depuis CLAUDE.md le 2026-09-06 (budget). Source de vérité pour ce périmètre ; CLAUDE.md ne garde que les règles de tête.

Lib (src/) — OSS publiable, pas de Sentry direct.

  • Catch jamais silencieux : console.error ou console.warn avec préfixe [france-data-mcp].
  • RangeError pour input invalide au boundary public (mappe JSON-RPC -32602).
  • LookupResult<T> discriminé pour distinguer "pas trouvé" vs "erreur API".
  • Tests _resetXForTesting() pour tout module avec état partagé.
  • Lookup PK qui peut retourner ≤ 1 row → expectSingleRow(rpc, rows, identifier, hint) (db-helpers.ts). Source unique du pattern « warne LOUD si N > 1, ne throw pas, picke la première » utilisé par finess_by_num_finess + centres_sante_by_finess. Le hint voyage dans le warn pour préserver les patterns grep ops (PAS reformuler les call-sites).
  • Clé de déduplication d'identité = attributs de PERSONNE uniquement, jamais d'attribut de SITE (raison_sociale, adresse). Un PS multi-sites partage une identité ; mettre un attribut de site dans la clé le scinde en faux doublons (régression P1). L'attribut de site voyage dans adresse/sites[].
  • Primitives génériques (texte, maths) → core/, jamais sante/. sante/ importe déjà territoire/ : une primitive dans sante/ consommée par territoire/ crée une inversion de couche / cycle. Ré-export depuis l'ancien emplacement pour ne pas casser les consommateurs.
  • Résolution point→commune : reverseGeocode (adresse) ≠ communeContainingPoint (frontières) (V0.26.2, territoire/communes.ts). reverseGeocode cherche l'ADRESSE la plus proche → null sur un site sans adresse à proximité (industriel isolé / littoral, ex. Orano La Hague) ALORS que le point est DANS une commune. Tout dérivé d'une commune issu de reverseGeocode (permis Sit@del de dynamique_immobiliere, dept de finess_sirene_coverage_in_radius) DOIT fallback sur communeContainingPoint(lat,lon) (point-dans-polygone geo.api.gouv.fr/communes?lat&lon, frontières IGN AdminExpress). Garde-fou load-bearing length === 1 : sur coords hors-bornes (lat>90…) l'API ignore SILENCIEUSEMENT le filtre géo et renvoie TOUTE la liste alphabétique (34 969 communes, [0]="01001" Ain — faux positif, prouvé prod) → n'exploiter QUE length === 1 (un point ∈ 1 commune ; 0=mer/hors-France, >1=filtre ignoré → null), JAMAIS data[0]. Fail-safe par contrat (catch→null+warn, jamais throw — n'est appelé que sur un chemin déjà dégradé) ; le throw de reverseGeocode (panne IGN réelle) continue de remonter. Seul un point réellement en mer reste sans commune → dégradation propre conservée. Doctrine smoke/test corollaire : gater sur le STATUS de section (couverture.permis === "ok"), JAMAIS sur une donnée métier volatile (logements_autorises_recent > 0) — runSection expose ok dès absence de throw, un count peut valoir 0 légitimement (Fleury-devant-Douaumont : permis="ok" + 0 logement) ; le compte voyage en INFO. scripts/smoke-deploy.mjs encode ces 2 doctrines (gate-sur-status + params boundary {lat,lon,radius_km,naf} jamais {center,radiusKm} = signature lib interne → -32602).
  • Resolver SIRET — le best_match privilégie l'établissement ACTIF co-localisé, JAMAIS le score d'adresse seul (V0.16, fix succession M&A — siret-resolver.ts). disambiguateFallbackCandidates applique une étape « actif prime » AVANT le name filter : si ≥ 1 candidat actif est co-localisé avec le FINESS, le best_match est arbitré parmi les actifs ; les SIRET fermés du site restent dans candidates[] (timeline) mais ne sont plus best_match-éligibles. Co-localisation = distance haversine (core/geo-distance.ts) ≤ COLOCATION_RADIUS_M 100 m (V0.16.1, recalibré prod 2026-05-29 — était 50 m), JAMAIS le Dice d'adresse (qui ne discrimine pas le numéro de voie — un voisin au n°48 d'une avenue score 0,90 vs le n°85 du FINESS, prouvé prod). Pourquoi 100 et plus 50 : le géocodage DREES (Lambert93, grossier) décale le point FINESS de plusieurs dizaines de mètres du point BAN de l'adresse — décalage PARTAGÉ par tous les SIRET de cette adresse. Deux repreneurs M&A réels (Cerballiance Aulnay 52,1 m, EYLAU Courbevoie 96,6 m) ressortaient à la distance IDENTIQUE de leur ancien exploitant fermé (même adresse) mais juste au-dessus de 50 m → faux négatif ferme. 100 m couvre ces décalages, sous le voisin-piège testé ~110 m. Garde-fou faux positif inverse au rayon élargi = bande RELATIVE COLOCATION_SAME_SITE_TOLERANCE_M (30 m) : parmi les co-localisés, seuls ceux à ≤ min(distance) + 30 m (« même bâtiment ») sont best_match-éligibles ; un voisin actif d'une AUTRE adresse, plus loin qu'un prédécesseur fermé co-localisé, ne bascule pas le verdict en actif (test garde-fou voisin 80 m / prédécesseur 30 m). NE PAS reverter à 50 m sans relire la preuve prod (les 2 repreneurs redeviendraient invisibles ; le site EYLAU légitime à 46,6 m reste co-localisé dans les deux calibrations). Le fallback géo est aussi armé quand le best_match RPPS est FERMÉ (L1 — sinon le repreneur d'un autre SIREN reste invisible). Champ succession exposé (fait brut — le tool ne dit jamais « rachat »). Garde-fous : cross-source.test.ts (Méca A chemin RPPS / Méca B fallback géo / faux positif inverse) + geo-distance.test.ts. Cadrage durable : docs/plans/verifier-site-actif-succession-fix.md.

Read the full file on GitHub · 72 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 5d ago First seen · 72 lines · 98 tokens per session scan B 51319935d71d

Subscribe to this mod's changes

mcp-conventions is a skill published in the GitHub repository cturkieh/france-data-mcp (3 stars, last pushed 4d ago), licensed MIT. It adds 98 tokens to every session and 3,241 once invoked, about $0.0005 per session on Opus 5. A static security scan graded it B with 2 findings (sends data to an external url, makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-06.

Related

Other skills, from other repositories

event-store-design

Design and implement event stores for event-sourced systems. Use when building event sourcing infrastructure, choosing event store technologies, or implementing event persistence patterns.

wshobson/agents · 33 tokens

convex-explain-app

Explain an existing Convex app — data model + relationships, public vs internal functions, auth/ownership model, components, a request→data flow — read from the schema and function surface. Read-only.

openclaw/clawhub · 47 tokens

platform-custom-field-generate

Use this skill when users need to create, generate, or validate Salesforce Custom Field metadata. Trigger when users mention custom fields, field types, Roll-up Summary fields, Master-Detail relationships, Lookup relationships, formula fields, picklists, dependent (controlling) picklists, referencing a value set from…

forcedotcom/sf-skills · 194 tokens

field-service-sobject-create-configure

Headless 360 REST API deployment step for creating sObject records. Handles describe-based field discovery, required-field derivation, entity-relationship ordering, and composite graph transactions. Use this skill when a designer skill (or a user directly) needs to create sObject records after design confirmation…

forcedotcom/sf-skills · 74 tokens

durable-objects

Build, debug, or review Cloudflare Durable Objects code for persistent state and coordination.

fcakyon/claude-codex-settings · 22 tokens

nornicdb-grpc

Drive NornicDB over gRPC — the Qdrant-compatible surface (Collections, Points, Snapshots) plus the additive NornicSearch service. Use when ingesting via Qdrant SDKs, migrating from Qdrant, or running hybrid text+vector search from a non-Bolt client. Covers connection, RPC catalog, collection→database mapping…

orneryd/NornicDB · 98 tokens