Doctolib MCP
Allows displaying macOS desktop notifications when new appointment slots are found.
Allows triggering Make scenarios with new appointment slot alerts via a webhook URL.
Allows triggering n8n workflows with new appointment slot alerts via a webhook URL.
Allows sending push notifications to a phone via ntfy topics when new appointment slots are found.
Allows sending new appointment slot alerts to Slack via a webhook URL.
Allows triggering Zapier Zaps with new appointment slot alerts via a webhook URL.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Doctolib MCPTrouve-moi un dermatologue disponible dans 15 km autour de Lyon cette semaine"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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: Doktor MCP Server
Installation
Prérequis : Python ≥ 3.11 et uv.
git clone https://github.com/arvernesmotion/Doctolib-MCP.git
cd Doctolib-MCP
uv syncClaude Code
claude mcp add doctolib --scope user -- uv --directory /chemin/vers/Doctolib-MCP run doctolib-mcpClaude 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 ? » |
|
« Tous les créneaux de kiné autour de Nantes cette semaine » |
|
« Ce médecin accepte-t-il la carte Vitale ? Quels sont ses horaires ? » |
|
« Pourquoi je ne trouve aucun créneau chez ce dermato ? » |
|
« Préviens-moi dès qu'un pédiatre se libère à 15 km de Bordeaux » |
|
Alertes de créneaux
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. Unwebhook_urlpermet aussi de relayer vers n8n, Slack…Créer une surveillance :
watch_practitioner(un praticien) ouwatch_area(toute une zone).Planifier la vérification : la commande
doctolib-mcp-watchfait 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,~/Desktopou~/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 |
|
| Dossier des surveillances ( |
|
| Délai minimal entre deux requêtes vers Doctolib (secondes) |
| 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.jsondepuis 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_infoliste 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.jsonTest de bout en bout contre le vrai site (depuis une connexion résidentielle) :
uv run python tests/smoke_live.pyIl démarre le serveur en stdio, appelle chaque outil et affiche OK / ERR (les surveillances de test sont écrites
dans un dossier temporaire).
Licence
Available Tools
21 toolsautocompleteARead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| include | No | ALL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral note the annotations do not: the engine prefers short prefixes ('derma' over 'dermatologue'), which directly affects how the agent should phrase queries. It omits return format or result limits, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the capability mapping front-loaded and the practical tip clearly marked as advice. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only autocomplete tool with no output schema, the description covers purpose, the enum semantics, and a query-phrasing tip. What ALL returns or the shape of the results is unstated, a minor gap given annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it explains the semantic meaning of the enum values (SEARCH_ENTRIES vs PROFILES) that the schema only lists as bare strings. It does not explain the ALL default, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb (autocomplétion) and the resource domains it covers: specialties/acts via searchEntries and practitioners/centres via profiles. It implicitly distinguishes itself from siblings like list_specialities or place_autocomplete, though it does not name them explicitly, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mapping of searchEntries to specialties/acts and profiles to practitioners/centres implies when each mode applies, but there is no explicit when-to-use guidance or routing against alternatives like search_practitioners or list_specialities. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
booking_linkBRead-only
Lien vers le tunnel de réservation Doctolib avec lieu et motif pré-sélectionnés (le créneau ne peut pas l'être).
| Name | Required | Description | Default |
|---|---|---|---|
| motive_id | No | ||
| practice_id | No | ||
| url_or_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-dependency profile is covered. The description adds one genuine behavioral constraint — the time slot cannot be pre-selected — which is useful context, but says nothing about link validity, expiry, or what the returned URL resolves to.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence; the parenthetical limitation is the only elaboration and it earns its place by preventing a wrong assumption. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and annotations cover the safety profile. What remains missing is routing guidance against the large sibling set and semantics for the required url_or_slug input — gaps that matter for a 3-parameter tool exercised in a crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three parameters, so the description must carry the load. It partially helps by implying lieu maps to practice_id and motif to motive_id, but leaves the required url_or_slug parameter completely unexplained (URL vs slug format, expected shape).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific artifact (a link to the Doctolib booking funnel) and states what is and isn't pre-set (place and motive yes, time slot no). An agent can distinguish it from slot-search siblings like find_slots or get_availabilities, though the sibling set isn't referenced by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No indication of when to reach for booking_link versus the many availability/search siblings, nor any prerequisite (e.g. that place/motive must already be known). Usage is only implicitly inferrable from the mention of pre-selected place and motive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| macos | No | ||
| send_test | No | ||
| ntfy_topic | No | ||
| webhook_url | No | ||
| generate_ntfy_topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true, so the description adds real value by disclosing the outbound webhook payload shape (POST {title, message, url}) and the ntfy subscription requirement. It still omits the most important behavioral fact for a config mutation: whether omitted channels are disabled, preserved, or require auth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence whose front-loading works (channels first, side effect last), but the middle is a cluttered list of examples and parentheticals that mixes channel names with implementation notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 5 optional parameters, no output schema, and no annotation detail, the description should explain how channels are selected and what the test notification does. It covers channel types but leaves the mechanics of configuration and the effect of send_test/generate_ntfy_topic unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 5 parameters, so the description must compensate. It loosely maps to macos, ntfy_topic and webhook_url, but says nothing about generate_ntfy_topic or send_test (default true), leaving two parameters — including the one controlling side effects — entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the alert channels (macOS, ntfy.sh push, JSON webhook to n8n/Slack/Discord) and notes it sends a test notification, so the resource area is identifiable. However, the verb is only implied by the tool name — the text never states that this configures/persists settings — and it is not distinguished from any sibling, though the siblings listed are unrelated booking tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives, nor any prerequisites or exclusions. The clue that ntfy requires a free app and topic subscription is operational context for one channel, not usage guidance for invoking the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_slotsBRead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| city | No | ||
| days | No | ||
| radius_km | No | ||
| speciality | Yes | ||
| sector_1_only | No | ||
| new_patients_only | No | ||
| max_slots_returned | No | ||
| include_telehealth_kiosks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the returned fields are enumerated, practitioner-level status is described, and it discloses latency (10-60 s) plus the underlying rate limit (~3 req/s to Doctolib) — rare and valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short front-loaded sentences; the core capability leads and the return shape and latency follow. Efficient, though the return-field enumeration is a little list-heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description commendably explains the return payload and per-practitioner status, and it warns about runtime. But for a 10-parameter aggregation tool at 0% schema coverage, the missing parameter semantics leave the definition under-complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 10 parameters, so the description carries the full burden. It only loosely maps to speciality, location and days ('sur N jours'); it never explains lat/lng vs city precedence, radius_km, sector_1_only, new_patients_only, max_slots_returned, or include_telehealth_kiosks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('TOUS les créneaux libres d'une spécialité') with clear scope: around a location, over N days, in one call. It is distinguishable from aggregation-free siblings, but never names the competing tools (search_availabilities, get_availabilities) to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'en un appel' implies this aggregates what scattered siblings do, but there is no explicit when-to-use, when-not-to-use, or named alternative. The agent is left to infer that this replaces search_availabilities/get_availabilities from the sibling list alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
geocode_addressBRead-only
Adresse précise → coordonnées (api-adresse.data.gouv.fr), pour centrer une recherche sur un domicile.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-call profile is covered. The description usefully adds the external data source, which explains the open-world behavior, but does not note failure modes (unmatched addresses), rate limits, or localization, keeping it at the minimum-viable level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single telegraphic sentence with the input→output mapping front-loaded and the use case trailing. Every element earns its place, though the compressed style borders on terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is rightly omitted, and the tool is simple with only one parameter. Still, the description leaves the required parameter format and address-scope expectations underspecified for a geocoding call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'query' parameter has 0% schema description coverage, so the description carries the burden. 'Adresse précise' does convey that the input should be a fully qualified address rather than a partial/fuzzy term, but gives no format example, country scope, or handling of ambiguous input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific transformation: precise address to coordinates, and even names the backing service (api-adresse.data.gouv.fr). It implicitly contrasts with fuzzy-input siblings like autocomplete/place_autocomplete by emphasizing 'Adresse précise', but never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'pour centrer une recherche sur un domicile' gives one concrete use case, which implies when to reach for it. However it offers no when-not guidance and does not distinguish itself from siblings such as search_city or place_autocomplete, which overlap in the geocoding space.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_availabilitiesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| motive_id | No | ||
| agenda_ids | No | ||
| start_date | No | ||
| practice_id | No | ||
| url_or_slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly and openWorld, and the description adds genuinely non-structured behavior: the 15-day per-call API limit with automatic chaining, and the returned shape (slots, substitutes, next_slot, reason, booking_url). It omits any auth/rate-limit caveats beyond the chaining note, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then a clean two-branch usage list and a return-value sentence. Dense but every clause carries information; the parenthetical 15-day note and return enumeration both earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description supplies the return fields and the special cases (substitutes, next_slot, reason). It is self-sufficient for calling; the only shortfall is the undocumented start_date and unspecified date/number formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely delivers: it explains url_or_slug, motive_id, practice_id and agenda_ids roles and their interdependencies. start_date and the exact semantics of the days default are not addressed, leaving one gap in an otherwise strong compensation for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: practitioner availability slots for a motive over N days, with the Doctolib 15-day chunking behavior spelled out. It also situates itself relative to search_practitioners (source of ids), so the agent can tell what it does and where its inputs come from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates two invocation modes: url_or_slug-based auto-resolution (and the default of querying ALL bookable motives when motive_id is omitted) versus direct motive_id + agenda_ids calls. This is exactly when-to-use-which-pattern guidance with the branch conditions made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_specialitiesARead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered. The description adds useful behavior (accent-insensitive filtering, the 123-entry fixed set, returned fields) but says nothing about pagination, ordering, or limits, keeping it at a moderate 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero filler, front-loaded with the resource and its role, then the filter behavior. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be detailed, and the annotations carry the safety profile. For a single-optional-param list tool the description is nearly complete; only ordering/pagination behavior is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter meaning, and it does: query is accent-insensitive and the examples ('derma', 'kiné', 'ophtal') demonstrate substring/partial matching. It stops short of formally stating partial-match semantics, so it is good but not exhaustive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Liste des 123 spécialités Doctolib') and enumerates the returned fields (slug, nom, id), making the purpose concrete. It does not explicitly contrast itself with siblings like autocomplete or search_filters, so it stays at a clear-but-undifferentiated 4.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It hints at downstream usage ('slug à utiliser dans les autres outils') and explains the query filter, which implies when the lookup is useful. However, it never states when to prefer this over siblings such as autocomplete or search_filters, and offers no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchesBRead-only
Surveillances et leur état (dernière vérification, nb de créneaux, dernière alerte, erreur).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description's remaining content (the state fields) describes return values, which an output schema already exists to convey, so it adds little behavioral context beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly-scoped sentence with the resource front-loaded and no filler. It is arguably too terse, but every word carries meaning and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and read-only annotations, the definition is minimally viable: an agent knows it lists watches and their state. It still lacks any routing guidance among the many watch-related siblings, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; the baseline of 4 applies. Nothing in the description misrepresents or conflicts with the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ("Surveillances") and enumerates the state fields returned (last check, slot count, last alert, error), which pairs with the list_* name to make the operation clear. It does not, however, distinguish itself from watch-related siblings like run_watches_now, watch_practitioner, or stop_watch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance at all — nothing says this is the read-side companion to run_watches_now/watch_practitioner, nor any prerequisite or exclusion. The agent must infer usage purely from the tool name and the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_autocompleteARead-only
Autocomplétion de lieux côté Doctolib (villes, codes postaux, adresses). Ne renvoie pas de coordonnées.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine context beyond that by disclosing the data source (Doctolib) and the missing-coordinates behavior, but says nothing about matching behavior, ranking, or result limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the scope front-loaded and the caveat second; no filler. Slightly under-specified rather than overlong.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be documented, and the 'no coordinates' note usefully sets result expectations for a read-only, single-parameter autocomplete. Nothing critical is missing for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it only indirectly implies the query is a place name/city/postal code/address. For a single, near-self-evident 'query' parameter this is adequate but adds little syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (place autocomplete) with its scope (cities, postal codes, addresses) and clarifies it is Doctolib-side data. The negative statement 'ne renvoie pas de coordonnées' implicitly separates it from geocode_address, though it never names the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the word 'autocomplétion' and the field list, and the note about coordinates hints at when another tool is needed. But there is no explicit when-to-use statement or reference to the very similar siblings autocomplete, search_city, or geocode_address.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
practitioner_booking_infoBRead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| url_or_slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safe-read profile is covered. The description adds content-level context (what the returned data includes, that agendas may be closed), but says nothing about auth needs, error cases, or shape of the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The nested parenthetical lists make it slightly dense, but every clause names actual returned content rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned data, which partially compensates. However, for a required-input fetch tool the missing parameter semantics and absent usage guidance leave the definition only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, url_or_slug, with 0% schema description coverage, so the description carries the full burden. It only implies 'd'un praticien' and never explains whether the input is a URL, a slug, or what format is accepted, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource (a practitioner's booking-tunnel data) and enumerates its contents: locations, agendas, and all booking motives with their constraints. An agent understands what it retrieves, but the description never distinguishes it from the close sibling practitioner_practical_info, which also covers address/phone-style data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no prerequisites, and no named alternative among the many siblings (practitioner_practical_info, find_slots, get_availabilities). The agent must infer the call site from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
practitioner_messagingBRead-only
Catégories de demandes par messagerie Doctolib (renouvellement, résultats…) si le praticien l'a activée.
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered externally. The description adds one genuine behavioral fact – the feature may be disabled by the practitioner, implying empty/absent results – but says nothing about return shape, permissions, or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the identifying information front-loaded and zero filler. It is efficient, though arguably so terse that some clarifying content was dropped rather than truly earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and annotations are minimal, so the description carries the full burden for a read tool. It conveys what is returned and the activation condition but omits return format and what to do when the feature is off, leaving it minimally adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description says nothing about profile_id. However, the single parameter is a self-explanatory practitioner profile id in context, so the gap is mild rather than severe; the description neither compensates nor actively misleads.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('catégories de demandes par messagerie Doctolib') and gives concrete examples (renouvellement, résultats), which distinguishes it from booking/availability siblings. It is a noun phrase rather than a verb+resource, so the action (listing/retrieving) is inferred rather than stated, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no mention of alternatives among the many sibling practitioner tools. The clause 'si le praticien l'a activée' is a condition on results, not a usage decision rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
practitioner_practical_infoARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| profile_id | No | ||
| url_or_slug | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-lookup behavior are covered. The description adds genuinely new behavioral context — the existence of a 'tunnel de réservation' that resolves a slug to a profile — but says nothing about what happens on resolution failure or ambiguous identifiers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first is a dense field inventory, the second handles the parameter contract. The long comma-separated field list is front-loaded but slightly heavy; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of telling the agent what comes back, and it enumerates the returned data categories. Combined with the input-resolution note, an agent has enough to call it correctly; only failure/edge behavior is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it states where profile_id originates (search_practitioners) and that url_or_slug is an alternative resolved through the booking tunnel. It leaves the URL-vs-slug format and the precedence/mutual-exclusivity rule implicit, which is the only real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a practitioner's practical information) and enumerates the concrete fields returned — opening hours, new-patient acceptance, teleconsultation, sector, carte Vitale, payment methods, languages, addresses. That is far more specific than the bare name. It does not, however, distinguish itself from the sibling practitioner_booking_info, which likely covers adjacent territory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the field list, and the second sentence does clarify how to supply the inputs (profile_id from search_practitioners, else url_or_slug). That is parameter-sourcing guidance rather than when-to-use-this-vs-an-alternative guidance; no exclusion or sibling routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_watches_nowA
Lance immédiatement une passe de surveillance (notifie les nouveaux créneaux).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the agent knows this is a mutating, externally interacting operation. The description adds that it runs a monitoring pass and notifies about new slots, but omits auth needs, idempotency, rate limits, and notification delivery details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that immediately states the action and its effect. Every phrase earns its place with no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. For a zero-parameter trigger action, the description adequately covers the purpose and notification effect, though it could specify prerequisites or scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema description coverage is 100%, so the baseline is 4. The description adds no parameter information, which is acceptable because no parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lance') and resource ('passe de surveillance'), plus the notification effect ('notifie les nouveaux créneaux'). Clear what the tool does, but it does not explicitly distinguish itself from sibling watch tools such as watch_practitioner or list_watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The adverb 'immédiatement' implies a manual immediate trigger as opposed to configured or scheduled watches. However, it never states when to use this tool versus watch_practitioner, watch_area, configure_notifications, or when not to use it, leaving usage only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_availabilitiesCRead-only
Variante « vue liste » de Doctolib (7 jours max) avec filtre de régime d'assurance. Réponse brute.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| motive_id | Yes | ||
| agenda_ids | Yes | ||
| practice_id | No | ||
| insurance_sector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only safety profile is covered. The description adds that the response is 'brute' (raw/unformatted), a useful behavioral note, but says nothing about pagination behavior or the external/live nature of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single terse sentence with no wasted words, but it is a fragment ('variante... réponse brute') rather than a front-loaded action statement, and the French phrasing is opaque for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with 0% schema coverage and no output schema, the description covers only two parameters and omits required inputs, usage context, and return format. It is materially incomplete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description only accounts for insurance_sector (the filter) and days (7-day cap). The two required parameters motive_id and agenda_ids, plus practice_id, are entirely undocumented in both schema and description, leaving the agent unable to populate the required inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific Doctolib "liste" variant with an insurance filter and a 7-day cap, which frames the resource and differentiates it from a presumed alternate view (e.g. get_availabilities). However, it never states the core verb/action (searching availability) explicitly, relying on the tool name to convey that.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies an alternative exists ('variante vue liste') but never says when to use this tool versus get_availabilities or find_slots. The 7-day limit and insurance filter are constraints, not usage guidance, and no prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cityBRead-only
Communes françaises par nom ou code postal, avec coordonnées (geo.api.gouv.fr).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety and external-lookup profile is covered. The description adds that results include coordinates and that geo.api.gouv.fr backs it, which is useful context, but says nothing about result limits, ambiguity handling, or matching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence that front-loads the resource and lookup modes. Nothing wasted, though the parenthetical source reference is the least essential part.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. What is missing is routing guidance among the many search/autocomplete siblings and any note on result cardinality, which matters for a lookup tool in this crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'query' parameter, so the schema gives no help. The description partially compensates by stating the two accepted forms (nom or code postal), but gives no format, length, or accent/partial-match semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (French communes) and the two lookup keys (name or postal code), plus what comes back (coordinates) and the data source. It is distinguishable from siblings like geocode_address or place_autocomplete, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, and no mention of the overlapping siblings (geocode_address, autocomplete, place_autocomplete) that an agent would need to disambiguate against. The scope 'françaises' is the only implicit boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_filtersBRead-only
Filtres de recherche proposés par Doctolib pour une spécialité (délais, secteurs, langues, vidéo).
| Name | Required | Description | Default |
|---|---|---|---|
| speciality | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a read-only, open-world operation. The description adds the nature of the returned filters (délais, secteurs, langues, vidéo), which is useful context. However, it does not state authentication needs, rate limits, or response structure beyond what the output schema likely provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence that efficiently conveys the tool's purpose and the kinds of filters returned. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema and annotations, the description gives adequate high-level purpose but misses practical details an agent needs: where to obtain a valid specialty value (e.g., from list_specialities) and any usage constraints. The output schema presumably covers return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage for the single required parameter 'speciality'. The description only says 'pour une spécialité', which restates the parameter name without explaining format, source, or constraints. Minimal compensation for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource: search filters for a given specialty, with examples of filter types (wait times, sectors, languages, video). It is clear enough to distinguish from siblings like list_specialities or search_practitioners, though it lacks an explicit verb and does not name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage context is 'for a specialty', which is implied by the required parameter. There is no when-to-use guidance, no exclusions, and no mention of alternatives such as list_specialities for obtaining valid specialty values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_practitionersARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| city | No | ||
| limit | No | ||
| languages | No | ||
| radius_km | No | ||
| speciality | Yes | ||
| sector_1_only | No | ||
| unscheduled_care | No | ||
| video_consultation | No | ||
| online_booking_only | No | ||
| available_within_days | No | ||
| include_telehealth_kiosks | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already covering safety, the description adds useful behavioral context: result fields, the incomplete available_within_days filter, Doctolib language codes, default exclusion of pharmacy teleconsultation kiosks, and the effect of online_booking_only=False. It stops short of explaining pagination/limit behavior or rate limits, but it significantly enriches the annotation-only baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, followed by result fields and bulleted filter notes. The structure is efficient for a complex search tool, though the result-field list is dense and some parameter gaps remain rather than being addressed compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter search tool with no output schema and 0% schema description coverage, the description gives a useful purpose statement and output overview. However, it leaves many parameters undocumented and omits pagination/limit behavior, so it is only minimally adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 13 parameters, so the description must compensate. It clarifies speciality, location broadly, available_within_days, languages, online_booking_only, and the default telehealth kiosk exclusion, but leaves lat vs lng vs city, radius_km, limit, sector_1_only, unscheduled_care, and video_consultation unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource/scope: find practitioners of a specialty around a location, sorted by distance. It also names the detail-lookup siblings via profile_id → practitioner_practical_info and slug → practitioner_booking_info, so an agent can distinguish this search tool from follow-up tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns and gives filter caveats, but it never says when to choose this tool over siblings such as search_availabilities, find_slots, or get_availabilities. There is no explicit when/when-not guidance or tool-selection routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sitemapBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | sitemap |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful scale context (≈295,000 records, an index plus per-category sitemaps), which warns the agent about large result sets, but it says nothing about pagination, format (XML vs JSON), or error behavior for unknown names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact and front-loaded: it names the resource, gives examples, states the return, and stops. The dense inline list of names with parenthetical counts is slightly cluttered but every element earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the read-only/open-world profile. However, for a tool that can surface hundreds of thousands of URLs, the description omits pagination behavior and the exact nature of the payload, leaving an agent under-informed about how to consume it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the single 'name' parameter has no schema description, so the description must compensate — and it partially does by giving four concrete valid values ('sitemap', 'sitemap_specialities/1', 'sitemap_skills/1', 'sitemap_practitioner_doctors/1'). It still omits patterns, the meaning of the '/1' suffix, or behavior when a nonexistent name is passed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource clearly ('Sitemaps publics Doctolib') and the action ('Renvoie les URL'), and enumerates concrete sitemap names with volume ('≈ 295 000 fiches au total'). It is distinguishable from all siblings, which are search/booking tools, though the phrasing is an example list rather than a crisp one-line purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It never says when to reach for this tool versus alternatives like search_practitioners or list_specialities, nor what prerequisites exist. The enumerated sitemap names only hint at valid inputs, not at usage context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_watchADestructive
Met en pause (ou supprime avec delete=True) une surveillance.
| Name | Required | Description | Default |
|---|---|---|---|
| delete | No | ||
| watch_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true but do not say which path is destructive. The description supplies exactly that missing context: the default behavior is a reversible pause and destruction only occurs with delete=True. It still omits whether a paused watch can be resumed, so it is not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the destructive branch parenthetically front-loaded after the default action. Efficient, though the extreme brevity leaves room that could have been spent on watch_id or pause-resume semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the tool is simple at two parameters. Still, for a mutation tool with 0% schema coverage the description should at minimum clarify what watch_id refers to and whether pausing is reversible; those gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the delete flag's effect (suppression) clearly, but says nothing about watch_id beyond it being required, leaving the key identifying parameter unexplained in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (pause/delete) on a specific resource (une surveillance), and distinguishes the two modes via delete=True. It does not, however, differentiate itself from siblings such as list_watches or run_watches_now, which an agent might confuse when deciding which watch tool to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical 'ou supprime avec delete=True' gives the condition that switches from pause to delete, which is implicit usage guidance. There is no statement of when this tool should be preferred over siblings, nor prerequisites (e.g. watch must exist or belong to the caller).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | ||
| lng | No | ||
| city | No | ||
| days | No | ||
| label | No | ||
| radius_km | No | ||
| speciality | Yes | ||
| sector_1_only | No | ||
| new_patients_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose the mutation profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false). The description adds useful behavioral context beyond that: the watch is area-wide and fires on newly appearing slots, and "à planifier" signals it is scheduled/asynchronous. It still omits what is required for the watch to function (a location source) and how notifications are delivered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the scope (area-wide watch) front-loaded before the trigger condition. The trailing parenthetical about doctolib-mcp-watch is slightly awkward but does not waste much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter mutation tool with no output schema and an asynchronous mode, the description is thin: it never states the location requirement, the meaning of the scheduling parenthetical, or how the agent should follow up. An agent could invoke it, but only by guessing at most parameter semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 9 parameters, so the description must carry the burden. It only indirectly signals speciality ("de la spécialité") and radius ("dans le rayon"); lat, lng, city, days, label, sector_1_only and new_patients_only are never mentioned, and no format or precedence (lat/lng vs city) is given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Surveille TOUTE une zone") and the trigger event (notify on a new slot from any practitioner of the speciality in the radius). The capitalized "TOUTE" implicitly contrasts with the per-practitioner sibling watch_practitioner, but that sibling is never named, so the differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives despite the presence of watch_practitioner, list_watches, run_watches_now and stop_watch. The parenthetical "(via doctolib-mcp-watch, à planifier)" hints at a deferred/scheduled mechanism but does not tell the agent when to pick this tool over its siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| label | No | ||
| before | No | ||
| motive_id | No | ||
| practice_id | No | ||
| url_or_slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the write-but-safe profile is covered. The description adds that registration happens via the external doctolib-mcp-watch mechanism and must be scheduled, which is real context beyond the annotations, but it omits persistence, auth needs, and deduplication behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded and the parameter caveats appended. No filler, though the parenthetical about doctolib-mcp-watch is slightly cryptic rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool that registers an ongoing watch, the description covers the trigger and two parameter behaviors but omits what is returned (watch identifier), how to cancel (stop_watch), and whether watches persist across runs. Adequate for a first call but not fully complete given six parameters and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning and only partially does. It usefully explains motive_id fallback behavior (URL motive, else first bookable motive) and the before=YYYY-MM-DD exclusion rule, but leaves days, label, practice_id, and url_or_slug completely opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ("Surveille") and resource ("praticien"), and states the concrete effect: a notification when a new slot opens. It is distinguishable from watch_area (which watches an area) by naming the practitioner scope, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this versus watch_area, run_watches_now, or list_watches, nor any prerequisites for setting up a watch. The clause "à planifier" hints the watch must be scheduled/run separately but does not say how or via which sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
21 tool updates
v1.0.0- First observed
autocomplete - First observed
booking_link - First observed
configure_notifications - First observed
find_slots - First observed
geocode_address - First observed
get_availabilities - First observed
list_specialities - First observed
list_watches - First observed
place_autocomplete - First observed
practitioner_booking_info - First observed
practitioner_messaging - First observed
practitioner_practical_info - First observed
run_watches_now - First observed
search_availabilities - First observed
search_city - First observed
search_filters - First observed
search_practitioners - First observed
sitemap - First observed
stop_watch - First observed
watch_area - First observed
watch_practitioner
TDQS
Scored across 21 tools
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.
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.
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.
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
Related MCP Connectors
Book medical appointments with French doctors by specialty and city via AI agents.
One API for public web data across social, directories and real estate, as clean JSON.
Find local services, check live availability, and book real appointments with consent.
Access CQC care ratings, NHS health services, and food hygiene data across the UK
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Athena Health's API for comprehensive healthcare practice management. Supports appointment scheduling, provider and department management, patient search, and available slot discovery through natural language.-
- AlicenseAqualityDmaintenanceEnables 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.1041 npmMIT
- AlicenseAqualityBmaintenanceEnables querying the Polish National Health Fund (NFZ) public API for medical waiting lists and service dictionary, allowing AI to compare wait times and find providers.3MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for Doctolib that enables searching practitioners, checking availability, and booking or canceling appointments across Doctolib Germany, France, and Italy.2-