Servidor MCP

Fulfiller — print catalogue & quotes

com.fulfiller/agentic-commerce-api
Comercio y retail Diseño y creatividad Público y accesible MCP 2026-07-28

Qué hace este MCP

Searches a French printing catalogue, retrieves product specifications and file requirements, validates configurations, generates quotes, and manages preliminary carts.

create_cart
Créer un panier
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 exige un productId ET son sku, tous deux rendus par search_products. Renvoie le panier complet : n’appelez pas get_cart juste après.
Acceso externo
Esquema de entrada
{'type': 'object', 'required': [], 'properties': {'lines': {'type': 'array', 'items': {'type': 'object', 'required': ['productId', 'sku', 'selection'], 'properties': {'sku': {'type': 'string', 'maxLength': 128, 'description': 'SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku.'}, 'quantity': {'type': 'integer', 'maximum': 1000, 'minimum': 1, 'description': 'Nombre de LOTS identiques au prix unitaire figé — PAS un palier de volume : 2×50 exemplaires n’a pas le même prix qu’1×100. Pour changer de volume, re-cotez avec une autre QUANTITY dans `selection`, puis remplacez la ligne. Défaut 1.'}, 'productId': {'type': 'integer', 'minimum': 1, 'description': 'Identifiant produit (`zeloomProductId`) rendu par search_products.'}, 'selection': {'type': 'object', 'required': ['options'], 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['option', 'type'], 'properties': {'size': {'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'Code du gabarit de taille.'}, 'width': {'type': 'number', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'Gabarit et dimensions personnalisées (option de type SIZE).'}, 'type': {'enum': ['QUANTITY', 'DELIVERY_TIME', 'LIST_OF_VALUES', 'SIZE'], 'type': 'string', 'description': '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.'}, 'value': {'type': 'string', 'description': 'Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).'}, 'option': {'type': 'string', 'description': 'Code de l’option, tel que rendu par get_product_configuration.'}, 'quantity': {'type': 'integer', 'minimum': 1, 'description': 'Quantité demandée (type QUANTITY).'}}}, 'maxItems': 50}}, 'description': '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`.'}}}, 'maxItems': 5, 'description': 'Lignes initiales (0 à 5). Un panier vide est légitime.'}, 'idempotencyKey': {'type': 'string', 'format': 'uuid', 'description': 'UUID 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.'}}}
delete_cart
Supprimer un panier
Supprime DÉFINITIVEMENT un panier et toutes ses lignes. Irréversible. Pour retirer une seule ligne, utilisez update_cart avec `remove`.
Destructivo Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['cartId'], 'properties': {'cartId': {'type': 'string', 'description': 'Identifiant 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éé.'}}}
get_cart
Lire un panier
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.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['cartId'], 'properties': {'cartId': {'type': 'string', 'description': 'Identifiant 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éé.'}, 'display': {'type': 'boolean', '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.'}}}
get_product_configuration
Lire l’espace de configuration d’un produit
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.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['productId'], 'properties': {'productId': {'type': 'integer', 'minimum': 1, 'description': 'Identifiant rendu par search_products.'}}}
get_product_details
Lire la fiche d’un produit
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. Fournissez exactement un argument. Les champs absents ne sont pas renseignés au PIM ; la FAQ est rare.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': [], 'properties': {'sku': {'type': 'string', 'maxLength': 128, 'minLength': 1, 'description': 'SKU exact, tel que rendu par search_products ou resolve_product.'}, 'url': {'type': 'string', 'maxLength': 2048, 'minLength': 1, 'description': 'URL de la page produit sur www.fulfiller.com.'}}}
quote_by_quantity
Comparer les prix par quantité
Grille de devis pour plusieurs paliers de quantité en UN appel — la bonne façon de répondre à « combien pour 100, 250, 500 ? ». Un palier hors plage ressort en erreur localisée sans invalider les autres.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['productId', 'selection', 'quantities'], 'properties': {'productId': {'type': 'integer', 'minimum': 1}, 'selection': {'type': 'object', 'required': ['options'], 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['option', 'type'], 'properties': {'size': {'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'Code du gabarit de taille.'}, 'width': {'type': 'number', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'Gabarit et dimensions personnalisées (option de type SIZE).'}, 'type': {'enum': ['QUANTITY', 'DELIVERY_TIME', 'LIST_OF_VALUES', 'SIZE'], 'type': 'string', 'description': '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.'}, 'value': {'type': 'string', 'description': 'Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).'}, 'option': {'type': 'string', 'description': 'Code de l’option, tel que rendu par get_product_configuration.'}, 'quantity': {'type': 'integer', 'minimum': 1, 'description': 'Quantité demandée (type QUANTITY).'}}}, 'maxItems': 50}}, 'description': '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`.'}, 'quantities': {'type': 'array', 'items': {'type': 'integer', 'minimum': 1}, 'maxItems': 20, 'minItems': 1, 'description': 'Paliers de quantité à coter (1 à 20).'}}}
quote_product
Coter une sélection
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. Si `requiresReview` vaut `true`, le prix porte sur `resolvedSelection`, pas sur la demande.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['productId', 'selection'], 'properties': {'productId': {'type': 'integer', 'minimum': 1}, 'selection': {'type': 'object', 'required': ['options'], 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['option', 'type'], 'properties': {'size': {'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'Code du gabarit de taille.'}, 'width': {'type': 'number', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'Gabarit et dimensions personnalisées (option de type SIZE).'}, 'type': {'enum': ['QUANTITY', 'DELIVERY_TIME', 'LIST_OF_VALUES', 'SIZE'], 'type': 'string', 'description': '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.'}, 'value': {'type': 'string', 'description': 'Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).'}, 'option': {'type': 'string', 'description': 'Code de l’option, tel que rendu par get_product_configuration.'}, 'quantity': {'type': 'integer', 'minimum': 1, 'description': 'Quantité demandée (type QUANTITY).'}}}, 'maxItems': 50}}, 'description': '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`.'}}}
resolve_product
Résoudre un produit par SKU ou URL
Convertit une identité EXACTE en productId : `sku` (lisible dans le JSON-LD d’une page produit) ou `url` de la page. À PRÉFÉRER à search_products dès que vous tenez l’un des deux — la recherche est approximative, celle-ci ne l’est pas. Fournissez exactement un argument.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': [], 'properties': {'sku': {'type': 'string', 'maxLength': 128, 'minLength': 1, 'description': 'SKU exact (ex. « POSTER_PHOTO_SUR_MESURE »).'}, 'url': {'type': 'string', 'maxLength': 2048, 'minLength': 1, 'description': 'URL de la page produit sur www.fulfiller.com.'}}}
search_products
Rechercher des produits
Recherche plein-texte dans le catalogue Fulfiller et renvoie des produits COTABLES (productId, sku, url, prix d’appel). Point d’entrée obligatoire : les autres outils travaillent sur le productId renvoyé ici. `startingPrice` est un PLANCHER dont la base (TOTAL, UNIT, PER_SQUARE_METER) change d’un produit à l’autre — ne comparez jamais deux bases différentes et n’annoncez pas ce prix comme ferme : seul quote_product l’est.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['q'], 'properties': {'q': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Mots-clés en français (ex. « carte de visite », « bâche publicitaire »).'}, 'limit': {'type': 'integer', 'maximum': 24, 'minimum': 1, 'description': 'Nombre de résultats souhaité (1 à 24).'}}}
update_cart
Modifier un panier
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.
Destructivo Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['cartId'], 'properties': {'add': {'type': 'array', 'items': {'type': 'object', 'required': ['productId', 'sku', 'selection'], 'properties': {'sku': {'type': 'string', 'maxLength': 128, 'description': 'SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku.'}, 'quantity': {'type': 'integer', 'maximum': 1000, 'minimum': 1, 'description': 'Nombre de LOTS identiques au prix unitaire figé — PAS un palier de volume : 2×50 exemplaires n’a pas le même prix qu’1×100. Pour changer de volume, re-cotez avec une autre QUANTITY dans `selection`, puis remplacez la ligne. Défaut 1.'}, 'productId': {'type': 'integer', 'minimum': 1, 'description': 'Identifiant produit (`zeloomProductId`) rendu par search_products.'}, 'selection': {'type': 'object', 'required': ['options'], 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['option', 'type'], 'properties': {'size': {'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'Code du gabarit de taille.'}, 'width': {'type': 'number', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'Gabarit et dimensions personnalisées (option de type SIZE).'}, 'type': {'enum': ['QUANTITY', 'DELIVERY_TIME', 'LIST_OF_VALUES', 'SIZE'], 'type': 'string', 'description': '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.'}, 'value': {'type': 'string', 'description': 'Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).'}, 'option': {'type': 'string', 'description': 'Code de l’option, tel que rendu par get_product_configuration.'}, 'quantity': {'type': 'integer', 'minimum': 1, 'description': 'Quantité demandée (type QUANTITY).'}}}, 'maxItems': 50}}, 'description': '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`.'}}}, 'maxItems': 5, 'description': 'Nouvelles lignes, cotées à l’ajout.'}, 'cartId': {'type': 'string', 'description': 'Identifiant 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éé.'}, 'remove': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'description': '`lineId` des lignes à retirer.'}, 'update': {'type': 'array', 'items': {'type': 'object', 'required': ['lineId', 'quantity'], 'properties': {'lineId': {'type': 'string'}, 'quantity': {'type': 'integer', 'maximum': 1000, 'minimum': 1}}}, 'maxItems': 20, 'description': 'Nouveau nombre de LOTS pour des lignes existantes (prix unitaire figé inchangé).'}}}
validate_selection
Valider une sélection
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. Lisez `alerts` et `requiresReview` : `true` signifie que la sélection retenue diffère de celle demandée.
Solo lectura Acceso externo
Esquema de entrada
{'type': 'object', 'required': ['productId', 'selection'], 'properties': {'productId': {'type': 'integer', 'minimum': 1}, 'selection': {'type': 'object', 'required': ['options'], 'properties': {'options': {'type': 'array', 'items': {'type': 'object', 'required': ['option', 'type'], 'properties': {'size': {'type': 'object', 'required': ['code'], 'properties': {'code': {'type': 'string', 'description': 'Code du gabarit de taille.'}, 'width': {'type': 'number', 'exclusiveMinimum': 0}, 'height': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'Gabarit et dimensions personnalisées (option de type SIZE).'}, 'type': {'enum': ['QUANTITY', 'DELIVERY_TIME', 'LIST_OF_VALUES', 'SIZE'], 'type': 'string', 'description': '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.'}, 'value': {'type': 'string', 'description': 'Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).'}, 'option': {'type': 'string', 'description': 'Code de l’option, tel que rendu par get_product_configuration.'}, 'quantity': {'type': 'integer', 'minimum': 1, 'description': 'Quantité demandée (type QUANTITY).'}}}, 'maxItems': 50}}, 'description': '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`.'}}}
Modificado
update_cart
1 de October de 2026 a las 02:53
Modificado
get_cart
1 de October de 2026 a las 02:53
Modificado
create_cart
1 de October de 2026 a las 02:53
Añadido
delete_cart
17 de September de 2026 a las 12:34
Añadido
update_cart
17 de September de 2026 a las 12:34
Añadido
get_cart
17 de September de 2026 a las 12:34
Añadido
create_cart
17 de September de 2026 a las 12:34
Añadido
quote_by_quantity
17 de September de 2026 a las 12:34
Añadido
quote_product
17 de September de 2026 a las 12:34
Añadido
validate_selection
17 de September de 2026 a las 12:34
Añadido
get_product_configuration
17 de September de 2026 a las 12:34
Añadido
get_product_details
17 de September de 2026 a las 12:34
Añadido
resolve_product
17 de September de 2026 a las 12:34
Añadido
search_products
17 de September de 2026 a las 12:34