Skip to main content
Glama

Zuar Portal — MCP Server

让 Claude 替你操作你的 Zuar Portal(zPortal) — 编写 HTML 块、构建页面、管理数据源、查询、主题和用户,探索真实数据,并通过自然语言保留每次更改的 git 版本化、可回滚历史。

release MCP Zuar Portal node one-click install license


一个 MCP 服务器,将 Zuar Portal 的 REST + auth API 暴露给任何 MCP 客户端(Claude Desktop、Claude Code 等)。它把 "给我建一个销售仪表盘" 变成正确的认证调用序列 — 发现数据源 → 编写保存的查询 → 编写一个经过验证的 HTML 块 → 绑定它 → 将其放置在页面上 — 并附带内置的编写指南、分层写入安全和可回滚的历史记录。

[!TIP] 安装(Claude Code) — 克隆、构建、注册:

git clone https://github.com/zuarbase/Zuar-Portal-MCP-Public.git ~/zuar-portal-mcp
cd ~/zuar-portal-mcp && npm install && npm run build
claude mcp add zuar-portal --scope user -- node ~/zuar-portal-mcp/dist/index.js

然后 cd 到项目文件夹并运行 /portal-setup 将其连接到门户。详情 ↓

无需终端(Claude Desktop):最新版本下载 zuar-portal-mcp.mcpb 并双击它。详情 ↓

概览

flowchart TB
    CD["<b>MCP Client</b><br/>Claude Desktop · Claude Code · any MCP client"]
    CD -- "JSON-RPC / stdio" --> S

    subgraph server["zuar-portal-mcp server"]
        direction TB
        S["index.ts → buildServer()"]
        S --> BT["🧱 <b>Block tools</b><br/>typed authoring + place_blocks"]
        S --> RT["📦 <b>Resource tools</b><br/>generic CRUD · 18 kinds (blocks included)"]
        S --> AT["⚡ <b>Action tools</b><br/>query · profile · users · config"]
        S --> VC["🕓 <b>Version-control tools</b><br/>snapshot · history · diff · restore"]
        S --> EL["🪄 <b>Setup &amp; design</b><br/>configure_project · synthesize_theme"]
        G{{"🛡️ <b>Safety &amp; integrity gates</b><br/>write-domain · structure · refs · impact · SQL"}}
        BT & RT & AT & VC & EL --> G
    end

    G --> HTTP["portalClient.ts<br/>login · X-Api-Key · retry · circuit breaker"]
    HTTP -- "/api + /auth · HTTPS" --> P[("Zuar Portal")]
    BT -. "mirrors every content write" .-> GIT[("git VC repo<br/>revertible")]

    classDef gate fill:#fde68a,stroke:#b45309,color:#000;
    class G gate

每次写入都带有风险域标签,并在任何内容到达门户之前通过安全门;每次成功的内容写入都会镜像到 git 仓库,以便可以回滚。

Related MCP server: LaunchNotes MCP Server

目录

正在开发这个服务器而不是使用它?参见 CONTRIBUTING.md

[!NOTE] 📚 完整文档位于 docs/5 分钟快速入门、安装与配置、全部 40 个工具的生成参考、块编写、设计系统、版本控制、块内 zPortal API、代理生态系统与模型路由工具门控安全门 以及故障排除。

亮点

🧰 统一表面 (v3.0.0)

万物一模型 — 块是经过验证的注册表种类,一个声明式 place_blocks,每次写入都有统一的 dry_run,分页列表,以及新的读取(find_resourceget_referencesvc_diff)。破坏性变更;PORTAL_COMPAT_TOOLS=1 桥接旧的 v2 名称。

⌨️ 一次安装,随处使用

克隆 + 构建 + claude mcp add … -- node …/dist/index.js,然后每个项目运行 /portal-setup。或者为 Claude Desktop 提供一键 .mcpb — 完全无需终端。

🧱 验证式编写

HTML 块通过规则检查的工具(create_block/update_block/validate_block)— 而 create_resource (block) 在注册表检查点通过相同的按种类验证器,因此在触及门户之前就捕获了隐患。

🏢 多门户、多仓库 (v2.4.0)

一次安装通过 ./.zuar-portal/config.json 为每个文件夹驱动不同的门户 + git 仓库

🪄 浏览器设置,无需 JSON,模型不接触密钥

configure_project 提供一个本地回环 Web 表单 — 你在浏览器中输入 API 密钥,因此它永远不会经过模型;它实时验证并写入 0600 配置。回退到引导/参数。design_intake 提示引导主题化并驱动 synthesize_theme

🤝 代理团队

在 Claude Code 中,一个受门控的 构建 → 样式 → 响应式 → 调试 → 对抗 → 顾问 专业子代理流水线为你构建块 — 每个都在合适规模的模型上。

🔒 企业级安全 (v2.5–2.6)

风险域写入门控、最小权限工具范围、结构 + 引用完整性门、删除前影响分析,以及可选的审计日志。

🕓 可回滚历史 (v2.2.0)

每次内容写入都镜像到 git 仓库 — 用 restore_resource 回滚任何更改。


Claude 可以用它做什么

40 个工具 — 跨 11 个能力组的统一表面("资源就是资源")。完整的按工具参考是从实时服务器生成的npm run gen:docs,因此不会漂移):docs/03 · 工具参考

[!IMPORTANT] 从 2.x 升级? v3.0.0 是一次破坏性重新设计(48 → 37 个工具)。每个移除的 v2 名称都映射到 v3 原语 — 参见 CHANGELOG.md。设置 PORTAL_COMPAT_TOOLS=1 以临时将旧名称注册为转发到相同受门控 v3 处理器的弃用别名。

🧱 块工具 — 类型化 + 验证

块现在是一等注册表种类:使用通用资源工具(resource: "block")列出、获取和删除它们,块编写规则作为按种类验证器在注册表写入检查点运行 — create_resource (block) 的验证方式与 create_block 完全相同。类型化前端仍然存在,以便于编写:

工具

功能

validate_block

对块负载运行编写规则而不写入 — 迭代直到干净。

create_block

创建 HTML 块(根据编写规则验证)。

update_block

更新 HTML 块 — 与当前块合并,因此未触及的字段得以保留。

文件输入 [4.2.0]create_blockupdate_blockvalidate_block 接受 html_filecss_file服务器读取字节,因此模型永远不会携带它们。将大块重新输入到工具调用中不是复制,而是重新转录:它会消耗 token 并静默地规范化字符(正则表达式字符类中的破折号以连字符形式出现会改变模式匹配的内容 — 并通过审查)。改为传递路径,就地编辑文件,只有增量会被转录。无论哪种方式,每个门都以相同方式运行。读取仅限于 CWD、VC 目录和任何 PORTAL_FILE_ROOTS 条目。 | bind_block_query | 将块绑定到数据源/查询(自动创建查询);设置 ui_queries。 | | place_blocks | 一个声明式放置原语 — 在单个原子写入中在页面网格上添加、更新、隐藏或移除块。mode: "merge" 追加/更新(并尊重 remove: [...]);mode: "replace" + confirm: true 使页面完全成为给定列表,同时保留幸存者自定义的 grid.layouts 和隐藏标志。 |

传递 resource 加上 body/id。调用 describe_resource 查看每种资源的字段、创建所需的字段、支持的动词和风险域。

工具

功能说明

describe_resource

列出资源,或描述某个资源(字段、操作、域)。

list_resource

列出记录 — 始终返回分页信封 {total, offset, limit, returned, truncated, records}(默认 limit 100,最大 500)。

get_resource

按 id 获取单条记录 — 例如 resource: "user", id: "me" 获取当前用户的资料。

find_resource

按名称搜索(不区分大小写的子串,或精确 id)跨类型 — 可选 kindstaglimit/offset;默认搜索所有非管理员类型。

get_references

只读依赖查询,双向:dependents(如果此记录被删除谁会受影响 — 与删除门禁运行的分析相同)和 references(此记录指向的内容,悬空时每条标记为 exists: false)。

create_resource

创建记录(按域进行写入门禁;按类型校验器 — 块(block)会获得完整的编写规则)。

update_resource

更新记录(与当前记录合并;写入门禁)。

delete_resource

删除记录(写入门禁;删除前影响分析;confirm/force)。

validate_portal

只读扫描,检查格式错误的记录、悬空引用和风险 SQL。

覆盖的资源: blocklayout(页面)、datasourcequerydb_modificationpartialthemesnippettranslationdashboardtagusergrouppermissionaccess_policyapi_keycredentialsystem

每个写入工具都接受 dry_run: true — 所有门禁都会运行(域、结构、按类型规则、引用、影响),不会写入任何内容,响应会携带 applied: false 以及本将写入的内容。

工具

功能

领域

profile_datasource

每列统计信息(类型、不同值、最小值/最大值)以及原始样本行sample.columns / sample.rowssample_rows 默认 10,最大 50),用于针对真实列设计筛选器和图表。

读取

execute_query

按 id 运行已保存的查询并返回结果(可选行数 limit)。

读取

run_db_modification

按名称运行已保存的数据库写入操作。需要 confirm: true

数据

change_password

更改当前用户的密码。

管理

get_user_access

一次调用即可读取用户的组成员身份权限。

读取

set_user_access

替换用户的组和/或权限——每个提供的列表都是完整替换;需要 confirm: true,支持 dry_run

管理

get_config / update_config

按路径读取/设置门户配置。

读取 / 管理

get_version

门户版本 + 关于信息(能力检查)。

读取

get_rules

显示当前生效的块编写规则。

读取

naming

scope · kind · subject 命名语法——action: "suggest" 建议名称,action: "parse" 分解名称。

读取

check_connection

从这里开始——通过一次经过身份验证的往返确认连接:门户、版本、当前登录身份、绑定状态和写入姿态,约 ~160 个字符。凭据错误时返回原因和修复方法,而不是虚假的成功 (始终可用)

读取

get_capabilities

报告当前姿态——启用/禁用的工具组、写入安全性、VC + 审计状态,以及其 config 键下的活动配置(门户 / VC 仓库,机密信息已隐去)(始终可用)

读取

get_metrics

每个工具的调用次数、错误率、延迟、运行时间、熔断器状态 (始终可用)

读取

configure_project

将此文件夹连接到门户。默认情况下,它会打开一个本地回环设置页面(API 密钥在浏览器中输入,绝不通过模型),实时验证,写入 0600 配置;然后回退到引导式询问,再回退到参数(传递 ui:false,或 portal_url + api_key + user_id)。还会收集写入安全开关 + 访问范围 + 可选的 GitHub VC。固定此文件夹到门户,使写入无法跨门户;写入 ./.zuar-portal/config.json + design.md + 一个受管理的 CLAUDE.md 块。

设置

reload_config

无需重启即可从磁盘重新读取配置(项目/包/环境);重置门户会话。

设置

synthesize_theme

纯主题合成——偏好(± 一个受 SSRF 防护的网站颜色获取)→ 一个令牌映射,加上精确的 create_resource 调用(create_with);本身不创建任何内容。由 design_intake 提示词编排。

设计

migration_preflight

只读迁移审计——每个块按功能分类,所有包含代码的字段都被扫描(识别注释/字符串),通过布局/局部模板/片段确定位置,硬编码来源扫描,绑定查询预检,浏览器探测检查清单。

迁移

repair_query_metadata

从一次实时执行刷新已保存查询的存储列元数据——SQL 不变,默认试运行,往返已验证。

迁移

当前用户的个人资料现在是普通的资源 CRUD:get_resource / update_resource,使用 resource: "user", id: "me"。引导式迁移范围界定是 migration_kickoff 提示词(见下方提示词)。

工具

功能

vc_status

显示 VC 是否已配置以及仓库状态。

snapshot_portal

将当前完整的门户状态提交到 git 仓库——一个持久的检查点。

vc_log

显示内容变更的提交历史。

vc_diff

两个已提交版本之间的统一差异——按记录范围(resource + id)或整个仓库范围;默认比较上一次触及该记录的提交与 HEAD。在 restore_resource 之前先检查——回滚绝不是盲目的。

restore_resource

将资源恢复到之前的已提交版本。

参见 docs/07 · 版本控制

资源zportal://guide/*)——Claude 在构建之前阅读的编写指南,因此即使在新机器上,区块也遵循 zPortal 约定:block-structurecurrentblockzportal-apichartingconventionsdesign-systemvisual-verificationmigration-1.18loading-overlaymigration-playbookblock-performance

提示词——引导式工作流现在位于此处,而不是工具界面中(共 9 个):zuar_portal_start(最便宜的会话开启方式——一次调用确认连接,报告一行内容,询问下一步)、zuar_portal_quickstart(定位 → 路由)、create_zportal_block(发现 → 构建 → 创建)、setup_zuar_project(连接此文件夹,路由到 configure_project)、migrate_block_to_118(一个旧版区块 → 1.18 生命周期)、add_loading_overlay(官方认可的加载动画 + 淡出效果)、block_perf_pass(大数据集性能审计:测量 → 精简 SELECT * → 图表库预取 → 60 秒诚实的超时)、design_intake(引导式主题设计——逐步处理品牌/网站/密度/圆角,驱动 synthesize_theme,然后通过 create_resource 创建主题),以及 migration_kickoff(引导式迁移范围界定——批量处理范围决策,写入 .zuar-portal/migration-scope.json,然后运行 migration_preflight)。


Claude Code 代理生态系统

当此仓库作为你的 Claude Code 工作目录时,MCP 工具附带一个位于 .claude/ 中的专家团队。你不需要手动驱动 create_block/bind_block_query——你只需描述你想要的内容,一个带门禁的流水线就会构建、美化、加固并审查它。完整指南:docs/13 · 代理与工作流

区块流水线

区块绝不会原样发布。一个规格说明会流经质量门禁,每个门禁都是一个专注的子代理:

flowchart LR
    spec([spec]) --> B["🏗️ builder"] --> St["🎨 stylist"] --> R["📱 responsive"] --> D["🔧 debugger"]
    D --> A{"🚨 adversary<br/><b>CODE GATE</b>"}
    A -- "blocking (≤2 rounds)" --> D
    A -- "clean" --> V{"👁️ visual<br/><b>GATE</b>"}
    V -- "blocking (≤2 rounds)" --> D
    V -- "clean / skipped" --> Ad["🧭 advisor"] --> ship([ship ✅])

    classDef gate fill:#fde68a,stroke:#b45309,color:#000;
    classDef ro fill:#dbeafe,stroke:#1d4ed8,color:#000;
    class A,V gate
    class Ad ro

对抗者(门禁)对区块进行红队测试,并用证据证明每个发现;当它返回阻塞性发现时,流水线会循环回调试器视觉门禁(拥有浏览器之眼的对抗者)随后在 Claude for Chrome 中打开渲染后的区块——截图、控制台、网络——空白渲染、控制台错误、非实时示例数据或溢出也会循环回调试器;它是尽力而为的,当扩展未连接或区块不在页面上时会跳过并附注说明。顾问会问"这是正确的区块吗?"所有门禁都是只读的——它们不携带任何写入工具,物理上无法修改门户(浏览/截图是只读的)。除了六个流水线代理之外,还有四个专家处理更广泛的任务:portal-data-expertportal-theme-designerportal-bulk-operator(快照优先)和 portal-onboarding

