Skip to main content
Glama
Vestuário MCP
by nilsond

Vestuário MCP

GitHub repo size GitHub language count GitHub forks GitHub open issues GitHub open pull requests

Python 3.11+ MCP SDK 2.3.0 License MIT

Servidor MCP em memória que simula o backend de um e-commerce de roupas: catálogo, carrinho com reserva de estoque e pedidos. Feito com o MCP Python SDK v2 (mcp==2.3.0), em que o antigo FastMCP agora se chama MCPServer.

⚠️ Segurança: o modo HTTP não tem autenticação. Qualquer pessoa com a URL do ngrok pode chamar as tools. Encerre o túnel ao terminar.

💻 Pré-requisitos

Antes de começar, verifique se você tem:

  • Python >= 3.11.

  • pip >= 25.1 (necessário para a opção --group).

  • Opcional: Node.js (para o MCP Inspector), ngrok e uv.

Related MCP server: Commerce MCP Server

🚀 Instalando

Clone o repositório e entre na pasta:

git clone https://github.com/nilsond/guilda-inovacao-criando-mcp.git
cd guilda-inovacao-criando-mcp

Com venv + pip (é o que a configuração do Kiro abaixo usa):

python3 -m venv .venv && .venv/bin/pip install -e . --group dev

Ou, como alternativa, com uv:

uv sync

Com uv, troque .venv/bin/python por uv run nos comandos abaixo.

☕ Usando

O servidor expõe:

Tipo

Nome

O que faz

Tool

listar_produtos(categoria?)

Lista o catálogo, com filtro opcional (Camisetas, Calças, Casacos, Acessórios, Calçados)

Tool

buscar_produto_por_id(produto_id)

Todos os detalhes de um produto

Tool

verificar_estoque(produto_id, tamanho)

Estoque físico, reservado e disponível

Tool

adicionar_ao_carrinho(session_id, produto_id, quantidade, tamanho)

Adiciona ao carrinho e reserva o estoque

Tool

remover_do_carrinho(session_id, produto_id, tamanho, quantidade?)

Remove o item e devolve a reserva

Tool

ver_carrinho(session_id)

Itens, subtotais e total em BRL

Tool

finalizar_pedido(session_id, endereco_entrega)

Cria o pedido, baixa o estoque e limpa o carrinho

Resource

ecommerce://politica-trocas

Política de trocas e devoluções (Markdown)

Prompt

recomendar_look(ocasiao, estilo?)

Consultor de estilo que monta looks com peças do catálogo

Estoque por tamanho: disponível = estoque físico − reservado.

Erros de negócio (produto inexistente, tamanho inválido, estoque insuficiente etc.) voltam como resultado com is_error=true e uma mensagem em PT-BR, para o LLM conseguir se corrigir.

MCP Inspector via STDIO

npx @modelcontextprotocol/inspector .venv/bin/python server_mcp.py   # com uv: uv run mcp dev server_mcp.py

O Inspector abre no navegador. Explore as abas Tools, Resources e Prompts. O mcp dev do SDK chama o uv por baixo, então sem uv use o npx direto.

HTTP local

.venv/bin/python server_mcp.py --transport http           # http://127.0.0.1:8000/mcp
npx @modelcontextprotocol/inspector                       # em outro terminal

No Inspector, escolha Streamable HTTP e use a URL http://127.0.0.1:8000/mcp.

Remoto via ngrok

ngrok http 8000                                            # anote o host, ex.: abc123.ngrok-free.app
.venv/bin/python server_mcp.py --transport http --public-host abc123.ngrok-free.app

No Inspector, conecte em https://abc123.ngrok-free.app/mcp.

O --public-host (ou a variável PUBLIC_HOST) é obrigatório nesse cenário. O SDK ativa uma proteção contra DNS rebinding que responde 421 Invalid Host header para qualquer host fora da allowlist, e o ngrok repassa o host público.

Kiro

Local (STDIO): crie o arquivo .kiro/settings/mcp.json no workspace com o conteúdo abaixo, trocando /caminho/para/guilda-inovacao-criando-mcp pelo caminho onde você clonou o repositório. O servidor aparece no painel MCP do Kiro; se precisar, reconecte por esse painel. autoApprove está vazio, então cada chamada de tool pede confirmação.

{
  "mcpServers": {
    "vestuario-mcp": {
      "command": "/caminho/para/guilda-inovacao-criando-mcp/.venv/bin/python",
      "args": ["/caminho/para/guilda-inovacao-criando-mcp/server_mcp.py"],
      "disabled": false,
      "autoApprove": []
    }
  }
}

