Skip to main content
Glama

clicknglide-mcp

An unofficial local MCP server (stdio) for Click n' Glide, the online planning tool used by gliding clubs. It lets an AI assistant such as Grok Bot read and, with explicit confirmation, manage your club's planning and messages.

Not affiliated with Click n' Glide. This project is community-made and is not endorsed or supported by Click n' Glide.

What it does

  • Official API (https://api.clicknglide.com, plus https://clicknglide.com/api/forum_conversations): one tool per documented endpoint (Postman docs).

  • Messenger (not covered by the API): drives the Click n' Glide web app (https://app.clicknglide.com) in a headless Chromium browser with Playwright, logged in with your own account.

Related MCP server: Cloudflare Playwright MCP

Skills

Ready-made assistant skills for this connector (generic ones in English, plus an example club configuration in French) are in skills/.

Tools

Area

Tools

Signups

get_signups, get_signups_range, add_signup, add_freetext_signup, add_freetext_signups_bulk, update_signup, delete_signup, delete_signup_by_user, delete_all_field_signups

Daily forum

get_daily_forum, post_daily_forum_message, update_daily_forum_message, delete_daily_forum_message

Members & roles

get_users, create_user, update_user, delete_user, get_roles

Events

get_next_events, create_event, update_event, delete_event

General forum

get_forum_conversations

Quota

get_api_usage (local counter, no API call)

Messenger (browser)

list_messages (inbox / sent / all, paginated), read_message, list_recipients, send_message

Tool descriptions are in French.

Important limits and caveats

  • API key: it is provided by Click n' Glide support on request, is attached to your club and grants full administrator rights. Treat it like a password.

  • API rate limits: 20 calls per minute and 300 per day. The server has a built-in limiter with a persistent daily counter (state/api-usage.json); it only counts calls made through this server.

  • Messenger: uses a headless browser with your login and password. The browser session is kept in state/browser-profile/; delete that folder to log out. It relies on the web app's current structure and may break if Click n' Glide changes its site. Selectors live in clicknglide_mcp/selectors.py and can be overridden in state/selectors.json without touching the code.

  • Login safety: on a captcha, 2FA prompt, wrong password or too many attempts, the server stops with an explicit error. It never tries to bypass them.

  • confirm: true guard: every tool that creates, updates, deletes or sends requires confirm: true. Without it, the tool only returns a preview (the exact request, or the resolved recipient list for send_message) and does nothing.

  • read_message does not mark the conversation as read unless mark_as_read: true.

  • Actually sending a message has not been tested yet. Filling in the compose form was tested (stopping before the send button). Try your first real send with a short message to yourself.

Installation

Requires Python 3.11+.

git clone https://github.com/NicolasMassart/clicknglide-mcp.git
cd clicknglide-mcp
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/python -m playwright install --with-deps chromium   # --with-deps installs system libraries on Linux

Add it to Grok Bot (local stdio connector)

  • command: /absolute/path/to/clicknglide-mcp/.venv/bin/python

  • args: ["-m", "clicknglide_mcp"]

  • environment variables:

Variable

Required for

Description

CLICKNGLIDE_API_KEY

API tools

Club API key from Click n' Glide support

CLICKNGLIDE_LOGIN

Messenger tools

Your Click n' Glide login email

CLICKNGLIDE_PASSWORD

Messenger tools

Your Click n' Glide password

CLICKNGLIDE_STATE_DIR

optional

Where the browser session, counter and debug screenshots go (default: ./state)

Optional: CLICKNGLIDE_SELECTORS_FILE (selector overrides) and CLICKNGLIDE_LOG_LEVEL (logs go to stderr).

Secrets are read from the environment at call time and are never written to disk or logged. The server starts without them; the affected tools return a clear error. On failure, debug screenshots may be saved in state/debug/; they can contain your club's data.

Quick test

.venv/bin/python tests/smoke_client.py               # tools/list + preview, no API call
.venv/bin/python tests/smoke_client.py --api         # also 3 read-only API calls
.venv/bin/python tests/smoke_client.py --messenger   # also read-only messenger listing

En français

Serveur MCP local (stdio) non officiel pour Click n' Glide, l'outil de planning des clubs de vol à voile. Ce projet n'est pas affilié à Click n' Glide.

  • Ce qu'il fait : il expose toutes les fonctions de l'API officielle (inscriptions, forum du jour, membres, rôles, événements, forum général). Il donne aussi accès à la messagerie, qui n'est pas dans l'API, via un navigateur headless connecté avec votre propre compte : list_messages, read_message, list_recipients et send_message.

  • Clé API : elle est fournie par le support Click n' Glide, rattachée au club, et donne des droits d'administrateur. Elle doit rester secrète.

  • Limites de l'API : 20 appels par minute et 300 par jour. Un limiteur intégré tient un compteur journalier persistant.

  • Messagerie : elle passe par un navigateur headless et peut casser si Click n' Glide modifie son site. Les sélecteurs peuvent être ajustés dans state/selectors.json. En cas de captcha ou de 2FA, le serveur s'arrête avec une erreur, sans jamais contourner.

  • Garde-fou confirm: true : toute création, modification, suppression ou tout envoi exige confirm: true. Sinon, l'outil renvoie seulement un aperçu.

  • L'envoi réel d'un message n'a pas encore été testé : seul le remplissage du formulaire l'a été. Faites un premier essai vers vous-même.

  • Installation : python3 -m venv .venv, puis .venv/bin/pip install -e ., puis .venv/bin/python -m playwright install --with-deps chromium.

  • Skills : des skills prêtes à l'emploi sont dans skills/, génériques en anglais et exemple de club en français.

  • Ajout dans Grok Bot comme connecteur local stdio :

    • command : /chemin/absolu/clicknglide-mcp/.venv/bin/python

    • args : ["-m", "clicknglide_mcp"]

    • variables : CLICKNGLIDE_API_KEY, CLICKNGLIDE_LOGIN, CLICKNGLIDE_PASSWORD et, en option, CLICKNGLIDE_STATE_DIR.

License

MIT © 2026 Nicolas Massart

Available Tools

28 tools
add_freetext_signupB

Ajoute une ligne de texte libre dans un champ « texte libre » d'une journée (ex. un vol d'initiation « M. Dupont 15h 30 min »). Sans confirm=true : aperçu seulement.

