# Depuis un script

> Appelle le serveur MCP sans agent, avec curl et une clé d'API. Sans état, en POST, en SSE ou en JSON simple.

Pour un script, l'[API REST](https://docs.rustine.io/api/projects/list.md) est plus simple. Mais tu peux aussi parler au serveur MCP directement, par exemple pour tester ta clé ou reproduire ce que voit ton agent.

## La poignée de main

Le serveur est **sans état** : pas d'`initialize`, pas d'en-tête de session. Chaque requête est un `POST` sur `https://mcp.rustine.io` avec :

- `Authorization: Bearer rst_...` ;
- `Content-Type: application/json` ;
- `Accept: application/json, text/event-stream` (sinon `406`).

Sans en-tête `MCP-Protocol-Version`, la réponse arrive en SSE : une ligne `event: message`, puis `data: {…}` avec la réponse JSON-RPC.

## En JSON simple

Avec la révision `2026-07-28` du protocole, la réponse est du JSON simple. Ajoute les en-têtes `MCP-Protocol-Version`, `Mcp-Method` et `Mcp-Name`, et les clés `_meta` dans `params` :

```bash
curl -s https://mcp.rustine.io \
  -H "Authorization: Bearer $RUSTINE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -H "Mcp-Method: tools/call" \
  -H "Mcp-Name: list_projects" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_projects","arguments":{},"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientInfo":{"name":"mon-script","version":"1.0.0"},"io.modelcontextprotocol/clientCapabilities":{}}}}'
```

## Les réponses à connaître

- **401** `invalid_token` avec un en-tête `WWW-Authenticate` : clé absente, révoquée ou mal écrite.
- **406** : il manque `text/event-stream` ou `application/json` dans `Accept`.
- **Quota épuisé ou offre sans MCP** : jamais un `403`. La réponse est un résultat d'outil avec `isError: true` et un texte lisible, avec le lien pour changer d'offre.
- **Débit** : 120 requêtes par minute et par clé, comme l'API.

Les paramètres de chaque outil : [Les outils](https://docs.rustine.io/mcp/tools.md).

## Exemples

### tools/list

```bash
curl -s https://mcp.rustine.io \
  -H "Authorization: Bearer $RUSTINE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

### list_projects

```bash
curl -s https://mcp.rustine.io \
  -H "Authorization: Bearer $RUSTINE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_projects","arguments":{}}}'
```

### Réponse : 200 OK

```text
event: message
data: {"result":{"content":[{"type":"text","text":"…"}]},"jsonrpc":"2.0","id":1}
```
