Configuration, tools et sécurité MCP
Configurez stdio, découvrez les capacités, planifiez gratuitement et confirmez explicitement l’exécution payante.
La documentation est publique, mais la disponibilité API/MCP dépend du manifeste actif et des droits du compte. Foundation ou experimental ne garantit pas la stabilité.
| Tool | Autorité | Objectif | Retry automatique |
|---|---|---|---|
| myeq.capabilities.search | read | Découvrir les capacités de production | 429 / 502 / 503 |
| myeq.production.plan | plan | Compiler un plan gratuit et inspectable | jamais |
| myeq.production.preflight | read | Valider la préparation et le coût estimé | 429 / 502 / 503 |
| myeq.storyboard.apply | mutate | Appliquer un Storyboard approuvé | jamais |
| myeq.production.execute_step | spend | Exécuter une étape confirmée du plan | jamais |
| myeq.production.execute | spend | Démarrer une production durable confirmée | jamais |
| myeq.job.status | read | Lire la progression durable du job | 429 / 502 / 503 |
| myeq.production.ledger | read | Lire le ledger d’exécution du propriétaire | 429 / 502 / 503 |
| myeq.production.verticals | read | Lister les recettes de production | 429 / 502 / 503 |
| myeq.v2v.edit | spend | Éditer une vidéo source avec les gates V2V du Studio | jamais |
| myeq.video.preflight_scene | read | Vérifier les FPS et le coût exacts sans dépense | 429 / 502 / 503 |
| myeq.video.generate_scene | spend | Générer une scène confirmée à la cadence admise | jamais |
Configuration stdio générique
Compilez MCP, fournissez MYEQ_API_KEY et MYEQ_BASE_URL et pointez l’hôte vers l’entrypoint stable.
{
"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"
}
}
}
}Commencez par discovery et plan
Découvrez les capacités, créez le plan, lancez Preflight puis mutez/dépensez seulement après autorisation.
{
"projectId": "project-123",
"instruction": "Create a 60-second vertical trailer",
"vertical": "ai_film",
"sourceLanguage": "en",
"responseLanguage": "es",
"dialogueLanguage": "es",
"visualPromptLanguage": "en"
}Ne retryez jamais aveuglément une tool payante
confirm=true et idempotency key sont requis. Un job accepté continue chez MYEQ après déconnexion.
Reprenez par l’identité du job
Reconnectez-vous puis lisez le statut ; chat et terminal n’ont pas besoin de rester ouverts.
24, 30 et 60 FPS dans Studio, API et MCP
Les trois interfaces utilisent le même snapshot de scène confirmé et la même admission. La cadence demandée est conservée, sans repli automatique à 24 FPS. La disponibilité dépend du worker approuvé et de la scène exacte.
Canevas START/END : 704×1280, 1280×704 ou 960×960. I2V accepte un audio généré ou aucun audio. A2V exige un audio source autorisé et conserve son décalage sélectionné. Ce tableau ne permet pas les FPS élevés pour les ingrédients ou V2V. Les seeds sont des entiers de 0 à 2147483647. I2V et A2V acceptent END sans START à 24, 30 et 60 FPS uniquement si le service déployé le valide explicitement. END guide la dernière image ; le début est généré depuis le prompt. Laissez start vide et conservez l’image dans end. Cela ne garantit pas des pixels identiques et ne renverse pas la vidéo. A2V exige toujours un audio source autorisé et au moins une image START ou END ; un audio seul n’est pas admis.
| FPS | Classe admise | Limites physiques |
|---|---|---|
| 24 | Par défaut ; admission propre à chaque modalité | Durée, audio et références selon la classe native choisie |
| 30 | I2V / A2V approuvés uniquement | 720p · 2–10 secondes entières · 9:16 / 16:9 / 1:1 · I2V/A2V : START et/ou END ; A2V exige aussi un audio source |
| 60 | I2V / A2V approuvés uniquement | 720p · 2–10 secondes entières · 9:16 / 16:9 / 1:1 · I2V/A2V : START et/ou END ; A2V exige aussi un audio source |
Enregistrer, vérifier le coût, puis confirmer une scène
Créez ou lisez le projet autorisé, enregistrez la scène avec PATCH expectedVersion, puis envoyez le même snapshot et targetSceneId à /api/v1/production/snapshots/preflight-scene. Vérifiez data.ready, issues et estimatedCredits ; aucun job ni réservation de crédits. Générez via /api/v1/production/snapshots/generate-scene avec confirm=true et une Idempotency-Key stable, puis consultez jobId. MCP utilise myeq.video.preflight_scene et myeq.video.generate_scene avec le même snapshot ; aucun réessai automatique des envois payants. Les réglages de scène priment sur les valeurs globales ; conservez les sceneContracts confirmés correspondants.
Les anciennes routes /video/start, /video/create, /video/create-job et /video/preflight sont retirées : défaut/24 renvoie 410 ; 30/60 exige une migration snapshot avec 422. 25/48/50 ne sont pas pris en charge. Un échec de preflight ne change pas la cadence et ne facture aucun crédit. Un contrôle réussi ne réserve ni disponibilité ni solde.
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' } }