LocalCan

officiel

Fournit aux agents IA des URLs publiques (tunnels) pour localhost, inspection du trafic HTTP en direct, publication de snapshots et contrôle d'accès.

Que pouvez-vous faire avec LocalCan MCP ?

  • Inspectez le trafic capturé — Demandez à votre assistant de lister les échanges récents avec list_traffic ou de récupérer une requête/réponse complète via get_exchange au format markdown, curl ou HAR.
  • Gérez les tunnels publics — Créez, mettez en pause, reprenez ou supprimez des URL publiques avec des outils comme create_public_url et pause_public_url, y compris la définition d'en-têtes de requête personnalisés.
  • Publiez et actualisez les instantanés — Déployez un dossier en tant qu'instantané partageable avec publish_snapshot, puis mettez-le à jour ultérieurement avec update_snapshot afin que les liens d'aperçu restent à jour.
  • Contrôlez l'accès et les commentaires — Protégez une URL par mot de passe avec set_password, examinez les fils de commentaires via list_comments, et répondez-y ou résolvez-les directement depuis votre assistant.
  • Vérifiez l'état du tunnel et du service — Utilisez get_status pour confirmer que la capture est en cours, ou list_public_urls pour voir quels liens sont actifs, en pause ou servent des instantanés.

Documentation

Serveur MCP

Exécutez le serveur Model Context Protocol de LocalCan et connectez-le à votre hôte MCP, avec une référence complète des outils et des commutateurs.

localcan mcp exécute un serveur Model Context Protocol sur stdio. Un hôte MCP (Claude Code, Codex, Cursor, Claude Desktop, et autres) le lance et appelle les outils de LocalCan pour lire le trafic capturé, gérer les URL publiques (tunnels) et publier des Snapshots. LocalCan doit être en cours d'exécution pour que les outils renvoient des données, alors ouvrez l'application de bureau ou exécutez localcan start -d d'abord.

Outils

Le serveur expose vingt-six outils. La lecture fonctionne immédiatement. Les seize outils qui modifient des choses nécessitent un accès en écriture, désactivé par défaut (voir les commutateurs ci-dessous). La création ou l'ajout d'une URL publique nécessite une licence active. La publication d'un Snapshot et la protection par mot de passe d'une URL nécessitent un plan d'abonnement, donc une licence perpétuelle est refusée même si elle peut toujours ouvrir des URL publiques. Sans licence, les outils restreints renvoient un message d'activation clair, tandis que la mise en pause, la reprise et la suppression des URL existantes fonctionnent toujours.

Trafic :

OutilCe qu'il faitParamètres
get_statusIndique si la capture est activée et la quantité de trafic mise en mémoire tampon.aucun
enable_captureActive la capture. La capture est désactivée par défaut et se réinitialise au redémarrage du démon.aucun
list_trafficListe les échanges récents, du plus récent au plus ancien.last (défaut 20), host sous-chaîne, project identifiant, method, status (code exact ou une classe comme 5xx)
get_exchangeRenvoie un échange par identifiant.id requis (identifiant complet ou tout préfixe unique), format un parmi markdown, curl, http, har, json (défaut markdown), include_response (défaut true)

Un échange est la requête que LocalCan a transmise à votre backend, pas une copie octet pour octet de la requête originale du client. Voir Trafic pour le modèle de données.

URL publiques :

OutilCe qu'il faitParamètres
list_servicesListe les services que LocalCan sert, chacun avec un identifiant <project>/<service>, sa cible locale et le nombre de points de terminaison.aucun
list_public_urlsListe vos URL publiques, y compris celles en pause, chacune avec son état (actif, en pause, erreur, démarrage, inactif) et ce qu'elle sert (live, snapshot, aucun). Chaque ligne porte aussi access : aucun, mot de passe, lien, ou un nom de politique d'équipe. Une URL stationnée qui sert un Snapshot se lit comme état en pause mais servant un snapshot, alors répondez « le lien est-il actif ? » en vous basant sur le service, pas sur l'état.aucun
get_public_url_statusRapporte l'état d'une URL publique, ce qu'elle sert (live, snapshot, aucun), et sa protection access, même vocabulaire que la liste, plus sa cible locale et toutes les règles d'en-tête de requête.url requis
create_public_urlCrée une URL publique pour un port local dans un nouveau projet et renvoie l'adresse attribuée, comme my-app-12.localcan.dev. Prend quelques secondes. Si le tunnel est rejeté (par exemple la limite d'URL publiques de votre plan) ou expire, la tentative est annulée et rien n'est laissé derrière. Pour un lien qui reste accessible après la mise hors ligne de votre machine, ajoutez un Snapshot avec add_snapshot. Pour une application servie comme hôte virtuel, passez host et une règle Host dans headers (voir ci-dessous).port requis, name optionnel (façonne l'adresse), protocol http ou tcp (défaut http), host optionnel (défaut localhost), headers optionnel (règles d'en-tête de requête, chaque {name, value, mode?, enabled?})
add_public_urlAjoute une URL publique à un service que vous avez déjà configuré. Le protocole suit la cible du service, donc une cible tcp:// obtient un tunnel TCP. Même annulation en cas d'échec que la création.service identifiant requis
pause_public_urlMet une URL publique hors ligne tout en conservant son adresse, afin qu'elle puisse être reprise plus tard. Une adresse générée *.localcan.dev reste réservée pendant 7 jours en pause, les domaines personnalisés n'expirent jamais.url requis
resume_public_urlRemet une URL publique en pause en ligne à la même adresse.url requis
remove_public_urlSupprime définitivement une URL publique. Une adresse générée est libérée, un domaine personnalisé reste vôtre et peut être ajouté à nouveau. La suppression du dernier point de terminaison d'un service supprime aussi le service et le projet vidés. Pour conserver l'adresse mais arrêter de servir un Snapshot, utilisez remove_snapshot. Marqué comme destructif, donc les hôtes demandent généralement une confirmation.url requis
set_public_url_headersRemplace les règles d'en-tête de requête sur une URL publique, les en-têtes que LocalCan définit avant de transmettre à votre application. Passez la liste complète, une liste vide les efface. get_public_url_status rapporte les règles dans la même forme (mode défini, ajouté ou supprimé, et enabled), donc une liste lue là peut être modifiée et réécrite.url et headers requis

Une application servie comme hôte virtuel (un site Laravel Herd ou Valet à myapp.test, un server_name nginx) doit voir son propre nom d'hôte, et LocalCan transmet le nom d'hôte public par défaut. Passez host et une règle Host, headers: [{"name": "Host", "value": "{{target_host}}"}], et l'application sert le bon site. Les modèles de valeurs sont ceux de En-têtes.

Snapshots (voir Snapshots) :

OutilCe qu'il faitParamètres
publish_snapshotPublie un dossier comme Snapshot sur une nouvelle URL publique, afin qu'il reste accessible après la mise hors ligne de votre machine. Pointez-le vers une sortie statique construite quand vous le pouvez, ou vers une racine de projet pour que LocalCan construise (les dépendances doivent déjà être installées). Renvoie la nouvelle adresse. Crée toujours une nouvelle URL, donc pour actualiser un aperçu existant utilisez update_snapshot.path requis (absolu), name optionnel (façonne l'adresse)
add_snapshotAjoute un Snapshot à une URL publique que vous avez déjà, afin qu'un lien existant continue de servir hors ligne. Pointe vers update_snapshot si l'URL en a déjà un.url et path requis
update_snapshotRe-publie le Snapshot sur une URL publique. Omettez path pour reconstruire depuis la même source, ou passez-le pour le rediriger vers un autre dossier. Pointe vers add_snapshot si l'URL n'en a aucun.url requis, path optionnel
remove_snapshotSupprime le Snapshot d'une URL publique. L'URL reste réservée et continue de servir en direct pendant que votre tunnel est actif. Marqué comme destructif.url requis
get_snapshot_statusRapporte le Snapshot d'une URL publique : son dossier source, quand il a été publié, si la source a changé depuis (périmé), et si l'URL sert en direct ou le snapshot en ce moment. Porte aussi les commentaires de révision dessus (état et comptes) et, une fois les commentaires activés, le numéro de version du Snapshot.url requis

Contrôle d'accès (voir Contrôle d'accès) :

OutilCe qu'il faitParamètres
set_passwordProtège par mot de passe une URL publique afin que seules les personnes ayant le mot de passe puissent l'ouvrir. Appliqué sur les serveurs de LocalCan, donc il couvre aussi un Snapshot sur cette URL. Génère un mot de passe fort sauf si vous en passez un, et le renvoie pour que vous puissiez le partager. Nécessite un plan d'abonnement.url requis, password optionnel (omettez pour en générer un)
clear_accessSupprime la protection par mot de passe, rendant l'URL publique à nouveau. Ne supprime pas l'URL ni son Snapshot. Marqué comme destructif, donc les hôtes demandent généralement une confirmation.url requis
get_access_statusRapporte la protection d'une URL publique et renvoie son mot de passe actuel quand elle est protégée par mot de passe. Le mot de passe n'est jamais renvoyé par list_public_urls, seulement ici.url requis

Commentaires (les commentaires de révision que les réviseurs laissent sur un Snapshot, voir Commentaires) :

OutilCe qu'il faitParamètres
list_commentsListe les fils de commentaires sur le Snapshot d'une URL publique avec leurs réponses. Chaque fil porte le chemin de la page, l'ancre (un sélecteur CSS et la position de l'épingle dans cet élément), la fenêtre d'affichage et le navigateur du réviseur, et la version du Snapshot sur laquelle il a été laissé. Ne marque jamais rien comme lu.url requis, status ouvert, résolu ou tous (défaut ouvert), page chemin, version nombre
reply_commentPublie une réponse dans un fil sous le nom de votre compte. Les réviseurs sur le fil la reçoivent par e-mail sauf si les notifications de réponse sont désactivées pour l'équipe ou s'ils se sont désabonnés. Réponses uniquement, les nouveaux fils sont épinglés sur la page.url, comment_id, body requis
resolve_commentMarque un fil comme résolu, réponses incluses.url et comment_id requis
reopen_commentRouvre un fil résolu.url et comment_id requis
set_commentsBascule les commentaires sur un Snapshot : activés, en pause (les fils existants restent lisibles, aucun nouveau), ou désactivés. Nécessite une URL protégée et un plan d'abonnement.url et state requis

La boucle de rétroaction

Les outils s'enchaînent en une boucle qu'un agent peut exécuter seul : list_comments pour lire les fils ouverts, modifier la source, update_snapshot pour publier la nouvelle version, puis reply_comment et resolve_comment par fil. Les commentaires sont reportés sur la nouvelle version, donc le réviseur voit la réponse sur la même épingle. Le serveur le dit lui-même à l'agent. Ses instructions MCP, que les hôtes ajoutent à l'invite de l'agent, décrivent la boucle, la configuration des tours de révision (publish_snapshot, set_password, set_comments) et la recette de l'hôte virtuel. Deux choses qu'un agent ne peut pas faire : démarrer un fil (les réviseurs les épinglent sur la page) et marquer les fils comme lus (non lu est votre propre état de boîte de réception dans l'application).

Connexion d'un agent

La façon de vous connecter dépend de la façon dont l'agent s'exécute. Les agents de terminal (Claude Code, Codex) héritent du PATH de votre shell, donc une commande localcan nue fonctionne. Les applications GUI (Cursor, Claude Desktop, VS Code, et autres) ne chargent pas le PATH de votre shell, donc elles ont besoin du chemin absolu vers le binaire, par exemple /Users/you/.localcan/bin/localcan. Les paramètres de l'application de bureau peuvent copier une configuration prête à l'emploi avec le bon chemin rempli, ce qui est aussi la voie fiable sous Windows.

Claude Code

claude mcp add --scope user localcan -- localcan mcp

Le drapeau --scope user enregistre le serveur pour chaque projet. Retirez-le pour l'enregistrer uniquement dans le projet actuel.

Codex

codex mcp add localcan -- localcan mcp

Cela écrit le serveur dans ~/.codex/config.toml. Pour l'application de bureau Codex ou l'extension IDE, passez le chemin absolu à la place de localcan.

Cursor, Claude Desktop et Windsurf

Ils partagent le même format mcpServers :

{
  "mcpServers": {
    "localcan": {
      "command": "/Users/you/.localcan/bin/localcan",
      "args": ["mcp"]
    }
  }
}

Ajoutez-le au bon fichier, puis rechargez :

  • Cursor : ~/.cursor/mcp.json, puis activez le serveur dans les paramètres.
  • Claude Desktop : claude_desktop_config.json (Paramètres, Développeur, Modifier la configuration), puis quittez et relancez.
  • Windsurf : ~/.codeium/windsurf/mcp_config.json, puis actualisez le panneau MCP.

VS Code

VS Code (mode agent Copilot) utilise une clé servers avec un type explicite. Ajoutez ceci à .vscode/mcp.json dans votre espace de travail :

{
  "servers": {
    "localcan": {
      "type": "stdio",
      "command": "/Users/you/.localcan/bin/localcan",
      "args": ["mcp"]
    }
  }
}

Vous pouvez aussi exécuter code --add-mcp avec le même objet serveur.

Zed

Zed utilise context_servers dans son settings.json :

{
  "context_servers": {
    "localcan": {
      "source": "custom",
      "command": "/Users/you/.localcan/bin/localcan",
      "args": ["mcp"]
    }
  }
}

Vous pouvez aussi l'ajouter depuis les paramètres du panneau Agent.

Accès agent, rédaction et accès en écriture

Les trois sont contrôlés dans l'application de bureau sous Paramètres (la section « AI Agents (MCP) »), ou depuis le terminal : localcan mcp enable / disable pour l'accès agent, localcan mcp redact <on|off> pour la rédaction, localcan mcp access <read_only|read_write> pour l'accès en écriture, et localcan mcp status pour voir l'état actuel.

  • L'accès des agents est activé par défaut. Désactivez-le pour empêcher les agents d'utiliser LocalCan du tout. Le serveur démarre toujours, mais chaque outil renvoie un message clair « accès désactivé » jusqu'à ce que vous le réactiviez.
  • La rédaction est activée par défaut pour les agents. Les en-têtes sensibles (Authorization, cookies, clés API) sont supprimés des réponses des outils. Les URL et les corps ne sont pas rédigés. Désactivez-la pour que votre propre agent reçoive les valeurs brutes.
  • L'accès en écriture est désactivé par défaut. La lecture fonctionne sans lui, mais les outils d'écriture renvoient un message clair en lecture seule jusqu'à ce que vous l'activiez, dans l'application (« Autoriser les agents à créer et modifier des URL publiques ») ou avec localcan mcp access read_write. Activer l'accès des agents n'accorde pas l'accès en écriture. Ce sont des interrupteurs séparés. Chaque appel d'écriture est journalisé dans la sortie de diagnostic du serveur, que votre hôte capture, afin que vous ayez un enregistrement de ce qu'un agent a modifié. Un mot de passe passé à set_password est masqué dans ce journal.

Quand un outil refuse

  • Chaque outil génère une erreur avec un message de connexion au démon : LocalCan n'est pas en cours d'exécution. Ouvrez l'application de bureau ou exécutez localcan start -d.
  • list_traffic ne renvoie rien : la capture est désactivée (elle est désactivée par défaut et se réinitialise au redémarrage du démon). Exécutez localcan traffic enable ou laissez l'agent appeler enable_capture.
  • « Accès MCP désactivé » : l'accès des agents est désactivé. Exécutez localcan mcp enable ou basculez le paramètre dans les réglages.
  • « MCP est en lecture seule » : l'outil modifie des choses et l'accès en écriture est désactivé. Exécutez localcan mcp access read_write ou activez le paramètre dans les réglages.
  • « Les URL publiques nécessitent une licence » : la création et l'ajout d'une URL publique nécessitent une licence active. Activez-en une dans l'application ou avec localcan license activate <key>.
  • « Besoin d'un plan d'abonnement » : les instantanés et le contrôle d'accès sont réservés aux abonnements. Une licence perpétuelle peut ouvrir des URL publiques mais ne peut pas publier un instantané ni définir un mot de passe. Abonnez-vous depuis votre tableau de bord, puis réessayez.
  • « a déjà un instantané » ou « n'a pas encore d'instantané » : utilisez l'outil nommé dans le message. add_snapshot attache un instantané à une URL qui n'en a pas, update_snapshot actualise celui qui en a déjà un.
  • « Limite d'instantanés atteinte » : votre plan plafonne le nombre d'URL publiques pouvant servir un instantané à la fois. Le message liste les URL utilisant déjà un emplacement, que vous pouvez actualiser avec update_snapshot au lieu d'en publier un nouveau.
  • « Les commentaires nécessitent une URL protégée » : set_comments a été appelé sur une URL sans contrôle d'accès. Exécutez set_password d'abord.
  • « Votre compte n'a pas de nom d'affichage » : une réponse nécessite un nom pour être publiée. Définissez-le dans le tableau de bord, ou répondez une fois sur la page d'instantané après l'avoir ouverte en tant que propriétaire depuis l'application.
  • L'hôte affiche le serveur comme en échec ou sans outils : une application GUI ne trouve pas localcan dans le PATH. Utilisez le chemin absolu, plus facilement via la configuration copiée dans les réglages.