Dispolà MCP
An MCP server that allows AI agents to search for same-day appointment openings for beauty and health services in Quebec, send SMS codes for user consent, and confirm bookings via text message without requiring user authentication.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://dispola.ca/mcpWhat you can do with it
- Search for available appointment slots by city and category
- Send SMS verification codes to users for consent
- Confirm appointment requests via text message
- Propose time limits for automated booking mandates
Source and maintenance
Protocol and capabilities
- Server
- dispola 1.2.0
- MCP protocol
- 2025-06-18
- Tools
- 7 advertised
- Resources
- 1 advertised
- Resource templates
- 0 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": false
},
"resources": {
"listChanged": false
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
7 advertised
chercher_places — Chercher des places libres
Cherche les places libres d'une ville, par catégorie, jour, moment et quartier. Rend l'établissement, le quartier, le service, l'heure, la durée, le prix et le lien pour réserver. Avec une catégorie, rend aussi sur_demande : des commerces sans réservation en ligne, avec des moments estimés à confirmer. / Finds open appointment spots in a city, by category, day, time of day and neighbourhood, with the booking link. With a category, also returns sur_demande: businesses without online booking, with estimated times to be confirmed by phone.
{
"type": "object",
"required": [
"ville"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude, avec lng : trie du plus proche au plus loin. / Latitude, with lng: sorts nearest first."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude, avec lat. / Longitude, with lat."
},
"jour": {
"type": "string",
"pattern": "^(aujourdhui|demain|\\d{4}-\\d{2}-\\d{2})$",
"description": "aujourdhui, demain ou AAAA-MM-JJ (heure de Montréal). / today, tomorrow or YYYY-MM-DD."
},
"ville": {
"enum": [
"montreal",
"quebec",
"sherbrooke",
"gatineau",
"rive-nord",
"rive-sud",
"ailleurs"
],
"type": "string",
"description": "La ville, ou ailleurs : ailleurs au Québec, hors des villes du site (Trois-Rivières, Granby, Saguenay...) ; donne alors la ville de la personne dans quartier, ou lat et lng. / The city, or ailleurs: elsewhere in Quebec; then give the person's town in quartier, or lat and lng."
},
"limite": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Nombre de places, 10 par défaut. / Max spots, default 10."
},
"moment": {
"enum": [
"am",
"pm",
"soir"
],
"type": "string",
"description": "am : avant midi ; pm : de midi à 17 h ; soir : après 17 h. / morning, afternoon, evening."
},
"quartier": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "Un quartier, par exemple Plateau ou Limoilou : trie du plus proche au plus loin. / A neighbourhood: sorts nearest first."
},
"categorie": {
"enum": [
"coiffure",
"ongles",
"cils",
"sourcils",
"esthetique",
"massotherapie",
"tatouage",
"physiotherapie",
"osteopathie",
"kinesiologie",
"therapie_sport",
"chiropratique",
"acupuncture"
],
"type": "string",
"description": "La catégorie (voir categories_et_villes). / The category."
}
},
"additionalProperties": false
}{
"title": "Chercher des places libres",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}categories_et_villes — Catégories et villes
Les villes, les catégories et leurs services, avec le nombre de places libres par ville et par catégorie d'ici 7 jours. / Cities, categories and services, with the number of open spots per city and category over the next 7 days.
{
"type": "object",
"properties": {},
"additionalProperties": false
}{
"title": "Catégories et villes",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}lien_alerte_texto — Lien d'alerte texto
Construit le lien du formulaire prérempli d'alerte texto quand aucune place ne convient. La personne l'ouvre, entre elle-même son cellulaire et consent aux textos ; l'outil ne soumet rien. / Builds a prefilled text alert form link; the person enters their own number and consents. The tool submits nothing.
{
"type": "object",
"required": [
"ville"
],
"properties": {
"jour": {
"type": "string",
"pattern": "^(aujourdhui|demain|\\d{4}-\\d{2}-\\d{2})$",
"description": "aujourdhui, demain ou AAAA-MM-JJ (heure de Montréal). / today, tomorrow or YYYY-MM-DD."
},
"ville": {
"enum": [
"montreal",
"quebec",
"sherbrooke",
"gatineau",
"rive-nord",
"rive-sud"
],
"type": "string",
"description": "La ville. / The city."
},
"langue": {
"enum": [
"fr",
"en"
],
"type": "string",
"default": "fr",
"description": "Langue du formulaire. / Form language."
},
"moment": {
"enum": [
"am",
"pm",
"soir"
],
"type": "string",
"description": "am : avant midi ; pm : de midi à 17 h ; soir : après 17 h. / morning, afternoon, evening."
},
"service": {
"enum": [
"coiffure.coupe_femme",
"coiffure.coupe_homme",
"coiffure.coloration",
"coiffure.mise_en_plis",
"coiffure.barbe",
"ongles.gel",
"ongles.manucure",
"ongles.remplissage",
"ongles.pedicure",
"cils.classique",
"cils.hybride",
"cils.volume",
"cils.remplissage",
"cils.rehaussement",
"sourcils.restructuration",
"sourcils.teinture",
"sourcils.laminage",
"sourcils.fil",
"esthetique.soin_visage",
"esthetique.cire",
"esthetique.bresilienne",
"massotherapie.suedois",
"massotherapie.therapeutique",
"massotherapie.tissus_profonds",
"massotherapie.prenatal",
"massotherapie.sportif",
"massotherapie.drainage_lymphatique",
"massotherapie.orthotherapie",
"massotherapie.kinesitherapie",
"tatouage.flash",
"tatouage.petit",
"tatouage.retouche",
"physiotherapie.evaluation",
"physiotherapie.traitement",
"osteopathie.traitement",
"kinesiologie.seance",
"kinesiologie.evaluation",
"kinesiologie.entrainement",
"therapie_sport.traitement",
"chiropratique.traitement",
"acupuncture.seance"
],
"type": "string",
"description": "Le code du service, par exemple ongles.gel (voir categories_et_villes). / Service code."
},
"quartier": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "Le quartier de la personne. / Their neighbourhood."
}
},
"additionalProperties": false
}{
"title": "Lien d'alerte texto",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}preparer_demande — Préparer une demande sur demande
Bâtit le lien de la demande chez un commerce sans réservation en ligne (sur_demande de chercher_places), avec les heures, le service et le lieu de la personne déjà choisis. La personne l'ouvre, vérifie, entre elle-même son prénom et son cellulaire et consent ; Dispolà appelle le commerce et lui texte l'heure confirmée. L'outil ne soumet rien. / Builds the prefilled request link for a business without online booking, with the person's times, service and location filled in. The person opens it, enters their own name and number and consents; Dispolà calls the business. The tool submits nothing.
{
"type": "object",
"required": [
"commerce"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude de la personne, avec lng (arrondie à 100 m). / Latitude, with lng."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude, avec lat. / Longitude, with lat."
},
"lieu": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "Où est la personne : code postal ou quartier, pour un commerce de rechange proche d’elle. / Postal code or neighbourhood."
},
"heures": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(,\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}){0,11}$",
"description": "Les heures qui vont à la personne, prises dans moments de sur_demande, séparées par des virgules : au moins 2, en cas que la première soit prise. Ex. 2026-10-29T14:00,2026-10-29T15:00. / Times from sur_demande moments, comma-separated, at least 2."
},
"langue": {
"enum": [
"fr",
"en"
],
"type": "string",
"default": "fr",
"description": "Langue du formulaire. / Form language."
},
"service": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "Le service précis (champ services de sur_demande, ex. coupe-courts). / Precise service code."
},
"commerce": {
"type": "string",
"pattern": "^[a-z0-9-]{1,120}$",
"description": "Le code du commerce (champ commerce de sur_demande). / Business code (commerce field of sur_demande)."
}
},
"additionalProperties": false
}{
"title": "Préparer une demande sur demande",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}envoyer_code — Envoyer le code texto de la demande
Prépare la demande chez un commerce sur demande et texte à la personne un code à 6 chiffres, avec le texte exact de son accord. La personne lit ce code, et confirmer_code envoie la demande. Le prénom et le cellulaire sont ceux de la personne, pour elle-même. Avec mandat (la clé de confirmer_code après proposer_limites) et accepter_seul, une demande qui respecte toutes ses limites part sans code. / Prepares the request and texts the person a 6-digit code with the exact consent wording; confirmer_code sends it with that code. With a mandate key and auto-accept, a request within all their signed limits is sent without a code.
{
"type": "object",
"required": [
"commerce",
"heures",
"service"
],
"properties": {
"lat": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude, avec lng. / Latitude."
},
"lng": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude, avec lat. / Longitude."
},
"lieu": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "Où est la personne : code postal ou quartier. / Postal code or neighbourhood."
},
"heures": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(,\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}){0,11}$",
"description": "Au moins 2 heures de moments, séparées par des virgules, qui vont toutes à la personne. / At least 2 times from moments, comma-separated."
},
"langue": {
"enum": [
"fr",
"en"
],
"type": "string",
"default": "fr",
"description": "Langue des textos. / Text language."
},
"mandat": {
"type": "string",
"maxLength": 120,
"minLength": 20,
"description": "La clé mandat rendue par confirmer_code après proposer_limites. / Mandate key."
},
"prenom": {
"type": "string",
"maxLength": 30,
"minLength": 1,
"description": "Le prénom de la personne. / Their first name."
},
"service": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}$",
"description": "Le service précis (champ services de sur_demande). / Precise service code."
},
"commerce": {
"type": "string",
"pattern": "^[a-z0-9-]{1,120}$",
"description": "Le code du commerce (champ commerce de sur_demande). / Business code."
},
"cellulaire": {
"type": "string",
"maxLength": 20,
"minLength": 10,
"description": "Son cellulaire, Canada ou États-Unis. / Their mobile number."
}
},
"additionalProperties": false
}{
"title": "Envoyer le code texto de la demande",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}confirmer_code — Confirmer avec le code texto
Vérifie le code à 6 chiffres que la personne a reçu par texto après envoyer_code ou proposer_limites. Avec le bon code, une demande part chez Dispolà, qui appelle le commerce, ou des limites deviennent actives et l'outil rend la clé mandat. Un mauvais code est refusé. / Checks the 6-digit code the person received by text. Sends the request, or activates their limits and returns the mandate key. A wrong code is rejected.
{
"type": "object",
"required": [
"reference",
"code"
],
"properties": {
"code": {
"type": "string",
"pattern": "^\\s*\\d{6}\\s*$",
"description": "Les 6 chiffres reçus par la personne. / The 6 digits."
},
"reference": {
"type": "string",
"pattern": "^[dm]\\d{1,12}-[A-Za-z0-9_-]{20,40}$",
"description": "La référence rendue par envoyer_code ou proposer_limites. / The reference returned earlier."
}
},
"additionalProperties": false
}{
"title": "Confirmer avec le code texto",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}proposer_limites — Proposer des limites à signer
Propose les limites dans lesquelles un agent peut demander pour la personne (le mandat ouvert d'AP2) : catégorie, services, jours (au plus 14), heures, lieu et rayon, prix max, et envoi sans code ou non. Dispolà les lui texte mot pour mot avec un code ; confirmer_code, avec ce code, rend la clé mandat. La personne peut tout annuler en textant STOP AGENT. / Proposes limits within which an agent may request on the person's behalf, texted to them word for word and signed with a text code.
{
"type": "object",
"required": [
"prenom",
"cellulaire",
"ville",
"categorie"
],
"properties": {
"au": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Dernier jour, au plus 14 jours d'ici. Les limites expirent ce soir-là. / Last day; limits expire that night."
},
"du": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Premier jour, AAAA-MM-JJ. Demain par défaut. / First day."
},
"lieu": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "Code postal ou quartier de la personne. / Postal code or neighbourhood."
},
"apres": {
"type": "string",
"pattern": "^\\d{2}:\\d{2}$",
"description": "Pas avant cette heure, HH:MM. / Not before."
},
"avant": {
"type": "string",
"pattern": "^\\d{2}:\\d{2}$",
"description": "Pas après cette heure, HH:MM. / Not after."
},
"ville": {
"enum": [
"montreal",
"quebec",
"sherbrooke",
"gatineau",
"rive-nord",
"rive-sud",
"ailleurs"
],
"type": "string",
"description": "La ville. / The city."
},
"langue": {
"enum": [
"fr",
"en"
],
"type": "string",
"default": "fr",
"description": "Langue des textos. / Text language."
},
"prenom": {
"type": "string",
"maxLength": 30,
"minLength": 1,
"description": "Le prénom de la personne. / Their first name."
},
"prix_max": {
"type": "integer",
"maximum": 1000,
"minimum": 5,
"description": "Prix max en dollars. Inconnu d’avance chez un commerce sur demande : Léon le vérifie au téléphone. / Max price."
},
"rayon_km": {
"type": "number",
"maximum": 25,
"minimum": 0.5,
"description": "Distance max du lieu, 3 km par défaut. / Max distance."
},
"services": {
"type": "string",
"pattern": "^[a-z0-9-]{1,40}(,[a-z0-9-]{1,40}){0,9}$",
"description": "Les services permis (codes de services de sur_demande), séparés par des virgules. Sans : toute la catégorie. / Allowed service codes."
},
"categorie": {
"enum": [
"coiffure",
"ongles",
"cils",
"sourcils",
"esthetique",
"massotherapie",
"tatouage",
"physiotherapie",
"osteopathie",
"kinesiologie",
"therapie_sport",
"chiropratique",
"acupuncture"
],
"type": "string",
"description": "La catégorie. / The category."
},
"cellulaire": {
"type": "string",
"maxLength": 20,
"minLength": 10,
"description": "Son cellulaire. / Their mobile number."
},
"accepter_seul": {
"enum": [
"oui",
"non"
],
"type": "string",
"default": "non",
"description": "oui : une demande qui respecte tout part sans code. non : un code à chaque demande. / Auto-accept."
}
},
"additionalProperties": false
}{
"title": "Proposer des limites à signer",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}Prompts
Not advertised
Resources
1 advertised
places — Places libres en cartes
Les places de chercher_places en cartes : établissement, quartier, heure, prix et bouton pour réserver ; les commerces sur demande avec leurs heures à cocher. / Open spots as cards with a booking button.
ui://dispola/places.html30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 253 ms
- 95th percentile latency
- 253 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 253 ms · metadata changed · 7 tool(s), 1 resource(s), 0 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http dispola-mcp https://dispola.ca/mcpCodex
codex mcp add dispola-mcp --url https://dispola.ca/mcpCursor
{
"mcpServers": {
"dispola-mcp": {
"url": "https://dispola.ca/mcp"
}
}
}Cline
{
"mcpServers": {
"dispola-mcp": {
"type": "streamableHttp",
"url": "https://dispola.ca/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"dispola-mcp": {
"type": "http",
"url": "https://dispola.ca/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http dispola-mcp https://dispola.ca/mcpClaude Desktop
{
"mcpServers": {
"dispola-mcp": {
"url": "https://dispola.ca/mcp"
}
}
}Windsurf
{
"mcpServers": {
"dispola-mcp": {
"serverUrl": "https://dispola.ca/mcp"
}
}
}Let your agent find its tools
Find servers like Dispolà MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Dispolà MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.