跳转到内容

upsert_schedule — 创建或替换计划

替换一个具名自动化计划;省略选项会重置为默认值。

适用于稳定版 Viat 1.1.0。先阅读 MCP 配置与结果处理。以下为合成的、从源码推导的预期形状,不是已执行的响应。编写本页没有访问服务、提供方或设备。

需要所选项目的成员身份(任意项目角色,包括 Viewer)。平台角色不等同于项目成员身份。PAT 必须有效且其范围允许访问该路由。

使用已激活的隔离实例,配置服务器和 bearer;除 list_projects 外须有 mcp-lab 项目。示例中的现有资产和 ID 以概览夹具为前提,用夹具实际返回 ID 替换合成 ID;示例不会自行创建依赖。

必填表示导出输入合约的结构要求,不等于完整条件 API 验证。可选字段的显式 JSON null 与省略同样反序列化,包括未限定类型的 JSON 字段。空字符串、数组或对象是实际值,不是省略。数值 format 表示序列化边界,运行时限制和默认值另算。args 的模式 default:null 不等于其运行时默认 {}。

字段类型必填省略 / 显式 null约束和含义
atstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。一次触发 RFC3339 时刻,最多未来十年。
catch_upboolean / null否(可能条件必填)true;null 等同省略。错过的触发是否延后执行,默认 true。
cronstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。五段 cron 表达式。
enabledboolean / null否(可能条件必填)true;null 等同省略。存储的启用标志,upsert 默认 true,切换工具必须提供布尔值。
every_secsinteger / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。format: “int64”; 间隔秒数,10..86400。
inputsJSON (any value)否(可能条件必填){};null 等同省略。计划输入对象,默认 {}。
max_attemptsinteger / null否(可能条件必填)1;null 等同省略。format: “int64”; 每次触发尝试数,默认 1,范围 1..10。
namestring是无默认值,缺失或 null 无效。精确资产名;身份与文件夹规则见本页说明。
on_overlapstring / null否(可能条件必填)skip;null 等同省略。skip(默认)| queue | parallel。
projectstring / null否(可能条件必填)VIAT_PROJECT / current_project;否则 project_required;null 等同省略。项目 slug;省略或 null 使用 VIAT_PROJECT/current_project,否则 project_required。
queue_capinteger / null否(可能条件必填)null;null 等同省略。format: “int64”; 正数排队容量,仅适用于 on_overlap queue。
retry_backoff_secsinteger / null否(可能条件必填)60;null 等同省略。format: “int64”; 重试延迟,默认 60,范围 1..86400 秒。
target_kindstring是无默认值,缺失或 null 无效。script | workflow | endpoint,决定条件必填目标字段。
target_methodstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。已发布端点目标 method。
target_pathstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。已发布端点目标路径。
target_scriptstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。现有脚本目标名称。
target_workflowstring / null否(可能条件必填)不向 API 提供,条件规则见下文。;null 等同省略。现有工作流目标名称。
timezonestring / null否(可能条件必填)部署时区(默认 UTC);null 等同省略。IANA 时区,省略或 null 使用部署计划默认值。
trigger_kindstring是无默认值,缺失或 null 无效。cron | interval | once,决定条件必填触发字段。

完整替换,不是 PATCH。名称 1..63 字符,以 ASCII 小写字母开头,其余为小写字母、数字、_、-。trigger_kind:cron 需五段 cron,可选 IANA timezone(部署默认,通常 UTC);interval 需 10..86400 的 every_secs;once 需不超过未来十年的 RFC3339 at(允许过去时间,会到期)。target_kind:script 需 target_script,workflow 需 target_workflow,endpoint 需 target_method、target_path 指向已发布端点。非所选类型的字段被 MCP 忽略。inputs 省略或 null 变为 {},且必须是对象。enabled 默认 true;on_overlap 默认 skip,还支持 queue、parallel。queue_cap 须为正数且仅适用于 queue。max_attempts 默认 1、范围 1..10;retry_backoff_secs 默认 60、范围 1..86400;catch_up 默认 true。即使更新,省略或 null 也会重置这些策略。

once 计划触发后自动禁用。已触发 once 用同一时刻替换时,即使 enabled:true 也不会重新启用;新时刻才是新一次触发。应检查返回 enabled,不能假定请求标志一定胜出。

返回 {created:boolean,schedule:Schedule}。 计划对象包含字符串 name、on_overlap、updated_at,布尔值 enabled、catch_up,JSON 对象 trigger、target、inputs。next_due_at 始终存在,值为时间戳字符串或 null。可选 last_fired_at 为时间戳字符串,last_run_id 为 UUID 字符串;max_attempts 为整数,queue_cap、retry_backoff_secs 为可选整数。其余可选字段缺失时省略。trigger 为 {kind:"cron",cron,timezone}、{kind:"interval",every_secs} 或 {kind:"once",at};target 为 {kind:"script"|"workflow",name} 或 {kind:"endpoint",method,path};损坏的旧端点目标可能返回 {kind:"endpoint",raw}。

无分页或续页游标。

值会序列化成 JSON,放进一个 MCP content 文本块。请把 result.content[0].text 解析为 JSON。不承诺 structuredContent 或 outputSchema;注明省略的可选字段不能假定以 null 存在。

完成 MCP initialize/initialized 后,通过 stdio 以单行 JSON 发送此 tools/call 请求(此处格式化仅为便于阅读)。

{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "upsert_schedule",
"arguments": {
"project": "mcp-lab",
"name": "mcp_timer",
"trigger_kind": "interval",
"every_secs": 60,
"target_kind": "script",
"target_script": "mcp_demo",
"enabled": false,
"inputs": {}
}
}
}

预期 MCP 外层形状(ID、时间戳、头和计算值均为示意,不是确定值断言)。

{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "{\"created\":true,\"schedule\":{\"name\":\"mcp_timer\",\"enabled\":false,\"trigger\":{\"kind\":\"interval\",\"every_secs\":60},\"target\":{\"kind\":\"script\",\"name\":\"mcp_demo\"},\"inputs\":{},\"next_due_at\":\"2026-01-01T00:00:00Z\",\"on_overlap\":\"skip\",\"max_attempts\":1,\"retry_backoff_secs\":60,\"catch_up\":true,\"updated_at\":\"2026-01-01T00:00:00Z\"}}"
}
],
"isError": false
}
}

文本块内解码后的 JSON 值:

{
"created": true,
"schedule": {
"name": "mcp_timer",
"enabled": false,
"trigger": {
"kind": "interval",
"every_secs": 60
},
"target": {
"kind": "script",
"name": "mcp_demo"
},
"inputs": {},
"next_due_at": "2026-01-01T00:00:00Z",
"on_overlap": "skip",
"max_attempts": 1,
"retry_backoff_secs": 60,
"catch_up": true,
"updated_at": "2026-01-01T00:00:00Z"
}
}

不支持的类型或缺少条件必填字段返回本地 bad_input。API 验证范围、目标存在性及端点已发布要求;未发布端点返回 400。先 GET 决定 PUT/POST,因此并发 upsert 可能竞争。

所有上游工具都可能因令牌过期或撤销、PAT 范围、项目权限、激活、网络或超时失败。无项目及默认值时为 project_required;控制面非 2xx 为 http_4xx/http_5xx。详见 公共错误外层及重试规则。输入反序列化或未知工具可能在进入工具层前成为 JSON-RPC 协议错误,不要假定每个失败都有 isError。retryable 标志不保证幂等。

enabled 默认 TRUE,可能立即开始真实执行,包括过去的 once 触发。示例明确为 false,并指向惰性草稿脚本;仍是实际配置写入。新夹具用 delete_schedule;修改已有计划时保存并恢复全部策略,而非仅更改字段。

验证应以观察为主:检查本文结果字段,获准修改前后使用对应读取工具。不要通过生产请求或删除无关对象来验证。

输入清单:contracts/1.1.0/mcp-tools.json,工具 upsert_schedule. 固定产品源码中的实现和测试: schedules.rs; handlers/schedules.rs; tests/it/tool_upsert_schedule.rs. 工具模块文件名相对 crates/viat-mcp/src/tools/,API handler 相对 crates/viat-api/src/handlers/。公共传输和错误依据为 crates/viat-mcp/src/tools/service.rs、http.rs、error.rs;本次仅阅读测试,没有运行测试。