Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,556Letters: 14Defects: 1,331counted 4 min ago
teppi

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 yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:4f14e11919ca7dd0055752ba95aff8119fe0643528792bdf44ca7c0504febb82 | sha256sum