BoondManager MCP Server

io.github.silamir由 GitHub 账号 silamir 发布v2.19.3更新于 Nov 14, 2026

MCP Server for BoondManager API - 185 tools, 13 prompts, 22 resources (ERP/CRM)

概览

AI 生成的概览

连接 BoondManager ERP/CRM API 的 MCP 服务器,让助手搜索、读取、创建、更新和删除候选人、顾问、联系人、公司、商机、项目及财务数据。

可以做什么
  • 搜索并读取候选人、内部资源和客户联系人,包括信息、技术档案、行政数据、活动、定位、项目、工时表、报销与休假申请、合同和福利等分栏
  • 创建、更新和删除候选人、资源和联系人,并编辑其技术档案与行政信息
  • 通过更完整的工具集处理公司、商机、项目、工时表、发票和采购
  • 浏览用户、机构、业务单元、角色、日历、Webhook、审计日志和文档等管理与配置数据
  • 运行预置提示词处理常见流程,如团队概览、销售管道、待催收发票、人员可用性、任务结束预警和简历时效审计
适用场景
适合需要让助手在招聘、人员调配、销售或财务场景中操作 BoondManager 实例时使用:查询人员和公司、准备候选人名单、查看顾问可用性或更新记录。面向已在使用 BoondManager、希望以对话方式访问其 ERP/CRM 数据的团队。
运行要求
以 stdio 方式在本地运行,通常通过 npx 或打包的桌面扩展安装,需要 Node.js。需要 BoondManager 账号和凭据:BOOND_API_TOKEN 中的 JWT API 令牌、用户令牌加客户端令牌与客户端密钥的组合,或 BOOND_USER 与 BOOND_PASSWORD 的登录密码。可用 BOOND_BASE_URL 指定自定义实例地址,并需要访问 BoondManager API 的网络连接。
安装前请注意
服务器可以写入并永久删除记录:创建、更新和删除工具会作用于真实数据,删除不可恢复,建议通过 BOOND_MCP_* 访问控制变量限制业务域或启用只读模式。BOOND_API_TOKEN、BOOND_PASSWORD、BOOND_CLIENT_KEY 及 SharePoint 客户端密钥等凭据属于敏感信息,应妥善保管。本地文件上传仅限 BOOND_MCP_UPLOAD_DIRS 中列出的目录,且其中任何文件都可能被发送到 BoondManager。可选的 SharePoint 中转会把附件经第三方服务传输。

安装

在 SourceWeft 中

  1. 打开 控制台中的 BoondManager MCP Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

[Silamir]

BoondManager MCP Server

Un projet open source Silamir.

[CI] [CodeQL] [Maintainability] [Code Coverage] [npm version] [npm downloads] [Node.js] [TypeScript] [MCP Registry] [Docker Hub] [GHCR] [License: Apache 2.0]

Installation 1-clic :

[Add to Cursor] [Install in VS Code] [Install in VS Code Insiders]

[Glama]

LM Studio, Goose et Gemini CLI s'installent via leur procédure dédiée (deeplink natif ou commande) — voir la section Installation. GitHub ne rend pas cliquables les liens à schéma non-HTTP (lmstudio://, goose://), c'est pourquoi ils n'ont pas de bouton 1-clic ici.

Serveur MCP (Model Context Protocol) pour l'API BoondManager, permettant a Claude (Desktop, Cowork, Code) de rechercher, consulter, creer et modifier des enregistrements dans votre instance BoondManager.

238 outils couvrant 42 domaines de l'API BoondManager. Voir TOOLS.md pour le catalogue auto-généré (outils + prompts + ressources).

Sorties structurées. En plus du texte lisible, les outils search, create, update et delete renvoient un structuredContent conforme à un outputSchema MCP : search → { total?, count, items[] } (résumés compacts, pas les ressources JSON:API complètes), create/update → { id?, type? }, delete → { id, deleted, reason? }. Les clients MCP qui exploitent les sorties structurées obtiennent une référence d'entité fiable pour chaîner les appels. Les outils get restent en texte seul (leur texte est déjà du JSON exploitable).

Sommaire

Domaines couverts

CRM & Commercial

DomaineOutilsOperations
Candidats10CRUD + information, technical-data, administrative, actions, positionings
Ressources20CRUD + information, technical-data (+ update), administrative, advantages, actions, positionings, projects, times-reports, expenses-reports, absences-reports, timesheets, references (create/update/delete)
Contacts11CRUD + information, actions, opportunities, projects, orders, invoices
Societes14CRUD + information, contacts, actions, opportunities, projects, orders, invoices, purchases, provider-invoices
Opportunites10CRUD + information, actions, positionings, projects, simulation

Gestion de projets

DomaineOutilsOperations
Projets12CRUD + information, actions, simulation, deliveries-groupments, orders, purchases, productivity
Positionnements4search, get, create, delete
Livraisons / CRA2search, get
Achats / Sous-traitance4search, get, create, delete

Facturation & Finance

DomaineOutilsOperations
Factures client5CRUD complet
Factures fournisseur2search, get
Bons de commande5CRUD complet
Paiements2search, get
Notes de frais5CRUD complet
Produits5CRUD complet

RH & Temps

DomaineOutilsOperations
Absences5CRUD complet
Planning absences1search (vue globale)
Feuilles de temps3search, get, resource timesheets
Contrats2get, create
Avantages2search, get

Suivi d'activite

DomaineOutilsOperations
Actions5search, get, create, update, delete
Validations2search, get
Todolists2search, get

Reporting

DomaineOutilsOperations
Reporting societes1search
Reporting projets1search
Reporting ressources1search
Reporting synthese1search
Reporting plans de production1search

Administration & Configuration

DomaineOutilsOperations
Comptes utilisateurs2search, get
Agences2search, get
Business Units2search, get
Poles2search, get
Roles2search, get
Calendriers2search, get
Drapeaux / Etiquettes2search, get
Webhooks2search, get
Logs d'audit2search, get
Notifications2search, get
Fils de discussion2search, get
Documents / CV4get (telechargement), create (upload par URL, fichier local, slot de relais ou base64 + parsing CV), upload_slot (relais SharePoint), delete
Application2dictionnaire, utilisateur courant

Detail des onglets par entite

Les entites principales disposent d'outils dedies par onglet pour un acces cible :

EntiteOnglets disponibles
Candidatsinformation, technical-data, administrative, actions, positionings
Ressourcesinformation, technical-data, administrative, advantages, actions, positionings, projects, times-reports, expenses-reports, absences-reports
Contactsinformation, actions, opportunities, projects, orders, invoices
Societesinformation, contacts, actions, opportunities, projects, orders, invoices, purchases, provider-invoices
Opportunitesinformation, actions, positionings, projects, simulation
Projetsinformation, actions, simulation, deliveries-groupments, orders, purchases, productivity

Ressources MCP (dictionnaires)

Le serveur expose les dictionnaires de reference Boond comme ressources MCP (clients qui en supportent l'affichage : Claude Desktop, MCP Inspector, etc.). Permet au modele de traduire un state ou typeOf entier en libelle sans appel d'outil supplementaire.

URIContenu
boond://application/current-userProfil de l'utilisateur courant (id, agence, permissions)
boond://dictionary/states/{entity}Etats par entite : resources, candidates, contacts, companies, opportunities, projects, invoices, orders, positionings, deliveries, payments, purchases, provider-invoices, products, quotations, probations
boond://dictionary/typeOf/{entity}Types par entite : resources, contacts, projects, contracts, deliveries, purchases, activities
boond://dictionary/actions/{entity}Types d'action par entite de rattachement : candidates, contacts, resources, opportunities, projects, invoices, orders (le typeOf de boond_actions_create)
boond://dictionary/{sources,origins}Sources de candidature, origines d'opportunite
boond://dictionary/{paymentMethods,paymentTerms,taxRates,contractEndReasons}Parametres finance / RH utilises par les ecritures
boond://application/current-user/rightsNiveau, agences / poles / BU, apps et droits par entite de l'utilisateur (vue condensee de current-user)
boond://dictionary/countriesListe des pays
boond://dictionary/currenciesListe des devises
boond://dictionary/languagesListe des langues

Pour les dictionnaires hors de cette liste curee, l'outil boond_application_dictionary reste disponible.

Prompts pre-orchestres

En plus des outils, le serveur expose des prompts MCP (templates pre-cables) qui orchestrent les bons appels d'outils dans le bon ordre pour les workflows recurrents. Visibles dans les clients qui supportent les prompts (Claude Desktop, Cowork, Claude Code, MCP Inspector...) sous forme de slash-commands ou de menu.

Workflows transverses

PromptUsage
synthese_equipeEtat d'une equipe : qui fait quoi, qui est absent, qui est dispo (par defaut : mon equipe).
pipeline_commercialOpportunites avec closing dans une periode : repartition par etat, CA pondere, top 10.
factures_a_relancerFactures impayees dont l'echeance est depassee, regroupees par societe.
candidats_pour_opportuniteA partir d'une opportunite, propose les candidats actifs qui matchent (outils, expertise, mobilite, dispo).
fiche_consultantVue 360 d'une ressource : info + technique + positionnements + absences + CRA recents.
recap_hebdoRecap hebdomadaire : pipeline qui a bouge, equipe absente, projets actifs, actions a mener.
traiter_note_de_fraisA partir d'une photo/PDF de justificatif joint, extrait la depense et cree la ligne de frais dans Boond apres recapitulatif et validation explicite.

Ressources, competences & CV

PromptUsage
staffing_disponibleConsultants internes disponibles sur une fenetre donnee (filtre optionnel par competences libres et perimetre), tries par dispo croissante avec top 3 prioritaires.
fin_de_missionAnticipation des fins de mission sous N jours (defaut 60). Marque en urgent les fins <= 15j sans relais identifie.
cartographie_competencesCartographie des competences d'un perimetre (equipe / agence) : top N, competences rares (bus-factor), saturees, manquantes vs opportunites ouvertes.
cvs_a_mettre_a_jourAudit fraicheur des CV / dossiers techniques (seuil d'obsolescence configurable). Priorise les ressources bientot sur le marche.
recherche_profil_competencesRecherche multi-source (ressources internes + candidats) par mix de competences libres, sans opportunite requise. Classe par adequation /10.

Comment invoquer un prompt

Les prompts MCP sont des modeles de message utilisateur : tu les invoques toi-meme, le LLM execute ensuite le runbook qu'ils contiennent. Aucun filtre BoondManager a connaitre — tout est embarque cote serveur.

Claude Desktop / Cowork / MCP Inspector : tape / dans la barre de saisie, choisis le prompt dans la liste, remplis les arguments dans le formulaire qui s'affiche, valide.

Claude Code : pareil, / puis selection ; les arguments sont demandes inline.

Fallback (clients sans UI dediee aux prompts) : cite le prompt par son nom dans une demande libre, le client va recuperer la definition via le protocole MCP. Exemple : "lance le runbook staffing_disponible entre le 1er juin et le 1er septembre 2026, competences Java Spring AWS".

Exemples d'invocation des prompts ressources / competences / CV :

/staffing_disponible  start_date  = 2026-06-01  end_date    = 2026-09-01  competences = Java Spring AWS Kubernetes  manager_id  = (vide -> mon equipe)
/fin_de_mission  horizon_jours = 30
/cartographie_competences  agency_id = 7  top_n     = 15
/cvs_a_mettre_a_jour  seuil_mois = 6
/recherche_profil_competences  competences        = .NET Azure DevOps  experience_min     = 5 ans  dispo_avant        = 2026-07-15  inclure_candidats  = oui

Apres modification de la config Claude (claude_desktop_config.json etc.), redemarrer le client : la liste des prompts MCP n'est pas hot-reloadee.

Prerequis

  • Node.js >= 22
  • Un compte BoondManager avec acces API active
  • L'option "Allow API Rest calls using BasicAuth authentication" activee dans la configuration BoondManager (si BasicAuth)

Installation

Claude Desktop (one-click)

Telechargez le fichier .mcpb depuis la derniere release GitHub, puis dans Claude Desktop : Fichier > Installer une extension... et selectionnez le fichier. Les identifiants sont demandes a l'installation et stockes de maniere chiffree (Keychain macOS / Credential Manager Windows).

Claude Code (plugin, recommande)

Meme confort que le one-click Desktop : un formulaire de configuration, aucune variable d'environnement a poser soi-meme.

/plugin marketplace add silamir/boondmanager-mcp-server/plugin install boondmanager-mcp@boondmanager

Claude Code affiche alors le formulaire des 14 options (identifiants, URL de base, restrictions d'acces). Tout est optionnel a l'ecran, mais il faut renseigner un des trois modes d'authentification : le trio User Token + Client Token + Client Key (JWT genere automatiquement, recommande), ou le Token JWT pre-construit, ou le couple Utilisateur + Mot de passe (BasicAuth). Les champs laisses vides retombent sur les valeurs par defaut.

Si le serveur n'apparait pas immediatement dans /mcp, un /reload-plugins suffit — inutile de relancer Claude Code.

Details utiles :

  • Ou vont les secrets : les 5 champs sensibles (User Token, Client Token, Client Key, Token JWT, Mot de passe) vont dans le Keychain macOS (ou ~/.claude/.credentials.json a defaut), pas dans settings.json. Les options non sensibles (URL, restrictions) sont stockees en clair dans pluginConfigs de votre ~/.claude/settings.json.
  • Nommage des outils : cote client les outils sont prefixes mcp__boondmanager__, par exemple mcp__boondmanager__boond_candidates_search. C'est ce nom qu'il faut utiliser dans une allow-list de permissions.
  • Version : le plugin lance la version npm epinglee dans son manifeste. Pour passer a une nouvelle release : /plugin marketplace update boondmanager puis reinstaller le plugin.
  • Restreindre la surface : les champs Restriction du formulaire mappent sur les variables BOOND_MCP_* (profil metier, domaines, operations, lecture seule). Voir docs/access-control.md.
  • Suppressions : Claude Code supporte l'elicitation MCP, donc chaque boond_*_delete demande une confirmation avant d'agir (option Confirmer les suppressions, activee par defaut).

Pour desinstaller : /plugin uninstall boondmanager-mcp@boondmanager.

Claude Code (manuel, claude mcp add)

A privilegier si vous voulez piloter vous-meme les variables d'environnement, ou epingler une version differente de celle du plugin.

bash
# Avec un token API (recommande)claude mcp add --transport stdio --env BOOND_API_TOKEN=votre_token_jwt \  boondmanager -- npx -y boondmanager-mcp-server
# Avec BasicAuthclaude mcp add --transport stdio \  --env BOOND_USER=votre_login \  --env BOOND_PASSWORD=votre_mot_de_passe \  boondmanager -- npx -y boondmanager-mcp-server

Windows : ajoutez cmd /c avant npx :

bash
claude mcp add --transport stdio --env BOOND_API_TOKEN=votre_token \  boondmanager -- cmd /c npx -y boondmanager-mcp-server

Pour rendre le serveur disponible dans tous vos projets, ajoutez --scope user :

bash
claude mcp add --transport stdio --scope user \  --env BOOND_API_TOKEN=votre_token_jwt \  boondmanager -- npx -y boondmanager-mcp-server

Claude Code - Configuration partagee en equipe

Ajoutez un fichier .mcp.json a la racine de votre projet (a commiter dans git) :

json
{  "mcpServers": {    "boondmanager": {      "type": "stdio",      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "${BOOND_API_TOKEN}"      }    }  }}

Chaque membre de l'equipe n'a qu'a definir la variable d'environnement BOOND_API_TOKEN sur sa machine. Le fichier .mcp.json supporte la syntaxe ${VAR} et ${VAR:-default} pour les variables d'environnement.

Claude Code Enterprise (deploiement administre)

Les administrateurs peuvent deployer le serveur MCP pour tous les utilisateurs via le fichier managed-mcp.json :

OSChemin
macOS/Library/Application Support/ClaudeCode/managed-mcp.json
Linux / WSL/etc/claude-code/managed-mcp.json
WindowsC:\Program Files\ClaudeCode\managed-mcp.json
json
{  "mcpServers": {    "boondmanager": {      "type": "stdio",      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "${BOOND_API_TOKEN}",        "BOOND_BASE_URL": "https://votre-instance.boondmanager.com/api"      }    }  }}

Ce fichier prend le controle exclusif des serveurs MCP : les utilisateurs ne peuvent pas ajouter ou modifier de serveurs en dehors de cette configuration.

Pour restreindre les serveurs autorises tout en laissant les utilisateurs en ajouter, utilisez plutot managed-settings.json :

json
{  "allowedMcpServers": [    { "serverName": "boondmanager" }  ]}

Claude Desktop / Cowork (configuration manuelle)

Ajoutez dans votre fichier de configuration Claude :

macOS : ~/Library/Application Support/Claude/claude_desktop_config.json Windows : %APPDATA%\Claude\claude_desktop_config.json

json
{  "mcpServers": {    "boondmanager": {      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "votre_token_jwt"      }    }  }}

