> Ouverture en cours : l'inscription et le paiement ne sont pas encore ouverts à tous. L'état du jour : https://subagent.fr/docs/etat.md
>
> Pour un agent : la carte du site est sur https://subagent.fr/llms.txt ; chaque page existe en Markdown, à la même adresse suffixée `.md`.

# `attach_files`

> Rend un lien de dépôt pour joindre des fichiers à un brouillon (créé avec `requires_approval`: `true`).

## En bref

| Propriété | Valeur |
|---|---|
| Titre | Joindre des fichiers à un brouillon |
| Outil MCP | `attach_files`, sur `https://api.subagent.fr/mcp` |
| Appel HTTP | `POST https://api.subagent.fr/v1/attach_files` |
| Accès | permission `send` |
| État de l'espace | vérifié : sinon, refus `space_unverified` |
| Effet | écriture |
| Vue dans l'assistant | non |

## Ce que fait l'outil

Le serveur décrit l'outil ainsi à l'agent qui se branche :

> Rend un lien de dépôt pour joindre des fichiers à un brouillon (créé avec `requires_approval`: `true`). L’humain l’ouvre dans son navigateur et choisit les fichiers ; un agent qui tient le fichier le poste lui-même (multipart/form-data, champ file). Les pièces partent avec le message, à sa validation. Seulement dans une conversation (le correspondant a lui-même écrit dans le fil) ou vers une adresse de l’espace : un premier message part sans pièce. 10 Mo et 10 pièces par message ; le lien vaut une heure ; 60 liens par espace et par jour.

## Paramètres

`attach_files` accepte ces paramètres. Un paramètre inconnu est refusé avec le code `invalid_argument`.

| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
| `message_id` | identifiant `msg_…` | oui | Le brouillon (msg_…). |

## Résultat

L'outil rend un texte lisible en français et un objet structuré (`structuredContent`). En HTTP, la réponse est cet objet.

| Champ | Type | Contenu |
|---|---|---|
| `attachments` | liste | Pièces déjà jointes. |
| `expires_at` | texte | Fin de validité (ISO 8601). |
| `max_bytes` | entier | Octets permis en tout. |
| `message_id` | texte | Le brouillon. |
| `upload_url` | texte | Le lien de dépôt. |

## Exemple d'appel

Les valeurs sont fictives.

HTTP :

```sh
curl -X POST https://api.subagent.fr/v1/attach_files \
  -H "Authorization: Bearer $SUBAGENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "message_id": "msg_7f2a91c4e8b34d0fa6c25e1b9d3f7a48"
}'
```

MCP (`tools/call`) :

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "attach_files",
    "arguments": {
      "message_id": "msg_7f2a91c4e8b34d0fa6c25e1b9d3f7a48"
    }
  }
}
```

## Refus possibles

| Code | HTTP | Ce qui s'est passé | Que faire |
|---|---|---|---|
| `space_unverified` | 403 | L'espace n'est pas vérifié : ses boîtes reçoivent, mais n'envoient pas. | Demander à l'humain le code à 6 chiffres, puis appeler `verify`. S'il n'a rien reçu, ou si aucun e-mail n'est rattaché à l'espace : `attach_human`. |
| `not_found` | 404 | L'objet n'existe pas pour cette clé. | Vérifier l'identifiant : il vient de `list_inboxes`, `list_threads`, `get_thread` ou `list_drafts`. |
| `not_draft` | 409 | Le message n'est pas, ou n'est plus, un brouillon. | Relire son statut avec `get_message`. |
| `attachments_not_allowed` | 409 | Le message n'est pas une réponse dans une conversation, ni un message vers une adresse de l'espace. | Envoyer le premier message sans pièce. Quand le correspondant a répondu, joindre la pièce à la réponse. |

S'y ajoutent les refus communs à tous les outils (`unauthorized`, `forbidden`, `invalid_argument`, `rate_limited`, `internal`) : voir [Erreurs](https://subagent.fr/docs/erreurs.md#acces).

## Voir aussi

- [Pièces jointes et copies : attach_files](https://subagent.fr/docs/pieces-jointes.md#attach_files)
- [`reply_to_thread`](https://subagent.fr/docs/reference/reply_to_thread.md)
- [`remove_attachment`](https://subagent.fr/docs/reference/remove_attachment.md)
- [`approve_message`](https://subagent.fr/docs/reference/approve_message.md)
- [`list_drafts`](https://subagent.fr/docs/reference/list_drafts.md)
- [Tous les outils](https://subagent.fr/docs/reference/index.md)
