Skip to main content
Glama

Fulfiller — print catalogue & quotes

Server Details

Print catalogue and live quotes from Fulfiller, a French online printer shipping across the EU.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 51 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A4.3/5.0

Scored across 11 tools

Disambiguation5/5

Each tool targets a distinct resource+action, and the descriptions actively carve out boundaries (e.g. search_products vs resolve_product = approximate vs exact; get_product_configuration vs validate_selection = options without dependencies vs dependencies via enabledOptions; quote_product vs quote_by_quantity = single selection vs tier grid). The cart tools are cleanly separated (create/get/update/delete), with explicit guidance on when NOT to call get_cart. No two tools appear to do the same thing.

Naming Consistency5/5

All 11 tools follow a predictable snake_case verb_noun pattern (create_cart, get_cart, update_cart, delete_cart, get_product_details, quote_product, resolve_product, search_products, validate_selection). Verbs map coherently to intent (get_ for reads, quote_ for pricing, validate_ for checks). No mixing of conventions.

Tool Count5/5

11 tools is well within the ideal 3-15 range and each earns its place: search/resolve entry, two read tools for product data, two quoting tools, one validator, and four cart operations. No redundant or filler tools given the catalogue+quote+cart scope.

Completeness4/5

Cart lifecycle is complete (create, get, update with add/remove/update, delete) and the quote surface covers both single and multi-tier pricing plus validation and product resolution. The main gap is that the catalogue is only reachable via full-text search — there is no browse/list-category endpoint — and there is no order conversion, though the latter is arguably outside the stated 'catalogue & quotes' purpose.

Available Tools

11 tools
create_cartCréer un panierAInspect

Crée un panier anonyme, éventuellement avec ses premières lignes (cotées à l’ajout, prix FIGÉ). Un panier n’est PAS une commande : rien n’est engagé, et le total est HT — hors TVA et hors port. Chaque ligne désigne le produit par son productId (rendu par search_products) ; le sku est facultatif. unitPriceHt et lineTotalHt sont promotion déduite. Renvoie le panier complet : n’appelez pas get_cart juste après.

NameRequiredDescriptionDefault
linesNoLignes initiales (0 à 5). Un panier vide est légitime.
idempotencyKeyNoUUID optionnel. Rejouer le MÊME appel avec la même clé renvoie le panier déjà créé au lieu d’en créer un second : à utiliser si vous devez réessayer après une erreur.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only declare it is a non-read, non-destructive, closed-world write. The description adds substantial behavior the annotations cannot convey: prices are frozen at add time, promotions already deducted, totals are HT excluding VAT and shipping, and nothing is committed. The return-shape note ('renvoie le panier complet') closes the loop.

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

Conciseness4/5

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

Front-loaded with the action, then the critical caveats (not an order, HT pricing, frozen price), then a routing instruction. Dense but nearly every clause carries needed information; only the pricing-field mention slights toward restating output fields.

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

Completeness4/5

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

No output schema, and the description compensates by stating that the complete cart is returned so no follow-up get_cart is needed. Idempotent retry behavior is covered by the schema's idempotencyKey description. Adequate for a mutation tool with optional parameters.

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

Parameters3/5

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

Schema description coverage is 100% and the nested properties are already documented in rich detail (sku optionality, PRODUCT_AMBIGUOUS, quantity semantics, selection shape). The description mostly restates provenance (productId from search_products, sku facultatif) rather than adding new semantics, so the baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Crée un panier anonyme') plus optional initial lines, and immediately disambiguates the concept from an order ('Un panier n'est PAS une commande'). An agent can distinguish this from get_cart/update_cart/delete_cart without opening a schema.

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

Usage Guidelines4/5

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

