Layven について
Layvenは、エージェントやチームメンバーがMCP経由で使う共有ドライブです。書き込みをバージョン管理し、操作したエージェントを記録してロールバックに対応するほか、検索、編集、履歴、アクティビティ確認のツールを備えています。
主な機能
- 01エージェント間の共有ワークスペース
- 02ファイル書き込みのバージョン管理
- 03エージェント別の操作履歴
- 04ファイル検索と内容の検索
- 05旧バージョンの復元
活用シーン
- 01別々のエージェント間でファイルを共有
- 02ワークスペース内のファイル内容を検索
- 03ファイルの変更者を確認
- 04ファイルを以前のバージョンに復元
MCP 対応
ホスト型のLayven MCPサーバーは、MCPクライアントにワークスペースのファイルとアクティビティのツールを公開します。読み取り、検索、書き込み、編集、移動、削除、ロック、復元が可能です。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://api.layven.io/mcpclaude mcp add --transport http io-layven-layven https://api.layven.io/mcp{"mcpServers":{"io-layven-layven":{"type":"http","url":"https://api.layven.io/mcp"}}}Cursor で開く{"servers":{"io-layven-layven":{"type":"http","url":"https://api.layven.io/mcp"}}}VS Code で開く{"mcpServers":{"io-layven-layven":{"type":"http","url":"https://api.layven.io/mcp"}}}{"mcpServers":{"io-layven-layven":{"serverUrl":"https://api.layven.io/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Layven MCP サーバー
Layven は、エージェントが MCP 経由でマウントする共有ドライブです。書き込みはすべてバージョン管理され、すべての操作は実行したエージェントに帰属し、いつでもロールバックできます。
設定ブロックを 1 つ追加するだけで、エージェントのコードを変更する必要はありません。ホスト先は https://api.layven.io/mcp です。
Layven MCP サーバー 1.0.2 のドキュメントです。
クイックスタート
claude mcp add --transport http layven https://api.layven.io/mcp --header "Authorization: Bearer agd_your_agent_token"
- layven.io でトークンを取得します。コンソールを開き、Agents に移動して、エージェントを作成してください。シークレットが表示されるのは 1 回だけです。
- クライアントを再起動します。
- エージェントに「Layven のワークスペースを一覧表示して」と頼みます。
この製品の真価は、2 つ目の接続で発揮されます。2 つ目のトークンを作成し、別のツールをそれで接続して、1 つ目のツールが書き込んだばかりのファイルをそのツールで読み取ります。両方のエージェントが同じドライブを参照でき、アクティビティフィードには、それぞれが何をしたかが表示されます。手順については、examples/two-agent-handoff.md をご覧ください。
クライアントを接続する
Claude Code
claude mcp add --transport http layven https://api.layven.io/mcp --header "Authorization: Bearer agd_your_agent_token"
Claude.ai カスタムコネクター
https://api.layven.io/mcp を貼り付けて、OAuth で認証します。この UI にはカスタムヘッダーフィールドがないため、OAuth を利用します。
ChatGPT
Claude.ai と同様に、https://api.layven.io/mcp を貼り付けて、OAuth で認証します。
Cursor(~/.cursor/mcp.json)
{
"mcpServers": {
"layven": {
"url": "https://api.layven.io/mcp",
"headers": {
"Authorization": "Bearer agd_your_agent_token"
}
}
}
}
Codex(~/.codex/config.toml)
[mcp_servers.layven]
url = "https://api.layven.io/mcp"
http_headers = { "Authorization" = "Bearer agd_your_agent_token" }
Gemini(~/.gemini/settings.json)
Cursor と同じ JSON ですが、キーは url ではなく httpUrl です。Gemini は url を SSE エンドポイントとして読み取るためです。
{
"mcpServers": {
"layven": {
"httpUrl": "https://api.layven.io/mcp",
"headers": {
"Authorization": "Bearer agd_your_agent_token"
}
}
}
}
汎用 MCP JSON
{
"mcpServers": {
"layven": {
"url": "https://api.layven.io/mcp",
"headers": {
"Authorization": "Bearer agd_your_agent_token"
}
}
}
}
認証
接続方法は 2 種類ありますが、どちらも同じトークンレコードに紐づくため、権限、取り消し、監査証跡はどちらの場合も同一です。
静的ベアラートークン。 すべてのリクエストに Authorization: Bearer agd_... を付けます。コンソールで作成してください。シークレットが表示されるのは 1 回だけです。
OAuth 2.1(UI にカスタムヘッダーフィールドがないクライアント向け):
| 認証サーバー | https://api.layven.io |
| 保護されたリソースのメタデータ | https://api.layven.io/.well-known/oauth-protected-resource/mcp |
| リソース | https://api.layven.io/mcp |
| 動的クライアント登録 | 対応 |
| クライアントシークレットの有効期限 | なし |
同意すると通常のトークンが発行されます。ほかのトークンと同様に、コンソールで確認および取り消しができます。
トランスポート
POST https://api.layven.io/mcp、ストリーミング可能な HTTP、ステートレスです。- 各 POST は完全に独立しています。セッション ID、セッション再開、別の SSE エンドポイント、stdio はありません。
- GET と DELETE は HTTP 405 と、次の本文を正確に返します。
{"jsonrpc":"2.0","error":{"code":-32000,"message":"Method not allowed (stateless)"},"id":null} - 必須のリクエストヘッダーは
Content-Type: application/jsonとAccept: application/json, text/event-streamです。Acceptには両方のメディアタイプが含まれている必要があります。含まれていない場合、サーバーは 406 を返します。 - レスポンスは
Content-Type: text/event-streamとして返されます。 MCP-Protocol-Versionは任意です。指定する場合は2025-11-25、2025-06-18、2025-03-26、2024-11-05、2024-10-07のいずれかである必要があります。それ以外の場合、サーバーは HTTP 400 を返します。- ケイパビリティ:
toolsのみです。リソースとプロンプトはありません。 initializeにおけるサーバー ID:名前Layven、バージョン1.0.2、ウェブサイトhttps://layven.io。
ツール
すべてのツールでは、ワークスペースのスラッグである workspace を省略できます。トークンに付与されているワークスペースが1つだけの場合は、省略してもかまいません。workspace を指定せずに list を実行すると、トークンがアクセスできるすべてのワークスペースに対して処理が行われます。
| ツール | アクセス | 機能 | 主な引数 |
|---|---|---|---|
list | ro | フォルダーを一覧表示するか、パスの部分文字列でファイルを検索します | path、recursive、q、limit |
read | ro | 現在または過去のバージョンのファイルを読み取ります | path、version |
grep | ro | RE2 パターンでファイルの内容を検索します | pattern、prefix、context_lines、max_matches |
history | ro | 1つのファイルのバージョンを新しい順に一覧表示します | path、limit、cursor |
activity | ro | 変更内容と変更したエージェントを一覧表示します | since、path_prefix、limit |
write | rw | インラインコンテンツでファイルを作成または置換します | path、content、encoding、expected_version |
edit | rw | 既存のテキストファイルに文字列置換を適用します | path、edits、expected_version |
move | rw | ファイルを移動または名前変更します | from、to、overwrite |
delete | rw | ファイルを削除状態にします。restore で復元できます | path、expected_version |
restore | rw | ファイルを特定のバージョンに、またはフォルダーを特定のタイムスタンプ時点に復元します | path + to_version、または prefix + at |
lock | rw | パスに対して5分間のアドバイザリロックを取得します | path |
unlock | rw | このトークンが保持するロックを解除します | path |
request_upload | rw | 大容量ファイルのアップロードを開始し、署名付き PUT URL を返します | path、size、expected_version |
finalize_upload | rw | アップロードしたファイルを新しいバージョンとして確定します | upload_id |
破壊的操作として注釈が付いているのは delete のみです。delete は削除状態のバージョンを書き込み、restore で元に戻せます。write、delete、lock、unlock にはべき等操作として注釈が付いていますが、edit、move、restore、request_upload、finalize_upload には付いていません。どのツールも Layven の外にはアクセスしません。
NOT_FOUND(解決できないワークスペース)、PERMISSION_DENIED、RATE_LIMITED、INTERNAL はどのツールからも返される可能性があります。そのため、各ツールの下にある Errors の行には、そのツール固有のエラーを記載しています。
list
フォルダーを一覧表示するか、許可されたすべてのワークスペースから、パスに指定した部分文字列が含まれるファイルを検索します。
引数
workspace? string workspace slug; omit to fan out over every granted workspace
path string default "" (workspace root)
recursive boolean default false
include_deleted boolean default false
limit integer 1..1000, default 500, applied per workspace
cursor? string opaque; requires an explicit workspace
q? string 1..1024 chars, case-insensitive substring of the full path; implies recursive
戻り値
{
"results": [
{
"workspace": { "id": "...", "slug": "research" },
"entries": [
{
"path": "notes/todo.md",
"type": "file",
"size": 1284,
"version": 7,
"modified_at": "2026-08-05T09:12:44Z",
"modified_by_label": "research-agent",
"by_actor": "agent",
"deleted": true
}
],
"next_cursor": "..."
}
]
}
type は "file" または "folder" です。各エントリーの size、version、modified_at、modified_by_label、by_actor、deleted は省略可能です。
エラー: INVALID_PATH。
注記
resultsは、トークンに付与されているワークスペースが1つだけの場合も、常にワークスペースごとのブロックを含む配列です。entriesのみの配列が返されることを前提とするクライアントを作成しないでください。- ファンアウト中に
cursorを渡すと、reason: "cursor_requires_workspace"を伴うINVALID_PATHが返されます。ページネーションの前にワークスペースを指定してください。 - フォルダーはパスのプレフィックスから合成されます。作成または削除できるフォルダーレコードはありません。
read
現在のバージョンまたは過去のバージョンのファイルを読み取ります。
引数
workspace? string
path string
version? integer defaults to the current version
戻り値:生データのサイズが262144バイト以下で、MIME タイプがテキストの場合はインラインで返されます。
{
"path": "notes/todo.md",
"version": 7,
"size": 1284,
"mime_type": "text/markdown",
"encoding": "utf8",
"content": "..."
}
戻り値:それより大きいファイル、またはバイナリファイルの場合:
{
"path": "datasets/corpus.tar.gz",
"version": 3,
"size": 431912448,
"mime_type": "application/gzip",
"download_url": "https://...",
"url_expires_at": "2026-08-05T09:27:00Z"
}
エラー: NOT_FOUND(パスが削除状態の場合は deleted: true と last_version を含みます)、INVALID_PATH。
注記
- 応答の形式は、渡したフラグではなくサイズと MIME タイプに基づいて切り替わります。256 KiB を超える場合、またはテキスト以外のファイルの場合、インラインコンテンツの代わりに有効期間15分の
download_urlが返されます。どちらの形式にも対応してください。
grep
正規表現を使ってファイルの内容を検索します。
引数
workspace? string
path? string search a single file
prefix? string search one folder; omit both path and prefix to search the whole workspace
pattern string min 1 char, RE2 syntax
case_sensitive boolean default false
context_lines integer 0..10, default 2
max_matches integer 1..200, default 50
戻り値
{
"matches": [
{
"path": "notes/todo.md",
"line": 42,
"text": "TODO: rotate the staging token",
"before": ["..."],
"after": ["..."]
}
],
"files_scanned": 128,
"files_skipped_binary": 3,
"files_skipped_too_large": 0,
"truncated": false
}
エラー: INVALID_PATTERN、INVALID_PATH。
注意事項
- パターンは RE2 です。そのため、後方参照と先読み・後読みは使用できません。無効なパターンを指定すると、
INVALID_PATTERNが返されます。 - マッチするのは各行の中だけです。改行をまたぐパターンはマッチしません。
grep -nのように、該当する行ごとに 1 件だけ返されます。1 行にマッチが何か所あっても同じです。truncated: trueは、スキャンが予算上限に達し、結果が一部のみであることを示します。prefixの範囲を狭めるか、パターンをより具体的にしてください。- 行番号は表示専用です。
editのold_strに貼り付けないでください。
history
1 つのファイルのバージョンを新しい順に一覧表示します。
引数
workspace? string
path string
limit integer 1..1000, default 50
cursor? string digits only
戻り値
{
"versions": [
{
"version": 7,
"op": "write",
"size": 1284,
"content_hash": "...",
"created_at": "2026-08-05T09:12:44Z",
"by_label": "research-agent",
"by_actor": "agent",
"moved_from": "drafts/todo.md",
"purged": false,
"restorable_until": "2027-08-05T09:12:44Z"
}
],
"next_cursor": "182734"
}
op は write、edit、move、delete、restore のいずれかです。moved_from、by_actor、restorable_until は省略可能です。
エラー: NOT_FOUND、INVALID_PATH。
注意事項
- 新しい順に表示されるため、書き込みが反映されたことを確認するには
limit: 1が最も低コストです。 next_cursorは不透明な文字列であり、数値ではありません。最後のページには含まれません。これを確認すれば、取得を終了できます。purged: trueは、そのバージョンの内容が保持期間の終了により削除されたことを示します。監査証跡として行は残りますが、そのバージョンへのrestoreはreason: "version_purged"とともにNOT_FOUNDを返します。
activity
ワークスペースで変更された内容と、それを変更したエージェントを一覧表示します。
引数
workspace? string
since? string RFC 3339 timestamp
path_prefix? string
limit integer 1..1000, default 100
cursor? string
戻り値
{
"events": [
{
"at": "2026-08-05T09:12:44Z",
"actor": "agent",
"by_label": "research-agent",
"by_actor": "agent",
"op": "write",
"path": "notes/todo.md",
"old_path": "drafts/todo.md",
"version": 7
}
],
"next_cursor": "9014522"
}
actor は agent、user、system のいずれかです。新しい順に表示されます。
op は write、edit、move、delete、restore、purge、lock、unlock、grep のいずれかです。システムによる一括処理では、パスを伴わない purge_retention と purge_workspace_delete も記録されます。version を持つのは write、edit、move、delete、単一ファイルの restore のみで、それ以外では null です。purge には実際のパスまたはフォルダーのプレフィックスが含まれるため、path_prefix フィルターに一致します。このフィードでフォルダーを監査している場合、purge は書き込みと並んで表示されます。
エラー: INVALID_PATH。
注意事項
next_cursorは不透明な文字列であり、数値ではありません。最後のページには含まれません。これを確認すれば、取得を終了できます。- これはポーリングです。Webhook、トリガー、プッシュ機能はありません。エージェントは一定間隔で
activityを呼び出して連携します。数秒から数分の間隔であれば、レート制限内に十分収まります。 sinceはカーソルではなくタイムスタンプで、同じタイムスタンプを持つイベントが 2 つ存在する場合があります。イベントが再配信されることがあるため、処理は冪等にしてください。examples/two-agent-handoff.md を参照してください。
write
インラインの内容でファイルを作成または置き換えます。
引数
workspace? string
path string
content string
encoding "utf8" | "base64" default "utf8"
mime_type? string
expected_version? integer fail instead of overwriting a concurrent change
override_lock boolean default false
インラインの上限は、デコード後で 1 MiB です。それを超える場合は request_upload を使用します。
戻り値
{
"path": "notes/todo.md",
"version": 8,
"size": 1301,
"content_hash": "...",
"deduplicated": false,
"unchanged": true
}
unchanged は該当する場合にのみ含まれます。
エラー: INVALID_PATH、VERSION_CONFLICT、LOCKED、QUOTA_EXCEEDED、TOO_LARGE。
注意事項
- 現在のバージョンとバイト単位で同一の内容を書き込む場合、処理は何も行われません。
unchanged: trueが返され、新しいバージョンは作成されません。スケジュールジョブでこれが起きた場合は、通常、ジェネレーターが実行されなかったことを意味するため、必ずログに記録してください。 - 以前のバージョンと同一の内容を書き込む場合は、新しいバージョンが作成されます。
- tombstone 化されたパスに書き込むと、そのパスが復元されます。
edit
本文全体を再送せずに、既存のテキストファイル内の文字列を置換します。
引数
workspace? string
path string
edits array of 1..20 objects:
old_str string min 1 char
new_str string
replace_all boolean default false
expected_version? integer
override_lock boolean default false
最大 16 MiB のテキストファイルに対応します。
戻り値
{
"path": "notes/todo.md",
"version": 9,
"edits_applied": 2,
"replacements": [1, 3],
"size_before": 1301,
"size_after": 1288,
"context": "..."
}
unchanged は該当する場合にのみ含まれます。
エラー: STRING_NOT_FOUND、STRING_NOT_UNIQUE、NOT_EDITABLE、TOO_LARGE_FOR_EDIT、VERSION_CONFLICT、LOCKED、QUOTA_EXCEEDED、NOT_FOUND。
注意事項
- 編集は順番に適用され、1つの新しいバージョンとしてアトミックにコミットされます。そのため、20件の編集を行う呼び出しは、
historyの1エントリーとなり、20件にはなりません。いずれかの編集に失敗すると、すべての編集が適用されません。 - 各
old_strは正確に1回一致する必要があります。一致しない場合は、STRING_NOT_FOUNDまたはSTRING_NOT_UNIQUEが返されます。すべての出現箇所を対象にする場合は、replace_allを設定してください。 - 編集は順番に適用されるため、後続の
old_strは、先行する編集の適用後のテキストと一致する必要があります。
move
ファイルを移動または名前変更します。
引数
workspace? string
from string
to string
expected_version? integer
overwrite boolean default false
override_lock boolean default false
戻り値
{ "from": "drafts/todo.md", "to": "notes/todo.md", "version": 1 }
version は移動先の新しいバージョンです。
エラー: NOT_FOUND、INVALID_PATH、VERSION_CONFLICT(reason: "destination_exists" を含む)、LOCKED。
注意事項
- トークンには、両方のパスへの書き込みアクセス権が必要です。移動元を対象にしていても、移動先を対象にしていないプレフィックスルールでは、
PERMISSION_DENIEDが返されます。 overwrite: falseの場合、移動先にファイルが存在すると、reason: "destination_exists"を含むVERSION_CONFLICTが返されます。このエラーは有用です。同じアイテムの獲得を2つのワーカーが競い合った場合、moveを実行すると、負けた側には作業の重複ではなく明確なエラーが返されます。
delete
ファイルを削除済みとしてマークします。
引数
workspace? string
path string
expected_version? integer
override_lock boolean default false
戻り値
{ "path": "notes/todo.md", "version": 10, "unchanged": true }
unchanged は該当する場合にのみ含まれます。
エラー: NOT_FOUND、INVALID_PATH、VERSION_CONFLICT、LOCKED。
注意事項
- これは削除済みバージョンを記録するもので、コンテンツを消去するわけではありません。プランのバージョン履歴保持期間内であれば、
restoreでファイルを復元できます。 - その後、同じパスに書き込むと、同じ履歴上の新しいバージョンとして復活します。
include_deleted: trueを指定しない限り、listは削除済みのパスを表示しません。
restore
1つのファイルを以前のバージョンに復元するか、フォルダー全体をある時点の状態に復元します。
引数、ファイル形式:
workspace? string
path string
to_version integer
override_lock boolean default false
引数、フォルダー形式:
workspace? string
prefix string
at string RFC 3339 timestamp in UTC, e.g. 2026-08-05T14:04:55Z
override_lock boolean default false
戻り値、ファイル形式:
{ "path": "notes/todo.md", "version": 11 }
戻り値、フォルダー形式:
{
"restored": 42,
"deleted": 3,
"affected_paths": ["content/pricing.md", "content/index.md"],
"total": 45
}
affected_paths は上限付きのサンプルで、total が実際の件数です。
エラー: NOT_FOUND(保持期間が終了し、対象バージョンがすでに解放されている場合は reason: "version_purged" を含む)、INVALID_PATH、LOCKED。
注意事項
atは UTC で、末尾がZである必要があります。ミリ秒は省略できます。+02:00などの UTC オフセットは、有効な RFC 3339 形式であっても拒否されるため、呼び出す前に変換してください。- 復元では新しいバージョンが追加され、履歴が書き換えられることはありません。問題のあるバージョンも
historyに残るため、誤ったタイムスタンプへの復元も再度復元可能であり、復元を2回行っても安全です。 - フォルダー形式では、
atの時点で存在しなかったファイルに削除済みバージョンが付与され、deletedにカウントされます。ファイルは消去されず、後から書き込むと再び表示されます。 - ドライランはありません。
listで操作の規模を確認し、まずhistoryで単一ファイルの状態を確かめてください。手順例:examples/folder-restore-after-bad-run.md。
lock
パスにアドバイザリロックを設定します。
引数
workspace? string
path string
戻り値
{ "path": "notes/todo.md", "expires_at": "2026-08-05T09:17:44Z" }
エラー: LOCKED、INVALID_PATH。
注意事項
- ロックはアドバイザリで、有効期間は5分です。同じトークンで
lockを再度呼び出すと、ロックを更新できます。 - ロックによって読み取りが妨げられることはありません。他者の有効なロックがある場合、呼び出し元が
override_lock: trueを指定しない限り、書き込みにはlocked_by_labelとexpires_atを含むLOCKEDが返されます。ロックの上書きはアクティビティフィードに記録されます。 - ファイルが存在している必要はありません。そのため、作成予定のパスをロックできます。
- 冪等にできる作業では、ロックよりも
moveによる確保を優先してください。クラッシュ後も状態が維持され、5分の TTL にも制限されません。
unlock
このトークンが保持しているロックを解除します。
引数
workspace? string
path string
戻り値
{ "path": "notes/todo.md", "released": true }
エラー: PERMISSION_DENIED(ロックが別のトークンに属している場合)、INVALID_PATH。
注記
- ロックされていないパスをロック解除すると、
NOT_FOUNDではなくreleased: trueが返されます。この呼び出しではロックの有無はわからないため、ロックの保持者を調べる手段にはなりません。
request_upload
インラインの write では大きすぎるコンテンツのアップロードを開始します。2段階のうちの1段階目です。大容量ファイルのアップロードを参照してください。
引数
workspace? string
path string
size integer positive, the exact byte count of the file
mime_type? string
expected_version? integer
override_lock boolean default false
戻り値
{
"upload_id": "...",
"put_url": "https://...",
"url_expires_at": "2026-08-05T09:27:00Z",
"max_size": 1073741824
}
エラー: TOO_LARGE、QUOTA_EXCEEDED、VERSION_CONFLICT、LOCKED、INVALID_PATH。
注記
- 署名付きPUT URLの有効期間は15分、アップロードレコードの有効期間は1時間です。再開可能なアップロードやマルチパートアップロードには対応していません。PUTに失敗した場合は、
request_uploadからやり直してください。 sizeには正確なバイト数を指定する必要があります。finalize_uploadで再確認されます。
finalize_upload
アップロードしたファイルを新しいバージョンとして確定します。2段階のうちの2段階目です。
引数
workspace? string
upload_id string
戻り値
{
"path": "datasets/corpus.tar.gz",
"size": 431912448,
"version": 3,
"content_hash": "..."
}
エラー: UPLOAD_EXPIRED、VERSION_CONFLICT、QUOTA_EXCEEDED、TOO_LARGE。
注記
- サイズと
expected_versionはここで再確認されるため、request_uploadが成功した後でも、確定時にVERSION_CONFLICTが発生することがあります。アップロード中に誰かがそのパスに書き込みました。request_uploadからやり直してください。 finalize_uploadを2回目に呼び出すと、UPLOAD_EXPIREDが返されます。
エラー
ドメインエラーは、isError: true を含む通常のツール結果として返されます。そのテキストコンテンツはJSONです。
{ "code": "VERSION_CONFLICT", "message": "...", "current_version": 9 }
プロトコルレベルのJSON-RPCエラーとして返されることはありません。エージェントとクライアントは code に基づいて処理を分岐してください。
引数の検証エラーも同様に返されますが、テキストはJSONではありません。型が間違った引数を渡すと、リクエストがLayvenに届く前にMCPレイヤーが生成した、MCP error -32602: Input validation error: Invalid arguments for tool activity: ... のような英語のプレーンテキスト文字列とともに isError: true が返されます。そのため、堅牢に解析してください。テキストをJSONとして解析できない isError 結果は、Layvenのドメインエラーではなく、呼び出し側の不具合です。upload/layven-upload.mjs はまさにこの処理を行い、解析できない場合はメッセージに元のテキストをそのまま使用し、code: "UNKNOWN" にフォールバックします。
| コード | 意味 | 追加情報 |
|---|---|---|
NOT_FOUND | パス、バージョン、またはワークスペースが存在しない | ワークスペースのスラッグが解決できない場合は workspaces(トークンのスラッグ一覧)、削除済みパスでは deleted: true と last_version、消去済みバージョンでは reason: "version_purged" |
PERMISSION_DENIED | トークンに必要なアクセスレベルがない、またはプレフィックスルールがパスをブロックしている | required |
INVALID_PATH | パスの正規化に失敗した | reason |
VERSION_CONFLICT | expected_version が一致しない、または宛先がすでに存在する | current_version、場合によっては reason(例:destination_exists) |
LOCKED | 別のトークンが有効なロックを保持している | locked_by_label、expires_at |
QUOTA_EXCEEDED | 組織のストレージクォータを超過している | limit_bytes、used_bytes |
TOO_LARGE | インラインコンテンツが上限を超えている、またはファイルが1 GiBを超えている | max_bytes |
UPLOAD_EXPIRED | 期限切れまたはすでに使用済みのアップロードに対して確定処理を呼び出した | |
RATE_LIMITED | トークンまたは組織のレート上限に達した | retry_after_ms |
INTERNAL | 予期しないサーバー障害 | request_id |
STRING_NOT_FOUND | edit:old_str がファイル内に存在しない | ヒント |
STRING_NOT_UNIQUE | edit:replace_all が設定されておらず、old_str が複数箇所に一致した | |
NOT_EDITABLE | edit:ファイルがテキストではない | |
TOO_LARGE_FOR_EDIT | edit:ファイルが16 MiBを超えている | |
INVALID_PATTERN | grep:パターンが有効なRE2ではない |
自動的に再試行する価値があるのは RATE_LIMITED だけです。retry_after_ms の時間だけ待ってから、もう一度試してください。
制限
| 制限 | 値 |
|---|---|
| インライン書き込み | デコード後 1 MiB。これを超えるコンテンツは request_upload を経由します |
| インライン読み取り | 256 KiB かつテキスト MIME タイプの場合。それ以外はダウンロード URL |
| 編集 | 最大 16 MiB のテキストファイル、1 回の呼び出しにつき最大 20 件の編集 |
| Grep | スキャン対象のファイルごとに 8 MiB、1 回の呼び出しにつき候補ファイル 500 件。時間予算を超えると部分的な結果を返します |
| 最大ファイルサイズ | 1 GiB |
| 署名付き PUT URL | 15 分 |
| アップロードレコード | 1 時間 |
| ダウンロード URL | 15 分 |
| パスの長さ | 1024 バイト |
| ロック TTL | 5 分。更新可能 |
| レート制限 | トークンごとに 1 分あたり 600 リクエスト、組織ごとに 1 分あたり 3000 リクエスト |
レート制限を超えると、retry_after_ms を含む RATE_LIMITED が返されます。
パスとバージョン管理
パスは UTF-8 で、区切り文字に / を使用し、大文字と小文字を区別します。入力時に正規化されます。
- 先頭のスラッシュなし:
/a/bはa/bになります - スラッシュの重複なし
.または..のセグメントなし。空のセグメントもありません- ファイルの末尾にスラッシュなし
- 制御文字なし
- 最大 1024 バイト
これ以外の場合は、reason を含む INVALID_PATH が返されます。ディレクトリは暗黙的です。フォルダーのレコードはなく、list はパスのプレフィックスからフォルダーを合成します。
バージョン管理。 変更のたびに新しいバージョンが作成され、ファイルごとに番号が付けられます。delete は削除を示すバージョンを記録します。move は移動先に新しいバージョンを作成し、移動元には削除を示すバージョンを記録します。restore は以前の状態を再現する新しいバージョンを追加します。履歴は追記のみで、書き換えられることはありません。そのため、誤った復元自体も復元できます。
楽観的並行性制御。 デフォルトは「後勝ち」です。データが失われることはないため、安全です。同時に行われた変更を上書きせず、書き込みを失敗させたい場合は、読み取ったバージョンを expected_version に指定します。一致しない場合は、ペイロードに current_version を含む VERSION_CONFLICT が返されるため、呼び出し元は再読み込みして判断できます。
ロック。 lock は 5 分間のアドバイザリロックを取得します。同じトークンで再度 lock を呼び出すと、ロックが更新されます。有効な他者のロックがあると、書き込みは locked_by_label と expires_at を含む LOCKED を返します。override_lock: true を指定すると、そのまま処理が続行され、アクティビティフィードに記録されます。ロックは読み取りを妨げません。
権限
各トークンには、次の 3 つのレベルのいずれかで特定のワークスペースへのアクセス権が付与されます。
| レベル | ツール |
|---|---|
ro | list、read、grep、history、activity |
rw | ro のすべてに加えて、write、edit、move、delete、restore、lock、unlock、request_upload、finalize_upload |
admin | 将来のワークスペース管理用に予約 |
付与された権限には、トークンがアクセスできるフォルダーを制限するオプションのプレフィックスルールを設定できます。ルールは allow または deny リストで指定します。拒否は許可より優先されます。move には、移動元と移動先の両方のパスへの権限が必要です。
エージェントごとに専用のトークンを付与してください。これにより、list、history、activity の by_label がわかりやすくなり、他のエージェントに影響を与えずに特定のエージェントのアクセス権を取り消せます。
大容量ファイルのアップロード
インラインの write は 1 MiB が上限です。それを超える場合は、次の 3 つの手順でアップロードします。
1. URL をリクエストします。 正確なバイト数を指定して request_upload を呼び出します。
{ "path": "datasets/corpus.tar.gz", "size": 431912448, "mime_type": "application/gzip" }
{
"upload_id": "...",
"put_url": "https://...",
"url_expires_at": "2026-08-05T09:27:00Z",
"max_size": 1073741824
}
2. バイト列を put_url に PUT します。 これは MCP の呼び出しではなく、ファイルの生データを送信する通常の HTTP PUT です。URL の有効期間は 15 分です。
3. 確定します。 finalize_upload を呼び出します。
{ "upload_id": "..." }
{
"path": "datasets/corpus.tar.gz",
"size": 431912448,
"version": 3,
"content_hash": "..."
}
SDK がない理由
Layven クライアントライブラリは存在せず、今後も提供する予定はありません。Layven はホスト型 MCP サーバーです。クライアントを 1 つの URL に接続するだけで、コードを書く必要も、最新の状態に保つ必要もなく、エージェントは 14 個のツールを利用できます。これだけが例外です。アップロードフローには、生の HTTP PUT を行う中間手順がありますが、MCP クライアントでは実行できません。そのため、この用途に限り、依存関係のないスクリプトを 1 つ提供しています。コピーして、読み、変更してください。ライセンスは MIT です。
upload/layven-upload.mjs
Node 18 以降が必要です。依存関係はなく、インストールも不要です。
LAYVEN_TOKEN=agd_your_agent_token \
node upload/layven-upload.mjs ./corpus.tar.gz datasets/corpus.tar.gz \
[--workspace slug] [--mime type] [--expected-version N] [--override-lock] \
[--url https://api.layven.io/mcp]
LAYVEN_TOKEN は必須です。--url のデフォルトは https://api.layven.io/mcp です。
リポジトリのルートから、次のコマンドでテストを実行します。
node --test
例
- examples/two-agent-handoff.md:エージェント A がドライブに作業を置き、エージェント B が
activityをポーリングして取得します。 - examples/nightly-write-and-verify.md:成果物を書き込み、その書き込みが反映されたことを確認する、cron で実行するエージェントです。
- examples/folder-restore-after-bad-run.md:問題のあるエージェント実行を調査し、フォルダーを指定した時刻の状態に戻します。
プラン
| 無料 | Pro $19/mo | Scale $49/mo | Enterprise | |
|---|---|---|---|---|
| ストレージ | 5 GB | 100 GB | 500 GB | カスタム |
| バージョン履歴 | 30日 | 1年 | 無制限 | 無制限 |
| アクティビティログ | 30日 | 1年 | 1年 | 無制限 |
| ワークスペース | 1 | 5 | 25 | 無制限 |
| トークン | 2 | 25 | 100 | 無制限 |
| シート数 | 1 | 3 | 10 | 無制限 |
| 最大ファイルサイズ | 1 GiB | 1 GiB | 1 GiB | 1 GiB |
| レート制限 | 600 req/min/token | 600 req/min/token | 600 req/min/token | 600 req/min/token |
定額料金です。従量制やクレジットはありません。
データの保管場所
ファイルはフランスのグラヴリーヌにある OVHcloud に保存され、保存時に暗号化されます。コンテンツが第三者の AI やモデルの API に渡ることはありません。すべてをプレーンファイルとしてエクスポートでき、削除は確実に実行されます。
バージョン管理
server.json と変更履歴に記載されたバージョンは、サーバーが initialize 時に報告するバージョンと一致するため、接続先のバージョンをいつでも確認できます。サーバーに変更がないドキュメントの変更では、バージョンは更新されません。
CHANGELOG.md を参照してください。
サポート
ドキュメント、例、アップロードヘルパーの不具合については、issue を作成してください。アカウント、請求、データに関するお問い合わせは、[email protected] までご連絡ください。
ライセンス
MIT ライセンスは、このリポジトリ(ドキュメント、例、アップロードヘルパー)に適用されます。Layven サービス自体はクローズドソースです。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。