Socket

Escanea dependencias en busca de vulnerabilidades y problemas de seguridad utilizando la API de Socket.

Documentación

Servidor MCP de Socket

Socket Badge Coverage

Follow @SocketSecurity Follow @socket.dev on Bluesky

Socket MCP permite que los asistentes de IA consulten las puntuaciones de seguridad de dependencias y los metadatos de Socket a través del Protocolo de Contexto de Modelo (MCP). Úsalo para puntuar un paquete, auditar un package.json o identificar dependencias riesgosas en una conversación. Conecta tu cliente MCP al servidor alojado en https://mcp.socket.dev/, o ejecuta el paquete npm tú mismo.

✨ Características

  • 🔍 Escaneo de Seguridad de Dependencias - Obtén puntuaciones de seguridad integrales para npm, PyPI, cargo, Maven, NuGet, RubyGems, Go Modules y más (ecosistemas compatibles)
  • 🌐 Servicio Público Alojado - Usa nuestro servidor público en https://mcp.socket.dev/; inicia sesión una vez mediante OAuth, sin necesidad de autoalojamiento
  • 🚀 Múltiples Opciones de Implementación - Ejecuta localmente vía stdio, HTTP, o usa nuestro servicio
  • 🤖 Integración con Asistentes de IA - Funciona perfectamente con Claude, VS Code Copilot, Cursor y otros clientes MCP
  • 📊 Procesamiento por Lotes - Verifica múltiples dependencias en una sola solicitud
  • 🔒 Inicio de Sesión OAuth - El servidor público autentica a través del flujo OAuth de tu cliente MCP; sin necesidad de copiar o gestionar una clave API

🛠️ Este proyecto está en desarrollo temprano y evoluciona rápidamente.

Instalación

Opción 1: Usa el servidor público de Socket MCP (recomendado)

El servidor público usa OAuth. Tu cliente MCP abre un navegador para iniciar sesión en Socket en la primera conexión. No necesitas una clave API.

Instalación manual - Claude Desktop / Claude Code

Agrega el servidor alojado a través de la configuración de conectores personalizados de Claude. El archivo de configuración de Developer es para servidores locales.

  1. Abre Personalizar > Conectores en Claude.
  2. Selecciona Agregar conector personalizado e ingresa https://mcp.socket.dev/ como la URL del servidor. En los planes Team y Enterprise, un propietario de la organización agrega el conector a través de Configuración de la organización > Conectores primero.
  3. Selecciona Conectar y completa el flujo de autorización de Socket cuando se te solicite.
  4. Habilita el conector para tu conversación y luego pregúntale a Claude "Verifica la puntuación de seguridad para express versión 4.18.2".

Para Claude Code, un solo comando hace todo:

claude mcp add --transport http socket-mcp https://mcp.socket.dev/
Instalación manual - VS Code
# For VS Code with GitHub Copilot
code --add-mcp '{"name":"socket-mcp","type":"http","url":"https://mcp.socket.dev/"}'

O agrégalo a .vscode/mcp.json:

{
  "servers": {
    "socket-mcp": {
      "type": "http",
      "url": "https://mcp.socket.dev/"
    }
  }
}
Instalación manual - Cursor

Cursor Settings → MCP → Add new MCP Server. Nombra socket-mcp, tipo http, URL https://mcp.socket.dev/.

{
  "mcpServers": {
    "socket-mcp": {
      "type": "http",
      "url": "https://mcp.socket.dev/"
    }
  }
}
Instalación manual - Windsurf

Windsurf no admite servidores MCP de tipo http. Usa la configuración stdio de la Opción 2 a continuación, o el formulario serverUrl:

{
  "mcpServers": {
    "socket-mcp": {
      "serverUrl": "https://mcp.socket.dev/mcp"
    }
  }
}
Instalación manual - Factory

Factory es una plataforma de ingeniería de software impulsada por IA. Instala el servidor MCP de Socket con la CLI de Factory:

droid mcp add socket https://mcp.socket.dev/ --type http

Para autoalojar con una clave API en su lugar, consulta la Opción 2 a continuación y registra el comando stdio con droid mcp add.

Alternativamente, escribe /mcp dentro del droid de Factory para gestionar servidores MCP desde una interfaz interactiva. Aprende más en la documentación de MCP de Factory.

Clientes que necesitan un puente local

Prefiere la conexión HTTP remota nativa de tu cliente a https://mcp.socket.dev/ cuando esté disponible. Para clientes que solo inician servidores stdio locales, instala mcp-remote 0.8.3:

pnpm add --global mcp-remote@0.8.3

Agrega esta configuración de servidor local a tu cliente MCP:

{
  "mcpServers": {
    "socket": {
      "command": "mcp-remote",
      "args": ["https://mcp.socket.dev/"]
    }
  }
}

El puente se ejecuta en tu computadora y recibe redirecciones OAuth en http://localhost:<port>/oauth/callback. Mantenlo en ejecución mientras autorizas. La versión 0.3.3 introdujo la corrección de autorización a mitad de sesión; las rutas de reenvío y reintento de reautorización se verificaron contra el paquete 0.8.3 publicado. Esta verificación no cubre un inicio de sesión completo en el navegador.

Reutiliza la autorización guardada mientras siga siendo válida. Si un navegador informa una conexión rechazada en la devolución de llamada de localhost, verifica la versión y el proceso del puente. El oyente de devolución de llamada pertenece al puente; cambiar la URL MCP alojada no lo inicia.

Opción 2: Autoaloja el servidor MCP de Socket

El autoalojamiento mantiene cada solicitud dentro de tu propia infraestructura. Requiere un token de API de Socket y Node.js 24 o posterior.

Obtén un token primero. Inicia sesión en socket.dev, abre la página de tokens de API y crea un token con el alcance packages:list. Ese único alcance cubre depscore; las herramientas con alcance organizacional necesitan los alcances que tu organización requiera para los endpoints que llaman. Guía completa: creación y gestión de tokens de API.

Luego elige un transporte. El servidor habla el mismo protocolo MCP de cualquier manera; la diferencia es quién lo inicia.

Stdio (Opción 2a)HTTP (Opción 2b)
Quién inicia el procesoTu cliente MCP, bajo demandaTú, como un servicio de larga duración
A quién sirveUn usuario localCualquier cliente que pueda alcanzar el puerto
Dónde vive el tokenLa configuración del cliente, como una variable de entornoEl entorno del servidor, o encabezados Authorization por solicitud
Úsalo cuandoEres un desarrollador configurando tu propio editorEstás implementando una instancia para un equipo, o la pones detrás de OAuth

Stdio es el predeterminado y la respuesta correcta para un desarrollador individual. Elige HTTP cuando más de una persona, o algo que no sea un proceso local, necesite acceder al servidor.

Instálalo una vez, globalmente, antes de cualquiera de las opciones:

pnpm add -g @socketsecurity/mcp
Opción 2a - Modo Stdio (predeterminado)

Claude Code:

claude mcp add socket-mcp -e SOCKET_API_TOKEN="your-api-token-here" -- socket-mcp

La mayoría de los otros clientes MCP:

{
  "mcpServers": {
    "socket-mcp": {
      "command": "socket-mcp",
      "env": {
        "SOCKET_API_TOKEN": "your-api-token-here"
      }
    }
  }
}
Opción 2b - Modo HTTP

Ejecuta el servidor en modo HTTP:

MCP_HTTP_MODE=true SOCKET_API_TOKEN=your-api-token socket-mcp --http

El servidor escucha en http://localhost:3000/. El endpoint MCP es / y el endpoint de salud es /health; cualquier otra ruta responde 404.

El transporte no tiene estado. Cada POST / es autónomo, sin sesión que abrir, sin encabezado Mcp-Session-Id y nada que expire, por lo que puedes poner varias instancias detrás de un balanceador de carga sin afinidad de sesión. GET y DELETE en el endpoint MCP responden 405. Los clientes escritos para el protocolo 2025, que abren con un protocolo de enlace initialize, también reciben servicio.

Variables de entorno para el modo HTTP:

VariableRequeridaPredeterminadoDescripción
MCP_HTTP_MODESí, a menos que pases --httpfalseConfigúrala en true para servir HTTP en lugar de stdio. La bandera de CLI --http hace lo mismo.
MCP_PORTNo3000Puerto para vincular el servidor HTTP.
SOCKET_API_TOKENRequerida a menos que OAuth esté habilitadoNingunoToken de API de Socket para llamadas API salientes. Consulta la lista de alias a continuación.
SOCKET_OAUTH_ISSUERCon OAuthNingunoURL del emisor OAuth. Debe ser https en un host público. Consulta "Habilitando OAuth" a continuación.
SOCKET_OAUTH_INTROSPECTION_CLIENT_IDCon OAuthNingunoID de cliente utilizado para la introspección de tokens RFC 7662.
SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRETCon OAuthNingunoSecreto de cliente utilizado para la introspección de tokens RFC 7662.
SOCKET_OAUTH_REQUIRED_SCOPESNoNingunoAlcances requeridos en los tokens de acceso entrantes, separados por espacios o comas. Cuando no se configura, cualquier token activo pasa.
SOCKET_OAUTH_REQUIRE_AUDIENCENofalseCuando es true, rechaza un token de acceso cuya respuesta de introspección no lleva ninguna declaración aud. Lee la nota de audiencia a continuación primero.
SOCKET_API_BASE_URLNoNingunoAnula el endpoint de API de Socket ascendente. Vuelve a https://api.socket.dev cuando no se configura.
SOCKET_DEBUGNofalseActiva el rastreo detallado de solicitudes y caché en stderr, apunta depscore a http://localhost:8866 y permite un emisor OAuth local.
TRUST_PROXYNofalseConfía en X-Forwarded-Host y X-Forwarded-Proto al construir URLs de metadatos OAuth. Habilítalo solo detrás de un proxy inverso que los reescriba.

Las tres variables de OAuth son un conjunto: configura las tres o ninguna. Configurar solo algunas hace que el servidor imprima Incomplete OAuth configuration for HTTP mode y salga con 1, en lugar de iniciar silenciosamente sin autenticación.

SOCKET_API_TOKEN es canónico. Estos alias se leen en orden, el primero no vacío gana: SOCKET_API_TOKEN, SOCKET_API_KEY, SOCKET_CLI_API_TOKEN, SOCKET_CLI_API_KEY, SOCKET_SECURITY_API_TOKEN, SOCKET_SECURITY_API_KEY.

SOCKET_API_TOKEN, SOCKET_API_BASE_URL y SOCKET_DEBUG también se aplican en modo stdio. Todo lo demás en la tabla es solo HTTP.

Ajuste de la caché de blobs de archivos de paquete y sus búsquedas

package_files, package_file_contents y package_file_grep obtienen blobs de socketusercontent.com y los mantienen en una caché LRU de todo el proceso. Estos controles existen para operadores que ejecutan el servidor a gran escala; los valores predeterminados son suficientes en otros casos.

VariableDefaultDescription
SOCKET_BLOB_CACHE_BYTES67108864 (64 MB)Bytes que mantiene la caché de blobs antes de desalojar. Un valor no positivo o no analizable vuelve al valor predeterminado.
SOCKET_BLOB_URLhttps://socketusercontent.comURL base de la que se obtienen los blobs.
SOCKET_BROWSER_USER_AGENTUna cadena UA de ChromeUser-Agent enviado en las obtenciones de blobs.
SOCKET_BYPASS_HEADER_NAMENingunoNombre de una cabecera adicional enviada en cada obtención de blobs. Tanto el nombre como el valor deben estar establecidos para que se aplique.
SOCKET_BYPASS_HEADER_VALUENingunoValor para esa cabecera.
SOCKET_INTERNAL_USER_AGENTsocket-internal-tool/1.0User-Agent enviado en la llamada autenticada de listado de archivos.

Habilitando OAuth. Establece las tres variables de OAuth para requerir un token de acceso OAuth en cada solicitud MCP:

MCP_HTTP_MODE=true \
SOCKET_OAUTH_ISSUER=https://issuer.example.com \
SOCKET_OAUTH_INTROSPECTION_CLIENT_ID=your-client-id \
SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRET=your-client-secret \
socket-mcp --http

Con OAuth habilitado, cada solicitud al endpoint de MCP pasa por la introspección de tokens RFC 7662. Un token de API de Socket sin procesar se rechaza con un 401, sea cual sea su prefijo; un token sktsec_ no tiene más privilegios que cualquier otra cadena aquí. Los llamadores envían un token de acceso OAuth, y el servidor usa ese token para las llamadas a la API de Socket que realiza en su nombre. Ejecuta sin las variables de OAuth para aceptar tokens de API de Socket sin procesar en su lugar.

