Cursor Agent CLI は、--print と組み合わせたときに --output-format オプションで複数の出力形式を提供するよ。プログラムで扱いやすい構造化形式(jsonstream-json)と、人間が読みやすい進捗トラッキング向けのシンプルなテキスト形式がある。
デフォルトの --output-formatstream-json。このオプションが有効になるのは、出力の印字(--print)時か、印字モードが推論される場合(非 TTY の stdout またはパイプされた stdin)のみだよ。

JSON 形式

json 出力形式は、実行が正常に完了したときに単一の JSON オブジェクト(末尾に改行あり)を出力する。デルタやツールイベントは出力されず、テキストは最終結果に集約される。 失敗時は、プロセスは非ゼロの終了コードで終了し、エラーメッセージを stderr に書き込む。失敗時には整形式の JSON オブジェクトは出力されない。

成功レスポンス

成功時、CLI は次の構造の JSON オブジェクトを出力する:
{
  "type": "result",
  "subtype": "success",
  "is_error": false,
  "duration_ms": 1234,
  "duration_api_ms": 1234,
  "result": "<full assistant text>",
  "session_id": "<uuid>",
  "request_id": "<optional request id>"
}
FieldDescription
type端末結果では常に "result"
subtype成功した完了時は常に "success"
is_error成功レスポンスでは常に false
duration_ms総実行時間(ミリ秒)
duration_api_msAPI リクエスト時間(ミリ秒、現在は duration_ms と同値)
result完全なアシスタント応答テキスト(すべてのテキストデルタの連結)
session_id一意のセッション識別子
request_id任意のリクエスト識別子(省略可)

Stream JSON形式

stream-json出力形式は改行区切りJSON(NDJSON)を出力します。各行には実行中のリアルタイムイベントを表す単一のJSONオブジェクトが含まれます。 ストリームは成功時に終端のresultイベントで終了します。失敗時は、プロセスが非ゼロコードで終了し、ストリームは終端イベントなしに早期終了する可能性があります。エラーメッセージはstderrに書き込まれます。

イベントタイプ

システム初期化

各セッションの開始時に一度出力されます:
{
  "type": "system",
  "subtype": "init",
  "apiKeySource": "env|flag|login",
  "cwd": "/absolute/path",
  "session_id": "<uuid>",
  "model": "<model display name>",
  "permissionMode": "default"
}
将来的にtoolsmcp_serversなどのフィールドがこのイベントに追加される可能性があります。

ユーザーメッセージ

ユーザーの入力プロンプトを含みます:
{
  "type": "user",
  "message": {
    "role": "user",
    "content": [{ "type": "text", "text": "<prompt>" }]
  },
  "session_id": "<uuid>"
}

アシスタントテキストデルタ

アシスタントが応答を生成する際に複数回出力されます。これらのイベントには増分テキストチャンクが含まれます:
{
  "type": "assistant",
  "message": {
    "role": "assistant",
    "content": [{ "type": "text", "text": "<delta chunk>" }]
  },
  "session_id": "<uuid>"
}
完全なアシスタント応答を再構築するには、すべてのmessage.content[].text値を順番に連結してください。

ツール呼び出しイベント

ツール呼び出しは開始と完了イベントで追跡されます: ツール呼び出し開始:
{
  "type": "tool_call",
  "subtype": "started",
  "call_id": "<string id>",
  "tool_call": {
    "readToolCall": {
      "args": { "path": "file.txt" }
    }
  },
  "session_id": "<uuid>"
}
ツール呼び出し完了:
{
  "type": "tool_call",
  "subtype": "completed",
  "call_id": "<string id>",
  "tool_call": {
    "readToolCall": {
      "args": { "path": "file.txt" },
      "result": {
        "success": {
          "content": "file contents...",
          "isEmpty": false,
          "exceededLimit": false,
          "totalLines": 54,
          "totalChars": 1254
        }
      }
    }
  },
  "session_id": "<uuid>"
}

ツール呼び出しタイプ

ファイル読み取りツール:
  • 開始: tool_call.readToolCall.args{ "path": "file.txt" }が含まれます
  • 完了: tool_call.readToolCall.result.successにファイルメタデータとコンテンツが含まれます
ファイル書き込みツール:
  • 開始: tool_call.writeToolCall.args{ "path": "file.txt", "fileText": "content...", "toolCallId": "id" }が含まれます
  • 完了: tool_call.writeToolCall.result.success{ "path": "/absolute/path", "linesCreated": 19, "fileSize": 942 }が含まれます
その他のツール:
  • { "name": "tool_name", "arguments": "..." }を持つtool_call.function構造を使用する場合があります

終端結果

正常完了時に出力される最終イベント:
{
  "type": "result",
  "subtype": "success",
  "duration_ms": 1234,
  "duration_api_ms": 1234,
  "is_error": false,
  "result": "<full assistant text>",
  "session_id": "<uuid>",
  "request_id": "<optional request id>"
}

例のシーケンス

典型的なイベントフローを示す代表的なNDJSONシーケンス:
{"type":"system","subtype":"init","apiKeySource":"login","cwd":"/Users/user/project","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","model":"Claude 4 Sonnet","permissionMode":"default"}
{"type":"user","message":{"role":"user","content":[{"type":"text","text":"README.mdを読んで要約を作成して"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"README.mdファイルを"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"読み込みます"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01NnjaR886UcE8whekg2MGJd","tool_call":{"readToolCall":{"args":{"path":"README.md"},"result":{"success":{"content":"# Project\n\nThis is a sample project...","isEmpty":false,"exceededLimit":false,"totalLines":54,"totalChars":1254}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"して要約を作成します"}]},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"started","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"tool_call","subtype":"completed","call_id":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv","tool_call":{"writeToolCall":{"args":{"path":"summary.txt","fileText":"# README Summary\n\nThis project contains...","toolCallId":"toolu_vrtx_01Q3VHVnWFSKygaRPT7WDxrv"},"result":{"success":{"path":"/Users/user/project/summary.txt","linesCreated":19,"fileSize":942}}}},"session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff"}
{"type":"result","subtype":"success","duration_ms":5234,"duration_api_ms":5234,"is_error":false,"result":"README.mdファイルを読み込んで要約を作成します","session_id":"c6b62c6f-7ead-4fd6-9922-e952131177ff","request_id":"10e11780-df2f-45dc-a1ff-4540af32e9c0"}

テキスト形式

text 出力形式は、エージェントのアクションを人間に読みやすいシンプルなストリームで提供する。詳細な JSON イベントの代わりに、エージェントがリアルタイムで何をしているかを端的なテキスト記述で出力する。 この形式は、構造化データをパースするオーバーヘッドなしでエージェントの進捗をモニタリングできるので、ログ、デバッグ、あるいは簡易的な進捗トラッキングに最適。

出力例

Read file
Edited file
Ran terminal command
Created new file
各アクションは実行されるたびに新しい行で表示され、タスクにおけるエージェントの進捗について即時のフィードバックが得られる。

実装に関する注意事項

  • 各イベントは\nで終了する単一行として出力される
  • thinkingイベントはプリントモードでは抑制され、どちらの出力形式にも表示されない
  • フィールドの追加は後方互換性を保った形で時間の経過とともに発生する可能性がある(コンシューマーは未知のフィールドを無視すること)
  • ストリーム形式はリアルタイムでアップデートを提供し、JSON形式は結果を出力する前に完了を待機する
  • 完全なレスポンスを再構築するには、すべてのassistantメッセージデルタを連結する
  • ツール呼び出しIDは開始/完了イベントを関連付けるために使用できる
  • セッションIDは単一のエージェント実行を通して一貫している