npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@rede-ancora/mcp-portal-b2b-internal

v0.1.2

Published

MCP server exposing the Rede ANCORA portal-b2b ERP API to internal agents (JWT bearer auth)

Readme

@rede-ancora/mcp-portal-b2b-internal

Servidor MCP (Model Context Protocol) que expõe a API ERP do portal-b2b da Rede ANCORA para agents internos via Claude Desktop, Cursor, Cline, Claude Code e outros clientes compatíveis.

Diferente do pacote @rede-ancora/mcp-portal-b2b-franchise (que é escopado por CNPJ e usa API key do franqueado), este servidor opera com JWT bearer no guard auth:erp e expõe a superfície de integração ERP do portal — operações de faturamento, cancelamento de pedidos, callbacks, boletos, consulta global de estoque/preços, e fila de integração de pedidos. Acesso cross-CNPJ por design.

Audiência

Devs e agents internos da Rede ANCORA. Não distribuir credenciais a terceiros. A conta de serviço usada (default [email protected]) tem privilégios significativos no ambiente ERP do portal.

O que é MCP?

MCP é um protocolo aberto que padroniza como agents de IA descobrem e executam "tools" (ações) em sistemas externos. Este pacote roda como um servidor stdio que:

  1. Lê o snapshot OpenAPI ERP do portal embarcado no pacote.
  2. Gera dinamicamente uma tool MCP para cada endpoint ERP.
  3. Faz lazy login ao primeiro uso, cacheia o JWT em memória, re-loga quando expira.
  4. Encaminha chamadas para a API HTTPS do portal com Authorization: Bearer <jwt>.

Pré-requisitos

  • Node.js 20 ou superior.
  • Conta de serviço ERP com permissão no guard auth:erp do portal. Default: [email protected]. Senha provisionada via canal de TI interno.

Instalação

Adicione ao arquivo de configuração do cliente MCP:

Claude Desktop

Edite ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "rede-ancora-internal": {
      "command": "npx",
      "args": ["-y", "@rede-ancora/mcp-portal-b2b-internal@latest"],
      "env": {
        "ANCORA_ERP_USER": "[email protected]",
        "ANCORA_ERP_PASSWORD": "<senha>",
        "ANCORA_ENV": "prod"
      }
    }
  }
}

Reinicie o Claude Desktop.

Cursor

Em ~/.cursor/mcp.json (ou via Settings → MCP):

{
  "mcpServers": {
    "rede-ancora-internal": {
      "command": "npx",
      "args": ["-y", "@rede-ancora/mcp-portal-b2b-internal@latest"],
      "env": {
        "ANCORA_ERP_USER": "[email protected]",
        "ANCORA_ERP_PASSWORD": "<senha>"
      }
    }
  }
}

Cline / Claude Code

Mesma estrutura no arquivo de config MCP do cliente.

Variáveis de ambiente

| Variável | Obrigatória | Default | Descrição | |---|---|---|---| | ANCORA_ERP_USER | sim | — | Usuário da conta de serviço ERP. | | ANCORA_ERP_PASSWORD | sim | — | Senha da conta de serviço ERP. | | ANCORA_ENV | não | prod | prod ou staging. Define o host base. | | ANCORA_API_URL | não | derivado de ANCORA_ENV | Sobrescreve URL base. Use o prefixo de deploy (ex: https://api.redeancora.com.br/b2b/api). | | ANCORA_LOG_LEVEL | não | info | error, warn, info, debug. Logs em stderr. |

NUNCA commit dessas variáveis. Configure-as apenas no JSON local do cliente MCP, que vive fora do controle de versão.

Autenticação

O fluxo é lazy login + re-login on expiry:

  1. No primeiro tool call, o servidor faz POST /erp/integration/v1/auth/login com { user, password }.
  2. Resposta retorna access_token e expires_in. Token vai pra cache em memória do processo MCP.
  3. Cada chamada subsequente injeta Authorization: Bearer <token>.
  4. Se o token está perto de expirar (margem de 60s), próximo call dispara um novo auth/login e cacheia o novo token.
  5. Se o portal retornar 401 (token revogado server-side), servidor invalida o cache, faz novo login e tenta o request uma vez.

O cache de token vive apenas em memória do processo. Encerrar o cliente MCP descarta tudo.

Concorrência: chamadas paralelas que disparam refresh ao mesmo tempo são serializadas via mutex single-flight — só um login HTTP de fato.

Tools disponíveis

Total: 15 tools geradas a partir do snapshot OpenAPI ERP. Inclui as rotas routes/erp.php do portal mais alguns endpoints de produto que a API ERP compartilha.

Faturamento e cancelamento de pedidos (4)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_orders_invoice_create | POST /erp/integration/v1/orders/invoice | Informa faturamento de pedidos pelo ERP, anexando dados da NFe. | | erp_integration_v1_orders_invoice_cancel | POST /erp/integration/v1/orders/invoice/cancel | Cancela uma NFe específica. | | erp_integration_v1_orders_cancel | POST /erp/integration/v1/orders/cancel | Cancela pedido. | | erp_integration_v1_orders_callback_create | POST /erp/integration/v1/orders/callback | Callback do ERP atualizando status do pedido. |

Boletos (2)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_bankslip_create | POST /erp/integration/v1/bankslip | Recebe um ou mais boletos do ERP e associa às NFes. | | erp_integration_v1_bankslip_document_update | PATCH /erp/integration/v1/bankslip/document | Atualiza dados de um título já existente. |

Produtos — preços, estoques, aplicações (4)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_products_stock_and_prices_list | GET /erp/integration/v1/products/stock-and-prices | Lista de preços e estoques de um produto. | | erp_integration_v1_products_all_prices_stocks_create | POST /erp/integration/v1/products/all-prices-stocks | Preços/estoques em todos os CDs disponíveis. | | erp_integration_v1_products_stock_by_customer_list | GET /erp/integration/v1/products/stock-by-customer | Estoques nos CDs do franqueado, dado o CNPJ. | | erp_integration_v1_products_aplicacoes_create | POST /erp/integration/v1/products/aplicacoes | Aplicações de um produto pelo ID do catálogo. |

Cliente (1)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_customers_document_get | GET /erp/integration/v1/customers/document/{document} | Dados do franqueado pelo documento (CNPJ). |

Fila de integração de pedidos (3)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_sales_integration_queue_orders_list | GET /erp/integration/v1/sales/integration-queue/orders | Lista paginada da fila de integração. | | erp_integration_v1_sales_integration_queue_summary_list | GET /erp/integration/v1/sales/integration-queue/summary | Resumo agregado (cards/gráficos). | | erp_integration_v1_sales_integration_queue_filters_list | GET /erp/integration/v1/sales/integration-queue/filters | Opções para filtros de UI. |

Importação manual de pedido (1)

| Tool | Endpoint | Descrição | |---|---|---| | erp_integration_v1_orders_manual_create | POST /erp/integration/v1/orders/manual | Importa uma ordem de venda manualmente. |

Nota: os nomes das tools com prefixo erp_integration_v1_ são longos porque os paths OpenAPI do guard erp não são processados pelo redutor de prefix do gerador (que cobre apenas /integration/v1/ e /api/integration/v1/). Há issue planejada para encurtar os nomes em uma versão futura — vai ser breaking change.

Modo detail

A maioria das tools de listagem retorna apenas campos resumidos por padrão (id, nome, status, valores chave) e limita a 50 itens por chamada. Para receber o objeto completo:

  • Use a tool <recurso>_get(id) correspondente, OU
  • Adicione detail: true na chamada de listagem.

Exemplo:

erp_integration_v1_sales_integration_queue_orders_list({ status: "failed", detail: true })

Erros comuns

| Erro | Significado | Ação | |---|---|---| | Configuração ausente: defina a variável de ambiente ANCORA_ERP_USER. (ou _PASSWORD) | Env var não setada. | Adicione no JSON do cliente MCP e reinicie. | | Falha de autenticação: /erp/integration/v1/auth/login returned 401: ... | Credenciais ERP inválidas. | Verifique usuário e senha. Se mudou recentemente, atualize a config. | | Falha de autenticação: ... (em chamada não-login) | Token cacheado revogado server-side. Servidor já tentou re-login + retry uma vez sem sucesso. | Verifique se a conta foi desabilitada no portal. | | Limite de requisições atingido. | Rate limit. | Aguarde. Servidor faz uma única retentativa em 429. | | Erro da API (HTTP 403). ... | A conta tem credenciais válidas mas sem permissão para o endpoint. | Verifique permissões da conta [email protected] (ou a que estiver usando) no portal. |

Logs estruturados ficam em stderr (com Authorization header e campos password/*token* redacted automaticamente). Capturados pelo Claude Desktop em ~/Library/Logs/Claude/mcp-server-*.log. Suba o nível com ANCORA_LOG_LEVEL=debug para ver request/response.

Segurança operacional

  • Conta dedicada. Use sempre uma conta de serviço (default [email protected]), não credenciais pessoais. Permite auditar e revogar sem afetar usuários.
  • Senha em env var apenas. Nunca em arquivo committed.
  • Rotação periódica. Troque a senha conforme política interna.
  • Logs filtrados. Headers sensíveis e campos password/*token* são redacted antes de gravar em stderr.
  • Token só em memória. Encerrar o processo descarta o JWT.

Atualizando para versão mais recente

npx -y @rede-ancora/mcp-portal-b2b-internal@latest força fetch da última versão. Reinicie o cliente MCP após atualizar config.

Para pinar versão específica: @rede-ancora/[email protected] no args.

Reportando bugs

Abra issue interna em https://github.com/Rede-Ancora/portal-b2b/issues com tag mcp-internal. Inclua:

  • Versão do pacote.
  • Cliente MCP + versão.
  • ANCORA_LOG_LEVEL=debug rodando + trecho relevante dos logs (com credenciais redacted automaticamente).
  • Tool chamada + payload sanitizado.

Licença

UNLICENSED — uso restrito a equipe interna da Rede ANCORA.