news 2026/9/12 11:26:11

如何在 claude-code-templates 仪表盘上通过构建开关启用 WebMCP 只读目录工具?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在 claude-code-templates 仪表盘上通过构建开关启用 WebMCP 只读目录工具?

如何在 claude-code-templates 仪表盘上通过构建开关启用 WebMCP 只读目录工具?

【免费下载链接】claude-code-templatesCLI tool for configuring and monitoring Claude Code项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-templates

claude-code-templates 的仪表盘(dashboard/目录下的 Astro 站点)内置了 WebMCP V1:把组件目录以一组只读工具的形式暴露给支持 WebMCP 的浏览器 AI agent,让它们可以直接查询目录、拿到安装命令,而不必去解析页面 UI。这套工具默认不生效——dashboard/src/lib/webmcp.ts 中的入口initWebMCP()在构建时开关PUBLIC_WEBMCP_ENABLED不是字符串"true"时会直接返回。本文说明如何在生产配置、CI 构建和本地构建三个位置打开这个开关,并在浏览器中确认 4 个只读工具已经注册。

开关控制的内容

PUBLIC_WEBMCP_ENABLED是构建期变量,文档(dashboard/docs/webmcp.md)说明它采用的是和PUBLIC_ADS_ENABLED相同的模式,判断逻辑只有一行(webmcp.ts 第 20 行):

const WEBMCP_ENABLED = import.meta.env.PUBLIC_WEBMCP_ENABLED === 'true';

也就是说,只有字符串"true"会启用功能,其余任何取值(包括"false")都让initWebMCP()在触碰document.modelContext之前直接返回。启用后,DashboardLayout.astro 中打包的<script>会调用initWebMCP();站点所有页面共用这个布局,Astro 会去重脚本,因此工具在每一页都可用。

两个与“是否破坏页面”相关的行为来自文档和源码:

  • 不支持 WebMCP 的浏览器不受影响:initWebMCP()先做document.modelContext.registerTool的 feature-detect,检测不到就直接退出。
  • 注册失败(Permissions Policy 导致的NotAllowedError、重名导致的InvalidStateError)会被吞掉,不会中断页面。

注册成功的工具共 4 个,全部是只读(readOnlyHint: true),返回社区撰写的组件描述的工具还会带上untrustedContentHint: true,提示 agent 把该文本当数据而不是指令:

工具名输入返回
search-components{ query, type? }{ total, results[] },最多 20 条,含名称、类型、分类、描述、页面 URL 和安装命令
get-component-details{ name, type }单个组件的目录条目加installCommand与页面url,未找到时返回{ error }
get-install-command{ name, type }{ installCommand },即npx claude-code-templates@latest --<type> <path>形式的命令
get-catalog-stats{ counts, downloads, lastUpdated },来自counts.jsontrending-data.json

工具本身不新增后端和依赖,数据全部来自仪表盘已经提供的同源静态 JSON:search-index.jsoncomponents/{type}.jsoncounts.jsontrending-data.json,通过 src/lib/data.ts 中 UI 共用的fetchSearchIndex()fetchComponentsByType()getInstallCommand()读取(共享 5 分钟内存缓存)。

在三个位置配置开关

生产环境:wrangler.toml 的[vars]

dashboard/wrangler.toml 的[vars]段保存生产值(PUBLIC_*必须写在这里而不是 secrets 中):

# WebMCP catalog tools (src/lib/webmcp.ts); set to "false" to disable: PUBLIC_WEBMCP_ENABLED = "true"

需要关闭时把该行改成"false"即可,这是文档注释里给出的禁用方式。

CI 构建:Build 步骤的 env

.github/workflows/deploy.yml 在Build步骤里把开关作为环境变量传入构建(CI 使用 Node 22,依赖安装在dashboard目录下):

- name: Build run: npm run build working-directory: dashboard env: PUBLIC_WEBMCP_ENABLED: "true"

构建产物由后续的npx wrangler pages deploy dist部署到 Cloudflare Pages。

本地构建

本地构建与 CI 的 Build 步骤等价:先在dashboard目录安装依赖,再带上同一个环境变量执行npm run build(dashboard/package.json 中buildastro build):

cd dashboard npm install PUBLIC_WEBMCP_ENABLED=true npm run build

不设置该变量时,npm run build也能完成构建,只是产物中 WebMCP 功能处于关闭状态(initWebMCP()直接返回),不会报错。

验证工具是否注册

文档的 Testing 部分给出两种验证方式。

在支持 WebMCP 的浏览器中

在启用了 WebMCP 的浏览器里(文档列出的支持范围:Chrome 149+ / Edge 150+ 的 origin trial 版本,或 ChatGPT Desktop、Brave Leo 这类已支持 agent),getTools()/executeTool()可以同源调用,直接在 DevTools 中执行:

const tools = await document.modelContext.getTools(); await document.modelContext.executeTool( tools.find(t => t.name === 'search-components'), { query: 'react' } );

判断依据:getTools()返回的列表中能找到search-components等 4 个工具名,且executeTool能返回对应结果,说明开关生效且注册成功。文档没有给出这次调用的固定示例输出,结果内容以目录数据为准。

在普通浏览器中打桩

普通浏览器不支持document.modelContext,可以先打桩 API 再重载页面来验证注册逻辑是否执行(按文档说明,以下代码粘贴进 DevTools 后刷新页面):

// paste in DevTools, then reload document.modelContext = { registerTool: t => (console.log('registered', t.name), Promise.resolve()) };

开关启用时,控制台会随每个工具注册打印registered及工具名;开关未启用时initWebMCP()直接返回,不会出现这些打印,可借此区分两种构建产物。

已知限制

  • Chrome/Edge 的 origin trial 需要在对应试用计划中注册站点域名并添加<meta http-equiv="origin-trial">标签,文档把这一项列为 V1 之后的工作;ChatGPT Desktop 和 Brave Leo 不需要。
  • V1 不包含声明式<form>工具、exposedTo跨源 iframe 暴露、service-worker 工具,也没有任何写操作/有后果的工具(购物车、PR 流程等需要先做用户确认设计)。
  • 工具返回的组件描述属于社区撰写内容,agent 侧应按数据而非指令处理。

需要继续深入时,可以看 webmcp.md 中的架构与约定说明,以及 webmcp.ts(工具定义与注册)、DashboardLayout.astro(全站挂载点)三个文件的实现细节。

【免费下载链接】claude-code-templatesCLI tool for configuring and monitoring Claude Code项目地址: https://gitcode.com/GitHub_Trending/cl/claude-code-templates

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 11:25:26

Spring框架核心机制与MyBatis整合实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 11:24:49

DeepTutor快速上手指南:把本地资料变成AI学习助手

DeepTutor快速上手指南&#xff1a;把本地资料变成AI学习助手 【免费下载链接】DeepTutor DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/. 项目地址: https://gitcode.com/GitHub_Trending/dee/DeepTutor 你上周刚喂给AI的资料&#xff0c;这周问…

作者头像 李华
网站建设 2026/9/12 11:24:43

Android Intent过滤器详解与深度链接实践

1. Intent过滤器基础概念解析 在Android开发中&#xff0c;Intent过滤器&#xff08;Intent Filter&#xff09;是组件与系统之间的"通信协议"&#xff0c;它定义了组件能够响应哪些类型的隐式Intent。每个过滤器都包含三个核心要素&#xff1a;action、data和catego…

作者头像 李华
网站建设 2026/9/12 11:23:59

TCP/IP网络协议栈与Linux系统编程实战

1. 网络通信基础模型解析 现代计算机网络的基石是分层模型架构&#xff0c;最经典的当属OSI七层模型和TCP/IP四层模型。作为一名长期奋战在系统编程一线的开发者&#xff0c;我经常需要在这两种模型之间切换思考。OSI模型像教科书般严谨&#xff0c;而TCP/IP模型则更贴近实际工…

作者头像 李华
网站建设 2026/9/12 11:23:21

LPC2214裸机例程:寄存器级嵌入式开发入门锚点

简介&#xff1a;本资源是面向嵌入式初学者与LPC2214单片机开发者的软件参考设计合集&#xff0c;涵盖ADC、GPIO、UART、I2C、SPI、PWM、RTC、WDT、VIC、EMC等30类核心外设的基础驱动例程&#xff0c;适用于教学实验、课程设计及入门级项目开发。压缩包共903个文件&#xff0c;…

作者头像 李华