mcpField
L
Layven

Layven

リモート
layven.ioファイル・ストレージ012 週間前に更新
リポジトリ公式サイト

Layven について

Layvenは、エージェントやチームメンバーがMCP経由で使う共有ドライブです。書き込みをバージョン管理し、操作したエージェントを記録してロールバックに対応するほか、検索、編集、履歴、アクティビティ確認のツールを備えています。

主な機能

  1. 01エージェント間の共有ワークスペース
  2. 02ファイル書き込みのバージョン管理
  3. 03エージェント別の操作履歴
  4. 04ファイル検索と内容の検索
  5. 05旧バージョンの復元

活用シーン

  1. 01別々のエージェント間でファイルを共有
  2. 02ワークスペース内のファイル内容を検索
  3. 03ファイルの変更者を確認
  4. 04ファイルを以前のバージョンに復元

MCP 対応

ホスト型のLayven MCPサーバーは、MCPクライアントにワークスペースのファイルとアクティビティのツールを公開します。読み取り、検索、書き込み、編集、移動、削除、ロック、復元が可能です。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://api.layven.io/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、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"
  1. layven.io でトークンを取得します。コンソールを開き、Agents に移動して、エージェントを作成してください。シークレットが表示されるのは 1 回だけです。
  2. クライアントを再起動します。
  3. エージェントに「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 を実行すると、トークンがアクセスできるすべてのワークスペースに対して処理が行われます。

ツールアクセス機能主な引数
listroフォルダーを一覧表示するか、パスの部分文字列でファイルを検索しますpath、recursive、q、limit
readro現在または過去のバージョンのファイルを読み取りますpath、version
greproRE2 パターンでファイルの内容を検索しますpattern、prefix、context_lines、max_matches
historyro1つのファイルのバージョンを新しい順に一覧表示しますpath、limit、cursor
activityro変更内容と変更したエージェントを一覧表示しますsince、path_prefix、limit
writerwインラインコンテンツでファイルを作成または置換しますpath、content、encoding、expected_version
editrw既存のテキストファイルに文字列置換を適用しますpath、edits、expected_version
moverwファイルを移動または名前変更しますfrom、to、overwrite
deleterwファイルを削除状態にします。restore で復元できますpath、expected_version
restorerwファイルを特定のバージョンに、またはフォルダーを特定のタイムスタンプ時点に復元しますpath + to_version、または prefix + at
lockrwパスに対して5分間のアドバイザリロックを取得しますpath
unlockrwこのトークンが保持するロックを解除しますpath
request_uploadrw大容量ファイルのアップロードを開始し、署名付き PUT URL を返しますpath、size、expected_version
finalize_uploadrwアップロードしたファイルを新しいバージョンとして確定します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_CONFLICTexpected_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_FOUNDedit:old_str がファイル内に存在しないヒント
STRING_NOT_UNIQUEedit:replace_all が設定されておらず、old_str が複数箇所に一致した
NOT_EDITABLEedit:ファイルがテキストではない
TOO_LARGE_FOR_EDITedit:ファイルが16 MiBを超えている
INVALID_PATTERNgrep:パターンが有効な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 URL15 分
アップロードレコード1 時間
ダウンロード URL15 分
パスの長さ1024 バイト
ロック TTL5 分。更新可能
レート制限トークンごとに 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 つのレベルのいずれかで特定のワークスペースへのアクセス権が付与されます。

レベルツール
rolist、read、grep、history、activity
rwro のすべてに加えて、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

例


プラン

無料Pro $19/moScale $49/moEnterprise
ストレージ5 GB100 GB500 GBカスタム
バージョン履歴30日1年無制限無制限
アクティビティログ30日1年1年無制限
ワークスペース1525無制限
トークン225100無制限
シート数1310無制限
最大ファイルサイズ1 GiB1 GiB1 GiB1 GiB
レート制限600 req/min/token600 req/min/token600 req/min/token600 req/min/token

定額料金です。従量制やクレジットはありません。


データの保管場所

ファイルはフランスのグラヴリーヌにある OVHcloud に保存され、保存時に暗号化されます。コンテンツが第三者の AI やモデルの API に渡ることはありません。すべてをプレーンファイルとしてエクスポートでき、削除は確実に実行されます。


バージョン管理

server.json と変更履歴に記載されたバージョンは、サーバーが initialize 時に報告するバージョンと一致するため、接続先のバージョンをいつでも確認できます。サーバーに変更がないドキュメントの変更では、バージョンは更新されません。

CHANGELOG.md を参照してください。


サポート

ドキュメント、例、アップロードヘルパーの不具合については、issue を作成してください。アカウント、請求、データに関するお問い合わせは、[email protected] までご連絡ください。


ライセンス

MIT ライセンスは、このリポジトリ(ドキュメント、例、アップロードヘルパー)に適用されます。Layven サービス自体はクローズドソースです。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。