Inputs: date (required), text (required), field_id (required), confirm.

add_freetext_signups_bulkA

Ajoute plusieurs lignes de texte libre d'un coup dans un champ « texte libre » d'une journée. Sans confirm=true : aperçu seulement.

Inputs: date (required), texts (required), field_id (required), confirm.

add_signupB

Inscrit un membre (user_id) dans un champ « membre » (field_id) d'une journée, avec paramètre et commentaire optionnels. Peut envoyer des emails automatiques (confirmation, liste d'attente). Sans confirm=true : aperçu seulement.

Inputs: date (required), user_id (required), field_id (required), confirm, +2 more.

create_eventA

Crée un événement à une date (AAAA-MM-JJ) avec un titre et une durée en jours. Sans confirm=true : aperçu seulement.

Inputs: date (required), title (required), confirm, duration.

create_userB

Crée un membre (un email d'activation lui est envoyé). roles = liste d'identifiants de rôles (voir get_roles). Sans confirm=true : aperçu seulement.

Inputs: name (required), email (required), first_name (required), roles, +3 more.

delete_all_field_signupsA

Supprime TOUTES les inscriptions d'un champ pour une journée. send_emails (vrai par défaut) prévient chaque membre par email. Sans confirm=true : aperçu seulement.

Inputs: date (required), field_id (required), confirm, send_emails.

delete_daily_forum_messageA

Supprime un message du forum du jour. Sans confirm=true : aperçu seulement.

Inputs: message_id (required), confirm.

delete_eventA

Supprime un événement. delete_all=true supprime toutes les occurrences d'un événement sur plusieurs jours. Sans confirm=true : aperçu seulement.

Inputs: event_id (required), confirm, delete_all.

delete_signupA

Supprime une inscription par son identifiant. send_emails (vrai par défaut) prévient les membres concernés par email. Sans confirm=true : aperçu seulement.

Inputs: signup_id (required), confirm, send_emails.

delete_signup_by_userA

Supprime l'inscription d'un membre dans un champ donné d'une journée. send_emails (vrai par défaut) prévient par email. Sans confirm=true : aperçu seulement.

Inputs: date (required), user_id (required), field_id (required), confirm, +1 more.

delete_userA

Supprime un membre du club. Irréversible. Sans confirm=true : aperçu seulement.

Inputs: user_id (required), confirm.

get_api_usageA

Indique la consommation locale du quota API (appels aujourd'hui / 300, dernière minute / 20). N'appelle pas l'API.

Inputs: no named parameters.

get_daily_forumA

Lit les messages du forum d'une journée (AAAA-MM-JJ). Lecture seule (1 appel API).

Inputs: date (required).

get_forum_conversationsB

Lit les conversations du forum général du club avec leurs messages. Lecture seule (1 appel API).

Inputs: no named parameters.

get_next_eventsA

Liste les prochains événements du club, regroupés par date. Lecture seule (1 appel API).

Inputs: no named parameters.

get_rolesA

Liste les rôles du club (identifiant et nom). Lecture seule (1 appel API).

Inputs: no named parameters.

get_signupsA

Liste les champs du planning et les inscriptions d'une journée (date AAAA-MM-JJ). Lecture seule (1 appel API).

Inputs: date (required).

get_signups_rangeB

Liste les inscriptions sur une plage de dates (AAAA-MM-JJ, bornes incluses). Lecture seule (1 appel API).

Inputs: end_date (required), start_date (required).

get_usersA

Liste les membres du club (nom, email, téléphone, rôles, dernière visite). Données personnelles. Lecture seule (1 appel API).

Inputs: no named parameters.

list_messagesA

Liste les conversations de la messagerie Click n' Glide (messages envoyés aussi par email), les plus récentes d'abord. folder : « inbox » (reçus), « sent » (où j'ai écrit) ou « all ». Paginé (page, page_size ≤ 100). N'ouvre aucune conversation : rien n'est marqué comme lu. Utilise le navigateur headless (pas le quota API).

Inputs: page, folder, page_size, unread_only.

list_recipientsB

Liste les destinataires sélectionnables dans la messagerie : membres (id, nom, rôles) et groupes (« Tous » et un groupe par rôle, avec le nombre de membres).

Inputs: no named parameters.

post_daily_forum_messageB

Publie un message dans le forum d'une journée, au nom du membre user_id. Sans confirm=true : aperçu seulement.

Inputs: date (required), text (required), user_id (required), confirm.

read_messageA

Lit une conversation complète de la messagerie (tous les messages, du plus ancien au plus récent). Par défaut ne la marque pas comme lue ; mark_as_read=true l'ouvre dans l'application pour la marquer lue.

Inputs: conversation_id (required), include_html, mark_as_read.

send_messageA

Envoie un nouveau message via la messagerie Click n' Glide (il part aussi par email). Destinataires : recipient_ids et/ou recipient_names (prénom nom) et/ou groups (clés de list_recipients, « * » = tous). Sans confirm=true : renvoie seulement l'aperçu avec la liste résolue des destinataires, rien n'est envoyé.

Inputs: text (required), subject (required), groups, confirm, +2 more.

update_daily_forum_messageA

Modifie le texte d'un message du forum du jour. Sans confirm=true : aperçu seulement.

Inputs: text (required), message_id (required), confirm.

update_eventA

Modifie un événement (identifiant = fieldId renvoyé par get_next_events). La doc n'illustre que le titre ; date et durée sont transmises si fournies. Sans confirm=true : aperçu seulement.

Inputs: event_id (required), date, title, confirm, +1 more.

update_signupA

Modifie une inscription existante (paramètre et/ou commentaire). Peut déplacer des membres en liste d'attente et envoyer des emails. Sans confirm=true : aperçu seulement.

Inputs: signup_id (required), confirm, signup_comment, signup_parameter.

update_userA

Modifie un membre (prénom, nom, téléphone, rôles). roles REMPLACE la liste complète des rôles (identifiants, voir get_roles). Sans confirm=true : aperçu seulement.

Inputs: user_id (required), name, roles, confirm, +2 more.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 28 tools

    Disambiguation4/5

    Most tools target distinct resources and actions, but there is clustering: delete_signup vs delete_signup_by_user vs delete_all_field_signups, and get_daily_forum vs get_forum_conversations vs list_messages require careful reading. The descriptions do help clarify boundaries, keeping misselection risk moderate.

    Naming Consistency4/5

    Consistent snake_case verb_noun pattern overall (get_/create_/update_/delete_/add_/list_/send_). Minor deviations: reads mix get_* and list_*, and creation mixes add_* (signups) with create_* (users, events).

    Tool Count3/5

    28 tools is on the heavy side and exceeds the 15-tool comfort zone, but the surface spans six real sub-domains (forum, signups, users, events, messaging, API usage), so it is defensible rather than bloated. A few delete/add variants could likely be consolidated.

    Completeness4/5

    Strong CRUD coverage for users, events, and signups, plus read/write for daily forum and full messaging (list/read/recipients/send). Minor gaps: general forum conversations are read-only and roles are read-only, but these are reasonable and workaroundable.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables AI assistants to control a browser through Playwright automation tools, allowing them to perform web tasks like navigation, typing, clicking, and taking screenshots. Deployed on Cloudflare Workers and compatible with various AI platforms including Claude Desktop and VS Code.
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables an AI assistant to run tasks on a hosted cloud desktop that belongs to the user, with a browser that stays signed in to their accounts, its own email address, and its own files, so it can fill forms, download and edit documents, and carry out long jobs that outlast a chat reply, returning answers with screenshots and recordings. It also exposes tools for checking current activity, task history, sent mail, interrupting a run, and saving or recalling notes, reached over OAuth-authenticated Streamable HTTP or a stdio bridge.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to drive your own signed-in ChatGPT web account — asking questions, continuing chats, attaching files, toggling thinking or web search, creating images, transcribing recordings of any length, reading replies aloud, and managing conversations, memories and projects. It runs against a local Chrome tab on chatgpt.com and reports live progress and step-named errors back to the client.
      2
      MIT