Server definition
- Hash
- sha256:4f14e11919ca7dd0055752ba95aff8119fe0643528792bdf44ca7c0504febb82
- What it is
- What a remote MCP server returned when asked what it offers: 11 tools
The blob, as servednamed by its sha256
{
"instructions": "Catalogue et devis Fulfiller (imprimerie en ligne). Un produit n’est pas un SKU à prix figé mais un espace de configuration dont le prix est CALCULÉ. Enchaînement : search_products → get_product_configuration → (validate_selection) → quote_product, ou quote_by_quantity pour comparer des paliers. Le `startingPrice` d’une recherche est un plancher indicatif dont la base varie d’un produit à l’autre ; seul quote_product donne un prix ferme. Tous les prix sont HT, hors TVA et hors port. Quand `requiresReview` vaut true, le prix porte sur `resolvedSelection` et non sur la demande : signalez-le à l’utilisateur.",
"tools": [
{
"description": "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.",
"inputSchema": {
"properties": {
"idempotencyKey": {
"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.",
"format": "uuid",
"type": "string"
},
"lines": {
"description": "Lignes initiales (0 à 5). Un panier vide est légitime.",
"items": {
"properties": {
"productId": {
"description": "Identifiant produit (`zeloomProductId`) rendu par search_products.",
"minimum": 1,
"type": "integer"
},
"quantity": {
"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.",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"selection": {
"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`.",
"properties": {
"options": {
"items": {
"properties": {
"option": {
"description": "Code de l’option, tel que rendu par get_product_configuration.",
"type": "string"
},
"quantity": {
"description": "Quantité demandée (type QUANTITY).",
"minimum": 1,
"type": "integer"
},
"size": {
"description": "Gabarit et dimensions personnalisées (option de type SIZE).",
"properties": {
"code": {
"description": "Code du gabarit de taille.",
"type": "string"
},
"height": {
"exclusiveMinimum": 0,
"type": "number"
},
"width": {
"exclusiveMinimum": 0,
"type": "number"
}
},
"required": [
"code"
],
"type": "object"
},
"type": {
"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.",
"enum": [
"QUANTITY",
"DELIVERY_TIME",
"LIST_OF_VALUES",
"SIZE"
],
"type": "string"
},
"value": {
"description": "Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).",
"type": "string"
}
},
"required": [
"option",
"type"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"options"
],
"type": "object"
},
"sku": {
"description": "SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku.",
"maxLength": 128,
"type": "string"
}
},
"required": [
"productId",
"sku",
"selection"
],
"type": "object"
},
"maxItems": 5,
"type": "array"
}
},
"required": [],
"type": "object"
},
"name": "create_cart",
"outputSchema": null
},
{
"description": "Supprime DÉFINITIVEMENT un panier et toutes ses lignes. Irréversible. Pour retirer une seule ligne, utilisez update_cart avec `remove`.",
"inputSchema": {
"properties": {
"cartId": {
"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éé.",
"type": "string"
}
},
"required": [
"cartId"
],
"type": "object"
},
"name": "delete_cart",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"cartId": {
"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éé.",
"type": "string"
},
"display": {
"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"
}
},
"required": [
"cartId"
],
"type": "object"
},
"name": "get_cart",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"productId": {
"description": "Identifiant rendu par search_products.",
"minimum": 1,
"type": "integer"
}
},
"required": [
"productId"
],
"type": "object"
},
"name": "get_product_configuration",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"sku": {
"description": "SKU exact, tel que rendu par search_products ou resolve_product.",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"url": {
"description": "URL de la page produit sur www.fulfiller.com.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "get_product_details",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"productId": {
"minimum": 1,
"type": "integer"
},
"quantities": {
"description": "Paliers de quantité à coter (1 à 20).",
"items": {
"minimum": 1,
"type": "integer"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"selection": {
"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`.",
"properties": {
"options": {
"items": {
"properties": {
"option": {
"description": "Code de l’option, tel que rendu par get_product_configuration.",
"type": "string"
},
"quantity": {
"description": "Quantité demandée (type QUANTITY).",
"minimum": 1,
"type": "integer"
},
"size": {
"description": "Gabarit et dimensions personnalisées (option de type SIZE).",
"properties": {
"code": {
"description": "Code du gabarit de taille.",
"type": "string"
},
"height": {
"exclusiveMinimum": 0,
"type": "number"
},
"width": {
"exclusiveMinimum": 0,
"type": "number"
}
},
"required": [
"code"
],
"type": "object"
},
"type": {
"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.",
"enum": [
"QUANTITY",
"DELIVERY_TIME",
"LIST_OF_VALUES",
"SIZE"
],
"type": "string"
},
"value": {
"description": "Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).",
"type": "string"
}
},
"required": [
"option",
"type"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"options"
],
"type": "object"
}
},
"required": [
"productId",
"selection",
"quantities"
],
"type": "object"
},
"name": "quote_by_quantity",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"productId": {
"minimum": 1,
"type": "integer"
},
"selection": {
"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`.",
"properties": {
"options": {
"items": {
"properties": {
"option": {
"description": "Code de l’option, tel que rendu par get_product_configuration.",
"type": "string"
},
"quantity": {
"description": "Quantité demandée (type QUANTITY).",
"minimum": 1,
"type": "integer"
},
"size": {
"description": "Gabarit et dimensions personnalisées (option de type SIZE).",
"properties": {
"code": {
"description": "Code du gabarit de taille.",
"type": "string"
},
"height": {
"exclusiveMinimum": 0,
"type": "number"
},
"width": {
"exclusiveMinimum": 0,
"type": "number"
}
},
"required": [
"code"
],
"type": "object"
},
"type": {
"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.",
"enum": [
"QUANTITY",
"DELIVERY_TIME",
"LIST_OF_VALUES",
"SIZE"
],
"type": "string"
},
"value": {
"description": "Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).",
"type": "string"
}
},
"required": [
"option",
"type"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"options"
],
"type": "object"
}
},
"required": [
"productId",
"selection"
],
"type": "object"
},
"name": "quote_product",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"sku": {
"description": "SKU exact (ex. « POSTER_PHOTO_SUR_MESURE »).",
"maxLength": 128,
"minLength": 1,
"type": "string"
},
"url": {
"description": "URL de la page produit sur www.fulfiller.com.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "resolve_product",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"limit": {
"description": "Nombre de résultats souhaité (1 à 24).",
"maximum": 24,
"minimum": 1,
"type": "integer"
},
"q": {
"description": "Mots-clés en français (ex. « carte de visite », « bâche publicitaire »).",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"q"
],
"type": "object"
},
"name": "search_products",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"add": {
"description": "Nouvelles lignes, cotées à l’ajout.",
"items": {
"properties": {
"productId": {
"description": "Identifiant produit (`zeloomProductId`) rendu par search_products.",
"minimum": 1,
"type": "integer"
},
"quantity": {
"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.",
"maximum": 1000,
"minimum": 1,
"type": "integer"
},
"selection": {
"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`.",
"properties": {
"options": {
"items": {
"properties": {
"option": {
"description": "Code de l’option, tel que rendu par get_product_configuration.",
"type": "string"
},
"quantity": {
"description": "Quantité demandée (type QUANTITY).",
"minimum": 1,
"type": "integer"
},
"size": {
"description": "Gabarit et dimensions personnalisées (option de type SIZE).",
"properties": {
"code": {
"description": "Code du gabarit de taille.",
"type": "string"
},
"height": {
"exclusiveMinimum": 0,
"type": "number"
},
"width": {
"exclusiveMinimum": 0,
"type": "number"
}
},
"required": [
"code"
],
"type": "object"
},
"type": {
"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.",
"enum": [
"QUANTITY",
"DELIVERY_TIME",
"LIST_OF_VALUES",
"SIZE"
],
"type": "string"
},
"value": {
"description": "Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).",
"type": "string"
}
},
"required": [
"option",
"type"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"options"
],
"type": "object"
},
"sku": {
"description": "SKU exact rendu par search_products. REQUIS : il n’existe pas de résolution inverse productId → sku.",
"maxLength": 128,
"type": "string"
}
},
"required": [
"productId",
"sku",
"selection"
],
"type": "object"
},
"maxItems": 5,
"type": "array"
},
"cartId": {
"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éé.",
"type": "string"
},
"remove": {
"description": "`lineId` des lignes à retirer.",
"items": {
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"update": {
"description": "Nouveau nombre de LOTS pour des lignes existantes (prix unitaire figé inchangé).",
"items": {
"properties": {
"lineId": {
"type": "string"
},
"quantity": {
"maximum": 1000,
"minimum": 1,
"type": "integer"
}
},
"required": [
"lineId",
"quantity"
],
"type": "object"
},
"maxItems": 20,
"type": "array"
}
},
"required": [
"cartId"
],
"type": "object"
},
"name": "update_cart",
"outputSchema": null
},
{
"description": "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.",
"inputSchema": {
"properties": {
"productId": {
"minimum": 1,
"type": "integer"
},
"selection": {
"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`.",
"properties": {
"options": {
"items": {
"properties": {
"option": {
"description": "Code de l’option, tel que rendu par get_product_configuration.",
"type": "string"
},
"quantity": {
"description": "Quantité demandée (type QUANTITY).",
"minimum": 1,
"type": "integer"
},
"size": {
"description": "Gabarit et dimensions personnalisées (option de type SIZE).",
"properties": {
"code": {
"description": "Code du gabarit de taille.",
"type": "string"
},
"height": {
"exclusiveMinimum": 0,
"type": "number"
},
"width": {
"exclusiveMinimum": 0,
"type": "number"
}
},
"required": [
"code"
],
"type": "object"
},
"type": {
"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.",
"enum": [
"QUANTITY",
"DELIVERY_TIME",
"LIST_OF_VALUES",
"SIZE"
],
"type": "string"
},
"value": {
"description": "Code de la valeur retenue (types LIST_OF_VALUES et DELIVERY_TIME).",
"type": "string"
}
},
"required": [
"option",
"type"
],
"type": "object"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"options"
],
"type": "object"
}
},
"required": [
"productId",
"selection"
],
"type": "object"
},
"name": "validate_selection",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:4f14e11919ca7dd0055752ba95aff8119fe0643528792bdf44ca7c0504febb82 | sha256sum