Prototipo · Versión preliminar: todos los servidores del registro oficial, sincronizados cada 30 minutos. Las reseñas y las cuentas llegarán en una etapa posterior.
PopNx MCPServidores MCP para quienes usan IA · explicados con palabras sencillas

SUNGLASSES

de sunglasses-devversión 0.6.8i★ –iSe ejecuta en tu computadora
Nombre en el registroio.github.sunglasses-dev/sunglasses

Instalar

Resumen

Descripción del creador (original en inglés)

Input firewall for AI agents: scan text and files before an agent reads them. Local, no network.

Los tres pilares de PopNx MCP

Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.

Qué puedes hacer con él

Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.

  • Conexión: Se ejecuta en tu computadora
  • Transporte: stdio
  • Categoría: Otros

Instalación

Elige la app de IA que usas y copia la configuración.

Antes de instalar

Necesitas

  • PyPIuv de Python instalado (para el comando uvx)

¿Qué app usas?

Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.

Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json

{
  "mcpServers": {
    "sunglasses": {
      "command": "uvx",
      "args": [
        "sunglasses"
      ]
    }
  }
}

Ejecuta esto en tu terminal

claude mcp add sunglasses -- uvx sunglasses

Abrir en Cursor

O copia la configuración tú

Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json

{
  "mcpServers": {
    "sunglasses": {
      "command": "uvx",
      "args": [
        "sunglasses"
      ]
    }
  }
}

Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.

Abrir en VS Code

O copia la configuración tú

Pégalo en .vscode/mcp.json de tu proyecto

{
  "servers": {
    "sunglasses": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "sunglasses"
      ]
    }
  }
}

Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.

Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.

Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.

Esta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.

Qué puede hacer

Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.

Revisiones básicasi

Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 6 nov 2026

  • ✓ Superada

    El creador coincide con el repo

    El nombre en el registro se verificó con la cuenta de GitHub sunglasses-dev, dueña del repo

  • … Aún sin revisar

    Sigue en mantenimiento

    Todavía no hemos leído este repo en GitHub

  • … Aún sin revisar

    Tiene licencia

    Todavía no hemos leído este repo en GitHub

  • – No aplica

    El endpoint responde

    Este se ejecuta en tu computadora; no hay endpoint en internet

  • – No aplica

    Inicio de sesión con OAuth

    Se ejecuta en tu computadora y usa ajustes locales en su lugar

  • … Aún sin revisar

    Sin instrucciones ocultas en las descripciones de herramientas

    Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet

Comparado con otros en Otrosi

  • Más estrellas que el 0% de los otros 32509 servidores de esta categoría
  • Publicado en el registro más recientemente que el 61% de los otros 32509 servidores de esta categoría
  • Revisiones básicas iguales o mejores que el 100% de los otros 32509 servidores de esta categoría

Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.

Preguntas frecuentes

¿Es seguro SUNGLASSES?

Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.

¿Qué claves o códigos necesita?

El registro no indica ninguna clave obligatoria, aunque algunos servidores te piden iniciar sesión la primera vez que los usas.

¿Se ejecuta en mi computadora o en la nube?

Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).

¿Sigue en mantenimiento?

El repo de GitHub cambió por última vez –, y la última versión (0.6.8) llegó al registro hace 24 días.

¿Qué apps pueden usarlo?

Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Python (uv) en tu computadora.

¿Qué puedo usar en su lugar?

En la misma categoría: Spec Driven Development, Remote Desktop Commander, Fomu MCP

Alternativas

Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.

Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi

Spec Driven Development

de formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

Se ejecuta en tu computadora★ 440MITActualizado hace 14 meses
Instalar

Remote Desktop Commander

de desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

Se ejecuta en la nube★ 211Actualizado ayer
Instalar

Fomu MCP

de gabrielmahia

Kenya government form guides: checklists, draft letters, eCitizen, Huduma, timelines. Sample data.

Se ejecuta en tu computadoraActualizado hoy
Instalar

README del creador

Abrir el README

Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.

SUNGLASSES

Open source input firewall for AI agents, beta. A local scanner checks text, code, PDFs, images, QR codes, audio and video with 1,513 patterns that carry a matcher (1,584 are listed) across 117 listed categories and reports findings and incomplete scans. A Claude Code hook blocks secret material in tool calls and the paths and hosts your policy lists, before a tool runs, best effort under its 10 second timeout.

What works today

  • Scan text, files, PDFs, images and QR codes from the CLI or from Python
  • An MCP server your agent calls, and a GitHub Action that scans every pull request
  • A Claude Code hook that blocks the credential paths and policy violations your policy lists, before a tool runs
  • A local MCP proxy that refuses every tools/list and tools/call until a person approves the server at an interactive terminal. Once approved, it withholds a credential in a tool call or in a tool result, which is the credential lane and not general inspection of everything a tool returns. Installing it is not protection on its own. See What the proxy enforces.
  • Outside that lane this reads input, so a clean result is a confidence floor and not a guarantee

Sunglasses is a local, open-source scanner for text and supported files. It reports what it matched and what it could not read, so you can decide what to pass onward. It produces findings and an exit status; a CI job, a Claude Code hook or your own code acts on that result.

Sixty seconds

python3 -m venv .venv && source .venv/bin/activate

python -m pip install --upgrade sunglasses curl -fsSL -o sixty-seconds.sh https://raw.githubusercontent.com/sunglasses-dev/sunglasses/main/demo/sixty-seconds.sh && bash sixty-seconds.sh

An activated virtualenv keeps the install and the sunglasses your shell resolves in the same environment, and --upgrade matters if you already have an older version. curl -fsSL fails on an HTTP error instead of saving the error page, so the script only runs if the download actually succeeded.

The script writes three fixture files into a temp directory, and deliberately scans a fourth path that does not exist, five scanner invocations in total, because the archive is scanned twice (human output and JSON). The script's own commands execute; scanned content stays data (it is never executed, and the ZIP is not extracted).

Abbreviated output, recorded on 0.5.6. Finding rows 2-5 are omitted below; timings and presentation are not shown because they vary:

$ sunglasses scan --file notes.md            # ordinary sprint notes

PASS — No threats detected. scanner exit code: 0

$ sunglasses scan --file vendor-brief.md # a vendor brief with an instruction buried in it BLOCK [HIGH] — 6 threat(s) found:

  1. [HIGH] Ignore previous instructions GLS-PI-001 … findings 2-5 omitted …
  2. [HIGH] Data exfiltration to sink (mechanism) GLS-MECH-003

scanner exit code: 1

$ sunglasses scan --file attachments.zip # an archive we do not extract INCOMPLETE No findings in the inspected scope. Part of this input was not read, so this is not a clean result. scanner exit code: 3

$ sunglasses scan --file missing.md File not found: missing.md — Nothing was scanned. Check the path. scanner exit code: 2

And the same archive as JSON. Selected fields from the scan document, not the whole of it:

{

"decision": "not_inspected", "threat_found": false, "inspection_complete": false, "is_clean": false, "extraction_warnings": [ "ZIP archive not inspected — SUNGLASSES does not extract this format, so no content from attachments.zip was scanned. This is not a clean result. It lists 2 members, 33 bytes declared by the archive (brief.txt, notes/summary.txt); the member names were scanned." ] }

decision: not_inspected with `is_clean: false`. The archive's table of contents was read and its member names were scanned; the members themselves were not, and when no member name matches a pattern the decision says so itself (before 0.6.17 it said allow beside is_clean: false). A caller that tests `decision == "allow"` stops here; one that tests `decision != "allow"` should read `threat_found` before treating this as a threat. The document exposes the distinction; acting on it is the caller's job.

*Timings and presentation vary. The demo checks the exit statuses and the ZIP coverage fields; report a mismatch against your installed version.*

⭐ If this is useful, consider starring the repository.

🕶 Or try it in your browser, no install: sunglasses.dev/scan (scan text, GitHub repos, or images). Image OCR runs locally in your browser; the image never leaves your device.

What the proxy enforces

python -m sunglasses.proxy -- runs a real MCP server as a child process and mediates the stdio session between it and your client. What it does depends entirely on whether that server has been approved, and the two states are very different.

Before approval, your client's tool requests are refused

Out of the box, every tools/list and tools/call from your client is refused. The client receives a typed JSON-RPC error like this one.

{"jsonrpc":"2.0","id":3,"error":{"code":-32070,"message":"SUNGLASSES_WITHHELD",

"data":{"reason_code":"APPROVAL_REQUIRED","rule":"S4", "status":"not_run","inspection_complete":false, "inspected_utf8_bytes":0, "server_id":"40ed892fc0f0b8819c294778c492dbd0", "snapshot_sha256":"26aeeb2f7c5b61aa33523967171d46c0d248cd13d612cef913b089daccae4c64"}}}

`server_id` and `snapshot_sha256` are the two values the approve command needs, and the refusal is where you get them. You do not have to look inside the state directory to find out what to approve.

status: not_run and inspected_utf8_bytes: 0 describe your client's request. It is not forwarded to the server and its arguments are not scanned. The proxy does read the server's own tool list first. It fetches every tools/list page from the server and scans the descriptors to build the snapshot you approve. A page with a finding is refused on that finding before any approval is looked up. Installing the proxy does not protect anything by itself.

Approval is a deliberate human step and it requires an interactive terminal.

$ python -m sunglasses.proxy approve <server_id> --snapshot <snapshot_sha256>

approving records that a human viewed this capture, and this is not an interactive terminal, so nobody did # exits 1, nothing is recorded

It prints the tool names and the first 16 characters of each descriptor digest, then asks. It records that someone at an interactive terminal answered yes to that list. From a pipe it refuses. Run it at a real terminal and answer the prompt.

An approval belongs to one server, not to a tool list. The snapshot hash covers the descriptors, and two different servers exposing the same tools have the same snapshot_sha256, but they get different server_ids, and the approval is stored against the server_id. Measured: two servers whose captures both read snapshot_sha256 26aeeb2f7c5b61aa… carry the ids 8740fa6360ce72946fa5a99e86974e01 and 0096972d2543ec556ad9eefe9c144b05, and approving the first left the second refusing with APPROVAL_REQUIRED until it was approved at its own terminal prompt.

So changing the command behind a familiar tool list does not inherit the approval you already gave. A server that presents the same descriptors as one you trust is still a server you have not approved.

After approval (both directions, in the credential lane)

With the snapshot approved, the mediator inspects messages in both directions and withholds one whose content the engine blocks, returning the reason code, the rule, the bytes inspected and the rule ids that fired:

{"jsonrpc":"2.0","id":3,"error":{"code":-32070,"message":"SUNGLASSES_WITHHELD",

"data":{"reason_code":"PROHIBITED_CONTENT","rule":"S2","status":"complete", "inspection_complete":true,"inspected_utf8_bytes":87, "rule_ids":["GLS-SD-001-API","GLS-SD-003-API"]}}}

  • A credential in a tool RESULT is withheld from your client. The -API rules are the tool-result channel. A tool result is the api_response channel: from the shell, sunglasses scan --channel api_response runs those rules, and --channel tool_output runs none of the credential rules. A test pins this wording and the three facts behind it (see the CHANGELOG entry).
  • `GLS-SD-010` is line-anchored, and that is a limit in every channel. It matches an assignment at the start of a line, so a KEY=value that is indented by any whitespace, or sits inside a JSON string, or sits behind a quote, is not matched on any channel, not in a tool result, and not in a file or a message either, which are channels it does declare. Indentation alone is enough, which makes this wider than it sounds: a config block, a YAML mapping or an indented snippet all miss. Note the assignment's POSITION is what matters and not the quoting of its value. PASSWORD="hunter2" at a line start is matched, "PASSWORD=hunter2" is not. When the value is in a known credential format the GLS-SD-001 family still catches it everywhere (GLS-SD-001 on file, message and web content, GLS-SD-001-API in a tool result), so what is actually uncovered is an assignment whose value has no recognisable shape (a password, a DSN, an internal token) once it is embedded. Closing it needs a different anchor, which is a new rule with its own fixtures rather than a channel added to this one.
  • A credential in a tool CALL does not reach the server. Verified by reading the receiving server's own input, not by asking the proxy.
  • Ordinary traffic passes. tools/list returns the real list and a benign call returns its real result.

Ctrl-C while the proxy is serving no longer aborts the interpreter. Once shutdown finishes, the process exits with status 130. Shutdown waits on the server, so a server that has stopped reading its input can hold it open.

What this is not

This is the credential lane on tool results and tool calls. It is not general inspection of everything a tool returns, and no comparison with any other tool is claimed. See *Not claimed in this release* in CHANGELOG.md.

Four exit statuses, deliberately different signals:

| exit | meaning

Solo se muestra el principio; lee el resto en el repo

Pregunta a PopNx