inventory-mcp

inventory-mcp

A read-only MCP server for querying product inventory, providing tools to retrieve product details and stock quantities.

Category
访问服务器

README

inventory-mcp

Servidor MCP de demonstração para consultas de inventário, desenvolvido em Python com FastMCP. O projeto apoia o estudo dos principais conceitos do Model Context Protocol (MCP), com separação entre transporte, interface MCP, regras de negócio, validação e dados.

O escopo atual é intencionalmente somente leitura: o servidor permite consultar produtos e quantidades em estoque, sem operações de cadastro, alteração ou exclusão.

Tecnologias

  • Python 3.11+
  • FastMCP
  • Pydantic
  • pytest
  • Ruff

Arquitetura

  • app/server.py: cria o servidor FastMCP, registra as tools e inicia o transporte stdio ou SSE.
  • app/client.py: cliente demonstrativo que lista e chama as tools por stdio ou SSE.
  • app/tools/: interface MCP; valida entradas, delega ao serviço e transforma erros esperados em respostas estáveis.
  • app/services/: regras de consulta e carregamento do inventário.
  • app/schemas/: modelos Pydantic que definem e validam os contratos de produto e estoque.
  • app/data/: fonte local de dados, atualmente o arquivo inventory.json.
  • tests/: testes automatizados do serviço, das tools e da configuração do servidor.
Client → MCP Server → Tool → InventoryService → inventory.json

As tools não acessam o arquivo diretamente. Elas delegam as regras de negócio ao InventoryService.

Tools MCP

get_product

  • Propósito: consultar os dados completos de um produto pelo nome.
  • Entrada: name (string não vazia).
  • Saída em caso de sucesso: objeto com name, quantity e price.
  • Saída para produto inexistente: objeto com error: "product_not_found" e uma message descritiva.
  • Descrição MCP: Use this tool to retrieve the complete data of a product by name, including its price and stock quantity.
  • Classificação: somente leitura.
{
  "name": "Mouse",
  "quantity": 25,
  "price": 89.9
}

get_stock

  • Propósito: consultar somente a quantidade atual de um produto pelo nome.
  • Entrada: name (string não vazia).
  • Saída em caso de sucesso: objeto com quantity.
  • Saída para produto inexistente: objeto com error: "product_not_found" e uma message descritiva.
  • Descrição MCP: Use this tool to retrieve only the current stock quantity of a product by name.
  • Classificação: somente leitura.
{
  "quantity": 25
}

Validação de entrada

As tools exigem que name seja uma string com conteúdo. Nomes vazios ou formados apenas por espaços são rejeitados antes da consulta. O serviço aplica strip() para remover espaços nas extremidades e casefold() para comparar nomes sem diferenciação entre maiúsculas e minúsculas.

O Pydantic valida os registros carregados do JSON e os modelos de saída. Um produto deve ter nome não vazio, quantidade inteira não negativa e preço numérico não negativo. A rejeição de nomes de consulta vazios é feita por _validate_product_name(). Registros inválidos interrompem o carregamento com erro explícito.

Tratamento de erros

O InventoryService lança ProductNotFoundError quando não encontra o produto solicitado. As tools capturam esse erro esperado e retornam um payload previsível:

{
  "error": "product_not_found",
  "message": "Product not found: Monitor"
}

Erros de entrada, como nome vazio ou valor que não seja string, não são ocultados: são reportados como erros da chamada da tool.

Transportes MCP

  • stdio: comunica-se pela entrada e saída padrão. Neste projeto, o cliente inicia o servidor FastMCP como subprocesso, realiza as chamadas e encerra o processo ao finalizar.
  • SSE: comunica-se por um endpoint HTTP com Server-Sent Events. Servidor e cliente rodam em processos separados; por padrão, o servidor atende em http://127.0.0.1:8000/sse.

Como executar

Os comandos abaixo usam PowerShell e devem ser executados na raiz do projeto.

Criar e ativar o ambiente virtual

python -m venv .venv
.\.venv\Scripts\Activate.ps1

Instalar as dependências

python -m pip install --upgrade pip
python -m pip install -e ".[dev]"

Executar via stdio

O cliente usa stdio por padrão e inicia o servidor como subprocesso:

.\.venv\Scripts\python.exe -m app.client

Para iniciar apenas o servidor diretamente:

.\.venv\Scripts\python.exe -m app.server --transport stdio

Executar via SSE

Inicie o servidor em um terminal (sse é o transporte padrão do servidor):

.\.venv\Scripts\python.exe -m app.server

O comando explícito equivalente é python -m app.server --transport sse. Em outro terminal, conecte o cliente:

.\.venv\Scripts\python.exe -m app.client --transport sse

O cliente aceita outro endpoint por meio de --url.

Executar os testes

.\.venv\Scripts\pytest.exe

Executar o Ruff

.\.venv\Scripts\ruff.exe check .
.\.venv\Scripts\ruff.exe format --check .

Tool Risk Assessment

As tools atuais são somente leitura e não podem criar, alterar ou excluir dados. Essa decisão reduz a superfície de risco, mas não elimina possíveis impactos sobre confidencialidade e disponibilidade.

Tool Dados acessados Operação Risco atual Possível impacto de uso indevido
get_product Nome, preço e quantidade Leitura Baixo Exposição ou enumeração de informações do inventário
get_stock Quantidade disponível Leitura Baixo Enumeração de estoque e acompanhamento excessivo da disponibilidade

Chamadas em grande volume ainda podem consumir recursos do servidor. Alterações futuras nas tools ou nos dados retornados devem ser acompanhadas de uma nova avaliação de risco.

Trust Boundary

Os argumentos recebidos de um cliente MCP são tratados como entrada não confiável.

MCP Client
    ↓
MCP Server
    ↓
Tool
    ↓
InventoryService
    ↓
inventory.json

A validação acontece antes que os argumentos sejam utilizados pela camada de serviço. O servidor não assume que os dados enviados pelo cliente são válidos apenas porque chegaram pelo protocolo MCP. Os registros do inventory.json também são tratados como entrada externa e validados pelo Pydantic durante o carregamento.

MCP Tool Annotations

As tools são classificadas semanticamente de acordo com seu comportamento. As duas operações atuais declaram:

readOnlyHint=true
openWorldHint=false

readOnlyHint=true informa ao cliente MCP que a operação não pretende modificar estado.

openWorldHint=false indica que a tool trabalha sobre um domínio fechado e conhecido — neste caso, o inventário local — em vez de consultar sistemas externos ou fontes abertas.

Essas annotations funcionam como metadados e hints para clientes MCP, não como mecanismos de segurança. Um cliente não deve confiar nelas como substituto de validação, autorização ou outros controles reais.

Risco de tools de escrita

Uma futura operação como:

update_stock(name, quantity)

teria risco significativamente maior porque modificaria o estado persistente do sistema.

Uma chamada incorreta ou maliciosa poderia alterar o produto errado, registrar valores inválidos ou permitir mudanças não autorizadas. Uma futura tool como update_stock exigiria validação rigorosa, autenticação, autorização, auditoria e tracing. Operações destrutivas também exigiriam confirmação ou aprovação quando aplicável.

Risco por transporte

No stdio, o servidor é iniciado localmente como subprocesso do cliente, reduzindo a exposição de rede. No SSE, servidor e cliente são processos separados e a comunicação usa um endpoint HTTP. Uma eventual publicação desse endpoint fora do host local exigiria controles adicionais de acesso e disponibilidade.

Testes

A suíte atual valida:

  • carregamento, busca, normalização e erros do InventoryService;
  • retornos das tools e conversão de produto inexistente em erro previsível;
  • rejeição de nomes vazios e valores que não sejam strings;
  • rejeição de registros de inventário inválidos pelo Pydantic;
  • registro das tools no servidor;
  • seleção e configuração dos transportes SSE e stdio;
  • integração real via stdio, incluindo list_tools(), chamada de get_stock e leitura das annotations MCP.

Os cenários incluem produtos existentes e inexistentes, espaços nas extremidades, diferenças entre maiúsculas e minúsculas e entradas inválidas. No teste ponta a ponta, um cliente FastMCP real inicia o servidor como subprocesso, valida readOnlyHint e openWorldHint, consulta o estoque carregado do JSON local e encerra a conexão pelo context manager.

Qualidade de código

O projeto utiliza type hints, separa responsabilidades entre MCP, serviços, schemas e dados, e mantém dependências mínimas. O pytest cobre os comportamentos implementados, enquanto o Ruff verifica lint, imports, compatibilidade com Python 3.11 e formatação.

Limitações atuais

  • Os dados são carregados de um arquivo JSON local.
  • Não existe banco de dados.
  • Não existe integração com IA ou LLM.
  • Não existem tools de escrita.
  • Não há autenticação ou autorização.

Possíveis evoluções

  • tracing e logging estruturado, mantidos fora do escopo atual para preservar o foco didático do projeto;
  • suporte a Streamable HTTP;
  • persistência em banco de dados;
  • autenticação e autorização;
  • tools de escrita com safeguards;
  • integração futura com LLM.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选