bscp KV 配置操作指引
定位
本 skill 只补充 MCP schema 表达不了的知识(跨工具编排、字段间业务约束、错误语义、领域模型), 不重复 MCP 工具已有的单字段描述——填参时字段含义以 MCP 工具 schema 为准。文中的业务 约束来自 bscp 服务端的实际校验规则,会随 bscp 版本演进;若与调用返回的报错不一致,以服务端返回为准。
适用范围:bk-bscp-prod-server-mcp 当前的 13 个工具,聚焦 config_type=kv 服务的 KV 配置闭环。
不覆盖模板、分组管理、客户端等 KV 闭环以外的接口。
前置条件
本 skill 依赖 bk-bscp-prod-server-mcp(蓝鲸 API 网关提供的 bscp MCP Server)暴露的 Config_* 工具。
开始操作前必须先确认这些工具已可用:
- 检查当前会话是否已挂载
bk-bscp-prod-server-mcp,能看到Config_ListAppsBySpaceRest/Config_CreateKv等工具。 - 若工具不存在:不要臆造工具名或伪造调用结果,直接告知用户"未检测到 bscp MCP,需要先接入",并给出下述接入指引,然后停下等待用户完成配置。
- 工具可用后再按后续章节执行。
接入指引(当工具缺失时告知用户)
请在你的 AI IDE(Cursor / Claude 等)的 MCP 配置中添加 bk-bscp-prod-server-mcp,通常需要准备:
- MCP Server 地址:蓝鲸 API 网关上 bscp MCP Server 的接入地址;
- 鉴权信息:调用网关所需的鉴权(如网关应用凭证 /
X-Bkapi-Authorization); - 业务上下文:目标业务的
bizId(来自 CMDB 业务 / 空间)。
具体的接入地址与凭证请向 bscp 平台或蓝鲸 API 网关管理员获取;配置完成后重新加载 MCP,确认 Config_* 工具出现即可。
交互引导(面向不熟悉闭环的用户)
用户往往只会抛一个模糊意图(如"kv 配置查询 / 更新 / 发布")而不知道要给哪些参数、要走什么闭环。 不要一次性罗列一堆参数把用户劝退,也不要臆造参数;按下面的方式分步反问,一次只问当前缺的一个关键信息, 把用户缺的参数逐步补齐后再执行。
通用引导步骤(任何意图先做)
- 确认业务 ID(bizId):用户没给就先问"请提供业务 ID(bizId)"。
- 确认服务名 → 解析 appId:拿到服务名后调
Config_GetAppByName(或先Config_ListAppsBySpaceRest让用户从列表里挑) 得到appId,并校验config_type=kv;若不是 kv 型,直接告知"该服务不是 KV 型服务"并停止。 - 参数齐了再进入对应意图的动作;能从上下文推断的(如上一步已拿到的 appId)不要重复问。
三类意图的最小引导
| 用户说 | 最少还需要问 | 拿齐后动作 |
|---|---|---|
| kv 配置查询 / 看某服务配置 | bizId、服务名(可选 key) | Config_ListKvs(草稿)或 Config_ListReleasedKvs(已发布),展示结果 |
| kv 配置更新 / 新增 / 删除 | bizId、服务名、key(更新/新增再要 value,必要时 kvType) | Config_CreateKv/UpdateKv/DeleteKv(草稿态);完成后主动追问"是否现在生成版本并发布?",用户同意再走发布流程 |
| kv 配置发布 / 发版 | bizId、服务名 | 有草稿改动 → 生成版本前先捕获历史命名规则给出建议版本名并询问用户(见「版本命名」),确认后 Config_CreateRelease 拿 releaseId;或让用户从 Config_ListReleases 选已有版本,再 Config_Publish |
写操作执行前必须二次确认
对 发布(Config_Publish)、覆盖式批量导入(Config_BatchUpsertKvs 且 replaceAll=true)、
删除(Config_DeleteKv/Config_BatchDeleteKv) 这类会影响客户端生效内容或清空数据的操作,
执行前先展示将影响的内容(如将发布的版本、将被覆盖/删除的 key 列表)并等用户确认后再调用;用户未确认不执行。
⚠️ 核心规则
- KV 增删改都是草稿态,客户端不可见;必须"生成版本 + 发布"后才生效。
- KV 只适用于
config_type=kv的 app;对 file 型 app 操作会报not a KV type service。 - 删除按 id/ids,不是按 key:
DeleteKv/BatchDeleteKv需先ListKvs拿到 id。 Config_Publish只发布已存在的 releaseId,不会从草稿自动生成版本。- 灰度字段在
Config_Publish上(grayPublishMode/groups/labels),需要先有 releaseId。 - 列表接口必须显式给分页:
Config_ListKvs/ListReleasedKvs/ListReleases/ListAppsBySpaceRest要么传all:true全量取,要么显式传limit(1–1000,配合start翻页)。不传limit会被服务端当成 0,报page.limit value should >= 1而查询失败——这是这些接口"要重试才成功"的常见原因。查询本意是"拿全部"时优先直接all:true。
领域模型速览(F-001)
biz(业务) → app(服务,带 config_type / data_type) → kv(草稿态配置项) → release(不可变版本快照)
- app 有
config_type(kv / file)和data_type(app 级 KV 类型,可为any)。 - KV 的每次增删改只改草稿区,不影响已发布内容;release 是一次生成后不可变的快照。
端到端调用编排(F-002)
标准闭环链路:
- 定位服务 → 拿
appId- 已知业务:
Config_ListAppsBySpaceRest(按 bizId 列 app) - 已知服务名:
Config_GetAppByName - 从返回结果的
config_type字段辨别 kv 型 app(该工具当前不支持 config_type 过滤)
- 已知业务:
- 改配置(草稿态)
- 单条:
Config_CreateKv/Config_UpdateKv/Config_DeleteKv - 批量:
Config_BatchUpsertKvs(replaceAll=true会先清空草稿区再写入)/Config_BatchDeleteKv(按 ids) - 删除前先
Config_ListKvs拿 id
- 单条:
- 生成版本
- 用户未指定版本名时,先捕获历史命名规则并询问用户(见下节「版本命名」),拿到确认后的名字再调用
Config_CreateRelease→ 产出releaseId
- 发布
Config_Publish:发布已有releaseId;all=true全量,或灰度(见下)
- 验证
Config_ListReleases/Config_GetReleasedKv/Config_ListReleasedKvs
全量 vs 灰度发布
| 场景 | 推荐工具 | 关键参数 |
|---|---|---|
| 生成版本并全量发布 | 先 Config_CreateRelease 拿 releaseId,再 Config_Publish |
all=true |
| 发布某个已有版本(全量) | Config_Publish |
releaseId + all=true |
| 灰度发布 | 先 Config_CreateRelease 拿 releaseId,再 Config_Publish |
all=false + grayPublishMode(publish_by_groups/publish_by_labels)+ groups 或 labels |
注意:灰度相关字段(
grayPublishMode/groups/labels/groupName)在Config_Publish的 body 上, 需要发布时统一走CreateRelease拿releaseId再Publish两步。groups(分组 ID 列表)有值时all必须为false。
版本命名:捕获历史规则后询问用户
Config_CreateRelease 的 name(版本名)必填,且同一 app 内唯一。用户往往不想每次都自己想名字,
但又希望沿用团队既有的命名习惯。因此用户未显式给版本名时,不要直接臆造,也不要直接用一个固定默认值,
按下面的流程做:
- 拉历史版本名:
Config_ListReleases {bizId, appId, all:true},取各 release 的name(列表接口记得带all:true,见核心规则 6)。 - 识别命名规律:从历史 name 里归纳规则,常见几类——
- 递增序号:
v1/v2/v3、release-1/release-2 - 语义前缀 + 序号:
v-import-1、gray-2 - 日期类:
20260702、2026-07-02、2026-07-02-1(同日多次带尾号)
- 递增序号:
- 生成建议名:按识别到的规律推下一个值(递增类要在最大序号上 +1,日期类用当天日期;都要避免与已有 name 重名)。
- 询问用户是否采用:把建议名给用户,例如「按历史命名规律,建议版本名
v4,是否使用?也可以自定义」, 用户确认或给出自定义名后再Config_CreateRelease。 - 无历史或无明显规律:给一个合理默认(如
v1或当天日期),同样先问用户,不要静默替用户决定。
命名约束(服务端 ValidateReleaseName 强校验,与 key 类似):长度 1–128;仅中文 / 英文 / 数字 / _ / - / .;
首尾必须是中文、英文或数字;同 app 内不可重名(重名报 release name ... already exists)。
参数获取(F-003)
bizId:来自蓝鲸平台上下文(CMDB 业务 / 空间)或请求头X-Bkapi-Biz-Id;MCP 不提供列 biz 的工具,需由用户/上下文给出。appId:通过Config_ListAppsBySpaceRest(按 bizId 列 app)或Config_GetAppByName(已知服务名)获取。- 辨别 kv 型 app:从上述工具返回结果里读
config_type字段,取config_type=kv的 app。 id(KV 主键):删除 KV 前用Config_ListKvs查询获取。releaseId:由Config_CreateRelease返回,或从Config_ListReleases中选取未废弃的版本。
字段级业务约束(F-004)
以下为 MCP schema 无法表达的关联约束(schema 只描述单字段),由 bscp 服务端强校验:
- key
- 长度 1–128
- 仅中文 / 英文 / 数字 /
_/-;首尾必须是中文、英文或数字 - 禁止
_bk前缀(不区分大小写) - 不含
.和/(保留字符)
- value
- 非空;上限 1MB
- 按 kvType 做格式校验:
json须合法 JSON;yaml须合法 YAML;xml须合法 XML;number须为数字;string不含换行符;text/secret不做内容格式校验
- kvType
- 单条 KV 的 kvType 不可填
any(any只用于 app 的 data_type) - 单条 KV 的 kvType 必须与 app 的
data_type一致;例外:app 的 data_type 为any时允许任意 kvType UpdateKv不能改 kvType:更新时沿用已存储的类型,请求里的 kvType 不生效;要改类型需删掉重建
- 单条 KV 的 kvType 不可填
- secret
- kvType=
secret时secretType必填,枚举:password/certificate/secret_key/token/custom certificate类型的 value 应为 X.509 PEM,可配合certificateExpirationDatesecretHidden控制明文是否隐藏
- kvType=
- 数量上限
- 单 app 未删除的配置项默认上限 2000(含模板+非模板),部分业务可能有不同上限
报错 → 原因 → 处置(F-005)
| 报错关键字 | 原因 | 处置 |
|---|---|---|
already exists ... cannot be created again |
key 已存在 | 改用 Config_UpdateKv,或换一个 key |
kv type does not match the data type defined in the application |
kvType 与 app 的 data_type 不一致 | 按 app.data_type 修正 kvType(app 为 any 时不受此限) |
the type of config item ... is incorrect |
批量导入时同 key 类型与已有不一致 | 保持已有类型 |
not a KV type service |
对非 kv 型 app 操作 KV | 确认目标 app 的 config_type=kv |
there are duplicate keys ... |
同一批量请求内 key 重复 | 去重后重试 |
there is a release in publishing currently |
已有版本正在上线 | 等待当前上线完成后再发布 |
release ... is deprecated |
目标版本已废弃 | 换未废弃版本,或重新 CreateRelease |
exceeded the limit |
配置项数超过上限(默认 2000) | 清理无用 KV 后重试 |
page.limit value should >= 1 |
列表接口未传 limit 且 all≠true(limit 默认为 0) |
传 all:true 全量,或显式 limit(1–1000) |
invalid page.limit max value: 1000 |
limit 超过单页上限 |
limit ≤ 1000,需要更多时用 start 翻页或改 all:true |
release ... already exists |
版本名与同 app 已有版本重名 | 换一个不重名的 name(递增类在最大序号上 +1) |
场景化示例(F-006)
以下为调用序列示意(bizId/appId 用占位符,实际以获取到的值为准)。
1) 新增一个 json 配置并全量发布
Config_ListAppsBySpaceRest {bizId, all:true} → 从结果中找 config_type=kv 的目标 app,取其 appId // 列表接口带 all:true
Config_CreateKv {bizId, appId} body: {key:"feature_flags", kvType:"json", value:"{\"beta\":true}"}
Config_ListReleases {bizId, appId, all:true} // 捕获历史命名规则,据此建议版本名并询问用户
Config_CreateRelease {bizId, appId} body: {name:"<用户确认的版本名>"} → releaseId // 生成版本
Config_Publish {bizId, appId, releaseId} body: {all:true} // 全量发布
Config_ListReleasedKvs {bizId, appId, all:true} // 验证已发布内容(列表接口带 all:true)
2) 批量导入 KV(覆盖式,replaceAll)
Config_BatchUpsertKvs {bizId, appId} body: {replaceAll:true, kvs:[{key,kvType,value}, ...]}
Config_CreateRelease {bizId, appId} body: {name:"v-import-1"} // 拿 releaseId
Config_Publish {bizId, appId, releaseId} body: {all:true}
3) 删除一个只知道 key 的 KV
Config_ListKvs {bizId, appId, key:["obsolete_key"], all:true} // key 为数组;列表接口带 all:true;拿到该 KV 的 id
Config_DeleteKv {bizId, appId, id} // 按 id 删(草稿态)
Config_ListReleases {bizId, appId, all:true} // 捕获历史命名规则,建议版本名并询问用户
Config_CreateRelease {bizId, appId} body: {name:"<用户确认的版本名>"} → releaseId // 生成版本
Config_Publish {bizId, appId, releaseId} body: {all:true} // 发布后才对客户端生效
4) 更新一个 secret 配置
Config_UpdateKv {bizId, appId} body: {key:"db_password", value:"<new>", secretType:"password", secretHidden:true}
// 注意:UpdateKv 不能改 kvType;secret 必填 secretType
Config_CreateRelease {bizId, appId} → releaseId
Config_Publish {bizId, appId, releaseId} body: {all:true}
5) 灰度发布到指定分组
Config_CreateRelease {bizId, appId} body: {name:"v-gray-1"} → releaseId
Config_Publish {bizId, appId, releaseId} body: {all:false, grayPublishMode:"publish_by_groups", groups:[<groupId>, ...]}
// 或按 labels:grayPublishMode:"publish_by_labels", labels:[{...}], 可选 groupName
说明
本文的领域约束与操作规范可能随 bscp 版本演进而变化。实际以工具调用的返回结果和报错信息为准; 遇到与本文不一致的情况,按报错对照表处置或咨询 bscp 平台。