API/API des outils

API des outils

Découvrez et exécutez les outils d’une organisation depuis un registre unifié.

Chaque outil est déclaré une seule fois dans convex/tools/definitions/, puis exposé par l’API REST, le serveur MCP et la CLI pnpm tools. Son ajout au registre le publie sur les trois interfaces.

Points d’entrée

GET  /api/v1/tools
GET  /api/v1/tools/:name
POST /api/v1/tools/:name
Point d’entréeDescription
GET /api/v1/toolsListe les outils et leurs schémas JSON
GET /api/v1/tools/:nameRenvoie le schéma JSON d’un outil
POST /api/v1/tools/:nameExécute un outil avec un corps JSON

Authentification

Créez une clé API depuis les paramètres de l’organisation :

/orgs/{orgSlug}/settings/api-keys

Envoyez-la avec x-api-key ou comme jeton Bearer :

x-api-key: YOUR_API_KEY
Authorization: Bearer YOUR_API_KEY

La clé identifie l’organisation : aucun identifiant d’organisation ne doit figurer dans l’entrée d’un outil.

Un jeton OAuth fourni à un client MCP est envoyé de la même façon. Le préfixe nsk_ identifie les clés API ; les autres valeurs sont vérifiées comme des jetons OAuth. Les deux passent par les mêmes handlers.

Outils disponibles

OutilCatégorieAccèsEntréeRésultat
get_organizationorganizationreadaucuneIdentifiant, nom et slug
list_membersmembersread{ cursor?, limit? }{ members, count, nextCursor, hasMore }
get_membermembersread{ memberId }Un membre
get_subscriptionbillingreadaucuneOffre, statut, sièges et limites

Réponse de découverte

GET /api/v1/tools renvoie un schéma JSON par outil, prêt pour un LLM ou un générateur de client :

{
  "total": 4,
  "tools": [
    {
      "name": "get_member",
      "description": "Récupère un membre de l’organisation par son identifiant.",
      "category": "members",
      "access": "read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "memberId": { "type": "string", "minLength": 1 }
        },
        "required": ["memberId"]
      },
      "endpoint": "/api/v1/tools/get_member",
      "method": "POST",
      "route": { "method": "GET", "path": "/api/v1/members/:memberId" }
    }
  ]
}

route contient l’alias REST, ou null si l’outil répond uniquement sur /api/v1/tools/<name>. Les deux chemins exécutent le même outil ; l’alias renvoie le contenu sans l’enveloppe data. Consultez Outils unifiés pour en déclarer un.

Réponse d’exécution

Une exécution réussie renvoie le résultat dans data :

{
  "data": {
    "members": [{ "id": "mem_123", "role": "owner" }],
    "count": 1,
    "nextCursor": null,
    "hasMore": false
  }
}

CLI

export NOWSTACK_API_KEY="YOUR_API_KEY"
pnpm tools list
pnpm tools run get_member '{"memberId":"mem_123"}'

MCP

Le serveur MCP est disponible sur /api/mcp et sert le même registre. Utilisez la même clé API d’organisation :

{
  "mcpServers": {
    "nowstack": {
      "url": "https://ndd-seo.fr/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

OAuth pour MCP

Les clients qui ne peuvent pas stocker une clé API utilisent OAuth. Dirigez-les vers /api/mcp sans identifiants pour lancer la découverte :

  1. La requête anonyme répond 401 avec un en-tête WWW-Authenticate.
  2. Le document de découverte indique le serveur d’autorisation /api/auth.
  3. Le client s’enregistre, puis ouvre la connexion, le choix de l’organisation et le consentement.
  4. Le JWT émis contient l’organization_id choisi et reste limité à cette organisation.
PortéeAutorisations
nowstack.readOutils read et points de découverte
nowstack.writeRequis en plus pour les outils write

Seuls les propriétaires et administrateurs peuvent autoriser une connexion. Sans nowstack.write, un outil d’écriture répond 403.

Les jetons ont une durée de vie courte. À leur expiration, le client relance le parcours d’autorisation afin de vérifier à nouveau le rôle et le consentement.

Erreurs

StatutDescription
400Corps JSON non valide ou entrée rejetée par le schéma
401Clé ou jeton absent, non valide ou expiré
403Portée insuffisante
404Outil ou ressource introuvable
413Corps de requête supérieur à 256 Ko
500Erreur interne du serveur
API d’un membre de l’organisationComposants d’authentification