MCP ExecAuto
Engine universal MSExecAuto via REST. Suporta MATA010/020/030/110/120/410 e FINA050 (Modelo 1 e 3) com conversao automatica de tipos via SX3 e rollback transparente.
Assinatura: POST /McpExecAuto/exec {"routine":"MATA410","operation":3,"header":{...},"items":[{...}]}
Retorna: JsonObject {success, routine, operation, key, message, timestamp}
O McpExecAuto.prw e um WSRESTFUL que executa qualquer MSExecAuto registrado via JSON padronizado. Substitui dezenas de User Functions custom de integracao por um endpoint generico.
Rotinas suportadas
| Routine | Tabela | Modelo | O que e |
|---|---|---|---|
| MATA020 | SA2 | 1 | Cadastro de Fornecedor |
| MATA030 | SA1 | 1 | Cadastro de Cliente |
| MATA010 | SB1 | 1 | Cadastro de Produto (warmup SAH) |
| FINA050 | SE2 | 1 | Titulo a Pagar |
| MATA110 | SC1 | 3 | Solicitacao de Compra |
| MATA120 | SC7 | 3 | Pedido de Compra |
| MATA410 | SC5 | 3 | Pedido de Venda |
Autenticacao
Obrigatorio. Configure MV_MCPADMK no appserver.ini com chave forte:
openssl rand -hex 32 # gera chave segura
Envie no header da requisicao:
curl -H "X-Admin-Key: SUA_CHAVE_AQUI" ...
Listar rotinas (auto-documentacao pra LLMs)
curl 'https://seu-protheus:8443/McpExecAuto/exec' \
-X POST -H "X-Admin-Key: ..." -H "Content-Type: application/json" \
-d '{"routine":"_LIST"}'
Retorna estrutura inspirada em function calling da OpenAI — sua IA usa pra descobrir o que pode executar.
Modelo 1 (cadastro simples)
{
"routine": "MATA030",
"operation": 3,
"fields": {
"A1_COD": "C99999",
"A1_LOJA": "01",
"A1_NOME": "ACME LTDA",
"A1_PESSOA": "J",
"A1_CGC": "12345678000199",
"A1_EST": "SP"
}
}
Modelo 3 (cabecalho + itens)
{
"routine": "MATA410",
"operation": 3,
"header": {
"C5_CLIENTE": "C99999",
"C5_LOJACLI": "01",
"C5_TIPO": "N",
"C5_CONDPAG": "001"
},
"items": [
{"C6_PRODUTO":"P00001","C6_QTDVEN":10,"C6_PRCVEN":250.00,"C6_TES":"501"},
{"C6_PRODUTO":"P00002","C6_QTDVEN":5, "C6_PRCVEN":480.00,"C6_TES":"501"}
]
}
Operations
3— Inclusao4— Alteracao5— Exclusao
Conversao automatica de tipos (via SX3)
JSON manda valores como string/number/boolean. A engine consulta SX3->X3_TIPO e converte automaticamente:
- Character (C):
PadR(AllTrim(xVal), X3_TAMANHO) - Numeric (N):
Val(xVal)se string - Date (D): aceita YYYYMMDD (SToD) ou DD/MM/YYYY (CToD)
- Logical (L): "TRUE", "S", "SIM", "1", ".T." viram
.T.
Tratamento de erro
Em caso de falha:
lMsErroAuto = .T.detectadoRollbackSX8()automatico (numerador nao fica preso)- Le
NomeAutoLog()com retry (race condition do arquivo) - Retorna JSON:
{"success":false, "error":"...detalhes do log..."}
Em sucesso:
ConfirmSX8()- Obtem chave gerada via
DbGoBottom - Retorna:
{"success":true, "key":"000123", "timestamp":"..."}
Pegadinhas
- Adicionar rotina custom: novo case em
GetRoutineConfig()+ bloco noBEGIN SEQUENCEdo modelo correto - ExecAuto pula validacao de tela — pontos de entrada de regra (MT100TOK, M410TOK) AINDA rodam
- MATA410 precisa de
extraPrmsetado em config (6 parametros, com PRIVATE l_MSExec3) - Volume alto: ExecAuto e single-thread por conexao DBAccess; pra >100 req/s use queue
Quando NAO usar
- Rotina nao-padrao (User Function de cliente) — adicione em
GetRoutineConfigantes - Workflow com aprovacoes — ExecAuto pula GUI, regras de aprovacao precisam de PE
- Alta vazao > 100 req/s — use queue + workers paralelos
Fonte completo
Codigo AdvPL aberto (MIT, ~14KB): baixar McpExecAuto.prw.
Tutorial completo com casos reais e tabela comparativa: post no blog.
Exemplos
Inclusao de cliente (Modelo 1)
curl -X POST 'https://seu-protheus:8443/McpExecAuto/exec' -H "X-Admin-Key: ..." -d '{"routine":"MATA030","operation":3,"fields":{"A1_COD":"C99999","A1_LOJA":"01","A1_NOME":"ACME LTDA"}}'Output: {"success":true,"routine":"MATA030","key":"C99999","timestamp":"20260514 14:32:08"}