Com uv, a entrada fica assim:

"vestuario-mcp": {
  "command": "uv",
  "args": ["--directory", "/caminho/para/guilda-inovacao-criando-mcp", "run", "server_mcp.py"]
}

Remoto (ngrok): o Kiro aceita servidores remotos pelo campo url (documentação de configuração, anúncio de remote MCP). Com o túnel e o servidor HTTP no ar, adicione:

"vestuario-mcp-remoto": {
  "url": "https://abc123.ngrok-free.app/mcp"
}

Se o cliente não conectar, use a ponte mcp-remote:

"vestuario-mcp-remoto": {
  "command": "npx",
  "args": ["-y", "mcp-remote", "https://abc123.ngrok-free.app/mcp"]
}

Exemplos de uso

Com o servidor conectado ao Kiro (ou a outro cliente MCP), experimente:

  1. "Quais casacos vocês têm e quanto custam?"

  2. "Monte um look casual para um happy hour" (ou use o prompt recomendar_look)

  3. "Adicione o look ao carrinho da sessão demo, tamanho M"

  4. "Mostre o estoque da jaqueta no tamanho M" (a reserva aparece)

  5. "Qual é a política de trocas?" (resource)

  6. "Finalize o pedido para Av. Paulista, 1000 - Bela Vista, São Paulo/SP"

O estado vive na memória e é zerado sempre que o servidor reinicia.

Exemplo mínimo

examples/hello.py é um servidor MCP com uma única tool (somar), comentado linha a linha. Bom ponto de partida para entender o MCPServer antes de olhar o projeto completo:

npx @modelcontextprotocol/inspector .venv/bin/python examples/hello.py

Guias

🧪 Testes

.venv/bin/python -m pytest        # ou: uv run pytest
.venv/bin/python -m pytest -q     # saída resumida

Os testes cobrem as regras de negócio (inclusive concorrência pela última unidade), as tools, o resource e o prompt via cliente MCP em memória, o servidor HTTP real com o bloqueio/liberação do host do ngrok, a CLI e o exemplo examples/hello.py.

📁 Estrutura do projeto

.
├── server_mcp.py              # CLI: --transport stdio|http, --host, --port, --public-host
├── src/vestuario_mcp/
│   ├── __init__.py            # exporta build_server e Loja
│   ├── models.py              # tipos e modelos Pydantic (viram structured output)
│   ├── data.py                # catálogo mock (11 produtos) e política de trocas
│   ├── services.py            # regras de negócio (classe Loja, com lock)
│   └── server.py              # build_server(): tools, resource e prompt
├── tests/                     # pytest: serviços, MCP em memória, CLI/HTTP e exemplos
├── examples/
│   └── hello.py               # servidor MCP mínimo
├── docs/
│   ├── 01-criando-o-servidor.md
│   ├── 02-expondo-com-ngrok.md
│   └── 03-conectando-clientes.md
├── pyproject.toml
├── LICENSE
└── README.md

📫 Contribuindo

Para contribuir com o projeto, siga estas etapas:

  1. Bifurque este repositório.

  2. Crie um branch: git checkout -b <nome_branch>.

  3. Faça suas alterações e confirme-as: git commit -m '<mensagem_commit>'

  4. Envie para o branch original: git push origin <nome_branch>

  5. Crie a solicitação de pull.

Como alternativa, consulte a documentação do GitHub em como criar uma solicitação pull.

🤝 Colaboradores

📝 Licença

Este projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.

Available Tools

7 tools
adicionar_ao_carrinhoA

Adiciona um item ao carrinho do cliente e RESERVA as unidades no estoque.

A reserva diminui a disponibilidade para outros clientes até o pedido ser finalizado ou o item ser removido. Adicionar de novo o mesmo produto e tamanho soma as quantidades.

Args: session_id: identificador do carrinho do cliente. produto_id: ID do produto. quantidade: unidades a adicionar (> 0). tamanho: P, M, G ou GG.

Returns: Mensagem de confirmação e o carrinho atualizado com o total.

Erros: Produto não encontrado; tamanho inválido ou indisponível para o produto; quantidade <= 0; estoque insuficiente (a mensagem informa quantas unidades estão disponíveis).

Inputs: tamanho (required), produto_id (required), quantidade (required), session_id (required). Returns: Resultado de uma alteração no carrinho.

buscar_produto_por_idA
Read-onlyIdempotent

Retorna todos os detalhes de um produto: descrição, cores, tamanhos, preço e disponibilidade por tamanho.

Args: produto_id: ID do produto, obtido em listar_produtos.

Returns: Detalhes do produto, incluindo disponivel_por_tamanho (estoque físico menos reservas).

Erros: Produto não encontrado. A mensagem lista os IDs existentes.

Inputs: produto_id (required). Returns: Todos os detalhes de um produto.

finalizar_pedidoA

Finaliza a compra: converte o carrinho em pedido, baixa o estoque e limpa o carrinho.

Confirme o carrinho com o cliente (ver_carrinho) antes de chamar esta tool.

Args: session_id: identificador do carrinho do cliente. endereco_entrega: endereço completo de entrega.

Returns: Pedido confirmado com número, itens, total, endereço e data/hora.

Erros: Carrinho vazio; endereço vazio ou incompleto.

Inputs: session_id (required), endereco_entrega (required). Returns: Pedido finalizado.

listar_produtosA
Read-onlyIdempotent

Lista os produtos do catálogo da loja Vestuário MCP.

Use esta tool para descobrir o que existe à venda antes de recomendar ou adicionar itens. Para cada produto vêm: id, nome, categoria, preço em BRL, tamanhos vendidos, cores e unidades disponíveis somando todos os tamanhos.

Args: categoria: filtro opcional por categoria. Não diferencia maiúsculas nem acentos ("calcas" também funciona).

Returns: Objeto com o filtro aplicado, o total de produtos e a lista de produtos.

Erros: Categoria inexistente. A mensagem lista as categorias válidas.

Inputs: categoria. Returns: Resultado de uma listagem do catálogo.

remover_do_carrinhoA

Remove um item do carrinho, inteiro ou em parte, e devolve a reserva ao estoque.

Args: session_id: identificador do carrinho do cliente. produto_id: ID do produto que está no carrinho. tamanho: tamanho do item no carrinho. quantidade: unidades a remover; se omitido, remove a linha inteira.

Returns: Mensagem de confirmação e o carrinho atualizado.

Erros: Item não está no carrinho; quantidade <= 0 ou maior que a quantidade no carrinho.

Inputs: tamanho (required), produto_id (required), session_id (required), quantidade. Returns: Resultado de uma alteração no carrinho.

ver_carrinhoA
Read-onlyIdempotent

Exibe o conteúdo atual do carrinho de um cliente e calcula o valor total.

Args: session_id: identificador do carrinho do cliente.

Returns: Itens com preço unitário e subtotal, quantidade total de unidades e total em BRL. Uma sessão sem itens devolve carrinho vazio (total R$ 0,00).

Inputs: session_id (required). Returns: Conteúdo do carrinho de uma sessão.

verificar_estoqueA
Read-onlyIdempotent

Consulta se há estoque disponível de um produto em um tamanho específico.

Mostra o estoque físico, quantas unidades estão reservadas em carrinhos e quantas ainda podem ser adicionadas (disponivel). Consulte antes de adicionar ao carrinho.

Args: produto_id: ID do produto. tamanho: P, M, G ou GG (aceita minúsculas).

Returns: Situação do estoque com em_estoque (bool) e uma mensagem legível.

Erros: Produto não encontrado; tamanho fora da grade ou não vendido para esse produto.

Inputs: tamanho (required), produto_id (required). Returns: Situação do estoque de um produto em um tamanho.

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 7 tools

    Disambiguation4/5

    The tools cover distinct stages of a shopping flow, with clear boundaries between browsing, stock checking, cart operations, and checkout. The only mild overlap is between buscar_produto_por_id and verificar_estoque, since the former also returns availability per size, but the specific-size stock check remains clearly differentiated.

    Naming Consistency5/5

    All tool names follow a consistent snake_case verb_noun pattern in Portuguese: listar_produtos, buscar_produto_por_id, verificar_estoque, adicionar_ao_carrinho, remover_do_carrinho, ver_carrinho, and finalizar_pedido. There are no mixed conventions or ambiguous standalone verbs.

    Tool Count5/5

    Seven tools is well scoped for a clothing-store MCP server. Each tool maps to a necessary step in the browse-to-checkout workflow, and none appear redundant or extraneous.

    Completeness4/5

    The core customer workflow is fully covered: product listing, product detail, stock checking, cart add/remove/view, and order finalization. Minor gaps remain around post-purchase operations such as order history, order status lookup, or cancellation, which could be useful but do not block the primary flow.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers