@centrali-io/centrali-mcp

中文文档
9.10.0发布于 2026/11/09ISCTypeScriptCommonJS近 30 天下载 2683

Centri MCP( 中央中心) 服务器 - Centrali 工作空间的 AI 助理集成

中文使用文档
文档目录27 节
  1. 文件上传
  2. 连接选项
  3. 备选案文1:主机MCP服务器(建议)
  4. 备选案文2:带有服务账户的系统(CI/自动化)
  5. 从 OAuth stdio 迁移到主机
  6. 环境变量(仅限astio模式)
  7. 服务账户权限
  8. 开始
  9. 可用工具
  10. 发现(先叫这些)
  11. 收款
  12. 记录
  13. 计算
  14. 已保存的查询
  15. 警报
  16. 管弦乐
  17. 透视(异常检测)
  18. 校验(数据质量)
  19. 服务账户和IAM
  20. 网页订阅
  21. 可出版密钥( 前线)
  22. 身份
  23. 结构(已折旧)
  24. 资源
  25. 发展
  26. 二. 服务账户识别符
  27. 开发测试

@ centrali-io/ centrali- mcp

Centrali平台的MCP(模式上下文协议)服务器. 让AI助手(Claude,Cursor等)与Centri工作空间互动——查询数据,管理记录,搜索,触发函数,检查执行结果,构建管弦乐,等等.

完整文档: (原始内容存档于2018-09-29) (英语). docs.centeri.io ——SDK向导,API参考,计算函数,管弦乐等等.

文件上传

提供主机和Stdio服务器 upload_file。它上传一个独立的存储器 通过现有的SDK和存储 API,使用认证的工作空间 及其现有的文件夹权限。 节点(Node.js 22)或更新的需要为stdio.

{
  "filename": "hello.txt",
  "contentType": "text/plain",
  "contentEncoding": "utf8",
  "content": "Hello from MCP"
}

用于二进制文件 contentEncoding: "base64" 以警犬加固基座64 (没有数据 URL 前缀或白空). 解码限制是 256基贝,包括: 文本的 UTF-8 字节长度 。 支持空文件 。 连载 content JSON弦还有一个 768 基贝 所以JSON离开 空间在 主机服务器的 1 MB 请求限制 。 对于重逃的文本( 如控件) 字符),将准确的UTF-8字节编码为base64. location 默认为 /root/shared; 自定义文件夹 必须已经存在。 文件是私有的,除非 isPublic: true 明确设置. 公共上传只允许 PNG, JPEG, GIF, WebP, 纯文本, JSON, MPEG/OGG/ WAV 音频,以及MP4/WebM视频MIME类型. HTML、SVG、XML 和其他活动文档 类型不能通过此工具公开, 因为存储服务 在 API 来源上提供了 MIME 类型 。 私人上传保留支持 用于任意的 MIME 类型。 SDK 前缀在工作空间中存储文件名 和时间戳.

结果包含 renderId, (中文(简体) ), sizeBytes, (中文(简体) ), contentType, (中文(简体) ), isPublic, (中文(简体) ), renderUrl 财务报告和审定财务报表 downloadUrl。私人 URL 仍然需要正常的认证。 附上 返回时使用单独的记录更新渲染 ID; 附件失败离开 存储中上传的文件。 重复上传可以创建另一个文件.

该工具接受客户端提供的内容. 它不能读取本地路径, 获取源代码 URL,或访问隐藏的聊天附件/生成的图像 主持人。 永远不要通过模型复制重建图像字节. 更大的文件 比起256 KiB,必须使用现有的SDK/HTTP多段上传API.

连接选项

将任何AI客户端连接到Centrali的最简单方式. 添加一个单一的URL——认证通过OAuth在浏览器中发生.

Claude桌面 / Claude 代码/ 光标 :

{
  "mcpServers": {
    "centrali": {
      "type": "url",
      "url": "https://mcp.centrali.io"
    }
  }
}

首先使用时,您的AI客户端打开浏览器进行登录和工作空间选择. 不需要客户身份 秘密或工作空间的子弹.

备选案文2:带有服务账户的系统(CI/自动化)

对于无头环境(CI管线,自动化脚本,cron jobs),浏览器无法登录. 使用有RBAC权限的服务账户证书.

{
  "mcpServers": {
    "centrali": {
      "command": "npx",
      "args": ["@centrali-io/centrali-mcp"],
      "env": {
        "CENTRALI_URL": "https://centrali.io",
        "CENTRALI_CLIENT_ID": "<service-account-client-id>",
        "CENTRALI_CLIENT_SECRET": "<service-account-secret>",
        "CENTRALI_WORKSPACE": "my-workspace"
      }
    }
  }
}

从 OAuth stdio 迁移到主机

如果你之前使用过 CENTRALI_OAUTH_CLIENT_ID 与 stdio 软件包一起,切换到主机 URL :

  1. 删除旧的 command编号 :args编号 :env 配置
  2. 替换为: { "type": "url", "url": "https://mcp.centrali.io" }
  3. 下次连接时, 在浏览器中认证

环境变量(仅限astio模式)

变量需求说明
CENTRALI_URL对中央实例 URL( 例如 ), https://centrali.io(中文(简体) )
CENTRALI_WORKSPACE对要操作的工作空间弹片
CENTRALI_CLIENT_ID对服务账户客户端ID
CENTRALI_CLIENT_SECRET对服务账户客户端秘密

服务账户权限

新创建的服务账户 默认没有权限。在 MCP 服务器做任何有用的事情之前, 您必须指定它的角色, 否则每个工具呼叫都会返回 403 Forbidden。 。 。 .

最快的设置——全管理员访问:

  1. 在指挥台,去 设置 > 服务账户
  2. 创建您的服务账户并保存客户端秘密
  3. 打开服务账户,转到 组 选项卡
  4. 把它加进 工作空间( a) 组

最低特权设置: 创建自定义组,其策略范围设定为您需要的资源 。 见 政策和权限指南 详细情况.

开始

连接后, 拨打 describe_centrali 首先——它返回全能映射,特征矩阵,和SDK集成指导. 然后使用特定 describe_* 用于任何域的更深层次计划细节的工具.

可用工具

发现(先叫这些)

工具说明
describe_centrali平台概览、特征矩阵、SDK整合指导以及所有工具清单
describe_collections收集的图表参考(数据模型、字段类型、限制)
describe_records记录操作( 过滤、 排序、 pagination、 扩展) 的 Schema 引用
describe_compute计算函数引用( 输入合同、 秘密、 自动执行、 api 对象)
describe_saved_queries保存-query 计划参考(参数化查询,变量)
describe_orchestrations管弦参考(多步工作流程,加密参数)
describe_insights反常的见解参考
describe_validation数据验证参考
describe_auth_providersAuth 提供者参考( BYOT 设置, 索赔映射)
describe_service_accounts服务账户和 IAM 参考( SA 设置、 角色、 组、 权限)
describe_webhooks输出的 webhook 引用( 订阅形状、 签名、 重试/ 重放)

收款

工具说明
list_collections列出工作空间中的所有数据收集( chemas)
get_collection用有记录的弹簧来收集完整的计划
create_collection创建带有输入属性的新收藏
update_collection更新现有收藏
delete_collection删除收藏及其所有记录

记录

工具说明
query_records使用cononic Central查询语言(POST /records/query)查询记录. 接受一个 QueryDefinition 体 (单位:千人)where, (中文(简体) ), text, (中文(简体) ), sort, (中文(简体) ), page, (中文(简体) ), select) (中文(简体) ).
get_record通过身份识别获得单一记录
get_records_by_ids用身份证获取多个记录
create_record创建新记录
update_record更新现有记录
upsert_record创建或更新记录
delete_record软或硬删除记录
restore_record恢复软删除记录

计算

工具说明
list_functions列出计算函数
get_function通过 ID 获得一个函数( 包括代码)
create_function创建新的计算函数
update_function更新函数( 代码、 名称、 超时)
delete_function删除计算函数
test_function在不保存的情况下测试执行代码
list_triggers列表函数触发器( 点名、 事件驱动、 排程、 http- 触发)
get_trigger用ID来触发
create_trigger创建新触发
update_trigger更新触发器
delete_trigger删除触发器
invoke_trigger启动一个点播触发器(返回工作ID-async)
pause_trigger暂停触发
resume_trigger恢复暂停触发
test_send_trigger通过 http-trigger 真实的校验/发送路径发送已签名的合成测试事件
get_function_run通过运行 ID( 状态、 输出、 错误) 获取执行结果
list_function_runs列表运行于触发或函数 ID( 执行历史)
get_compute_job_status通过工作标识( 引用后翻转) 检查 async 工作状态
list_allowed_domains列出出入境的允许域 HTTP
add_allowed_domain在允许列表中添加一个域
invoke_endpoint按路径调用同步计算结束点( 返回响应内含)
remove_allowed_domain从允许列表中删除一个域

已保存的查询

已保存的查询存储库 QueryDefinition 加可选变量和可选多集 joins[] 条款.

工具说明
list_saved_queries列表保存的查询, 可选择通过收藏
get_saved_query用 ID 获取已保存的查询
create_saved_query创建可重复使用的参数化查询( 名称正文)
update_saved_query更新已保存的查询( 分类正文)
delete_saved_query删除已保存的查询
execute_saved_query执行带有可选变量的已保存查询
test_saved_query在不保存的情况下测试条形查询定义

已键入参数发现 ~ 执行. 使用已键入参数编写的已保存的查询通过参数形状曝光 describe_saved_queries (schema参考)和 get_saved_query 编号 : list_saved_queries (逐行数) variables 声明)。 预期发现时执行流量 :

  1. 发现计划 (一发 describe_saved_queries 返回时 QueryVariableDefinition 形状( e)type, (中文(简体) ), required?, (中文(简体) ), default?, (中文(简体) ), description?和受支助者 VariableType 工会string | number | boolean | datetime | id | { array: T } | { reference: collectionSlug }) (中文(简体) ).
  2. 发现查询 —— 说 get_saved_query 返回包含 variables。读取每个条目以学习什么是束缚。 犬类反应包括: queryDefinition.resource (总是等于行 recordSlug:
    {
      "id": "…",
      "name": "Monthly revenue",
      "recordSlug": "orders",
      "queryDefinition": {
        "resource": "orders",
        "where": { "and": [
          { "data.month": { "eq": "${month}" } },
          { "data.region": { "eq": "${region}" } }
        ]},
        "sort": [{ "field": "data.amount", "direction": "desc" }],
        "page": { "limit": 100 }
      },
      "variables": {
        "month":  { "type": "datetime", "required": true, "description": "Month bucket (UTC)" },
        "region": { "type": "string",   "required": true }
      }
    }
    
  3. 已执行 - 通过 execute_saved_query是因为 variables rg. 服务器对照其声明的类型验证每个值( 不强制 ) - "123" 将不接受 number ,然后替换. datetime 接受 ISO-8601 字符串 :
    {
      "recordSlug": "orders",
      "queryId": "…",
      "variables": { "month": "2026-04-01T00:00:00Z", "region": "us-east" }
    }
    
    输入错误表面为 variable_type_mismatch, (中文(简体) ), missing_required_variable,或 extra_variable未类型(遗留)行有 variables: null ,并接受任何密钥;在替换前,数值会被字符串。 未打入的倒置也由后填行取取出(canonical body,尚未声明),直到作者推广.

多边方案 test_saved_query 工具故意这样做 没有 曝光 variableDeclarations ——它的干燥路径又回到了遗留的字符串替代,不执行打出的声明. 绕行 create_saved_query + 键 execute_saved_query 以验证输入参数的端到端.

多收相会入. 保存的查询支持可选 joins[] 条款 queryDefinition (最多4个条目). 每个条目加入另一个集合到主记录集中:

{
  "resource": "orders",
  "where": { "data.status": { "eq": "open" } },
  "joins": [
    {
      "foreignSlug": "customers",
      "localField": "data.customerId",
      "foreignField": "id",
      "joinType": "left",
      "select": ["id", "data.name", "data.email"],
      "alias": "customer"
    }
  ],
  "sort": [{ "field": "createdAt", "direction": "desc" }],
  "page": { "limit": 50 }
}

制约因素(经 @centrali/query:

  • joinType 必须是 'inner' 或者说 'left' —— 说 'right' 财务报告和审定财务报表 'full' 被执行人拒绝 unsupported_clause。 。 。 .
  • text 财务报告和审定财务报表 joins 无法在同一查询中显示( n)unsupported_combination) (中文(简体) ).
  • 别名( 或隐含) foreignSlug在其中必须是独一无二的 joins[] (单位:千美元)duplicate_join_alias) (中文(简体) ).
  • 4个条目的封顶( C)joins_length_exceeded) (中文(简体) ).
  • localField 可使用 <priorAlias>.<field> 通过先前的化名将一个加入物链起来.

