référence
référence des outils mcp
Un serveur MCP, deux profils. Une clé agent expose 5 outils agent ; une clé admin expose 12 outils admin. Chaque outil renvoie du JSON en contenu texte.
connexion
| paramètre | valeur |
|---|---|
| point d'accès | https://mcp.nostro.ag/mcp |
| transport | Streamable HTTP, sans état (pas d'id de session), réponses JSON |
| authentification | Authorization: Bearer <key> |
| en-têtes | content-type: application/json, accept: application/json, text/event-stream |
| server | nostro v0.1.0 |
Les outils visibles dépendent de la clé : nst_ donne le profil agent, nsa_ le profil admin. Une mauvaise clé échoue au niveau HTTP avec 401 et le code JSON-RPC -32001. La configuration de Claude Code, Claude Desktop et Cursor est dans le démarrage rapide.
forme des réponses
Les résultats sont du contenu texte MCP contenant du JSON indenté. Les issues métier comme denied ou pending_approval sont des résultats normaux. Les échecs (introuvable, agent gelé, entrée invalide) reviennent avec isError: true :
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\n \"error\": \"Agent gelé par l'entreprise : aucune dépense possible\"\n}"
}
],
"isError": true
}
}get_wallet avant toute dépense, respecter chaque décision, ne jamais fractionner un montant pour contourner le mandat.outils agent
Limités à l'agent appelant : sa carte, son mandat, son activité.
get_wallet
Budget restant (jour, mois), plafonds, statut de la carte et solde disponible du compte de l'entreprise. Les agents sont invités à l'appeler avant toute dépense.
Aucun paramètre.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_wallet",
"arguments": {}
}
}{
"agent": {
"id": "agt_3f2b8d10",
"name": "demo-agent",
"status": "active"
},
"card": {
"id": "vcard_5e1d77a0c4b2",
"maskedNumber": "4970 •••• •••• 3182",
"status": "Enabled"
},
"accountAvailable": {
"value": "10000.00",
"currency": "EUR"
},
"budget": {
"currency": "EUR",
"perTxMax": 500,
"approvalAbove": 250,
"dailyRemaining": 2000,
"monthlyRemaining": 5000
},
"transfersEnabled": false
}pay
Paie un marchand avec la carte virtuelle de l'agent. Évalué d'abord contre le mandat : exécuté, bloqué ou mis en attente d'approbation humaine.
| nom | type | description | |
|---|---|---|---|
amount | number | requis | Montant en euros, > 0. Arrondi à 2 décimales, ex. 19.99. |
merchant | string | requis | Nom du marchand. Comparé à blockedMerchants. |
mcc | string | optionnel | Code catégorie marchand, exactement 4 chiffres, ex. 5734. Obligatoire si le mandat a des allowedMccs. |
description | string | optionnel | Objet de la dépense. Enregistré dans le journal d'audit. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "pay",
"arguments": {
"amount": 49,
"merchant": "Vercel",
"mcc": "5734",
"description": "Pro plan, November"
}
}
}{
"status": "paid",
"transactionId": "vtx_883b5610e2a1",
"amount": 49,
"merchant": "Vercel"
}{
"status": "pending_approval",
"requestId": "req_ef5c846c",
"reason": "Au-dessus du seuil d'approbation (250 €)",
"message": "Demande transmise à un humain de l'entreprise. Vérifie son statut avec get_request_status."
}{
"status": "denied",
"reason": "Dépasse le plafond par transaction (500 €)"
}{
"status": "declined_by_bank",
"reason": "InsufficientFunds"
}send_transfer
Envoie un virement SEPA depuis le compte de l'entreprise, uniquement si le mandat autorise les virements. Le plus souvent soumis à approbation humaine.
| nom | type | description | |
|---|---|---|---|
amount | number | requis | Montant en euros, > 0. |
iban | string | requis | IBAN du bénéficiaire. Espaces retirés ; doit respecter ^[A-Z]{2}\d{2}[A-Z0-9]{10,30}$. |
beneficiaryName | string | requis | Nom du bénéficiaire. |
label | string | optionnel | Libellé, 140 caractères max. Par défaut « Nostro <nom de l'agent> ». |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "send_transfer",
"arguments": {
"amount": 1200,
"iban": "FR7630006000011234567890189",
"beneficiaryName": "Acme SAS",
"label": "Invoice 2026-114"
}
}
}{
"status": "pending_approval",
"requestId": "req_51c0aa9e",
"reason": "Virement soumis à approbation humaine",
"message": "Demande transmise à un humain de l'entreprise. Vérifie son statut avec get_request_status."
}{
"status": "initiated",
"paymentId": "vpay_9d21c4e07a11",
"bankStatus": "Initiated"
}{
"status": "denied",
"reason": "Virements désactivés pour cet agent"
}list_my_activity
Historique propre à l'agent : chaque paiement, virement et décision (exécuté, refusé, en attente). Du plus récent au plus ancien.
| nom | type | description | |
|---|---|---|---|
limit | integer | optionnel | 1 à 100, 20 par défaut. (Le REST renvoie les 50 derniers.) |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_my_activity",
"arguments": {
"limit": 2
}
}
}[
{
"id": 7,
"workspace_id": "ws_7c1e9a42b0d3",
"agent_id": "agt_3f2b8d10",
"type": "card_payment",
"amount": 320,
"counterparty": "AWS",
"decision": "executed",
"reason": null,
"bank_ref": "vtx_acf5376d09be",
"created_at": "2026-11-05T09:20:41.560Z",
"agent_name": "demo-agent"
},
{
"id": 5,
"workspace_id": "ws_7c1e9a42b0d3",
"agent_id": "agt_3f2b8d10",
"type": "card_payment",
"amount": 900,
"counterparty": "Apple",
"decision": "denied",
"reason": "Dépasse le plafond par transaction (500 €)",
"bank_ref": null,
"created_at": "2026-11-05T09:18:02.491Z",
"agent_name": "demo-agent"
}
]get_request_status
Statut d'une dépense en attente d'approbation humaine. Un agent ne lit que ses propres demandes.
| nom | type | description | |
|---|---|---|---|
requestId | string | requis | L'identifiant req_... renvoyé par pay ou send_transfer. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_request_status",
"arguments": {
"requestId": "req_ef5c846c"
}
}
}{
"id": "req_ef5c846c",
"kind": "card_payment",
"amount": 320,
"status": "executed",
"reason": "Au-dessus du seuil d'approbation (250 €)",
"result": {
"amount": 320,
"status": "paid",
"merchant": "AWS",
"transactionId": "vtx_acf5376d09be"
},
"createdAt": "2026-11-05T09:19:33.478Z",
"decidedAt": "2026-11-05T09:20:41.561Z"
}outils admin
Limités à l'espace de la clé admin. Réservez-les aux humains, ou à un agent opérateur supervisé à qui vous confiez tout le budget.
overview
Compte, solde, nombre d'agents actifs, approbations en attente et dépenses du mois.
Aucun paramètre.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "overview",
"arguments": {}
}
}{
"workspace": {
"id": "ws_7c1e9a42b0d3",
"name": "Acme",
"kind": "sandbox",
"account_id": "vacc_2b9d01e6f3a8",
"created_at": "2026-11-05T09:12:03.870Z"
},
"bankMode": "ledger",
"account": {
"id": "vacc_2b9d01e6f3a8",
"name": "Acme",
"iban": "FR7699999481207365519024618",
"status": "Opened",
"available": {
"value": "9631.00",
"currency": "EUR"
},
"booked": {
"value": "9631.00",
"currency": "EUR"
}
},
"agents": 1,
"pendingApprovals": 0,
"monthSpend": 369,
"swanConfigured": false,
"swanUserId": null
}list_agents
Tous les agents non révoqués avec carte, mandat et dépenses en cours.
Aucun paramètre.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_agents",
"arguments": {}
}
}[
{
"id": "agt_3f2b8d10",
"name": "demo-agent",
"purpose": "Demo agent (sandbox, fake euros)",
"status": "active",
"keyPrefix": "nst_k3Jd",
"card": {
"id": "vcard_5e1d77a0c4b2",
"status": "Enabled",
"maskedNumber": "4970 •••• •••• 3182",
"consentUrl": null
},
"policy": {
"currency": "EUR",
"perTxMax": 500,
"dailyMax": 2000,
"monthlyMax": 5000,
"approvalAbove": 250,
"allowedMccs": [],
"blockedMerchants": [],
"transfersEnabled": false,
"transferApprovalAbove": 0
},
"spend": {
"today": 49,
"month": 49
},
"createdAt": "2026-11-05T09:12:04.118Z"
}
]create_agent
Crée un agent avec sa carte virtuelle au nom de l'entreprise, son mandat et sa clé API. La clé n'est renvoyée qu'une seule fois.
| nom | type | description | |
|---|---|---|---|
name | string | requis | Nom de l'agent, repris dans le libellé de la carte. |
purpose | string | optionnel | Texte libre : à quoi sert cet agent. |
perTxMax | number | optionnel | Montant maximum d'un paiement carte, en euros. Au-delà, le paiement est bloqué. |
dailyMax | number | optionnel | Dépense exécutée maximum par jour calendaire (UTC), paiements carte et virements cumulés. |
monthlyMax | number | optionnel | Budget mensuel. Également posé comme plafond de dépense sur la carte elle-même (défense en profondeur). |
approvalAbove | number | optionnel | Les paiements carte strictement au-dessus de ce montant attendent une approbation humaine au lieu d'être exécutés. |
allowedMccs | string[] | optionnel | Codes catégorie marchand (MCC, 4 chiffres) autorisés. Vide signifie toutes les catégories. |
blockedMerchants | string[] | optionnel | Marchands à bloquer. Correspondance partielle, insensible à la casse, sur le nom du marchand. |
transfersEnabled | boolean | optionnel | Autorise ou non l'agent à envoyer des virements SEPA. |
transferApprovalAbove | number | optionnel | Les virements strictement au-dessus de ce montant demandent une approbation humaine. 0 signifie que tout virement est revu. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_agent",
"arguments": {
"name": "procurement-bot",
"purpose": "Buys SaaS seats",
"perTxMax": 200,
"dailyMax": 600,
"monthlyMax": 3000,
"approvalAbove": 100,
"allowedMccs": [
"5734",
"7372"
]
}
}
}{
"agent": {
"id": "agt_91ad04c2",
"name": "procurement-bot",
"purpose": "Buys SaaS seats",
"status": "active",
"keyPrefix": "nst_Qm7v",
"card": {
"id": "vcard_0c44e1b9a7d0",
"status": "Enabled",
"maskedNumber": "4970 •••• •••• 7745",
"consentUrl": null
},
"policy": {
"currency": "EUR",
"perTxMax": 200,
"dailyMax": 600,
"monthlyMax": 3000,
"approvalAbove": 100,
"allowedMccs": [
"5734",
"7372"
],
"blockedMerchants": [],
"transfersEnabled": false,
"transferApprovalAbove": 0
},
"spend": {
"today": 0,
"month": 0
},
"createdAt": "2026-11-05T09:12:04.118Z"
},
"apiKey": "nst_Qm7v••••••••••••••••••••••••"
}update_agent_policy
Modifie le mandat d'un agent. Seuls les champs envoyés changent, le reste est conservé. Modifier monthlyMax met aussi à jour le plafond de la carte.
| nom | type | description | |
|---|---|---|---|
agentId | string | requis | L'identifiant agt_.... |
perTxMax | number | optionnel | Montant maximum d'un paiement carte, en euros. Au-delà, le paiement est bloqué. |
dailyMax | number | optionnel | Dépense exécutée maximum par jour calendaire (UTC), paiements carte et virements cumulés. |
monthlyMax | number | optionnel | Budget mensuel. Également posé comme plafond de dépense sur la carte elle-même (défense en profondeur). |
approvalAbove | number | optionnel | Les paiements carte strictement au-dessus de ce montant attendent une approbation humaine au lieu d'être exécutés. |
allowedMccs | string[] | optionnel | Codes catégorie marchand (MCC, 4 chiffres) autorisés. Vide signifie toutes les catégories. |
blockedMerchants | string[] | optionnel | Marchands à bloquer. Correspondance partielle, insensible à la casse, sur le nom du marchand. |
transfersEnabled | boolean | optionnel | Autorise ou non l'agent à envoyer des virements SEPA. |
transferApprovalAbove | number | optionnel | Les virements strictement au-dessus de ce montant demandent une approbation humaine. 0 signifie que tout virement est revu. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "update_agent_policy",
"arguments": {
"agentId": "agt_3f2b8d10",
"approvalAbove": 100,
"blockedMerchants": [
"casino",
"crypto"
]
}
}
}{
"id": "agt_3f2b8d10",
"name": "demo-agent",
"purpose": "Demo agent (sandbox, fake euros)",
"status": "active",
"keyPrefix": "nst_k3Jd",
"card": {
"id": "vcard_5e1d77a0c4b2",
"status": "Enabled",
"maskedNumber": "4970 •••• •••• 3182",
"consentUrl": null
},
"policy": {
"currency": "EUR",
"perTxMax": 500,
"dailyMax": 2000,
"monthlyMax": 5000,
"approvalAbove": 100,
"allowedMccs": [],
"blockedMerchants": [
"casino",
"crypto"
],
"transfersEnabled": false,
"transferApprovalAbove": 0
},
"spend": {
"today": 49,
"month": 49
},
"createdAt": "2026-11-05T09:12:04.118Z"
}freeze_agent
Coupe-circuit : bloque immédiatement toute dépense de l'agent. Réversible.
| nom | type | description | |
|---|---|---|---|
agentId | string | requis | L'identifiant agt_.... |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "freeze_agent",
"arguments": {
"agentId": "agt_3f2b8d10"
}
}
}{
"id": "agt_3f2b8d10",
"name": "demo-agent",
"purpose": "Demo agent (sandbox, fake euros)",
"status": "frozen",
"keyPrefix": "nst_k3Jd",
"card": {
"id": "vcard_5e1d77a0c4b2",
"status": "Enabled",
"maskedNumber": "4970 •••• •••• 3182",
"consentUrl": null
},
"policy": {
"currency": "EUR",
"perTxMax": 500,
"dailyMax": 2000,
"monthlyMax": 5000,
"approvalAbove": 250,
"allowedMccs": [],
"blockedMerchants": [],
"transfersEnabled": false,
"transferApprovalAbove": 0
},
"spend": {
"today": 49,
"month": 49
},
"createdAt": "2026-11-05T09:12:04.118Z"
}unfreeze_agent
Réactive un agent gelé.
| nom | type | description | |
|---|---|---|---|
agentId | string | requis | L'identifiant agt_.... |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "unfreeze_agent",
"arguments": {
"agentId": "agt_3f2b8d10"
}
}
}{
"id": "agt_3f2b8d10",
"name": "demo-agent",
"purpose": "Demo agent (sandbox, fake euros)",
"status": "active",
"keyPrefix": "nst_k3Jd",
"card": {
"id": "vcard_5e1d77a0c4b2",
"status": "Enabled",
"maskedNumber": "4970 •••• •••• 3182",
"consentUrl": null
},
"policy": {
"currency": "EUR",
"perTxMax": 500,
"dailyMax": 2000,
"monthlyMax": 5000,
"approvalAbove": 250,
"allowedMccs": [],
"blockedMerchants": [],
"transfersEnabled": false,
"transferApprovalAbove": 0
},
"spend": {
"today": 49,
"month": 49
},
"createdAt": "2026-11-05T09:12:04.118Z"
}revoke_agent
Révoque la clé de l'agent et annule sa carte. Irréversible.
| nom | type | description | |
|---|---|---|---|
agentId | string | requis | L'identifiant agt_.... |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "revoke_agent",
"arguments": {
"agentId": "agt_3f2b8d10"
}
}
}{
"ok": true
}list_pending_approvals
Dépenses en attente d'une décision humaine, des plus récentes aux plus anciennes (100 max).
Aucun paramètre.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_pending_approvals",
"arguments": {}
}
}[
{
"id": "req_ef5c846c",
"agent_id": "agt_3f2b8d10",
"kind": "card_payment",
"amount": 320,
"payload": {
"amount": 320,
"merchant": "AWS",
"mcc": "7372"
},
"reason": "Au-dessus du seuil d'approbation (250 €)",
"status": "pending",
"result": null,
"created_at": "2026-11-05T09:19:33.478Z",
"decided_at": null,
"agent_name": "demo-agent"
}
]approve_request
Approuve une demande en attente et l'exécute immédiatement. Une seule décision par demande, même en cas de clics simultanés.
| nom | type | description | |
|---|---|---|---|
requestId | string | requis | L'identifiant req_.... |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "approve_request",
"arguments": {
"requestId": "req_ef5c846c"
}
}
}{
"id": "req_ef5c846c",
"kind": "card_payment",
"amount": 320,
"status": "executed",
"reason": "Au-dessus du seuil d'approbation (250 €)",
"result": {
"amount": 320,
"status": "paid",
"merchant": "AWS",
"transactionId": "vtx_acf5376d09be"
},
"createdAt": "2026-11-05T09:19:33.478Z",
"decidedAt": "2026-11-05T09:20:41.561Z"
}reject_request
Refuse une demande en attente. Rien n'est débité.
| nom | type | description | |
|---|---|---|---|
requestId | string | requis | L'identifiant req_.... |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "reject_request",
"arguments": {
"requestId": "req_51c0aa9e"
}
}
}{
"id": "req_51c0aa9e",
"kind": "transfer",
"amount": 1200,
"status": "rejected",
"reason": "Virement soumis à approbation humaine",
"result": null,
"createdAt": "2026-11-05T09:22:10.002Z",
"decidedAt": "2026-11-05T09:25:47.310Z"
}fund_account
Sandbox uniquement : crédite le registre virtuel de l'espace (virement SEPA entrant simulé, euros fictifs).
| nom | type | description | |
|---|---|---|---|
amount | number | requis | Euros, > 0 et ≤ 100 000 par appel. Un solde sandbox est plafonné à 1 000 000. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "fund_account",
"arguments": {
"amount": 5000
}
}
}{
"transactionId": "vtx_c7b3a7331f0c"
}audit_log
Toutes les décisions et opérations de l'espace, des plus récentes aux plus anciennes, éventuellement pour un seul agent.
| nom | type | description | |
|---|---|---|---|
agentId | string | optionnel | Filtrer sur un agent. |
limit | integer | optionnel | 1 à 500, 100 par défaut. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "audit_log",
"arguments": {
"agentId": "agt_3f2b8d10",
"limit": 3
}
}
}[
{
"id": 7,
"workspace_id": "ws_7c1e9a42b0d3",
"agent_id": "agt_3f2b8d10",
"type": "card_payment",
"amount": 320,
"counterparty": "AWS",
"decision": "executed",
"reason": null,
"bank_ref": "vtx_acf5376d09be",
"created_at": "2026-11-05T09:20:41.560Z",
"agent_name": "demo-agent"
},
{
"id": 4,
"workspace_id": "ws_7c1e9a42b0d3",
"agent_id": "agt_3f2b8d10",
"type": "card_payment",
"amount": 320,
"counterparty": "AWS",
"decision": "pending_approval",
"reason": "Au-dessus du seuil d'approbation (250 €)",
"bank_ref": "req_ef5c846c",
"created_at": "2026-11-05T09:19:33.480Z",
"agent_name": "demo-agent"
},
{
"id": 2,
"workspace_id": "ws_7c1e9a42b0d3",
"agent_id": "agt_3f2b8d10",
"type": "agent_created",
"amount": null,
"counterparty": null,
"decision": "executed",
"reason": "Carte 4970 •••• •••• 3182 (Enabled)",
"bank_ref": "vcard_5e1d77a0c4b2",
"created_at": "2026-11-05T09:12:04.120Z",
"agent_name": "demo-agent"
}
]