Koskamo

Motif & Moi MCP

An official MCP server that allows AI assistants to browse the Motif & Moi catalog, calculate prices and delivery dates, prepare custom designs with logos and text, and generate pre-filled order links for custom apparel like T-shirts and hoodies.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Motif & Moi MCP logo, by Motif & MoiVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Motif & Moi
MCP endpoint (Streamable HTTP)
https://motifetmoi.com/mcp
Vendor documentation

What you can do with it

  • Browse the catalog of customizable apparel
  • Calculate exact price and delivery date
  • Prepare custom designs with logos and text
  • Generate pre-filled order links for verification

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
motif-et-moi 1.0.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Motif & Moi imprime des vêtements personnalisés à Rennes (DTF, dès une pièce, livraison en France). 1. list_products pour les vêtements, couleurs, tailles et faces imprimables. 2. get_quote pour le prix TTC et la date de livraison (demandez le code postal). 3. create_design pour préparer le vêtement : renvoie un lien vers le configurateur prérempli. 4. Pour un club, une classe ou une association : create_group_order (un lien à partager aux membres, un lien privé pour le responsable), puis get_group_status pour suivre les inscriptions. Règles : vous ne passez jamais commande. Donnez le lien au client : il vérifie le visuel (bon à tirer), les tailles et l’orthographe, puis commande et paie lui-même. Prix toujours TTC. Les remises de list_products sont des maximums : annoncez uniquement le taux et le montant renvoyés par get_quote. Une commande de groupe dont cart_prepared vaut true n’est pas payée tant que payment_status ne vaut pas paid. Pour un prénom ou un numéro par personne, utilisez per_piece et la liste pieces (ou une commande de groupe si les membres saisissent eux-mêmes). Ne partagez jamais owner_url ni owner_key avec les membres. N’annoncez pas une date de livraison sans get_quote.

Tools

7 advertised

list_products — Catalogue Motif & Moi
Advertised by the server during the last successful anonymous check.
Advertised read-only

Vêtements personnalisables (T-shirt, sweat, hoodie, polo, tote bag…) : qualités, matières, prix « dès » TTC, couleurs, tailles, faces imprimables avec leur taille maximale et leur supplément, remises de quantité, encres et polices. À appeler en premier.