execute_saved_query 返回时 { rows, meta, fields }。每个条目 rows 在顶层下携带关联数据 _joined 键 :

{
  "rows": [
    {
      "id": "order-123",
      "data": { "status": "open" },
      "_joined": {
        "customer": { "id": "cust-1", "data": { "name": "Acme" } }
      }
    }
  ],
  "meta": { "limit": 50, "offset": 0, "total": 1 },
  "fields": [{ "name": "id" }, { "name": "data" }, { "name": "_joined" }]
}

LEFT 加入表面 null 用于无与伦比的行.

授权(SECURITY DEFINER,锁入2026-05-04). 保存的查询是作者绑定的 —— AUTHOR 权限定义查询可以读取的内容; 执行者只需要一个 execute 运行时检查保存的- query 资源 .

  • 作者时间 (单位:千美元)create_saved_query 编号 : update_saved_query 编号 : test_saved_query:呼叫者必须坚持 records:list 主要收藏品和每份参考文献 joins[]。如果缺少任何访问,数据服务返回403.
  • 执行时间 (单位:千美元)execute_saved_query: 仅限 execute 在保存的-query资源上检查;没有每次收集的再检查,并且字段级的编辑遵循了作者的权限,而不是执行者的权限。 秘密伪装仍然无条件适用.

AI 助手不应针对收藏提出保存的查询(或加入链条) 作者 无法读取 —— 执行会成功给不太特权的呼叫者,但作者会失败.

保留条款. 拒绝保存- query 创建/ 更新/ 测试表面 text (全文搜索)和 include (关系扩大)422 unsupported_clause这些条款可在特设委员会上查阅 POST /records/query 表面 – 不要作者保存使用它们的查询 .

警报

在 cron 上运行保存的查询,并在结果满足条件时通知人们.

工具说明
list_alerts列表提醒, 可选择过滤到一个已保存的查询
get_alert通过ID获得警告,包括其评价历史
create_alert在已保存的查询中创建预定提醒
update_alert更新提醒的调度、 条件、 收件人、 绑定或启用状态
delete_alert删除提醒并取消任务

条件. 今天有两艘船.. { kind: 'rowCount', op, value } (单位:千美元)op 一个 eq编号 :neq编号 :gt编号 :gte编号 :lt编号 :lte和 { kind: 'rowsChanged' },当行数与前一次评价不同时会起火,并且不会在第一次运行时起火(它只会给基线投下种子). 没有 aggregate 类型 : 提醒原因, 说明有多少行返回, 而不是总和或平均内容。 要在集合上提醒, 编写保存的查询, 从而返回行 为: 例外设置和提醒 rowCount。 。 。 .

日程安排. cronExpression 是一个5-字段克龙表达式,在 timezone (IANA名称,默认) UTC) (中文(简体) ). 通知被节制到每个接收者每15分钟1个警报,所以一个分15分钟的克龙比它所能通知的更频繁的评价.

受取者. recipients 这是一份明确的清单—— [{ type: 'user', id: '<userId>' }] - 不是订阅名单。 没有 MCP 工具列出工作空间用户,所以一个助手必须向用户询问ID而不是构建它们.

绑定变量——比执行更严格. 如果保存的查询宣布参数,请通过 variables。服务器在创建和提交时验证地图,并需要 每次声明查询机构引用没有 default,无论 required数字 :

{
  "savedQueryId": "…",
  "name": "Failed payments spiked",
  "cronExpression": "0 * * * *",
  "condition": { "kind": "rowCount", "op": "gt", "value": 10 },
  "recipients": [{ "type": "user", "id": "…" }],
  "variables": { "status": "failed" }
}

