Skip to main content
Glama

Doctolib MCP

Serveur MCP non officiel qui donne à Claude (ou à tout client MCP) un accès complet à l'API publique de Doctolib : chercher des praticiens autour d'un lieu, lister tous les créneaux libres d'une spécialité dans un rayon, lire les infos pratiques d'un cabinet, et être alerté dès qu'un créneau se libère.

« Trouve-moi tous les rendez-vous de dermatologue dans les 15 km autour de Clermont-Ferrand d'ici un mois. » « Surveille le Dr X et préviens-moi sur mon téléphone dès qu'un créneau s'ouvre avant le 15 octobre. »

Aucun compte Doctolib n'est nécessaire : le serveur utilise uniquement les données publiques que le site affiche à tout visiteur. La réservation, elle, se fait toujours sur Doctolib (lien direct fourni, lieu et motif pré-sélectionnés).

Fonctionnalités

  • Recherche géographique : spécialité + ville / code postal / adresse + rayon, triée par distance, avec secteur de conventionnement, paiement, langues, motif, acceptation des nouveaux patients.

  • Tous les créneaux d'une zone en un appel (find_slots) : chaque agenda est interrogé, les créneaux sont remis dans l'ordre chronologique, avec la raison quand il n'y en a pas (« agenda fermé », « prochain créneau le … »).

  • Détail d'un praticien : tous ses motifs (réservés aux patients suivis ? restrictions d'âge ? vidéo ?), agendas fermés, téléphone du cabinet, horaires d'ouverture, carte Vitale, moyens de paiement.

  • Créneaux sur la période voulue (au-delà des 15 jours par appel de Doctolib), avec remplaçants et créneaux sur demande.

  • Surveillance d'un praticien ou de toute une zone, avec notifications macOS, push téléphone (ntfy, gratuit) ou webhook (n8n, Make, Zapier…).

  • Référentiels : 123 spécialités, autocomplétion Doctolib (spécialités, actes, praticiens), sitemaps publics.

21 outils au total : voir docs/TOOLS.md. Les endpoints Doctolib sous-jacents sont documentés dans docs/API.md.

Related MCP server: doctolib-mcp

Installation

Prérequis : Python ≥ 3.11 et uv.

git clone https://github.com/arvernesmotion/Doctolib-MCP.git
cd Doctolib-MCP
uv sync

Claude Code

claude mcp add doctolib --scope user -- uv --directory /chemin/vers/Doctolib-MCP run doctolib-mcp

Claude Desktop

Dans claude_desktop_config.json (voir examples/claude_desktop_config.json) :

{
  "mcpServers": {
    "doctolib": {
      "command": "uv",
      "args": ["--directory", "/chemin/vers/Doctolib-MCP", "run", "doctolib-mcp"]
    }
  }
}

Autres clients MCP

Le serveur parle MCP en stdio : commande uv --directory <dossier> run doctolib-mcp.

Exemples de demandes

Vous demandez

Outils utilisés

« Quels ophtalmos à moins de 10 km de Lyon prennent de nouveaux patients ? »

search_practitioners

« Tous les créneaux de kiné autour de Nantes cette semaine »

find_slots

« Ce médecin accepte-t-il la carte Vitale ? Quels sont ses horaires ? »

practitioner_practical_info

« Pourquoi je ne trouve aucun créneau chez ce dermato ? »

practitioner_booking_info, get_availabilities

« Préviens-moi dès qu'un pédiatre se libère à 15 km de Bordeaux »

watch_area, configure_notifications

Alertes de créneaux

  1. Choisir les canaux (une fois) : demandez à Claude « configure les notifications avec un topic ntfy » (configure_notifications), puis installez l'app ntfy (iOS / Android) et abonnez-vous au topic renvoyé. Gardez-le secret : quiconque le connaît reçoit vos alertes. Un webhook_url permet aussi de relayer vers n8n, Slack…

  2. Créer une surveillance : watch_practitioner (un praticien) ou watch_area (toute une zone).

  3. Planifier la vérification : la commande doctolib-mcp-watch fait une passe et notifie les nouveaux créneaux. Lancez-la toutes les 5 à 10 minutes :

    • macOS (launchd) : adapter examples/launchd.plist puis

      cp examples/launchd.plist ~/Library/LaunchAgents/fr.doctolib-mcp.watch.plist
      launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/fr.doctolib-mcp.watch.plist

      ⚠ Protection macOS : launchd refuse d'exécuter un script situé dans ~/Documents, ~/Desktop ou ~/Downloads (« Operation not permitted »). L'exemple appelle donc .venv/bin/python -m doctolib_mcp.watch. Si la passe reste bloquée malgré tout, clonez le dépôt hors de ces dossiers (ex. ~/Services/Doctolib-MCP).

    • Linux (systemd) : examples/doctolib-mcp-watch.service et examples/doctolib-mcp-watch.timer.

    • cron : */10 * * * * cd /chemin/vers/Doctolib-MCP && uv run doctolib-mcp-watch >> ~/.doctolib-mcp/watch.log 2>&1

Au premier passage, les créneaux déjà ouverts sont signalés ; ensuite, uniquement les nouveaux. Un créneau qui disparaît puis réapparaît (annulation d'un autre patient) est signalé à nouveau : ce sont les meilleures occasions.

Configuration

Variable d'environnement

Défaut

Rôle

DOCTOLIB_MCP_DATA

~/.doctolib-mcp

Dossier des surveillances (watches.json) et de la configuration des alertes (config.json)

DOCTOLIB_MCP_MIN_INTERVAL

0.35

Délai minimal entre deux requêtes vers Doctolib (secondes)

DOCTOLIB_MCP_USER_AGENT

Chrome récent

User-Agent envoyé (obligatoire pour les créneaux)

Limites à connaître

  • Connexion résidentielle requise pour les créneaux. Doctolib (Cloudflare) bloque availabilities.json depuis les IP de datacenter (Vercel, AWS, la plupart des VPS…) : réponse 403. Faites tourner le serveur sur votre ordinateur. La recherche et les infos pratiques passent, elles, depuis n'importe où.

  • Pas de réservation automatique. Réserver exige votre compte Doctolib ; le serveur fournit le lien direct (lieu + motif pré-sélectionnés). Le créneau lui-même ne peut pas être pré-sélectionné.

  • Seuls les agendas ouverts en ligne sont visibles. Beaucoup de spécialistes n'ouvrent leur agenda que par vagues, ou réservent certains motifs à leurs patients suivis ; c'est précisément là que la surveillance est utile.

  • Le motif principal renvoyé par la recherche est choisi par Doctolib et peut être un motif réservé (« Ancien patient du Dr X ») : practitioner_booking_info liste tous les motifs.

  • Tarifs chiffrés, accessibilité, RPPS ne sont exposés que dans un endpoint réservé aux navigateurs : non couverts.

  • API non officielle : Doctolib peut en changer le format à tout moment.

Usage responsable

Ce projet n'est ni affilié à Doctolib, ni approuvé par Doctolib. Il est destiné à un usage personnel, pour trouver un rendez-vous médical plus facilement. Le robots.txt et les conditions d'utilisation de Doctolib encadrent l'accès automatisé à leurs services : restez à faible débit (réglage par défaut ≈ 3 requêtes/s, surveillances toutes les 5–10 min), ne republiez pas et ne revendez pas les données, et n'utilisez pas cet outil pour accaparer des créneaux au détriment d'autres patients. Vous êtes responsable de l'usage que vous en faites.

Développement

src/doctolib_mcp/
├── client.py     # HTTP : en-têtes navigateur, limitation de débit globale, reprises sur 429
├── api.py        # un wrapper par endpoint Doctolib + normalisation
├── geo.py        # géocodage (geo.api.gouv.fr, api-adresse.data.gouv.fr)
├── finder.py     # moteur « tous les créneaux d'une zone »
├── store.py      # surveillances, configuration, notifications
├── watch.py      # passe de surveillance (commande doctolib-mcp-watch)
├── server.py     # serveur MCP (21 outils + 1 ressource)
└── data/specialities.json

Test de bout en bout contre le vrai site (depuis une connexion résidentielle) :

uv run python tests/smoke_live.py

Il démarre le serveur en stdio, appelle chaque outil et affiche OK / ERR (les surveillances de test sont écrites dans un dossier temporaire).

Licence

MIT

Available Tools

21 tools
autocompleteA
Read-only

Autocomplétion Doctolib : spécialités / actes (searchEntries) et praticiens ou centres par nom (profiles). Astuce : le moteur préfère les préfixes courts ('derma' plutôt que 'dermatologue').

Inputs: query (required), include.

configure_notificationsC

Canaux d'alerte : notification macOS, push téléphone via ntfy.sh (app gratuite, s'abonner au topic), webhook JSON (POST {title, message, url}) vers n8n, Slack, Discord… Envoie une notification de test.

Inputs: macos, send_test, ntfy_topic, webhook_url, +1 more.

find_slotsB
Read-only

TOUS les créneaux libres d'une spécialité autour d'un lieu, sur N jours, en un appel.

Renvoie la liste chronologique des créneaux (heure, praticien, distance, motif, remplaçant, lien de réservation) et l'état de chaque praticien (nb de créneaux, premier créneau, prochain créneau hors période, agenda fermé…). Peut prendre 10 à 60 s selon le nombre de praticiens (≈ 3 requêtes/s vers Doctolib).

Inputs: speciality (required), lat, lng, city, +6 more.

geocode_addressB
Read-only

Adresse précise → coordonnées (api-adresse.data.gouv.fr), pour centrer une recherche sur un domicile.

Inputs: query (required). Returns: result

get_availabilitiesA
Read-only

Créneaux d'un praticien pour un motif, sur N jours (Doctolib limite à 15 j par appel : l'outil enchaîne).

Deux usages :

  • url_or_slug (+ motive_id / practice_id optionnels) : agendas résolus automatiquement ; sans motive_id, TOUS les motifs réservables sont interrogés.

  • motive_id + agenda_ids (+ practice_id) : appel direct (ids issus de search_practitioners). Renvoie slots, substitutes (créneaux assurés par un remplaçant), next_slot si rien dans la période, reason (agenda fermé / pas encore ouvert) et booking_url.

Inputs: days, motive_id, agenda_ids, start_date, +2 more.

list_specialitiesA
Read-only

Liste des 123 spécialités Doctolib (slug à utiliser dans les autres outils, nom, id). query filtre sans tenir compte des accents (ex. 'derma', 'kiné', 'ophtal').

Inputs: query. Returns: result

list_watchesB
Read-only

Surveillances et leur état (dernière vérification, nb de créneaux, dernière alerte, erreur).

Inputs: no named parameters. Returns: result

place_autocompleteA
Read-only

Autocomplétion de lieux côté Doctolib (villes, codes postaux, adresses). Ne renvoie pas de coordonnées.

Inputs: query (required). Returns: result

practitioner_booking_infoB
Read-only

Données du tunnel de réservation d'un praticien : lieux (adresse, GPS, téléphone), agendas (fermés ?), tous les motifs (vidéo, réservés aux patients déjà suivis sur tel agenda, restrictions d'âge, où ils sont réservables).

Inputs: url_or_slug (required).

practitioner_messagingB
Read-only

Catégories de demandes par messagerie Doctolib (renouvellement, résultats…) si le praticien l'a activée.

Inputs: profile_id (required).

practitioner_practical_infoA
Read-only

Infos pratiques : horaires d'ouverture, accepte les nouveaux patients, téléconsultation, secteur, carte Vitale, moyens de paiement, langues, adresses. profile_id vient de search_practitioners ; sinon fournir url_or_slug (résolu via le tunnel de réservation).

Inputs: profile_id, url_or_slug.

run_watches_nowA

Lance immédiatement une passe de surveillance (notifie les nouveaux créneaux).

Inputs: no named parameters. Returns: result

search_availabilitiesC
Read-only

