LiveAuth MCP Server
Prova de Trabalho + autenticação via Lightning Network para agentes de IA. Encapsula ferramentas MCP pagas com recibos assinados via L402.
Documentação
LiveAuth MCP Server
MCP financiado pelo chamador (1.3.0): use o createMcpGate({ publicKey, toolName, fundingMode: 'caller' }) existente. O LiveAuthCore verifica o pagamento do chamador e é responsável pela contabilidade; este pacote é responsável pelos desafios de pagamento, vinculação de tentativas e prevenção de execução duplicada. Financiamento do chamador, exemplos de API e migração. PoW autentica; não financia ferramentas pagas.
Autenticação, medição de pagamento por chamada e recibos assinados para agentes de IA e ferramentas MCP: nativo em Bitcoin, com suporte a Lightning e compatível com L402.
Este servidor MCP permite que qualquer agente de IA autentique-se na sua API usando prova de trabalho (gratuita, sem conta) ou micropagamentos via Lightning Network (sats), e então meça e monetize chamadas subsequentes de ferramentas com preço por chamada, eventos de receita idempotentes e recibos assinados com HMAC que auditores podem verificar offline.
Use quando quiser:
- Proteger uma API ou ferramenta MCP com custo real de computação ou sats reais (anti-spam por design, não por CAPTCHA).
- Cobrar agentes de IA por chamada sem exigir cadastro de conta.
- Emitir uma trilha de auditoria à prova de adulteração (
mcp-call-receipt-v1assinado) para cada invocação paga de ferramenta. - Oferecer acesso a pacotes L402 com suporte a Lightning para sessões MCP pré-pagas.
Experimente em 5 segundos — sem conta, sem chave de API:
npx @liveauth-labs/mcp-server
Sem configuração, o servidor usa o projeto demo anônimo do LiveAuth e o fluxo PoW real. Adicione LIVEAUTH_API_KEY somente quando precisar da política, preço ou atribuição de um projeto específico.
Ferramentas Disponíveis (descoberta automática via Glama / MCP)
| Ferramenta | Finalidade |
|---|---|
liveauth_mcp_start | Iniciar uma sessão. Retorna um desafio PoW, uma fatura Lightning ou uma dica de pacote L402. |
liveauth_mcp_confirm | Enviar um desafio PoW resolvido, uma fatura Lightning paga ou um macaroon L402 → receber um JWT. |
liveauth_mcp_charge | Medir o uso após uma chamada. Com toolName, resolve o preço da ferramenta registrada e registra um evento de receita pago. |
liveauth_mcp_refresh | Trocar um token de atualização por um novo JWT — sem necessidade de reautenticação. |
liveauth_mcp_status | Consultar o status da sessão/pagamento (confirmação Lightning, expiração). |
liveauth_mcp_lnurl | Buscar a fatura BOLT11 de uma sessão (compatível com lnget). |
liveauth_mcp_payment_confirm | Confirmar um pagamento do chamador com a sessão atual; depois, tentar novamente a operação original. |
liveauth_mcp_usage | Consultar orçamento restante, chamadas usadas e janelas de limite de taxa. |
Esquemas completos de parâmetros e respostas estão na Referência de Ferramentas abaixo.
Início Rápido em 5 Minutos
Opção 1 — PoW sem credenciais (sem conta, sem chave, sem carteira)
npx @liveauth-labs/mcp-server
Em um cliente MCP, chame liveauth_mcp_start e depois liveauth_mcp_confirm apenas com o quoteId retornado. O pacote reutiliza seu solucionador PoW existente localmente e a API LiveAuth verifica o desafio assinado antes de emitir um JWT de sessão de curta duração.
Opção 2 — Modo de Produção
- Obtenha uma chave de API em liveauth.app.
- Adicione ao
claude_desktop_config.jsondo Claude Desktop:
{
"mcpServers": {
"liveauth": {
"command": "npx",
"args": ["-y", "@liveauth-labs/mcp-server"],
"env": {
"LIVEAUTH_API_BASE": "https://api.liveauth.app",
"LIVEAUTH_API_KEY": "la_pk_your_public_key"
}
}
}
}
- Reinicie o Claude. Pronto.
Opção 3 — Programático (CLI / SDK)
export LIVEAUTH_API_KEY=la_pk_xxx
npx @liveauth-labs/mcp-server
O pacote também é um SDK TypeScript — veja Uso do SDK abaixo. O binário CLI é liveauth-mcp.
Por que LiveAuth?
Para provedores de API / desenvolvedores de ferramentas:
- Pare bots na camada de protocolo. PoW e sats Lightning não são reproduzíveis, não são phishing e não exigem contas de usuário.
- Cobre por chamada em sats. Assinamos um recibo que você pode mostrar a auditores, clientes ou contadores.
- Envolva qualquer ferramenta MCP com uma linha (
createMcpGate) e obtenha receita por ferramenta, preço mínimo/máximo por ferramenta e tentativas idempotentes.
Para agentes de IA / construtores de agentes:
- Acesso sem permissão a APIs pagas — resolva um PoW ou pague sats, receba um JWT. Sem cadastro, sem e-mail, sem dança OAuth.
- Use PoW, faturas Lightning ou macaroons de pacote L402 para acesso de agentes.
- Projetos podem liquidar por meio de um nó Lightning personalizado quando configurado; caso contrário, os pagamentos usam o nó configurado pelo LiveAuthCore.
A matemática que importa: se sua ferramenta está sendo raspada por um bot, cobrar 1 sat por chamada é suficiente para tornar o raspador não lucrativo. Chamamos isso de economia de custo de ataque, e é a razão de existirmos.
Instalação
npm install -g @liveauth-labs/mcp-server
Ou use diretamente com npx:
npx @liveauth-labs/mcp-server
Goose
O LiveAuth para Goose usa o mesmo servidor MCP stdio baseado em padrões que todos os outros clientes — não há wrapper Goose, daemon ou runtime de autenticação duplicado.
Ou imprima o deep link oficial e os fallbacks atuais:
npx @liveauth-labs/mcp-server setup goose
Para uma sessão CLI Goose avulsa:
goose session --with-extension "liveauth:npx -y @liveauth-labs/mcp-server"
Configuração manual stdio do Goose, quando o deep link não estiver disponível:
extensions:
liveauth:
type: stdio
name: LiveAuth
enabled: true
cmd: npx
args: ["-y", "@liveauth-labs/mcp-server"]
env_keys: []
envs: {}
timeout: 300
Não edite uma configuração Goose existente de forma destrutiva. Prefira o deep link ou goose configure; se você adicionar configuração de projeto posteriormente, insira-a pelas configurações secretas de extensão do Goose, em vez de YAML de texto simples compartilhado.
Teste rápido do Goose
Pergunte ao Goose:
Use o LiveAuth para iniciar o fluxo de autenticação padrão. Confirme a cotação retornada e depois mostre meu uso do LiveAuth.
O fluxo inicial usa o desafio PoW do projeto demo anônimo e não requer carteira. Uma chave pública de projeto é opcional:
| Variável | Quando definir |
|---|---|
LIVEAUTH_API_KEY | Política, preço e atribuição específicos do projeto. |
LIVEAUTH_API_BASE | Uma API LiveAuth auto-hospedada em vez de https://api.liveauth.app. |
LIVEAUTH_DEMO=true | Optar explicitamente pela demo Lightning simulada localmente mais antiga. |
Quando um fluxo pago é solicitado, os resultados da ferramenta mantêm os campos de fatura existentes e também incluem dados estruturados portáveis:
{
"lightning": {
"invoice": "lnbc...",
"lightningUri": "lightning:lnbc...",
"amountSats": 21,
"expiresAt": "2030-03-17T17:46:40.000Z",
"status": "pending"
}
}
Clientes com suporte a MCP Apps podem renderizar o QR incluído, ação de abrir carteira, expiração e estado pago/pendente/expirado em tempo real. Outros clientes recebem o JSON e o conteúdo da imagem QR como resultados MCP comuns.
Solução de problemas do Goose
- Se o link não abrir, execute
npx @liveauth-labs/mcp-server setup goosee use o fallback de sessão única ou manual. - Se
npxnão estiver disponível, instale uma versão atual do Node.js (Node 18 ou mais recente). - Se uma chave de projeto fornecida for rejeitada, remova-a para verificar o fluxo PoW anônimo; chaves inválidas e revogadas intencionalmente não fazem fallback para demo.
- Se uma fatura Lightning expirar, chame
liveauth_mcp_startnovamente para obter uma cotação nova. - Mantenha tokens de atualização e quaisquer credenciais não públicas fora de logs e configuração em texto simples.
O LiveAuth permite que agentes adquiram autorização em tempo de execução, em vez de exigir que cada ferramenta seja provisionada com credenciais permanentes antecipadamente.
Uso do SDK
O pacote também pode ser importado como SDK TypeScript/JavaScript. Importar o pacote não inicia o servidor MCP stdio; o CLI está no binário liveauth-mcp.
Auxiliar de Autenticação do Cliente
import { createMcpClient } from '@liveauth-labs/mcp-server';
const liveauth = createMcpClient({
publicKey: 'la_pk_xxx',
baseUrl: 'https://api.liveauth.app',
onInvoice(invoice) {
// Render invoice.bolt11 as a QR code for a paid Lightning test.
console.log(invoice.bolt11);
},
});
const session = await liveauth.start();
const token = await liveauth.confirm(session);
console.log(token.jwt);
O cliente armazena JWTs confirmados, atualiza-os antes da expiração quando um token de atualização é retornado e expõe o token atual por meio de liveauth.token. Chame liveauth.destroy() quando seu aplicativo estiver encerrando para limpar o estado do token e os temporizadores de atualização.
Para PoW, config.publicKey é a credencial enviada em X-LW-Public. Pode ser a chave pública primária do projeto ou uma chave pública de API ativa pertencente a esse projeto. A API retorna a chave canônica do projeto em session.powChallenge.projectPublicKey; o solucionador faz hash dessa chave retornada, e a confirmação ainda envia a credencial configurada. Essas duas strings de chave podem legitimamente diferir, então compará-las por igualdade não é uma verificação de isolamento de projeto.
Use sessões do seu endpoint de API LiveAuth confiável. O servidor vincula a cotação e o desafio assinado ao projeto resolvido e emite um JWT com projectId e authType. Para diagnóstico, compare o projectId do JWT com o ID de projeto esperado do seu console, sem registrar o token. Decodificar claims sozinho não verifica a assinatura de um JWT.
Para exigir uma fatura paga real:
const session = await liveauth.start({ forceLightning: true });
console.log(session.invoice?.bolt11);
// Poll this after the invoice is paid.
const token = await liveauth.confirmLightning(session);
Auxiliar de Portão do Servidor
import { createMcpGate } from '@liveauth-labs/mcp-server';
const gate = createMcpGate({
publicKey: 'la_pk_xxx',
baseUrl: 'https://api.liveauth.app',
});
const result = await gate.invoke(
jwtFromYourTransport,
{ message: 'hello' },
async (input, context) => ({
content: [{ type: 'text', text: input.message }],
charge: context.liveAuth.charge,
}),
{}
);
gate.invoke(...) valida o JWT, cobra o custo em sats configurado ou o padrão do projeto no backend e passa context.liveAuth para o seu handler. O nome mais antigo gate.gateTool(...) ainda é suportado.
Atribuição de Ferramenta Paga
Se o seu servidor MCP tiver um ID de ferramenta LiveAuth registrado, passe toolId ao criar o portão. As cobranças então vão para:
POST /api/mcp/tools/{toolId}/charge
em vez do endpoint genérico legado:
POST /api/mcp/charge
Você também pode passar um slug/nome de ferramenta registrado como toolName. Nesse modo, as cobranças vão para o endpoint genérico com identidade de ferramenta no corpo:
POST /api/mcp/charge
As cobranças de ferramenta preservam as mesmas verificações de orçamento de sessão, mas também registram um evento de receita imutável com sats brutos, taxa de plataforma LiveAuth, sats líquidos do desenvolvedor, nome do método da ferramenta, projeto/sessão/token pagante, metadados e chave de idempotência. Quando costSats é omitido, o LiveAuthCore usa o preço padrão da ferramenta registrada; sem toolId ou toolName, ele usa o preço MCP global do projeto.
Ferramentas registradas também podem ter uma URL de webhook de chamada paga. Em cada nova chamada paga bem-sucedida, o LiveAuthCore enfileira um webhook liveauth.mcp.tool.paid_call com a identidade da ferramenta, sats brutos/plataforma/líquidos, ID do evento de receita, metadados e o recibo assinado. Se a URL do webhook da ferramenta estiver em branco, o LiveAuthCore usa a URL do webhook do projeto; tentativas idempotentes não enfileiram duplicatas.
import { createMcpGate } from '@liveauth-labs/mcp-server';
const gate = createMcpGate({
publicKey: process.env.LIVEAUTH_PUBLIC_KEY!,
baseUrl: process.env.LIVEAUTH_API_URL ?? 'https://api.liveauth.app',
toolName: 'paid-research-tool',
});
const result = await gate.invoke(
jwtFromYourTransport,
{ url: 'https://example.com' },
async (input, context) => {
const page = await fetch(input.url).then(r => r.text());
return {
text: page,
revenueEventId: context.liveAuth.charge.revenueEventId,
receipt: context.liveAuth.charge.receipt,
netSats: context.liveAuth.charge.netSats,
};
},
{ requestId: 'req_123' },
{
toolMethodName: 'web_fetch',
idempotencyKey: 'req_123',
agentId: 'agent_abc',
metadata: {
urlHost: new URL('https://example.com').hostname,
},
}
);
Quando toolId ou toolName está definido, GateToolOptions suporta:
| Opção | Finalidade |
|---|---|
costSats | Sats opcionais a cobrar por esta chamada. Omita para usar o preço da ferramenta registrada ou o preço global do projeto. |
toolName | Slug/nome de ferramenta opcional por chamada ao usar o endpoint genérico. |
toolMethodName | Método dentro da ferramenta, como web_fetch ou search. |
idempotencyKey | Chave segura para tentativas. Reutilizá-la para a mesma ferramenta retorna o evento de receita original e o recibo assinado em vez de cobrar duas vezes. |
agentId | Identificador opcional de chamador/agente para relatórios. |
metadata | Pequeno objeto JSON para contexto de auditoria. Não armazene saída privada da ferramenta aqui. |
As respostas de cobrança de ferramenta incluem os contadores de orçamento normais mais a contabilidade de receita:
{
"status": "ok",
"callsUsed": 3,
"satsUsed": 15,
"grossSats": 5,
"platformFeeSats": 1,
"netSats": 4,
"feeBasisPoints": 500,
"revenueEventId": "event-guid",
"toolId": "tool-guid",
"toolName": "Paid Research Tool",
"toolSlug": "paid-research-tool",
"receipt": {
"version": "mcp-call-receipt-v1",
"payload": "base64url-canonical-json",
"signature": "base64url-hmac-sha256",
"signatureAlgorithm": "HMAC-SHA256",
"keyId": "liveauth-mcp-receipt-v1",
"body": {
"receiptId": "mcp_receipt_eventguid",
"revenueEventId": "event-guid",
"mcpToolId": "tool-guid",
"toolName": "Paid Research Tool",
"toolSlug": "paid-research-tool",
"toolMethodName": "web_fetch",
"grossSats": 5,
"platformFeeSats": 1,
"netSats": 4,
"idempotencyKey": "req_123"
}
}
}
O recibo é um artefato de auditoria assinado por chamada retornado pelo LiveAuthCore para cobranças pagas de ferramentas. Armazene-o com o resultado da sua ferramenta quando precisar de prova de cobrança ou reconciliação posterior.
Se nenhum toolId ou toolName estiver configurado, o SDK continua usando /api/mcp/charge para medição de uso compatível com versões anteriores.
Configuração
Claude Desktop
Adicione ao seu claude_desktop_config.json:
{
"mcpServers": {
"liveauth": {
"command": "npx",
"args": ["-y", "@liveauth-labs/mcp-server"],
"env": {
"LIVEAUTH_API_BASE": "https://api.liveauth.app",
"LIVEAUTH_API_KEY": "la_pk_your_public_key"
}
}
}
}
Modo sem credenciais: Se você omitir LIVEAUTH_API_KEY, o servidor chama os endpoints MCP normais sem cabeçalho de projeto. O LiveAuth vincula seu projeto demo anônimo configurado, retorna um desafio PoW assinado e preserva verificação normal, JWT, limite de taxa e limites de medição. LIVEAUTH_DEMO=true permanece como opt-in explícito para a prévia Lightning simulada localmente mais antiga.
Outras variáveis de ambiente:
| Variável | Padrão | Finalidade |
|---|---|---|
LIVEAUTH_API_KEY | (não definido) | Sua chave pública de projeto LiveAuth (la_pk_…). |
LIVEAUTH_API_BASE | https://api.liveauth.app | Substituição para LiveAuth auto-hospedado. |
LIVEAUTH_DEMO | false | Usar explicitamente a demo Lightning simulada localmente legada. |
Outros Clientes MCP
O servidor fala stdio (JSON-RPC 2.0). Inicie com:
liveauth-mcp
Também funciona com qualquer cliente compatível com MCP: Cursor, VS Code, ChatGPT, Windsurf, Continue, Cline.
Referência de Ferramentas
Esquemas completos para cada ferramenta MCP. Cada ferramenta é compatível com JSON-RPC 2.0 e testada sob src/index.test.ts e src/cli.test.ts.
liveauth_mcp_start
Iniciar uma nova sessão MCP LiveAuth. Retorna um desafio PoW por padrão, ou uma fatura Lightning se forceLightning=true.
Parâmetros:
forceLightning(booleano, opcional): Se verdadeiro, solicita fatura Lightning em vez de desafio PoWforceL402(booleano, opcional): Se verdadeiro, inicia uma sessão que deve ser confirmada com um macaroon de bundle L402
Retornos (PoW):
{
"quoteId": "uuid-of-session",
"powChallenge": {
"projectId": "guid",
"projectPublicKey": "la_pk_...",
"challengeHex": "a1b2c3...",
"targetHex": "0000ffff...",
"difficultyBits": 18,
"expiresAtUnix": 1234567890,
"signature": "sig..."
},
"invoice": null
}
Retornos (Lightning):
{
"quoteId": "uuid-of-session",
"powChallenge": null,
"invoice": {
"bolt11": "lnbc...",
"amountSats": 50,
"expiresAtUnix": 1234567890,
"paymentHash": "abc123..."
},
"lightning": {
"invoice": "lnbc...",
"lightningUri": "lightning:lnbc...",
"amountSats": 50,
"expiresAt": "2009-02-13T23:31:30.000Z",
"expiresAtUnix": 1234567890,
"status": "pending"
}
}
Retornos (bundle L402):
{
"quoteId": "uuid-of-session",
"powChallenge": null,
"invoice": null,
"authHint": "l402_bundle"
}
liveauth_mcp_confirm
Envie um desafio de prova de trabalho resolvido, deixe o pacote resolver seu desafio em cache, consulte um pagamento Lightning ou apresente um macaroon L402 para receber um token de autenticação JWT.
Parâmetros:
quoteId(string): O quoteId da resposta de iníciochallengeHex(string, opcional, somente PoW): O hex do desafio da resposta de iníciononce(número, opcional, somente PoW): O nonce que resolve o desafio PoWhashHex(string, opcional, somente PoW): O hash resultante (sha256 deprojectPublicKey:challengeHex:nonce)expiresAtUnix(número, opcional, somente PoW): Carimbo de data/hora de expiração do desafiodifficultyBits(número, opcional, somente PoW): Bits de dificuldade do desafiosignature(string, opcional, somente PoW): Assinatura do desafiomacaroon(string, somente L402): Macaroon de bundle retornado do fluxo de reivindicação de bundle L402
Quando o desafio veio deste servidor MCP, chamar confirm com quoteId sozinho reutiliza o solucionador PoW existente do pacote. Campos de solução explícitos permanecem suportados para compatibilidade.
Retornos:
{
"jwt": "eyJhbGc...",
"expiresIn": 600,
"remainingBudgetSats": 10000,
"refreshToken": "abc123def456..."
}
Nota: Armazene o refreshToken com segurança. Ele é retornado nos dados da ferramenta MCP, mas nunca é gravado em stderr ou logs de aplicação. Use liveauth_mcp_refresh para obter um novo JWT sem reautenticar.
liveauth_mcp_charge
Meça o uso da API após fazer uma chamada autenticada. O servidor MCP integrado chama o endpoint genérico /api/mcp/charge. Fornecer toolName permite que o LiveAuth resolva uma ferramenta registrada, aplique seu preço configurado e crie um evento de receita de ferramenta paga; omitir toolName mantém a medição genérica compatível com versões anteriores.
Parâmetros:
callCostSats(número, opcional): Custo da chamada de API em sats. Omita para usar o preço do backend.toolName(string, opcional): Slug/nome da ferramenta MCP registrada para preço e atribuição por ferramenta.
Retornos:
{
"status": "ok",
"callsUsed": 5,
"satsUsed": 15
}
Se o orçamento for excedido:
{
"status": "deny",
"callsUsed": 100,
"satsUsed": 1000,
"reason": "budget_exceeded"
}
liveauth_mcp_status
Verifique o status de uma sessão MCP. Use para consultar a confirmação de pagamento Lightning.
Parâmetros:
quoteId(string): O quoteId da resposta de início
Retornos:
{
"quoteId": "uuid-of-session",
"status": "pending",
"paymentStatus": "pending",
"expiresAt": "2026-02-17T12:00:00Z"
}
Quando paymentStatus for "paid", a sessão está confirmada. Chame liveauth_mcp_confirm novamente para obter o JWT.
liveauth_mcp_lnurl
Obtenha a fatura Lightning para uma sessão (compatível com lnget). Use para recuperar a fatura BOLT11 para pagamento com qualquer carteira Lightning.
Parâmetros:
quoteId(string): O quoteId da resposta de início
Retornos:
{
"pr": "lnbc2100n1...",
"routes": []
}
Nota: Isso é compatível com lnget e outras ferramentas de pagamento Lightning. Use para consultar a fatura quando liveauth_mcp_confirm retornar "payment pending".
liveauth_mcp_usage
Consulte o uso atual e o orçamento restante sem fazer uma cobrança. Use para verificar o status antes de fazer chamadas de API.
Parâmetros: (nenhum obrigatório)
Retornos:
{
"status": "active",
"callsUsed": 5,
"satsUsed": 15,
"maxSatsPerDay": 10000,
"remainingBudgetSats": 9985,
"maxCallsPerMinute": 60,
"expiresAt": "2026-02-17T12:00:00Z",
"dayWindowStart": "2026-02-17T00:00:00Z"
}
liveauth_mcp_refresh
Atualize o token JWT sem reautenticar. Use o refreshToken retornado de confirm para obter um novo JWT quando o atual expirar.
Parâmetros:
refreshToken(string): O refreshToken da resposta de confirm
Retornos:
{
"jwt": "eyJhbGc...",
"expiresIn": 600,
"remainingBudgetSats": 9985
}
Nota: Salve o refreshToken com segurança. Você precisará dele para estender a sessão sem resolver um novo PoW ou fazer outro pagamento Lightning.
Exemplo de Uso
Autenticação PoW
- Chame
liveauth_mcp_startpara obter um desafio PoW e quoteId - Chame
liveauth_mcp_confirmcom o quoteId; o servidor MCP resolve seu desafio em cache com o solucionador de pacote existente - Clientes avançados ainda podem enviar uma solução explícita (
hash = sha256(projectPublicKey:challengeHex:nonce)ondehash < targetHex) - Use o JWT no cabeçalho
Authorization: Bearer <token>para solicitações de API - Após cada chamada de API genérica, chame
liveauth_mcp_chargecom um custo de chamada, ou omita para usar o preço global MCP do projeto - Para ferramentas MCP monetizadas, envolva os manipuladores com
createMcpGate({ toolId })oucreateMcpGate({ toolName })para que cada chamada crie um evento de receita e recibo assinado
Autenticação Lightning
- Chame
liveauth_mcp_startcomforceLightning: truepara obter uma fatura Lightning - Use
liveauth_mcp_lnurl(ou consulteliveauth_mcp_status) para obter a fatura BOLT11 - Pague a fatura usando seu nó/carteira Lightning
- Consulte
liveauth_mcp_statuscom o quoteId até que paymentStatus seja "paid" - Chame
liveauth_mcp_confirmapenas com o quoteId para receber o JWT - Use o JWT com medição genérica
liveauth_mcp_chargeou atribuição de ferramenta paga do SDK
Fluxo de Autenticação
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ AI Agent │────▶│ MCP Server │────▶│ LiveAuth API │
│ │ │ │ │ │
│ 1. Start │ │ /api/mcp/start │ │ Returns PoW │
│ 2. Solve PoW │ │ │ │ challenge │
│ 3. Confirm │ │ /api/mcp/confirm│ │ Returns JWT │
│ 4. API calls │ │ │ │ │
│ 5. Charge │ │ /api/mcp/charge │ │ Meter usage │
└─────────────────┘ └─────────────────┘ └─────────────────┘
Servidores de ferramentas pagas usam o mesmo JWT, mas cobram por meio de um endpoint atribuído:
Agent calls MCP tool
→ Tool server calls POST /api/mcp/tools/{toolId}/charge
or POST /api/mcp/charge with toolName
→ LiveAuth validates JWT and budget
→ LiveAuth records gross / platform fee / net revenue and returns a signed receipt
→ Tool handler runs and returns the result
Fluxo de Bundle L402
O LiveAuthCore suporta bundles L402 com suporte Lightning para acesso MCP pré-pago. Compre um bundle, reivindique o macaroon após o pagamento, inicie uma sessão MCP no modo L402 e confirme com esse macaroon.
# 1. Create a bundle invoice.
curl -X POST https://api.liveauth.app/api/public/l402/bundle/invoice \
-H "Content-Type: application/json" \
-d '{"publicKey":"la_pk_xxx","tier":"starter","agentId":"agent_abc"}'
# 2. After the invoice is paid, claim a macaroon.
curl -X POST https://api.liveauth.app/api/public/l402/bundle/claim \
-H "Content-Type: application/json" \
-d '{"publicKey":"la_pk_xxx","paymentHash":"payment_hash_from_step_1"}'
# 3. Start and confirm an MCP session with the macaroon.
curl -X POST https://api.liveauth.app/api/mcp/start \
-H "X-LW-Public: la_pk_xxx" \
-H "Content-Type: application/json" \
-d '{"forceL402":true}'
curl -X POST https://api.liveauth.app/api/mcp/confirm \
-H "X-LW-Public: la_pk_xxx" \
-H "Content-Type: application/json" \
-d '{"quoteId":"quote_id_from_step_3","macaroon":"macaroon_from_step_2"}'
Desenvolvimento
# Install dependencies
npm install
# Build
npm run build
# Run locally
node dist/cli.js
Recursos
Licença
MIT
Categorias: authentication · payments · lightning · l402 · bitcoin · pay-per-call · metering · agent-tools · anti-abuse · mcp-server · typescript
Contrato de execução paga e diagnóstico (SDK 1.2.0)
O gate valida a sessão, registra a cobrança e então invoca o manipulador.
Autorização mais uma tentativa de execução aceita é cobrável, incluindo uma exceção
do manipulador, timeout ou cancelamento após a cobrança. Não há reembolso automático.
Rejeição de entrada antes do gate e negações de cobrança não consomem uso. Um evento
de receita com status Charged prova a cobrança, não a execução bem-sucedida da ferramenta.
Registre a ferramenta e mova seu ciclo de vida de Draft para Active antes de servir chamadas
pagas. Rascunho significa não publicado (tool_unpublished); Pausado ou outros estados não ativos
retornam tool_inactive. A descoberta pública também requer Visibility=Public, mas
a visibilidade é separada do ciclo de vida: ferramentas ativas privadas/internas podem ser cobradas.
Não há flag de publicação separado ou nova restrição de visibilidade nesta mudança.
Ferramentas desconhecidas ou removidas retornam HTTP 404 com JSON status=deny,
reason=tool_not_found e a identidade da ferramenta fornecida. O ciclo de vida da ferramenta registrada
e negações de orçamento mantêm HTTP 200 com status=deny.
| Motivo | Significado |
|---|---|
tool_unpublished | A ferramenta está em Rascunho. |
tool_inactive | A ferramenta está Pausada ou não ativa. |
tool_not_found | Nenhuma ferramenta correspondente não removida. |
budget_exceeded | A política de orçamento existente rejeitou a cobrança. |
rate_limited | Negação de taxa estruturada suportada pelo SDK; o controlador de cobrança MCP atual não emite esse motivo nem aplica sua configuração por minuto. |
denied | Fallback do SDK quando a negação não tem motivo. Códigos de motivo futuros desconhecidos permanecem disponíveis no erro do SDK. |
gate.charge() retorna negações estruturadas com ok=false, incluindo respostas de erro HTTP JSON com status=deny. gate.invoke() e gate.gateTool() lançam ChargeDeniedError com reason, code, toolName e toolId. Para compatibilidade, ele estende BudgetExceededError (e LiveAuthMcpError); novos manipuladores devem inspecionar reason em vez de assumir que toda instância significa esgotamento de orçamento. Falhas não relacionadas de autenticação HTTP, transporte e validação mantêm seu caminho de erro existente.
Backends mais antigos podem ainda retornar erros de ferramenta desconhecida em texto simples até serem atualizados.
Em falha do manipulador, o gate lança ToolExecutionError com charge,
idempotencyKey e um cause não enumerável. Sua mensagem pública é genérica.
Exponha uma lista de permissões de campos de cobrança: grossSats, revenueEventId, receipt assinado
e a chave de idempotência. Mantenha isError=true na resposta MCP. Não serialize
nem registre a causa do erro, o contexto do manipulador com JWT ou metadados arbitrários.
Payload/assinatura do recibo são artefatos de resposta pública existentes e podem ser retornados.
Uma cobrança bem-sucedida pode não ter recibo; preserve essa distinção em vez de
inventar um. Metadados de cobrança não implicam execução bem-sucedida.
import { ChargeDeniedError, ToolExecutionError } from '@liveauth-labs/mcp-server';
try {
return await gate.invoke(jwt, input, handler, {}, { idempotencyKey });
} catch (error) {
if (error instanceof ToolExecutionError) {
return {
isError: true,
content: [{ type: 'text', text: 'Tool execution failed after authorization' }],
_meta: { liveauth: {
billed: true,
grossSats: error.charge.grossSats,
revenueEventId: error.charge.revenueEventId,
receipt: error.charge.receipt,
idempotencyKey: error.idempotencyKey,
} },
};
}
if (error instanceof ChargeDeniedError) {
// Map known reasons to a public response. Do not serialize error.details wholesale.
throw error;
}
throw error;
}
Três identificadores distintos
- Recibo
body.requestId: identificador de solicitação/correlação HTTP do servidor do LiveAuth para a cobrança original registrada. Uma nova tentativa retorna esse recibo original. - Recibo
body.idempotencyKey: chave de nova tentativa estável controlada pelo chamador. A deduplicação é limitada à sessão do chamador, provedor e ferramenta registrada para financiamento do chamador; financiamento legado do provedor usa projeto pagante e ferramenta. - InvokeWorks
_meta.requestId: ID de correlação MCP/cliente, obtido deX-Request-Idou derivado do ID de solicitação JSON-RPC. InvokeWorks também o usa como chave de idempotência do LiveAuth.
Por exemplo, _meta.requestId="client-123", recibo
body.idempotencyKey="client-123" e recibo body.requestId="server-456"
são válidos juntos. O SDK aceita idempotencyKey; ele não envia uma opção separada
de ID de solicitação do cliente. Contexto do chamador { requestId } é contexto local do manipulador.
Use uma nova chave para uma nova chamada lógica e reutilize uma chave apenas para a mesma operação
pretendida. Cobrança deduplicada não armazena em cache resultados do manipulador: novas tentativas podem executar
o manipulador novamente no modo de provedor legado. Autorizações duplicadas financiadas pelo chamador retornam status de pagamento registrado e não executam novamente. Verificações de estado da ferramenta e preço ainda precedem a deduplicação.