Al iniciar, el servidor descubre los metadatos RFC 8414 del emisor. Un emisor que lleva una ruta (https://auth.example.com/tenant1) se sondea primero en la URL well-known con la ruta insertada (https://auth.example.com/.well-known/oauth-authorization-server/tenant1), y el issuer del propio documento de metadatos debe coincidir con SOCKET_OAUTH_ISSUER byte por byte. El emisor debe estar https en un host público; un emisor de bucle local o de red privada se rechaza de plano a menos que SOCKET_DEBUG=true esté establecido para trabajo con pila local. La misma regla se aplica al introspection_endpoint que anuncian los metadatos.

Los clientes descubren cómo autenticarse a través de GET /.well-known/oauth-protected-resource (RFC 9728), que el servidor publica una vez que OAuth está activado:

{
  "resource": "https://mcp.example.com/",
  "authorization_servers": ["https://issuer.example.com"],
  "scopes_supported": ["packages:list"],
  "bearer_methods_supported": ["header"],
  "resource_name": "Socket MCP Server"
}

Una solicitud rechazada responde 401 con una cabecera WWW-Authenticate que nombra esa URL de metadatos y los ámbitos que este recurso requiere:

WWW-Authenticate: Bearer error="invalid_token", error_description="Invalid or expired token",
  resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource", scope="packages:list"

[!IMPORTANT] Validación de audiencia. Cuando una respuesta de introspección incluye una declaración aud, el servidor requiere que nombre este recurso y rechaza el token en caso contrario. Esa comprobación está siempre activada y no tiene opción de exclusión. Cuando la respuesta no incluye ningún aud, el token se acepta por defecto, porque un servidor de autorización que nunca emite la declaración fallaría en todas las solicitudes. La validación de audiencia te protege exactamente hasta donde tu servidor de autorización rellena aud; si no lo hace, no se comprueba ninguna audiencia. Establece SOCKET_OAUTH_REQUIRE_AUDIENCE=true para requerir además la presencia de la declaración, pero solo una vez que hayas confirmado que tu servidor de autorización devuelve aud en la introspección. Habilitarlo contra un servidor que omite la declaración rechaza todo el tráfico.

Añade TRUST_PROXY=true solo cuando el servidor esté desplegado detrás de un proxy inverso o balanceador de carga de confianza que normalice las cabeceras de host y protocolo reenviadas.

Configura tu cliente MCP para conectarse al servidor HTTP:

{
  "mcpServers": {
    "socket-mcp": {
      "type": "http",
      "url": "http://localhost:3000"
    }
  }
}

Uso

Una vez instalado, haz preguntas a tu asistente de IA como:

  • "Comprueba la puntuación de seguridad para express versión 4.18.2"
  • "Analiza la seguridad de las dependencias de mi package.json"
  • "¿Cuáles son las puntuaciones de vulnerabilidad para react, lodash y axios?"

Herramientas expuestas

El listado completo de herramientas: nombres, argumentos y qué devuelve cada una

depscore

Consulta la API de Socket para obtener información de puntuación de dependencias. Devuelve puntuaciones de cadena de suministro, calidad, mantenimiento, vulnerabilidad y licencia por paquete.

ParámetroTipoRequeridoPredeterminadoDescripción
packagesArray✅ Sí-Array de objetos de paquete a analizar
packages[].ecosystemStringNo"npm"Ecosistema del paquete. Consulta Ecosistemas compatibles a continuación.
packages[].depnameString✅ Sí-Nombre de la dependencia/paquete
packages[].versionStringNo"unknown"Versión de la dependencia
platformStringNo-Indicación de arquitectura de SO (linux-x64, darwin-arm64, win32-x64) aplicada a cada paquete en la solicitud. Selecciona el artefacto más relevante cuando un paquete incluye compilaciones específicas de plataforma.
Ecosistemas compatibles

Basado en el soporte de lenguajes de Socket. El parámetro ecosystem se asigna a tipos PURL:

EcosistemaTipo PURLGestores de paquetesMadurez
JavaScript y TypeScriptnpmnpm, yarn, pnpm, Bun, VLTGA
Pythonpypiuv, pip, Poetry, AnacondaGA
GogolangGo ModulesGA
Java / Scala / KotlinmavenMaven, Gradle, sbtGA
RubygemBundlerGA
.NET (C#, F#, VB)nugetNuGetGA
RustcargocargoGA
PHPcomposerComposerExperimental
GitHub ActionsactionsFlujos de trabajo de GitHub ActionsExperimental (escaneo de flujos de trabajo, no a nivel de paquete)

packagist se acepta como alias de composer, y openvsx para el tipo PURL vscode.

Ejemplo de solicitud:

{
  "packages": [
    { "ecosystem": "npm", "depname": "express", "version": "4.18.2" },
    { "ecosystem": "pypi", "depname": "fastapi", "version": "0.100.0" }
  ]
}

Respuesta, como un único bloque de texto. Cada puntuación es un entero de 0 a 100, cuanto más alto mejor:

Dependency scores:
pkg:npm/express@4.18.2: license: 100, maintenance: 87, quality: 100, supplyChain: 97, vulnerability: 98
  Report: https://socket.dev/npm/package/express
pkg:pypi/fastapi@0.100.0: license: 100, maintenance: 100, quality: 100, supplyChain: 100, vulnerability: 100
  Report: https://socket.dev/pypi/package/fastapi

Los paquetes se devuelven en el orden en que los devuelve la API, no en el orden en que los pediste. Un paquete del que Socket no tiene registro se omite de la lista en lugar de notificarse como error, así que compara la respuesta con tu solicitud cuando falte un nombre.

organizations

Lista las organizaciones de Socket a las que pertenece el usuario autenticado. No toma parámetros. Úsala para descubrir el valor de org_slug que requieren las herramientas con ámbito de organización (alerts, threat_feed).

Esta herramienta necesita un token de API de Socket. Consulta Autenticación para herramientas con ámbito de organización a continuación.

La respuesta es el JSON de la API de Socket, claveado por id de organización. El slug es lo que quieren las otras herramientas:

{
  "organizations": {
    "1234": {
      "id": "1234",
      "name": "Acme Robotics",
      "plan": "enterprise",
      "slug": "acme-robotics"
    }
  }
}

alerts

Lista las alertas de seguridad más recientes de una organización de Socket: problemas de cadena de suministro, vulnerabilidad, calidad, licencia y mantenimiento en los paquetes monitorizados de la organización. Respaldado por GET /v0/orgs/{org_slug}/alerts. Los resultados están paginados; pasa el endCursor de la respuesta anterior como cursor para obtener la siguiente página.

ParámetroTipoRequeridoPredeterminadoDescripción
org_slugString✅ Sí-Slug de la organización (obtenlo de la herramienta organizations)
severityStringNo-Subconjunto separado por comas de low,medium,high,critical
statusStringNo-open o cleared
categoryStringNo-Subconjunto separado por comas de supplyChainRisk,maintenance,quality,license,vulnerability
artifact_typeStringNo-Ecosistemas separados por comas: npm,pypi,gem,maven,golang,nuget,cargo,chrome,openvsx
artifact_nameStringNo-Restringir a un único nombre de paquete
alert_typeStringNo-Tipos de alerta de Socket separados por comas (p. ej. usesEval,unmaintained)
repo_slugStringNo-Slugs de repositorio separados por comas
per_pageIntegerNo100Resultados por página (1–5000)
cursorStringNo-Cursor de paginación: el endCursor de una respuesta anterior

threat_feed

Consulta elementos en el feed de amenazas de una organización de Socket: paquetes marcados recientemente como malware, typosquats, código ofuscado y similares. Respaldado por GET /v0/orgs/{org_slug}/threat-feed. La respuesta incluye un nextPageCursor; pásalo como cursor para avanzar de página.

ParámetroTipoRequeridoPredeterminadoDescripción
org_slugString✅ Sí-Slug de la organización (obténlo de la herramienta organizations)
filterStringNomalCategoría de amenaza: mal (malware), vuln, typ (typosquat), obf (ofuscado), mjo, kes, spy, etc.
ecosystemStringNo-Ecosistema: npm, pypi, gem, maven, golang, nuget, cargo, chrome, openvsx, vscode, huggingface
nameStringNo-Filtrar por nombre de paquete
versionStringNo-Filtrar por versión de paquete
is_human_reviewedBooleanNofalseDevolver solo elementos revisados por humanos
sortStringNoupdated_atCampo de ordenación: id, created_at, updated_at
directionStringNodescDirección de ordenación: asc, desc
updated_afterStringNo-Marca de tiempo ISO; solo elementos actualizados después de esta
created_afterStringNo-Marca de tiempo ISO; solo elementos creados después de esta
per_pageIntegerNo30Resultados por página (1–100)
cursorStringNo-Cursor de paginación: el nextPageCursor de una respuesta anterior

package_files

Lista los archivos publicados en un paquete: un árbol de rutas de archivo, cada uno con su tamaño y hash de blob, para cualquier paquete en un ecosistema compatible. Úsalo para inspeccionar lo que envía una dependencia antes de instalarla. Pasa el hash de un archivo a package_file_contents o package_file_grep.

ParámetroTipoRequeridoPredeterminadoDescripción
ecosystemStringNonpmnpm, pypi, gem, cargo, maven, golang, nuget, chrome, openvsx
depnameString✅ Sí-Nombre del paquete (p. ej. lodash, @babel/core, org.springframework:spring-core)
versionString✅ Sí-Versión del paquete
artifactIdStringNo-Desambiguador por versión (nombre de archivo PyPI, ID de artefacto Maven, recurso NuGet)
platformStringNo-Calificador de plataforma para artefactos por SO/arquitectura (p. ej. openvsx linux-x64, darwin-arm64)

La salida es una línea de encabezado y un árbol. El token después de cada tamaño es el hash del blob:

pkg:npm/lodash@4.17.21 — 1054 files, 1379.3 KB
└── package/
    ├── fp/
    │   ├── __.js  43B  QlKUJ6782LHNEISw-t4uX1hyH1TCZye4ShYOMIAghheg
    │   ├── _baseConvert.js  16.0K  QpGkoQltpQn5ZeTFxYQOnk8FWp-7yyeUQtyzdZXl48nA

package_file_contents

Lee un solo archivo de un paquete. Pasa el hash impreso junto a una entrada en la salida de package_files. Devuelve hasta 1 MB de texto UTF-8; los archivos binarios devuelven solo metadatos.

ParámetroTipoRequeridoPredeterminadoDescripción
hashString✅ Sí-Hash del blob de package_files
pathStringNo-Ruta del archivo, solo para visualización; no afecta la búsqueda

package_file_grep

Busca en un solo archivo de un paquete líneas que coincidan con una expresión regular de JavaScript, devolviendo coincidencias con números de línea (estilo grep -n). Cada blob se obtiene una vez y se mantiene en una caché de todo el proceso, por lo que las lecturas y búsquedas repetidas del mismo hash omiten la red.

ParámetroTipoRequeridoPredeterminadoDescripción
hashString✅ Sí-Hash del blob de package_files
patternString✅ Sí-Expresión regular de JavaScript (los literales simples también funcionan)
caseInsensitiveBooleanNofalseCoincidir sin distinguir mayúsculas/minúsculas
contextLinesIntegerNo0Líneas de contexto antes y después de cada coincidencia (0–5)
maxMatchesIntegerNo100Límite de líneas coincidentes devueltas (1–500)
pathStringNo-Ruta del archivo, solo para visualización; no afecta la búsqueda

Autenticación para herramientas con ámbito de organización

depscore funciona sin credenciales en el servidor público. Las herramientas organizations, alerts, threat_feed y package_files llaman a la API REST autenticada de Socket, por lo que necesitan un token de API de Socket.

La forma en que el servidor resuelve un token depende del transporte:

  • Modo stdio lee un token al inicio desde el entorno y lo usa para cada solicitud. Establece SOCKET_API_TOKEN. El servidor también acepta estos alias, en orden de prioridad: SOCKET_API_TOKEN → SOCKET_API_KEY → SOCKET_CLI_API_TOKEN → SOCKET_CLI_API_KEY → SOCKET_SECURITY_API_TOKEN → SOCKET_SECURITY_API_KEY. SOCKET_API_TOKEN es canónico; SOCKET_API_KEY es el alias que la mayoría de las configuraciones locales ya exportan. Debido a que el proceso pertenece a un usuario, este token es tuyo y limita cada herramienta a tu cuenta.
  • Modo HTTP limita las herramientas de organización al llamante, nunca al token propio del servidor. Envía tu credencial como un encabezado Authorization: Bearer <token> en cada solicitud. Qué credencial enviar depende de si la implementación ejecuta OAuth. En un servidor con OAuth habilitado, envía un token de acceso OAuth: cada token de portador se valida mediante introspección, y un token de API de Socket sin procesar se rechaza con un desafío 401 sin importar con qué comience. En un servidor sin OAuth, envía tu token de API de Socket sin procesar y se usa directamente. En cualquier caso, el servidor usa ese token por solicitud para las llamadas a la API de Socket que realiza en tu nombre. Una implementación compartida nunca responde organizations, alerts, threat_feed o package_files con los datos del operador: cuando una solicitud no lleva token, esas herramientas devuelven el error de autenticación requerida. depscore solo puede recurrir al token de inicio del servidor, ya que las puntuaciones de paquetes son las mismas para cada llamante.

Cuando falta un token, cada herramienta afectada devuelve el mismo mensaje:

Authentication is required. Set SOCKET_API_TOKEN for stdio mode, or send your Socket API
token as an `Authorization: Bearer <token>` header (or connect through OAuth) in HTTP mode.

Genera un token desde el panel de Socket en tokens de API, luego expórtalo antes de iniciar el servidor:

export SOCKET_API_TOKEN="your-socket-api-token"

Ejemplo práctico: detalles de organización y alertas

Con SOCKET_API_TOKEN configurado, pide a tu asistente algo como "muéstrame las alertas críticas abiertas para mi org de Socket". Bajo el capó, el asistente encadena dos herramientas:

  1. Descubre el slug de la organización. Llama a organizations (sin argumentos). El servidor lee tu token, llama a GET /v0/organizations y devuelve las organizaciones que tu token puede ver. Elige el slug que quieras, p. ej. acme-robotics.

  2. Obtén alertas para esa organización. Llama a alerts con el slug y cualquier filtro:

    {
      "org_slug": "acme-robotics",
      "severity": "high,critical",
      "status": "open"
    }
    

    El servidor llama a GET /v0/orgs/acme-robotics/alerts con el mismo token y devuelve las alertas coincidentes más metadatos de paginación. Para avanzar de página, pasa el endCursor de la respuesta de vuelta como cursor.

El mismo token limita cada herramienta con ámbito de organización, por lo que threat_feed y package_files funcionan en el momento en que organizations confirma a qué slug pertenece el token.

Ajuste del uso de herramientas mediante reglas del cliente

Puedes personalizar cómo interactúa el servidor MCP con tu asistente de IA editando el archivo de reglas de tu cliente:

Cliente MCPUbicación del archivo de reglas
Claude Desktop/CodeCLAUDE.md
VSCode Copilot.github/copilot-instructions.md
Cursor.cursor/rules

Ejemplo de regla:

Always check dependency scores with the depscore tool when you add a new dependency. If the score is low, consider using an alternative library or writing the code yourself.

Hook de Claude Code (Opcional)

El repositorio incluye un hook de Claude Code opcional que bloquea paquetes de alto riesgo antes de la instalación. Cuando Claude Code ejecuta un comando de instalación, el hook consulta el servidor MCP público de Socket en https://mcp.socket.dev/ y deniega la instalación cuando la puntuación de la cadena de suministro del paquete está por debajo de 20 (malware conocido, typosquats, señales de alto riesgo en la cadena de suministro). No hay CLI para instalar: copia el archivo y conéctalo; el servidor público inicia sesión mediante OAuth en el primer uso.

Ecosistemas y gestores de paquetes compatibles:

EcosistemaComandos
npmnpm install, npm i, npm add, yarn add, pnpm add, bun add
PyPIpip install, pip3 install, uv add, uv pip install, poetry add, pipenv install
Cargocargo add, cargo install
RubyGemsgem install, bundle add
Gogo get, go install
NuGetdotnet add package, nuget install

Configuración

Pasos de configuración por cliente: Claude Desktop, Claude Code, Cursor y VS Code

Requisitos previos: Node.js 24+.

  1. Copia todo el directorio dist/socket-gate en tu carpeta de hooks. El socket-gate.cjs incluido es autónomo, por lo que se ejecuta sin dependencias a su lado.

    Desde una instalación publicada:

    mkdir -p ~/.claude/hooks
    cp -R node_modules/@socketsecurity/mcp/dist/socket-gate ~/.claude/hooks/
    

    Desde un checkout, compílalo primero:

    pnpm run build
    mkdir -p ~/.claude/hooks
    cp -R dist/socket-gate ~/.claude/hooks/
    
  2. Añade a ~/.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "node ~/.claude/hooks/socket-gate/socket-gate.cjs"
          }
        ]
      }
    ]
  }
}

Consulta hooks/socket-gate/README.md para la referencia completa.

Cómo funciona

El hook deniega la instalación cuando supplyChain < 20, y la permite en caso contrario; por ejemplo, express/lodash/react (75–97) permiten, mientras que browserlist (typosquat de browserslist, 15) y malware confirmado (0) bloquean. Los errores de red, tiempo de espera o análisis fallan en modo abierto, por lo que una interrupción de Socket no bloqueará el trabajo legítimo.

Limitaciones

Una salvaguarda de mejor esfuerzo, no una defensa completa. Brechas conocidas:

  • Ediciones de manifiesto + instalaciones con lockfile. Si Claude edita un manifiesto directamente (package.json, requirements.txt, Cargo.toml, Gemfile, go.mod, *.csproj) y luego ejecuta una instalación simple (npm install, pip install -r requirements.txt, cargo build, bundle install, go mod tidy, dotnet restore), no hay nombre de paquete en la línea de comandos para verificar.
  • Solo invocaciones del gestor de paquetes. Las descargas directas (curl | sh, wget), los scripts post-instalación de paquetes ya aceptados y las dependencias transitivas no se vuelven a verificar.
  • Rutas indirectas de Claude. Los subagentes, las herramientas MCP que ejecutan comandos externos y las llamadas a herramientas que no son de Bash no están cubiertas a menos que se amplíe matcher.