Variante « vue liste » de Doctolib (7 jours max) avec filtre de régime d'assurance. Réponse brute.

Inputs: motive_id (required), agenda_ids (required), days, practice_id, +1 more.

search_cityB
Read-only

Communes françaises par nom ou code postal, avec coordonnées (geo.api.gouv.fr).

Inputs: query (required). Returns: result

search_filtersB
Read-only

Filtres de recherche proposés par Doctolib pour une spécialité (délais, secteurs, langues, vidéo).

Inputs: speciality (required). Returns: result

search_practitionersA
Read-only

Praticiens d'une spécialité autour d'un lieu (ville/code postal/adresse ou lat+lng), triés par distance.

Chaque résultat donne : distance, adresse, motif principal (id, nom, nouveaux patients acceptés ?), agendas, secteur de conventionnement, moyens de paiement, langues, profile_id (→ practitioner_practical_info), slug (→ practitioner_booking_info) et booking_url.

  • available_within_days : seulement ceux avec un créneau sous N jours (filtre Doctolib, incomplet).

  • languages : codes Doctolib (gb, es, de, it, ar, pt, ru, cn…).

  • Les bornes de téléconsultation en pharmacie sont exclues par défaut.

  • online_booking_only=False inclut les fiches annuaire (pas de RDV en ligne, souvent téléphone uniquement).

Inputs: speciality (required), lat, lng, city, +9 more.

sitemapB
Read-only

Sitemaps publics Doctolib : 'sitemap' (index), 'sitemap_specialities/1', 'sitemap_skills/1' (1604 actes), 'sitemap_practitioner_doctors/1'… (≈ 295 000 fiches au total). Renvoie les URL.

Inputs: name. Returns: result

stop_watchA
Destructive

Met en pause (ou supprime avec delete=True) une surveillance.

Inputs: watch_id (required), delete. Returns: result

watch_areaC

Surveille TOUTE une zone : notification dès qu'un nouveau créneau apparaît chez n'importe quel praticien de la spécialité dans le rayon (via doctolib-mcp-watch, à planifier).

Inputs: speciality (required), lat, lng, city, +5 more.

watch_practitionerB

Surveille un praticien : notification dès qu'un nouveau créneau s'ouvre (via doctolib-mcp-watch, à planifier). Sans motive_id : motif de l'URL, sinon le premier motif réservable. before = AAAA-MM-JJ ignore les créneaux plus tardifs.

Inputs: url_or_slug (required), days, label, before, +2 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 21 tools

    Disambiguation3/5

    Most tools are distinguishable, but availability retrieval is split across search_practitioners, find_slots, get_availabilities, and search_availabilities, which an agent could easily confuse. Location resolution also overlaps across autocomplete, place_autocomplete, search_city, and geocode_address, though the descriptions provide useful distinctions.

    Naming Consistency4/5

    Tool names are consistently snake_case and mostly readable. However, the set mixes verb-led names (list_specialities, search_practitioners, get_availabilities) with noun-led names (practitioner_booking_info, sitemap), so it is not a perfect verb_noun pattern throughout.

    Tool Count3/5

    With 21 tools, the surface is on the heavy side for a Doctolib search and booking assistant. Many functions are justified, but some availability and location tools could potentially be consolidated or nested.

    Completeness4/5

    The server covers specialty lookup, location resolution, practitioner search, practical details, availability retrieval, booking links, watches, and notifications. The main gap is that it does not actually create, modify, or cancel appointments, but this may be intentional because booking is handled through the external Doctolib tunnel.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to search the doktor.mx directory for over 56,000 verified doctors and medical specialists across Mexico. It provides tools for verifying professional licenses, finding specialists by symptoms or conditions, and checking medical insurance compatibility.
      10
      62 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP server for Doctolib that enables searching practitioners, checking availability, and booking or canceling appointments across Doctolib Germany, France, and Italy.
      2
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables finding doctors in Romania by county, speciality, language, name, and weekly availability, with fuzzy name matching and nearby-county fallback.
      41 npm
      MIT