MCP セットアップ・Tools・安全性
stdio を設定し、capability を発見し、無料で計画し、有料実行は明示確認します。
ドキュメントは公開できますが、API/MCP の利用可否はライブの製品マニフェストとアカウント権限で決まります。foundation / experimental は安定性保証ではありません。
| Tool | 権限 | 目的 | 自動 Retry |
|---|---|---|---|
| myeq.capabilities.search | read | 制作 capability を確認 | 429 / 502 / 503 |
| myeq.production.plan | plan | 無料で検査可能な plan を作成 | しない |
| myeq.production.preflight | read | readiness と推定コストを検証 | 429 / 502 / 503 |
| myeq.storyboard.apply | mutate | 承認済み Storyboard を適用 | しない |
| myeq.production.execute_step | spend | 確認済み plan step を実行 | しない |
| myeq.production.execute | spend | 確認済み durable production を開始 | しない |
| myeq.job.status | read | durable job progress を取得 | 429 / 502 / 503 |
| myeq.production.ledger | read | owner-scoped execution ledger を取得 | 429 / 502 / 503 |
| myeq.production.verticals | read | 制作 recipe を一覧表示 | 429 / 502 / 503 |
| myeq.v2v.edit | spend | Studio の V2V gate でソース動画を編集 | しない |
| myeq.video.preflight_scene | read | 課金せずにシーンの正確な FPS と費用を確認 | 429 / 502 / 503 |
| myeq.video.generate_scene | spend | 確認済みシーンを受付可能な FPS で生成 | しない |
一般的な stdio 設定
MCP package を build し、MYEQ_API_KEY と MYEQ_BASE_URL を設定して stable entrypoint を host に指定します。
{
"mcpServers": {
"myeq": {
"command": "node",
"args": ["/absolute/path/to/myeq-full/mcp/dist/server.js"],
"env": {
"MYEQ_API_KEY": "your-key",
"MYEQ_BASE_URL": "https://myeq.pro"
}
}
}
}Discovery と Plan から開始
capability を確認し、plan → preflight の後、ユーザー承認がある場合のみ mutate/spend。
{
"projectId": "project-123",
"instruction": "Create a 60-second vertical trailer",
"vertical": "ai_film",
"sourceLanguage": "en",
"responseLanguage": "es",
"dialogueLanguage": "es",
"visualPromptLanguage": "en"
}有料 tool を盲目的に retry しない
confirm=true と idempotency key が必須。受理済み durable job は client 切断後も MYEQ が実行します。
Job identity で再開
後で再接続して job status を読みます。chat や terminal を開いたままにする必要はありません。
Studio・API・MCP の 24 / 30 / 60 FPS
3つのインターフェースは同じ確定済みシーン snapshot と受付判定を使います。指定 FPS は保持され、24 FPS への自動変更はありません。利用可否は承認済み worker とシーンの正確な条件で決まります。
START/END の画像サイズは 704×1280、1280×704、960×960 です。I2V は生成音声または音声なし。A2V は使用権限のある元音声が必要で、選択した開始位置を保持します。この表は ingredients や V2V の高 FPS 対応を意味しません。seed は 0~2147483647 の整数です。 I2V と A2V の END のみの指定は、24 / 30 / 60 FPS で配備済みサービスが明示的に承認した場合に利用できます。END は最終フレームを導き、冒頭はプロンプトから生成されます。start を空にして画像を end に置きます。画素の完全一致や動画の逆再生を保証するものではありません。 A2V には使用権限のある元音声と、少なくとも START または END の画像1枚が必要です。音声だけでは生成できません。
| FPS | 受付対象 | 物理的な制約 |
|---|---|---|
| 24 | 既定値。選択した各モダリティの受付判定が必要 | 長さ・音声・参照は選択した native class に依存 |
| 30 | 承認済み I2V / A2V のみ | 720p・整数 2~10 秒・9:16 / 16:9 / 1:1・I2V/A2V: START または END、両方も可。A2V は元音声も必須 |
| 60 | 承認済み I2V / A2V のみ | 720p・整数 2~10 秒・9:16 / 16:9 / 1:1・I2V/A2V: START または END、両方も可。A2V は元音声も必須 |
保存・料金確認・1シーンの実行確認
権限のある project を作成または取得し、PATCH expectedVersion でシーンを保存します。同じ snapshot と targetSceneId を /api/v1/production/snapshots/preflight-scene に送り、data.ready・issues・estimatedCredits を確認します。job 作成や credit 予約は行いません。confirm=true と固定 Idempotency-Key を付けて /api/v1/production/snapshots/generate-scene へ送り、返された jobId を確認します。MCP は myeq.video.preflight_scene と myeq.video.generate_scene を使用し、有料送信は自動再試行しません。シーン設定が全体設定より優先されます。対応する確定 sceneContracts を保持してください。
旧 /video/start、/video/create、/video/create-job、/video/preflight は廃止済みです。既定/24 は 410、30/60 は snapshot への移行が必要で 422 を返します。25/48/50 は非対応です。preflight 失敗時に FPS 変更や課金はありません。成功しても空き枠や残高は予約されません。
const base = process.env.MYEQ_BASE_URL || 'https://myeq.pro';
const headers = { Authorization: 'Bearer ' + process.env.MYEQ_API_KEY, 'Content-Type': 'application/json' };
async function api(path, method, body, extra = {}) {
const response = await fetch(base + path, { method, headers: { ...headers, ...extra },
...(body === undefined ? {} : { body: JSON.stringify(body) }) });
const value = await response.json();
if (!response.ok) throw new Error(JSON.stringify(value));
return value;
}
const project = await api('/api/v1/projects', 'POST', { title: '60 FPS', aspectRatio: '9:16', duration: 4 });
const sourceAudioUrl = process.env.SOURCE_AUDIO_URL;
const generationInputs = { videoProvider: 'myeq_v2', videoModelSelection: 'myeq_v2',
inputModality: sourceAudioUrl ? 'audio_to_video' : 'image_to_video', durationSeconds: 4,
fps: 60, outputResolution: '720p', includeAudio: Boolean(sourceAudioUrl), seed: 12345,
...(sourceAudioUrl ? { sourceAudioUrl, sourceAudioStartTime: 0 } : {}) };
const scene = { id: 'scene-1', prompt: 'A slow camera move. Preserve the subject.',
settings: { fps: 60, durationSeconds: 4 },
start: process.env.START_URL ? [{ name: 'START', url: process.env.START_URL }] : [],
end: process.env.END_URL ? [{ name: 'END', url: process.env.END_URL }] : [], context: [], avatar: [] };
const snapshot = { id: crypto.randomUUID(), version: 1, projectId: project.id,
ownerId: project.ownerUserId, sourceEditorStateVersion: project.version + 1,
createdAt: new Date().toISOString(), projectTitle: project.title,
aspectRatio: '9:16', resolution: '720p', durationSeconds: 4, fps: 60,
generationInputs, scenes: [scene], avatars: [], assetsSummary: [],
sourceAudio: sourceAudioUrl ? { url: sourceAudioUrl, durationSeconds: null } : null, provenance: { source: 'ui' } };
await api('/api/v1/projects/' + project.id, 'PATCH', { expectedVersion: project.version,
editorState: { ...project.editorState, generationInputs,
sceneStoryboard: { scenes: [scene] }, productionSnapshot: snapshot } });
const input = { snapshot, targetSceneId: scene.id };
const quote = await api('/api/v1/production/snapshots/preflight-scene', 'POST', input);
console.log(quote);
if (quote.data?.ready && process.env.CONFIRM_PAID === 'true') {
const idempotencyKey = process.env.SAVED_IDEMPOTENCY_KEY;
if (!idempotencyKey) throw new Error('Persist one stable key before submitting');
const result = await api('/api/v1/production/snapshots/generate-scene', 'POST',
{ ...input, confirm: true }, { 'Idempotency-Key': idempotencyKey });
console.log(result);
const jobId = result.data?.pendingTake?.orchestrationJobId || result.data?.asset?.metadata?.jobId;
if (jobId) console.log(await api('/api/v1/production/jobs/' + encodeURIComponent(jobId), 'GET'));
}MCP · 24 / 30 / 60 FPS
// Reuse the full saved snapshot from the API example.
{ name: 'myeq.video.preflight_scene', arguments: { snapshot, targetSceneId: 'scene-1' } }
// Review data.ready, issues and estimatedCredits before confirming.
{ name: 'myeq.video.generate_scene', arguments: {
snapshot, targetSceneId: 'scene-1', confirm: true,
idempotencyKey: 'persisted-scene-request-0001'
} }
{ name: 'myeq.job.status', arguments: { jobId: 'returned-orchestration-job-id' } }