LocalCan
officielFournit 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_trafficou de récupérer une requête/réponse complète viaget_exchangeau 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_urletpause_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 avecupdate_snapshotafin 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 vialist_comments, et répondez-y ou résolvez-les directement depuis votre assistant. - Vérifiez l'état du tunnel et du service — Utilisez
get_statuspour confirmer que la capture est en cours, oulist_public_urlspour 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 :
| Outil | Ce qu'il fait | Paramètres |
|---|---|---|
get_status | Indique si la capture est activée et la quantité de trafic mise en mémoire tampon. | aucun |
enable_capture | Active la capture. La capture est désactivée par défaut et se réinitialise au redémarrage du démon. | aucun |
list_traffic | Liste 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_exchange | Renvoie 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 :
| Outil | Ce qu'il fait | Paramètres |
|---|---|---|
list_services | Liste les services que LocalCan sert, chacun avec un identifiant <project>/<service>, sa cible locale et le nombre de points de terminaison. | aucun |
list_public_urls | Liste 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_status | Rapporte 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_url | Cré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_url | Ajoute 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_url | Met 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_url | Remet une URL publique en pause en ligne à la même adresse. | url requis |
remove_public_url | Supprime 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_headers | Remplace 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) :
| Outil | Ce qu'il fait | Paramètres |
|---|---|---|
publish_snapshot | Publie 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_snapshot | Ajoute 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_snapshot | Re-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_snapshot | Supprime 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_status | Rapporte 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) :
| Outil | Ce qu'il fait | Paramètres |
|---|---|---|
set_password | Protè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_access | Supprime 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_status | Rapporte 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) :
| Outil | Ce qu'il fait | Paramètres |
|---|---|---|
list_comments | Liste 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_comment | Publie 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_comment | Marque un fil comme résolu, réponses incluses. | url et comment_id requis |
reopen_comment | Rouvre un fil résolu. | url et comment_id requis |
set_comments | Bascule 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_passwordest 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_trafficne 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écutezlocalcan traffic enableou laissez l'agent appelerenable_capture.- « Accès MCP désactivé » : l'accès des agents est désactivé. Exécutez
localcan mcp enableou 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_writeou 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_snapshotattache un instantané à une URL qui n'en a pas,update_snapshotactualise 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_snapshotau lieu d'en publier un nouveau. - « Les commentaires nécessitent une URL protégée » :
set_commentsa été appelé sur une URL sans contrôle d'accès. Exécutezset_passwordd'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
localcandans le PATH. Utilisez le chemin absolu, plus facilement via la configuration copiée dans les réglages.