Via npm

bash
npx boondmanager-mcp-server

Ou installation globale :

bash
npm install -g boondmanager-mcp-serverboondmanager-mcp-server

Depuis les sources

bash
git clone https://github.com/silamir/boondmanager-mcp-server.gitcd boondmanager-mcp-servernpm installnpm run build

Smithery

Le serveur est aussi disponible sur Smithery. La configuration est dans smithery.yaml à la racine du repo : Smithery propose une UI avec les champs d'authentification (JWT auto / JWT pré-construit / BasicAuth) et installe le serveur via npx.

LobeChat / LobeHub

Le serveur est listé sur le marketplace MCP de LobeHub. Dans LobeChat (auto-hebergé ou cloud), ajouter le MCP via Reglages > Plugins > MCP > Ajouter avec :

json
{  "name": "boondmanager",  "command": "npx",  "args": ["-y", "boondmanager-mcp-server"],  "env": {    "BOOND_USER_TOKEN": "<votre_user_token>",    "BOOND_CLIENT_TOKEN": "<votre_client_token>",    "BOOND_CLIENT_KEY": "<votre_client_key>"  }}

Ou utiliser le transport HTTP (voir section Transports) pour un deploiement partage en mode gateway.

Cursor

Cliquez sur le badge Add to Cursor en haut du README (ou ajoutez le serveur manuellement dans Settings > MCP > Add new MCP server). Renseignez ensuite l'authentification en ajoutant un bloc env au serveur dans ~/.cursor/mcp.json :

json
{  "mcpServers": {    "boondmanager": {      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "votre_token_jwt"      }    }  }}

VS Code (GitHub Copilot / agent MCP)

Cliquez sur le badge Install in VS Code en haut du README, ou ajoutez le serveur a .vscode/mcp.json (par projet) ou a votre settings.json utilisateur :

json
{  "servers": {    "boondmanager": {      "type": "stdio",      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "${input:boond_api_token}"      }    }  }}

LM Studio

Dans LM Studio : Program > Install > Edit mcp.json et ajoutez :

json
{  "mcpServers": {    "boondmanager": {      "command": "npx",      "args": ["-y", "boondmanager-mcp-server"],      "env": {        "BOOND_API_TOKEN": "votre_token_jwt"      }    }  }}

Goose

Ajoutez une extension de type STDIO dans Settings > Extensions > Add avec la commande npx -y boondmanager-mcp-server et la variable d'environnement BOOND_API_TOKEN. En CLI :

bash
goose session --with-extension "npx -y boondmanager-mcp-server"

Gemini CLI

Le depot embarque un manifeste d'extension Gemini CLI (gemini-extension.json). Installez l'extension directement depuis GitHub :

bash
gemini extensions install https://github.com/silamir/boondmanager-mcp-server

Definissez ensuite l'authentification dans votre environnement (Gemini interpole ${VAR} au demarrage) :

bash
export BOOND_API_TOKEN="votre_token_jwt"# ou le trio JWT auto :export BOOND_USER_TOKEN="..." BOOND_CLIENT_TOKEN="..." BOOND_CLIENT_KEY="..."

Configuration

Logs

Le serveur utilise pino pour des logs structures JSON (agrégateurs, observabilité).

VariableDéfautDescription
LOG_LEVELinfoNiveau de log : trace, debug, info, warn, error, fatal
LOG_FORMAT(auto)json pour JSON pur, sinon pino-pretty en dev

En production (NODE_ENV=production), les logs sont en JSON par défaut. En dev, le format pretty (colorisé) est actif sauf si LOG_FORMAT=json. Chaque requête HTTP reçoit un corrId (8 hex) pour tracer la requête dans les logs.

Les logs sont toujours écrits sur stderr, quel que soit le transport : en mode stdio, stdout est réservé au flux JSON-RPC et toute autre écriture corrompt la connexion côté client. Claude Desktop capture stderr dans son visualiseur de logs (Developer → Logs), c'est donc là que les avertissements (politique d'accès, mise à jour disponible, dictionnaires) sont visibles.

Authentification

Option 1 : Token API JWT (recommande)

bash
export BOOND_API_TOKEN="votre_token_jwt"

Option 2 : BasicAuth

bash
export BOOND_USER="votre_login"export BOOND_PASSWORD="votre_mot_de_passe"

Transport HTTP en authentification statique (BOOND_HTTP_STATIC_AUTH)

Par défaut, le transport HTTP (MCP_TRANSPORT=http) est une ressource protégée OAuth2 : chaque requête MCP porte le token BoondManager de son utilisateur (voir docs/oauth.md). BOOND_HTTP_STATIC_AUTH=true remplace ce modèle par les credentials d'environnement ci-dessus, partagés par toutes les requêtes — pour un déploiement mono-locataire auto-hébergé, un pipeline CI ou une passerelle interne sans flux OAuth.

Dans ce mode, plus rien n'authentifie le client MCP : quiconque atteint le port agit avec les droits BoondManager de l'opérateur (lecture et écriture selon la politique d'accès). D'où :

VariableRôle
MCP_HTTP_API_KEYSecret partagé que le client doit présenter, en Authorization: Bearer <clé> ou X-Api-Key: <clé>. Comparaison en temps constant ; absente ou fausse → 401. Obligatoire dès que le serveur n'écoute pas sur loopback (0.0.0.0, image Docker) : sinon il refuse de démarrer.
MCP_HTTP_INSECURE_STATIC_AUTH1 pour accepter explicitement de démarrer sans clé hors loopback (réseau privé faisant office de frontière). Le nom dit ce qu'il fait.
bash
export MCP_TRANSPORT=httpexport MCP_HTTP_HOST=0.0.0.0export BOOND_HTTP_STATIC_AUTH=trueexport MCP_HTTP_API_KEY="$(openssl rand -hex 32)"export BOOND_USER_TOKEN=… BOOND_CLIENT_TOKEN=… BOOND_CLIENT_KEY=…npx boondmanager-mcp-server# côté client : Authorization: Bearer <MCP_HTTP_API_KEY>

/healthz reste accessible sans clé. En mode OAuth (défaut), MCP_HTTP_API_KEY est ignorée avec un avertissement : le Bearer y est le token BoondManager.

URL personnalisee (si instance dediee)

bash
export BOOND_BASE_URL="https://votre-instance.boondmanager.com/api"

Par defaut, l'URL est https://ui.boondmanager.com/api.

Delai d'expiration HTTP

Chaque requete vers l'API BoondManager expire au bout de 30 secondes par defaut. Pour les tenants lents ou des rapports volumineux, augmenter via :

bash
export BOOND_HTTP_TIMEOUT_MS=60000   # 60 s

Si une requete depasse le delai, le serveur renvoie une erreur explicite mentionnant BOOND_HTTP_TIMEOUT_MS plutot que de rester bloque indefiniment.

Tentatives en cas d'echec transitoire

Le client HTTP retente automatiquement les erreurs transitoires avec un backoff exponentiel + jitter :

  • GET : retry sur 5xx, 429, erreurs reseau (ECONNRESET, etc.) et timeouts (GET etant idempotent).
  • POST / PUT / PATCH / DELETE : retry uniquement sur 429 afin d'eviter de dupliquer une ecriture cote serveur. Les 5xx et erreurs reseau remontent immediatement.
  • L'en-tete Retry-After (en secondes ou en HTTP-date) est honore et plafonne a BOOND_HTTP_RETRY_MAX_MS.
VariableDefautDescription
BOOND_HTTP_MAX_RETRIES2Nombre maximal de tentatives supplementaires (3 essais au total). 0 desactive entierement les retries.
BOOND_HTTP_RETRY_BASE_MS200Delai de base utilise pour le backoff exponentiel (base * 2^attempt, avec jitter).
BOOND_HTTP_RETRY_MAX_MS5000Plafond du delai entre deux tentatives.

Limitation de debit (rate limiting)

Pour eviter qu'une boucle d'outils emballee n'inonde l'API (et n'enchaine les 429), le client applique un token bucket local. Defauts : 10 req/s soutenu, rafale 20 — invisible en usage interactif normal. Les retentatives consomment aussi un jeton.

VariableDefautDescription
BOOND_HTTP_RATE_LIMIT_RPS10Debit soutenu (requetes/seconde). 0 desactive completement.
BOOND_HTTP_RATE_LIMIT_BURST20Capacite du bucket = taille maximale de rafale immediate.

En transport HTTP OAuth, le bucket est par utilisateur (identite derivee du Bearer) : la rafale d'un utilisateur ne ralentit pas les autres. En stdio et en static auth, une seule identite, donc un seul bucket — la limite est par identite, pas par processus.

Cache du dictionnaire

L'API BoondManager n'expose qu'un seul endpoint /application/dictionary qui renvoie l'intégralité des libellés (états, types, pays…). Le serveur le met en cache en mémoire pour éviter de le re-télécharger à chaque résolution état/type → libellé.

VariableDefautDescription
BOOND_DICTIONARY_TTL_MS3600000 (1 h)Durée de vie du cache du dictionnaire, en millisecondes. Une valeur non numérique ou ≤ 0 retombe sur le défaut.

Téléversement de documents locaux

boond_documents_create accepte trois sources, exactement une par appel :

SourceTransportActivationLimite
fileUrltoustoujours— (BoondManager télécharge l'URL)
filePathstdio uniquementBOOND_MCP_UPLOAD_DIRSBOOND_MCP_UPLOAD_MAX_BYTES (20 Mo)
fileContent (base64) + fileNametoustoujours2 Mo
VariableDéfautDescription
BOOND_MCP_UPLOAD_DIRS(aucune)Répertoires dont les fichiers peuvent être téléversés (chemins absolus, CSV). Absente = filePath désactivé.
BOOND_MCP_UPLOAD_MAX_BYTES20971520Taille maximale d'un fichier local, en octets.
bash
export BOOND_MCP_UPLOAD_DIRS="$HOME/Documents/Boond,$HOME/Downloads"

Garde-fous : chemin absolu obligatoire, confinement vérifié après résolution des liens symboliques (.. et symlinks sortants refusés), fichier régulier uniquement, type déterminé par les premiers octets (PDF, DOCX/XLSX/PPTX, ODT/ODS, DOC/XLS/PPT, RTF, PNG, JPEG, GIF, WebP) et non par l'extension. N'autorisez que des répertoires dédiés : tout fichier accepté qui s'y trouve peut être envoyé dans BoondManager à la demande du modèle.

Relais d'upload pour les pièces jointes de conversation (SharePoint)

Une pièce jointe glissée dans une conversation se trouve dans l'environnement d'exécution de code du client (bac à sable), pas sur le poste du serveur : filePath ne la voit pas, et le modèle ne peut pas la retranscrire de façon fiable en base64. Le relais la fait transiter hors de la sortie du modèle :

  1. boond_documents_upload_slot({ fileName }) crée, dans une bibliothèque SharePoint dédiée, un dossier de transit et une session d'upload Microsoft Graph pré-authentifiée (15 min, un fichier, un usage) ;
  2. le bac à sable dépose le fichier en une requête PUT (curl, commande fournie) ;
  3. boond_documents_create({ parentType, parentId, uploadSlot }) vérifie le fichier (taille, premiers octets), transmet à BoondManager son URL de lecture temporaire Graph via le mécanisme fileUrl, puis le supprime définitivement (permanentDelete, sans corbeille ; repli sur une suppression simple si le locataire la refuse). Les slots expirés sont purgés à l'ouverture suivante.

Les identifiants Entra ID restent côté serveur ; le client ne voit que des URL limitées à un fichier.

VariableDéfautDescription
BOOND_MCP_UPLOAD_RELAY(aucune)sharepoint pour activer le relais. Absente = boond_documents_upload_slot refusé.
BOOND_MCP_SHAREPOINT_TENANT_ID—ID de l'annuaire (locataire) Entra ID.
BOOND_MCP_SHAREPOINT_CLIENT_ID—ID d'application de l'inscription Entra ID.
BOOND_MCP_SHAREPOINT_CLIENT_SECRET—Secret client (à renouveler avant expiration).
BOOND_MCP_SHAREPOINT_SITE—Site de transit : https://<tenant>.sharepoint.com/sites/<site>.
BOOND_MCP_SHAREPOINT_LIBRARYDocumentsNom de la bibliothèque de transit.

Mise en place, avec le minimum de droits :

  • un site SharePoint et une bibliothèque dédiés, réservés aux propriétaires, exclus de la recherche et de la synchronisation hors connexion, sans stratégie de rétention Purview (sinon les fichiers supprimés sont conservés) ;
  • une inscription d'application Entra ID (locataire unique) avec la permission d'application Graph Sites.Selected et le consentement administrateur, puis le rôle write accordé sur ce seul site :
powershell
Connect-MgGraph -Scopes "Sites.FullControl.All"$site = Get-MgSite -SiteId "<tenant>.sharepoint.com:/sites/<site>"New-MgSitePermission -SiteId $site.Id -BodyParameter @{  roles = @("write")  grantedToIdentities = @(@{ application = @{ id = "<client-id>"; displayName = "boond-mcp-relay" } })}
  • côté client, autoriser <tenant>.sharepoint.com dans la liste blanche réseau de l'exécution de code.

Compromis assumé : l'URL de lecture que reçoit BoondManager est pré-authentifiée pendant sa courte durée de vie (quelques minutes, fixée par Microsoft) ; elle est imprévisible et le fichier est supprimé dès que BoondManager l'a récupéré.

Restriction d'accès (profils / domaines / lecture seule)

Vous pouvez restreindre ce que l'IA voit et peut faire, entièrement par variables d'environnement : exposer seulement certains domaines (ex. la comptabilité), et/ou bloquer les écritures et suppressions.

VariableEffet
BOOND_MCP_PROFILEProfil préconfiguré : recruiting, sales, finance, delivery, admin (CSV = union). Raccourci pour ne pas lister les domaines à la main. Ignoré si BOOND_MCP_DOMAINS est défini.
BOOND_MCP_DOMAINSListe blanche de domaines (CSV). Absente = tous. Ex. invoices,payments,application
BOOND_MCP_EXCLUDE_DOMAINSListe noire de domaines (CSV), appliquée après la liste blanche. Ex. candidates,resources
BOOND_MCP_OPERATIONSOpérations autorisées (CSV) parmi read,create,update,delete. Absente = toutes.
BOOND_MCP_READ_ONLYRaccourci : true équivaut à BOOND_MCP_OPERATIONS=read (tout en lecture seule).

⚠️ Ce n'est pas une frontière de sécurité dure. Le filtre masque des outils à l'IA mais n'altère pas les droits du compte BoondManager utilisé. Pour un vrai cloisonnement, configurez d'abord les droits du compte/rôle BoondManager (lecture seule, périmètre comptable…) ; ce filtre vient en complément (économie de tokens, garde-fou anti-action accidentelle).

Exemple — tout le périmètre gestion, en lecture seule :

bash
export BOOND_MCP_PROFILE=financeexport BOOND_MCP_READ_ONLY=true

Guide complet, règles de résolution, contenu de chaque profil (et le nombre d'outils qui en résulte) : docs/access-control.md.

Icônes (SEP-973)

Les outils, prompts et ressources portent une icône par domaine (SVG inline en data: URI, aucun asset à héberger). Coût mesuré : ~40 Kio, soit ~14 % du payload tools/list. Les déploiements qui ne les affichent pas (passerelles, clients texte) peuvent les supprimer :

VariableDefautDescription
BOOND_MCP_ICONSactivé0/false/no/off : n'annonce aucune icône (outils, prompts, ressources).

Libellés personnalisés du dictionnaire

Si votre instance BoondManager utilise des libellés de dictionnaire personnalisés (ex. types d'action ou états en anglais), vous pouvez déclarer le mapping libellé→ID via BOOND_DICTIONARY_OVERRIDES (JSON inline ou chemin vers un fichier JSON) :

bash
export BOOND_DICTIONARY_OVERRIDES='{"action":{"contact":{"Call":61,"Email":63}},"state":{"candidate":{"Interviewed":2}}}'

Le serveur accepte alors ces libellés pour le typeOf de boond_actions_create et les champs state des créations/modifications, les résout automatiquement en IDs numériques, et enrichit les descriptions des outils avec les libellés disponibles. Sans cette variable, le comportement est strictement inchangé.

Format complet, entités supportées et limites : docs/dictionary-overrides.md.

Transports

Le serveur supporte deux transports MCP, selectionnables via la variable d'environnement MCP_TRANSPORT.

TransportValeurCas d'usage
stdio (defaut)stdio ou non definiClaude Desktop, Claude Code, integration locale
Streamable HTTPhttp (alias : streamable-http)Gateway MCP, deploiement distant, conteneurs

Streamable HTTP (pour les gateways MCP)

Depuis la v1.4.0, le serveur peut etre expose en HTTP (transport MCP Streamable HTTP) afin d'etre branche derriere une passerelle MCP ou deploye comme service. La revision de protocole negociee est celle du SDK installe (2025-11-25).

Authentification BoondManager : OAuth2 protected resource. Le serveur HTTP ne detient aucun secret (ni client_secret, ni refresh token, ni stockage utilisateur). Chaque requete MCP doit porter Authorization: Bearer <boond_access_token> ; le serveur transmet le token tel quel a BoondManager. C'est le client MCP (Claude Desktop, Claude Code, gateway…) qui fait la danse OAuth contre BoondManager et qui gere le refresh. Procedure complete : docs/oauth.md.

bash
export MCP_TRANSPORT=httpexport MCP_HTTP_HOST=0.0.0.0        # defaut: 127.0.0.1export MCP_HTTP_PORT=3000           # defaut: 3000export MCP_HTTP_PATH=/mcp           # defaut: /mcp# Optionnel: requis uniquement derriere un reverse proxy, pour que# la discovery annonce la bonne URL publique.export MCP_HTTP_PUBLIC_URL=https://mcp.votre-domaine.com/mcp
npx boondmanager-mcp-server# 🚀 BoondManager MCP Server running (streamable HTTP transport)# 📡 Endpoint: http://0.0.0.0:3000/mcp# 🔑 Mode: stateless# 🔐 Boond auth: OAuth2 (per-request Bearer from MCP client)

Variables d'environnement HTTP

VariableDefautDescription
MCP_TRANSPORTstdiohttp pour activer le transport HTTP
MCP_HTTP_HOST127.0.0.1Interface d'ecoute (0.0.0.0 pour exposer)
MCP_HTTP_PORT3000Port TCP
MCP_HTTP_PATH/mcpChemin HTTP de l'endpoint MCP
MCP_HTTP_STATEFULfalsetrue pour activer le mode stateful (session Mcp-Session-Id)
MCP_HTTP_JSON_RESPONSEfalsetrue pour forcer des reponses JSON (sans SSE)
MCP_HTTP_PUBLIC_URL(derivee)URL publique annoncee dans la discovery OAuth2 (resource) et le challenge WWW-Authenticate. Requise derriere un reverse proxy.
MCP_HTTP_SESSION_TTL_MS1800000 (30 min)En mode stateful, duree d'inactivite au-dela de laquelle une session est fermee.
MCP_HTTP_SESSION_SWEEP_INTERVAL_MS300000 (5 min)Frequence de balayage des sessions inactives.
MCP_HTTP_ALLOWED_HOSTS(auto)Liste blanche du header Host (anti DNS rebinding, CVE-2025-66414). * pour desactiver explicitement.
MCP_HTTP_ALLOWED_ORIGINS(auto)Liste blanche du header Origin (scheme + host + port) pour les clients navigateur ; un Origin hors liste recoit un 403 (exigence spec 2025-11-25). Defaut quand le serveur ecoute en loopback = toute origine loopback, quel que soit le port (http/https sur localhost / 127.0.0.1 / [::1]) plus l'origine de MCP_HTTP_PUBLIC_URL si elle est definie — MCP Inspector (:6274) ou un serveur de dev (:5173) fonctionnent sans configuration, et une origine distante recoit toujours un 403. Validation desactivee sinon. Une liste explicite est en revanche comparee a l'identique (port compris). Une requete sans Origin est toujours acceptee (curl, gateways, clients MCP non-navigateur), et le document de decouverte /.well-known/oauth-protected-resource est exempte. * pour desactiver explicitement ; une valeur vide n'est pas une desactivation.
MCP_HTTP_VALIDATE_TOKENfalseMode OAuth : valide chaque Bearer aupres de BoondManager (GET /application/current-user, mis en cache par token pendant MCP_HTTP_TOKEN_VALIDATION_TTL_MS, 60 s par defaut) avant de traiter la requete. Un token expire ou revoque recoit un 401 + WWW-Authenticate: … error="invalid_token", ce que les clients MCP conformes transforment en nouvelle autorisation — sans l'option, le 401 n'apparait que dans le resultat d'un appel d'outil, d'ou aucun client ne relance l'OAuth. BoondManager injoignable → la requete passe (fail open).

Variables OAuth2 — discovery (toutes optionnelles)

VariableDefautDescription
BOOND_OAUTH_AUTHORIZATION_SERVERhttps://ui.boondmanager.comIssuer de l'authorization server BoondManager, annonce dans authorization_servers
BOOND_OAUTH_SCOPES(vide)Scopes annonces dans scopes_supported (espace ou virgule). Vide = le client negocie directement avec Boond.

Stateless (defaut) : chaque requete HTTP POST est independante, idealement adapte a un gateway qui multiplexe plusieurs serveurs MCP. Aucune session n'est conservee cote serveur.

Stateful : le serveur genere un Mcp-Session-Id a l'initialisation que le client doit renvoyer dans chaque requete suivante. Utile pour les clients MCP natifs qui beneficient du streaming SSE et des notifications serveur.

Exemple : discovery + 401 challenge
bash
# Public, pas d'auth -> documente OU envoyer le user pour autorisercurl -s http://localhost:3000/.well-known/oauth-protected-resource | jq .# {#   "resource": "http://0.0.0.0:3000/mcp",#   "authorization_servers": ["https://ui.boondmanager.com"],#   "bearer_methods_supported": ["header"]# }
# Appel MCP sans token -> 401 + WWW-Authenticate qui pointe vers la discoverycurl -s -o /dev/null -w "%{http_code}\n%header{www-authenticate}\n" \  -X POST http://localhost:3000/mcp -d '{}'# 401# Bearer realm="http://0.0.0.0:3000/mcp", resource_metadata="http://0.0.0.0:3000/.well-known/oauth-protected-resource/mcp"
Exemple : Claude Code via HTTP

Avec un client MCP conforme a la spec MCP Authorization 2025-06-18, la decouverte OAuth est automatique :

bash
claude mcp add --transport http boondmanager https://mcp.votre-domaine.com/mcp# Le client recoit le 401 + WWW-Authenticate, fetch la metadata, ouvre# le navigateur pour autoriser l'App BoondManager, puis re-emet la requete# avec le Bearer token recu.
Exemple : Docker (image officielle)

Une image Docker prete a l'emploi est publiee a chaque release sur deux registres miroirs, multi-arch (linux/amd64 + linux/arm64) :

RegistreImagePage
GitHub Container Registryghcr.io/silamir/boondmanager-mcp-servergithub.com/silamir/boondmanager-mcp-server/pkgs/container/boondmanager-mcp-server
Docker Hubdocker.io/fauguste/boondmanager-mcp-serverhub.docker.com/r/fauguste/boondmanager-mcp-server

Memes digests, memes tags — choisissez celui qui s'aligne avec votre tooling. L'image demarre par defaut en transport HTTP, sur le port 3000, sur l'interface 0.0.0.0. Aucun volume, aucun secret a stocker — le serveur est stateless par construction.

bash
# Via GHCR (authentification GitHub si registre prive)docker run -d --restart unless-stopped \  -p 127.0.0.1:3000:3000 \  -e MCP_HTTP_PUBLIC_URL=https://mcp.votre-domaine.com/mcp \  --name boondmanager-mcp \  ghcr.io/silamir/boondmanager-mcp-server:latest
# Ou via Docker Hub (anonyme)docker run -d --restart unless-stopped \  -p 127.0.0.1:3000:3000 \  -e MCP_HTTP_PUBLIC_URL=https://mcp.votre-domaine.com/mcp \  --name boondmanager-mcp \  fauguste/boondmanager-mcp-server:latest

Tags disponibles sur les deux registres : :latest, :X, :X.Y, :X.Y.Z pour chaque release stable (la version exacte est recommandee pour la prod). Les prereleases (par exemple :2.0.0-alpha) sont publiees uniquement sous leur tag pinne — ni :latest, ni :X, ni :X.Y ne bougent. Variables d'environnement supportees : voir Configuration et Transports.

Exemple : docker-compose

Le repo embarque un docker-compose.yml pret a l'emploi : un seul service stateless, aucun volume, aucun secret cote serveur.

bash
# Optionnel : surcharger MCP_HTTP_PUBLIC_URL si fronted par un reverse proxycp .env.example .env
docker compose up -ddocker compose logs -f mcp

Securite : le serveur HTTP est stateless et ne stocke aucun secret BoondManager. Chaque utilisateur authentifie le serveur via son propre token OAuth2 (issu de sa propre App BoondManager), et toutes les actions sont attribuees a son identite dans l'audit log Boond. Derriere un reverse proxy : terminez TLS (HTTPS), forwardez l'en-tete Authorization, et reglez MCP_HTTP_PUBLIC_URL sur l'URL publique pour que la discovery soit coherente.

Clients distants non-Claude (ChatGPT, OpenAI / Gemini Agents SDK)

MCP est un protocole agnostique du modele : le meme endpoint HTTP/OAuth2 est consomme tel quel par tout hote compatible MCP, pas seulement Claude. Aucun package ni build specifique a un LLM n'est requis — il suffit de pointer l'hote sur votre URL MCP_HTTP_PUBLIC_URL.

HoteComment brancher le serveur
ChatGPT (connecteurs / Developer mode)Ajouter un connecteur MCP distant pointant sur l'URL HTTP ; l'OAuth2 est decouvert via la metadata /.well-known/oauth-protected-resource.
OpenAI Agents SDKDeclarer un HostedMCPTool / serveur MCP distant avec l'URL HTTP et le flux OAuth2.
Google Gemini (Agents SDK / Vertex)Enregistrer le serveur MCP distant cote SDK ; en local, l'extension Gemini CLI (voir Installation) couvre le transport stdio.

Le contrat est identique a celui de Claude Code en HTTP (voir l'exemple claude mcp add --transport http ci-dessus) : seule la maniere de declarer le serveur cote client change.

Exemples d'utilisation

Une fois configure, vous pouvez demander a Claude :

CRM & Commercial

  • "Recherche les candidats avec des competences en React a Paris"
  • "Montre-moi les details techniques de la ressource #12345"
  • "Cree un nouveau contact Jean Dupont chez Acme Corp"
  • "Liste toutes les opportunites en cours"
  • "Quels sont les positionnements de l'opportunite #20 ?"

Gestion de projets

  • "Cree un projet Mission Alpha pour la societe #42"
  • "Affiche le planning du projet #33"
  • "Quels sont les bons de commande du projet #55 ?"
  • "Affiche la productivite du projet #12"

Facturation & Finance

  • "Recherche les factures en attente de paiement"
  • "Liste les factures fournisseur de la societe #100"
  • "Affiche les achats du projet #55"

RH & Temps

  • "Affiche les feuilles de temps de la ressource #100 pour mars 2025"
  • "Liste les absences prevues ce mois-ci"
  • "Affiche les notes de frais de la ressource #200"
  • "Quels sont les avantages de la ressource #50 ?"

Suivi d'activite

  • "Quelles sont les actions recentes sur le candidat #789 ?"
  • "Affiche les validations en attente"
  • "Liste les taches de ma todolist"

Reporting

  • "Affiche le reporting de synthese globale"
  • "Quel est le reporting de productivite des ressources ?"

Administration

  • "Recupere le dictionnaire des types d'actions"
  • "Liste les agences et business units"
  • "Affiche les webhooks configures"

Architecture

boondmanager-mcp-server/├── src/│   ├── index.ts              # Point d'entree MCP (selection du transport)│   ├── server.ts             # Factory createMcpServer() + liste des domaines│   ├── constants.ts          # Configuration, API paths, onglets│   ├── types.ts              # Types TypeScript (JSON:API)│   ├── transports/│   │   └── http.ts           # Transport Streamable HTTP (gateway/remote)│   ├── services/│   │   └── boond-client.ts   # Client HTTP API BoondManager│   ├── schemas/│   │   └── index.ts          # Schemas Zod (validation des entrees)│   └── tools/│       ├── index.ts          # Barrel export de tous les domaines│       ├── crud-factory.ts   # Factory generique CRUD (DRY)│       ├── candidates.ts     # 10 outils (CRUD + 5 onglets)│       ├── resources.ts      # 20 outils (CRUD + 10 onglets + references/timesheets)│       ├── contacts.ts       # 11 outils (CRUD + 6 onglets)│       ├── companies.ts      # 14 outils (CRUD + 9 onglets)│       ├── opportunities.ts  # 10 outils (CRUD + 5 onglets)│       ├── projects.ts       # 12 outils (CRUD + 7 onglets)│       ├── actions.ts        # 5 outils│       ├── timesheets.ts     # 3 outils│       ├── invoices.ts       # 5 outils│       ├── orders.ts         # 5 outils│       ├── deliveries.ts     # 2 outils│       ├── absences.ts       # 5 outils│       ├── expenses.ts       # 5 outils│       ├── products.ts       # 5 outils│       ├── positionings.ts   # 4 outils│       ├── payments.ts       # 2 outils│       ├── advantages.ts     # 2 outils│       ├── contracts.ts      # 2 outils│       ├── purchases.ts      # 4 outils│       ├── provider-invoices.ts # 2 outils│       ├── accounts.ts       # 2 outils│       ├── agencies.ts       # 2 outils│       ├── business-units.ts # 2 outils│       ├── poles.ts          # 2 outils│       ├── roles.ts          # 2 outils│       ├── calendars.ts      # 2 outils│       ├── flags.ts          # 2 outils│       ├── webhooks.ts       # 2 outils│       ├── logs.ts           # 2 outils│       ├── notifications.ts  # 2 outils│       ├── threads.ts        # 2 outils│       ├── todolists.ts      # 2 outils│       ├── validations.ts    # 2 outils│       ├── reporting.ts      # 5 outils│       ├── planning-absences.ts # 1 outil│       └── application.ts    # 2 outils├── dist/                     # Build JavaScript├── .github/                  # CI/CD, templates, Dependabot├── package.json├── tsconfig.json├── vitest.config.ts├── eslint.config.js└── README.md

Depannage

« JSON Schema declares an unsupported dialect (draft-07) » sur les outils *_search

Symptome. Les outils de recherche (boond_candidates_search, boond_resources_search, boond_opportunities_search...) echouent systematiquement, alors que les outils de fiche (boond_*_get), les dictionnaires et les workflows textuels fonctionnent. La dissymetrie est le diagnostic : seuls les ~59 outils qui declarent un outputSchema sont concernes, parce que c'est ce schema-la que l'hote compile -- au moment ou il enregistre l'outil, donc avant tout appel. L'outil n'echoue pas, il devient inutilisable.

Cause. Les versions 2.1.0 a 2.12.1 annoncaient "$schema": "http://json-schema.org/draft-07/schema#" sur leurs schemas (le SDK MCP convertit les schemas Zod avec target: 'draft-7', en dur). Un hote qui valide avec un validateur 2020-12 uniquement refuse de compiler un tel schema.

Correctif : mettre a jour vers >= 2.12.2. Depuis cette version le serveur n'annonce plus aucun dialecte (src/schema-dialect.ts), ce que la suite de tests verifie sur les 185 outils a travers un vrai client, sous validateur 2020-12 et draft-07.

Redemarrer le connecteur ne suffit pas : un redemarrage relance le binaire installe, il ne le met pas a jour. Verifiez la version reellement chargee plutot que celle affichee par le catalogue :

bash
# npm / npx : quelle version est resolue et depuis quel cachenpm view boondmanager-mcp-server versionnpx --yes boondmanager-mcp-server@latest --version 2>/dev/null || true
# Le serveur annonce sa version dans la reponse `initialize` (champ serverInfo.version),# lue depuis son propre package.json -- c'est la seule source fiable.

Selon le canal d'installation :

CanalMise a jour
Extension Claude Desktop (.mcpb)Telecharger le .mcpb de la derniere release et le reinstaller -- les extensions tierces ne s'auto-mettent pas a jour
Plugin Claude Code/plugin marketplace update boondmanager puis reinstaller le plugin (le lancement est epingle sur [email protected])
claude mcp add / config manuelleEpingler boondmanager-mcp-server@latest (ou une version >= 2.12.2) dans la commande npx
Docker / GHCRdocker pull ghcr.io/silamir/boondmanager-mcp-server:latest

Verifiez aussi la version de Node : le serveur requiert Node.js >= 22. Un poste encore en Node 20 est en general un poste dont l'installation n'a pas ete rafraichie depuis longtemps.

Securite

  • Les credentials BoondManager (JWT ou BasicAuth) ne transitent jamais via le protocole MCP -- ils sont configures en variables d'environnement cote serveur uniquement
  • En mode stdio, le serveur tourne en local, aucun port reseau n'est expose
  • En mode streamable HTTP, l'authentification est un OAuth2 protected resource : chaque requete MCP porte son propre Authorization: Bearer <token> (le serveur ne stocke aucun secret). Terminez TLS (HTTPS via reverse proxy), forwardez l'en-tete Authorization, reglez MCP_HTTP_PUBLIC_URL sur l'URL publique, et activez la protection anti DNS rebinding via MCP_HTTP_ALLOWED_HOSTS. Restreignez aussi l'acces reseau a votre gateway. Voir docs/oauth.md.
  • Compatible avec les exigences ISO 27001
  • L'API BoondManager est hebergee en France et conforme RGPD
  • Authentification BoondManager : JWT (recommande), BasicAuth, ou JWT construit automatiquement a partir des composants

Developpement

bash
# Mode watch pour le developpementnpm run dev
# Buildnpm run build
# Lancer le serveurnpm start
# Testsnpm test               # 645 testsnpm run test:coverage  # Avec couverture
# Qualitenpm run lintnpm run typecheck

Stack technique

  • Runtime : Node.js >= 22 (ES2022)
  • Langage : TypeScript 5.8+ (mode strict)
  • MCP SDK : @modelcontextprotocol/sdk 1.12+
  • Validation : Zod 4
  • Tests : Vitest 4 + couverture V8
  • Lint : ESLint 10 + typescript-eslint
  • Transports : stdio (defaut) + Streamable HTTP (spec MCP 2025-11-25)

Ressources

Licence

Apache License 2.0 — Copyright (c) 2025-2026 Silamir. Créé à l'origine par Frédéric Auguste.

Voir LICENSE et NOTICE pour les détails.

BoondManager est une marque de BoondManager SAS. Ce projet est un client indépendant et non officiel de l'API publique BoondManager, sans affiliation avec BoondManager SAS.

来源:README.md,提交 edb0ba4

工具

200

boond_candidates_get

Détails d'un(e) candidat

Récupère la fiche complète d'un(e) candidat par son ID numérique. Quand : après un `boond_candidates_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_candidates_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_candidates_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_candidates_create

Créer un(e) candidat

Crée un(e) candidat dans BoondManager. Quand : pour ajouter un(e) candidat inexistant(e). Plutôt que : `boond_candidates_update` pour modifier un enregistrement existant, et `boond_candidates_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数citynotestatetitleemail1phone1countrylastName必填firstName必填mainSkills

boond_candidates_update

Modifier un(e) candidat

Met à jour un(e) candidat existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_candidates_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填citynotetownstatetitleemail1phone1addresscountrylastNamepostcode另有 6 个

boond_candidates_delete

Supprimer un(e) candidat

Supprime définitivement un(e) candidat de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_candidates_get`. Plutôt que : `boond_candidates_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_candidates_technical_data_update

Mettre à jour le dossier technique d'un candidat

Met à jour le dossier technique (DT) d'un candidat : compétences, outils, langues, profils (activityAreas), secteurs (expertiseAreas), formation, diplômes, expérience, résumé. Quand : pour coder le dossier technique d'un candidat (profils, secteurs, outils, langues, expérience, formation). Plutôt que : `boond_candidates_update` pour l'onglet Information (coordonnées, disponibilité, mobilité, évaluation) ; `boond_resources_technical_data_update` pour un collaborateur interne. Mode 'merge' (défaut, recommandé pour automation) — enrichit sans rien écraser : • skills (CSV) : concatène les compétences absentes • tools / languages : ajoute les entrées dont la clé (slug outil / langue) est nouvelle, conserve le niveau existant pour les autres • expertiseAreas, activityAreas, diplomas : ajoute les items absents • title, summary, training, experience : remplis UNIQUEMENT si actuellement vides Mode 'replace' — remplace intégralement chaque champ fourni. Les champs non passés ne sont pas touchés. ⚠️ experience, training, expertiseAreas, activityAreas et tools prennent des IDs de dictionnaire (`setting.experience`, `setting.training`, `setting.expertiseArea`, `setting.activityArea`, `setting.tool`), jamais des libellés. Returns : confirmation, liste des champs envoyés mais non retrouvés dans la réponse de l'API (écriture ignorée par Boond), puis le DT mis à jour.

输入参数id必填modetitletoolsskillssummarydiplomastraininglanguagesexperienceactivityAreasexpertiseAreas

boond_candidates_administrative_update

Mettre à jour les données administratives d'un candidat

Met à jour l'onglet Administratif d'un candidat : nationalité, salaire souhaité (fourchette), salaire actuel, contrat souhaité, commentaires. Quand : pour renseigner nationalité, salaire souhaité ou contrat souhaité d'un candidat. Plutôt que : `boond_candidates_technical_data_update` pour les compétences et le parcours. Seuls les champs fournis sont envoyés. Données personnelles : n'écrire que ce que le candidat a communiqué (CV, entretien). Returns : confirmation, liste des champs non retrouvés dans la réponse de l'API, puis le bloc administratif mis à jour.

输入参数id必填nationalityactualSalarydesiredSalarydesiredContractadministrativeComments

boond_candidates_information

Informations générales d'un candidat

Récupère les informations générales (coordonnées, adresse, état civil, photo, tags, source) d'un(e) candidat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_candidates_get` pour la fiche de base, ou `boond_candidates_search` si l'ID est inconnu. Returns : Bloc identité et coordonnées du candidat. Lecture seule.

输入参数id必填

boond_candidates_technical_data

Compétences techniques d'un candidat

Récupère le profil technique (compétences, expériences, formations, certifications, langues, CV) d'un(e) candidat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_candidates_get` pour la fiche de base, ou `boond_candidates_search` si l'ID est inconnu. Returns : Profil technique du candidat. Les ID de documents (CV) qui s'y trouvent alimentent `boond_documents_get`. Lecture seule.

输入参数id必填

boond_candidates_administrative

Données administratives d'un candidat

Récupère les données administratives (pièces justificatives, documents contractuels, informations RH) d'un(e) candidat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_candidates_get` pour la fiche de base, ou `boond_candidates_search` si l'ID est inconnu. Returns : Bloc administratif du candidat, avec les ID de documents exploitables par `boond_documents_get`. Lecture seule.

输入参数id必填

boond_candidates_actions

Actions liées à un candidat

Récupère les actions (appels, emails, RDV, notes) d'un(e) candidat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_candidates_get` pour la fiche de base, ou `boond_candidates_search` si l'ID est inconnu. Returns : Liste des actions rattachées au candidat. Lecture seule.

输入参数id必填

boond_candidates_positionings

Positionnements d'un candidat

Récupère les positionnements (placements du candidat sur des opportunités ou des projets) d'un(e) candidat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_candidates_get` pour la fiche de base, ou `boond_candidates_search` si l'ID est inconnu. Returns : Liste des positionnements du candidat. Lecture seule.

输入参数id必填

boond_resources_get

Détails d'un(e) ressource

Récupère la fiche complète d'un(e) ressource par son ID numérique. Quand : après un `boond_resources_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_resources_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_resources_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_resources_create

Créer un(e) ressource

Crée un(e) ressource dans BoondManager. Quand : pour ajouter un(e) ressource inexistant(e). Plutôt que : `boond_resources_update` pour modifier un enregistrement existant, et `boond_resources_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数citynotestatetitleemail1phone1countrylastName必填firstName必填

boond_resources_update

Modifier un(e) ressource

Met à jour un(e) ressource existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_resources_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填citynotestatetitleemail1phone1countrylastNamefirstName

boond_resources_delete

Supprimer un(e) ressource

Supprime définitivement un(e) ressource de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_resources_get`. Plutôt que : `boond_resources_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_resources_information

Informations générales d'une ressource

Récupère les informations générales (coordonnées, adresse, état civil, photo, tags, manager) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Bloc identité et rattachement hiérarchique de la ressource. Lecture seule.

输入参数id必填

boond_resources_technical_data

Compétences techniques d'une ressource

Récupère le profil technique (compétences, expériences, formations, certifications, langues, CV) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Profil technique de la ressource. Modifiable via `boond_resources_technical_data_update`. Lecture seule.

输入参数id必填

boond_resources_administrative

Données administratives d'une ressource

Récupère les données administratives et RH (salaire, TJM, coût journalier, contrat) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Bloc administratif de la ressource — données salariales, à manier avec prudence. Lecture seule.

输入参数id必填

boond_resources_advantages

Avantages d'une ressource

Récupère les avantages (tickets restaurant, mutuelle, véhicule, primes) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des avantages de la ressource. Lecture seule.

输入参数id必填

boond_resources_actions

Actions liées à une ressource

Récupère les actions (appels, emails, RDV, notes) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des actions rattachées à la ressource. Lecture seule.

输入参数id必填

boond_resources_positionings

Positionnements d'une ressource

Récupère les positionnements (placements de la ressource sur des opportunités ou des projets) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des positionnements de la ressource. Lecture seule.

输入参数id必填

boond_resources_projects

Projets d'une ressource

Récupère les projets (missions en cours et passées auxquelles la ressource participe) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des projets de la ressource. Lecture seule.

输入参数id必填

boond_resources_times_reports

Feuilles de temps d'une ressource

Récupère les feuilles de temps (CRA) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des CRA de la ressource. Pour le détail jour par jour d'un mois, utiliser `boond_timesheets_get`. Lecture seule.

输入参数id必填

boond_resources_expenses_reports

Notes de frais d'une ressource

Récupère les notes de frais d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des notes de frais mensuelles de la ressource. Le détail des lignes est dans `boond_expenses_get`. Lecture seule.

输入参数id必填

boond_resources_absences_reports

Demandes d'absences d'une ressource

Récupère les demandes d'absences (congés, RTT, maladie) d'un(e) ressource, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_resources_get` pour la fiche de base, ou `boond_resources_search` si l'ID est inconnu. Returns : Liste des demandes d'absences de la ressource. Lecture seule.

输入参数id必填

boond_resources_contracts

Contrats d'une ressource

Liste les contrats de travail d'une ressource (type, dates, période d'essai, motif de fin), par son ID. Quand : pour connaître le contrat en cours, l'historique contractuel ou la fin de période d'essai d'un collaborateur. Plutôt que : `boond_contracts_search` pour balayer un périmètre entier (fins de contrat du mois…), `boond_contracts_get` pour la fiche complète d'un contrat. - Lit `/resources/{id}/administrative` et en extrait les contrats inclus — il n'existe pas d'onglet `contracts` côté API. Returns : une ligne par contrat, du plus récent au plus ancien tel que BoondManager les renvoie, avec les IDs pour `boond_contracts_get`. Lecture seule.

输入参数id必填

boond_resources_technical_data_update

Mettre à jour le dossier technique d'une ressource

Met à jour le dossier technique (DT) d'une ressource : compétences, outils, langues, expertises, formations, diplômes, expérience. Quand : pour mettre à jour le dossier technique d'une ressource (compétences, formations, langues…). Plutôt que : `boond_resources_reference_create` / `_update` / `_delete` pour les seules expériences professionnelles : elles vivent dans le même bloc, mais ces outils évitent d'avoir à republier le tableau entier. Mode 'merge' (défaut, recommandé pour automation) — enrichit sans rien écraser : • skills (CSV) : concatène les compétences absentes • tools / languages : ajoute les entrées dont la clé (slug outil / langue) est nouvelle, conserve le niveau existant pour les autres • expertiseAreas, activityAreas, diplomas : ajoute les items absents • title, summary, training, experience : remplis UNIQUEMENT si actuellement vides Mode 'replace' — remplace intégralement chaque champ fourni par la valeur passée. Les champs non passés ne sont pas touchés. Seuls les champs explicitement fournis dans l'appel sont envoyés à l'API — un champ omis ne sera jamais réinitialisé à vide. Les expériences professionnelles (références) ne sont PAS gérées ici : utiliser boond_resources_reference_{create|update|delete}. Returns : confirmation et dossier technique mis à jour. Réponse inchangée si aucun champ n'était à écrire dans le mode demandé.

输入参数id必填modetitletoolsskillssummarydiplomastraininglanguagesexperienceactivityAreasexpertiseAreas

boond_resources_reference_create

Créer une référence (expérience pro) sur une ressource

Crée une expérience professionnelle (référence) rattachée au DT d'une ressource. Plutôt que : `boond_resources_technical_data_update` pour les autres blocs du dossier technique (compétences, formations, langues), que cet outil ne touche pas. ⚠️ Les références sont des sous-objets embarqués dans le DT, pas une entité REST autonome. L'outil fait read-modify-write : lit la liste actuelle via /resources/{id}/technical-data, ajoute la nouvelle référence et republie la liste complète. Champs requis : resourceId, title, company, description. Dates : startMonth/endMonth en int 1..12 (ou string '1'..'12' sans leading zero) ; startYear/endYear en int 4 chiffres. ⚠️ "05" avec leading zero est rejeté par l'API. Pour compléter une référence existante, utiliser boond_resources_reference_update pour ne pas dupliquer. Returns : confirmation, nombre total de références et ID de celle créée (l'API ne le renvoie pas systématiquement).

输入参数title必填skillscompany必填endYearendMonthlocationstartYearresourceId必填startMonthdescription必填

boond_resources_reference_update

Modifier une référence (expérience pro)

Met à jour une référence existante. Read-modify-write sur /resources/{id}/technical-data — seuls les champs explicitement fournis remplacent ceux de la référence ciblée, les autres champs et toutes les autres références restent intacts. Quand : pour corriger une expérience professionnelle existante. Plutôt que : `boond_resources_reference_create` pour en ajouter une nouvelle. Cas d'usage type : compléter startMonth/startYear/endMonth/endYear sur une référence sans toucher au titre, à la société ou à la description. Returns : confirmation et dossier technique republié. Un `referenceId` introuvable renvoie `isError: true` avec la liste des ID présents.

输入参数titleskillscompanyendYearendMonthlocationstartYearresourceId必填startMonthdescriptionreferenceId必填

boond_resources_reference_delete

Supprimer une référence (expérience pro)

Supprime une référence (expérience professionnelle) du DT d'une ressource. Read-modify-write : lit la liste actuelle, en retire la référence ciblée, republie le reste. ⚠️ Action irréversible — vérifier l'ID au préalable. Quand : pour retirer une expérience saisie par erreur, sur demande explicite de l'utilisateur. Plutôt que : `boond_resources_reference_update` pour corriger une référence plutôt que la détruire. Returns : confirmation et nombre de références restantes. Un `referenceId` introuvable renvoie `isError: true` avec la liste des ID présents.

输入参数resourceId必填referenceId必填

boond_contacts_get

Détails d'un(e) contact

Récupère la fiche complète d'un(e) contact par son ID numérique. Quand : après un `boond_contacts_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_contacts_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_contacts_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_contacts_create

Créer un(e) contact

Crée un(e) contact dans BoondManager. Quand : pour ajouter un(e) contact inexistant(e). Plutôt que : `boond_contacts_update` pour modifier un enregistrement existant, et `boond_contacts_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数citynotetitleemail1phone1countrylastName必填companyIdfirstName必填

boond_contacts_update

Modifier un(e) contact

Met à jour un(e) contact existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_contacts_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填citynotetitleemail1phone1lastNamefirstName

boond_contacts_delete

Supprimer un(e) contact

Supprime définitivement un(e) contact de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_contacts_get`. Plutôt que : `boond_contacts_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_contacts_information

Informations générales d'un contact

Récupère les informations générales (coordonnées, société de rattachement, fonction, tags) d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Bloc identité et rattachement du contact. Lecture seule.

输入参数id必填

boond_contacts_actions

Actions liées à un contact

Récupère les actions (appels, emails, RDV, notes) d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Liste des actions rattachées au contact. Lecture seule.

输入参数id必填

boond_contacts_opportunities

Opportunités d'un contact

Récupère les opportunités commerciales (affaires portées par ce contact) d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Liste des opportunités du contact. Lecture seule.

输入参数id必填

boond_contacts_projects

Projets d'un contact

Récupère les projets d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Liste des projets rattachés au contact. Lecture seule.

输入参数id必填

boond_contacts_orders

Bons de commande d'un contact

Récupère les bons de commande d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Liste des bons de commande du contact. Lecture seule.

输入参数id必填

boond_contacts_invoices

Factures d'un contact

Récupère les factures d'un(e) contact, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_contacts_get` pour la fiche de base, ou `boond_contacts_search` si l'ID est inconnu. Returns : Liste des factures adressées au contact. Lecture seule.

输入参数id必填

boond_companies_get

Détails d'un(e) société

Récupère la fiche complète d'un(e) société par son ID numérique. Quand : après un `boond_companies_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_companies_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_companies_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_companies_create

Créer un(e) société

Crée un(e) société dans BoondManager. Quand : pour ajouter un(e) société inexistant(e). Plutôt que : `boond_companies_update` pour modifier un enregistrement existant, et `boond_companies_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数cityname必填notesiretstateemail1phone1countrywebsite

boond_companies_update

Modifier un(e) société

Met à jour un(e) société existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_companies_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填citynamenotesiretstateemail1phone1countrywebsite

boond_companies_delete

Supprimer un(e) société

Supprime définitivement un(e) société de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_companies_get`. Plutôt que : `boond_companies_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_companies_information

Informations générales d'une société

Récupère les informations générales (coordonnées, SIRET, site web, secteur, taille, tags) d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Fiche signalétique de la société. Lecture seule.

输入参数id必填

boond_companies_contacts

Contacts d'une société

Récupère les contacts (interlocuteurs rattachés à la société) d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des contacts de la société. Lecture seule.

输入参数id必填

boond_companies_actions

Actions liées à une société

Récupère les actions (appels, emails, RDV, notes) d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des actions rattachées à la société. Lecture seule.

输入参数id必填

boond_companies_opportunities

Opportunités d'une société

Récupère les opportunités commerciales d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des opportunités de la société. Lecture seule.

输入参数id必填

boond_companies_projects

Projets d'une société

Récupère les projets d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des projets de la société. Lecture seule.

输入参数id必填

boond_companies_orders

Bons de commande d'une société

Récupère les bons de commande d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des bons de commande de la société. Lecture seule.

输入参数id必填

boond_companies_invoices

Factures d'une société

Récupère les factures client d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des factures de vente adressées à la société. Ne pas confondre avec `boond_companies_provider_invoices` (achat). Lecture seule.

输入参数id必填

boond_companies_purchases

Achats d'une société

Récupère les achats et la sous-traitance d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des achats engagés auprès de la société. Lecture seule.

输入参数id必填

boond_companies_provider_invoices

Factures fournisseur d'une société

Récupère les factures fournisseur (factures reçues de la société en tant que prestataire) d'un(e) société, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_companies_get` pour la fiche de base, ou `boond_companies_search` si l'ID est inconnu. Returns : Liste des factures d'achat. Ne pas confondre avec `boond_companies_invoices` (vente). Lecture seule.

输入参数id必填

boond_opportunities_get

Détails d'un(e) opportunité

Récupère la fiche complète d'un(e) opportunité par son ID numérique. Quand : après un `boond_opportunities_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_opportunities_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_opportunities_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_opportunities_create

Créer un(e) opportunité

Crée un(e) opportunité dans BoondManager. Quand : pour ajouter un(e) opportunité inexistant(e). Plutôt que : `boond_opportunities_update` pour modifier un enregistrement existant, et `boond_opportunities_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数name必填notestatepoleIdtypeOfendDateagencyIdcriteriacompanyIdcontactIdstartDatehrManagerId另有 3 个

boond_opportunities_update

Modifier un(e) opportunité

Met à jour un(e) opportunité existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_opportunities_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填namenotestatepoleIdtypeOfendDateagencyIdcriteriacompanyIdcontactIdstartDate另有 4 个

boond_opportunities_delete

Supprimer un(e) opportunité

Supprime définitivement un(e) opportunité de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_opportunities_get`. Plutôt que : `boond_opportunities_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_opportunities_information

Informations générales d'une opportunité

Récupère les informations générales (client, dates, montant, probabilité, état) d'un(e) opportunité, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_opportunities_get` pour la fiche de base, ou `boond_opportunities_search` si l'ID est inconnu. Returns : Fiche de l'opportunité. Lecture seule.

输入参数id必填

boond_opportunities_actions

Actions liées à une opportunité

Récupère les actions (appels, emails, RDV, notes) d'un(e) opportunité, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_opportunities_get` pour la fiche de base, ou `boond_opportunities_search` si l'ID est inconnu. Returns : Liste des actions rattachées à l'opportunité. Lecture seule.

输入参数id必填

boond_opportunities_positionings

Positionnements sur une opportunité

Récupère les positionnements (candidats et ressources proposés au client) d'un(e) opportunité, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_opportunities_get` pour la fiche de base, ou `boond_opportunities_search` si l'ID est inconnu. Returns : Liste des positionnements de l'opportunité. Lecture seule.

输入参数id必填

boond_opportunities_projects

Projets issus d'une opportunité

Récupère les projets (missions nées de cette affaire une fois gagnée) d'un(e) opportunité, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_opportunities_get` pour la fiche de base, ou `boond_opportunities_search` si l'ID est inconnu. Returns : Liste des projets liés à l'opportunité. Lecture seule.

输入参数id必填

boond_opportunities_simulation

Simulation financière d'une opportunité

Récupère la simulation financière (marge, CA prévisionnel, coûts) d'un(e) opportunité, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_opportunities_get` pour la fiche de base, ou `boond_opportunities_search` si l'ID est inconnu. Returns : Chiffrage prévisionnel de l'opportunité — prévisionnel, pas du réalisé. Lecture seule.

输入参数id必填

boond_actions_get

Détails d'une action

Récupère la fiche complète d'un(e) action par son ID numérique. Quand : après un `boond_actions_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_actions_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_actions_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_actions_create

Créer une action

Crée une nouvelle action (appel, email, RDV, note) dans BoondManager, rattachée à un contact, candidat, ressource, opportunité ou projet (relation dependsOn, obligatoire). Plutôt que : `boond_actions_update` pour compléter une action déjà enregistrée plutôt que d'en créer un doublon. Exactement une entité de rattachement parmi `contactId` / `candidateId` / `resourceId` / `opportunityId` / `projectId` est requise (422 sinon) ; `companyId` n'est accepté qu'en complément d'un `contactId`, et `positioningId` est exigé par l'API pour les types d'action liés aux positionnements (ex. RQ). Returns: L'action créée avec son ID.

输入参数texttitletypeOf必填endDatecompanyIdcontactIdprojectIdstartDateresourceIdcandidateIdopportunityIdpositioningId

boond_actions_update

Modifier une action

Met à jour une action existante dans BoondManager (PUT partiel, seuls les champs fournis sont modifiés). Plutôt que : `boond_actions_create` si l'action n'existe pas encore. ⚠️ Aucune relation n'est envoyée : le rattachement (dependsOn), le positionnement et la synchronisation calendrier (event Outlook/Teams, invités) sont préservés. Idéal pour ajouter un compte-rendu sans casser l'agenda — contrairement à delete + recreate qui supprime l'événement. `text` remplace le contenu existant (pas d'ajout). Returns: L'action mise à jour.

输入参数id必填texttitletypeOfendDatestartDate

boond_actions_delete

Supprimer une action

Supprime définitivement un(e) action de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_actions_get`. Plutôt que : `boond_actions_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_timesheets_default

Référentiels de saisie d'un CRA

Renvoie ce qu'il faut savoir avant d'écrire le CRA d'une ressource sur un mois : types d'unité d'œuvre autorisés, couples projet/prestation imputables, planning prévu et absences déjà posées. Quand : AVANT `boond_timesheets_create` / `boond_timesheets_update` — les codes `workUnitTypeReference` ne sont publiés nulle part ailleurs (ni dans `boond_application_dictionary`, ni sur `boond_agencies_get`). Plutôt que : aucun autre outil ne donne ces codes ; `boond_timesheets_get` pour relire un CRA existant. - Lecture seule (`GET /times-reports/default`). La réponse brute est réduite : les types viennent de la ressource incluse (`workUnitTypesAllowed`), les imputations des projets inclus, le planning de `plannedTimes`. - Une ressource sans imputation ce mois-là ne peut saisir que des absences. Returns : texte : agence, types d'unité d'œuvre (reference | libellé | activityType), imputations `projectId` / `deliveryId` (et `batchId`), planning prévu agrégé par imputation, absences déjà posées.

输入参数term必填agencyIdresourceId必填

boond_timesheets_create

Créer une feuille de temps

Crée la feuille de temps (CRA) d'un mois pour une ressource, avec ses lignes jour par jour. Quand : pour ouvrir le CRA d'un couple (ressource, mois) qui n'existe pas encore, après `boond_timesheets_default`. Plutôt que : `boond_timesheets_search` (`startMonth`/`endMonth` + `resourceId`) d'abord : l'API ne déduplique pas, deux CRA peuvent coexister sur le même mois ; `boond_timesheets_update` si le CRA existe déjà. - Un CRA est un conteneur mensuel (`term` + `resource`) ; les lignes vont dans `regularTimes[]` (production et absences) et `exceptionalTimes[]` — chaque ligne = un jour, une durée, un type d'unité d'œuvre, et pour la production un couple `projectId` / `deliveryId` imputable. - `state` n'est pas un champ d'écriture : il est piloté par le workflow de validation (`boond_validations_search`). - Écriture non idempotente. Modèle d'écriture établi en lecture depuis l'API (forme des CRA existants et de `/times-reports/default`), pas encore éprouvé en écriture sur un tenant de test — voir CLAUDE.md. Returns : confirmation, ID créé (`structuredContent.id`) et fiche du CRA.

输入参数term必填agencyIdresourceId必填regularTimesexceptionalTimesinformationComments

boond_timesheets_update

Modifier une feuille de temps

Met à jour un CRA existant : commentaires, clôture, ou remplacement complet de ses lignes. Quand : pour compléter ou corriger le CRA d'un mois déjà ouvert (trouvé via `boond_timesheets_search`). Plutôt que : `boond_timesheets_create` si aucun CRA n'existe encore pour ce couple (ressource, mois). - Mise à jour partielle sur les champs simples, MAIS `regularTimes` / `exceptionalTimes` **remplacent le tableau entier** : relire le CRA (`boond_timesheets_get`), fusionner, renvoyer la liste complète — envoyer une seule ligne efface le mois. - `state` n'est pas un champ d'écriture (workflow de validation). Returns : confirmation et fiche du CRA mis à jour.

输入参数id必填closedregularTimesexceptionalTimesinformationComments

boond_resources_timesheets

Feuilles de temps d'une ressource

Récupère les feuilles de temps (times reports) d'une ressource par son ID, avec filtre optionnel par mois/année (défaut : mois courant). Quand : pour lister les CRA d'une ressource sur un mois donné, sans connaître leurs ID. Plutôt que : `boond_timesheets_get` pour le détail d'un CRA précis, `boond_timesheets_search` pour couvrir plusieurs ressources d'un coup. Returns: Liste des feuilles de temps de la ressource avec jours/heures et statut.

输入参数yearmonthresourceId必填

boond_timesheets_get

Détails d'une feuille de temps

Récupère les informations détaillées d'une feuille de temps (CRA mensuel) par son ID. Quand : après une recherche, pour le détail jour par jour d'un CRA identifié. Plutôt que : `boond_resources_timesheets` pour lister les CRA d'une ressource sans connaître leurs ID. Returns: Données JSON complètes de la feuille de temps (jours, heures, statut, détails).

输入参数id必填

boond_projects_get

Détails d'un(e) projet

Récupère la fiche complète d'un(e) projet par son ID numérique. Quand : après un `boond_projects_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_projects_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom), ou `boond_find` pour résoudre un nom / un e-mail en ID. - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_projects_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_projects_create

Créer un(e) projet

Crée un(e) projet dans BoondManager. Quand : pour ajouter un(e) projet inexistant(e). Plutôt que : `boond_projects_update` pour modifier un enregistrement existant, et `boond_projects_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数name必填notestatetypeOfendDatecompanyIdcontactIdstartDateopportunityId

boond_projects_update

Modifier un(e) projet

Met à jour un(e) projet existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_projects_create` si l'enregistrement n'existe pas encore, ou `boond_find` pour résoudre un nom / un e-mail en ID. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填namenotestatetypeOfendDatestartDate

boond_projects_delete

Supprimer un(e) projet

Supprime définitivement un(e) projet de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_projects_get`. Plutôt que : `boond_projects_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_projects_information

Informations générales d'un projet

Récupère les informations générales (client, dates, état, description, responsable) d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Fiche du projet. Lecture seule.

输入参数id必填

boond_projects_actions

Actions liées à un projet

Récupère les actions (appels, emails, RDV, notes) d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Liste des actions rattachées au projet. Lecture seule.

输入参数id必填

boond_projects_simulation

Simulation financière d'un projet

Récupère la simulation financière (marge, CA, coûts, rentabilité) d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Chiffrage du projet. Lecture seule.

输入参数id必填

boond_projects_deliveries_groupments

Livraisons et groupements d'un projet

Récupère les livraisons et leurs groupements (lignes de mission facturables du projet) d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Liste des livraisons du projet. Les ID de livraison qui s'y trouvent sont ceux qu'exige une ligne de note de frais. Lecture seule.

输入参数id必填

boond_projects_orders

Bons de commande d'un projet

Récupère les bons de commande d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Liste des bons de commande adossés au projet. Lecture seule.

输入参数id必填

boond_projects_purchases

Achats d'un projet

Récupère les achats et la sous-traitance d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Liste des achats imputés au projet. Lecture seule.

输入参数id必填

boond_projects_productivity

Productivité d'un projet

Récupère les données de productivité (temps passé, jours consommés) d'un(e) projet, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_projects_get` pour la fiche de base, ou `boond_projects_search` si l'ID est inconnu. Returns : Consommé du projet — du réalisé, contrairement à `boond_projects_simulation`. Lecture seule.

输入参数id必填

boond_invoices_get

Détails d'un(e) facture

Récupère la fiche complète d'un(e) facture par son ID numérique. Quand : après un `boond_invoices_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_invoices_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_invoices_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_invoices_create

Créer un(e) facture

Crée un(e) facture dans BoondManager. Quand : pour ajouter un(e) facture inexistant(e). Plutôt que : `boond_invoices_update` pour modifier un enregistrement existant, et `boond_invoices_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数notestateorderIdtaxRatereferenceinvoiceDatepaymentMethodinvoiceRecordsinvoicePaymentsamountExcludingTaxexpectedPaymentDateperformedPaymentDate

boond_invoices_update

Modifier un(e) facture

Met à jour un(e) facture existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_invoices_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notestatetaxRatereferenceinvoiceDatepaymentMethodinvoiceRecordsinvoicePaymentsamountExcludingTaxexpectedPaymentDateperformedPaymentDate

boond_invoices_delete

Supprimer une facture

Supprime définitivement un(e) facture de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_invoices_get`. Plutôt que : `boond_invoices_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_invoices_information

Informations complètes d'une facture

Récupère les informations complètes (lignes facturées, coordonnées de facturation et bancaires, échéance, état d'envoi, commande et projet liés) d'un(e) facture, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_invoices_get` pour la fiche de base, ou `boond_invoices_search` si l'ID est inconnu. Returns : Fiche complète de la facture (relations société, contact, commande, projet, prestation incluses). Lecture seule.

输入参数id必填

boond_invoices_actions

Actions liées à une facture

Récupère les actions (envois, relances, notes) d'un(e) facture, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_invoices_get` pour la fiche de base, ou `boond_invoices_search` si l'ID est inconnu. - Un envoi de facture par e-mail apparaît ici comme une action, avec ses destinataires dans `text`. Returns : Liste des actions rattachées à la facture, la plus récente en premier. Lecture seule.

输入参数id必填

boond_orders_get

Détails d'un(e) bon de commande

Récupère la fiche complète d'un(e) bon de commande par son ID numérique. Quand : après un `boond_orders_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_orders_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_orders_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_orders_create

Créer un(e) bon de commande

Crée un(e) bon de commande dans BoondManager. Quand : pour ajouter un(e) bon de commande inexistant(e). Plutôt que : `boond_orders_update` pour modifier un enregistrement existant, et `boond_orders_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数notestateendDatecompanyIdorderDateprojectIdreferenceschedulesstartDatecustomerAgreementamountExcludingTax

boond_orders_update

Modifier un(e) bon de commande

Met à jour un(e) bon de commande existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_orders_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notestateendDateorderDatereferenceschedulesstartDatecustomerAgreementamountExcludingTax

boond_orders_delete

Supprimer un bon de commande

Supprime définitivement un(e) bon de commande de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_orders_get`. Plutôt que : `boond_orders_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_orders_information

Informations complètes d'un bon de commande

Récupère les informations complètes (période, conditions de paiement, références acheteur, prestations et projet liés) d'un(e) bon de commande, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_orders_get` pour la fiche de base, ou `boond_orders_search` si l'ID est inconnu. Returns : Fiche complète du bon de commande (relations société, contact, projet, prestations incluses). Lecture seule.

输入参数id必填

boond_orders_actions

Actions liées à un bon de commande

Récupère les actions (envois, relances, notes) d'un(e) bon de commande, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_orders_get` pour la fiche de base, ou `boond_orders_search` si l'ID est inconnu. Returns : Liste des actions rattachées au bon de commande. Lecture seule.

输入参数id必填

boond_orders_invoices

Factures d'un bon de commande

Récupère les factures émises (référence, période, état, montants HT/TTC) d'un(e) bon de commande, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_orders_get` pour la fiche de base, ou `boond_orders_search` si l'ID est inconnu. - C'est l'entrée de la préparation de facturation : `deltaInvoicedExcludingTax` > 0 signifie qu'il reste à facturer sur la commande. Returns : Liste des factures rattachées au bon de commande, précédée des totaux calculés par BoondManager : commandé HT, facturé HT/TTC, reste à facturer (`deltaInvoicedExcludingTax`) et répartition par état. Lecture seule.

输入参数id必填

boond_deliveries_create

Créer une prestation/livraison

Crée une prestation (livraison) rattachée à un projet et à une ressource. Quand : pour ouvrir la ligne de mission qui rendra la ressource facturable sur ce projet. Plutôt que : `boond_projects_deliveries_groupments` pour lister les prestations déjà en place sur le projet. - `project` et `resource` sont obligatoires et attendent des ID numériques. - L'ID de prestation retourné est celui qu'exigent les lignes de note de frais (`boond_expenses_create`). - Écriture non idempotente. Returns : confirmation et fiche de la prestation créée, avec son ID dans `structuredContent.id`.

输入参数notestatetitletypeOfendDatequantityprojectId必填startDateunitPriceresourceId必填averageDailyCostforceAverageDailyPriceExcludingTax

boond_deliveries_get

Détails d'une livraison / CRA

Récupère la fiche complète d'un(e) livraison (CRA) par son ID numérique. Quand : après un `boond_deliveries_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_deliveries_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_deliveries_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_deliveries_update

Modifier une prestation/livraison

Met à jour un(e) livraison (CRA) existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_deliveries_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notestatetitletypeOfendDatequantitystartDateunitPriceaverageDailyCost

boond_deliveries_delete

Supprimer une prestation/livraison

Supprime définitivement un(e) livraison (CRA) de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_deliveries_get`. Plutôt que : `boond_deliveries_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_absences_default

Référentiels d'une demande d'absence

Renvoie les types d'absence autorisés pour une ressource (RTT, maladie, congés payés… avec leur code) et les valeurs par défaut d'une demande. Quand : AVANT `boond_absences_create` — le code `workUnitTypeReference` n'est publié que par `GET /absences-reports/default` (ni dans `boond_application_dictionary`, ni sur l'agence). Plutôt que : `boond_timesheets_default` pour les mêmes codes vus du CRA (production comprise) ; aucun autre outil ne donne les types d'absence. - Lecture seule ; la réponse brute est réduite aux types (ressource incluse, `workUnitTypesAllowed`) et aux scalaires de la demande. Returns : texte : ressource, agence, types d'absence (reference | libellé | activityType), valeurs par défaut.

输入参数agencyIdresourceId必填

boond_absences_get

Details d'une absence

Récupère la fiche complète d'un(e) demande d'absence par son ID numérique. Quand : après un `boond_absences_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_absences_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_absences_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_absences_create

Creer une demande d'absence

Crée une demande d'absence (congés, RTT, maladie…) pour une ressource. Quand : pour poser une absence au nom d'une ressource identifiée par son ID. Plutôt que : `boond_absences_update` pour modifier une demande déjà déposée. - Le détail est porté par `absencesPeriods` ; si le tableau est omis, une période unique est déduite de `startDate`/`endDate`. - Pas de `state` : sur `/absences-reports` l'état est une chaîne du workflow de validation (`waitingForValidation`, `validated`…) que seul le workflow déplace — la demande part en attente de validation, elle n'est pas validée par cet appel (suivi via `boond_validations_search`). - Écriture non idempotente — l'API ne déduplique pas deux demandes sur les mêmes dates. Returns : confirmation et fiche de la demande créée.

输入参数notetypeOf必填endDate必填durationstartDate必填resourceId必填absencesPeriodsworkUnitTypeReference

boond_absences_update

Modifier une absence

Met à jour une demande d'absence existante, identifiée par son ID. Quand : pour corriger les dates, le motif ou le commentaire d'une demande déjà déposée. Plutôt que : `boond_absences_create` si la demande n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits. - `absencesPeriods` fait exception — le tableau fourni **remplace** l'intégralité des périodes existantes. Returns : confirmation et fiche mise à jour.

输入参数id必填noteendDatestartDate

boond_absences_delete

Supprimer une absence

Supprime définitivement un(e) demande d'absence de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_absences_get`. Plutôt que : `boond_absences_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_expenses_get

Détails d'un(e) note de frais

Récupère la fiche complète d'un(e) note de frais par son ID numérique. Quand : après un `boond_expenses_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_expenses_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_expenses_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_expenses_default

Références de saisie d'une note de frais

Retourne les référentiels nécessaires pour saisir une note de frais pour une ressource et un mois donnés : agence, devise et taux de change agence, **types de frais** (`reference` + libellé + taux de TVA), barèmes kilométriques, et couples projet / prestation imputables. Quand : systématiquement avant `boond_expenses_create` — c'est la seule source des codes de types de frais et des couples (projet, prestation) imputables. Plutôt que : rien d'autre : `boond_application_dictionary` ne publie aucune table de types de frais, et `/agencies/{id}` ne renvoie qu'un nom. Il n'existe pas de chemin alternatif. À appeler AVANT `boond_expenses_create` : les types de frais sont définis **par agence** et ne figurent pas dans `boond_application_dictionary`. Les ids `projectId` et `deliveryId` sont obligatoires sur chaque ligne et l'API refuse un couple qu'elle ne juge pas imputable sur ce mois. Returns: Les références à recopier dans `boond_expenses_create`.

输入参数term必填agencyIdresourceId必填

boond_expenses_create

Créer un(e) note de frais

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.

输入参数term必填advanceagencyIdresourceId必填actualExpensescurrencyAgencyexchangeRateAgencyinformationCommentsratePerKilometerTypeReference

boond_expenses_update

Modifier un(e) note de frais

Met à jour un(e) note de frais existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_expenses_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填closedadvanceactualExpensescurrencyAgencyexchangeRateAgencyinformationCommentsratePerKilometerTypeReference

boond_expenses_delete

Supprimer une note de frais

Supprime définitivement un(e) note de frais de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_expenses_get`. Plutôt que : `boond_expenses_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_products_get

Détails d'un(e) produit

Récupère la fiche complète d'un(e) produit par son ID numérique. Quand : après un `boond_products_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_products_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - `tab` cible un onglet précis (`information`, `technical-data`, `administrative`, `actions`…) ; sans `tab`, seule la fiche de base est renvoyée, pas la réunion des onglets. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_products_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填tab

boond_products_create

Créer un(e) produit

Crée un(e) produit dans BoondManager. Quand : pour ajouter un(e) produit inexistant(e). Plutôt que : `boond_products_update` pour modifier un enregistrement existant, et `boond_products_search` d'abord pour vérifier qu'il n'existe pas déjà. - Écriture réelle et non idempotente : deux appels identiques créent deux enregistrements (l'API ne déduplique pas). - Les ID de relations et les états/types sont des ID numériques BoondManager, à résoudre au préalable (recherches d'entités, `boond://dictionary/*`). Returns : confirmation, ID créé, et la fiche complète. `structuredContent.id` est réutilisable directement pour chaîner un appel.

输入参数name必填notestatetaxRatereferenceunitPrice

boond_products_update

Modifier un(e) produit

Met à jour un(e) produit existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_products_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填namenotestatetaxRatereferenceunitPrice

boond_products_delete

Supprimer un(e) produit

Supprime définitivement un(e) produit de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_products_get`. Plutôt que : `boond_products_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_positionings_get

Détails d'un positionnement

Récupère la fiche complète d'un(e) positionnement par son ID numérique. Quand : après un `boond_positionings_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_positionings_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_positionings_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_positionings_create

Créer un positionnement

Crée un positionnement : place un candidat ou une ressource sur une opportunité ou un projet. Quand : pour matérialiser une proposition de profil au client. Plutôt que : `boond_positionings_update` pour faire avancer l'état d'un positionnement existant (proposé → retenu → refusé) plutôt que d'en créer un second. - Écriture non idempotente : rien n'empêche deux positionnements du même profil sur la même affaire. - L'état est un ID entier du dictionnaire (`boond://dictionary/states/positionings`), pas un libellé. Returns : confirmation et fiche du positionnement créé.

输入参数notestateendDateprojectIdstartDateresourceIdcandidateIdopportunityId

boond_positionings_update

Modifier un positionnement

Met à jour un positionnement existant dans BoondManager (PUT /positionings/{id}). Seuls les champs fournis sont modifiés ; `stateReasonTypeOf` / `stateReasonDetail` sont repliés en `stateReason: { typeOf, detail }`. Quand : pour faire avancer l'état d'un positionnement (proposé → retenu → refusé). Plutôt que : `boond_positionings_create` si le positionnement n'existe pas encore. Returns: Données mises à jour du positionnement.

输入参数id必填stateendDatestartDatestateReasonDetailstateReasonTypeOfinformationComments

boond_positionings_delete

Supprimer un positionnement

Supprime définitivement un(e) positionnement de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_positionings_get`. Plutôt que : `boond_positionings_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_payments_create

Créer un paiement

Enregistre un paiement / règlement fournisseur adossé à un achat. Quand : pour solder tout ou partie d'un achat existant. Plutôt que : `boond_purchases_create` si l'achat lui-même n'existe pas encore — un paiement ne peut pas être orphelin. - L'API `/payments` **exige** une relation `purchase` : sans ID d'achat valide, l'appel est refusé. - Écriture non idempotente : deux appels identiques enregistrent deux règlements. Returns : confirmation et fiche du paiement créé, avec son ID dans `structuredContent.id`.

输入参数notestateamountendDatetaxRatesreferencestartDatepurchaseId必填paymentDateexpectedDatepaymentMethodperformedDate另有 1 个

boond_payments_get

Détails d'un(e) paiement

Récupère la fiche complète d'un(e) paiement par son ID numérique. Quand : après un `boond_payments_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_payments_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_payments_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_payments_update

Modifier un(e) paiement

Met à jour un(e) paiement existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_payments_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notestateamountendDatetaxRatesreferencestartDatepaymentDateexpectedDatepaymentMethodperformedDate另有 2 个

boond_payments_delete

Supprimer un(e) paiement

Supprime définitivement un(e) paiement de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_payments_get`. Plutôt que : `boond_payments_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_advantages_default

Référentiels d'un avantage

Renvoie les valeurs par défaut d'un avantage pour une ressource (types d'avantage de l'agence, montants pré-remplis, devise) avant sa création. Quand : AVANT `boond_advantages_create` — les types (`advantageType`) et leurs quotas viennent de là. Plutôt que : `boond_advantages_search` pour les avantages déjà attribués à la ressource. - Lecture seule (`GET /advantages/default`) ; la réponse est rendue telle quelle. Returns : JSON de l'avantage vide pré-rempli, avec les types d'avantage inclus.

输入参数projectIdcontractIddeliveryIdresourceId必填

boond_advantages_create

Créer un avantage

Attribue un avantage (tickets restaurant, mutuelle, véhicule, prime…) à une ressource. Quand : après `boond_advantages_default` pour connaître les types et montants de l'agence. Plutôt que : `boond_advantages_search` d'abord : l'API ne déduplique pas. - Corps déduit de `models.advantage` (`date`, `quantity`, `advantageType`, montants, relations `resource` / `contract` / `project` / `delivery`) — non éprouvé sur un tenant de test. - Écriture non idempotente. Returns : confirmation et ID de l'avantage (`structuredContent.id`).

输入参数date必填notequantityprojectIdcontractIddeliveryIdresourceId必填returnDateagencyAmountadvantageType必填employeeAmountparticipationAmount

boond_advantages_get

Détails d'un avantage

Récupère la fiche complète d'un(e) avantage par son ID numérique. Quand : après un `boond_advantages_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_advantages_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_advantages_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_find

Résoudre un nom ou un e-mail en ID

Résout un libellé (« Jean Dupont », « ACME », un intitulé de projet) ou un e-mail en ID BoondManager, pour un candidat, une ressource, un contact, une société, une opportunité ou un projet. Quand : dès qu'une demande nomme une entité sans donner son ID — avant un `_get`, un `_update`, un onglet ou un filtre `perimeterManagers` / `companyId`. Plutôt que : le `*_search` du domaine quand il faut une liste filtrée (états, périmètre, pagination) plutôt qu'une résolution. - Choisit le champ à interroger : `fullName` (essayé dans les deux ordres, l'API attend `NOM#PRENOM`) puis texte libre pour les personnes, `name` pour les sociétés, `emails` quand `email` est fourni ; au plus 10 résultats. - Ne tranche jamais entre homonymes : plusieurs correspondances exactes → `isError` avec la liste (ID + détail) à soumettre à l'utilisateur ; une seule → `structuredContent.match.id`. - Aucune correspondance exacte mais des résultats proches → la liste est renvoyée sans `match` : confirmer avec l'utilisateur avant d'utiliser un ID. Returns : `{ entity, query, count, match?, ambiguous?, items[{ id, label, detail?, exact }] }` et le même contenu en texte. Lecture seule.

输入参数emailquery必填entity必填

boond_rights_get

Droits de l'utilisateur sur un enregistrement

Renvoie les droits de l'utilisateur authentifié sur un enregistrement précis (lecture, écriture, suppression, actions du workflow…), tels que BoondManager les publie sur `GET /{entité}/{id}/rights`. Quand : avant un `*_update` ou un `*_delete` dont l'issue est incertaine (fiche d'une autre agence, document validé, facture clôturée) — un 403 évité coûte moins qu'un 403 expliqué. Plutôt que : `boond://application/current-user/rights` pour les droits *globaux* par entité (création, périmètre) ; cet outil est le droit sur **un** enregistrement. - Lecture seule ; le payload est rendu tel quel — les clés varient selon l'entité (`canWrite`, `canDelete`, `canValidate`…) et n'ont pas été normalisées, la RAML ne les documente pas. - Les entités proposées suivent la politique d'accès du serveur. Returns : JSON des droits sur l'enregistrement.

输入参数id必填entity必填

boond_application_dictionary

Récupérer un dictionnaire BoondManager

Récupère un dictionnaire de référence BoondManager (états, types, pays, devises, langues, outils, expertises, ...). Quand : pour traduire un état ou un type BoondManager entre son ID entier et son libellé, avant de filtrer une recherche. Plutôt que : les ressources `boond://dictionary/*` pour les tables courantes (états, typeOf, pays, devises, langues) : même contenu par un `resources/read`, sans consommer un appel d'outil. Cet outil reste nécessaire pour les tables non publiées en ressource. L'API expose un seul endpoint `/application/dictionary` qui renvoie tout — le serveur le cache (TTL 1h, configurable via `BOOND_DICTIONARY_TTL_MS`) et extrait un sous-arbre par chemin dotté. Chemins usuels de `dictionaryType` (relatifs à `data`) : - "setting.state.{resource,candidate,contact,company,opportunity,project,invoice,order,positioning}" → états par entité - "setting.typeOf.{resource,contact,project}" → types par entité - "setting.action.{candidate,resource,opportunity,project,...}" → actions disponibles - "setting.tool" → outils / technos (Java, AWS...) - "setting.expertiseArea" → domaines d'expertise - "setting.experience" → niveaux d'expérience - "setting.languageSpoken" → langues parlées - "setting.activityArea" → secteurs d'activité - "setting.mobilityArea" → mobilités géographiques - "setting.currency" → devises - "setting.civility" → civilités - "country" → pays - "languages" → langues d'interface (fr, en, es) Note : l'ancienne forme "states/resources" (slash) n'est pas valide — utilisez "setting.state.resource". Returns : le sous-arbre demandé (souvent un tableau `{id, value, …}`), ou `isError: true` avec le chemin fautif s'il est introuvable.

输入参数dictionaryType必填

boond_application_current_user

Utilisateur courant BoondManager

Récupère les informations de l'utilisateur actuellement connecté à l'API BoondManager (profil, permissions, agence...). Quand : en début de session, pour connaître l'identité, l'agence et le périmètre du compte utilisé — donc ce que « mes données » désigne. Plutôt que : la ressource `boond://application/current-user`, identique et moins coûteuse ; et `boond_resources_search` pour quelqu'un d'autre que le titulaire du compte, cet outil ne prenant aucun paramètre. Returns: Données JSON de l'utilisateur courant.

无需输入参数。

boond_contracts_get

Détails d'un contrat

Récupère la fiche complète d'un contrat de travail par son ID numérique. Quand : après `boond_contracts_search` ou `boond_resources_contracts`, qui listent les contrats avec leurs IDs. Plutôt que : `boond_resources_contracts` pour tous les contrats d'une ressource en un appel — cet outil n'accepte pas de nom. - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir d'une liste de contrats, jamais d'une supposition. Returns : JSON du contrat (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_contracts_create

Créer un contrat

Crée un contrat de travail rattaché à une ressource. Quand : pour enregistrer un nouveau contrat (embauche, avenant, renouvellement). Plutôt que : `boond_resources_contracts` d'abord, pour vérifier qu'un contrat couvrant la même période n'existe pas déjà. - Écriture non idempotente : deux appels identiques créent deux contrats. - `typeOf` est un ID entier de `boond://dictionary/typeOf/contracts`, pas un libellé. Returns : confirmation et fiche du contrat créé, avec son ID dans `structuredContent.id`.

输入参数notetypeOfendDatestartDateresourceId

boond_contracts_update

Modifier un(e) contrat

Met à jour un(e) contrat existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_contracts_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notetypeOfendDateendReasonstartDateannualSalarymonthlySalaryprobationEndDatenumberOfWorkingDaysrenewalProbationEndDate

boond_purchases_get

Détails d'un achat/sous-traitance

Récupère la fiche complète d'un(e) achat par son ID numérique. Quand : après un `boond_purchases_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_purchases_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_purchases_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_purchases_create

Créer un achat/sous-traitance

Crée un achat ou une ligne de sous-traitance. Quand : pour engager une dépense fournisseur, généralement rattachée à un projet. Plutôt que : `boond_provider_invoices_create` pour la facture reçue du fournisseur — l'achat est l'engagement, la facture fournisseur en est le règlement attendu. - Écriture non idempotente. - Les ID de société, contact et projet sont des ID numériques BoondManager, à résoudre au préalable via les recherches correspondantes. Returns : confirmation et fiche de l'achat créé, avec son ID dans `structuredContent.id`.

输入参数notestatetitleendDatecompanyIdcontactIdprojectIdstartDate

boond_purchases_update

Modifier un achat/sous-traitance

Met à jour un(e) achat existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_purchases_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填notestatetitletypeOfendDatetaxRatequantitycompanyIdcontactIdprojectIdstartDate另有 3 个

boond_purchases_delete

Supprimer un achat/sous-traitance

Supprime définitivement un achat / sous-traitance de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_purchases_get`. Plutôt que : `boond_purchases_update` pour corriger un montant, une période ou un état — vérifier avec `boond_payments_search` (`purchaseId`) qu'aucun règlement n'y est adossé avant de détruire. - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_purchases_information

Informations complètes d'un achat/sous-traitance

Récupère les informations complètes (période, quantité, montants, taux de TVA, conditions de paiement, ressource, projet et prestation liés) d'un(e) achat, par son ID. Quand : pour ne charger que cette section, sans le reste de la fiche. Plutôt que : `boond_purchases_get` pour la fiche de base, ou `boond_purchases_search` si l'ID est inconnu. Returns : Fiche complète de l'achat (relations ressource, agence, projet, prestation incluses). Lecture seule.

输入参数id必填

boond_provider_invoices_create

Créer une facture fournisseur

Crée une facture fournisseur (facture reçue d'un prestataire). Quand : pour enregistrer la facture émise par un sous-traitant. Plutôt que : `boond_invoices_create` pour une facture de vente adressée à un client — les deux sens ne partagent pas d'endpoint. - `resource`, `providerCompany` et `providerContact` sont attendus sous forme d'ID numériques. - Écriture non idempotente. Returns : confirmation et fiche de la facture fournisseur créée, avec son ID dans `structuredContent.id`.

输入参数stateendDate必填currencycompanyIdcontactIdreference必填startDate必填resourceId必填invoiceDateexchangeRatecurrencyAgencyamountExcludingTax另有 2 个

boond_provider_invoices_get

Détails d'une facture fournisseur

Récupère la fiche complète d'un(e) facture fournisseur par son ID numérique. Quand : après un `boond_provider_invoices_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_provider_invoices_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_provider_invoices_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_provider_invoices_update

Modifier une facture fournisseur

Met à jour un(e) facture fournisseur existant(e), identifié(e) par son ID. Quand : pour modifier quelques champs d'un enregistrement déjà en base. Plutôt que : `boond_provider_invoices_create` si l'enregistrement n'existe pas encore. - Mise à jour partielle : seuls les champs fournis sont écrits, les autres sont laissés en place. - Attention aux champs de type tableau, qui sont **remplacés** et non fusionnés. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). Returns : confirmation et fiche mise à jour.

输入参数id必填statedueDateendDatepaidDatereferencestartDateinvoiceDateamountExcludingTaxamountIncludingTax

boond_provider_invoices_delete

Supprimer une facture fournisseur

Supprime définitivement un(e) facture fournisseur de BoondManager. Quand : uniquement sur demande explicite de l'utilisateur, et après avoir vérifié l'ID avec `boond_provider_invoices_get`. Plutôt que : `boond_provider_invoices_update` pour désactiver ou changer l'état d'un enregistrement sans le détruire — c'est presque toujours l'intention réelle. - `boond_rights_get` dit si l'utilisateur a ce droit sur l'enregistrement avant d'essayer (un 403 évité). - ⚠️ Irréversible, sans corbeille côté API. - Si le client MCP annonce la capacité `elicitation`, une confirmation est demandée à l'utilisateur final et un refus annule l'appel (`structuredContent.deleted: false` + `reason`) ; sinon la suppression part directement. Returns : `{ id, deleted, reason? }` — vérifier `deleted`, qui vaut `false` en cas de refus utilisateur.

输入参数id必填

boond_accounts_get

Détails d'un(e) compte utilisateur

Récupère la fiche complète d'un(e) compte utilisateur par son ID numérique. Quand : après un `boond_accounts_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_accounts_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_accounts_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_agencies_get

Détails d'un(e) agence

Récupère la fiche complète d'un(e) agence par son ID numérique. Quand : après un `boond_agencies_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_agencies_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_agencies_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_business_units_get

Détails d'un(e) business unit

Récupère la fiche complète d'un(e) business unit par son ID numérique. Quand : après un `boond_business_units_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_business_units_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_business_units_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_roles_get

Détails d'un(e) rôle

Récupère la fiche complète d'un(e) rôle par son ID numérique. Quand : après un `boond_roles_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_roles_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_roles_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_logs_get

Détails d'un(e) log

Récupère la fiche complète d'un(e) log par son ID numérique. Quand : après un `boond_logs_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_logs_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_logs_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_notifications_get

Détails d'une notification

Récupère la fiche complète d'un(e) notification par son ID numérique. Quand : après un `boond_notifications_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_notifications_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_notifications_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_threads_get

Détails d'un(e) fil de discussion

Récupère la fiche complète d'un(e) fil de discussion par son ID numérique. Quand : après un `boond_threads_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_threads_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_threads_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_todolists_get

Détails d'un(e) todolist

Récupère la fiche complète d'un(e) todolist par son ID numérique. Quand : après un `boond_todolists_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_todolists_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_todolists_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_todolists_create

Créer une todolist

Crée une todolist (modèle de tâches) avec ses tâches ordonnées, applicable à un type de fiche. Quand : pour définir une checklist réutilisable (onboarding consultant, préparation de facturation…). Plutôt que : `boond_todolists_search` d'abord : l'API ne déduplique pas les titres. - Corps déduit de `models.todolist` (`title`, `profile`, `profileTypesOf`, `profileStates`, `tasks[]`, relation `agencies`) — non éprouvé sur un tenant de test. - Les tâches d'une fiche (`boond_tasks_get`) ne se créent pas ici : aucune route de création de tâche n'est documentée. Returns : confirmation et ID de la todolist (`structuredContent.id`).

输入参数tasks必填title必填profileagencyIdsprofileStatesprofileTypesOf

boond_tasks_get

Tâches d'un enregistrement

Liste les tâches (todolist instanciée) d'un candidat, d'une ressource, d'un contact, d'une société, d'une opportunité, d'un projet, d'une commande, d'un produit, d'un achat, d'un positionnement, d'une facture, d'un contrat, d'une prestation ou d'un paiement. Quand : pour voir où en est la checklist d'une fiche (tâches faites / à faire, validées par qui). Plutôt que : `boond_actions_search` pour les rappels datés — une tâche est un item de checklist, une action un événement daté. Aucune route de création de tâche n'est documentée par l'API. Returns : les tâches (`description`, `state`, `row`, `validatedAt`, `validatedBy`, sous-tâches). Lecture seule.

输入参数id必填entity必填

boond_flags_get

Détails d'un(e) drapeau

Récupère la fiche complète d'un(e) drapeau par son ID numérique. Quand : après un `boond_flags_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_flags_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_flags_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_flags_create

Créer un drapeau

Crée un drapeau (tag) réutilisable — « vivier Java Q4 », « à rappeler », « VIP ». Quand : avant `boond_flags_attach` quand aucun drapeau existant ne convient (`boond_flags_search` d'abord). Plutôt que : `boond_flags_attach` pour poser un drapeau existant sur un enregistrement. - Écriture non idempotente : deux appels créent deux drapeaux homonymes. - Corps déduit de `models.flag` (`name`, `mainManager`) — non éprouvé sur un tenant de test. Returns : confirmation et ID du drapeau (`structuredContent.id`).

输入参数name必填mainManagerId

boond_flags_attached

Drapeaux posés sur un enregistrement

Liste les drapeaux (tags) posés sur un candidat, une ressource, un contact, une société, une opportunité, un projet, une commande, un produit, un achat, une action, un positionnement ou une facture. Quand : pour savoir comment un enregistrement est tagué avant d'ajouter ou retirer un drapeau. Plutôt que : `boond_flags_search` pour le catalogue des drapeaux existants (pas leurs rattachements). Returns : une ligne par drapeau posé (`GET /{entité}/{id}/attached-flags`). Lecture seule.

输入参数id必填entity必填

boond_flags_attach

Poser un drapeau sur un enregistrement

Pose un drapeau existant sur un enregistrement (tagging) — `POST /attached-flags`. Quand : pour marquer un lot de fiches après un tri (« ces 12 candidats → vivier Java Q4 ») : un appel par fiche. Plutôt que : `boond_flags_create` si le drapeau n'existe pas encore ; `boond_flags_detach` pour le retirer. - Corps JSON:API `{ relationships: { flag, dependsOn } }` déduit du modèle — la RAML ne documente que la route ; non éprouvé sur un tenant de test. - Idempotent côté intention : reposer un drapeau déjà présent ne doit rien changer. Returns : `{ entity, id, flagId, attached: true }`.

输入参数id必填entity必填flagId必填

boond_flags_detach

Retirer un drapeau d'un enregistrement

Retire un drapeau d'un enregistrement — `DELETE /attached-flags?flag=&<entité>=` (route et paramètres documentés dans la RAML). Quand : pour dé-taguer une fiche ; réversible par `boond_flags_attach`, le drapeau lui-même n'est pas supprimé. Plutôt que : aucun outil ne supprime un drapeau du catalogue : un drapeau se retire fiche par fiche. - Idempotent : retirer un drapeau absent n'échoue pas côté intention (l'erreur API éventuelle est remontée telle quelle). Returns : `{ entity, id, flagId, attached: false }`.

输入参数id必填entity必填flagId必填

boond_calendars_get

Détails d'un(e) calendrier

Récupère la fiche complète d'un(e) calendrier par son ID numérique. Quand : après un `boond_calendars_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_calendars_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_calendars_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_webhooks_get

Détails d'un(e) webhook

Récupère la fiche complète d'un(e) webhook par son ID numérique. Quand : après un `boond_webhooks_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_webhooks_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_webhooks_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_validations_get

Détails d'une validation

Récupère la fiche complète d'un(e) validation par son ID numérique. Quand : après un `boond_validations_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_validations_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_validations_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_validations_update

Valider ou refuser un CRA / une note de frais / une absence

Approuve (`validate`) ou refuse (`reject`) une validation en attente : CRA, note de frais ou demande d'absence. Quand : après `boond_validations_search` (`validationStates: ["waitingForValidation"]`) et l'examen du document (`boond_timesheets_get`, `boond_expenses_get`, `boond_absences_get`). Plutôt que : `boond_validations_get` pour relire la validation avant de décider ; il n'existe pas d'autre chemin d'écriture sur le workflow de validation (`state` n'est pas un champ des CRA / notes / absences). - `PUT /validations/{id}` avec `state: validated | rejected` (le vocabulaire de `validationStates`) et `reason`. Route déduite du modèle `validation` et non éprouvée sur un tenant de test : un 404 / 405 doit être remonté tel quel. - Un **refus** demande une confirmation à l'utilisateur final si le client MCP déclare la capacité `elicitation` (désactivable par `BOOND_MCP_CONFIRM_REJECT=0`) ; un refus de confirmer renvoie `decided: false` sans appel API. - Idempotent : rejouer la même décision renvoie le même état. Returns : `{ id, decided, state, documentType, documentId, reason? }` et la fiche de la validation mise à jour.

输入参数id必填reasondecision必填

boond_poles_get

Détails d'un(e) pôle

Récupère la fiche complète d'un(e) pôle par son ID numérique. Quand : après un `boond_poles_search`, pour obtenir les attributs qui n'apparaissent pas dans le résumé de liste. Plutôt que : `boond_poles_search` si l'ID n'est pas connu (cet outil n'accepte pas de nom). - Un ID inconnu remonte l'erreur BoondManager telle quelle — l'ID doit venir de `boond_poles_search`, jamais d'une supposition. Returns : JSON de l'entité (attributs + relations) tel que renvoyé par l'API. Lecture seule.

输入参数id必填

boond_reporting_companies

Reporting sociétés

Reporting des sociétés (CA, marge, activité...). Quand : pour obtenir des agrégats (CA, marge, taux, volumes) sur un périmètre et une période. Plutôt que : `boond_companies_search` pour la liste des enregistrements eux-mêmes : ce reporting renvoie des totaux calculés, pas les lignes qui les composent. Filtres clés : périmètre (`perimeterDynamic` / `perimeterManagers` / `perimeterAgencies`…), période (`period`, `periodDynamic`), companiesStates, companies, maxCompanies, showPercentage. - ⚠️ `startDate` + `endDate` (YYYY-MM-DD) sont REQUIS : l'API répond 422 sans eux. - Sans filtre de périmètre, l'agrégation porte sur **tout** le périmètre autorisé du compte — un total « entreprise » là où l'utilisateur attendait souvent son équipe. - Les états et types sont des ID entiers du dictionnaire (`boond_application_dictionary`), pas des libellés. - Une agrégation large peut durer plusieurs dizaines de secondes ; l'avancement est signalé via `notifications/progress` quand le client fournit un `progressToken`. Returns : tableau d'indicateurs agrégés, rendu en texte. Lecture seule. - Pagination : `pageSize` 1–500 (défaut 30), `page` 1–100 — au-delà : refus, affiner les filtres.

输入参数pageendDate必填keywordspageSizeuseCachecompaniesstartDate必填scorecardsmaxCompaniesperiodDynamicperimeterPolesshowPercentage另有 7 个

boond_reporting_projects

Reporting projets

Reporting des projets (CA, marge, rentabilité...). Quand : pour obtenir des agrégats (CA, marge, taux, volumes) sur un périmètre et une période. Plutôt que : `boond_projects_search` pour la liste des enregistrements eux-mêmes : ce reporting renvoie des totaux calculés, pas les lignes qui les composent. Filtres clés : périmètre (`perimeterDynamic` / `perimeterManagers` / `perimeterAgencies`…), période (`period`, `periodDynamic`), projectTypes, projectStates, resources, projects, contacts, companies, maxProjects. - Sans filtre de périmètre, l'agrégation porte sur **tout** le périmètre autorisé du compte — un total « entreprise » là où l'utilisateur attendait souvent son équipe. - Les états et types sont des ID entiers du dictionnaire (`boond_application_dictionary`), pas des libellés. - Une agrégation large peut durer plusieurs dizaines de secondes ; l'avancement est signalé via `notifications/progress` quand le client fournit un `progressToken`. Returns : tableau d'indicateurs agrégés, rendu en texte. Lecture seule. - Pagination : `pageSize` 1–500 (défaut 30), `page` 1–100 — au-delà : refus, affiner les filtres.

输入参数pageendDatecontactskeywordspageSizeprojectsuseCachecompaniesresourcesstartDatescorecardsmaxProjects另有 10 个

boond_reporting_resources

Reporting ressources

Reporting des ressources (taux d'occupation, CA, productivité...). Quand : pour obtenir des agrégats (CA, marge, taux, volumes) sur un périmètre et une période. Plutôt que : `boond_resources_search` pour la liste des enregistrements eux-mêmes : ce reporting renvoie des totaux calculés, pas les lignes qui les composent. Filtres clés : périmètre (`perimeterDynamic` / `perimeterManagers` / `perimeterAgencies`…), période (`period`, `periodDynamic`), reportingCategory, resourceTypes, resourceStates, period, resources/projects/contacts/companies, maxResources. - Sans filtre de périmètre, l'agrégation porte sur **tout** le périmètre autorisé du compte — un total « entreprise » là où l'utilisateur attendait souvent son équipe. - Les états et types sont des ID entiers du dictionnaire (`boond_application_dictionary`), pas des libellés. - Une agrégation large peut durer plusieurs dizaines de secondes ; l'avancement est signalé via `notifications/progress` quand le client fournit un `progressToken`. Returns : tableau d'indicateurs agrégés, rendu en texte. Lecture seule. - Pagination : `pageSize` 1–500 (défaut 30), `page` 1–100 — au-delà : refus, affiner les filtres.

输入参数pageperiodendDatecontactskeywordspageSizeprojectsuseCachecompaniesresourcesstartDatescorecards另有 12 个

boond_reporting_synthesis

Reporting synthèse

Reporting de synthèse globale (commercial, RH, recrutement, facturation...). Quand : pour obtenir des agrégats (CA, marge, taux, volumes) sur un périmètre et une période. Plutôt que : un `boond_reporting_*` plus ciblé (sociétés, projets, ressources) pour la liste des enregistrements eux-mêmes : ce reporting renvoie des totaux calculés, pas les lignes qui les composent. Filtres clés : périmètre (`perimeterDynamic` / `perimeterManagers` / `perimeterAgencies`…), période (`period`, `periodDynamic`), reportingType, reportingCategory, period, resources/projects/contacts/companies, compareIndicators. - ⚠️ `startDate` + `endDate` (YYYY-MM-DD) sont REQUIS : l'API répond 422 sans eux. - Sans filtre de périmètre, l'agrégation porte sur **tout** le périmètre autorisé du compte — un total « entreprise » là où l'utilisateur attendait souvent son équipe. - Les états et types sont des ID entiers du dictionnaire (`boond_application_dictionary`), pas des libellés. - Une agrégation large peut durer plusieurs dizaines de secondes ; l'avancement est signalé via `notifications/progress` quand le client fournit un `progressToken`. Returns : tableau d'indicateurs agrégés, rendu en texte. Lecture seule. - Pagination : `pageSize` 1–500 (défaut 30), `page` 1–100 — au-delà : refus, affiner les filtres.

输入参数pageperiodendDatecontactskeywordspageSizeprojectsuseCachecompaniesresourcesstartDate必填scorecards另有 12 个

boond_reporting_production_plans

Reporting plans de production

Reporting des plans de production (disponibilités, positionnements...). Quand : pour obtenir des agrégats (CA, marge, taux, volumes) sur un périmètre et une période. Plutôt que : `boond_positionings_search` pour la liste des enregistrements eux-mêmes : ce reporting renvoie des totaux calculés, pas les lignes qui les composent. Filtres clés : périmètre (`perimeterDynamic` / `perimeterManagers` / `perimeterAgencies`…), période (`period`, `periodDynamic`), resourceTypes, resourceStates, positioningStates, positioningPeriod, showContracts, projects/contacts/companies. - ⚠️ `startDate` + `endDate` (YYYY-MM-DD) sont REQUIS : l'API répond 422 sans eux. - Sans filtre de périmètre, l'agrégation porte sur **tout** le périmètre autorisé du compte — un total « entreprise » là où l'utilisateur attendait souvent son équipe. - Les états et types sont des ID entiers du dictionnaire (`boond_application_dictionary`), pas des libellés. - Une agrégation large peut durer plusieurs dizaines de secondes ; l'avancement est signalé via `notifications/progress` quand le client fournit un `progressToken`. Returns : tableau d'indicateurs agrégés, rendu en texte. Lecture seule. - Pagination : `pageSize` 1–500 (défaut 30), `page` 1–100 — au-delà : refus, affiner les filtres.

输入参数pageendDate必填contactskeywordspageSizeprojectsuseCachecompaniesstartDate必填scorecardsperiodDynamicresourceTypes另有 11 个

boond_inactivities_default

Référentiels d'une période d'inactivité

Renvoie les valeurs par défaut d'une période d'inactivité (intercontrat, formation, congé sans solde…) pour une ressource : types d'inactivité, coût journalier retenu, contrat en cours. Quand : AVANT `boond_inactivities_create` — le type d'inactivité n'est publié que là. Plutôt que : `boond_resources_get` pour la fiche de la ressource ; `boond_reporting_resources` pour le taux d'occupation agrégé. - Lecture seule (`GET /inactivities/default?resource=`) ; la réponse est rendue telle quelle. Returns : JSON de l'inactivité vide pré-remplie, avec les types inclus.

输入参数resourceId必填

版本历史

7
  1. v2.19.3最新Nov 14, 2026
  2. v2.19.2Oct 26, 2026
  3. v2.19.1Oct 8, 2026
  4. v2.19.0Oct 2, 2026
  5. v2.18.0Oct 1, 2026
  6. v2.17.0Sep 26, 2026
  7. v2.16.0Sep 25, 2026

评分

已满足适用检查项的 80%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。