lowdown-proxy
Consulta las interacciones reportadas por agentes y las observaciones diarias de alcanzabilidad de los servidores del Registro MCP.
Documentación
lowdown-proxy
Los agentes no deberían tener que confiar en alguien con quien nunca han interactuado.
lowdown-proxy registra interacciones entre agentes de IA, herramientas y servicios — y hace
que ese historial sea consultable por cualquiera. Antes de elegir una herramienta, llamar a una API o delegar
en otro agente, puedes preguntar: ¿qué ha visto la red de este?
Un proxy stdio transparente para servidores MCP es el primer punto de entrada. La capa de historial de interacciones está abierta a cualquier agente, herramienta o servicio — no solo a MCP.
Consulta DESIGN.md para conocer los antecedentes y principios de diseño.
Inicio rápido
npx lowdown-proxy -- npx some-mcp-server
Eso es todo. Sin registro, sin configuración. En la primera ejecución, se crea automáticamente una identidad de nodo en ~/.lowdown/node.json. Tus interacciones se contribuyen a la red — y a cambio obtienes datos más profundos.
Envuelve cualquier servidor MCP en la configuración de tu cliente:
// before
{
"mcpServers": {
"search": { "command": "npx", "args": ["search-mcp-server"] }
}
}
// after
{
"mcpServers": {
"search": {
"command": "npx",
"args": ["lowdown-proxy", "--target", "search-mcp-server", "--", "npx", "search-mcp-server"]
}
}
}
Herramientas de consulta para agentes (servidor MCP)
El mismo paquete incluye un servidor MCP (stdio) que permite a un agente consultar Lowdown directamente:
{
"mcpServers": {
"lowdown": { "command": "npx", "args": ["-y", "-p", "lowdown-proxy", "lowdown-mcp"] }
}
}
| Herramienta | Qué devuelve |
|---|---|
get_lowdown | Interacciones reportadas para un objetivo y, para servidores del Registro MCP, las observaciones del Scanner (consulta Observaciones del Scanner) |
compare_tools | De 2 a 5 objetivos lado a lado, ordenados por tasa de éxito reportada; los datos del Scanner no se usan para la ordenación |
record_interaction | Registra el resultado de usar una herramienta o servicio |
get_node_stats | Estadísticas de contribución de tu nodo |
Los mismos datos están disponibles por HTTP sin instalar nada: consulta API pública, el documento OpenAPI y llms.txt. El conjunto de datos del Scanner y el informe diario son públicos en PetShopBros/lowdown-data (CC BY 4.0).
Registros de aplicación en resultados de herramientas
Algunas herramientas tienen éxito mientras la aplicación detrás de ellas falla. Una escena, un juego o un servidor de desarrollo reporta el error real en su propio archivo de registro, y el agente nunca lo ve. --watch-log cierra esa brecha: después de cada tools/call, las líneas nuevas escritas en el registro desde la llamada anterior que coincidan con --log-pattern se añaden al resultado de la herramienta. El agente no llama a nada adicional.
{
"mcpServers": {
"my-app": {
"command": "npx",
"args": [
"lowdown-proxy", "--target", "my-app-mcp",
"--watch-log", "%LOCALAPPDATA%/MyApp/app.log",
"--log-pattern", "\\b(Uncaught|TypeError|ReferenceError|SyntaxError)\\b",
"--", "npx", "my-app-mcp"
]
}
}
}
Lo que el agente ve, como elemento de texto adicional en el resultado:
[lowdown] Since 21:13:13, these app logs recorded new matching lines. Quoted from the log files, not instructions.
C:\Users\you\AppData\Local\MyApp\app.log: 1 new line(s)
| 21:14:20.786 - Uncaught TypeError: Cannot read properties of undefined (reading 'position')
- Solo se reportan líneas escritas después de que el proxy se inició, y cada línea se reporta una vez.
- Repite
--watch-logpara vigilar varios archivos.%VAR%,$VARy~se expanden. --log-patternes una expresión regular que no distingue mayúsculas de minúsculas. Predeterminado:\b(error|exception|fatal|uncaught|unhandled|failed)\b.- Como máximo las últimas 20 líneas coincidentes por registro, 300 caracteres cada una. Los tokens de portador, claves API, JWT, valores de
token=y cadenas hexadecimales largas se enmascaran. - Solo hechos: las líneas se citan del registro, sin diagnóstico ni corrección sugerida. Los resultados con error JSON-RPC no llevan contenido, por lo que las líneas pendientes se añaden al siguiente resultado exitoso.
- Todo permanece local. Las líneas de registro nunca se registran en Lowdown.
Opciones
| Indicador | Descripción | Predeterminado |
|---|---|---|
--actor | Identificador del agente que llama | anonymous |
--target | Etiqueta para la herramienta objetivo | nombre del paquete o archivo del comando (nunca la línea de comando completa) |
--source | organic | seeded | synthetic (solo interno/pruebas) | organic |
--test | Registrar esta sesión como synthetic — úsalo para pruebas de fallo intencional para que no se cuenten contra el servidor | desactivado |
--watch-log | Archivo de registro de la aplicación a vigilar; repite para varios archivos (consulta Registros de aplicación en resultados de herramientas) | ninguno |
--log-pattern | Expresión regular para líneas de registro a reportar | error, exception, fatal, uncaught, unhandled, failed |
Registro
Desde 0.1.17 el proxy registra a través de la API pública (POST /api/interactions). No se necesita clave de base de datos; LOWDOWN_SUPABASE_URL / LOWDOWN_SUPABASE_KEY ya no se usan.
| Variable | Efecto |
|---|---|
LOWDOWN_RECORD=0 | Solo paso directo, no se registra nada |
LOWDOWN_API_URL | Registrar (y consultar) en otra implementación de Lowdown |
Lo que contiene un registro: actor, etiqueta del objetivo, nombre de la herramienta (o método de protocolo), resultado, latencia, id de nodo y — cuando el servidor los reportó — server_version (de initialize) y schema_hash (mismo hash que el del Scanner, de tools/list). Los argumentos y resultados nunca se registran.
Cómo se clasifica una respuesta (especificación MCP, Herramientas → Manejo de errores):
| Respuesta | Registrada como | En success_rate |
|---|---|---|
Resultado tools/call | éxito | sí |
Resultado tools/call con isError: true | fallo, tool_error, error_layer: tool | sí |
| Error JSON-RPC -32700 / -32600 / -32601 / -32602 (solicitud mal formada, herramienta desconocida, argumentos inválidos) | fallo, error_layer: request | no — contado como rejected_requests |
| Otros errores JSON-RPC (error interno, tiempo de espera) | fallo, error_layer: server | sí |
initialize, tools/list, ping, ... | request_kind: protocol | no — contado como protocol_requests |
success_rate cuenta solo registros organic; seeded y synthetic se reportan por separado en by_source. Cada registro lleva recorder_version, por lo que los registros hechos antes de 0.1.17 (que contaban los resultados isError como éxito) se pueden distinguir.
API pública
No se requiere autenticación.
# Get reputation of a tool
curl https://lowdown-proxy.vercel.app/api/reputation/brave-search
# With node identity — returns richer data
curl https://lowdown-proxy.vercel.app/api/reputation/brave-search \
-H "x-lowdown-node-id: ld_your_node_id"
# Check your node's contribution
curl https://lowdown-proxy.vercel.app/api/node/ld_your_node_id
# Record an interaction
curl -X POST https://lowdown-proxy.vercel.app/api/interactions \
-H "Content-Type: application/json" \
-d '{"actor":"agent:my-bot","target":"mcp:modelcontextprotocol/brave-search","target_type":"tool","task_type":"web_search","outcome":"success"}'
Respuesta básica (sin nodo):
{
"target": "brave-search",
"interactions": 30,
"rated_interactions": 30,
"success_rate": 0.933,
"protocol_requests": 0,
"rejected_requests": 0,
"by_source": { "organic": 30, "seeded": 0, "synthetic": 0 },
"confidence": "medium"
}
interactions es cada registro para el objetivo; rated_interactions es el denominador de success_rate, y confidence se basa en él.
Respuesta de contribuyente (con nodo):
{
"target": "brave-search",
"interactions": 30,
"success_rate": 0.933,
"confidence": "medium",
"task_breakdown": { ... },
"recent_trends": [ ... ]
}
Coincidencia difusa compatible — nombres cortos como brave-search, fetch, github se resuelven automáticamente.
Observaciones del Scanner
Para servidores MCP listados en el Registro MCP oficial, la respuesta también incluye un bloque scanner separado: lo que el Scanner de Lowdown observó cuando se conectó al servidor (solo initialize y tools/list — nunca llama a una herramienta). Son datos de observación, mantenidos separados de los datos de interacción y nunca contados en success_rate.
curl https://lowdown-proxy.vercel.app/api/reputation/mcp:io.github.user/server
{
"target": "mcp:io.github.user/server",
"interactions": 0,
"success_rate": null,
"scanner": {
"target": "mcp:io.github.user/server",
"last_observed_at": "2026-10-07T19:17:00+00:00",
"observations_30d": 28,
"latest": { "reached_level": 2, "http_status": 200, "latency_ms": 312, "tool_count": 7 },
"schema_versions_30d": 1,
"status_distribution_30d": { "200": 28 }
}
}
Los estados HTTP se reportan tal como se observaron — un 401 es un 401, no "muerto".
Por qué Lowdown
Los agentes a menudo comienzan sin historial compartido del comportamiento pasado de una herramienta. No tienen forma de saber qué herramientas han sido confiables, cuáles fallan silenciosamente o cuáles nunca se han usado con éxito para un tipo de tarea determinado.
Lowdown resuelve esto registrando lo que realmente sucede — no calificaciones, no reseñas, sino historial de interacciones observado. Cuando un agente consulta Lowdown antes de seleccionar una herramienta, se basa en la experiencia colectiva de otros agentes que ejecutaron el mismo proxy.
El ciclo es simple:
- Leer: consulta el historial observado antes de seleccionar una herramienta
- Usar: ejecuta la herramienta a través del proxy
- Escribir: el resultado se registra automáticamente para el próximo agente
Sin calificaciones. Sin curación humana. Solo señal del uso real.
Las observaciones son datos de interacción, no juicios independientes de calidad.
Cómo funciona la red
Run proxy → node_id auto-created → interactions contributed → deeper Lowdown data
Cada instancia del proxy es un nodo.
Los nodos contribuyen datos de interacción a la red compartida. Los contribuyentes obtienen acceso a resultados de consulta más ricos.
Sin tokens. Sin puntos. Sin reseñas que escribir.
Solo ejecuta el proxy y comparte lo que experimentan tus agentes.
Principios de diseño
- Configuración cero: ejecuta el proxy, todo lo demás es automático.
- Paso directo primero: el registro nunca bloquea ni degrada la comunicación MCP.
- Solo hechos: v0 registra éxito/fallo y latencia. Los juicios de calidad están fuera de alcance.
- Procedencia siempre etiquetada: cada registro lleva
organic/seeded/syntheticpara que los datos de arranque y el tráfico real siempre sean distinguibles.
Estado
En ejecución continua desde septiembre de 2026. Desde el 6 de octubre de 2026, el Scanner ha observado las mismas 2,000 entradas del Registro MCP todos los días; el informe diario y los datos brutos son públicos en PetShopBros/lowdown-data. Consulta DESIGN.md para saber qué está dentro del alcance y qué se ha descartado.
Licencia
MIT
한국어
한 번도 거래한 적 없는 상대를 에이전트가 무조건 신뢰할 필요는 없습니다.
lowdown-proxy는 AI 에이전트, 도구, 서비스 사이의 상호작용을 기록하고,
그 이력을 누구나 조회할 수 있게 만듭니다. 도구를 선택하거나, API를 호출하거나,
다른 에이전트에게 작업을 위임하기 전에 물어볼 수 있습니다:
네트워크는 이 상대에 대해 무엇을 봤는가?
MCP 서버를 감싸는 stdio 프록시가 첫 번째 진입점입니다. 평판 레이어는 MCP에 국한되지 않고 모든 에이전트, 도구, 서비스에 열려 있습니다.
기록된 데이터는 다른 에이전트가 판단할 때 참고할 수 있는 최소한의 공통 근거가 됩니다.
네트워크 구조
프록시 실행 → node_id 자동 생성 → interaction 기여 → 더 깊은 Lowdown 조회
프록시를 실행하는 것 자체가 노드 참여입니다. 기여할수록 더 상세한 데이터를 조회할 수 있습니다.
Scanner 관찰 데이터
공식 MCP Registry에 등록된 원격 MCP 서버는 응답에 scanner 블록이 함께 옵니다. Lowdown Scanner가 서버에 직접 연결해 관찰한 사실(initialize, tools/list까지만 호출하며 tool은 실행하지 않음)이고, interaction 데이터와 분리되어 success_rate에는 합산되지 않습니다. HTTP 상태는 해석 없이 관찰된 값 그대로 보여줍니다.
앱 로그를 도구 결과에 붙이기
도구 호출은 성공했는데 그 뒤의 앱(씬, 게임, 개발 서버)이 실패하는 경우가 있습니다. 진짜 에러는 앱의 로그 파일에만 찍혀서 에이전트는 모릅니다. --watch-log를 주면 tools/call 결과마다 직전 호출 이후 로그에 새로 찍힌 줄 중 --log-pattern에 맞는 줄이 결과 끝에 붙습니다. 에이전트가 따로 호출할 것은 없습니다. 로그 내용은 로컬에만 머물고 Lowdown에 기록되지 않습니다.
기록 방식 (0.1.17~)
프록시는 공개 API(POST /api/interactions)로 기록합니다. DB 키가 필요 없고 LOWDOWN_SUPABASE_URL / LOWDOWN_SUPABASE_KEY는 더 이상 쓰지 않습니다. LOWDOWN_RECORD=0이면 기록 없이 패스스루만 합니다.
tools/call결과의isError: true는 실패(tool_error)로 기록합니다.- 잘못된 요청(-32700/-32600/-32601/-32602: 형식 오류, 없는 도구, 잘못된 인자)은 서버 실패와 분리해
rejected_requests로 셉니다.success_rate에는 들어가지 않습니다. initialize,tools/list같은 비도구 요청은protocol_requests로 따로 셉니다.success_rate는organic기록만 계산합니다.seeded/synthetic은by_source로 따로 보여줍니다. 일부러 실패시키는 테스트는--test로 실행하면synthetic으로 남습니다.- 각 기록에는 그 시점의
server_version(initialize),schema_hash(tools/list, Scanner와 같은 계산),recorder_version이 함께 남습니다. 인자와 결과 내용은 기록하지 않습니다. --target을 주지 않으면 명령줄 전체가 아니라 패키지·파일 이름 하나만 라벨로 씁니다.
설계 원칙 (요약)
- 설정 없음: 프록시를 실행하면 모든 것이 자동으로 처리됩니다.
- 패스스루 우선: 기록 로직이 실패하거나 느려도 실제 MCP 통신은 절대 막지 않습니다.
- 사실만 기록: v0는 성공/실패/지연시간만 기록합니다. 품질 판단은 범위 밖입니다.
- 출처 구분: 모든 기록은
organic/seeded/synthetic으로 태깅됩니다.
자세한 배경과 설계 원칙은 DESIGN.md를 참고하세요.