Обзор MYEQ MCP
MCP предоставляет семантические tools поверх той же server authority, что Studio и HTTP API.
Документация публична, но доступность API/MCP определяется живым манифестом и правами аккаунта. Foundation/experimental не являются обещанием стабильности.
MCP — транспорт, не второй продукт
MCP client никогда не source of truth. MYEQ серверно валидирует доступ, plans, costs, confirmation, idempotency, execution и receipts.
Не зависит от host
stdio server работает с Claude clients, OpenAI-compatible MCP hosts и enterprise clients.
Восемь языков пользователя, technical schema на английском
Tool names и fields остаются английскими для interoperability; production languages задаются отдельно.
Не встраивайте большие media в MCP JSON
Загрузите/зарегистрируйте authorized asset и передавайте durable assetId.
24, 30 и 60 FPS в Studio, API и MCP
Все три интерфейса используют один подтверждённый snapshot сцены и одинаковые проверки допуска. Запрошенный FPS сохраняется, автоматического перехода на 24 FPS нет. Доступность зависит от разрешённого worker и точных условий сцены.
Размеры START/END: 704×1280, 1280×704 или 960×960. I2V допускает сгенерированное аудио или отсутствие аудио. A2V требует исходное аудио с правом использования и сохраняет выбранное смещение. Таблица не включает высокий FPS для ingredients или V2V. Seed — целое число от 0 до 2147483647. I2V и A2V допускают END без START при 24, 30 и 60 FPS только при явном разрешении развёрнутого сервиса. END направляет последний кадр; начало создаётся по промпту. Оставьте start пустым, а изображение — в end. Это не гарантирует совпадения пикселей и не переворачивает видео. A2V всегда требует исходное аудио с правом использования и хотя бы одно изображение START или END; одного аудио недостаточно.
| FPS | Допущенный класс | Физические ограничения |
|---|---|---|
| 24 | По умолчанию; выбранная модальность проходит собственный допуск | Длительность, аудио и референсы зависят от native-класса |
| 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 также требует исходное аудио |
Сохранить, проверить цену, подтвердить одну сцену
Создайте или прочитайте доступный проект, сохраните сцену через PATCH expectedVersion. Отправьте тот же snapshot и targetSceneId в /api/v1/production/snapshots/preflight-scene. Проверьте data.ready, issues и estimatedCredits: job и резерв кредитов не создаются. Генерируйте через /api/v1/production/snapshots/generate-scene с confirm=true и постоянным Idempotency-Key, затем проверяйте jobId. MCP использует myeq.video.preflight_scene и myeq.video.generate_scene с тем же snapshot; платная отправка не повторяется автоматически. Настройки сцены важнее общих; сохраняйте соответствующие подтверждённые 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' } }