@ 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.
连接选项
备选案文1:主机MCP服务器(建议)
将任何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 :
- 删除旧的
command编号 :args编号 :env配置 - 替换为:
{ "type": "url", "url": "https://mcp.centrali.io" } - 下次连接时, 在浏览器中认证
环境变量(仅限astio模式)
| 变量 | 需求 | 说明 |
|---|---|---|
CENTRALI_URL | 对 | 中央实例 URL( 例如 ), https://centrali.io(中文(简体) ) |
CENTRALI_WORKSPACE | 对 | 要操作的工作空间弹片 |
CENTRALI_CLIENT_ID | 对 | 服务账户客户端ID |
CENTRALI_CLIENT_SECRET | 对 | 服务账户客户端秘密 |
服务账户权限
新创建的服务账户 默认没有权限。在 MCP 服务器做任何有用的事情之前, 您必须指定它的角色, 否则每个工具呼叫都会返回 403 Forbidden。 。 。 .
最快的设置——全管理员访问:
- 在指挥台,去 设置 > 服务账户
- 创建您的服务账户并保存客户端秘密
- 打开服务账户,转到 组 选项卡
- 把它加进 工作空间( 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_providers | Auth 提供者参考( 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 声明)。 预期发现时执行流量 :
- 发现计划 (一发
describe_saved_queries返回时QueryVariableDefinition形状( e)type, (中文(简体) ),required?, (中文(简体) ),default?, (中文(简体) ),description?和受支助者VariableType工会string|number|boolean|datetime|id|{ array: T }|{ reference: collectionSlug }) (中文(简体) ). - 发现查询 —— 说
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 } } } - 已执行 - 通过
execute_saved_query是因为variablesrg. 服务器对照其声明的类型验证每个值( 不强制 ) -"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 分布.