Skip to main content
Glama
silamir

boondmanager-mcp-server

by silamir

Créer un(e) note de frais

boond_expenses_create

Create a monthly expense report for one resource, with expense lines, taxes, and project/delivery assignments. Call boond_expenses_default first for agency and expense-type references.

Instructions

Crée une note de frais dans BoondManager. Une note de frais = un mois (term) × une ressource, dont les lignes sont portées par actualExpenses.

Plutôt que : boond_expenses_update pour ajouter des lignes à un mois déjà ouvert — mais actualExpenses y remplace tout le tableau, ce qui efface les lignes existantes si elles ne sont pas renvoyées.

⚠️ Appeler boond_expenses_default d'abord : il fournit agencyId, currencyAgency, exchangeRateAgency, les expenseTypeReference disponibles (définis par agence, absents de boond_application_dictionary) et les couples projectId / deliveryId imputables. Sans ces valeurs l'API répond 422.

Sur une ligne, amountIncludingTax est le montant TTC et tax un taux de TVA en %. Le montant HT et le montant de TVA sont recalculés par BoondManager, ils ne se saisissent pas.

L'état de la note de frais n'est pas pilotable ici : une création part toujours en savedAndNoValidation, le passage en validation relève du workflow BoondManager.

Returns: Données de la note de frais créée avec son ID.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
termYesMois de la note de frais (YYYY-MM). Une note de frais = un mois × une ressource.
advanceNoAvance à reprendre.
agencyIdNoID de l'agence — voir `boond_expenses_default`. Déduit de la ressource si omis.
resourceIdYesID de la ressource (le collaborateur qui a engagé les frais).
actualExpensesNoLignes de frais réels. Omettre pour créer une note de frais vide.
currencyAgencyNoID de devise de l'agence (`setting.currency`).
exchangeRateAgencyNoTaux de change agence. Obligatoire côté API.
informationCommentsNoCommentaires de la note de frais.
ratePerKilometerTypeReferenceNoCode du barème kilométrique (`reference`) — voir `boond_expenses_default`.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoIdentifiant de l'entité créée/modifiée
typeNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv2.17.0
    • addedInput schema / properties / actualExpenses / items / properties / batchId / pattern
      Added value: +"^\\d+$"
    • removedInput schema / properties / actualExpenses / items / properties / deliveryId / minLength
      Removed value: -1
    • addedInput schema / properties / actualExpenses / items / properties / deliveryId / pattern
      Added value: +"^\\d+$"
    • removedInput schema / properties / actualExpenses / items / properties / projectId / minLength
      Removed value: -1
    • addedInput schema / properties / actualExpenses / items / properties / projectId / pattern
      Added value: +"^\\d+$"
    • addedInput schema / properties / agencyId / pattern
      Added value: +"^\\d+$"
    • removedInput schema / properties / resourceId / minLength
      Removed value: -1
    • addedInput schema / properties / resourceId / pattern
      Added value: +"^\\d+$"
  2. Changed19 schema fields changedv2.14.0
    • addedInput schema / properties / actualExpenses
      Added value: +{
      +  "description": "Lignes de frais réels. Omettre pour créer une note de frais vide.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "activityType": {
      +        "default": "production",
      +        "description": "Type d'activité rattachée au frais.",
      +        "enum": [
      +          "production",
      +          "internal",
      +          "absence"
      +        ],
      +        "type": "string"
      +      },
      +      "amountIncludingTax": {
      +        "description": "Montant TTC. Ignoré pour un frais kilométrique (recalculé = km × barème).",
      +        "type": "number"
      +      },
      +      "batchId": {
      +        "description": "ID du lot. Absent = aucun lot.",
      +        "type": "string"
      +      },
      +      "currency": {
      +        "default": 0,
      +        "description": "ID de devise (`setting.currency`, 0 = EUR).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "deliveryId": {
      +        "description": "ID de la prestation (delivery) à imputer. Obligatoire — voir `boond_expenses_default`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "exchangeRate": {
      +        "default": 1,
      +        "description": "Taux de change vers la devise agence.",
      +        "type": "number"
      +      },
      +      "expenseTypeReference": {
      +        "description": "Code du type de frais (`reference`), à lire via `boond_expenses_default` — les types de frais sont définis par agence et ne figurent PAS dans `boond_application_dictionary`. À omettre pour un frais kilométrique.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "file": {
      +        "description": "ID du justificatif déjà téléversé, suffixé (ex: `52979_proof`). Un fichier doit d'abord être créé via `boond_documents_create` (`parentType: 'expensesReport'`).",
      +        "type": "string"
      +      },
      +      "isKilometricExpense": {
      +        "default": false,
      +        "description": "`true` pour un frais kilométrique : renseigner `numberOfKilometers` et omettre `expenseTypeReference`.",
      +        "type": "boolean"
      +      },
      +      "numberOfKilometers": {
      +        "description": "Nombre de kilomètres (frais kilométrique uniquement).",
      +        "type": "number"
      +      },
      +      "projectId": {
      +        "description": "ID du projet à imputer. Obligatoire — les couples (projet, prestation) autorisés sont donnés par `boond_expenses_default`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "reinvoiced": {
      +        "default": false,
      +        "description": "Frais refacturable au client.",
      +        "type": "boolean"
      +      },
      +      "startDate": {
      +        "description": "Date du frais (YYYY-MM-DD). Doit tomber dans le mois `term` de la note de frais.",
      +        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +        "type": "string"
      +      },
      +      "tax": {
      +        "description": "Taux de TVA en % (ex: 20 pour 20 %) — un taux, pas un montant. Défaut API: 0.",
      +        "type": "number"
      +      },
      +      "title": {
      +        "description": "Description libre de la ligne (marchand, motif, invités...).",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "startDate",
      +      "projectId",
      +      "deliveryId"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / advance
      Added value: +{
      +  "description": "Avance à reprendre.",
      +  "type": "number"
      +}
    • addedInput schema / properties / agencyId
      Added value: +{
      +  "description": "ID de l'agence — voir `boond_expenses_default`. Déduit de la ressource si omis.",
      +  "type": "string"
      +}
    • removedInput schema / properties / amount
      Removed value: -{
      -  "description": "Montant du frais",
      -  "type": "number"
      -}
    • removedInput schema / properties / currency
      Removed value: -{
      -  "description": "Devise (EUR, USD...)",
      -  "type": "string"
      -}
    • addedInput schema / properties / currencyAgency
      Added value: +{
      +  "description": "ID de devise de l'agence (`setting.currency`).",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • addedInput schema / properties / exchangeRateAgency / default
      Added value: +1
    • changedInput schema / properties / exchangeRateAgency / description
      Previous value: -"Taux de change agence"New value: +"Taux de change agence. Obligatoire côté API."
    • removedInput schema / properties / expenseDate
      Removed value: -{
      -  "description": "Date du frais (YYYY-MM-DD)",
      -  "minLength": 1,
      -  "type": "string"
      -}
    • addedInput schema / properties / informationComments
      Added value: +{
      +  "description": "Commentaires de la note de frais.",
      +  "type": "string"
      +}
    • removedInput schema / properties / note
      Removed value: -{
      -  "description": "Description / justification",
      -  "type": "string"
      -}
    • removedInput schema / properties / projectId
      Removed value: -{
      -  "description": "ID du projet associé",
      -  "type": "string"
      -}
    • addedInput schema / properties / ratePerKilometerTypeReference
      Added value: +{
      +  "description": "Code du barème kilométrique (`reference`) — voir `boond_expenses_default`.",
      +  "maximum": 9007199254740991,
      +  "minimum": -9007199254740991,
      +  "type": "integer"
      +}
    • changedInput schema / properties / resourceId / description
      Previous value: -"ID de la ressource"New value: +"ID de la ressource (le collaborateur qui a engagé les frais)."
    • removedInput schema / properties / state
      Removed value: -{
      -  "description": "État de la note de frais",
      -  "maximum": 9007199254740991,
      -  "minimum": -9007199254740991,
      -  "type": "integer"
      -}
    • changedInput schema / properties / term / description
      Previous value: -"Période de la note de frais (YYYY-MM)"New value: +"Mois de la note de frais (YYYY-MM). Une note de frais = un mois × une ressource."
    • addedInput schema / properties / term / pattern
      Added value: +"^\\d{4}-\\d{2}$"
    • removedInput schema / properties / typeOf
      Removed value: -{
      -  "description": "Type de frais (transport, repas, hébergement...)",
      -  "type": "string"
      -}
    • changedInput schema / required
      Previous value: -[
      -  "resourceId",
      -  "expenseDate",
      -  "amount"
      -]New value: +[
      +  "resourceId",
      +  "term"
      +]
  3. Changed2 schema fields changedv2.12.2
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedOutput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
  4. Changed2 schema fields changedv2.8.0
    • addedInput schema / properties / exchangeRateAgency
      Added value: +{
      +  "description": "Taux de change agence",
      +  "type": "number"
      +}
    • addedInput schema / properties / term
      Added value: +{
      +  "description": "Période de la note de frais (YYYY-MM)",
      +  "type": "string"
      +}
  5. Changed1 schema field changedv2.7.0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "id": {
      +      "description": "Identifiant de l'entité créée/modifiée",
      +      "type": "string"
      +    },
      +    "type": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  6. First observedv2.1.0

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are all false (readOnlyHint=false, idempotentHint=false, etc.), so they convey only that this is a non-read-only, non-idempotent mutation. The description carries the burden and does it well: it discloses that a creation always starts as 'savedAndNoValidation', that the validation state is not controllable, that HT and VAT amounts are recalculated by BoondManager, and that missing dependency values cause a 422. These are concrete behavioral traits beyond the sparse annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: the core model, the sibling contrast, the prerequisite call, the tax semantics, the workflow state, and the return value. The structure is front-loaded with the most important concept (month × resource) and uses formatting like bold and a warning emoji to highlight critical instructions. It is appropriately sized for a complex nested tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 top-level params, nested actualExpenses array), the description is complete: it covers the data model, the mandatory defaults call, line-level tax behavior, the non-controllable state, and the return format. Details of individual fields are left to the fully-covered input schema, and the output schema accounts for return values. There are no critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning: it links agencyId, currencyAgency, exchangeRateAgency, expenseTypeReference, and projectId/deliveryId to the boond_expenses_default prerequisite. It also clarifies that amountIncludingTax is TTC and tax is a percentage rate, and that HT/VAT are not entered because they are recalculated. This goes well beyond the schema fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Crée une note de frais dans BoondManager' and immediately defines the model as 'un mois × une ressource'. It also differentiates from the sibling boond_expenses_update by explicitly saying 'Plutôt que : boond_expenses_update pour ajouter des lignes à un mois déjà ouvert', so an agent can distinguish it from other expense tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when/when-not guidance: it contrasts this create tool with boond_expenses_update for adding lines to an already-open month, and warns about the replace semantics of actualExpenses. It also states a hard prerequisite: 'Appeler boond_expenses_default d'abord' and explains that omitting those values triggers a 422 response. This leaves no ambiguity about when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools