From 5b063df8868ef8cdc2a6aab7a670f911bc0ea9a4 Mon Sep 17 00:00:00 2001 From: tanaka takashi Date: Sat, 29 Aug 2026 09:15:24 +0900 Subject: feat: read_messagesに本文範囲取得viewを追加 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 大きなメッセージをMCPホストのtool result上限に触れず取得できるよう、read_messagesへcontent viewを追加する。UTF-8 byte単位のcontent_offset/content_limitとnext_content_offsetにより、文字境界を壊さず反復取得できる。 各chunkにrevisionとtotal_bytesを返し、expected_revisionで取得途中の更新をCONFLICTとして検出する。未知または削除済みmessageはNOT_FOUND、不正な範囲はVALIDATION_ERRORとする。読み取りには既存memory indexを利用し、永続data、revision、I/O counterを変更しない。 新規MCP toolは増やさず、従来の7 tool構成とhistory/context/sessionsの契約を維持する。storage recordとsnapshot形式も変更しないためmigrationとrebuildは不要。 README、設計書、MCPリファレンスを更新し、多言語UTF-8本文の完全再構成、境界・limit・revision・削除済みmessage、read-only I/O、既存view回帰をprotocol testで検証する。 Tests: ctest --test-dir build/range-read-test -C Release --output-on-failure (20/20 passed) --- docs/mcp.md | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'docs/mcp.md') diff --git a/docs/mcp.md b/docs/mcp.md index 788fc84..e7b959d 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -143,13 +143,13 @@ messageのidentity、session、role、作成時刻を維持し、contentまた ## `read_messages` -`view`によりhistory、context、sessionsの3種類を返す。`view`省略時は`history`。 +`view`によりhistory、content、context、sessionsの4種類を返す。`view`省略時は`history`。 ### 共通Input | Parameter | 必須 | 型 | 説明 | |---|---:|---|---| -| `view` | No | string | `history` / `context` / `sessions` | +| `view` | No | string | `history` / `content` / `context` / `sessions` | | `limit` | No | integer | 1~1000、default 100 | | `cursor` | No | string | 前回responseの`nextCursor`。内容はopaque | @@ -174,6 +174,43 @@ session内のlive messageを作成順に返す。 続きを読む場合は同じ`session_id`と`nextCursor`を渡す。 +### `content` view + +live message 1件のcontentを、保存状態を変更せずにUTF-8 byte rangeで取得する。MCP hostの +tool-result上限を避けるため、`next_content_offset`を使って末尾まで反復する。 + +追加parameter: + +| Parameter | 必須 | 型 | Default | 説明 | +|---|---:|---|---:|---| +| `message_id` | Yes | string | — | 対象の26文字ULID | +| `content_offset` | No | integer | 0 | UTF-8 byte offset。0、末尾、またはcode point境界 | +| `content_limit` | No | integer | 4096 | 目標chunk bytes、1~65536 | +| `expected_revision` | No | integer | — | 指定時は現在revisionとの一致を要求 | + +```json +{ + "content_range": { + "message_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV", + "revision": 1, + "total_bytes": 14420, + "content_offset": 4096, + "next_content_offset": 8191, + "complete": false, + "content": "..." + } +} +``` + +`complete`がfalseなら、同じ`message_id`、返された`next_content_offset`、最初のresponseで得た +`revision`を`expected_revision`として次を取得する。limit位置がUTF-8 code point途中なら、 +通常は直前の境界まで短くする。limitが1 code pointより小さい場合だけ、その1文字を完全に +返すため最大3 bytes超えることがある。 + +messageが存在しないか削除済みなら`NOT_FOUND`、offsetが範囲外またはUTF-8境界でなければ +`VALIDATION_ERROR`、`expected_revision`不一致なら`CONFLICT`を返す。このviewはlogical I/O +counterを含む永続状態を変更しない。 + ### `context` view 指定message、同一sessionの前後message、relation graphを返す。 -- cgit v1.2.3