Référence des outils MCP
Cette page décrit les 16 outils de la version 1.12.1 du MCP distant OAuth. La réponsetools/list du serveur connecté fait foi. Le stdio local n’expose ni prepare_upload ni get_upload ; son upload_file accepte en outre des chemins situés dans des répertoires explicitement autorisés.
Les exemples avec name et arguments décrivent des appels d’outils MCP, et non des corps de requête REST. Un exemple n’autorise pas une génération payante.
search_models
recommend_models
search_docs
get_model
model obligatoire : une chaîne de 1 à 128 caractères, correspondant à un identifiant canonique renvoyé ou à un alias pris en charge.
estimate_cost
pricing_quote : total_known vaut false, missing_usage nomme chaque valeur manquante et usage_help explique comment la fournir. Consultez Facturation. Une consultation réussie ne prouve ni que l’entrée est valide ni que le devis est complet.
Une estimation qui peut être approuvée renvoie aussi pricing_quote, l’enregistrement de l’accord pour cette entrée précise. Une fois l’accord de l’utilisateur obtenu, transmettez-le avec la même entrée à l’outil de génération. Il reste valable 24 heures à compter de l’estimation (expires_at), au prix approuvé ou à un prix inférieur : l’outil de génération refait l’estimation et soumet lorsque le prix est inchangé ou inférieur, y compris si les règles tarifaires ont été mises à jour entre-temps. Un prix plus élevé est refusé avec price_changed, une entrée modifiée avec quote_input_changed et un pricing_quote expiré avec quote_expired ; chacun de ces cas exige une nouvelle estimation et un nouvel accord. Avec inputs, le résultat indique l’estimation de chaque entrée et le total, et un seul pricing_quote approuve exactement ces entrées, dans cet ordre. Il n’approuve jamais une entrée isolée, et le pricing_quote d’une entrée isolée n’approuve jamais un lot.
Cet outil n’a pas d’argument max_cost_usd et ne produit pas le quote_id local de la CLI. Dans MCP, les vérifications de budget relèvent des outils de génération. media_seconds ne définit pas la durée de la sortie et ne comble pas les multiplicateurs inconnus des vidéos de référence.
get_pricing_rules
estimate_cost pour connaître le coût prévu d’une génération précise ; il applique les mêmes règles à l’entrée réelle. Un résultat vide signifie qu’aucune règle publique ne correspond, et non que le modèle est gratuit. Dans une liste, un modèle dont les règles ne peuvent pas être lues ou sont incomplètes est écarté, répertorié dans rejected_models et nommé dans warnings ; les autres modèles sont renvoyés comme d’habitude, et un modèle écarté n’est pas gratuit pour autant. La consultation d’un seul modèle échoue toujours lorsque ses règles ne peuvent pas être lues.
generate_image, generate_video, generate_audio
Choisissez l’outil correspondant au type de sortie. Ils partagent ces arguments de premier niveau :
Examinez le modèle et les entrées, estimez la requête complète, indiquez les limites et obtenez un accord explicite sur le coût avant l’appel, sauf si l’utilisateur a renoncé aux estimations (voir ci-dessous). Voici, à titre d’illustration, la forme d’un appel :
wait_seconds modifie cette attente pour chacun des trois outils. La soumission peut indiquer un montant réservé à l’avance, qu’il faut distinguer du coût de la tâche terminée.
Interrogez une tâche en cours plutôt que d’appeler à nouveau la génération pour vérifier la progression. Si la réponse est perdue, conservez l’identifiant, le compte, les entrées et l’identifiant de requête d’origine. Un identifiant différent crée une nouvelle soumission payante. Les protections de reprise côté client ne prouvent pas que le backend offre des garanties d’idempotence identiques sur tous les nœuds de production.
Générer sans estimation. Lorsque l’utilisateur demande explicitement de ne pas estimer ni confirmer (par exemple « génère directement » ou « désormais, génère directement »), l’assistant omet estimate_cost et la confirmation et transmet skip_estimate: true, dans la portée indiquée par l’utilisateur : cette tâche, ce lot ou le reste de la conversation. Il ne le déduit jamais d’un silence, du solde ou de sa propre suggestion. Lorsque l’utilisateur renonce aux estimations pour le reste de la conversation, l’assistant indique une fois que les générations suivantes seront soumises sans demande de confirmation ; une nouvelle conversation, ou une demande de rétablir les estimations, les rétablit. La génération est soumise même lorsque son prix ne peut pas être calculé ou qu’un pricing_quote est refusé parce qu’il a expiré, que le prix est plus élevé ou que l’entrée a changé, et le résultat l’indique (estimate_skipped, estimate_skip_reason) ; la tâche est facturée à l’usage réel. Une entrée invalide reste refusée, un max_cost_usd explicite continue de s’appliquer (une requête qui le dépasse, ou dont le prix ne peut pas lui être comparé, n’est pas soumise), et l’activation de la recherche web ou de la recherche d’images du modèle nécessite toujours l’accord de l’utilisateur. Si une estimation échoue ou n’a pas de total et que l’utilisateur n’y a pas renoncé, l’assistant demande une fois s’il doit générer quand même, à l’usage réel.
Lots. Pour plusieurs tâches d’un même modèle, transmettez inputs (de 1 à 50 éléments, chacun comme input) à estimate_cost puis, avec son pricing_quote, à l’outil de génération : une seule estimation, un seul accord sur le total et un seul appel qui soumet tous les éléments (jusqu’à 10 à la fois) et renvoie, sans attendre, le task_id ou l’erreur de chaque élément. Si l’un des éléments est invalide, rien n’est soumis. max_cost_usd s’applique au total du lot ; media_seconds et pricing_parameters s’appliquent à chaque élément. Récupérez les résultats avec list_tasks (task_ids, jusqu’à 50 par appel). Soumettez les tâches de modèles différents à raison d’une par appel, avec wait_seconds: 0. Ne comptez pas sur n pour le nombre d’images : certains modèles, comme GPT Image, renvoient souvent moins d’images que n ; utilisez donc un élément par image.
Aucun élément ne démarre plus de 25 secondes après le début de l’appel, et une soumission commencée n’est jamais interrompue ; les éléments non démarrés sont répertoriés comme non soumis. Pour terminer un lot, appelez à nouveau avec le même client_request_id et exactement les mêmes inputs dans les 24 heures suivant la première soumission : les éléments que le résultat indique comme restant à terminer sont soumis, et les éléments acceptés renvoient leurs tâches initiales sans nouvelle facturation. Si le pricing_quote a expiré entre-temps, refaites l’estimation des mêmes entrées et transmettez le nouveau. Pour un élément à l’issue inconnue, réessayez plus tard de la même manière ou vérifiez avec list_tasks. Pendant ces 24 heures, ne soumettez jamais à nouveau des éléments acceptés, non soumis ou à l’issue inconnue sous un nouveau client_request_id : cela crée de nouvelles tâches et les facture. Passé ce délai, le même client_request_id n’empêche plus une seconde facturation : vérifiez d’abord avec list_tasks, puis ne soumettez que les éléments qui n’ont pas abouti, dans un nouveau lot avec une nouvelle estimation et un nouveau client_request_id. Un élément dont l’entrée diffère de ce que ce client_request_id a soumis précédemment est refusé (idempotency_conflict) ; il s’agit d’une nouvelle tâche, qui nécessite sa propre estimation, son propre accord et son propre client_request_id.
get_task
error.code), l’explication que l’API renvoie également (error.message) et un billing_note : la tâche n’est pas facturée, et les crédits réservés à la soumission sont restitués automatiquement. Les résultats originaux sont généralement conservés 24 heures. L’affichage des aperçus dépend du client hôte.
list_tasks
get_task_usage
check_balance
Aucun argument :upload_file
prepare_upload
file_name obligatoire : chaîne comportant une extension, qui sert à déterminer le type de média. upload_path facultatif : répertoire relatif.
get_upload
upload_id obligatoire, issu du résultat de la préparation d’origine :
Résultats et erreurs
Les outils renvoient du texte lisible et structuredContent ; les échecs peuvent inclure isError/error/next_step. Un média terminé peut inclure resource_link et, facultativement, une vignette d’image. La prise en charge des blocs de contenu varie selon les hôtes. L’URL d’origine reste la référence pour la livraison ; les aperçus ne sont pas garantis dans tous les hôtes. Vérifiez les erreurs d’outil et les champs métier tels que input_valid, l’état de l’estimation et task.status. Un code HTTP 200 ne suffit pas à établir que la génération a réussi. L’expiration du délai de soumission peut survenir après la création de la tâche et ne prouve pas l’absence de facturation. Une consultation en échec ne prouve pas que la tâche initiale a échoué.Progression et résultats des tâches
Utilisez les consultations de solde et de modèles pour vérifier gratuitement la connexion. Utilisez get_task/list_tasks pour les tâches existantes, puis livrez les URL d’origine et les coûts réels indiqués. Le guide des flux de travail couvre les références, la reprise, l’enregistrement et les aperçus gris. Un problème d’affichage ne doit pas déclencher une nouvelle génération payante.Protocole MCP et API du backend
Le point de terminaison distant est
https://mcp.evolink.ai/mcp. Passport fournit OAuth ; le serveur interroge https://api.evolink.ai et le service de fichiers. Les URL MCP, les routes /v1 de la plateforme, la documentation et llms.txt sont des points d’entrée distincts.
Initialiser et appeler les outils
Laissez l’hôte ou le SDK MCP gérer initialize, les versions du protocole, Accept, l’authentification, les sessions et les blocs de contenu. Lisez tools/list après l’initialisation, puis appelez tools/call :Outils et opérations du backend
Les paramètres du modèle se placent dans arguments.input et sont convertis en requêtes REST par le serveur. media_seconds est une indication pour la facturation ; max_cost_usd ne fait que vérifier les estimations avant la soumission. La version publiée 1.12.1 estime à partir des règles tarifaires publiques (tarifs de référence, sans remises de compte) et n’a toujours pas de plafond de règlement final.