查看门户(Claude for Chrome)

上述每个门禁都根据区块的代码和查询行进行推理——但一个区块可能通过验证、绑定,却仍然渲染为空白、抛出运行时控制台错误、溢出其网格单元格,或静默显示硬编码的示例回退而不是实时数据。连接 Claude for Chrome 扩展后,代理可以看到门户:打开页面、截取区块截图、读取浏览器控制台/网络——用于视觉调试和最终的视觉签核

  • 在设置时记录。 configure_project 会询问你是否使用 Claude for Chrome,并将 browser.claudeInChrome 存储在 ./.zuar-portal/config.json 中;get_capabilities 会报告它。

  • 在值得的地方使用。 调试器在猜测之前先查看;对抗者负责视觉门禁;样式师和响应式专家会截取他们的工作截图(后者使用 resize_window 逐步调整宽度);顾问会检查它是否一目了然。

  • 登录注意事项。 MCP 使用 API 密钥进行身份验证,但浏览器需要已登录的会话——要查看私有页面,你必须在 Chrome 中登录你的门户。MCP 无法为你登录。

  • 设计上优雅降级。 没有扩展,或者区块不在页面上?每个代理都会回退到仅代码审查并明确说明。该原则记录在 zportal://guide/visual-verification 资源中。

斜杠命令

命令

运行内容

/portal-setup

首次按文件夹设置 + 对齐问答 → 配置 + 项目简报。

/portal-build <spec>

单个区块的完整 构建→样式→响应式→调试→对抗→顾问 流水线。

/portal-theme <goal>

设计或应用门户级主题。

/portal-bulk <change>

跨多个区块/页面的受保护批量变更(快照 → 预演 → 原子应用)。

/portal-audit [filter]

对现有区块的只读审计——错误、无障碍性、响应式、设计契合度。

/portal-improve

一次有边界的改进:评分 → 修复最差的区块 → 验证 → 全面检查 → 可证明的改进。可安全地安排为夜间任务。

/portal-align

单独运行对齐问答。

模型与推理强度路由

每个代理都运行在适合其工作的模型和推理强度上——在需要判断力的地方使用强模型,在机械性工作的地方使用廉价模型。三个组合层:

1 · 代理默认值model:/effort: frontmatter)——用于直接调用(快速的外科手术式编辑,或从命令中派发一个代理):

层级

代理

模型 · 推理强度

🧠 判断 / 数据

data-expert、adversary、advisor

opus · high

🛠️ 编写

builder、stylist、debugger、bulk-operator、theme-designer、onboarding

sonnet · medium

机械性

responsive-specialist

haiku · low

2 · 工作流 tier 开关——portal-block-pipeline.jsportal-audit.js 接受 args:{ …, tier } 并显式设置每个阶段的模型/推理强度:

tier

适用于…

构建者

判断门禁

fast

廉价迭代、一次性草稿、分诊

sonnet/haiku · low

sonnet · medium

standard (默认)

正常的构建 / 审计

sonnet · medium

opus · high

max

生产 / 高管构建、发布前审计

opus · high

opus · xhigh

3 · 命令固定为 sonnet · medium——它们只负责编排(预检 → 派发 → 综合);质量存在于它们调用的代理/工作流中。/portal-build/portal-audit 会根据你的措辞推断 tier

MCP 服务器从不选择模型——只有驱动它的代理、命令和工作流才会选择。通过代理 frontmatter 或工作流的 ROUTING 表重新分层;参见 .claude/README.md


引导式入门与主题设计

默认情况下,configure_project 从 MCP 进程提供一个极简的回环 Web 表单http://127.0.0.1:<random-port>), 尽力打开你的浏览器,并立即返回链接——你在浏览器中输入 URL、API 密钥、写入安全开关、访问范围和版本控制,因此 API 密钥永远不会经过模型。保存时它会实时验证,写入被 gitignore 的 0600 配置, 并实时应用更改。当无法使用浏览器时,它会回退到 MCP 引导式询问(逐字段提示), 然后再回退到参数——传递 ui:false,或传递 portal_url + api_key + user_id 作为参数。引导式主题设计是 design_intake MCP 提示词,它编排纯 synthesize_theme 工具。参见 浏览器设置表单

flowchart TB
    subgraph setup["🔌 configure_project — connect a portal"]
        direction TB
        s1["Portal URL"] --> s2["API key 🔒"] --> s3["User ID"] --> s4{"add GitHub VC?<br/>(optional)"}
        s4 --> s4b{"use Claude for Chrome?<br/>👁️ visual checks"}
        s4b --> s5["✓ live portal login<br/>✓ GitHub token + repo (API)"] --> s6[["writes .zuar-portal/config.json<br/>+ .gitignore"]]
    end
    subgraph intake["🎨 design_intake prompt — theme the portal"]
        direction TB
        d1["brand + website"] --> d2["fetch site 🛡️ SSRF-guarded<br/>→ suggest brand colors"] --> d3["palette · density · radius"]
        d3 --> d4["header + sidebar style"] --> d5{"confirm?"} --> d6[["synthesize_theme →<br/>create_resource (theme)"]]
    end
  • configure_project 拒绝覆盖现有配置,通过真实登录进行验证,并写入被 gitignore 的 ./.zuar-portal/。它还会询问你是否使用 Claude for Chrome(存储为 browser.claudeInChrome),以便构建流水线可以看到你的区块渲染——视觉调试 + 最终的视觉门禁(参见 查看门户)。setup_zuar_project 提示词和 /portal-setup 会路由到它;传递 interactive: false 以使用直接、无提示的路径。(取代 v2 的 setup_portalinit_project_config。)

  • design_intake 提示词通过 synthesize_theme受 SSRF 保护的抓取获取品牌网站以建议调色板,然后逐步处理密度/圆角/页眉/侧边栏,并在你确认后通过 create_resource 创建 theme 资源。synthesize_theme 本身是纯函数——它返回令牌映射和精确的 create_with 调用,并且从不写入。


要求

  • 一个可通过 HTTPS 访问的 Zuar Portal,具有可以管理区块的账户(建议管理员)。

  • Node.js 18+——用于 Claude Code 和任何其他 MCP 客户端。(Claude Desktop 的一键式 .mcpb 捆绑了自己的 Node,因此你无需安装任何东西。)

获取你的门户凭据

你需要三个值,在安装期间输入一次。

#

位置

1

门户 URL

基础 URL,不带尾部路径 — 例如 https://your-portal.zuarbase.net

2

门户 API 密钥

管理 → 认证 → API 密钥 → 创建/复制一个密钥。该密钥继承其用户的权限 — 该用户必须拥有创建/编辑/删除区块的权限。

3

门户用户 ID

管理 → 用户 → 你的用户 → 从页面 URL 中复制 UUID

[!IMPORTANT] 请保管好 API 密钥和用户 ID。在 Claude Desktop 安装包中,它们被标记为 敏感(掩码显示、安全存储),绝不会离开运行服务器的机器。


安装 — Claude Desktop(一键安装)

  1. 最新版本下载 zuar-portal-mcp.mcpb

  2. 双击它,或将其拖放到 Claude Desktop 窗口中,会出现安装对话框。

  3. 填写 门户 URL门户 API 密钥门户用户 ID(并可选择设置写入安全开关)。

  4. 确认。工具、资源和提示词现在可供 Claude 使用。

如需日后更新,在新的 .mcpb 上直接覆盖安装旧版本即可。

安装 — Claude Code 及其他 MCP 客户端

此服务器通过 stdio 使用 MCP 协议,因此任何支持 MCP 的客户端都可以使用它。先克隆仓库,构建一次,然后注册构建好的入口点 — 你需要 Node ≥ 18git

只需为任意项目注册一次:

git clone https://github.com/zuarbase/Zuar-Portal-MCP-Public.git ~/zuar-portal-mcp
cd ~/zuar-portal-mcp
npm install
npm run build
claude mcp add zuar-portal --scope user -- node ~/zuar-portal-mcp/dist/index.js

[!IMPORTANT] 请将克隆下来的仓库放在原处。 claude mcp add 会记录到 dist/index.js 的绝对路径,因此移动或删除该目录会导致服务器以 spawn ENOENT 报错。请为它选择一个长久稳定的位置 — 不要在 /tmp,也不要在 ~/Downloads

更新: 在原位置 pull 并重新构建。路径不会变化,所以无需重新注册 — 但请重启你的客户端,因为工具只在握手时获取。

cd ~/zuar-portal-mcp && git pull && npm install && npm run build

然后,在每个门户项目文件夹中,将其连接到对应的门户:

mkdir ~/work/acme-portal && cd ~/work/acme-portal
claude
> /portal-setup

/portal-setup 会询问你的三个值,用真实登录验证它们,并写入一个已被 gitignore 的 ./.zuar-portal/config.json。每个文件夹都可以指向不同的门户 — 参见按项目配置 ↓

在项目中使用 .mcp.json(或 claude_desktop_config.json)— 将 args 指向你本地仓库构建好的入口点,必须是绝对路径(此处不会展开 ~):

{
  "mcpServers": {
    "zuar-portal": {
      "command": "node",
      "args": ["/Users/you/zuar-portal-mcp/dist/index.js"]
    }
  }
}

[!IMPORTANT] 请让 env 保持为空。不要把 PORTAL_URL / PORTAL_API_KEY / PORTAL_USER_ID 放在客户端配置中。 客户端 env 中的凭据会形成一个每个项目都会静默共享的全局门户 — 所以一个在你看来指向 staging 的文件夹,可能会悄然在 anonymize/test 环境,甚至在远程环境中将数据发布出去。请改用 /portal-setup 编写来写每个项目的凭据。这样每个项目都会带有一个绑定指纹,而且服务器会拒绝向任何不属于该文件夹所绑定门户的写入请求。环境变量仍然可以使用(很适合 CI,或者单门户安装),但只有项目文件这种方式能保证你不会被意想不到的事情分心。


按项目配置(多门户)

一个 MCP 安装可以在每个文件夹中驱动不同门户 — 以及不同 git 状态存储库。启动时,服务器按优先级从高到低逐层解析配置:

flowchart LR
    A["1 · Project config<br/><code>./.zuar-portal/config.json</code><br/>(walks up from cwd)"] --> R{{"resolved<br/>credentials"}}
    B["2 · Environment<br/><code>PORTAL_*</code> env vars<br/>(Desktop / MCPB)"] --> R
    C["3 · Bundle config<br/><code>config.json</code> beside bundle"] --> R

大多数配置都是按字段各自解析的,因此项目文件可以只包含 vc.dir 字段,并继承其他配置。空值会被忽略,所以 Desktop 中的空字段不会掩盖项目文件中的值。

[!WARNING] 门户凭据属于例外 — 它们必须来自同一层、且同时齐全 (v4.0.0)。只要某一层出现了 url / apiKey / userId 中的任意一个,就同时提供全部三个,否则启动会失败且报错。 这里的按字段分层方式存在跨门户风险:一个项目如果只设置了 url,但没有 apiKey,会悄悄从环境中借用 PORTAL_API_KEY一个门户地址配上另一个门户的密钥

该文件对每个门户及其版本控制仓库使用同一套 schema:

{
  "portal": { "url": "https://team-a.zuarbase.net", "apiKey": "…", "userId": "…" },
  "vc":     { "dir": "/path/to/team-a-state", "push": true,
              "remote_url": "https://github.com/you/team-a-portal-state.git", "token": "…" }
}

无需手工编辑 JSON,直接配置: 让 Claude 执行 configure_project(参见可引导上手 ↑)。get_capabilities 会在其 config 键下显示当前生效的门户/仓库(机密信息会隐藏)。./.zuar-portal/ 已被 gitignore,因此凭据绝不会被提交。


快速开始

新门户?从这一步开始。 在你要工作的文件夹中:

cd ~/work/acme-portal
claude
> /portal-setup

一行命令。它会让文件夹与门户连接(写入 gitignore 凭据和绑定指纹)、分析数据源、询问业务情况,并生成其他 agent 会读取的项目简报。下面的所有内容都默认它已经执行完毕。

然后直接与 Claude 对话:

  1. 确认连接 — 例如 “列出我门户上的数据源” → 使用 list_resource (datasource)

  2. 查看真实数据 — 例如 “为我显示 Sales 数据源中的一些示例行” → 使用 profile_datasource(每列统计 + 原始示例行,让 Claude 先看到真实列名)。

  3. 创建区块 — 例如 “创建一个名为“Total Orders”的 stat-card 区块,显示 Sales 数据源中的订单数” → 它会读取 zportal://guide/*,构建双字段的区块,调用 create_block,然后报告 UUID。

  4. 迭代调整 — 例如 “把数字变大一些,并使用门户的主色调”“把它改成按州计的订单柱状图” → 使用 update_block

[!TIP] 在 Claude Code 中,运行 /portal-build "a stat card of total orders from Sales" 可将该规格推送到完整的受控门控流水线上;也可以调用 create_zportal_block 提示词,开始面向结构化“发现 → 构建 → 创建”流程。


写入安全与工具门控

每次写入都会标记一个风险域,并且独立门控:

覆盖范围

默认值

启用方式

content

区块、布局、局部视图、主题、查询、代码片段、翻译条目、仪表盘、标签

打开

(除非只读,否则默认打开)

data

数据源、db_modifications、run_db_modification

关闭

未知

admin

用户、用户组、权限、访问策略、API 密钥、凭据、系统、配置、密码

关闭

PORTAL_ALLOW_ADMIN_WRITES=1 开启

{{ (target: json_range(masToken)) }}

要完成每个写入工具,都统一设置 PORTAL_ALLOW_DATA_WRITES=1 是通过环境变量来开启的,而 PORTAL_ALLOW_ADMIN_WRITES=1 同理。

凡被拦截的写入,都会返回一条明确提示,说明应设置哪个环境变量;在该时刻,不会有任何请求送达门户。

run_db_modification 另要求每次调用都传递 confirm: true

删除操作以及用户/密码变更都会向 MCP 客户端标记为破坏性操作。

统一 dry_run: true (v3.0.0) 适用于每个写入工具 — 所有门都会完整执行(域、结构、对象规则、引用、影响)但不会写入任何内容,响应会报告 applied: false,并说明本来会产生什么改动。Dry run 永远不能绕过门控。

最小权限工具权限控制 (v2.5.0) — 使用 PORTAL_DISABLE_TOOLS=users,config 可禁用整个能力组,或用 PORTAL_ENABLE_TOOLS=blocks,resources,data 配置成仅构建白名单(拒绝优先)。

从 2.x 升级PORTAL_COMPAT_TOOLS=1(默认关闭)将已移除的 v2 工具名注册为 compat 组中的已弃用别名;每个别名都会转发到相同受控的 v3 处理器,因此不会激发额外能力。

完整性门控 (v2.5–2.6,服务端强制,不能绕过) — 每次内容写入都会检查结构是否可兼容门户(缺 grid.layouts 的页面会被自动修复或拒绝)以及引用是否悬空;删除操作运行删除前影响分析,除非 force=true,否则拒绝将依赖者置为孤立;用户删除不允许删除最后一位管理员;未限定条件的批量 SQL(如使用破坏性动词,且没有真实 WHERE — 1=1 不算,还包括 MERGE/TRUNCATE/DROP/ALTER…DROP/GRANT)都需要 allow_unfiltered=true,另外当 SQL 不可检查时,安全检查默认失败(fail closed)。任何你在此时可以运行只读的 validate_portal 来做全量扫描。完整指南请参[JS→的信息] docs/16 · 安全与完整性

无人值守循环安全性 (尚未发布) — 这些保证,让并行/通宵 agent循环可以放心无人值守:

  • 不创建重复数据:如果创建过程中出现模棱两桥的失败(例如请求发出后网络断了),服务器会按名称去验证,且若已存在会复用;绝不再盲目重发。run_db_modification 则根本不会自动重试。

  • 不会丢失更新:把读取时拿到的 expected_updated_at 传给 update_resource / update_block / place_blocks,其他人若中途改动了,就会返回冲突错误而不是悄悄覆盖。

  • 不会遗留垃圾数据:把循环递归写的临时文件命名为 TMP · <用途>(或打上 scratch 标签),运行规则使用 cleanup_scratch 清理即可 — 默认是 dry-run,只删除未被引用且不是新近,并通过正常门控路径。

  • 可证明的改善score_portal 会对每个区块/页面打分(0–100,考虑所有能机器检查的因子),并将当前分数与已保存的基线做比对,一条条的 delta 会清晰显示一个循环是否回退。

  • 管理员不能自锁:删除自己的管理员权限需要 allow_self_lockout=trueupdate_configchange_password 必须使用 confirm(配置文件还应返回 previous_at_path,可一步还原)。

在 Claude Desktop 中,这些是安装弹窗的开关;在其他客户端中,作为环境变量设置。了解更多:docs/14 · 工具节流与指南(主页),或 docs/16 · 安全与完整性


弹性、可观测性与加固

针对本地、单用户服务器,默认生产级行为 — 安全、零配置设计。

弹性(每个工具都通过它调用门户HTTP客户端):

行为

默认值

调整方式

单次尝试超时

30 秒

PORTAL_TIMEOUT_MS

对瞬时故障(网络、408/425/429/5xx)的重试,指数退避 + 抖动,遵循 Retry-After

2

PORTAL_MAX_RETRIESPORTAL_BACKOFF_BASE_MSPORTAL_BACKOFF_MAX_MS

熔断器 — 上游宕机时快速失败

5 次失败后打开,冷却 15 秒

PORTAL_BREAKER_THRESHOLDPORTAL_BREAKER_COOLDOWN_MS

最大请求体大小

5 MB

PORTAL_MAX_BODY_BYTES

最大工具输入大小(在 MCP 边界拒绝)

2 MB

PORTAL_MAX_INPUT_BYTES

execute_query 返回行数上限

1,000 行(limit:0 表示全部)

每次调用的 limit

list_resource 页面字节上限(自动投影为 {id,name} + 备注)

60k 字符

PORTAL_LIST_BYTE_CAP(0 表示禁用)

结果序列化

紧凑 JSON

PORTAL_PRETTY_JSON=1 用于美化

绑定重新验证频率

10 分钟 + 配置重载时

PORTAL_BINDING_REVERIFY_MS

读缓存(GET;任何写入都会清除;写关键读绕过)

5 秒 TTL

PORTAL_READ_CACHE_MS(0 表示禁用)

重试安全:GET 对任何瞬时信号进行重试;写入仅在明确的 429/503 背压或可证明从未连接的网络故障时重试 — 绝不在模糊的 502/504 上重试,并且一个 create 如果其网络错误可能已经送达请求,则按名称验证并采用,而不是重新发送(不会静默重复)。

可观测性 — 每次调用都会获得请求 ID、延迟和错误计数。get_metrics(始终开启)报告每个工具的次数、错误率、延迟、运行时间和熔断器状态 — 仅元数据,不包含负载或机密。设置 PORTAL_LOG_FORMAT=json 以获取结构化 stderr 日志;PORTAL_AUDIT_LOG 为每次内容/数据/管理员写入追加仅元数据的 JSONL。

输出机密编辑 — 包含机密的字段(passwordsecrettokenapi_key 等)在资源读取时被掩码为 [redacted],因此它们永远不会流入模型的上下文,并且机密也会按形状在任何值或名称中被捕获 — 连接字符串密码(postgresql://user:[redacted]@host)、JWT、PEM 私钥、AWS 密钥 ID — 包括在 execute_query / profile_datasource 结果中。通用十六进制和 key=value 形状故意掩码(uuid、git SHA 和 SQL 参数是合法内容,会往返回写入)。标识符 *_id 字段永远不会被掩码;创建/更新响应保持完整(因此新生成的机密可以看到一次)。使用 PORTAL_REDACT_SECRETS=0 禁用。Portal 创作的内容还会在不可信数据信封内返回,因此被污染的记录名称会被读取为数据,而不是指令。


故障排除

症状

可能的原因 / 修复方法

"failed to connect" / spawn ENOENT

客户端无法启动该命令。可能原因:(a) 克隆的仓库被移动或删除——claude mcp add 存储的是指向 dist/index.js绝对路径;用 claude mcp list 重新检查;(b) 你在运行 npm run build 之前就注册了它,所以 dist/index.js 不存在——先构建,再重启客户端;或 (c) node 不在客户端可见的 PATH 中(nvm + Claude Desktop 常见,它不会加载你的 shell 配置文件——请使用那里的 .mcpb,它自带运行时)。

旧指南说要运行 npx -y zuar-portal-mcp-server

该包不在 npm 上——该命令无法工作,会以 ENOENT 失败。请从克隆的仓库安装:安装 — Claude Code ↓

读取正常,但每次写入都被拒绝为 unbound

此文件夹未绑定到门户。在其中运行 /portal-setup(或 configure_project)。绑定正是为了防止一个项目的块发布到另一个项目的门户,因此这是有意为之——参见按项目配置

"缺少门户凭据:…"

PORTAL_URL / PORTAL_API_KEY / PORTAL_USER_ID 中有一个为空。请重新输入。

"…必须同时提供 url/apiKey/userId 三项"

某个配置层只指定了部分凭据而非全部。这是有意拒绝的——没有 apiKeyurl 过去会静默借用你环境中的密钥,将一个门户的地址与另一个门户的密钥配对。请在同一处提供全部三项。

"门户登录失败:HTTP 401/403"

API 密钥或用户 ID 错误,或用户缺少权限。请重新生成密钥;确认该用户可以管理块。

list_resource (query) 提示端点不可用

你的门户早于保存查询 API(1.18+)。请使用 resource: "datasource"——这是预期行为,不是错误。

工具没有出现在 Claude 中

重启客户端——工具列表只在握手时获取一次,因此新添加的服务器(或新版本)不会出现在正在运行的会话中。对于 .mcpb,请重新安装。

你升级了,但新工具/规则没有出现

原因相同:客户端仍在运行旧进程。请重启它。

缺少 v2 工具名称(list_blockssetup_portal 等)

v3.0.0 已移除/重命名它——请参阅 CHANGELOG.md 了解替代名称,或设置 PORTAL_COMPAT_TOOLS=1 以启用已弃用的转发别名。

想查看它在做什么

设置 PORTAL_DEBUG=1(或 PORTAL_LOG_FORMAT=json)。日志仅输出到 stderr

"熔断器已打开"

上游反复失败;短暂冷却后会自动恢复。get_metrics 会显示熔断器状态。

存储的密钥返回 [redacted]

读取脱敏已开启。请为该会话设置 PORTAL_REDACT_SECRETS=0

更多:docs/12 · 故障排查


安全

  • 凭据绝不会被记录。调试输出(由 PORTAL_DEBUG=1 控制)仅进入 stderr,因此绝不会破坏 MCP stdio 流。

  • API 密钥和用户 ID 在包清单中被声明为敏感

  • 服务器只与您配置的门户 URL 通信;启动时会验证基础 URL 是否为格式良好的 http(s) 源。synthesize_theme 的网站抓取(由 design_intake 提示驱动)受 SSRF 防护

  • create_block / update_block 仅限于 type: "html",并在任何门户调用之前拒绝其他类型。

  • 包含密钥的字段在读取时会被脱敏;工具输入和请求体有大小上限

完整的安全态势请参阅 SECURITY.md:按工具组划分的数据接触矩阵、凭据处理、网络出口和数据保留。

许可证

MIT

Install Server
A
license - permissive license
A
quality
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    A
    quality
    Not graded
    maintenance
    Enables comprehensive PostgreSQL database management through natural language including queries, schema operations, user management, and administrative tasks. Features enterprise-grade connection pooling, transaction support, and full database administration capabilities.
    11
    225
    1
  • A
    license
    A
    quality
    A
    maintenance
    Enables management of LaunchNotes projects and announcements through natural language, including customization of themes, colors, content, and publishing announcements with full read/write access via the LaunchNotes GraphQL API.
    22
    224
    MIT
  • A
    license
    A
    quality
    Not graded
    maintenance
    AI-powered WordPress management that enables creating and editing posts, pages, media, plugins, themes, and Gutenberg blocks through natural language with safe-by-default writes and full rollback support.
    5
    24
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language management of apps, services, resources, attributes, and data via the Dimetrics API with full CRUD operations and advanced filtering.

View all related MCP servers

Related MCP Connectors

  • Build, version, review, and export websites, web apps, and games from a conversation.

  • Manage projects, tasks, time tracking, and team collaboration through natural language.

  • GibsonAI MCP server: manage your databases with natural language

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/zuarbase/Zuar-Portal-MCP-Public'

If you have feedback or need assistance with the MCP directory API, please join our Discord server