Skip to content

Mains : agir sur l'écran ​

Les Mains produisent des entrées synthétiques : pointeur, clavier, défilement, fenêtres. Chaque action passe par la même chaîne : résolution du point, sonde de la cible, garde, porte du plafond, journal d'audit, puis exécution. Une action au-dessus du plafond est refusée.

Niveaux ​

OutilNiveauNom interneCible observée requise
main_navigateL1NONDESTRUCTIVEnon
main_hoverL1NONDESTRUCTIVEnon
main_activateL1NONDESTRUCTIVEnon
main_window_minimizeL1NONDESTRUCTIVEnon
main_window_hideL1NONDESTRUCTIVEnon
main_window_showL1NONDESTRUCTIVEnon
main_clickL2INPUToui
main_typeL2INPUTnon
main_dragL2INPUToui
main_keyL2INPUTnon
main_pressL3VALIDATIONoui
main_mouse_downL4AUTONOMOUSoui
main_mouse_upL4AUTONOMOUSoui
main_key_downL4AUTONOMOUSnon
main_key_upL4AUTONOMOUSnon

Le niveau est nominal : la cible peut le relever selon la réversibilité de l'action, jamais l'abaisser. « Cible observée requise » signifie que l'action s'engage sur un élément d'écran qui doit être vérifié avant d'agir.

Forme des réponses ​

Tous les outils d'action renvoient un objet JSON de l'une de ces trois formes.

FormeSens
{"status": "refused", "reason": "..."}L'action est refusée (plafond, garde, confirmation humaine non obtenue)
{"status": "done", "result": ..., "focus": ...}L'action a été exécutée ; focus n'est présent que si une mise au premier plan a eu lieu
{"status": "error", "reason": "..."}L'organe a échoué à exécuter l'action

Les erreurs de préparation deviennent une erreur MCP structurée {"error": "<code>", "message": "..."} et ne plantent jamais le serveur :

CodeSignification
invalid_argumentsArgument invalide, par exemple space="image" sans display
index_out_of_rangeL'indice display n'existe pas
capture_failedL'énumération des écrans a échoué
motor_unavailableLes Mains ne sont pas disponibles sur cet hôte

Sans Accessibilité, des échecs silencieux

Sans l'autorisation Accessibilité, main_type, main_key, main_hover et main_navigate renvoient status: "done" sans aucun effet, et main_click, main_press et main_drag attendent 30 secondes une boîte de confirmation. Appelez daimon_doctor avant de conclure qu'un outil est en panne.

Paramètres communs ​

Intention et réversibilité ​

Chaque outil d'action exige intent : une phrase qui déclare ce que vous voulez faire, consignée au journal d'audit. Les outils qui s'engagent portent aussi reversible : déclarez honnêtement si l'action peut être annulée.

Positionnement ​

Les outils positionnels (main_click, main_press, main_hover, main_navigate, main_drag, main_mouse_down, main_mouse_up) partagent ce bloc :

ParamètreTypeDéfautRôle
spacechaîne"global""global" : points du bureau global, l'unité que renvoie vue_find. "image" : pixels d'un vue_snapshot, résolus par Daimon
displayentieraucunIndice d'écran ; obligatoire quand space="image"
max_widthentier720Avec space="image" : le même plafond que le snapshot. Ignoré en global
regionobjet {x, y, width, height}aucuneAvec space="image" : la même région que le snapshot, en points locaux à l'écran. Ignoré en global

Fenêtre cible ​

main_click, main_press et main_drag portent aussi ce bloc. Les chaînes vides et 0 signifient « non précisé ».

ParamètreTypeDéfautRôle
window_bundlechaîne""Identifiant de bundle de l'application cible
window_titlechaîne""Titre de la fenêtre cible
window_pidentier0Identifiant de processus cible
ensure_focusbooléentrueActive d'abord une fenêtre cible non frontale

Ce que la description de l'outil dit

La description MCP de main_click écrit « window={bundle|title|pid} » ; les paramètres réels sont les trois champs à plat window_bundle, window_title et window_pid ci-dessus.

Modificateurs ​

Sous macOS : cmd, shift, opt, ctrl. Sous Windows : ctrl, shift, alt, win ; cmd et fn y sont refusés.

main_click ​

Clique sur un élément ou une coordonnée. Niveau L2. Refusé au-dessus du plafond.

ParamètreTypeDéfautObligatoireRôle
x, yentieraucunouiPoint à cliquer
intentchaîneaucunouiIntention déclarée
reversiblebooléentruenonL'action est-elle annulable
buttonchaîne"left"nonleft, right ou middle
countentier1non1 ou 2 (double-clic)
modifiersliste de chaînes[]nonModificateurs tenus pendant le clic
rolechaîne""nonRôle de l'élément (issu de Touché)
labelchaîne""nonLibellé de l'élément (issu de Touché)

Plus les blocs Positionnement et Fenêtre cible.

Exemple d'appel

json
{
  "x": 1210, "y": 84, "intent": "Ouvrir le menu Fichier",
  "role": "AXMenuBarItem", "label": "Fichier", "reversible": true
}

Pièges : fournissez role et label (relevés avec touche_probe) pour que Daimon puisse vérifier la réversibilité de la cible.

main_type ​

Saisit du texte dans le champ qui a le focus. Niveau L2.

ParamètreTypeDéfautObligatoireRôle
textchaîneaucunouiTexte à saisir
intentchaîneaucunouiIntention déclarée
reversiblebooléentruenonL'action est-elle annulable
rolechaîne""nonRôle du champ visé
labelchaîne""nonLibellé du champ visé

Exemple d'appel : { "text": "bonjour", "intent": "Remplir le champ nom" }

Pièges

  • Le texte saisi n'est jamais écrit dans le journal d'audit.
  • main_type ne choisit pas le champ : cliquez d'abord dessus.
  • Pour une touche ou un raccourci, utilisez main_key, pas main_type.

main_key ​

Envoie une touche discrète ou un raccourci (Return, Tab, Échap, flèches, touches de fonction, ou par exemple cmd+shift+r). Niveau L2.

ParamètreTypeDéfautObligatoireRôle
keychaîneaucunouiTouche ou combinaison
intentchaîneaucunouiIntention déclarée
modifiersliste de chaînes[]nonModificateurs
countentier1nonNombre de répétitions
reversiblebooléentruenonL'action est-elle annulable

Exemple d'appel

json
{ "key": "r", "modifiers": ["cmd", "shift"], "intent": "Recharger la page sans cache" }

Pièges: un caractère seul est tapé avec la touche que la disposition de clavier active utilise pour lui. Les combinaisons dangereuses exigent une confirmation.

main_press ​

Active un bouton engageant en (x, y) par l'API d'accessibilité (AXPress). Niveau L3. Les cibles qui ne sont pas des retours arrière exigent une confirmation humaine.

ParamètreTypeDéfautObligatoireRôle
x, yentieraucunouiPoint du bouton
intentchaîneaucunouiIntention déclarée
reversiblebooléenfalsenonL'action est-elle annulable
rolechaîne""nonRôle de l'élément
labelchaîne""nonLibellé de l'élément

Plus les blocs Positionnement et Fenêtre cible.

Exemple d'appel

json
{ "x": 900, "y": 640, "intent": "Valider l'envoi du formulaire", "role": "AXButton", "label": "Envoyer" }

Pièges : contrairement aux autres outils, reversible vaut false par défaut.

main_drag ​

Glisse de (from_x, from_y) à (to_x, to_y). Niveau L2. La destination du dépôt est classée pour sa réversibilité : déposer sur la Corbeille, par exemple, déclenche la porte.

ParamètreTypeDéfautObligatoireRôle
from_x, from_yentieraucunouiPoint de départ
to_x, to_yentieraucunouiPoint d'arrivée
intentchaîneaucunouiIntention déclarée
buttonchaîne"left"nonBouton de la souris
reversiblebooléentruenonL'action est-elle annulable

Plus les blocs Positionnement et Fenêtre cible ; les deux points passent par la résolution.

Exemple d'appel

json
{ "from_x": 300, "from_y": 400, "to_x": 700, "to_y": 400, "intent": "Déplacer la vignette" }

Fait défiler d'une valeur scroll_y. Niveau L1. La réversibilité est forcée à vrai.

ParamètreTypeDéfautObligatoireRôle
intentchaîneaucunouiIntention déclarée
scroll_yentier0nonAmplitude ; positif = vers le haut
x, yentieraucunnonPoint sur lequel le défilement atterrit

Plus le bloc Positionnement (accepté pour x/y).

Exemple d'appel: { "intent": "Descendre dans la liste", "scroll_y": -300, "x": 700, "y": 500 }

Pièges

  • L'amplitude dépend de la plateforme : pixels sous macOS ; sous Windows, 120 correspond à un cran de molette.
  • Donnez un point (x, y) pour que le défilement tombe sur la vue voulue ; sans point, il s'applique où se trouve le pointeur.

main_hover ​

Déplace le pointeur en (x, y) sans cliquer (révéler une infobulle ou un menu). Niveau L1. La réversibilité est forcée à vrai.

ParamètreTypeDéfautObligatoireRôle
x, yentieraucunouiPoint visé
intentchaîneaucunouiIntention déclarée

Plus le bloc Positionnement.

main_activate ​

Amène une application ou une fenêtre au premier plan. Niveau L1.

ParamètreTypeDéfautObligatoireRôle
intentchaîneaucunouiIntention déclarée
bundlechaîne""nonIdentifiant de bundle
titlechaîne""nonTitre de la fenêtre
pidentier0nonIdentifiant de processus

Exemple d'appel: { "intent": "Passer sur le Finder", "bundle": "com.apple.finder" }

main_window_minimize ​

Réduit la fenêtre de premier plan de l'application cible, par l'accessibilité (insensible à un raccourci réaffecté, contrairement à Cmd+M). Niveau L1. Réversible : main_window_show restaure. Mêmes paramètres que main_activate.

main_window_hide ​

Masque l'application cible (insensible à un raccourci réaffecté, contrairement à Cmd+H). Niveau L1. Réversible : main_window_show restaure. Mêmes paramètres que main_activate.

main_window_show ​

Démasque, désréduit et remonte l'application cible : le retour arrière de main_window_minimize et main_window_hide. Niveau L1. Mêmes paramètres que main_activate.

main_mouse_down ​

Primitive bas niveau : presse et maintient le bouton gauche de la souris en (x, y). Niveau L4 uniquement.

ParamètreTypeDéfautObligatoireRôle
x, yentieraucunouiPoint
intentchaîneaucunouiIntention déclarée

Plus le bloc Positionnement.

Pièges : le bouton est relâché automatiquement après 10 secondes si main_mouse_up ne suit pas, même sans autre appel.

main_mouse_up ​

Relâche le bouton gauche maintenu, en (x, y). Niveau L4. Mêmes paramètres que main_mouse_down.

main_key_down ​

Primitive bas niveau : presse et maintient une touche. Niveau L4 uniquement.

ParamètreTypeDéfautObligatoireRôle
keychaîneaucunouiTouche
intentchaîneaucunouiIntention déclarée
modifiersliste de chaînes[]nonModificateurs

Pièges : la touche est relâchée automatiquement après 10 secondes si main_key_up ne suit pas, même sans autre appel.

main_key_up ​

Relâche une touche maintenue. Niveau L4.

ParamètreTypeDéfautObligatoireRôle
keychaîneaucunouiTouche
intentchaîneaucunouiIntention déclarée