execute_saved_query 接受无约束的可选选项并留下原始 ${name} ;然后在字面占位符上过滤,不匹配,并报告没有出错。 互动可见——呼叫者看到空出结果. 所以警报不会开火 lastEvaluatedAt 继续前进,好像健康。 写作是最后一点 差距是显著的, 所以它失败了 在那里一个400 命名每个违法的变量.

诊断"它从来没有发射". get_alert 曝光情况 lastEvaluatedAt, (中文(简体) ), lastTriggeredAt, (中文(简体) ), lastRowCount,以及卫生领域 consecutiveFailures, (中文(简体) ), lastError, (中文(简体) ), lastErrorAt。 。 。 .

检查 consecutiveFailures 先说 非零表示警报后所保存的查询是出错的,因此警报是预定和启用的,但不能开火; 2; lastError 带着消毒的理由 lastErrorAt 当它最后一次发生。 最常见的原因是从查询下重新命名的集合或字段. 计数器是一个运行长度,在第一次成功评价时重置,所以 0 规则整个失败阶层 而不是仅仅暗示健康.

与 consecutiveFailures 时间 0,无效或陈旧 lastEvaluatedAt 表示提醒已禁用或从未安排 。 当前 lastEvaluatedAt 无效 lastTriggeredAt 表示查询运行良好且条件不匹配 – 比较提醒 variables 根据保存的查询声明.

管弦乐

工具说明
list_orchestrations列出工作空间中的所有组合
get_orchestration获得包括步骤定义在内的管弦细节
create_orchestration创建多步工作流程
update_orchestration更新管弦乐(步骤、触发器、加密参数)
delete_orchestration删除管弦乐及其运行
activate_orchestration启动管弦乐(可触发器)
pause_orchestration暂停管弦( 失效触发器)
trigger_orchestration触发带有可选输入数据的运行
list_orchestration_runs列表运行用于调谐
get_orchestration_run获取运行细节( 包括Steps= true用于分步调试)

透视(异常检测)

工具说明
trigger_anomaly_analysis启动异常探测扫描
list_insights清单异常见解
get_insight得到一个单一的见解
acknowledge_insight将见解标为已审查
dismiss_insight抛开洞察力
get_insights_summary获取洞察力汇总数

校验(数据质量)

工具说明
trigger_validation_scan开始数据质量扫描
list_validation_suggestions列表验证建议
accept_validation_suggestion接受固定( 用于记录)
reject_validation_suggestion否决建议
get_validation_summary获取验证摘要计数

服务账户和IAM

工具说明
list_service_accounts列出所有服务账户
get_service_account获取服务账户细节
create_service_account创建服务账户( 返回客户端ID + 客户端Secret)
update_service_account_name更新 SA 显示名
update_service_account_description更新 SA 描述
delete_service_account永久删除服务账户
rotate_service_account_secret旋转客户端密钥( 旧一个立即失效d)
revoke_service_account永久撤销服务账户
generate_dev_token生成一个短命的 dev 符号用于测试
scan_service_account_permissions全面访问矩阵审计(每个资源+行动Allow/Deny)
simulate_service_account_permission以评价跟踪模拟授权检查
generate_remediation生成给予缺失权限的选项( 作用、 组或新政策)
preview_remediation预览补救选项的改变
apply_remediation应用补救选项允许访问
list_service_account_roles列出分配给SA的角色
assign_role_to_service_account指派一个SA的角色
remove_role_from_service_account从 SA 中删除一个角色
list_service_account_groups列出一组 SA 属于
add_service_account_to_group添加 SA 到组
remove_service_account_from_group从组合中删除 SA
list_roles列出工作空间中的所有角色
get_role使用权限获取角色细节
create_role使用权限创建角色
update_role更新角色
delete_role删除一个角色
list_groups列出所有组
get_group获取组细节
create_group创建组
update_group更新组
delete_group删除一组

网页订阅

工具说明
list_webhook_subscriptions列出所有出局的 Webhook 订阅
get_webhook_subscription使用 ID 订阅( 未包含机密)
create_webhook_subscription创建订阅- 响应返回 whsec_ 签过一次秘密
update_webhook_subscription更新名称、 URL、 事件、 记录Slugs 或活动旗帜
delete_webhook_subscription删除订阅( 保存交货历史)
rotate_webhook_subscription_secret重现签名秘诀( 立即切换)
publish_webhook_event发布一个命名的商务活动(例如:. invoice.paid)并把它扇出匹配订阅
list_webhook_deliveries订阅( 三行) 列表发送历史
get_webhook_delivery获得一个装满有效载荷和反应机体的单发货
retry_webhook_delivery重放交货——再利用原始有效载荷和签名
cancel_webhook_delivery取消正在重试的送出( 使用特殊标记失败)

可出版密钥( 前线)

工具说明
list_publishable_keys列出所有可公布的密钥
get_publishable_key获取带有瞄准镜的密钥细节
create_publishable_key创建范围前端密钥( pk live ...)
update_publishable_key更新标签或范围
revoke_publishable_key撤销一个密钥( 立即、 不可逆转)

身份

工具说明
get_current_identity获取当前认证的 MCP 身份( 服务账户或 OAuth 用户)

结构(已折旧)

工具说明
list_structures折旧:使用 list_collections
get_structure折旧:使用 get_collection

资源

URI 资源说明
centrali://collections所有收藏的列表, 有名称、 弹片、 描述
centrali://collections/{slug}特定收藏的完整计划

发展

# Install dependencies
npm install

# Build
npm run build

# Test with MCP inspector
CENTRALI_URL=https://centrali.io \
CENTRALI_CLIENT_ID=... \
CENTRALI_CLIENT_SECRET=... \
CENTRALI_WORKSPACE=my-workspace \
npx @modelcontextprotocol/inspector node dist/index.js

二. 服务账户识别符

账户路径工具使用字符串 clientId 返回时间 create_service_account 编号 : list_service_accounts,包括获取,更新,旋转,撤销,删除,dev-token,角色/组成员,以及权限扫描/模拟. 他们不再接受数字 serviceAccountId 投入。 支持现有的遗留客户ID. 在部署客户端ID路由更改时, 将这个软件包与 IAM 一起升级 .

分开 generate_remediation, (中文(简体) ), preview_remediation,以及 apply_remediation 工具保留其数字 serviceAccountId aPI的访问参数 targetId 合同。 账户应对措施继续包括两个方面 id 财务报告和审定财务报表 clientId。 。 。 .

开发测试

npm test 首先在单列中运行时建立兄弟式 SDK, 然后构建 MCP和运行它的测试。 健康回归使用真正的SDK正常化, 因此,它的运行时间分布必须存在,即使是在新离职时。 在外边 取而代之的是安装的 SDK 分布.

版本与发布记录

@centrali-io/centrali-mcp 共发布 129 个版本,首次发布于 2026/02/17;过去 12 个月发布了 129 个版本。

版本发布日期距今
9.10.0latest2026/11/09今天
9.9.02026/11/09今天
9.8.02026/11/081 天前
9.7.02026/11/072 天前
9.6.02026/11/054 天前
9.5.22026/10/2812 天前

其他发布通道:rc → 4.4.8-rc.9。

关于 @centrali-io/centrali-mcp 的常见问题

@centrali-io/centrali-mcp 是什么?

Centri MCP( 中央中心) 服务器 - Centrali 工作空间的 AI 助理集成

如何安装 @centrali-io/centrali-mcp?

在项目目录运行 npm install @centrali-io/centrali-mcp,或使用 pnpm add / yarn add / bun add。它还提供命令行工具 centrali-mcp,可以用 npx centrali-mcp 直接运行。

@centrali-io/centrali-mcp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@centrali-io/centrali-mcp 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@centrali-io/centrali-mcp 可以商用吗?

@centrali-io/centrali-mcp 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@centrali-io/centrali-mcp 的下载量有多少?

根据 npm 官方下载统计,@centrali-io/centrali-mcp 在 2026/10/10 – 2026/11/08 这 30 天内被下载 2,683 次,日均约 89 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@centrali-io/centrali-mcp 还在维护吗?

最新版本 9.10.0 发布于 2026/11/09(今天);至今共发布 129 个版本,其中过去 12 个月发布了 129 个;首次发布于 2026/02/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。