LocalCan
官方为AI代理提供本地主机的公共URL(隧道)、实时HTTP流量检查、快照发布和访问控制。
你可以用 LocalCan MCP 做什么?
- 检查捕获的流量 — 让您的助手通过
list_traffic列出最近的交换,或通过get_exchange以 Markdown、curl 或 HAR 格式获取完整的请求/响应。 - 管理公共隧道 — 使用
create_public_url和pause_public_url等工具创建、暂停、恢复或移除公共 URL,包括设置自定义请求头。 - 发布和刷新快照 — 使用
publish_snapshot将文件夹部署为可共享的快照,之后通过update_snapshot更新,确保预览链接保持最新。 - 控制访问和评论 — 使用
set_password为 URL 设置密码保护,通过list_comments查看评论线程,并直接从您的助手中回复或解决它们。 - 检查隧道和服务状态 — 使用
get_status确认捕获正在运行,或使用list_public_urls查看哪些链接处于活动、暂停或提供快照状态。
文档
MCP 服务器
运行 LocalCan 的 Model Context Protocol 服务器并将其接入你的 MCP 主机,附工具与开关的完整参考。
localcan mcp 通过 stdio 运行 Model Context Protocol 服务器。MCP 主机(Claude Code、Codex、Cursor、Claude Desktop 等)会启动它并调用 LocalCan 的工具来读取捕获的流量、管理 Public URL(隧道)以及发布 Snapshots。LocalCan 必须正在运行,工具才能返回数据,因此请先打开桌面应用或运行 localcan start -d。
工具
服务器暴露了二十六个工具。读取功能开箱即用。十六个会更改内容的工具需要写入权限,该权限默认关闭(见下方开关)。创建或添加 Public URL 需要有效的许可证。发布 Snapshot 和为 URL 添加密码保护需要订阅计划,因此永久许可证会被拒绝,尽管它仍然可以打开 Public URL。未授权时,受限工具会返回明确的激活提示,而暂停、恢复和移除现有 URL 仍然可用。
流量:
| 工具 | 功能 | 参数 |
|---|---|---|
get_status | 报告捕获是否开启以及缓冲了多少流量。 | 无 |
enable_capture | 开启捕获。捕获默认关闭,守护进程重启时会重置。 | 无 |
list_traffic | 列出最近的交换记录,最新的在前。 | last(默认 20)、host 子字符串、project id、method、status(精确代码或类似 5xx 的类别) |
get_exchange | 按 id 返回一条交换记录。 | id 必填(完整 id 或任意唯一前缀)、format 为 markdown、curl、http、har、json 之一(默认 markdown)、include_response(默认 true) |
交换记录是 LocalCan 转发到你后端的请求,而非客户端原始请求的逐字节副本。数据模型见 Traffic。
Public URLs:
| 工具 | 功能 | 参数 |
|---|---|---|
list_services | 列出 LocalCan 提供的服务,每个服务带有 <project>/<service> 句柄、本地目标和端点数量。 | 无 |
list_public_urls | 列出你的 Public URLs,包括已暂停的,每个都带有其状态(active、paused、error、starting、inactive)及其服务内容(live、snapshot、none)。每一行还带有 access:none、password、link 或团队策略名称。停放并服务 Snapshot 的 URL 会显示状态为 paused 但服务内容为 snapshot,因此回答“链接是否在线?”时应依据服务内容而非状态。 | 无 |
get_public_url_status | 报告单个 Public URL 的状态、服务内容(live、snapshot、none)及其 access 保护,词汇与列表相同,外加其本地目标和任何请求头规则。 | url 必填 |
create_public_url | 在新项目中为本地端口创建 Public URL,并返回分配的地址,如 my-app-12.localcan.dev。需要几秒钟。如果隧道被拒绝(例如你的计划的 Public URL 限制)或超时,尝试会被回滚,不会留下任何内容。若希望链接在你机器离线后仍可访问,请使用 add_snapshot 添加 Snapshot。若应用以虚拟主机方式服务,请传入 host 和 headers 中的 Host 规则(见下文)。 | port 必填、name 可选(影响地址格式)、protocol http 或 tcp(默认 http)、host 可选(默认为 localhost)、headers 可选(请求头规则,每条 {name, value, mode?, enabled?}) |
add_public_url | 为你已配置的服务添加 Public URL。协议遵循服务的目标,因此 tcp:// 目标会获得 TCP 隧道。失败时回滚行为与创建相同。 | service 句柄必填 |
pause_public_url | 将 Public URL 下线,同时保留其地址,以便稍后恢复。生成的 *.localcan.dev 地址在暂停期间保留 7 天,自定义域名永不过期。 | url 必填 |
resume_public_url | 将暂停的 Public URL 以相同地址恢复上线。 | url 必填 |
remove_public_url | 永久移除 Public URL。生成的地址会被释放,自定义域名仍归你所有,可以再次添加。移除服务的最后一个端点也会移除清空的服务和项目。若想保留地址但停止服务 Snapshot,请使用 remove_snapshot。标记为破坏性操作,因此主机通常会要求确认。 | url 必填 |
set_public_url_headers | 替换 Public URL 上的请求头规则,即 LocalCan 在转发到你的应用之前设置的请求头。传入完整列表,空列表则清除规则。get_public_url_status 以相同格式报告规则(mode 为 set、append 或 remove,以及 enabled),因此读取到的列表可以编辑后写回。 | url 和 headers 必填 |
以虚拟主机方式服务的应用(Laravel Herd 或 Valet 站点位于 myapp.test,nginx server_name)需要看到自己的主机名,而 LocalCan 默认转发公共主机名。传入 host 和 Host 规则 headers: [{"name": "Host", "value": "{{target_host}}"}],应用就会服务正确的站点。值模板来自 Headers。
Snapshots(见 Snapshots):
| 工具 | 功能 | 参数 |
|---|---|---|
publish_snapshot | 将文件夹作为 Snapshot 发布到新的 Public URL 上,使其在你机器离线后仍可访问。尽可能指向构建好的静态输出,或指向项目根目录让 LocalCan 构建(依赖必须已安装)。返回新地址。始终创建新 URL,因此刷新现有预览请使用 update_snapshot。 | path 必填(绝对路径)、name 可选(影响地址格式) |
add_snapshot | 为你已有的 Public URL 添加 Snapshot,使现有链接在离线时继续服务。如果 URL 已有 Snapshot,则指向 update_snapshot。 | url 和 path 必填 |
update_snapshot | 重新发布 Public URL 上的 Snapshot。省略 path 则从相同来源重新构建,或传入它以指向另一个文件夹。如果 URL 没有 Snapshot,则指向 add_snapshot。 | url 必填、path 可选 |
remove_snapshot | 从 Public URL 移除 Snapshot。URL 保持保留状态,并在隧道在线时继续服务实时内容。标记为破坏性操作。 | url 必填 |
get_snapshot_status | 报告 Public URL 的 Snapshot:其源文件夹、发布时间、源是否自发布以来更改过(stale),以及 URL 当前服务的是实时内容还是快照。还带有其上的评论(状态和计数),以及评论开启后 Snapshot 的版本号。 | url 必填 |
访问控制(见 Access control):
| 工具 | 功能 | 参数 |
|---|---|---|
set_password | 为 Public URL 添加密码保护,只有拥有密码的人才能打开。在 LocalCan 的服务器上强制执行,因此也覆盖该 URL 上的 Snapshot。除非你传入密码,否则会生成强密码并返回以便分享。需要订阅计划。 | url 必填、password 可选(省略则生成一个) |
clear_access | 移除密码保护,使 URL 重新公开。不会移除 URL 或其 Snapshot。标记为破坏性操作,因此主机通常会要求确认。 | url 必填 |
get_access_status | 报告 Public URL 的保护状态,并在有密码保护时返回当前密码。密码绝不会由 list_public_urls 返回,仅在此处返回。 | url 必填 |
评论(审阅者在 Snapshot 上留下的评论,见 Comments):
| 工具 | 功能 | 参数 |
|---|---|---|
list_comments | 列出 Public URL 的 Snapshot 上的评论线程及其回复。每个线程带有页面路径、锚点(CSS 选择器及该元素中图钉的位置)、审阅者的视口和浏览器,以及评论所在的 Snapshot 版本。绝不会标记任何内容为已读。 | url 必填、status open、resolved 或 all(默认 open)、page 路径、version 数字 |
reply_comment | 以你账户的名义向线程发布回复。线程上的审阅者会通过电子邮件收到回复,除非团队的回复通知已关闭或他们已退订。仅限回复,新线程在页面上固定。 | url、comment_id、body 必填 |
resolve_comment | 将线程标记为已解决,包括回复。 | url 和 comment_id 必填 |
reopen_comment | 重新打开已解决的线程。 | url 和 comment_id 必填 |
set_comments | 切换 Snapshot 上的评论:on、paused(现有线程保持可读,不接受新线程)或 off。需要受保护的 URL 和订阅计划。 | url 和 state 必填 |
反馈循环
这些工具串联成一个代理可以自行运行的循环:list_comments 读取打开的线程,编辑源代码,update_snapshot 发布新版本,然后对每个线程执行 reply_comment 和 resolve_comment。评论会延续到新版本,因此审阅者会在同一图钉上看到回复。服务器会自行告知代理这一点。其 MCP 指令(主机将其添加到代理的提示中)描述了该循环、审阅轮次设置(publish_snapshot、set_password、set_comments)以及虚拟主机配方。代理无法做两件事:启动线程(审阅者在页面上固定)和将线程标记为已读(未读是你应用中的个人收件箱状态)。
连接代理
连接方式取决于代理的运行方式。终端代理(Claude Code、Codex)继承你的 shell PATH,因此裸的 localcan 命令即可。GUI 应用(Cursor、Claude Desktop、VS Code 等)不会加载你的 shell PATH,因此它们需要二进制的绝对路径,例如 /Users/you/.localcan/bin/localcan。桌面应用的设置可以复制一份已填好正确路径的现成配置,这也是 Windows 上的可靠途径。
Claude Code
claude mcp add --scope user localcan -- localcan mcp
标志 --scope user 为每个项目注册服务器。去掉它则仅在当前项目中注册。
Codex
codex mcp add localcan -- localcan mcp
这会将服务器写入 ~/.codex/config.toml。对于 Codex 桌面应用或 IDE 扩展,请传入绝对路径代替 localcan。
Cursor、Claude Desktop 和 Windsurf
它们共享相同的 mcpServers 格式:
{
"mcpServers": {
"localcan": {
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
将其添加到正确的文件中,然后重新加载:
- Cursor:
~/.cursor/mcp.json,然后在设置中启用服务器。 - Claude Desktop:
claude_desktop_config.json(设置、开发者、编辑配置),然后退出并重新启动。 - Windsurf:
~/.codeium/windsurf/mcp_config.json,然后刷新 MCP 面板。
VS Code
VS Code(Copilot 代理模式)使用带有显式类型的 servers 键。将其添加到工作区中的 .vscode/mcp.json:
{
"servers": {
"localcan": {
"type": "stdio",
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
你也可以使用相同的服务器对象运行 code --add-mcp。
Zed
Zed 在其 settings.json 中使用 context_servers:
{
"context_servers": {
"localcan": {
"source": "custom",
"command": "/Users/you/.localcan/bin/localcan",
"args": ["mcp"]
}
}
}
你也可以从 Agent Panel 设置中添加它。
代理访问、编辑和写入权限
这三项都在桌面应用的设置(“AI Agents (MCP)”部分)中控制,或从终端控制:localcan mcp enable / disable 用于代理访问,localcan mcp redact <on|off> 用于编辑,localcan mcp access <read_only|read_write> 用于写入权限,localcan mcp status 用于查看当前状态。
- 代理访问默认开启。关闭后,代理将完全无法使用 LocalCan。服务器仍会启动,但每个工具都会返回明确的“访问已禁用”消息,直到您重新开启。
- 对代理默认启用脱敏。敏感标头(Authorization、cookies、API 密钥)会从工具响应中移除。URL 和请求体不会脱敏。关闭后,您自己的代理可以接收原始值。
- 写入访问默认关闭。读取无需写入访问即可工作,但写入工具会返回明确的只读消息,直到您在应用中(“允许代理创建和更改公共 URL”)或通过
localcan mcp access read_write开启。开启代理访问并不会授予写入访问权限。它们是两个独立的开关。每次写入调用都会记录到服务器的诊断输出中,由您的主机捕获,因此您可以记录代理更改的内容。传递给set_password的密码会在该日志中被掩码。
当工具拒绝时
- 每个工具都会因守护进程连接消息而报错:LocalCan 未运行。请打开桌面应用或运行
localcan start -d。 list_traffic返回空内容:捕获已关闭(默认关闭,守护进程重启时会重置)。运行localcan traffic enable或让代理调用enable_capture。- “MCP 访问已禁用”:代理访问已关闭。运行
localcan mcp enable或切换设置开关。 - “MCP 为只读”:该工具会更改内容,但写入访问已关闭。运行
localcan mcp access read_write或打开设置开关。 - “公共 URL 需要许可证”:创建和添加公共 URL 需要有效的许可证。请在应用中激活,或使用
localcan license activate <key>激活。 - “需要订阅计划”:快照和访问控制仅限订阅用户。永久许可证可以打开公共 URL,但不能发布快照或设置密码。请从您的 仪表板 订阅,然后重试。
- “已有快照”或“尚无快照”:请使用消息中提到的工具。
add_snapshot将快照附加到没有快照的 URL,update_snapshot刷新已有快照的 URL。 - “已达到快照限制”:您的计划限制了同时提供快照的公共 URL 数量。消息会列出已占用槽位的 URL,您可以使用
update_snapshot刷新这些 URL,而不是发布新的快照。 - “评论需要受保护的 URL”:
set_comments在没有访问控制的 URL 上被调用。请先运行set_password。 - “您的账户没有显示名称”:回复需要名称才能发布。请在 仪表板 中设置,或在应用中作为所有者打开快照页面后,在快照页面上回复一次。
- 主机显示服务器失败或没有工具:GUI 应用无法在 PATH 中找到
localcan。请使用绝对路径,最简单的方法是通过设置中的复制配置。