Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Code Mode API リファレンス

最終更新 Markdown で表示Agent セットアップ

Code Mode は 6 つのパッケージエントリポイントを公開します。フレームワーク固有の API は、対応するエントリポイントからインポートします。

エントリポイント 用途
@cloudflare/codemode ランタイム、コネクタ、Workers エグゼキュータ、フレームワーク非依存のユーティリティ
@cloudflare/codemode/ai AI SDK のツールとコネクタアダプタ
@cloudflare/codemode/mcp Model Context Protocol (MCP) サーバーラッパー
@cloudflare/codemode/tanstack-ai TanStack AI のツールとアダプタ
@cloudflare/codemode/browser ブラウザー向けツール記述子と iframe エグゼキュータ
@cloudflare/codemode/vite コネクタ検出と Worker エクスポート向けの Vite プラグイン

@cloudflare/codemode

メインのエントリポイントは、任意の AI SDK、TanStack AI、Zod の peer dependencies のインストールを要求しません。

ランタイムの構築

createCodemodeRuntime()

function createCodemodeRuntime(
	options: CreateCodemodeRuntimeOptions,
): CodemodeRuntimeHandle;

名前付き Code Mode ランタイム向けの、ホスト側コントロールプレーンを作成します。

CreateCodemodeRuntimeOptions のフィールドは次のとおりです。

フィールド 必須 説明
ctx DurableObjectState はい ランタイム facet をホストする Durable Object の状態です。
connectors CodemodeConnector[] はい サンドボックスのグローバルとして公開するコネクタです。コネクタ名は一意である必要があり、codemode は予約されています。
executor Executor はい 生成コードを実行するサンドボックスです。
name string いいえ 耐久ランタイムの ID です。デフォルトは "default" です。使える文字は英字、数字、_-. です。
maxExecutions number いいえ 新しい実行が始まるときに残す終端レコード数です。デフォルトは 50 です。実行中および一時停止中の実行は刈り込みません。
transformResult TransformResult いいえ モデルへ返す完了結果を整形します。監査証跡は未変更の結果を保持します。
interface CodemodeRuntimeHandle {
	tool(
		options?: CodemodeRuntimeToolOptions,
	): Tool<ProxyToolInput, ProxyToolOutput>;
	execute(input: ProxyToolInput): Promise<ProxyToolOutput>;
	search(query: string): Promise<SearchOutput>;
	describe(target: string): Promise<DescribeOutput>;
	approve(options: CodemodeApproveOptions): Promise<ProxyToolOutput>;
	reject(options: CodemodeRejectOptions): Promise<boolean>;
	rollback(options: CodemodeRollbackOptions): Promise<void>;
	pending(executionId?: string): Promise<PendingAction[]>;
	expirePaused(options?: CodemodeExpireOptions): Promise<string[]>;
	executions(limit?: number): Promise<ExecutionState[]>;
	deleteExecution(id: string): Promise<boolean>;
	pruneExecutions(keep?: number): Promise<number>;
	saveSnippet(name: string, options: SaveSnippetOptions): Promise<Snippet>;
	snippets(): Promise<Snippet[]>;
	deleteSnippet(name: string): Promise<boolean>;
}

ハンドルメソッドの効果は次のとおりです。

メソッド 効果
tool(options?) モデルへ渡す AI SDK ツールを返します。description はデフォルトの説明を置き換えます。connectorHints は、デフォルト説明を使うときに各コネクタへ 1 行のヒントを足します。
execute({ code }) ランタイムを AI SDK ツールへ適応せず、コードを直接実行します。結果は完了、承認待ちの一時停止、またはエラーステータスのいずれかです。
search(query) サンドボックスコードを実行せず、コネクタメソッドと保存済みスニペットを検索します。
describe(target) コネクタ、メソッド、または保存済みスニペット向けの、オンデマンド TypeScript ドキュメントを返します。
approve({ executionId }) リプレイ経由で一時停止中の実行を再開します。結果は完了、再一時停止、またはエラーステータスのいずれかです。一時停止以外の実行は復活しません。
reject({ seq, executionId }) 保留中のアクション 1 件を拒否し、実行を終了します。アクションがすでに保留でなければ false を返します。それより前のアクションはロールバックしません。
rollback({ executionId }) 利用可能な revert 関数を呼び出しの逆順で呼びます。コネクタ欠損と revert のないメソッドは適用済みのままです。失敗後も後続の revert を試みます。
pending(executionId?) 保留中のアクションを一覧します。ID なしでは、一時停止中の全実行のアクションをまとめます。
expirePaused({ maxAgeMs? }) 古い一時停止中または実行中の実行を終了し、その ID を返します。デフォルトの経過時間は 24 時間です。
executions(limit?) 監査レコードを新しい順で返します。
deleteExecution(id) 監査レコードを 1 件削除します。非終端の実行のリソースも破棄します。レコードが存在したかどうかを返します。
pruneExecutions(keep?) 古い終端レコードを削除し、削除件数を返します。デフォルトは 50 件残します。
saveSnippet(name, options) options.executionId のコードを再利用可能なスニペットとして保存します。任意の実行ステータスを受け付けるので、アプリケーション側で先に成功完了を確認してください。同じ名前は置き換えます。
snippets() 保存済みスニペットを名前順で返します。
deleteSnippet(name) スニペットを削除し、存在したかどうかを返します。

メソッドオプションの型は次のとおりです。

type CodemodeRuntimeToolOptions = {
	description?: string;
	connectorHints?: Record<string, string>;
};

type CodemodeApproveOptions = { executionId: string };
type CodemodeRejectOptions = { seq: number; executionId: string };
type CodemodeRollbackOptions = { executionId: string };
type CodemodeExpireOptions = { maxAgeMs?: number };

CodemodeRuntime

class CodemodeRuntime extends DurableObject<unknown> {
	constructor(ctx: DurableObjectState, env: unknown);
}

CodemodeRuntime は、ランタイムハンドル背後の耐久 facet です。Vite プラグインはこのクラスを Worker エントリモジュールからエクスポートします。アプリケーションコードでは facet を直接構築せず、createCodemodeRuntime() を使います。

メインのエントリポイントは、次のランタイム定数もエクスポートします。

定数 用途
DEFAULT_MAX_EXECUTIONS 50 終端実行のデフォルト保持件数
DEFAULT_PAUSED_TTL_MS 86400000 古い実行のデフォルト経過時間(ミリ秒、24 時間)
MAX_DURABLE_VALUE_BYTES 1000000 1 つの耐久値に対する、シリアライズ済み JavaScript 文字列長の上限

ランタイムツールの入力と出力

type ProxyToolInput = { code: string };

type ProxyToolOutput =
	| {
			status: "completed";
			executionId: string;
			result: unknown;
			logs?: string[];
	  }
	| {
			status: "paused";
			executionId: string;
			pending: PendingAction[];
	  }
	| {
			status: "error";
			executionId: string;
			error: string;
			logs?: string[];
	  };

type TransformResult = (result: unknown) => unknown | Promise<unknown>;

サンドボックスとリプレイのエラーは error 出力バリアントを使います。モデルのツール呼び出しを通じて例外は投げません。

実行レコード

type ExecutionStatus =
	| "running"
	| "paused"
	| "completed"
	| "error"
	| "rejected"
	| "rolled_back";

type ExecutionState = {
	id: string;
	code: string;
	status: ExecutionStatus;
	log: ToolLogEntry[];
	result?: unknown;
	error?: string;
	logs?: string[];
	connectors?: string[];
	createdAt: number;
	updatedAt: number;
};

type ToolLogEntry = {
	seq: number;
	connector: string;
	method: string;
	args: unknown;
	result?: unknown;
	requiresApproval: boolean;
	ephemeral?: boolean;
	state: "executing" | "applied" | "pending" | "reverted" | "error";
};

type PendingAction = {
	executionId: string;
	seq: number;
	connector: string;
	method: string;
	args: unknown;
};

createdAtupdatedAt はエポックミリ秒です。一時的なログエントリは、replay: "reexecute" のコネクタツールから来ます。結果は保存されず、リプレイ時に呼び出しが再実行されます。

ランタイムの決定型は次のとおりです。

type ToolDecision =
	| { kind: "replay"; result: unknown }
	| { kind: "execute"; seq: number }
	| { kind: "pause"; seq: number };

サンドボックスの codemode API

runtime.tool() は、生成されたサンドボックスコードへ codemode グローバルを注入します。

declare const codemode: {
	search(query: string): Promise<SearchOutput>;
	describe(target: string): Promise<DescribeOutput>;
	step<T>(name: string, fn: () => T | Promise<T>): Promise<T>;
	run(name: string, input?: unknown): Promise<unknown>;
};

サンドボックスメソッドの挙動は次のとおりです。

メソッド 説明
search(query) コネクタメソッドと保存済みスニペットを検索します。結果は順位付けされ、上限は 50 件です。
describe(target) コネクタ、connector.method、またはスニペット名向けに生成した TypeScript を返します。
step(name, fn) クロージャを 1 回実行し、結果を記録します。リプレイでは記録済み結果を返し、クロージャは再実行しません。
run(name, input?) 保存済みスニペットを実行します。スニペット欠損または記録済みコネクタは、error プロパティ付きオブジェクトに解決します。

コネクタを使わない、非決定的または副作用のあるサンドボックス作業は step() で囲みます。実行が一時停止しうるときは、コネクタ呼び出しを順次発行してください。並行呼び出しは、リプレイカーソルに別の順で到達することがあります。

検出出力の型は次のとおりです。

type SearchResult = {
	path: string;
	connector: string;
	method: string;
	description?: string;
	requiresApproval?: boolean;
	kind: "method" | "snippet";
	score: number;
};

type SearchOutput = {
	results: SearchResult[];
	total: number;
	truncated: boolean;
};

type DescribeOutput = {
	path: string;
	description?: string;
	requiresApproval?: boolean;
	types: string;
	kind: "connector" | "method" | "snippet";
};

コネクタメソッドが実行前に一時停止する場合、requiresApprovaltrue です。承認不要のメソッドとスニペットでは省略されます。

スニペットの型

interface SaveSnippetOptions {
	description?: string;
	inputSchema?: unknown;
	executionId: string;
}

interface Snippet {
	name: string;
	description: string;
	code: string;
	savedAt: number;
	inputSchema?: unknown;
	connectors?: string[];
}

connectors は、元の実行開始時に設定されていたすべての名前空間を記録します。savedAt はエポックミリ秒です。saveSnippet() を呼ぶ前に、元の ExecutionState.statuscompleted であることを確認してください。

エグゼキュータ API

Executor

interface Executor {
	execute(
		code: string,
		providersOrFns:
			| ResolvedProvider[]
			| Record<string, (...args: unknown[]) => Promise<unknown>>,
		options?: ExecuteOptions,
	): Promise<ExecuteResult>;
}

カスタムエグゼキュータは、例外を投げる代わりに失敗を ExecuteResult.error で報告してください。

interface ExecuteResult {
	result: unknown;
	error?: string;
	logs?: string[];
}

interface ResolvedProvider {
	name: string;
	fns: Record<string, (...args: unknown[]) => Promise<unknown>>;
	prelude?: string;
}

interface ConnectorBinding {
	name: string;
	binding: {
		callTool(method: string, args: unknown): Promise<unknown>;
	};
}

interface ExecuteOptions {
	connectors?: ConnectorBinding[];
}

ResolvedProvider[] の代わりに関数レコードを渡すのは非推奨です。codemode という名前のプロバイダーが 1 つ作られます。

DynamicWorkerExecutor

class DynamicWorkerExecutor implements Executor {
	constructor(options: DynamicWorkerExecutorOptions);
	execute(
		code: string,
		providersOrFns:
			| ResolvedProvider[]
			| Record<string, (...args: unknown[]) => Promise<unknown>>,
		options?: ExecuteOptions,
	): Promise<ExecuteResult>;
}

DynamicWorkerExecutorOptions のフィールドは次のとおりです。

フィールド 必須 デフォルト 説明
loader WorkerLoader はい 隔離された Workers の作成に使う Worker Loader バインディングです。
timeout number いいえ 60000 実行タイムアウト(ミリ秒)です。
globalOutbound Fetcher | null いいえ null 送信ネットワークポリシーです。null はアクセスを遮断します。Fetcher はすべての送信リクエストを受け取ります。
modules Record<string, string> いいえ {} import specifier をキーにしたモジュールソースです。予約済みの executor.js キーは無視されます。
bindings Record<string, unknown> いいえ {} 各サンドボックス Worker へ注入する追加の環境バインディングです。

エグゼキュータはプロバイダーとコネクタの名前空間を検証します。名前は有効な JavaScript 識別子で、一意であり、エグゼキュータのグローバルをシャドウしてはいけません。

ToolDispatcher

class ToolDispatcher extends RpcTarget {
	constructor(fns: Record<string, (...args: unknown[]) => Promise<unknown>>);
	call(name: string, argsJson?: string): Promise<string>;
}

ToolDispatcherDynamicWorkerExecutor が使う Workers RPC ブリッジです。call() はシリアライズされた位置引数を受け取り、シリアライズされた結果またはエラーエンベロープを返します。

runCode()

function runCode(options: {
	code: string;
	executor: Executor;
	providers: ResolvedProvider[];
	connectors?: ConnectorBinding[];
}): Promise<{ result: unknown; logs?: string[] }>;

コードを正規化して実行します。ExecuteResult.error があると、runCode() はキャプチャした console 出力を含む Error を投げます。

ツールプロバイダー

interface ToolProvider {
	name?: string;
	tools: ToolDescriptors | ToolSet | SimpleToolRecord;
	types?: string;
}

ツールプロバイダーのフィールドは次のとおりです。

フィールド 説明
name サンドボックスの名前空間です。デフォルトは codemode です。
tools ツール記述子、AI SDK の ToolSet、または execute を含むレコードです。
types モデルへ示す TypeScript 宣言です。省略時は Code Mode が生成します。
function resolveProvider(provider: ToolProvider): ResolvedProvider;

メインエントリの実装は、入力をスキーマに対して検証しません。needsApprovaltrue または関数であるツールは除外します。耐久的な承認フローにはランタイムコネクタを使います。

コネクタの基底クラス

CodemodeConnector

abstract class CodemodeConnector<
	Env = unknown,
	Props = unknown,
> extends WorkerEntrypoint<Env, Props> {
	constructor(ctx: DurableObjectState | ExecutionContext, env: Env);

	abstract name(): string;
	protected instructions(): string | undefined;
	protected abstract tools(): ConnectorTools | Promise<ConnectorTools>;
	protected tool(name: string, tool: ConnectorTool): ConnectorTool;

	describe(): Promise<ConnectorDescription>;
	executeTool(
		method: string,
		args: unknown,
		ctx?: ToolExecuteContext,
	): Promise<unknown>;
	revertAction(
		method: string,
		args: unknown,
		result: unknown,
		ctx?: ToolExecuteContext,
	): Promise<boolean>;
	onPassEnd(executionId: string, status: PassEndStatus): Promise<void>;
	disposeExecution(
		executionId: string,
		status: ExecutionEndStatus,
	): Promise<void>;
	getTypeScriptTypes(): Promise<string>;
}

コネクタ作者は、次のフックを実装またはオーバーライドします。

フック 必須 説明
name() はい 一意のサンドボックス名前空間を返します。
instructions() いいえ describe() に含めるコネクタ案内を返します。
tools() はい コネクタのツールレコードを返します。派生コネクタはこのフックを実装します。
tool(name, tool) いいえ 解決済みツールを装飾します。派生ツールへ承認、リプレイ、revert の挙動を足すときに使います。
onPassEnd(executionId, status) いいえ パス単位のリソースを解放します。一時停止パスを含め、すべてのパスのあとに実行されます。
disposeExecution(executionId, status) いいえ 終端遷移のあと、実行単位のリソースを解放します。一時停止では実行されません。

ライフサイクルフックは冪等であるべきで、インスタンスメモリに依存すべきではなく、例外を投げるべきではありません。終端パスでは、onPassEnd()disposeExecution() より先に実行されます。

基底クラスはツールレコードから describe()executeTool()revertAction()getTypeScriptTypes() を導出します。コネクタ作者がこれらのメソッドを実装する必要はありません。

コネクタツールの型

type ConnectorTool = {
	description?: string;
	inputSchema?: JSONSchema7;
	outputSchema?: JSONSchema7;
	requiresApproval?: boolean;
	replay?: "log" | "reexecute";
	execute: (
		args: unknown,
		ctx?: ToolExecuteContext,
	) => Promise<unknown> | unknown;
	revert?: (
		args: unknown,
		result: unknown,
		ctx?: ToolExecuteContext,
	) => Promise<void> | void;
};

type ConnectorTools = Record<string, ConnectorTool>;
type ToolExecuteContext = { executionId: string };

inputSchema のデフォルトは開いたオブジェクトです。requiresApproval: true は実行前に一時停止します。replay: "reexecute" は耐久的な結果保存をスキップし、再開のたびに呼び出しを再実行します。この 2 つのオプションは同時に使えません。

revertruntime.rollback() 向けの補償を提供します。承認の要否に関係なく、任意のツールに適用できます。

McpConnector

abstract class McpConnector<
	Env = unknown,
	Props = unknown,
> extends CodemodeConnector<Env, Props> {
	protected abstract createConnection():
		| McpConnectionLike
		| Promise<McpConnectionLike>;
	protected toolName(tool: McpTool): string;
}

McpConnector は各 MCP ツールをコネクタメソッドへ変換します。toolName() のデフォルトは sanitizeToolName(tool.name) です。名前衝突を解消するにはオーバーライドします。

interface McpConnectionLike {
	name?: string;
	client: Pick<Client, "callTool">;
	instructions?: string;
	tools?: McpTool[];
	fetchTools?: () => Promise<McpTool[]>;
}

コネクタは、その配列が空でなければ tools を使います。そうでなければ、提供されていれば fetchTools() を呼びます。MCP のエラー結果は、投げられるコネクタエラーになります。構造化コンテンツはテキストコンテンツより先に返されます。

OpenApiConnector

abstract class OpenApiConnector<
	Env = unknown,
	Props = unknown,
> extends CodemodeConnector<Env, Props> {
	protected abstract spec():
		| Record<string, unknown>
		| Promise<Record<string, unknown>>;
	protected abstract request(options: OpenApiRequestOptions): Promise<unknown>;
	protected exposeSpec(): boolean;
}

OpenApiConnector は OpenAPI オペレーションごとに 1 メソッドを作ります。ある場合はサニタイズした operationId を使い、なければ HTTP メソッドとパスに基づく名前へフォールバックします。重複オペレーションと、request または spec 向けに予約された名前はスキップされます。

すべての OpenAPI コネクタは低レベルの request メソッドを公開します。exposeSpec() のデフォルトは false です。spec も公開するには true を返します。

type OpenApiRequestOptions = {
	path: string;
	method?: string;
	params?: Record<string, unknown>;
	body?: unknown;
	headers?: Record<string, string>;
};

派生オペレーションツールはパスパラメータを置換します。クエリ値は params、ヘッダー値は headers、JSON リクエストデータは body として渡します。

コネクタのライフサイクルと説明の型

type ExecutionEndStatus = "completed" | "error" | "rejected" | "rolled_back";

type PassEndStatus = ExecutionEndStatus | "paused";

type ToolAnnotations = {
	requiresApproval?: boolean;
	replay?: "log" | "reexecute";
};

type ConnectorDescription = {
	name: string;
	instructions?: string;
	descriptors: JsonSchemaToolDescriptors;
	annotations?: Record<string, ToolAnnotations>;
};

JSON Schema ユーティリティ

interface JsonSchemaToolDescriptor {
	description?: string;
	inputSchema: JSONSchema7;
	outputSchema?: JSONSchema7;
}

type JsonSchemaToolDescriptors = Record<string, JsonSchemaToolDescriptor>;

function generateTypesFromJsonSchema(tools: JsonSchemaToolDescriptors): string;

function jsonSchemaToType(schema: JSONSchema7, typeName: string): string;

generateTypesFromJsonSchema()codemode 名前空間向けの宣言を返します。宣言生成前にツール名はサニタイズされます。未対応スキーマは生成失敗ではなく unknown へ劣化します。

コードと出力のユーティリティ

メインのエントリポイントは、次のコードおよび結果ユーティリティを提供します。

関数 シグネチャ 挙動
sanitizeToolName (name: string) => string よくある区切りを置換し、無効な文字を除き、数字始まりの名前に接頭辞を付け、JavaScript 予約語に接尾辞を付けます。
normalizeCode (code: string) => string よくあるモデル出力形式を async アロー関数へ変換します。対応する Markdown フェンスも取り除きます。
truncateResponse (text: string, options?: TruncateOptions) => string 文字バジェットまでテキストを切り詰め、サイズマーカーを付けます。
truncateResult (value: unknown, options?: TruncateOptions) => unknown 小さな構造化値は保持します。大きすぎるシリアライズ可能値は切り詰めた JSON テキストになります。
type TruncateOptions = {
	maxChars?: number;
	maxTokens?: number;
};

デフォルトのバジェットは、トークンあたり 4 文字で推定トークン 6000 です。maxChars は導出された文字バジェットを上書きします。

@cloudflare/codemode/ai

このエントリポイントは aizod の peer dependencies を要求します。

createCodeTool()

function createCodeTool(
	options: CreateCodeToolOptions,
): Tool<CodeInput, CodeOutput>;

interface CreateCodeToolOptions {
	tools: ToolProviderTools | ToolProvider[];
	executor: Executor;
	description?: string;
}

type CodeInput = { code: string };
type CodeOutput = { result: unknown; logs?: string[] };

description には {{types}} を含められます。Code Mode はそのトークンを生成した宣言で置き換えます。生のツールレコードは codemode という名前のプロバイダー 1 つになります。配列なら複数のプロバイダー名前空間を受け付けます。

needsApprovaltrue または関数であるツールは除外されます。この API は一時停止しません。耐久的な承認処理には createCodemodeRuntime() とコネクタを使います。

AI SDK プロバイダーユーティリティ

AI SDK エントリポイントは、次のツールプロバイダーユーティリティを提供します。

エクスポート シグネチャ 説明
aiTools (tools: ToolDescriptors | ToolSet) => ToolProvider AI SDK ツールをデフォルトプロバイダーでラップします。
generateTypes (tools: ToolDescriptors | ToolSet, namespace?: string) => string AI SDK または Zod スキーマから宣言を生成します。名前空間のデフォルトは codemode です。
resolveProvider (provider: ToolProvider) => ResolvedProvider 承認ゲート付きツールを除外し、利用可能なら AI SDK の asSchema() で入力を検証し、実行可能な関数を取り出します。
interface ToolDescriptor {
	description?: string;
	inputSchema: ZodType;
	outputSchema?: ZodType;
	execute?: (args: unknown) => Promise<unknown>;
}

type ToolDescriptors = Record<string, ToolDescriptor>;

ToolSetConnector

class ToolSetConnector extends CodemodeConnector {
	constructor(
		ctx: DurableObjectState | ExecutionContext,
		options: ToolSetConnectorOptions,
	);
}

function toolSetConnector(
	ctx: DurableObjectState | ExecutionContext,
	options: ToolSetConnectorOptions,
): ToolSetConnector;

interface ToolSetConnectorOptions {
	name?: string;
	instructions?: string;
	tools: ToolSet;
}

名前空間のデフォルトは tools です。コネクタは execute 関数のないツールを除外します。needsApproval: true と関数値の needsApproval は、耐久コネクタ承認へ対応付けます。needsApproval: false は承認なしで実行します。実行前に AI SDK スキーマが入力を検証します。

@cloudflare/codemode/mcp

このエントリポイントは MCP SDK と Zod の peer dependencies を要求します。

codeMcpServer()

interface CodeMcpServerOptions {
	server: McpServer;
	executor: Executor;
	description?: string;
}

function codeMcpServer(options: CodeMcpServerOptions): Promise<McpServer>;

既存の MCP サーバーを、1 つの code ツールでラップします。ラッパーはインメモリトランスポートでソースサーバーへ接続し、ツールを発見し、それらのツールをエグゼキュータ内の codemode 上のメソッドとして公開します。

カスタム説明には {{types}} を含められ、ラッパーが生成した TypeScript 宣言で置き換えます。{{example}} も含められ、ラッパーが最初の上流 MCP ツールに基づく呼び出し例で置き換えます。返される MCP 値は次の順でアンラップされます。互換の toolResult、MCP エラー、structuredContent、すべてテキストのコンテンツ、元の混合コンテンツ結果。

openApiMcpServer()

interface OpenApiMcpServerOptions {
	spec: Record<string, unknown>;
	executor: Executor;
	request: (options: RequestOptions) => Promise<unknown>;
	name?: string;
	version?: string;
	description?: string;
}

interface RequestOptions {
	method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
	path: string;
	query?: Record<string, string | number | boolean | undefined>;
	body?: unknown;
	contentType?: string;
	rawBody?: boolean;
}

function openApiMcpServer(options: OpenApiMcpServerOptions): McpServer;

次の 2 ツールを持つ MCP サーバーを作成します。

MCP ツール サンドボックス API 用途
search codemode.spec() OpenAPI ドキュメントに対してコードを実行します。ローカルの $ref 値は、コードがドキュメントを受け取る前に解決されます。
execute codemode.spec()codemode.request(options) ドキュメントを検査し、ホスト提供の request 関数を呼べるコードを実行します。

name のデフォルトは openapi です。version のデフォルトは 1.0.0 です。ホストの request 関数が認証情報をサンドボックスの外に保ちます。テキスト応答はおおよそ 6,000 トークンに制限され、切り詰めたときは切り詰めマーカーが付きます。

searchexecute のツール説明は固定の例スニペットを使います。codeMcpServer() と違い、この関数は {{types}}{{example}} プレースホルダをサポートしません。任意の descriptionexecute ツールの説明へ追記されます。

@cloudflare/codemode/tanstack-ai

このエントリポイントは @tanstack/aizod の peer dependencies を要求します。

createCodeTool()

function createCodeTool(options: CreateCodeToolOptions): ServerTool;

オプション、CodeInputCodeOutput/ai エントリポイントと同じです。返される ServerTool は TanStack AI の chat() へ渡せます。

TanStack AI プロバイダーユーティリティ

TanStack AI エントリポイントは、次のツールプロバイダーユーティリティを提供します。

エクスポート シグネチャ 説明
tanstackTools (tools: TanStackTool[], name?: string) => ToolProvider TanStack AI ツールをプロバイダーでラップします。execute 関数があるツールだけが呼び出せます。名前空間のデフォルトは codemode です。
generateTypes (tools: TanStackTool[], namespace?: string) => string 対応する TanStack AI スキーマを JSON Schema へ変換し、宣言を生成します。
resolveProvider (provider: ToolProvider) => ResolvedProvider スキーマ検証なしで、フレームワーク非依存のプロバイダーを解決します。
normalizeProviders (tools: ToolProviderTools | ToolProvider[]) => ToolProvider[] 生のツールを 1 要素のプロバイダー配列へ変換します。

このエントリポイントは DEFAULT_DESCRIPTION もエクスポートします。tanstackTools()needsApproval: true または関数値の needsApproval を持つツールを除外します。needsApproval: false のツールは呼び出せたままです。

@cloudflare/codemode/browser

ブラウザーエントリポイントはブラウザー API とプレーンな JSON Schema を使います。AI SDK や Zod は不要です。

createBrowserCodeTool()

function createBrowserCodeTool(
	options: CreateBrowserCodeToolOptions,
): BrowserCodeToolDescriptor;

interface CreateBrowserCodeToolOptions {
	tools:
		| JsonSchemaExecutableToolDescriptor[]
		| JsonSchemaExecutableToolDescriptors;
	executor?: Executor;
	description?: string;
}

配列形式のツールには name が必要です。オブジェクト形式のツールは、各レコードキーを名前として使います。エグゼキュータのデフォルトは新しい IframeSandboxExecutor です。

tools オプションは needsApproval?: boolean | ((...args: unknown[]) => unknown) 付きの記述子も受け付けます。needsApproval: true または関数値の needsApproval を持つツールは除外されます。needsApproval: false のツールは呼び出せたままです。JSON Schema はモデル向け宣言に寄与しますが、実行時検証は行いません。

interface JsonSchemaExecutableToolDescriptor extends JsonSchemaToolDescriptor {
	name?: string;
	execute: (args: Record<string, unknown>) => Promise<unknown>;
}

type JsonSchemaExecutableToolDescriptors = Record<
	string,
	JsonSchemaExecutableToolDescriptor
>;

返される記述子の形は次のとおりです。

interface BrowserCodeToolDescriptor {
	name: string;
	description: string;
	inputSchema: {
		type: "object";
		properties: {
			code: { type: "string"; description: string };
		};
		required: ["code"];
	};
	outputSchema: {
		type: "object";
		properties: {
			result: { description: string };
			logs: {
				type: "array";
				items: { type: "string" };
				description: string;
			};
		};
		required: ["result"];
	};
	execute(args: CodeInput): Promise<CodeOutput>;
}

IframeSandboxExecutor

class IframeSandboxExecutor implements Executor {
	constructor(options?: IframeSandboxExecutorOptions);
	execute(
		code: string,
		providersOrFns:
			| ResolvedProvider[]
			| Record<string, (...args: unknown[]) => Promise<unknown>>,
	): Promise<ExecuteResult>;
}

interface IframeSandboxExecutorOptions {
	timeout?: number;
	csp?: string;
}

iframe エグゼキュータが受け付けるオプションは次のとおりです。

フィールド デフォルト 説明
timeout 30000 最大実行時間(ミリ秒)です。ブラウザーのイベントループを塞ぐ同期ループは先取りできません。
csp default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval'; サンドボックス iframe ドキュメントに適用する Content Security Policy です。

各実行は sandbox="allow-scripts" の隠し iframe を作ります。ツール呼び出しは nonce スコープの postMessage で iframe 境界を越えます。iframe は成功、エラー、またはタイムアウトのあとに削除されます。

このエントリポイントは、フレームワーク非依存の ExecutorExecuteResultResolvedProvider 型もエクスポートします。JsonSchemaToolDescriptorJsonSchemaToolDescriptors を再エクスポートします。

@cloudflare/codemode/vite

Vite エントリポイントのデフォルトエクスポートは 1 つです。

function codemodeVitePlugin(): Plugin;

プラグインは Worker エントリモジュール(src/server.tssrc/index.ts、または src/worker.ts)へ export { CodemodeRuntime } from "@cloudflare/codemode" を追記します。これによりランタイム facet が ctx.exports.CodemodeRuntime として使え、createCodemodeRuntime() がそれを要求します。

エントリモジュールがすでに CodemodeRuntime をエクスポートしている場合、プラグインはモジュールを変更しません。コネクタクラスに特別なファイル名や import 構文は不要です。通常どおりインポートし、インスタンスをランタイムへ渡します。

プラグインなしでは、エクスポートを手動で足します。

export { CodemodeRuntime } from "@cloudflare/codemode";

コネクタの import は、1 つのコネクタファイルまたはディレクトリを対象にできます。ディレクトリ import は、その配下の一致するコネクタファイルをすべて再エクスポートします。

役に立ちましたか?