MCP server for frete.center — Brazilian freight (TURBO 3h, drivers, tracking) as a native tool in Claude Code, Claude Desktop and Cursor.
Server defines 6 tools with Portuguese names and descriptions. All tools have input schemas with type definitions and descriptions. However, critical gaps exist: (1) Tool names do not follow verb_noun convention (e.g., 'frete_cotar' should be 'get_quote' or 'quote_freight'); (2) Descriptions are adequate (100-200 chars) but lack actionable context for LLM selection; (3) Output schemas are NOT documented, callers cannot predict response structure; (4) Error handling is minimal, HTTP errors are caught but recovery guidance is absent; (5) Parameters lack validation constraints (e.g., CEP format, km range). The frete_tracking tool is particularly weak: it returns a public URL instead of structured tracking data, forcing the LLM to reason about HTML content. Overall, definitions are present but lack production-grade polish.
Saldo + extrato da carteira do tenant autenticado. Requer FRETE_BEARER.
Cota frete urbano via Lalamove entre dois CEPs brasileiros. Retorna preço, distância, ETA e tier (TURBO 3h ou EXPRESS 12h). Não exige autenticação.
Lista pedidos do tenant autenticado. Requer FRETE_BEARER no env. Para gerar token: POST /api/app/v1/auth/login.
Lista motoristas online (com toggle "disponível agora") em raio de N km de um CEP ou ponto. Coordenadas com jitter ~300m por privacidade LGPD. Cache 30s.
Snapshot agregado da plataforma frete.center: contagem de motoristas online, CEPs cacheados, distâncias proprietárias, blog posts, rotas SEO, marketplace open.
Busca status atual + timeline de um pedido pelo código de tracking público (8 chars maiúsculos).
Tool names do not follow verb_noun convention. Names like 'frete_cotar', 'frete_motoristas_proximos' are domain-specific but lack action verbs (get_, list_, search_). LLMs infer intent from verb prefixes; these names force the LLM to read descriptions to understand what happens when called.
Output schemas are not documented. The code calls http() and returns raw API responses without documenting what fields the LLM should expect. For example, frete_cotar returns price/distance/ETA but the schema is not declared. LLMs cannot plan downstream calls or extract data reliably.
frete_tracking returns a public URL instead of structured tracking data. The tool description promises 'status atual + timeline' but the implementation returns only a URL and a note. LLMs cannot extract actionable tracking info without parsing HTML.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Input parameters lack validation constraints. CEP parameters accept any string; km parameter has no min/max bounds. Descriptions mention '8 dígitos' and '1 a 50 km' but these are not enforced as JSON Schema constraints (minLength, maxLength, minimum, maximum). LLMs may pass invalid values.
Error handling provides no recovery guidance. The http() function throws McpError with raw HTTP status and API error text. LLMs receive no actionable next steps (e.g., 'Try with a different CEP', 'Check FRETE_BEARER is set'). Errors are not categorized as retryable vs. user-fixable.