Endpoint MCP
/mcpdesde M4token da instância ou adminQuando usar
Endpoint MCP (streamable HTTP, *stateless*: sem Mcp-Session-Id, cada requisição é autenticada de novo) com o mesmo Authorization: Bearer da API. Com token de instância, as ferramentas operam só naquela instância. O corpo é uma mensagem JSON-RPC do protocolo MCP (initialize, tools/list, tools/call...); o cliente precisa aceitar application/json e text/event-stream.
Num listen_addr de loopback, pedidos com Host que não é loopback são recusados (proteção contra DNS rebinding), exceto o host de public_url, para um proxy reverso na mesma máquina. Clientes na nuvem (ChatGPT, OpenAI) precisam do servidor publicado com TLS. Para clientes locais que iniciam um processo, use litezap mcp (stdio).
Autenticação
Aceita o token da instância (só a própria instância) ou o token admin. Um token de outra instância recebe 403 forbidden (ou 404 not_found em webhooks de outra instância).
Exemplo
curl -s -X POST "$LITEZAP_URL/mcp" \ -H "Authorization: Bearer $LITEZAP_TOKEN" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'const res = await fetch("http://localhost:8787/mcp", { method: "POST", headers: { Authorization: `Bearer ${process.env.LITEZAP_TOKEN}`, "Content-Type": "application/json", "Accept": "application/json, text/event-stream" }, body: JSON.stringify({ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }),});console.log(res.status, res.status === 204 ? "" : await res.json());import osimport requests
r = requests.post( "http://localhost:8787/mcp", headers={"Authorization": f"Bearer {os.environ['LITEZAP_TOKEN']}", "Accept": "application/json, text/event-stream"}, json={ "jsonrpc": "2.0", "id": 1, "method": "tools/list", }, timeout=150,)print(r.status_code, r.json() if r.content else "")package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { req, _ := http.NewRequest("POST", "http://localhost:8787/mcp", strings.NewReader(`{"jsonrpc":"2.0","id":1,"method":"tools/list"}`)) req.Header.Set("Authorization", "Bearer "+os.Getenv("LITEZAP_TOKEN")) req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept", "application/json, text/event-stream") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.Status, string(out))}<?phprequire 'vendor/autoload.php'; // composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client(['base_uri' => 'http://localhost:8787']);$res = $client->request('POST', '/mcp', [ 'headers' => ['Authorization' => 'Bearer ' . getenv('LITEZAP_TOKEN'), 'Accept' => 'application/json, text/event-stream'], 'json' => [ 'jsonrpc' => '2.0', 'id' => 1, 'method' => 'tools/list', ], 'http_errors' => false,]);echo $res->getStatusCode(), ' ', $res->getBody(), PHP_EOL;Nos exemplos, LITEZAP_URL é a URL base (ex.: http://localhost:8787) e o token vem deLITEZAP_TOKEN (instância) ou LITEZAP_ADMIN_TOKEN.
Resposta
200 Resposta JSON-RPC (a lista de ferramentas, no exemplo).
{ "jsonrpc": "2.0", "id": 1, "result": { "tools": [ { "name": "list_instances", "description": "..." }, { "name": "send_message", "description": "..." } ] }}Erros
| Código | HTTP | Retentável | O que fazer |
|---|---|---|---|
unauthorized | 401 | não | Envie Authorization: Bearer <token> válido. |
forbidden | 403 | não | Use o token certo (admin, ou o da própria instância). |
Todo erro usa o envelope {"error":{"code","message","retryable"}}. Tabela completa em Erros.
Equivalente na Z-API: MCP Server. Veja Migrar da Z-API.