Gives a concrete when-not ('n'appelez pas get_cart juste après'), points to the sibling that supplies productId (search_products), and hints at re-quoting via quote_product when volume changes. It does not explicitly say when to prefer this over update_cart, but the context is clear.

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

delete_cartSupprimer un panierA
Destructive
Inspect

Supprime DÉFINITIVEMENT un panier et toutes ses lignes. Irréversible. Pour retirer une seule ligne, utilisez update_cart avec remove.

NameRequiredDescriptionDefault
cartIdYesIdentifiant du panier (UUID) rendu par create_cart. C’est une CAPACITÉ : qui le détient accède au panier — ne le publiez pas hors de la conversation qui l’a créé.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds useful behavioral context beyond that: deletion is permanent, irreversible, and removes all cart lines. It does not cover permissions or error behavior, but the critical destructive scope is made explicit.

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

Conciseness5/5

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

Three short sentences, front-loaded with the irreversible effect and followed by the alternative. Every sentence earns its place with no redundant text.

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

Completeness5/5

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

For a destructive one-parameter tool with full schema coverage and annotations covering safety, the description is complete enough. It communicates scope, irreversibility, and the correct alternative tool; no output schema is present, so return values need not be described.

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

Parameters3/5

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

Schema description coverage is 100%, so the cartId parameter is already fully documented, including UUID source and capability warning. The description adds no additional parameter semantics, which is acceptable given the high schema coverage baseline of 3.

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

Purpose5/5

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

The description states a specific verb and resource: 'Supprime DÉFINITIVEMENT un panier et toutes ses lignes.' It also distinguishes the tool from its sibling update_cart by naming the single-line alternative. An agent can immediately tell this is full-cart deletion, not line-level editing.

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

Usage Guidelines5/5

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

It explicitly routes the agent to the correct sibling: 'Pour retirer une seule ligne, utilisez update_cart avec `remove`.' This gives a clear condition for using delete_cart (whole cart) versus update_cart (single line). No ambiguity remains.

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

get_cartLire un panierA
Read-only
Inspect

Renvoie le panier tel que FIGÉ à l’ajout : aucune re-cotation à la lecture. pricedAt par ligne et expiresAt donnent l’âge des prix — au-delà, re-cotez avec quote_product. Sert à RELIRE un panier existant (plus tard dans la conversation, ou quand l’utilisateur demande à le revoir) : inutile juste après create_cart ou update_cart, qui renvoient déjà le panier complet.

NameRequiredDescriptionDefault
cartIdYesIdentifiant du panier (UUID) rendu par create_cart. C’est une CAPACITÉ : qui le détient accède au panier — ne le publiez pas hors de la conversation qui l’a créé.
displayNoAfficher la carte du panier à l’utilisateur, dans les clients qui affichent les interfaces MCP Apps. `false` pour un appel intermédiaire qu’il n’a pas besoin de voir (vérifier avant de répondre) ; omis ou `true` dès qu’il doit voir le résultat. Sans effet sur le résultat lui-même.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint=false, but the description adds non-obvious behavior: the cart is frozen at add time with no re-quotation, and pricedAt/expiresAt signal price age. It does not cover failure modes (invalid cartId, hard-expired cart), so it is strong but not exhaustive.

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

Conciseness4/5

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

Dense but front-loaded: behavior (frozen prices) first, then routing guidance. Every clause carries information, though the second sentence packs several distinct ideas together, which costs a little readability.

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

Completeness4/5

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

With no output schema, the description usefully characterizes the return content (per-line pricedAt, expiresAt) and the read semantics. It omits error/edge behavior for invalid or fully expired carts, so it is near-complete rather than complete.

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

Parameters3/5

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

Schema description coverage is 100%, so cartId (capability/UUID) and display (UI card toggle) are already fully documented in the schema. The description adds no further parameter-level meaning, matching the baseline for full schema coverage.

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

Purpose5/5

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

Starts with a specific verb+resource ('Renvoie le panier') and immediately scopes it as a read of a previously frozen cart. It explicitly distinguishes itself from create_cart and update_cart, so the agent can separate it from siblings without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('plus tard dans la conversation, ou quand l’utilisateur demande à le revoir'), explicit when-not ('inutile juste après create_cart ou update_cart'), and names the alternative for stale prices ('re-cotez avec quote_product'). Nothing is left to inference.

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

get_product_configurationLire l’espace de configuration d’un produitA
Read-only
Inspect

Renvoie les options configurables d’un produit (quantités, délais, valeurs, tailles) et leurs valeurs disponibles. À appeler AVANT validate_selection ou quote_product : chez Fulfiller, un produit n’est pas un SKU à prix figé mais un espace de configuration. presets : configurations prêtes à l’emploi, cotables telles quelles via selection.preset. Les dépendances entre options (une finition qui exige le recto verso…) n’y figurent pas : validate_selection les révèle (enabledOptions).

NameRequiredDescriptionDefault
productIdYesIdentifiant rendu par search_products.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safe-read profile is covered. The description adds genuine behavioral context beyond that: it discloses that option dependencies are NOT included and that `presets` are quotable as-is via `selection.preset`. Minor gap: no pagination/size hints, but for a single-product read that is not material.

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

Conciseness4/5

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

Front-loaded with the return content, then the when-to-call guidance, then the caveat about dependencies. Every sentence carries value, though the preset/dependency details make it denser than strictly minimal.

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

Completeness5/5

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

There is no output schema, so the description must describe returns, which it does thoroughly (options, available values, presets). It also clarifies the relationship to validate_selection and quote_product, leaving nothing an agent needs to call this correctly.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's provenance (productId from search_products) is documented in the schema itself. The description adds no additional meaning to productId. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb (renvoie) and resource (options configurables d'un produit) with the concrete content returned (quantités, délais, valeurs, tailles) and their available values. It also distinguishes the tool from siblings by framing the product as a configuration space rather than a fixed SKU.

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

Usage Guidelines5/5

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

Explicitly says to call it BEFORE validate_selection or quote_product, naming both alternatives and the ordering condition. It even explains that validate_selection is the tool that reveals option dependencies, giving a clear handoff.

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

get_product_detailsLire la fiche d’un produitA
Read-only
Inspect

Fiche PIM d’un produit : descriptions, points clés, questions fréquentes, contraintes de fichier (fond perdu, résolution, marges, mode colorimétrique) et ressources (visuels, gabarits, consignes techniques). À utiliser pour DÉCRIRE un produit ou aider à préparer un fichier. Ne renvoie aucun prix — pour coter, passez par quote_product ; un prix écrit dans les textes de la fiche (« Dès 14.5 € ») est souvent périmé, ne l’annoncez pas. Les vidéos sont dans videos, pas dans images. Fournissez exactement un argument (productId, sku ou url). Les champs absents ne sont pas renseignés au PIM ; la FAQ est rare.