Inspirado en el hook de dependencias de Jimmy Vo.

Desarrollo

Comandos para contribuidores

Este repositorio usa pnpm, y todos los comandos se ejecutan desde la raíz del repositorio. Se requiere Node.js 24+.

git clone https://github.com/SocketDev/socket-mcp.git
cd socket-mcp
pnpm install

Ejecutar desde el código fuente. No se necesita paso de compilación, porque Node 24 elimina el TypeScript por sí mismo:

export SOCKET_API_TOKEN=your_api_token_here
pnpm run server-stdio

O en modo HTTP:

pnpm run server-http

Ambos scripts leen SOCKET_API_TOKEN (con respaldo a SOCKET_API_KEY) de tu entorno. Agrega :debug a cualquiera de ellos (pnpm run server-http:debug) para establecer SOCKET_DEBUG=1 y obtener trazado por solicitud en stderr.

TareaComando
Pruebaspnpm test
Probar un archivopnpm test test/repo/unit/purl.test.mts
Pruebas de extremo a extremo con API en vivopnpm run test:e2e
Verificación de tipospnpm run type
Lint y formatopnpm run fix --all
Suite de verificación completapnpm run check --all
Empaquetar a dist/pnpm run build

Nunca pongas -- antes de una ruta de prueba; eso amplía la ejecución a toda la suite. Escribe pnpm test test/repo/unit/purl.test.mts.

Para manejar un servidor en ejecución manualmente, consulta depuración con mock-client.

Endpoint de verificación de salud

Cuando se ejecuta en modo HTTP, GET /health devuelve la versión del servidor en ejecución y omite la validación de origen, lo que lo hace seguro para llamarlo desde una sonda que no envía el encabezado Origin:

{
  "status": "healthy",
  "service": "socket-mcp",
  "version": "0.0.20",
  "timestamp": "2026-07-29T01:50:30.394Z"
}

Adecuado para sondas de liveness/readiness de Kubernetes, verificaciones de salud de Docker y balanceadores de carga.

Solución de problemas

P: El servidor público no responde - Verifica la URL https://mcp.socket.dev/, confirma la configuración de tu cliente MCP, reinicia tu cliente MCP.

P: Se recibe un error 403 Forbidden: Invalid origin, o el conector nunca abre una pantalla de OAuth - El servidor acepta encabezados Origin del cliente cuando el Host de la solicitud coincide con el despliegue alojado. Confirma que tu cliente usa https://mcp.socket.dev/ y sigue sus pasos de configuración anteriores. Una respuesta persistente de Invalid origin requiere verificar que el despliegue alojado incluya la corrección.

P: El servidor local no se inicia - Asegúrate de que Node.js 24+ esté instalado, verifica que SOCKET_API_TOKEN esté configurado, confirma que el token de API tenga permiso de packages:list. En modo stdio, un token faltante es fatal: el servidor imprime SOCKET_API_TOKEN environment variable is required in stdio mode y sale con 1.

P: El servidor sale con Incomplete OAuth configuration for HTTP mode - SOCKET_OAUTH_ISSUER, SOCKET_OAUTH_INTROSPECTION_CLIENT_ID y SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRET deben estar todos configurados o todos sin configurar.

P: Se reciben errores de autenticación con el servidor local - Verifica que tu clave de API sea válida, asegura el alcance de packages:list, regenérala si es necesario. Si la herramienta que falló fue organizations, alerts, threat_feed o package_files en un despliegue HTTP, el servidor se niega a responder con el token del operador por diseño; envía el tuyo en un encabezado Authorization: Bearer.

P: El asistente de IA no encuentra la herramienta depscore - Reinicia tu cliente MCP después de los cambios de configuración, verifica que la configuración esté guardada, comprueba que el servidor esté en ejecución. tools/list anuncia una caché pública de una hora, por lo que un cliente que almacena en caché la lista de herramientas puede necesitar un reinicio para detectar una herramienta recién agregada.

Obtener ayuda

Licencia

MIT

Socket