Skip to content

Commit 17ea815

Browse files
committed
docs(configure+changelog): align MCP, batch, and user-import docs with 16.0; add 16.0 changelog entry
mcp (en + zh-Hans): - new 'The stdio transport (16.0)' section: OS_MCP_STDIO_ENABLED own switch (default off; legacy OS_MCP_SERVER_ENABLED=true trigger for one release with a deprecation warning) and the mandatory OS_MCP_STDIO_API_KEY principal — same verify+authz chain as HTTP, RLS/FLS/tenant apply, revocation live, fail-closed boot, no system bypass (ADR-0101); - tool table gains validate_expression (read-only, data:read-scoped, fail-closed on sys_*); dev-banner claude mcp add note; new troubleshooting row. api-access (all 7 locales): - MCP row reflects default-on (disable with =false); - /api/v1/batch documented as atomic-only with per-op gating before the transaction, ids required, {$ref} resolution enforced, atomic:false → 400 BATCH_NOT_ATOMIC (#1604); discovery advertises capabilities.transactionalBatch (#3298). users + authentication (en + zh-Hans): - import-users default passwordPolicy is 'auto' since 16.0 (invite deliverable rows; temp password only for unreachable; pass 'none' for the old identity-only behavior; rows[].delivery outcomes). changelog (en + zh-Hans): - new 16.0 entry in the page's own style (organizationId rename, approvals quorum/会签 + metadata-driven inbox, time-relative automations, filtered roll-ups, strict widgets, MCP stdio principal, enforce-or-remove sweep, engine-owned read-only rows, date-equality fix + date-arithmetic build errors, bulk-import auto policy); 14.x entry no longer claims to be the current train. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Kj2MJEPXoUXC4LiC3XYJc
1 parent 59d041a commit 17ea815

15 files changed

Lines changed: 223 additions & 17 deletions

content/docs/configure/api-access.de.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ Wichtige Schnittstellen:
2424
| `/api/v1/auth/*` | Authentifizierung (Anmeldung, Sitzungen, OAuth, OIDC) |
2525
| `/api/v1/meta/*` | Metadaten-APIs (Objekte, Felder, Ansichten), sofern aktiviert |
2626
| `/api/v1/keys` | Erzeugt einen nur einmal angezeigten `sys_api_key` für den aufrufenden Benutzer (POST) |
27-
| `/api/v1/mcp` | Model-Context-Protocol-Server über Streamable HTTP, wenn `OS_MCP_SERVER_ENABLED=true` |
27+
| `/api/v1/batch` | Transaktionaler objektübergreifender Batch (POST) — ausschließlich atomar, jede Operation pro Objekt geprüft |
28+
| `/api/v1/mcp` | Model-Context-Protocol-Server über Streamable HTTP — standardmäßig aktiv; deaktivierbar mit `OS_MCP_SERVER_ENABLED=false` |
2829
| `/api/v1/health` | Liveness-/Readiness-Probe (keine Authentifizierung) |
2930

3031
Das Präfix lautet standardmäßig `/api/v1` (der API-`basePath` von `/api` plus

content/docs/configure/api-access.es.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ Superficies destacadas:
2424
| `/api/v1/auth/*` | Autenticación (inicio de sesión, sesiones, OAuth, OIDC) |
2525
| `/api/v1/meta/*` | APIs de metadatos (objetos, campos, vistas) cuando está habilitado |
2626
| `/api/v1/keys` | Genera un `sys_api_key` de un solo uso para el usuario que llama (POST) |
27-
| `/api/v1/mcp` | Servidor Model Context Protocol sobre Streamable HTTP, cuando `OS_MCP_SERVER_ENABLED=true` |
27+
| `/api/v1/batch` | Batch transaccional entre objetos (POST) — solo atómico, cada operación validada por objeto |
28+
| `/api/v1/mcp` | Servidor Model Context Protocol sobre Streamable HTTP — activo de forma predeterminada; se desactiva con `OS_MCP_SERVER_ENABLED=false` |
2829
| `/api/v1/health` | Sonda de liveness/readiness (sin autenticación) |
2930

3031
El prefijo es `/api/v1` de forma predeterminada (el `basePath` de la API,

content/docs/configure/api-access.fr.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ Surfaces notables :
2424
| `/api/v1/auth/*` | Authentification (connexion, sessions, OAuth, OIDC) |
2525
| `/api/v1/meta/*` | API de métadonnées (objets, champs, vues) lorsqu'elles sont activées |
2626
| `/api/v1/keys` | Génère une `sys_api_key` affichée une seule fois pour l'utilisateur appelant (POST) |
27-
| `/api/v1/mcp` | Serveur Model Context Protocol via Streamable HTTP, lorsque `OS_MCP_SERVER_ENABLED=true` |
27+
| `/api/v1/batch` | Batch transactionnel inter-objets (POST) — atomique uniquement, chaque opération contrôlée par objet |
28+
| `/api/v1/mcp` | Serveur Model Context Protocol via Streamable HTTP — actif par défaut ; se désactive avec `OS_MCP_SERVER_ENABLED=false` |
2829
| `/api/v1/health` | Sonde de vivacité/disponibilité (sans authentification) |
2930

3031
Le préfixe est `/api/v1` par défaut (le `basePath` de l'API `/api` plus la

content/docs/configure/api-access.ja.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ https://<project-domain>/api/v1
2323
| `/api/v1/auth/*` | 認証(サインイン、セッション、OAuth、OIDC) |
2424
| `/api/v1/meta/*` | 有効化されている場合のメタデータ API(オブジェクト、フィールド、ビュー) |
2525
| `/api/v1/keys` | 呼び出しユーザー向けに一度だけ表示される `sys_api_key` を発行(POST) |
26-
| `/api/v1/mcp` | `OS_MCP_SERVER_ENABLED=true` のとき、Streamable HTTP 経由の Model Context Protocol サーバー |
26+
| `/api/v1/batch` | オブジェクト横断のトランザクショナルバッチ(POST)— アトミックのみ、各操作をオブジェクト単位でゲート |
27+
| `/api/v1/mcp` | Streamable HTTP 経由の Model Context Protocol サーバー — デフォルトで有効。`OS_MCP_SERVER_ENABLED=false` で無効化 |
2728
| `/api/v1/health` | 死活/準備状態のプローブ(認証不要) |
2829

2930
プレフィックスのデフォルトは `/api/v1`(API の `basePath` である `/api`

content/docs/configure/api-access.ko.mdx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ https://<project-domain>/api/v1
2323
| `/api/v1/auth/*` | 인증 (로그인, 세션, OAuth, OIDC) |
2424
| `/api/v1/meta/*` | 활성화된 경우 메타데이터 API (오브젝트, 필드, 뷰) |
2525
| `/api/v1/keys` | 호출 사용자를 위해 한 번만 표시되는 `sys_api_key` 발급 (POST) |
26-
| `/api/v1/mcp` | `OS_MCP_SERVER_ENABLED=true`일 때 Streamable HTTP를 통한 Model Context Protocol 서버 |
26+
| `/api/v1/batch` | 오브젝트 간 트랜잭션 배치 (POST) — 원자적 실행만 지원, 모든 작업을 오브젝트별로 게이트 |
27+
| `/api/v1/mcp` | Streamable HTTP를 통한 Model Context Protocol 서버 — 기본 활성화, `OS_MCP_SERVER_ENABLED=false`로 비활성화 |
2728
| `/api/v1/health` | 활성/준비 상태 프로브 (인증 없음) |
2829

2930
접두사는 기본적으로 `/api/v1`(API `basePath``/api``version``v1`

content/docs/configure/api-access.mdx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ Notable surfaces:
2323
| `/api/v1/auth/*` | Authentication (sign-in, sessions, OAuth, OIDC) |
2424
| `/api/v1/meta/*` | Metadata APIs (objects, fields, views) when enabled |
2525
| `/api/v1/keys` | Mint a show-once `sys_api_key` for the calling user (POST) |
26-
| `/api/v1/mcp` | Model Context Protocol server over Streamable HTTP, when `OS_MCP_SERVER_ENABLED=true` |
26+
| `/api/v1/batch` | Transactional cross-object batch (POST) — atomic-only, every operation gated per object |
27+
| `/api/v1/mcp` | Model Context Protocol server over Streamable HTTP — on by default; disable with `OS_MCP_SERVER_ENABLED=false` |
2728
| `/api/v1/health` | Liveness/readiness probe (no auth) |
2829

2930
The prefix defaults to `/api/v1` (the API `basePath` of `/api` plus the
@@ -41,6 +42,14 @@ API exposure is governed per object in the artifact, not at the gateway:
4142
Both are enforced at the REST layer — see
4243
[REST API → Restricting the API surface](/docs/reference/rest-api#restricting-the-api-surface).
4344

45+
The same gates cover the transactional batch route (16.0):
46+
`POST /api/v1/batch` validates its body, enforces `apiEnabled` /
47+
`apiMethods` for **every** operation *before* opening the transaction,
48+
requires ids for update/delete, and rejects unresolvable `{ $ref }`
49+
parent references. The route is atomic-only — `atomic: false` is
50+
rejected with `400 BATCH_NOT_ATOMIC`; non-atomic bulk stays on the
51+
per-object `createMany` / `updateMany` endpoints.
52+
4453
## Authentication options
4554

4655
Callers can authenticate in four ways:
@@ -151,3 +160,7 @@ when the corresponding capability is included in the image. Customer
151160
integrations should generate clients from the per-deployment OpenAPI
152161
document rather than hand-rolling URLs, because object names and
153162
generated routes follow the deployed artifact.
163+
164+
Discovery also advertises `capabilities.transactionalBatch` (16.0), so
165+
clients can detect the atomic batch route declaratively at connect time
166+
instead of probing for `404`/`405`/`501`.

content/docs/configure/api-access.zh-Hans.mdx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ https://<project-domain>/api/v1
2121
| `/api/v1/auth/*` | 身份验证(登录、会话、OAuth、OIDC) |
2222
| `/api/v1/meta/*` | 元数据 API(对象、字段、视图),在启用时可用 |
2323
| `/api/v1/keys` | 为当前调用用户生成只显示一次的 `sys_api_key`(POST) |
24-
| `/api/v1/mcp` |`OS_MCP_SERVER_ENABLED=true` 时,通过 Streamable HTTP 提供的 Model Context Protocol 服务器 |
24+
| `/api/v1/batch` | 跨对象事务批量写入(POST)——仅支持原子模式,每个操作都按对象门控 |
25+
| `/api/v1/mcp` | 通过 Streamable HTTP 提供的 Model Context Protocol 服务器——默认开启;设置 `OS_MCP_SERVER_ENABLED=false` 可关闭 |
2526
| `/api/v1/health` | 存活/就绪探针(无需身份验证) |
2627

2728
前缀默认为 `/api/v1`(即 API 的 `basePath` `/api` 加上 `version` `v1`),并且可在 ObjectOS stack 上配置。
@@ -36,6 +37,8 @@ API 暴露在 artifact 中按对象逐个治理,而不是在网关层:
3637
两者都在 REST 层强制执行 —— 参见
3738
[REST API → 限制 API 暴露面](/docs/reference/rest-api#restricting-the-api-surface)
3839

40+
同样的闸门也覆盖事务批量路由(16.0):`POST /api/v1/batch` 会校验请求体,在开启事务*之前*就对**每个**操作强制执行 `apiEnabled` / `apiMethods`,update/delete 必须携带 id,无法解析的 `{ $ref }` 父引用会被拒绝。该路由只支持原子模式——`atomic: false` 会被以 `400 BATCH_NOT_ATOMIC` 拒绝;非原子的批量写入请继续使用按对象的 `createMany` / `updateMany` 端点。
41+
3942
## 身份验证方式
4043

4144
调用方可以通过四种方式进行身份验证:
@@ -114,3 +117,5 @@ API 密钥仍作为 CI 与无头代理的并行通道——`x-api-key` 和 `Auth
114117
## OpenAPI / 发现
115118

116119
当镜像中包含相应能力时,运行时可以为自动生成的 REST API 提供 OpenAPI 文档。客户的集成应基于每个部署的 OpenAPI 文档生成客户端,而不是手写 URL,因为对象名称和生成的路由会跟随已部署的 artifact 而变化。
120+
121+
发现(discovery)还会通告 `capabilities.transactionalBatch`(16.0),客户端可以在连接时以声明方式探知原子批量路由是否可用,而不必靠探测 `404`/`405`/`501`

content/docs/configure/authentication.mdx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,14 @@ Platform admins can provision accounts without the email invite flow:
5050
`PASSWORD_EXPIRED` until changed).
5151
- `POST /api/v1/auth/admin/import-users` bulk-imports rows / CSV / XLSX
5252
(max 500 rows per request) with dry-run and upsert-by-email-or-phone
53-
modes; existing users never get their passwords reset.
53+
modes; existing users never get their passwords reset. Since 16.0 the
54+
default `passwordPolicy` is `'auto'`: rows with a deliverable channel
55+
(real email + wired email service, or phone + SMS invite path) are
56+
**invited**, and only unreachable rows get a temporary password
57+
(returned once, `must_change_password`). Callers that relied on the
58+
old identity-only default must now pass `passwordPolicy: 'none'`
59+
explicitly; per-row outcomes are on `rows[].delivery` with a
60+
`summary.delivery` breakdown.
5461

5562
## Required secret
5663

content/docs/configure/authentication.zh-Hans.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ ObjectOS 使用由 Better Auth 驱动的 ObjectStack 认证插件。认证是项
3535
平台管理员可以不经邮件邀请流程直接开通账户:
3636

3737
- `POST /api/v1/auth/admin/create-user` 直接创建用户,可选生成一次性密码(仅返回一次,不持久化)。`must_change_password` 标志强制首次登录时修改密码(未修改前返回 403 `PASSWORD_EXPIRED`)。
38-
- `POST /api/v1/auth/admin/import-users` 批量导入行 / CSV / XLSX(每次请求最多 500 行),支持 dry-run 和按邮箱或手机号 upsert;已存在用户的密码永不重置。
38+
- `POST /api/v1/auth/admin/import-users` 批量导入行 / CSV / XLSX(每次请求最多 500 行),支持 dry-run 和按邮箱或手机号 upsert;已存在用户的密码永不重置。自 16.0 起,默认 `passwordPolicy``'auto'`:具有可送达通道的行(真实邮箱 + 已接通的邮件服务,或手机号 + 短信邀请通道)会被**邀请**,只有无法触达的行才得到临时密码(仅返回一次,`must_change_password`)。依赖旧的仅建身份默认行为的调用方现在必须显式传入 `passwordPolicy: 'none'`;每行结果在 `rows[].delivery` 上,并附 `summary.delivery` 汇总。
3939

4040
## 必需的 Secret
4141

content/docs/configure/mcp.mdx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ claude mcp add --transport http my-app http://localhost:3000/api/v1/mcp
3434
claude mcp add --transport http my-app https://your-deployment.example.com/api/v1/mcp
3535
```
3636

37+
> On a local dev server you don't even have to type this: since 16.0 the
38+
> `os dev` startup banner prints the MCP endpoint, the agent-skill URL,
39+
> and a ready-to-paste `claude mcp add` command.
40+
3741
For headless use (CI, containers) skip OAuth and attach an
3842
[API key](#headless-api-keys) instead:
3943

@@ -91,14 +95,35 @@ For a long-lived integration, bind the key to a dedicated service user
9195
with a minimal permission set — see
9296
[Service accounts & API keys](/docs/configure/users#service-accounts--api-keys).
9397

98+
## The stdio transport (16.0)
99+
100+
Besides HTTP, the runtime can serve MCP over **stdio** for hosts that
101+
spawn the server as a child process. Since 16.0 (ADR-0101) stdio has its
102+
own switch and always runs under a real identity:
103+
104+
- **`OS_MCP_STDIO_ENABLED=true`** turns stdio auto-start on (default
105+
**off**). `OS_MCP_SERVER_ENABLED` now governs only the HTTP surface —
106+
the legacy behavior where `OS_MCP_SERVER_ENABLED=true` also started
107+
stdio still works for one release, with a deprecation warning.
108+
- Stdio **requires `OS_MCP_STDIO_API_KEY=osk_...`**. The key is resolved
109+
through the same verify + authorization chain as HTTP and REST, so
110+
object permissions, record access, field-level security, and tenant
111+
scoping apply to stdio calls exactly as on `/api/v1/mcp` — and the key
112+
is re-resolved per read, so revoking it takes effect immediately.
113+
- The transport is **fail-closed**: enabling auto-start without a
114+
resolvable key refuses to boot, and there is deliberately no unscoped
115+
fallback and no `system` bypass. For full authority, mint the key on a
116+
platform-admin or dedicated service identity.
117+
94118
## What the agent gets
95119

96-
Ten data and action tools, generated from your metadata:
120+
Eleven data, action, and authoring tools, generated from your metadata:
97121

98122
| Tool | What it does |
99123
|---|---|
100124
| `list_objects` / `describe_object` | Discover which objects exist and their fields |
101125
| `query_records` / `get_record` | Read data (list queries are capped at 50 rows per page by default) |
126+
| `validate_expression` | Lint a formula against the real object schema *before* saving it (16.0): errors (bare field refs, unknown fields with did-you-mean), warnings (type-soundness, date-equality pitfalls), the in-scope field/function inventory, and the inferred result type. Read-only, `data:read`-scoped, fail-closed on `sys_*` |
102127
| `aggregate_records` | Grouped aggregation (registered when the active driver supports it) |
103128
| `create_record` / `update_record` / `delete_record` | Write data |
104129
| `list_actions` / `run_action` | Discover and invoke your business actions by name |
@@ -157,6 +182,7 @@ fully operational.
157182
|---|---|
158183
| `404` on `/api/v1/mcp` | The surface is disabled — unset `OS_MCP_SERVER_ENABLED` (default is on) |
159184
| `501 Not Implemented` | The MCP plugin isn't part of this build — check your stack's plugins |
185+
| Boot refuses with stdio enabled | Stdio is fail-closed (16.0) — set `OS_MCP_STDIO_API_KEY` to a resolvable `osk_` key, or turn `OS_MCP_STDIO_ENABLED` off |
160186
| `401` on every call | Anonymous or invalid credentials. Interactive clients: complete the browser login. Headless: check the `osk_` key and header spelling |
161187
| `403 insufficient_scope` | The OAuth token lacks the scope for that tool family (e.g. writes without `data:write`) — reconnect and grant the scope |
162188
| An action is missing from `list_actions` | `ai.exposed` is not `true`, `ai.description` is shorter than 40 characters, the type isn't headless-callable (`url` / `modal` / `form` never appear), it targets a `sys_*` object, or the caller fails its `requiredPermissions` |

0 commit comments

Comments
 (0)