NameRequiredDescriptionDefault
skuNoSKU exact, tel que rendu par search_products ou resolve_product.
urlNoURL d’une fiche produit de www.fulfiller.com (http, sans www ou relative acceptées). Une page catégorie est refusée : cherchez alors avec search_products.
productIdNoIdentifiant rendu par search_products (alias : `zeloomProductId`).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so safety is covered. The description adds genuine behavioral context: no pricing, stale embedded prices, videos live in `videos` not `images`, missing fields mean unset in the PIM, FAQ is rare, and exactly one argument must be supplied.

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

Conciseness4/5

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

Dense and front-loaded: the resource and payload lead, then usage, then pricing caveat, then the argument rule. Slightly long, but nearly every clause carries distinct, actionable information rather than filler.

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

Completeness5/5

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

There is no output schema, so the description must describe the return shape, and it does by enumerating the sheet sections and the field-absence semantics. An agent has everything needed to call it and interpret the result.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds real value beyond the schema by stating the exclusivity rule ('Fournissez exactement un argument') that the schema itself does not express — all three params are optional with no oneOf constraint.

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

Purpose5/5

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

States a specific verb+resource and enumerates the exact payload (PIM sheet: descriptions, key points, FAQ, file constraints, resources). It also explicitly distinguishes itself from quote_product and corrects a common confusion (prices appear in text but are stale).

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('pour DÉCRIRE un produit ou aider à préparer un fichier') and when-not ('Ne renvoie aucun prix — pour coter, passez par quote_product'), naming the alternative and the condition that selects it. Also routes category-page lookups to search_products.

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

quote_by_quantityComparer les prix par quantitéA
Read-only
Inspect

Grille de devis pour plusieurs paliers de quantité en UN appel — la bonne façon de répondre à « combien pour 100, 250, 500 ? ». Prix de chaque palier : devis.finalPriceHt (promotion déduite). Même règle que quote_product, palier par palier : hors plage → erreur localisée sans invalider les autres ; hors du pas → coté au palier commandable le plus proche, que quotedQuantity indique (le prix porte sur cette quantité, pas sur le palier demandé).

NameRequiredDescriptionDefault
productIdYesIdentifiant rendu par search_products.
selectionYesSélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles).
quantitiesYesPaliers de quantité à coter (1 à 20).

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/destructive/openWorld, so safety is covered; the description goes further by naming the returned price field (devis.finalPriceHt, discount included), the per-tier error isolation (out-of-range tier errors locally without invalidating others), and the rounding rule where an out-of-step tier is quoted at the nearest orderable tier with quotedQuantity indicating the actual quantity. This is substantive behavioral detail beyond annotations, though it doesn't cover rate limits or pagination.

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

Conciseness4/5

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

Dense but front-loaded: the core capability and the answering use case come first, then the return field, then the error/rounding semantics. Every sentence carries information, though the density makes it less scannable.

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

Completeness4/5

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

With no output schema, the description usefully names the price path (devis.finalPriceHt) and explains quotedQuantity, covering the essentials of what comes back. The main uncovered area is the shape of the localized error response, but overall it is sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so productId, selection and quantities are already documented in the schema, with selection explicitly cross-referencing quote_product's selection form. The description adds no syntax or format detail beyond that baseline; the quantity-tier semantics it discusses are behavioral rather than parameter-level.

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

Purpose4/5

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

States a specific verb and resource: a quote grid for multiple quantity tiers in a single call, with a concrete example question («combien pour 100, 250, 500 ?»). It references quote_product as sharing the same rule, which implies the distinction (single quote vs multi-tier grid) but doesn't state it directly, so differentiation from the sibling is by inference rather than explicit.

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

Usage Guidelines3/5

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

The example question implies the usage context (comparing several quantities at once) and 'Même règle que quote_product' gestures at the sibling, but there is no explicit 'use this instead of quote_product when…' or when-not guidance. Usage is implied, not prescribed.

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

quote_productCoter une sélectionA
Read-only
Inspect

Devis RÉEL pour une sélection : prix HT calculé par le moteur de tarification (jamais lu dans une table de SKU), devise, délai, promotion. C’est le seul prix ferme. Le prix à annoncer est devis.finalPriceHt (promotion déduite) ; devis.priceHt est le prix catalogue, BARRÉ quand devis.promo est présent. Pour dire à l’utilisateur ce qui est coté, citez summary (libellés lisibles). Si requiresReview vaut true, le prix porte sur la sélection décrite par summary, pas sur la demande : les lignes dont le status n’est ni AS_REQUESTED ni DEFAULT disent ce qui a changé.

NameRequiredDescriptionDefault
productIdYesIdentifiant rendu par search_products.
selectionYesSélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{"options": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée, ou la SEULE compatible avec le reste de la sélection (« soft touch » sur une carte recto verso). Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`.

TDQS

A3.9/5.0
Behavior5/5

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

Goes well beyond the readOnly/non-destructive annotations: it explains the price is computed live rather than table-looked-up, identifies the firm price field vs the catalogue price, explains promo strikethrough semantics, and describes the requiresReview branch where the quote applies to the resolved summary rather than the request. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with the core claim (real firm price for a selection) and then focused on output-field interpretation. Dense but every sentence serves a purpose; no output schema exists, so the return-value guidance earns its space.

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

Completeness4/5

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

With no output schema, the description usefully documents the return surface (finalPriceHt, priceHt, promo, summary, requiresReview, status). For a nested, two-parameter quoting tool it is close to complete, though it omits error/alert handling detail (only alerts are mentioned).

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

Parameters3/5

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

Schema description coverage is 100% and the schema itself is extremely detailed, so the baseline is 3. The description adds no parameter-level syntax or format guidance of its own, leaving the heavy lifting entirely to the schema.

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

Purpose4/5

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

States a specific verb+resource (quote a selection) and specifies the price is a real, firm price computed by the pricing engine, never read from a SKU table. This implicitly separates it from softer-price siblings, but it never names quote_by_quantity or validate_selection, so sibling differentiation is left to inference.

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

Usage Guidelines3/5

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

Usage is implied ('c'est le seul prix ferme', announce devis.finalPriceHt) rather than stated as when-to-use vs when-not. No explicit routing to quote_by_quantity or validate_selection, so the agent must infer which quoting path applies.

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

resolve_productRésoudre un produit par SKU ou URLA
Read-only
Inspect

Convertit une identité EXACTE en identité complète (productId, sku, nom, url) : sku (lisible dans le JSON-LD d’une page produit), url de la page, ou productId. À PRÉFÉRER à search_products dès que vous tenez l’un des trois — la recherche est approximative, celle-ci ne l’est pas. Fournissez exactement un argument.

NameRequiredDescriptionDefault
skuNoSKU exact (ex. « POSTER_PHOTO_SUR_MESURE »).
urlNoURL d’une fiche produit de www.fulfiller.com (http, sans www ou relative acceptées). Une page catégorie est refusée : cherchez alors avec search_products.
productIdNoIdentifiant rendu par search_products (alias : `zeloomProductId`).

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real behavioral context on top: the exact-vs-approximate resolution semantic, the single-argument constraint, and the shape of the result (productId, sku, nom, url). It does not cover failure modes (e.g. unknown SKU), which keeps it from a 5.

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

Conciseness5/5

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

Two dense sentences, front-loaded with the transformation and result shape, followed by the routing rule and the invocation constraint. Every clause carries information; no filler.

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

Completeness5/5

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

A read-only resolver with no output schema; the description compensates by naming the returned fields, and annotations cover safety while the schema fully documents parameters. Nothing an agent needs to select or invoke it correctly is missing.

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

Parameters4/5

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

With 100% schema coverage the baseline is 3, and each parameter is already documented in the schema. The description adds meaning beyond it by stating mutual exclusivity ('exactly one argument') and the provenance of each identifier (sku from-LD, url of the page, productId from search_products), which the schema does not express.

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

Purpose5/5

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

States a specific verb and resource ('Convertit une identité EXACTE en identité complète') and enumerates both the accepted inputs (sku, url, productId) and the returned fields. It explicitly names and contrasts with the sibling search_products, so an agent can distinguish the two without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit preference rule: 'À PRÉFÉRER à search_products dès que vous tenez l'un des trois', plus the reason (recherche approximative vs. exacte). It also states the invocation constraint ('Fournissez exactement un argument'), leaving nothing to inference.

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

search_productsRechercher des produitsA
Read-only
Inspect

Recherche plein-texte dans le catalogue Fulfiller et renvoie des produits COTABLES (productId, sku, url, et le prix d’appel du site quand il en affiche un). Point d’entrée obligatoire : les autres outils travaillent sur le productId renvoyé ici. startingPrice est le prix d’appel AFFICHÉ par le site : indicatif, parfois périmé ou propre à une configuration, ni plancher garanti ni prix ferme — seul quote_product l’est. Sa base (TOTAL, UNIT, PER_SQUARE_METER) change d’un produit à l’autre : ne comparez jamais deux bases différentes. Pour le citer, utilisez startingPrice.displayLabel. Un résultat peut lister dans alsoListedAs d’autres fiches du site qui vendent le MÊME produit : ne les présentez pas comme des produits distincts.

NameRequiredDescriptionDefault
qYesUn ou deux mots produit en français (ex. « carte de visite », « bâche publicitaire »), pas une phrase : le moteur exige TOUS les mots. Une phrase qui ne trouve rien est réessayée une fois sans ses mots de contexte (`relaxedQuery` le signale). Les dimensions (« 300x100 »), les mesures (« 350g », « 1 000 ex ») et une quantité en tête de requête (« 500 cartes ») sont ignorées : elles se précisent à la cotation. Il faut au moins un mot de 3 lettres ou plus : une requête sans mot exploitable (« ab », « 50 ») est refusée.
limitNoNombre de résultats souhaité (1 à 24).

TDQS

A4.6/5.0
Behavior5/5

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

Far exceeds the annotations (which only cover the safe-read profile): it discloses the single automatic query relaxation and the relaxedQuery signal, the non-authoritative nature of startingPrice, the per-product basis variance (TOTAL/UNIT/PER_SQUARE_METER) with a rule against cross-basis comparison, and duplicate listings via alsoListedAs. These are response-shape behaviours not documented anywhere else, since there is no output schema.

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

Conciseness4/5

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

Purpose and required entry-point status are front-loaded in the first two sentences; every subsequent clause targets a distinct pitfall (price semantics, basis mixing, duplicates). It is dense and reads as a wall of caveats, but nothing is redundant.

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

Completeness5/5

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

With no output schema, the description still covers the returned fields, their trust level, the basis-incomparability rule, the relaxation behaviour and duplicate handling — everything an agent needs to call it and interpret results correctly.

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

Parameters3/5

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

Schema description coverage is 100% and the q description already documents word-matching, ignored dimensions/quantities, the 3-letter rule and relaxation, so the description adds little parameter-level detail. It contributes only indirect guidance (use `startingPrice.displayLabel` when citing), so the baseline 3 for schema-carried parameters applies.

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

Purpose5/5

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

States a specific verb and resource (full-text search of the Fulfiller catalogue) plus what it returns (currently quotable products with productId, sku, url, startingPrice). It also positions itself against siblings by declaring itself the mandatory entry point for the productId-consuming tools and by contrasting its indicative startingPrice with quote_product's firm price.

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

Usage Guidelines5/5

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

Explicit routing: 'Point d’entrée obligatoire' tells the agent this must run first, and 'seul quote_product' directs firm pricing to the sibling. It also gives an exclusion-type instruction — do not present alsoListedAs entries as distinct products — and explains when the query gets relaxed.

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

update_cartModifier un panierA
Destructive
Inspect

Applique, DANS CET ORDRE : retraits (remove), changements de quantité (update, sans re-cotation), puis ajouts (add, cotés). Renvoie le panier complet après application : n’appelez pas get_cart juste après.

NameRequiredDescriptionDefault
addNoNouvelles lignes, cotées à l’ajout.
cartIdYesIdentifiant du panier (UUID) rendu par create_cart. C’est une CAPACITÉ : qui le détient accède au panier — ne le publiez pas hors de la conversation qui l’a créé.
removeNo`lineId` des lignes à retirer.
updateNoNouveau nombre de LOTS pour des lignes existantes (prix unitaire figé inchangé).

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is known; the description adds real behavioral value on top: deterministic sequencing of remove/update/add, that quantity updates do NOT re-quote (unit price frozen), that added lines ARE quoted at insertion, and that the response is the complete cart. It does not discuss failure/partial-application behavior or irreversibility beyond what the destructiveHint already implies.

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

Conciseness5/5

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

Two tight sentences with no filler; the operational ordering constraint is front-loaded and the return-value/anti-get_cart note closes it. Every clause earns its place.

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

Completeness4/5

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

For a destructive multi-operation mutation with no output schema, the description supplies the essentials an agent needs: ordering, quoting semantics, and the fact that the full cart is returned. It stops short of describing error/partial-failure handling or concurrency, but given the fully documented schema and clear annotations the definition is functionally complete.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the description goes further by attaching pricing semantics to the operations (updates reuse the frozen unit price, adds are quoted, and changing volume requires a re-quote then line replacement). That meaning is not derivable from the schema alone, though it does not cover lineId/limits specifics.

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

Purpose5/5

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

The description names a precise mutation (apply to cart) and enumerates the three sub-operations it performs in a fixed order (remove, update, add), each mapped to its actual parameter. It also distinguishes itself from the sibling get_cart by telling the agent the call already returns the full cart, so the agent can tell it apart from the other cart tools without opening a schema.

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

Usage Guidelines4/5

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

It gives explicit operational guidance: the order in which operations are applied and the instruction not to call get_cart immediately afterwards because the updated cart is returned. It does not, however, say when to prefer this tool over quote_product/quote_by_quantity for pricing a change, nor any prerequisite about the cart needing to exist, so a small gap remains.

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

validate_selectionValider une sélectionA
Read-only
Inspect

Résout une sélection tolérante en codes canoniques et vérifie sa COMMANDABILITÉ, sans renvoyer de prix. Sert à corriger une sélection avant de la coter. summary décrit en clair la sélection retenue, et son status dit pour chaque option si la valeur est celle demandée, un défaut, ou un changement. requiresReview à true : la sélection retenue diffère de celle demandée, alerts dit pourquoi. enabledOptions liste, pour chaque option, les valeurs activables AVEC cette sélection : c’est là que se lisent les dépendances entre options.

NameRequiredDescriptionDefault
productIdYesIdentifiant rendu par search_products.
selectionYesSélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles).

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only cover the safety profile (readOnly, non-destructive, closed-world); the description adds substantial non-obvious behavior: it does not return prices, and it explains the meaning of requiresReview=true, alerts, status per option, and enabledOptions as the place where cross-option dependencies are read. With no output schema, this disclosure is exactly what the agent needs.

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

Conciseness4/5

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

Dense but front-loaded: the purpose and the price exclusion come first, then the return-field semantics. Every sentence carries information, though the back half is somewhat packed with field names in a single breath.

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

Completeness4/5

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

For a nested-input tool with no output schema, the description explains the key return fields (summary, status, requiresReview, alerts, enabledOptions) and the cross-option dependency concept, which is strong. It does not fully enumerate the response shape, so not quite complete, but adequate.

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

Parameters3/5

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

Schema coverage is 100%, including a description tying `selection` to quote_product's shape, so the schema already carries the parameter burden. The description adds conceptual framing (a tolerant selection to be corrected) but no syntax or format detail beyond the schema, matching the baseline 3.

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

Purpose5/5

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

States a specific compound action (resolve a tolerant selection into canonical codes and verify its orderability) and explicitly scopes it against the sibling quote_product by stating it returns no price and is meant to precede quoting. An agent can distinguish this validation step from quoting without opening any schema.

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

Usage Guidelines4/5

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

Names the context of use clearly ('to correct a selection before quoting it'), which implicitly routes the agent to run this before quote_product. There is no explicit when-not-to-use or named exclusion, so it stops short of a full 5.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updates
    • Changedcreate_cart11 fields changed
      • changedInput schema / properties / lines / items / properties / productId / description
        Previous value: -"Identifiant produit (`zeloomProductId`) rendu par search_products."New value: +"Identifiant produit rendu par search_products (alias : `zeloomProductId`)."
      • changedInput schema / properties / lines / items / properties / selection / description
        Previous value: -"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."New value: +"Sélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles)."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / option / description
        Removed value: -"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / quantity / description
        Removed value: -"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / size / description
        Removed value: -"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / size / properties / code / description
        Removed value: -"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / type / description
        Removed value: -"Seuls ces 4 types sont SÉLECTIONNABLES. Un autre type déclaré par la configuration (LIST_OF_RANGES, QUANTITY_BY_VALUE) est décrit mais non sélectionnable : le défaut du produit s’applique."
      • removedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / value / description
        Removed value: -"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
      • addedInput schema / properties / lines / items / properties / selection / properties / preset
        Added value: +{
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / lines / items / properties / sku / description
        Previous value: -"SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku."New value: +"SKU exact rendu par search_products. FACULTATIF : absent, il est déduit du productId (PRODUCT_AMBIGUOUS si plusieurs fiches vendent ce produit : le message cite leurs SKU)."
      • changedInput schema / properties / lines / items / required
        Previous value: -[
        -  "productId",
        -  "sku",
        -  "selection"
        -]New value: +[
        +  "productId",
        +  "selection"
        +]
    • Changedget_product_details2 fields changed
      • addedInput schema / properties / productId
        Added value: +{
        +  "description": "Identifiant rendu par search_products (alias : `zeloomProductId`).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL de la page produit sur www.fulfiller.com."New value: +"URL d’une fiche produit de www.fulfiller.com (http, sans www ou relative acceptées). Une page catégorie est refusée : cherchez alors avec search_products."
    • Changedquote_by_quantity9 fields changed
      • addedInput schema / properties / productId / description
        Added value: +"Identifiant rendu par search_products."
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."New value: +"Sélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles)."
      • removedInput schema / properties / selection / properties / options / items / properties / option / description
        Removed value: -"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • removedInput schema / properties / selection / properties / options / items / properties / quantity / description
        Removed value: -"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • removedInput schema / properties / selection / properties / options / items / properties / size / description
        Removed value: -"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • removedInput schema / properties / selection / properties / options / items / properties / size / properties / code / description
        Removed value: -"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • removedInput schema / properties / selection / properties / options / items / properties / type / description
        Removed value: -"Seuls ces 4 types sont SÉLECTIONNABLES. Un autre type déclaré par la configuration (LIST_OF_RANGES, QUANTITY_BY_VALUE) est décrit mais non sélectionnable : le défaut du produit s’applique."
      • removedInput schema / properties / selection / properties / options / items / properties / value / description
        Removed value: -"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
      • addedInput schema / properties / selection / properties / preset
        Added value: +{
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedquote_product4 fields changed
      • addedInput schema / properties / productId / description
        Added value: +"Identifiant rendu par search_products."
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée, ou la SEULE compatible avec le reste de la sélection (« soft touch » sur une carte recto verso). Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et DANS les bornes du gabarit : hors bornes, la cotation est refusée (SIZE_OUT_OF_RANGE, bornes dans le message)."
      • addedInput schema / properties / selection / properties / preset
        Added value: +{
        +  "description": "Code ou nom d’un preset de get_product_configuration (`presets` : « Le moins cher », « Top vente »…) : ses valeurs servent de base, `options` les précise ou les remplace.",
        +  "maxLength": 128,
        +  "type": "string"
        +}
    • Changedresolve_product2 fields changed
      • addedInput schema / properties / productId
        Added value: +{
        +  "description": "Identifiant rendu par search_products (alias : `zeloomProductId`).",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / url / description
        Previous value: -"URL de la page produit sur www.fulfiller.com."New value: +"URL d’une fiche produit de www.fulfiller.com (http, sans www ou relative acceptées). Une page catégorie est refusée : cherchez alors avec search_products."
    • Changedsearch_products1 field changed
      • changedInput schema / properties / q / description
        Previous value: -"Mots-clés en français (ex. « carte de visite », « bâche publicitaire »). Les dimensions (« 300x100 »), les mesures (« 350g », « 1 000 ex ») et une quantité en tête de requête (« 500 cartes ») sont ignorées : elles se précisent à la cotation."New value: +"Un ou deux mots produit en français (ex. « carte de visite », « bâche publicitaire »), pas une phrase : le moteur exige TOUS les mots. Une phrase qui ne trouve rien est réessayée une fois sans ses mots de contexte (`relaxedQuery` le signale). Les dimensions (« 300x100 »), les mesures (« 350g », « 1 000 ex ») et une quantité en tête de requête (« 500 cartes ») sont ignorées : elles se précisent à la cotation. Il faut au moins un mot de 3 lettres ou plus : une requête sans mot exploitable (« ab », « 50 ») est refusée."
    • Changedupdate_cart11 fields changed
      • changedInput schema / properties / add / items / properties / productId / description
        Previous value: -"Identifiant produit (`zeloomProductId`) rendu par search_products."New value: +"Identifiant produit rendu par search_products (alias : `zeloomProductId`)."
      • changedInput schema / properties / add / items / properties / selection / description
        Previous value: -"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."New value: +"Sélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles)."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / option / description
        Removed value: -"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / quantity / description
        Removed value: -"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / size / description
        Removed value: -"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / size / properties / code / description
        Removed value: -"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / type / description
        Removed value: -"Seuls ces 4 types sont SÉLECTIONNABLES. Un autre type déclaré par la configuration (LIST_OF_RANGES, QUANTITY_BY_VALUE) est décrit mais non sélectionnable : le défaut du produit s’applique."
      • removedInput schema / properties / add / items / properties / selection / properties / options / items / properties / value / description
        Removed value: -"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
      • addedInput schema / properties / add / items / properties / selection / properties / preset
        Added value: +{
        +  "maxLength": 128,
        +  "type": "string"
        +}
      • changedInput schema / properties / add / items / properties / sku / description
        Previous value: -"SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku."New value: +"SKU exact rendu par search_products. FACULTATIF : absent, il est déduit du productId (PRODUCT_AMBIGUOUS si plusieurs fiches vendent ce produit : le message cite leurs SKU)."
      • changedInput schema / properties / add / items / required
        Previous value: -[
        -  "productId",
        -  "sku",
        -  "selection"
        -]New value: +[
        +  "productId",
        +  "selection"
        +]
    • Changedvalidate_selection9 fields changed
      • addedInput schema / properties / productId / description
        Added value: +"Identifiant rendu par search_products."
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."New value: +"Sélection d’options : même forme et mêmes règles que `selection` de quote_product (codes ou libellés, défauts du produit, `preset`, tailles)."
      • removedInput schema / properties / selection / properties / options / items / properties / option / description
        Removed value: -"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • removedInput schema / properties / selection / properties / options / items / properties / quantity / description
        Removed value: -"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • removedInput schema / properties / selection / properties / options / items / properties / size / description
        Removed value: -"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • removedInput schema / properties / selection / properties / options / items / properties / size / properties / code / description
        Removed value: -"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • removedInput schema / properties / selection / properties / options / items / properties / type / description
        Removed value: -"Seuls ces 4 types sont SÉLECTIONNABLES. Un autre type déclaré par la configuration (LIST_OF_RANGES, QUANTITY_BY_VALUE) est décrit mais non sélectionnable : le défaut du produit s’applique."
      • removedInput schema / properties / selection / properties / options / items / properties / value / description
        Removed value: -"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
      • addedInput schema / properties / selection / properties / preset
        Added value: +{
        +  "maxLength": 128,
        +  "type": "string"
        +}
  2. 6 tool updates
    • Changedcreate_cart6 fields changed
      • changedInput schema / properties / lines / items / properties / selection / description
        Previous value: -"Sélection d’options. `{\"options\": []}` est valide et cote la configuration par défaut du produit. La résolution est TOLÉRANTE : un code approchant est résolu, et l’écart est signalé dans `alerts`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / option / description
        Previous value: -"Code de l’option, tel que rendu par get_product_configuration."New value: +"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • changedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / quantity / description
        Previous value: -"Quantité demandée (type QUANTITY)."New value: +"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • changedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit et dimensions personnalisées (option de type SIZE)."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • changedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / size / properties / code / description
        Previous value: -"Code du gabarit de taille."New value: +"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • changedInput schema / properties / lines / items / properties / selection / properties / options / items / properties / value / description
        Previous value: -"Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."New value: +"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
    • Changedquote_by_quantity6 fields changed
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. `{\"options\": []}` est valide et cote la configuration par défaut du produit. La résolution est TOLÉRANTE : un code approchant est résolu, et l’écart est signalé dans `alerts`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / selection / properties / options / items / properties / option / description
        Previous value: -"Code de l’option, tel que rendu par get_product_configuration."New value: +"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • changedInput schema / properties / selection / properties / options / items / properties / quantity / description
        Previous value: -"Quantité demandée (type QUANTITY)."New value: +"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • changedInput schema / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit et dimensions personnalisées (option de type SIZE)."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • changedInput schema / properties / selection / properties / options / items / properties / size / properties / code / description
        Previous value: -"Code du gabarit de taille."New value: +"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • changedInput schema / properties / selection / properties / options / items / properties / value / description
        Previous value: -"Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."New value: +"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
    • Changedquote_product6 fields changed
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. `{\"options\": []}` est valide et cote la configuration par défaut du produit. La résolution est TOLÉRANTE : un code approchant est résolu, et l’écart est signalé dans `alerts`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / selection / properties / options / items / properties / option / description
        Previous value: -"Code de l’option, tel que rendu par get_product_configuration."New value: +"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • changedInput schema / properties / selection / properties / options / items / properties / quantity / description
        Previous value: -"Quantité demandée (type QUANTITY)."New value: +"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • changedInput schema / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit et dimensions personnalisées (option de type SIZE)."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • changedInput schema / properties / selection / properties / options / items / properties / size / properties / code / description
        Previous value: -"Code du gabarit de taille."New value: +"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • changedInput schema / properties / selection / properties / options / items / properties / value / description
        Previous value: -"Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."New value: +"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
    • Changedsearch_products1 field changed
      • changedInput schema / properties / q / description
        Previous value: -"Mots-clés en français (ex. « carte de visite », « bâche publicitaire »)."New value: +"Mots-clés en français (ex. « carte de visite », « bâche publicitaire »). Les dimensions (« 300x100 »), les mesures (« 350g », « 1 000 ex ») et une quantité en tête de requête (« 500 cartes ») sont ignorées : elles se précisent à la cotation."
    • Changedupdate_cart6 fields changed
      • changedInput schema / properties / add / items / properties / selection / description
        Previous value: -"Sélection d’options. `{\"options\": []}` est valide et cote la configuration par défaut du produit. La résolution est TOLÉRANTE : un code approchant est résolu, et l’écart est signalé dans `alerts`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / add / items / properties / selection / properties / options / items / properties / option / description
        Previous value: -"Code de l’option, tel que rendu par get_product_configuration."New value: +"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • changedInput schema / properties / add / items / properties / selection / properties / options / items / properties / quantity / description
        Previous value: -"Quantité demandée (type QUANTITY)."New value: +"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • changedInput schema / properties / add / items / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit et dimensions personnalisées (option de type SIZE)."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • changedInput schema / properties / add / items / properties / selection / properties / options / items / properties / size / properties / code / description
        Previous value: -"Code du gabarit de taille."New value: +"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • changedInput schema / properties / add / items / properties / selection / properties / options / items / properties / value / description
        Previous value: -"Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."New value: +"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
    • Changedvalidate_selection6 fields changed
      • changedInput schema / properties / selection / description
        Previous value: -"Sélection d’options. `{\"options\": []}` est valide et cote la configuration par défaut du produit. La résolution est TOLÉRANTE : un code approchant est résolu, et l’écart est signalé dans `alerts`."New value: +"Sélection d’options. Une option non précisée prend la valeur de la préselection par défaut du produit (`preselections` de get_product_configuration), comme sur le site ; `{\"options\": []}` cote donc la configuration par défaut. La résolution est TOLÉRANTE : code ou libellé, sans souci de casse ni d’accents ; une valeur partielle est retenue si une SEULE valeur la contient (« vinyle » → « Impression sur vinyle adhésif contrecollé », « A5 » → « 14,8 x 21 cm (A5) »), ou par ses mesures (« 148x210 mm ») ; parmi plusieurs, la plus proche est retenue et signalée. Ce qui n’est pas retenu tel quel est signalé dans `alerts` et dans `summary`."
      • changedInput schema / properties / selection / properties / options / items / properties / option / description
        Previous value: -"Code de l’option, tel que rendu par get_product_configuration."New value: +"Code de l’option, tel que rendu par get_product_configuration. Un libellé (« Délai de livraison ») est rattaché à la seule option qui lui correspond, et c’est signalé."
      • changedInput schema / properties / selection / properties / options / items / properties / quantity / description
        Previous value: -"Quantité demandée (type QUANTITY)."New value: +"Quantité demandée (type QUANTITY). Hors des paliers du produit, l’alerte donne les quantités possibles et la plus proche."
      • changedInput schema / properties / selection / properties / options / items / properties / size / description
        Previous value: -"Gabarit et dimensions personnalisées (option de type SIZE)."New value: +"Gabarit de taille (option de type SIZE). Gabarit FIXE (bornes min = max) : le code suffit, ses dimensions sont complétées, et des dimensions données dans un sens ou dans l’autre (60×80 ou 80×60) désignent le même gabarit. Gabarit à SAISIE LIBRE (`allowsCustomInput`) : width et height sont requises, dans l’unité de l’option (`unit`, souvent cm : une bâche de 3 m × 1 m s’écrit width 300, height 100) et dans les bornes du gabarit."
      • changedInput schema / properties / selection / properties / options / items / properties / size / properties / code / description
        Previous value: -"Code du gabarit de taille."New value: +"Code ou libellé du gabarit, ou ses mesures (« 60x80 », « 148x210 mm ») : elles désignent le gabarit fixe de ces dimensions, sinon le gabarit sur mesure."
      • changedInput schema / properties / selection / properties / options / items / properties / value / description
        Previous value: -"Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."New value: +"Code ou libellé de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME)."
  3. 1 tool update
    • Changedget_cart1 field changed
      • addedInput schema / properties / display
        Added value: +{
        +  "description": "Afficher la carte du panier à l’utilisateur, dans les clients qui affichent les interfaces MCP Apps. `false` pour un appel intermédiaire qu’il n’a pas besoin de voir (vérifier avant de répondre) ; omis ou `true` dès qu’il doit voir le résultat. Sans effet sur le résultat lui-même.",
        +  "type": "boolean"
        +}
  4. 11 tool updates
    • First observedcreate_cart
    • First observeddelete_cart
    • First observedget_cart
    • First observedget_product_configuration
    • First observedget_product_details
    • First observedquote_by_quantity
    • First observedquote_product
    • First observedresolve_product
    • First observedsearch_products
    • First observedupdate_cart
    • First observedvalidate_selection

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Access 17M+ geocoded French property transactions (DVF), 22M+ DPE energy ratings, and 20M+ building records via MCP or REST API. Search transactions, market stats, comparables, price trends, rental yield, flip detection, and more.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Converts Office documents, images, and e-books to PDF and transforms PDFs by merging, splitting, rotating, numbering, watermarking, compressing, protecting, or unlocking them, plus PDF-to-Word and PDF-to-image conversion, all driven by natural language. Files stay on the user's computer apart from the conversion itself, which runs on EU-hosted servers in France.
    12
    13
    265 npm
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Books professional home cleaning services anywhere in metropolitan France end-to-end (coverage check, firm quote, booking creation, URSSAF "avance immédiate" enrollment, status polling). End users pay only 50% via SEPA direct debit thanks to the URSSAF immediate tax credit advance — no card payment required.
    5
    38 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources