Koskamo

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.

Dispolà MCP logo, by DispolàVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Dispolà
MCP endpoint (Streamable HTTP)
https://dispola.ca/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 1.0.0

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
Server-advertised capabilities
{
  "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.

Dispolà : les places libres aujourd'hui, demain et cette semaine (annulations, trous d'horaire) chez les pros du Grand Montréal, de Québec, Sherbrooke, Gatineau et d'ailleurs au Québec (ville ailleurs) : coiffure, ongles, cils, sourcils, esthétique, massothérapie, tatouage, physiothérapie, ostéopathie, kinésiologie, thérapie du sport, chiropratique, acupuncture. 1. chercher_places : les places qui conviennent. Donne à la personne l'établissement, l'heure, le prix et le lien booking_url : c'est elle qui réserve. 2. sur_demande (avec une catégorie, jamais pour aujourd'hui) : des commerces sans réservation en ligne, avec des moments estimés à confirmer. Ce ne sont pas des places. Deux façons de demander : a. Sans quitter la conversation : envoyer_code avec le commerce, au moins 2 heures, le service, et le prénom et le cellulaire que la personne t'a donnés. Dispolà lui texte un code avec le texte exact de l'accord ; elle te le lit, et confirmer_code envoie la demande. Ne devine jamais un code, ne l'invente pas : c'est la personne qui le lit. b. preparer_demande : un lien prérempli qu'elle ouvre, vérifie, et où elle entre elle-même son prénom et son cellulaire et coche le consentement. Ne soumets jamais le formulaire à sa place. Dispolà appelle le commerce et texte l'heure confirmée à la personne, d'habitude dans la journée. 3. Aucune place qui convient : lien_alerte_texto donne un formulaire prérempli. La personne y entre elle-même son cellulaire et consent aux textos ; ne soumets jamais le formulaire à sa place. 4. categories_et_villes : ce qui existe, avec le nombre de places. 5. proposer_limites : la personne signe d'avance, par code texto, ce que tu peux demander pour elle (catégorie, services, jours, heures, lieu, prix max, au plus 14 jours). confirmer_code te rend une clé mandat ; avec accepter_seul, envoyer_code (mandat) envoie seul une demande qui respecte toutes les limites, et la personne reçoit un texto. Dispolà vérifie chaque limite, ligne par ligne. Chaque place a un champ pourquoi : les filtres qu'elle respecte, à expliquer à la personne. Pour essayer sans rien envoyer : /mcp/essai (fausses places, code 000000). Heures à l'heure de Montréal. Prix en dollars canadiens, au prix du ou de la pro. English: open appointment spots today, tomorrow and this week in Greater Montreal, Quebec City, Sherbrooke, Gatineau and elsewhere in Quebec (hair, nails, lashes, brows, skin care, massage, tattoo, physio, osteo, kinesiology, athletic therapy, chiropractic, acupuncture). Search with chercher_places and give the person the booking_url: they book themselves. With a category it may also return sur_demande: businesses without online booking and estimated times, not open spots. To request one without leaving the chat, envoyer_code texts the person a code with the exact consent wording; they read it to you and confirmer_code sends the request. Or preparer_demande builds a prefilled link where they enter their own name and number and consent. Dispolà calls the business and texts the confirmed time. proposer_limites lets the person sign, by text code, limits within which you may request on their behalf. Sandbox: /mcp/essai. Nothing fits: lien_alerte_texto builds a prefilled text alert form; the person enters their own number and consents. Never submit it for them.

Tools

7 advertised

chercher_places — Chercher des places libres
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

chercher_places input schema
{
  "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
}
chercher_places annotations
{
  "title": "Chercher des places libres",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
categories_et_villes — Catégories et villes
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

categories_et_villes input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
categories_et_villes annotations
{
  "title": "Catégories et villes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
lien_alerte_texto — Lien d'alerte texto
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

lien_alerte_texto input schema
{
  "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
}
lien_alerte_texto annotations
{
  "title": "Lien d'alerte texto",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
preparer_demande — Préparer une demande sur demande
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

preparer_demande input schema
{
  "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
}
preparer_demande annotations
{
  "title": "Préparer une demande sur demande",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
envoyer_code — Envoyer le code texto de la demande
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

envoyer_code input schema
{
  "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
}
envoyer_code annotations
{
  "title": "Envoyer le code texto de la demande",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
confirmer_code — Confirmer avec le code texto
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

confirmer_code input schema
{
  "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
}
confirmer_code annotations
{
  "title": "Confirmer avec le code texto",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}
proposer_limites — Proposer des limites à signer
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

proposer_limites input schema
{
  "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
}
proposer_limites annotations
{
  "title": "Proposer des limites à signer",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

places — Places libres en cartes

Advertised by the server during the last successful anonymous check.

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.

places URI
ui://dispola/places.html

MIME type: text/html;profile=mcp-app

30-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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http dispola-mcp https://dispola.ca/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add dispola-mcp --url https://dispola.ca/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable dispola-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "dispola-mcp": {
      "url": "https://dispola.ca/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "dispola-mcp": {
      "type": "streamableHttp",
      "url": "https://dispola.ca/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start dispola-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "dispola-mcp": {
      "type": "http",
      "url": "https://dispola.ca/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http dispola-mcp https://dispola.ca/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "dispola-mcp": {
      "url": "https://dispola.ca/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing