Guck MCP
Guck é um pequeno armazenamento de telemetria focado em MCP para depuração de agentes.
Documentação
Guck
Guck é um armazenamento de telemetria minúsculo, MCP-first, para depuração agêntica. Ele fornece análise de logs eficiente em tokens ao capturar eventos de telemetria JSONL e expor um conjunto mínimo de ferramentas MCP para consultas rápidas e filtradas.
Guck foi projetado para ser:
- Agnóstico de linguagem: emita JSONL de qualquer runtime
- Filtro primeiro: sem tail padrão; as ferramentas MCP focam em consultas direcionadas
- Baixo atrito: SDK opcional pequeno, CLI
wrapsimples para stdout/stderr
Instalação
pnpm add -g @guckdev/cli
# or
npm install -g @guckdev/cli
# or
npx @guckdev/cli
Nota: o comando guck é fornecido pelo @guckdev/cli. Se você já tiver o guck npm não relacionado instalado globalmente, desinstale-o primeiro. Se você instalou o guck-cli anteriormente, mude para o @guckdev/cli.
Início rápido
- Configure o MCP (Codex/Claude/Copilot):
{
"mcpServers": {
"guck": {
"command": "guck",
"args": ["mcp"],
"env": {
"GUCK_CONFIG_PATH": "/path/to/.guck.json"
}
}
}
}
- Captura de logs drop-in (JS) — use auto-capture, emit(), ou ambos:
import "@guckdev/sdk/auto";
import { emit } from "@guckdev/sdk";
emit({ message: "hello from app" });
- Execute seu aplicativo; o cliente MCP iniciará o
guck mcpe os logs poderão ser consultados viaguck.stats/guck.search.
Vite drop-in (dev)
Adicione o plugin Vite para fazer proxy do /guck/emit durante o desenvolvimento:
import { defineConfig } from "vite";
import { guckVitePlugin } from "@guckdev/vite";
export default defineConfig({
plugins: [guckVitePlugin()],
});
Em seguida, aponte o SDK do navegador para /guck/emit.
Estrutura do monorepo
packages/guck-cli— CLI (wrap/emit/checkpoint/mcp)packages/guck-core— configuração/tipos/armazenamento/redação compartilhadospackages/guck-js— SDK JSpackages/guck-mcp— servidor MCPpackages/guck-py— SDK Pythonpackages/guck-vite— plugin do servidor de desenvolvimento Vitespecs— fixtures de contrato compartilhadas para testes de paridade
SDK Python (prévia)
Instalação via PyPI:
pip install guck-sdk
Instalação local de desenvolvimento:
uv pip install -e packages/guck-py
Uso:
from guck import emit
emit({"message": "hello from python"})
Melhores práticas (copiar e colar)
- Adicione a configuração compartilhada (commit no repositório):
.guck.json
{
"version": 1,
"enabled": true,
"default_service": "api"
}
Opcional: adicione .guck.local.json para substituições por desenvolvedor (ignorado pelo git). Você pode executar guck init para gerar o .guck.json.
- Adicione uma linha ao AGENTS.md:
When debugging, use Guck telemetry first (guck.stats → guck.search; tail only if asked).
- Execute:
guck wrap --service api --session session-001 -- <your command>
guck mcp
Sessão vs trace
Guck suporta tanto session_id quanto trace_id, mas eles servem a propósitos diferentes:
trace_idé correlação de escopo de requisição (uma única transação entre serviços).session_idé correlação de escopo de execução (uma execução de desenvolvimento, execução de teste ou experimento local).
session_id é útil mesmo quando você já tem traces, porque muitos eventos não estão vinculados a um trace (inicialização, jobs em segundo plano, tarefas cron, etc.). Ele também oferece uma maneira simples de filtrar uma execução de desenvolvimento inteira sem configurar a propagação de traces.
Exemplo:
export GUCK_SESSION_ID=session-001
guck wrap --service api --session session-001 -- pnpm run dev
Configuração
Guck lê .guck.json da raiz do seu repositório. Se presente, .guck.local.json é mesclado por cima para substituições por desenvolvedor.
Guck está habilitado por padrão usando padrões integrados. Adicione um .guck.json (e opcionalmente .guck.local.json) ou defina GUCK_CONFIG_PATH (ou GUCK_CONFIG) para apontar para um arquivo de configuração ou diretório do repositório. Você também pode definir "enabled": false dentro da configuração para desativá-lo explicitamente.
Para uso do MCP em vários repositórios, cada ferramenta aceita um parâmetro opcional config_path para apontar para um .guck.json específico.
Rastreamento multi-serviço ou multi-repo (armazenamento compartilhado)
Para rastrear entre microsserviços locais (ou vários repositórios), aponte cada serviço para o mesmo diretório de logs absoluto via GUCK_DIR. Isso cria um armazenamento de logs compartilhado único que guck.search pode consultar. Use um GUCK_SESSION_ID compartilhado para correlacionar eventos e nomes de service distintos para separar fontes.
Exemplo de ambiente compartilhado:
export GUCK_DIR=/path/to/guck/logs
export GUCK_SESSION_ID=session-001
# optional: share a single config across repos
export GUCK_CONFIG_PATH=/path/to/shared/.guck.json
Exemplo de configuração compartilhada:
{
"version": 1,
"enabled": true,
"default_service": "api",
"redaction": {
"enabled": true,
"keys": ["authorization","api_key","token","secret","password"],
"patterns": ["sk-[A-Za-z0-9]{20,}","Bearer\\s+[A-Za-z0-9._-]+"]
},
"mcp": { "max_results": 200, "max_output_chars": 20000, "default_lookback_ms": 300000 }
}
Backends remotos (CloudWatch/K8s) exigem instalações opcionais do SDK; instale apenas se você os usar.
Auto-captura do SDK JS (stdout/stderr)
O SDK JS pode corrigir process.stdout e process.stderr para emitir eventos Guck. Habilite-o no início da inicialização do seu aplicativo:
import "@guckdev/sdk/auto";
// or
import { installAutoCapture } from "@guckdev/sdk";
installAutoCapture();
Alternâncias de configuração:
{ "sdk": { "enabled": true, "capture_stdout": true, "capture_stderr": true } }
Se você estiver usando guck wrap, a CLI define GUCK_WRAPPED=1 e a auto-captura do SDK intencionalmente pula para evitar registro duplicado.
SDK do navegador (console + erros)
Use um endpoint do servidor de desenvolvimento que aceite /guck/emit e grave eventos no armazenamento local. No Vite, o plugin @guckdev/vite fornece esse endpoint. Para outras stacks, adicione um endpoint pequeno que encaminhe payloads para o emit() do lado do servidor.
Emita eventos do navegador:
import { createBrowserClient } from "@guckdev/browser";
const client = createBrowserClient({
endpoint: "/guck/emit",
service: "web",
sessionId: "session-001",
});
await client.emit({ message: "hello from the browser" });
Auto-capture da saída do console + erros não tratados:
const { stop } = client.installAutoCapture();
console.error("boom");
// call stop() to restore console and listeners (useful in component unmounts/tests)
stop();
Notas:
installAutoCapture()geralmente deve ser chamado uma vez na inicialização do aplicativo; chamadas repetidas envolverão o console várias vezes.- Se você instalá-lo dentro de um componente ou teste, chame
stop()na limpeza para evitar registro duplicado. - Para SPAs, tudo bem chamar
installAutoCapture()uma vez na entrada do seu aplicativo (ex.:index.ts) e nunca chamarstop(). - Ainda não há bundle UMD/IIFE pré-construído; para JS vanilla, você deve usar um bundler ou importação ESM nativa.
Substituições de ambiente
GUCK_CONFIG_PATH— caminho de configuração explícito (arquivo ou diretório do repositório)GUCK_CONFIG— alias deGUCK_CONFIG_PATHGUCK_DIR— substituição do diretório de armazenamento (padrão:~/.guck/logs)GUCK_ENABLED— true/falseGUCK_SERVICE— nome do serviçoGUCK_SESSION_ID— substituição de sessãoGUCK_RUN_ID— substituição do ID de execução
Checkpoint
guck checkpoint grava um arquivo .guck-checkpoint na raiz do seu diretório de armazenamento (GUCK_DIR ou ~/.guck/logs) contendo um timestamp em milissegundos epoch. Quando as ferramentas MCP são chamadas sem since, Guck usa o timestamp do checkpoint como janela de tempo padrão. Você também pode passar since: "checkpoint" para ancorar explicitamente uma consulta ao checkpoint.
Esquema de eventos (JSONL)
Cada linha no log é um único evento JSON:
{
"id": "uuid",
"ts": "2026-02-08T18:40:00.123Z",
"level": "info",
"type": "log",
"service": "worker",
"run_id": "uuid",
"session_id": "session-123",
"message": "speaker started",
"data": { "turnId": 3 },
"tags": { "env": "local" },
"trace_id": "...",
"span_id": "...",
"source": { "kind": "sdk" }
}
Estrutura de armazenamento
Por padrão, Guck grava arquivos JSONL por execução em ~/.guck/logs:
~/.guck/logs/<service>/<YYYY-MM-DD>/<run_id>.jsonl
Defina GUCK_DIR para substituir a raiz.
CLI mínima
A CLI do Guck é intencionalmente mínima. Ela existe para capturar e servir telemetria; a filtragem é MCP-first.
guck init— criar.guck.jsonguck checkpoint— gravar timestamp epoch.guck-checkpointguck wrap --service <name> --session <id> -- <cmd...>— capturar stdout/stderrguck emit --service <name> --session <id>— anexar eventos JSON do stdinguck mcp— iniciar servidor MCPguck upgrade [--manager <npm|pnpm|yarn|bun>]— atualizar a instalação da CLI
Ferramentas MCP
Guck expõe estas ferramentas MCP (filtro primeiro):
guck.searchguck.search_batchguck.statsguck.sessionsguck.tail(disponível, mas não padrão na documentação)
Parâmetros de busca e tail
guck.search e guck.tail suportam controles adicionais de saída e consulta:
query— busca booleana apenas sobre message (sem diferenciar maiúsculas/minúsculas). SuportaAND,OR,NOT, parênteses e frases entre aspas.contains— busca por substring em message/type/session_id/data (inalterado).format—json(padrão) outext.fields— quandoformat: "json", projete eventos para estes campos. Caminhos com pontos comodata.rawPeaksão suportados.flatten— quandoformat: "json", emita caminhos de campos com pontos como chaves de nível superior (ex.:"data.rawPeak": 43).template— quandoformat: "text", formate cada linha usando tokens como{ts}|{service}|{message}. Tokens com pontos como{data.rawPeak}são suportados. Tokens ausentes se tornam strings vazias.force— ignorar a proteção de tamanho de saída e retornar o payload completo.max_message_chars— limite por mensagem; trunca apenas o campomessage.
A saída é limitada por mcp.max_output_chars. Se uma resposta exceder o limite, a ferramenta retorna um aviso em vez de eventos/linhas, a menos que force=true. Os avisos incluem avg_message_chars e max_message_chars calculados a partir de mensagens completas, sem truncamento.
Exemplos:
{ "query": "error AND (db OR timeout)" }
{ "format": "text", "template": "{ts}|{service}|{message}" }
{ "format": "json", "fields": ["ts", "level", "message"] }
{ "format": "json", "fields": ["ts", "data.rawPeak"], "flatten": true }
Busca em lote:
{
"searches": [
{ "id": "errors", "query": "error", "limit": 50 },
{ "id": "warnings", "levels": ["warn"], "limit": 50, "max_message_chars": 200 }
]
}
Saída mínima recomendada para agentes:
{ "format": "text", "template": "{ts}|{service}|{message}" }
Orientação de uso para IA
Comece com stats, depois search, e use tail apenas se necessário:
guck.statscom uma janela de tempo estreitaguck.searchpara tipos/níveis/mensagens relevantesguck.tailapenas quando streaming ao vivo for necessário
Isso mantém os prompts curtos e evita inundar o modelo com logs irrelevantes.
Estratégia de depuração (recomendada)
Use Guck como um loop fechado para evitar spam de logs e desperdício de tokens:
- Escopo com
guck.stats(janela de tempo curta, serviço/sessão). - Inspecione com
guck.searchpara erros/avisos ou um limite específico. - Formule hipóteses sobre o estágio ou componente com falha.
- Instrumente apenas o limite (entrada/saída, entradas/saídas).
- Execute novamente e consulte novamente a mesma janela estreita.
Isso mantém as investigações focadas enquanto ainda permite depuração profunda e iterativa.
Redação
Guck aplica redação na gravação e na leitura usando nomes de chave e padrões regex configurados.
Compatibilidade
Qualquer linguagem pode emitir eventos Guck gravando linhas JSONL no armazenamento. O SDK opcional simplesmente adiciona conveniências como run_id e redação.
Exemplo de configuração do servidor MCP
{
"mcpServers": {
"guck": {
"command": "guck",
"args": ["mcp"],
"env": {
"GUCK_CONFIG_PATH": "/path/to/.guck.json"
}
}
}
}
Licença
MIT