Skip to content

feat(mcp): skill 的 instructions 半边投影为 MCP prompts 原语;tool-binding 半边标注 cloud-runtime-only (#3905) - #6077

Draft
qq9340100 wants to merge 4 commits into
mainfrom
claude/issue-3905-skill-mcp-prompts
Draft

feat(mcp): skill 的 instructions 半边投影为 MCP prompts 原语;tool-binding 半边标注 cloud-runtime-only (#3905)#6077
qq9340100 wants to merge 4 commits into
mainfrom
claude/issue-3905-skill-mcp-prompts

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes #3905

按维护者 2026-08-03 裁 A(+ 2026-08-06 评估批复确认)落地:给 skill 一个开源消费方,把
tool-binding 半边如实标注 cloud-runtime-only,并修掉同仓重名。

1. 前提复核(issue 立于 07-28,已过 9 天)

逐条对 origin/main@9e3709a 重验,三条全部仍成立:

前提 复核结果
prompts/* 未实现 ✅ 仍未实现。grep 'prompts/list|prompts/get|listPrompts' packages/ 只命中 packages/spec/prompts/README.md(另一个东西:发行的 agent prompt 文本)。HTTP 面 handleHttpRequest 只声明 capabilities: { tools: {} }
skill 元数据零消费方 ✅ 仍是零。git grep SkillSchema origin/main -- packages/packages/spec/** 与 CHANGELOG 外无命中。
packages/mcp/src/skill.ts 重名 ✅ 仍在。
近日他人动过 packages/mcp? 该目录最后一次提交是 5426a80(docs-only,#5823);在飞分支中无一触碰 packages/mcp/**packages/runtime/src/domains/mcp.ts(含 #5837,其 76 个文件里没有 packages/mcp)。

一处修正:issue 说服务器「未实现 prompts 原语」。更准确的事实是 —— stdio 面早已有
一个 agent_prompt(bridgePrompts,SDK registerPrompt,所以 grep prompts/list
自然为空);网络可达的 HTTP 面才是零 prompts。这不改变结论(skill 元数据在两条
传输上都零消费),但本 PR 因此两条传输都补齐,而不是只补一条。

2. instructions 半边 → MCP prompts 原语

新模块 packages/mcp/src/skill-prompts.ts 拥有投影:

  • 投影什么:name → prompt 名(不改写),labeltitle,description 原样,
    instructionsprompts/get 的消息体(role: 'user' —— MCP 的 prompts/get
    没有 system 角色,交给模型的上下文即 user)。
  • 不投影什么:没有 instructions 的 skill(没有可服务的半边,不列,而不是列一个空的);
    active: false 的 skill。
  • 协议合规:capabilities.prompts 只在宿主确实能读到本环境 skill 元数据时声明并注册
    处理器(与 action 工具同一套按能力接线的优雅降级 —— 不声明「答不了的能力」);
    无 skill 时 prompts/list 返回空列表而非报错;prompts/get 取不存在的名字返回
    -32602 InvalidParams(MCP 规范对 prompts 的错误指引)。
  • 两条传输:HTTP 面每请求新建 server,投影从本请求自己的 bridge 读(与
    describeObject 同一条 per-environment 通道),多租户宿主不会把一个环境的 skill 服务给
    另一个环境;stdio 面在 bridgePrompts 里按 skill 注册(SDK 拥有该 server 的
    prompts/list),列表是接线时的快照、正文在 prompts/get 时重读,所以改了 skill 无需重启。
  • 保留名:skill 名撞上内建 agent_prompt告警并跳过(不静默丢弃),告诉作者代价与改法。

⚠️ 一处越界申报(请 PM/维护者确认)

认领申报的文件面是 packages/mcp/** + spec JSDoc + docs + 测试 + changeset。实现中确认:
HTTP 面的投影在 packages/mcp 内无法自足handleHttpRequest 的一切 per-request 环境
数据都来自 opts.bridge,而该 bridge 的唯一生产者是
packages/runtime/src/domains/mcp.tsbuildMcpBridge。可选路线:

  • (a) 只在 packages/mcp 里加 listSkills? 座位、不接生产者 → 就是本 issue 要消灭的
    declared ≠ enforced 形状,自相矛盾;
  • (b) 用插件在 start() 时捕获的 metadata service 供 HTTP 面读 → resolveService 存在
    「shared-kernel 多环境 + scoped 工厂」路径(http-dispatcher.ts:1720-1729),该 service
    可能是宿主的而非本环境的 → 跨租户元数据泄漏风险,不可接受;
  • (c) 在 buildMcpBridge 补 8 行 listSkills(与 listObjects/describeObject 同一条
    per-env 通道)→ 架构正确、安全、可测。

选了 (c) 并在此显式申报。碰撞检查:该文件在飞 0 触碰。这一读是元数据级(与
describeObject 同级、不做 EC 过滤),/mcp 路由本身要求已认证主体。

3. tool-binding 半边:文档明确 cloud-runtime-only

  • packages/spec/src/ai/skill.zod.ts —— schema 头部新增「skill 的两个半边各跑在哪」;
    tools / surface / triggerConditions 的 JSDoc + describe() 标注 CLOUD-RUNTIME-ONLY;
    instructions 标注「两个发行版都跑,开源里作为 MCP prompt 服务」。describe 变了,按 os-regen
    纪律重生成(见 §6)。
  • content/docs/ai/connect-mcp.mdx —— 新增「Prompts: your skills, served to the client」一节
    (含 defineSkill 例子 + prompts/list / prompts/get 报文)。
  • content/docs/ai/agents.mdx —— 把原先一句「skills 只在 ObjectOS 跑」换成两半边的表格:
    判断力(instructions)处处跑,接线(tools/surface/triggerConditions)只在 ObjectOS 跑,
    两半边在两个发行版里都照旧被校验 —— 所以开源里写的 skill 到 cloud 上语义完整。

lint 两条 ai 规则的语义未动(引用完整性在两个发行版里都仍然有效)。

4. 重名修复(方案与论证)

packages/mcp/src/skill.ts 从来不是 skill 元数据类型,而是 ADR-0036 Amendment C 的
SKILL.md 分发物。方案:按各自承载的产物命名,两侧模块头互指

承载
src/skill.ts src/skill-md.ts ADR-0036 Amendment C 的 SKILL.md 分发物
src/skill-prompts.ts skill 元数据类型(SkillSchema)→ MCP prompts 投影
src/skill.test.ts src/skill-md.test.ts 同上
src/skill-surface-guard.test.ts src/skill-md-surface-guard.test.ts SKILL.md ↔ 原生工具面漂移守卫

为什么是改名而不是挪位:该模块与 renderSkill() 同包、被 runtime 通过 'mcp' 服务鸭子调用
(domains/mcp.tsGET /mcp/skill),挪出去要动服务契约;而重名的成本全部发生在
grep 的第一跳,改名即根治。ADR-0036 Amendment C 的引用完整性保住:包的公开导出名
(renderSkillMarkdown / OBJECTSTACK_SKILL_NAME / OBJECTSTACK_SKILL_DESCRIPTION /
RenderSkillOptions)一个未变,ADR 正文引用的是包名与 amendment,不引用文件路径;仓内引用
(index.ts / mcp-server-runtime.ts / 两个测试 / 守卫失败提示 / plugin-auth 测试注释)全部跟名。

5. 测试

  • packages/mcp/src/skill-prompts.test.ts(新,13 例)—— 大部分走真实 JSON-RPC 线
    (handleHttpRequestprompts/list / prompts/get / initialize 往返),而不是内部
    helper 的返回值:本 issue 修的恰恰是「校验通过、lint 通过、客户端永远到不了」的面。
  • packages/mcp/src/__tests__/mcp-server-runtime.test.ts —— stdio 面用 SDK 的
    InMemoryTransport + 真 ClientlistPrompts() / getPrompt() 往返;另加「元数据服务
    读不了 skill 时不炸 boot、且 warn 而非吞掉」。
  • packages/runtime/src/http-dispatcher.mcp.test.ts —— 钉住 (c) 那条生产者:bridge 带
    listSkills 且读的是本环境元数据。

反向验证(方向事先预测:红,结果与预测一致):把 handleHttpRequest 里的
registerSkillPrompts + prompts 能力声明删掉后 ——

× lists an authored skill that carries instructions
× serves the skill instructions on prompts/get
× declares the prompts capability when the bridge can read skills
× returns an EMPTY list — not an error — when no skill is authored
× does not project a skill without instructions
× does not project an inactive skill
× rejects prompts/get for a name that is not a projected skill (-32602)
AssertionError: expected { code: -32601, …(1) } to be undefined
  "message": "Method not found",
Tests  7 failed | 90 passed (97)

—— 7 例转红,全部落在 -32601 Method not found;还原后 9 passed (9) / 97 passed (97)
剩下几例本就不该动(「宿主读不到 skill 时不声明能力」「工具面照常」「纯投影单测」),
它们保持绿正是正确的。

本地跑过的门:pnpm lint ✅、check:nul-bytes / doc-authoring / role-word /
adr-anchors / route-envelope / error-code-casing / engine-double-contract /
docs-audit-scope / published-files 全 0;@objectstack/spec 8309 例、
@objectstack/runtime 1477 例、@objectstack/mcp 97 例全绿;两包 typecheck 干净。

6. 生成物

describe() 变化 → 按纪律走 check:generated 判定 + --fix 只重生成它证明为陈旧的那一个
(content/docs/references/**,即 gen:docs),随后补跑 gen:openapi(#5371,无 diff),
再次 check:generated✓ All 10 generated artifacts are up to date.。未手改任何生成物。


Generated by Claude Code

claude added 2 commits August 6, 2026 16:43
…3905)

ADR-0063 §2 names skills the only third-party extension primitive, but the open
(BYO-AI) distribution consumed them nowhere: SkillSchema was authorable and
lint-validated with no code path reading it. The MCP server now implements
prompts/list + prompts/get from registered skill metadata, so a skill's
instructions half is reachable by any MCP client; the tool-binding half
(tools/surface/triggerConditions) is documented cloud-runtime-only rather than
faked. Also fixes the in-repo name collision: packages/mcp/src/skill.ts (the
ADR-0036 Amendment C SKILL.md distributable) is now skill-md.ts, next to the new
skill-prompts.ts that owns the metadata type.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
… docs (#3905)

The dispatcher test asserts buildMcpBridge hands the MCP runtime a listSkills
reader bound to the request's environment — the producer without which the
prompt surface has no source in the open distribution. content/docs/references
is the regenerated output of the skill.zod.ts describe() changes (check:generated
--fix, gen:docs only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 7, 2026 1:05am

Request Review

…consumer (#3905)

The ledger's own note said the open edition consumes nothing here — true until
this PR. name/label/description/instructions/active now cite
packages/mcp/src/skill-prompts.ts as in-repo evidence; tools/surface/
triggerConditions are marked cloud-runtime-only in the same words the schema
now uses. Statuses unchanged (all were already live via the cloud runtime).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY

Copy link
Copy Markdown
Collaborator Author

CI 状态如实记录(交报告时刻,2026-08-06 19:05Z):

  • d43e8ba(承载全部代码 / 测试 / 文档 / 生成物的那一版)两条关卡作业均已收敛为绿:
    Lint & Type CheckESLint success(17:59:40,含 check:engine-double-contract /
    check:route-envelope / check:error-code-casing / check:adr-anchors 等全部家族门)、
    TypeScript Type Check success(18:12:08,含 check:authorable-surface /
    「Check generated reference docs are in sync with the spec」/ check:api-surface)。
  • 此后仅追加了 d153a82:只改 packages/spec/liveness/skill.json 一个 JSON 台账
    (记录 skill 属性的新开源消费方)。ESLint 与 tsc 都不读该文件;读它的两道门
    check:livenesscheck:generated 本地已跑 —— 分别是
    「✓ every governed-type property … is classified」与
    「✓ All 10 generated artifacts are up to date.」。
  • 该版本尚未被 GitHub 派发新的 Actions 运行(48 分钟无新 run)。这是仓库级 Actions 队列
    拥堵,不是本 PR 的信号:同批 17:54 创建的 CI / Spec Liveness Check /
    Duplicate Fix Guard / PR Automation 四个 run 到 19:05 仍为 queued,
    Docs Drift Check 的作业排队 50 分钟后被取消。队列疏通后请以新 run 的
    ESLint / TypeScript Type Check 结论为准。

本 PR 带 changeset(.changeset/skill-instructions-as-mcp-prompts.md),因此 skip-changeset
标签不适用;交报告时 PR 标签为空(打标签的 PR Automation 作业仍在排队)。


Generated by Claude Code


Generated by Claude Code

@github-actions github-actions Bot added the size/l label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/mcp, @objectstack/runtime, @objectstack/spec.

123 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/actions-as-tools.mdx (via @objectstack/mcp)
  • content/docs/ai/agents.mdx (via @objectstack/mcp, @objectstack/spec)
  • content/docs/ai/connect-mcp.mdx (via @objectstack/mcp)
  • content/docs/ai/index.mdx (via @objectstack/mcp)
  • content/docs/ai/natural-language-queries.mdx (via @objectstack/mcp)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/mcp, @objectstack/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/runtime, @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/environment-variables.mdx (via @objectstack/mcp)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via @objectstack/mcp, packages/runtime, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/mcp, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/mcp, @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/mcp, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests protocol:ai tooling labels Aug 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:ai size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Skills are declared the only third-party extension primitive, but nothing in the open distribution consumes them

2 participants