O cenario mudou em 2025-2026. Devs Protheus que antes faziam User Function REST pra cada tabela hoje recebem perguntas tipo "da pra ligar o Claude no nosso ERP?" e ficam sem resposta tecnica clara.
Este post entrega a resposta — e o fonte AdvPL completo pra voce baixar e rodar hoje no seu ambiente.
O que e MCP (Model Context Protocol)?
MCP e um protocolo aberto lancado pela Anthropic em novembro/2024 que padroniza como LLMs (Claude, ChatGPT, Gemini) consomem recursos externos: bancos de dados, APIs, arquivos. Em vez de cada IA ter um plugin diferente, o MCP define um contrato unico. Detalhes oficiais aqui.
O McpQuery.prw e nossa implementacao MCP-compatible em AdvPL puro — primeira open source que conhecemos pro Protheus.
O problema que esse fonte resolve
Cenario classico: o cliente quer um chatbot que consulta o ERP. Hoje voce tem 3 opcoes:
- Criar 1 endpoint REST por tabela: SA1 (clientes), SC5 (pedidos), SE2 (titulos)... acaba em 40-80 endpoints. Cada um com codigo duplicado de validacao, paginacao e seguranca. Manutencao vira pesadelo.
- Expor o DBAccess direto: qualquer dev com a string de conexao vira um SELECT inocente em
'; DROP TABLE SA1; --. Inviavel em producao. - Comprar conector pago: licenca de R$ 2-8k/mes por ambiente. Para POC dispendioso, e ainda assim nao integra com Claude/MCP.
O McpQuery resolve as 3 dores: 1 endpoint generico, SQL injection protection embutida, open source MIT. Voce baixa, instala no RPO, configura porta REST e em 15 minutos seu Protheus responde a queries MCP.
Arquitetura
O fluxo e simples mas tem 4 camadas de validacao antes do SQL bater no DBAccess:
Claude/ChatGPT] -->|GET /McpQuery/query| B[McpQuery.prw
WSRESTFUL] B --> C{Modo?} C -->|tableName + fields| D[Validacao
tabela + campos + WHERE] C -->|rawQuery| E[Validacao
blocklist DDL/DML] D --> F[TcGenQry + DbUseArea TOPCONN] E --> F F --> G[DBAccess] G --> H[Postgres/Oracle/SQL Server] F -->|JSON| A B -.audit.-> I[ConOut estruturado
MCP-AUDIT]
Pontos de design que valem destacar:
- Dois modos:
tableName + fields + cWhere(modo seguro, com TOP N + ORDER BY R_E_C_N_O_) ourawQuery(SELECT completo com SUM/GROUP BY/JOIN, pra relatorios analiticos) - Paginacao deterministica: usa
R_E_C_N_O_ > offsetem vez deOFFSET N ROWS. Performance previsivel ate em tabelas de 50M+ registros. - Tabelas de framework (SX1-SXG, SIX) sao tratadas separado — nao tem D_E_L_E_T_ e usam padrao
SX#cEmp0 - Auditoria nativa via
ConOut("[MCP-AUDIT] ...")— qualquer SIEM (Splunk, Datadog, ELK) ja parse direto
Na pratica
Tres exemplos reais que voce pode rodar agora:
Exemplo 1 — Listar clientes ativos do estado SP
curl 'https://seu-protheus:8443/McpQuery/query?tableName=SA1&fields=A1_COD,A1_NOME,A1_EST&cWhere=A1_EST%3D%27SP%27&limit=50' \
-H "Authorization: Basic YWRtaW46c2VuaGE="
Resposta:
{
"data": [
{"A1_COD": "000001", "A1_NOME": "ACME LTDA", "A1_EST": "SP"},
{"A1_COD": "000002", "A1_NOME": "FOO IND COM", "A1_EST": "SP"}
],
"count": 50,
"hasMore": true
}
Exemplo 2 — Total faturado por mes (rawQuery)
curl 'https://seu-protheus:8443/McpQuery/query' \
-G --data-urlencode 'rawQuery=SELECT SUBSTR(F2_EMISSAO,1,6) MES, SUM(F2_VALBRUT) TOTAL FROM SF2010 WHERE D_E_L_E_T_=' ' GROUP BY SUBSTR(F2_EMISSAO,1,6) ORDER BY MES' \
--data-urlencode 'limit=1000'
Exemplo 3 — LLM pergunta direto via MCP
Voce configura o Claude Desktop com um MCP server stub que faz proxy pro endpoint. Ai conversa fica:
Usuario: Quantos pedidos abertos temos do cliente 000123?
Claude: [chama McpQuery com tableName=SC5, cWhere=C5_CLIENTE='000123' AND C5_LIBEROK=' ']
Voce tem 7 pedidos abertos somando R$ 482.150,00. Quer detalhamento?
Seguranca embutida (o diferencial)
Quando voce expoe SQL via REST, atacante tenta de tudo. O McpQuery bloqueia antes de chegar no banco:
| Camada | O que bloqueia | Exemplo |
|---|---|---|
| Validacao de tabela | Caracteres fora de [A-Z0-9_] | SA1; DROP → rejeitado |
| Blocklist DDL/DML | INSERT, UPDATE, DELETE, DROP, ALTER, TRUNCATE, GRANT, REVOKE | DELETE FROM SA1 → rejeitado |
| Blocklist exfiltracao | UNION, OPENROWSET, BULK, xp_, sp_, CHAR(), 0x | UNION SELECT password FROM sys.syslogins → rejeitado |
| Blocklist multi-statement | Ponto-e-virgula em qualquer parte | SELECT 1; SHUTDOWN → rejeitado |
| Subselect em WHERE | Palavra SELECT na clausula WHERE | cWhere=A1_COD IN (SELECT...) → rejeitado |
| Tabelas bloqueadas | Lista hardcoded (SX8 default) | tableName=SX8 → 403 Forbidden |
| Campos sensiveis | PSW, CHKSUM, LICENSA, CORPKEY, SECRET, TOKEN, APIKEY | retorna ***REDACTED*** |
Toda tentativa bloqueada vai pro ConOut com tipo [MCP-AUDIT] [INJECTION]. Voce monta um alerta no Datadog/Splunk e quando alguem tenta atacar voce sabe em segundos.
Aviso de honestidade: nenhuma blocklist e 100%. Em producao, recomendamos camada extra: WAF (Cloudflare/AWS WAF) na frente do endpoint REST + rate limit por IP. O McpQuery e um defense in depth, nao um perimetro.
Quando NAO usar
Pra ser justo com voce, eis 3 cenarios onde nao recomendamos:
- Operacoes de escrita: McpQuery e read-only. Pra criar/alterar dados use o irmao dele, McpExecAuto.
- Latencia < 50ms exigida: a stack TcGenQry + DbUseArea tem ~20-100ms de overhead vs JDBC direto. Pra trading-grade workloads, use replica leitura + JDBC.
- Joins complexos com 5+ tabelas + UNION: o modo rawQuery suporta, mas a blocklist de UNION pode ser restritiva. Avalie criar uma View no banco e expor essa View como tabela.
Caso real
Cliente da industria quimica (40 empresas, 350k SKUs), implantou o McpQuery em outubro/2025 pra alimentar um chatbot interno baseado em Claude 3.5 Sonnet.
Numeros pos-3-meses:
- Volume: 1.200 consultas/dia em horario comercial, picos de 80 req/min
- Latencia p95: 180ms (incluindo Claude + McpQuery + DBAccess)
- Tentativas de injection bloqueadas: 7 nos primeiros 30 dias (todas vindas de pen-test contratado), 0 vindas de usuarios reais
- Redirecionamento de chamadas pro SAC: -34% (usuarios resolvem auto-consulta via chatbot)
Proximos passos
- Baixe o fonte acima (~14KB, MIT)
- Suba no seu RPO via TDS-VSCode ou
advpl-compile(claude-advpl-skill faz isso em terminal) - Configure o appserver.ini com porta REST + Basic Auth + TLS
- Teste o endpoint
?tableName=_DEBUGpra confirmar resolucao das tabelas SIX/SX7/SX9 - Integre com seu LLM preferido — docs MCP oficial ou via plugin OpenAI Function Calling
Quer ver rodando antes de implantar? Marque uma demo de 30min com a gente. A gente mostra Claude consultando um Protheus de demonstracao em tempo real.
Quer Claude consultando seu Protheus amanha?
A ArchTec implanta MCP servers customizados pro seu ambiente — com hardening de seguranca, auditoria e integracao com LLMs. Assessment de 30min gratuito.
Falar com especialista
Comentarios 0