list_products input schema
{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "description": "Filtrer sur une catégorie."
    }
  }
}
list_products annotations
{
  "title": "Catalogue Motif & Moi",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_quote — Devis et date de livraison
Advertised by the server during the last successful anonymous check.
Advertised read-only

Prix TTC exact (remise de quantité comprise), frais de livraison et date de réception estimée pour une personnalisation, sans rien enregistrer. Donner postal_code pour la date.

get_quote input schema
{
  "type": "object",
  "required": [
    "category"
  ],
  "properties": {
    "color": {
      "type": "string",
      "description": "Couleur du vêtement (nom de list_products, ex. Noir)."
    },
    "sizes": {
      "type": "object",
      "description": "Quantités par taille, ex. {\"M\": 10, \"L\": 5}. Inutile avec pieces.",
      "additionalProperties": {
        "type": "integer",
        "minimum": 0
      }
    },
    "texts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "side"
        ],
        "properties": {
          "ink": {
            "type": "string",
            "description": "Encre (nom de list_products) ; par défaut la plus contrastée avec le vêtement."
          },
          "font": {
            "type": "string",
            "description": "sport (défaut), classique, fun, ou anton, bebas, montserrat, playfair, pacifico, marker, oswald, graduate."
          },
          "side": {
            "enum": [
              "front",
              "back",
              "left",
              "right",
              "nuque"
            ],
            "type": "string",
            "description": "front, back, left (manche gauche), right (manche droite), nuque."
          },
          "size": {
            "enum": [
              "s",
              "m",
              "l"
            ],
            "type": "string",
            "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
          },
          "text": {
            "type": "string",
            "description": "Texte (3 lignes de 40 caractères au plus)."
          },
          "per_piece": {
            "enum": [
              "name",
              "number"
            ],
            "type": "string",
            "description": "Texte variable : prénom ou numéro de chaque pièce."
          }
        }
      },
      "description": "Textes imprimés. Pour un prénom ou un numéro différent sur chaque pièce : per_piece, sans text, et la liste pieces."
    },
    "pieces": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "size"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "size": {
            "type": "string"
          },
          "number": {
            "type": "string"
          }
        }
      },
      "description": "Une entrée par pièce quand un texte est « par pièce » : taille, prénom, numéro."
    },
    "quality": {
      "enum": [
        "eco",
        "standard",
        "premium"
      ],
      "type": "string",
      "description": "Qualité : eco, standard (défaut) ou premium, selon la catégorie."
    },
    "category": {
      "type": "string",
      "description": "Catégorie (identifiant de list_products), ex. t-shirt, sweat, hoodie, polo, tote-bag."
    },
    "shipping": {
      "enum": [
        "standard",
        "express"
      ],
      "type": "string"
    },
    "logo_size": {
      "enum": [
        "s",
        "m",
        "l"
      ],
      "type": "string",
      "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
    },
    "logo_sides": {
      "type": "array",
      "items": {
        "enum": [
          "front",
          "back",
          "left",
          "right",
          "nuque"
        ],
        "type": "string"
      },
      "description": "Faces qui portent le logo (défaut : front)."
    },
    "postal_code": {
      "type": "string",
      "description": "Code postal français de livraison : donne la date de réception."
    },
    "front_format": {
      "enum": [
        "coeur",
        "grand"
      ],
      "type": "string",
      "description": "Devant : petit logo sur le cœur (compris dans le prix) ou grand format (supplément)."
    }
  }
}
get_quote annotations
{
  "title": "Devis et date de livraison",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_design — Préparer le vêtement et son lien de commande
Advertised by the server during the last successful anonymous check.
Open-world

Enregistre la personnalisation (logo par URL https publique ou en base64, textes, prénoms et numéros par pièce, quantités) et renvoie un lien vers le configurateur prérempli, un aperçu et le devis. Rien n’est commandé : le client ouvre le lien, vérifie le visuel (bon à tirer), puis commande et paie lui-même. Le lien reste valable 90 jours.

create_design input schema
{
  "type": "object",
  "required": [
    "category"
  ],
  "properties": {
    "color": {
      "type": "string",
      "description": "Couleur du vêtement (nom de list_products, ex. Noir)."
    },
    "sizes": {
      "type": "object",
      "description": "Quantités par taille, ex. {\"M\": 10, \"L\": 5}. Inutile avec pieces.",
      "additionalProperties": {
        "type": "integer",
        "minimum": 0
      }
    },
    "texts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "side"
        ],
        "properties": {
          "ink": {
            "type": "string",
            "description": "Encre (nom de list_products) ; par défaut la plus contrastée avec le vêtement."
          },
          "font": {
            "type": "string",
            "description": "sport (défaut), classique, fun, ou anton, bebas, montserrat, playfair, pacifico, marker, oswald, graduate."
          },
          "side": {
            "enum": [
              "front",
              "back",
              "left",
              "right",
              "nuque"
            ],
            "type": "string",
            "description": "front, back, left (manche gauche), right (manche droite), nuque."
          },
          "size": {
            "enum": [
              "s",
              "m",
              "l"
            ],
            "type": "string",
            "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
          },
          "text": {
            "type": "string",
            "description": "Texte (3 lignes de 40 caractères au plus)."
          },
          "per_piece": {
            "enum": [
              "name",
              "number"
            ],
            "type": "string",
            "description": "Texte variable : prénom ou numéro de chaque pièce."
          }
        }
      },
      "description": "Textes imprimés. Pour un prénom ou un numéro différent sur chaque pièce : per_piece, sans text, et la liste pieces."
    },
    "pieces": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "size"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "size": {
            "type": "string"
          },
          "number": {
            "type": "string"
          }
        }
      },
      "description": "Une entrée par pièce quand un texte est « par pièce » : taille, prénom, numéro."
    },
    "quality": {
      "enum": [
        "eco",
        "standard",
        "premium"
      ],
      "type": "string",
      "description": "Qualité : eco, standard (défaut) ou premium, selon la catégorie."
    },
    "category": {
      "type": "string",
      "description": "Catégorie (identifiant de list_products), ex. t-shirt, sweat, hoodie, polo, tote-bag."
    },
    "logo_url": {
      "type": "string",
      "description": "Adresse https publique du logo (PNG, JPG, WebP ou SVG, 20 Mo max)."
    },
    "shipping": {
      "enum": [
        "standard",
        "express"
      ],
      "type": "string"
    },
    "logo_size": {
      "enum": [
        "s",
        "m",
        "l"
      ],
      "type": "string",
      "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
    },
    "logo_sides": {
      "type": "array",
      "items": {
        "enum": [
          "front",
          "back",
          "left",
          "right",
          "nuque"
        ],
        "type": "string"
      },
      "description": "Faces qui portent le logo (défaut : front)."
    },
    "logo_base64": {
      "type": "string",
      "description": "Logo encodé en base64 (à la place de logo_url)."
    },
    "postal_code": {
      "type": "string",
      "description": "Code postal français de livraison : donne la date de réception."
    },
    "front_format": {
      "enum": [
        "coeur",
        "grand"
      ],
      "type": "string",
      "description": "Devant : petit logo sur le cœur (compris dans le prix) ou grand format (supplément)."
    },
    "logo_filename": {
      "type": "string"
    }
  }
}
create_design annotations
{
  "title": "Préparer le vêtement et son lien de commande",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
create_group_order — Lancer une commande de groupe
Advertised by the server during the last successful anonymous check.
Open-world

Pour un club, une classe, une association : crée le modèle et deux liens. Le lien membres est à partager (WhatsApp, e-mail) : chacun y choisit sa taille, saisit son prénom et son numéro si le modèle en a (texte per_piece), et paie sa part en ligne si pay_mode vaut members. Le lien responsable est privé : il suit les inscriptions et passe la commande pour tous à la date limite (il vérifie alors le visuel et paie le solde). Plus le groupe est nombreux, moins c’est cher : la remise porte sur tout le groupe et le trop-perçu des premiers inscrits leur est remboursé.

create_group_order input schema
{
  "type": "object",
  "required": [
    "category",
    "title"
  ],
  "properties": {
    "color": {
      "type": "string",
      "description": "Couleur du vêtement (nom de list_products, ex. Noir)."
    },
    "texts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "side"
        ],
        "properties": {
          "ink": {
            "type": "string",
            "description": "Encre (nom de list_products) ; par défaut la plus contrastée avec le vêtement."
          },
          "font": {
            "type": "string",
            "description": "sport (défaut), classique, fun, ou anton, bebas, montserrat, playfair, pacifico, marker, oswald, graduate."
          },
          "side": {
            "enum": [
              "front",
              "back",
              "left",
              "right",
              "nuque"
            ],
            "type": "string",
            "description": "front, back, left (manche gauche), right (manche droite), nuque."
          },
          "size": {
            "enum": [
              "s",
              "m",
              "l"
            ],
            "type": "string",
            "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
          },
          "text": {
            "type": "string",
            "description": "Texte (3 lignes de 40 caractères au plus)."
          },
          "per_piece": {
            "enum": [
              "name",
              "number"
            ],
            "type": "string",
            "description": "Texte variable : prénom ou numéro de chaque pièce."
          }
        }
      },
      "description": "Textes imprimés. Pour un prénom ou un numéro différent sur chaque pièce : per_piece, sans text, et la liste pieces."
    },
    "title": {
      "type": "string",
      "description": "Nom de la commande, ex. « Sweats du FC Rennes Sud »."
    },
    "quality": {
      "enum": [
        "eco",
        "standard",
        "premium"
      ],
      "type": "string",
      "description": "Qualité : eco, standard (défaut) ou premium, selon la catégorie."
    },
    "category": {
      "type": "string",
      "description": "Catégorie (identifiant de list_products), ex. t-shirt, sweat, hoodie, polo, tote-bag."
    },
    "deadline": {
      "type": "string",
      "description": "Date limite des inscriptions (AAAA-MM-JJ), à venir."
    },
    "logo_url": {
      "type": "string",
      "description": "Adresse https publique du logo (PNG, JPG, WebP ou SVG, 20 Mo max)."
    },
    "pay_mode": {
      "enum": [
        "members",
        "owner"
      ],
      "type": "string",
      "description": "members (défaut) : chacun paie sa part en ligne ; owner : le responsable règle tout."
    },
    "logo_size": {
      "enum": [
        "s",
        "m",
        "l"
      ],
      "type": "string",
      "description": "Taille dans la zone : s (petit), m (moyen, défaut), l (grand)."
    },
    "logo_sides": {
      "type": "array",
      "items": {
        "enum": [
          "front",
          "back",
          "left",
          "right",
          "nuque"
        ],
        "type": "string"
      },
      "description": "Faces qui portent le logo (défaut : front)."
    },
    "logo_base64": {
      "type": "string",
      "description": "Logo encodé en base64 (à la place de logo_url)."
    },
    "front_format": {
      "enum": [
        "coeur",
        "grand"
      ],
      "type": "string",
      "description": "Devant : petit logo sur le cœur (compris dans le prix) ou grand format (supplément)."
    },
    "logo_filename": {
      "type": "string"
    },
    "club_margin_pct": {
      "type": "integer",
      "maximum": 50,
      "minimum": 0,
      "description": "Avec pay_mode members : marge en % ajoutée au prix de chaque membre pour la caisse du club, reversée au club par virement après la commande (IBAN à saisir sur owner_url)."
    }
  }
}
create_group_order annotations
{
  "title": "Lancer une commande de groupe",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_group_status — Suivi d’une commande de groupe
Advertised by the server during the last successful anonymous check.
Advertised read-only

Inscriptions d’une commande de groupe (tailles, prénoms, numéros, paiements) pour son responsable : group_id et owner_key renvoyés par create_group_order.

get_group_status input schema
{
  "type": "object",
  "required": [
    "group_id",
    "owner_key"
  ],
  "properties": {
    "group_id": {
      "type": "string"
    },
    "owner_key": {
      "type": "string"
    }
  }
}
get_group_status annotations
{
  "title": "Suivi d’une commande de groupe",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_design_preview — Aperçu d’un design
Advertised by the server during the last successful anonymous check.
Advertised read-only

Image PNG du vêtement personnalisé (chaque face marquée et gros plans), pour montrer le rendu au client avant qu’il ouvre le lien.

get_design_preview input schema
{
  "type": "object",
  "required": [
    "design_id"
  ],
  "properties": {
    "design_id": {
      "type": "string"
    }
  }
}
get_design_preview annotations
{
  "title": "Aperçu d’un design",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_order_status — Suivi d’une commande
Advertised by the server during the last successful anonymous check.
Advertised read-only

Étape de fabrication et de livraison d’une commande payée, avec son numéro (MM-XXXXXX) et l’e-mail utilisé pour la payer.

get_order_status input schema
{
  "type": "object",
  "required": [
    "order_number",
    "email"
  ],
  "properties": {
    "email": {
      "type": "string"
    },
    "order_number": {
      "type": "string"
    }
  }
}
get_order_status annotations
{
  "title": "Suivi d’une commande",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
638 ms
95th percentile latency
638 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 638 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http motif-moi-mcp https://motifetmoi.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add motif-moi-mcp --url https://motifetmoi.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable motif-moi-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "motif-moi-mcp": {
      "url": "https://motifetmoi.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "motif-moi-mcp": {
      "type": "streamableHttp",
      "url": "https://motifetmoi.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start motif-moi-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "motif-moi-mcp": {
      "type": "http",
      "url": "https://motifetmoi.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http motif-moi-mcp https://motifetmoi.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "motif-moi-mcp": {
      "url": "https://motifetmoi.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "motif-moi-mcp": {
      "serverUrl": "https://motifetmoi.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Motif & Moi MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Motif & Moi MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing