Socket

Examine dependências em busca de vulnerabilidades e problemas de segurança usando a API Socket.

Documentação

Servidor MCP Socket

Socket Badge Coverage

Follow @SocketSecurity Follow @socket.dev on Bluesky

O Socket MCP permite que assistentes de IA consultem as pontuações de segurança de dependências e metadados do Socket através do Model Context Protocol (MCP). Use-o para pontuar um pacote, auditar um package.json ou identificar dependências arriscadas em uma conversa. Conecte seu cliente MCP ao servidor hospedado em https://mcp.socket.dev/, ou execute o pacote npm você mesmo.

✨ Recursos

  • 🔍 Verificação de Segurança de Dependências - Obtenha pontuações de segurança abrangentes para npm, PyPI, cargo, Maven, NuGet, RubyGems, Go Modules e mais (ecossistemas suportados)
  • 🌐 Serviço Público Hospedado - Use nosso servidor público em https://mcp.socket.dev/; faça login uma vez via OAuth, sem necessidade de auto-hospedagem
  • 🚀 Múltiplas Opções de Implantação - Execute localmente via stdio, HTTP, ou use nosso serviço
  • 🤖 Integração com Assistentes de IA - Funciona perfeitamente com Claude, VS Code Copilot, Cursor e outros clientes MCP
  • 📊 Processamento em Lote - Verifique múltiplas dependências em uma única solicitação
  • 🔒 Login OAuth - O servidor público autentica através do fluxo OAuth do seu cliente MCP; sem necessidade de copiar ou gerenciar chaves de API

🛠️ Este projeto está em desenvolvimento inicial e evoluindo rapidamente.

Instalação

Opção 1: Use o servidor público Socket MCP (recomendado)

O servidor público usa OAuth. Seu cliente MCP abre um navegador para fazer login no Socket na primeira conexão. Você não precisa de uma chave de API.

Instalação manual - Claude Desktop / Claude Code

Adicione o servidor hospedado através das configurações de conector personalizado do Claude. O arquivo de configuração do Developer é para servidores locais.

  1. Abra Personalizar > Conectores no Claude.
  2. Selecione Adicionar conector personalizado e insira https://mcp.socket.dev/ como a URL do servidor. Nos planos Team e Enterprise, um proprietário da organização adiciona o conector através de Configurações da Organização > Conectores primeiro.
  3. Selecione Conectar e complete o fluxo de autorização do Socket quando solicitado.
  4. Habilite o conector para sua conversa e pergunte ao Claude "Verifique a pontuação de segurança para express versão 4.18.2".

Para Claude Code, um único comando faz tudo:

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

Ou adicione ao .vscode/mcp.json:

{
  "servers": {
    "socket-mcp": {
      "type": "http",
      "url": "https://mcp.socket.dev/"
    }
  }
}
Instalação manual - Cursor

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

{
  "mcpServers": {
    "socket-mcp": {
      "type": "http",
      "url": "https://mcp.socket.dev/"
    }
  }
}
Instalação manual - Windsurf

O Windsurf não suporta servidores MCP do tipo http. Use a configuração stdio na Opção 2 abaixo, ou o formulário serverUrl:

{
  "mcpServers": {
    "socket-mcp": {
      "serverUrl": "https://mcp.socket.dev/mcp"
    }
  }
}
Instalação manual - Factory

Factory é uma plataforma de engenharia de software alimentada por IA. Instale o servidor MCP Socket com a CLI do Factory:

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

Para auto-hospedar com uma chave de API, veja a Opção 2 abaixo e registre o comando stdio com droid mcp add.

Alternativamente, digite /mcp dentro do droid do Factory para gerenciar servidores MCP a partir de uma interface interativa. Saiba mais na documentação MCP do Factory.

Clientes que precisam de uma ponte local

Prefira a conexão HTTP remota nativa do seu cliente para https://mcp.socket.dev/ quando disponível. Para clientes que apenas iniciam servidores stdio locais, instale mcp-remote 0.8.3:

pnpm add --global mcp-remote@0.8.3

Adicione esta configuração de servidor local ao seu cliente MCP:

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

A ponte roda no seu computador e recebe redirecionamentos OAuth em http://localhost:<port>/oauth/callback. Mantenha-a em execução enquanto autoriza. A versão 0.3.3 introduziu a correção de autorização no meio da sessão; os caminhos de retry de encaminhamento e reautorização foram verificados contra o pacote 0.8.3 publicado. Esta verificação não cobre um login completo no navegador.

Reutilize a autorização salva enquanto ela permanecer válida. Se um navegador relatar conexão recusada no callback localhost, verifique a versão e o processo da ponte. O listener de callback pertence à ponte; alterar a URL MCP hospedada não o inicia.

Opção 2: Auto-hospede o servidor MCP Socket

A auto-hospedagem mantém cada solicitação dentro da sua própria infraestrutura. Ela precisa de um token de API do Socket e Node.js 24 ou posterior.

Obtenha um token primeiro. Faça login em socket.dev, abra a página de tokens de API e crie um token com o escopo packages:list. Esse único escopo cobre depscore; as ferramentas com escopo de organização precisam dos escopos que sua organização exigir para os endpoints que elas chamam. Tutorial completo: criando e gerenciando tokens de API.

Depois escolha um transporte. O servidor fala o mesmo protocolo MCP de qualquer forma; a diferença é quem o inicia.

Stdio (Opção 2a)HTTP (Opção 2b)
Quem inicia o processoSeu cliente MCP, sob demandaVocê, como um serviço de longa duração
Quem ele atendeUm usuário localQualquer cliente que possa alcançar a porta
Onde o token ficaNa configuração do cliente, como uma variável de ambienteNo ambiente do servidor, ou em cabeçalhos Authorization por solicitação
Use quandoVocê é um desenvolvedor configurando seu próprio editorVocê está implantando uma instância para uma equipe, ou colocando-a atrás de OAuth

Stdio é o padrão e a resposta certa para um desenvolvedor individual. Escolha HTTP quando mais de uma pessoa, ou algo que não seja um processo local, precisar alcançar o servidor.

Instale uma vez, globalmente, antes de qualquer opção:

pnpm add -g @socketsecurity/mcp
Opção 2a - Modo Stdio (padrão)

Claude Code:

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

A maioria dos outros clientes MCP:

{
  "mcpServers": {
    "socket-mcp": {
      "command": "socket-mcp",
      "env": {
        "SOCKET_API_TOKEN": "your-api-token-here"
      }
    }
  }
}
Opção 2b - Modo HTTP

Execute o servidor em modo HTTP:

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

O servidor escuta em http://localhost:3000/. O endpoint MCP é / e o endpoint de saúde é /health; todos os outros caminhos respondem 404.

O transporte é sem estado. Cada POST / é autocontido, sem sessão para abrir, sem cabeçalho Mcp-Session-Id e nada para expirar, então você pode colocar várias instâncias atrás de um balanceador de carga sem afinidade de sessão. GET e DELETE no endpoint MCP respondem 405. Clientes escritos para o protocolo de 2025, que abrem com um handshake initialize, ainda são atendidos.

Variáveis de ambiente para o modo HTTP:

VariávelObrigatóriaPadrãoDescrição
MCP_HTTP_MODESim, a menos que você passe --httpfalseDefina como true para servir HTTP em vez de stdio. O sinalizador de CLI --http faz o mesmo.
MCP_PORTNão3000Porta para vincular o servidor HTTP.
SOCKET_API_TOKENObrigatória a menos que OAuth esteja habilitadoNenhumToken de API do Socket para chamadas de API de saída. Veja a lista de aliases abaixo.
SOCKET_OAUTH_ISSUERCom OAuthNenhumURL do emissor OAuth. Deve ser https em um host público. Veja "Habilitando OAuth" abaixo.
SOCKET_OAUTH_INTROSPECTION_CLIENT_IDCom OAuthNenhumID do cliente usado para introspecção de token RFC 7662.
SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRETCom OAuthNenhumSegredo do cliente usado para introspecção de token RFC 7662.
SOCKET_OAUTH_REQUIRED_SCOPESNãoNenhumEscopos exigidos em tokens de acesso recebidos, separados por espaços ou vírgulas. Quando não definido, qualquer token ativo passa.
SOCKET_OAUTH_REQUIRE_AUDIENCENãofalseQuando true, rejeite um token de acesso cuja resposta de introspecção não carrega nenhuma declaração aud. Leia a nota sobre audiência abaixo primeiro.
SOCKET_API_BASE_URLNãoNenhumSubstitui o endpoint da API Socket upstream. Volta para https://api.socket.dev quando não definido.
SOCKET_DEBUGNãofalseAtiva o rastreamento detalhado de solicitações e cache no stderr, aponta depscore para http://localhost:8866 e permite um emissor OAuth local.
TRUST_PROXYNãofalseConfia em X-Forwarded-Host e X-Forwarded-Proto ao construir URLs de metadados OAuth. Habilite apenas atrás de um proxy reverso que os reescreva.

As três variáveis OAuth são um conjunto: configure todas as três ou nenhuma. Definir apenas algumas delas faz o servidor imprimir Incomplete OAuth configuration for HTTP mode e sair com código 1, em vez de iniciar silenciosamente sem autenticação.

SOCKET_API_TOKEN é canônico. Estes aliases são lidos em ordem, o primeiro não vazio vence: 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 e SOCKET_DEBUG também se aplicam no modo stdio. Todo o resto na tabela é apenas HTTP.

Ajustando o cache de blobs de arquivos de pacote e suas buscas

package_files, package_file_contents e package_file_grep buscam blobs de socketusercontent.com e os mantêm em um cache LRU em todo o processo. Esses ajustes existem para operadores que executam o servidor em volume; os padrões são suficientes caso contrário.

VariávelPadrãoDescrição
SOCKET_BLOB_CACHE_BYTES67108864 (64 MB)Bytes que o cache de blobs armazena antes de remover. Um valor não positivo ou não analisável volta ao padrão.
SOCKET_BLOB_URLhttps://socketusercontent.comURL base de onde os blobs são buscados.
SOCKET_BROWSER_USER_AGENTUma string de UA do ChromeUser-Agent enviado nas buscas de blobs.
SOCKET_BYPASS_HEADER_NAMENenhumNome de um cabeçalho extra enviado em cada busca de blob. Nome e valor devem estar definidos para que seja aplicado.
SOCKET_BYPASS_HEADER_VALUENenhumValor para esse cabeçalho.
SOCKET_INTERNAL_USER_AGENTsocket-internal-tool/1.0User-Agent enviado na chamada autenticada de listagem de arquivos.

Habilitando OAuth. Defina todas as três variáveis de OAuth para exigir um token de acesso OAuth em cada solicitação 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

Com OAuth habilitado, cada solicitação ao endpoint MCP passa pela introspecção de token RFC 7662. Um token bruto da API Socket é rejeitado com um 401, independentemente do prefixo; um token sktsec_ não tem mais privilégio do que qualquer outra string aqui. Os chamadores enviam um token de acesso OAuth, e o servidor usa esse token para as chamadas à API Socket que faz em nome deles. Execute sem as variáveis de OAuth para aceitar tokens brutos da API Socket.

Na inicialização, o servidor descobre os metadados RFC 8414 do emissor. Um emissor que contém um caminho (https://auth.example.com/tenant1) é sondado primeiro na URL well-known com o caminho inserido (https://auth.example.com/.well-known/oauth-authorization-server/tenant1), e o issuer do próprio documento de metadados deve corresponder a SOCKET_OAUTH_ISSUER byte por byte. O emissor deve ser https em um host público; um emissor de loopback ou rede privada é recusado imediatamente, a menos que SOCKET_DEBUG=true esteja definido para trabalho em pilha local. A mesma regra se aplica ao introspection_endpoint que os metadados anunciam.

Os clientes descobrem como autenticar por meio de GET /.well-known/oauth-protected-resource (RFC 9728), que o servidor publica assim que o OAuth está ativado:

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

Uma solicitação rejeitada responde 401 com um cabeçalho WWW-Authenticate nomeando essa URL de metadados e os escopos que este recurso exige:

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] Validação de público. Quando uma resposta de introspecção inclui uma declaração aud, o servidor exige que ela nomeie este recurso e rejeita o token caso contrário. Essa verificação está sempre ativa e não tem opção de desativação. Quando a resposta não inclui nenhum aud, o token é aceito por padrão, porque um servidor de autorização que nunca emite a declaração falharia em todas as solicitações. A validação de público, portanto, protege você exatamente até onde seu servidor de autorização preenche aud; se ele não preencher, nenhum público está sendo verificado. Defina SOCKET_OAUTH_REQUIRE_AUDIENCE=true para exigir adicionalmente a presença da declaração, mas somente depois de confirmar que seu servidor de autorização retorna aud na introspecção. Habilitá-lo contra um servidor que omite a declaração rejeita todo o tráfego.

Adicione TRUST_PROXY=true somente quando o servidor estiver implantado atrás de um proxy reverso ou balanceador de carga confiável que normalize os cabeçalhos de host e protocolo encaminhados.

Configure seu cliente MCP para conectar ao servidor HTTP:

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

Uso

Depois de instalado, faça perguntas ao seu assistente de IA como:

  • "Verifique a pontuação de segurança para a versão 4.18.2 do express"
  • "Analise a segurança das dependências do meu package.json"
  • "Quais são as pontuações de vulnerabilidade para react, lodash e axios?"

Ferramentas expostas

A lista completa de ferramentas - nomes, argumentos e o que cada uma retorna

depscore

Consulta a API Socket para obter informações de pontuação de dependências. Retorna pontuações de cadeia de suprimentos, qualidade, manutenção, vulnerabilidade e licença por pacote.

ParâmetroTipoObrigatórioPadrãoDescrição
packagesArray✅ Sim-Array de objetos de pacote para analisar
packages[].ecosystemStringNão"npm"Ecossistema do pacote. Veja Ecossistemas suportados abaixo.
packages[].depnameString✅ Sim-Nome da dependência/pacote
packages[].versionStringNão"unknown"Versão da dependência
platformStringNão-Dica de arquitetura do sistema operacional (linux-x64, darwin-arm64, win32-x64) aplicada a cada pacote na solicitação. Seleciona o artefato mais relevante quando um pacote oferece builds específicos por plataforma.
Ecossistemas suportados

Com base no suporte de linguagens do Socket. O parâmetro ecosystem mapeia para tipos PURL:

EcossistemaTipo PURLGerenciadores de pacotesMaturidade
JavaScript e 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 ActionsactionsFluxos de trabalho do GitHub ActionsExperimental (varredura de fluxos de trabalho, não em nível de pacote)

packagist é aceito como um alias para composer, e openvsx para o tipo PURL vscode.

Exemplo de solicitação:

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

Resposta, como um único bloco de texto. Cada pontuação é um inteiro de 0 a 100, quanto maior, melhor:

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

Os pacotes retornam na ordem em que a API os retorna, não na ordem em que você solicitou. Um pacote do qual o Socket não tem registro é omitido da lista em vez de ser relatado como erro, então compare a resposta com sua solicitação quando um nome estiver ausente.

organizations

Lista as organizações Socket às quais o usuário autenticado pertence. Não recebe parâmetros. Use para descobrir o valor org_slug que as ferramentas com escopo de organização (alerts, threat_feed) exigem.

Esta ferramenta precisa de um token da API Socket. Veja Autenticação para ferramentas com escopo de organização abaixo.

A resposta é o JSON da API Socket, indexado pelo ID da organização. O slug é o que as outras ferramentas querem:

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

alerts

Lista os alertas de segurança mais recentes para uma organização Socket: problemas de cadeia de suprimentos, vulnerabilidade, qualidade, licença e manutenção nos pacotes monitorados da organização. Suportado por GET /v0/orgs/{org_slug}/alerts. Os resultados são paginados; passe o endCursor da resposta anterior como cursor para buscar a próxima página.

ParâmetroTipoObrigatórioPadrãoDescrição
org_slugString✅ Sim-Slug da organização (obtenha na ferramenta organizations)
severityStringNão-Subconjunto separado por vírgulas de low,medium,high,critical
statusStringNão-open ou cleared
categoryStringNão-Subconjunto separado por vírgulas de supplyChainRisk,maintenance,quality,license,vulnerability
artifact_typeStringNão-Ecossistemas separados por vírgulas: npm,pypi,gem,maven,golang,nuget,cargo,chrome,openvsx
artifact_nameStringNão-Restringir a um único nome de pacote
alert_typeStringNão-Tipos de alerta Socket separados por vírgulas (ex.: usesEval,unmaintained)
repo_slugStringNão-Slugs de repositórios separados por vírgulas
per_pageIntegerNão100Resultados por página (1–5000)
cursorStringNão-Cursor de paginação - o endCursor de uma resposta anterior

threat_feed

Consulta itens no feed de ameaças de uma organização Socket: pacotes recentemente sinalizados como malware, typosquats, código ofuscado e similares. Suportado por GET /v0/orgs/{org_slug}/threat-feed. A resposta carrega um nextPageCursor; passe-o como cursor para avançar de página.

ParâmetroTipoObrigatórioPadrãoDescrição
org_slugString✅ Sim-Slug da organização (obtenha-o na ferramenta organizations)
filterStringNãomalCategoria de ameaça: mal (malware), vuln, typ (typosquat), obf (ofuscado), mjo, kes, spy, etc.
ecosystemStringNão-Ecossistema: npm, pypi, gem, maven, golang, nuget, cargo, chrome, openvsx, vscode, huggingface
nameStringNão-Filtrar por nome do pacote
versionStringNão-Filtrar por versão do pacote
is_human_reviewedBooleanNãofalseRetornar apenas itens revisados por humanos
sortStringNãoupdated_atCampo de ordenação: id, created_at, updated_at
directionStringNãodescDireção da ordenação: asc, desc
updated_afterStringNão-Timestamp ISO; apenas itens atualizados após este
created_afterStringNão-Timestamp ISO; apenas itens criados após este
per_pageIntegerNão30Resultados por página (1–100)
cursorStringNão-Cursor de paginação - o nextPageCursor de uma resposta anterior

package_files

Lista os arquivos publicados em um pacote: uma árvore de caminhos de arquivos, cada um com seu tamanho e hash de blob, para qualquer pacote em um ecossistema suportado. Use-o para inspecionar o que uma dependência entrega antes de instalá-la. Passe o hash de um arquivo para package_file_contents ou package_file_grep.

ParâmetroTipoObrigatórioPadrãoDescrição
ecosystemStringNãonpmnpm, pypi, gem, cargo, maven, golang, nuget, chrome, openvsx
depnameString✅ Sim-Nome do pacote (ex.: lodash, @babel/core, org.springframework:spring-core)
versionString✅ Sim-Versão do pacote
artifactIdStringNão-Desambiguador por versão (nome de arquivo PyPI, artifact id Maven, asset NuGet)
platformStringNão-Qualificador de plataforma para artefatos por SO/arquitetura (ex.: openvsx linux-x64, darwin-arm64)

A saída é uma linha de cabeçalho e uma árvore. O token após cada tamanho é o hash do 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

Lê um único arquivo de um pacote. Passe o hash impresso ao lado de uma entrada na saída de package_files. Retorna até 1 MB de texto UTF-8; arquivos binários retornam apenas metadados.

ParâmetroTipoObrigatórioPadrãoDescrição
hashString✅ Sim-Hash do blob de package_files
pathStringNão-Caminho do arquivo, apenas para exibição; não afeta a busca

package_file_grep

Pesquisa um único arquivo de um pacote por linhas que correspondam a uma expressão regular JavaScript, retornando correspondências com números de linha (estilo grep -n). Cada blob é buscado uma vez e mantido em um cache de todo o processo, então leituras e greps repetidos do mesmo hash pulam a rede.

ParâmetroTipoObrigatórioPadrãoDescrição
hashString✅ Sim-Hash do blob de package_files
patternString✅ Sim-Expressão regular JavaScript (literais simples também funcionam)
caseInsensitiveBooleanNãofalseCorresponder sem diferenciar maiúsculas/minúsculas
contextLinesIntegerNão0Linhas de contexto antes e depois de cada correspondência (0–5)
maxMatchesIntegerNão100Limite de linhas correspondentes retornadas (1–500)
pathStringNão-Caminho do arquivo, apenas para exibição; não afeta a busca

Autenticação para ferramentas com escopo de organização

depscore funciona sem credenciais no servidor público. As ferramentas organizations, alerts, threat_feed e package_files chamam a API REST autenticada do Socket, então precisam de um token de API do Socket.

Como o servidor resolve um token depende do transporte:

  • Modo stdio lê um token na inicialização do ambiente e o usa para cada requisição. Defina SOCKET_API_TOKEN. O servidor também aceita estes aliases, em ordem de prioridade: 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 é canônico; SOCKET_API_KEY é o alias que a maioria das configurações locais já exporta. Como o processo pertence a um usuário, este token é seu e define o escopo de cada ferramenta para sua conta.
  • Modo HTTP define o escopo das ferramentas de organização para o chamador, nunca para o token do próprio servidor. Envie sua credencial como um cabeçalho Authorization: Bearer <token> em cada requisição. Qual credencial enviar depende de a implantação executar OAuth. Em um servidor com OAuth habilitado, envie um token de acesso OAuth: cada bearer token é validado por introspecção, e um token de API Socket bruto é rejeitado com um desafio 401, não importa com o que comece. Em um servidor sem OAuth, envie seu token de API Socket bruto e ele será usado diretamente. De qualquer forma, o servidor usa esse token por requisição para as chamadas de API do Socket que faz em seu nome. Uma implantação compartilhada nunca responde organizations, alerts, threat_feed ou package_files com os dados do operador: quando uma requisição não carrega token, essas ferramentas retornam o erro de autenticação necessária. depscore sozinho pode recorrer ao token de inicialização do servidor, já que as pontuações de pacotes são as mesmas para todos os chamadores.

Quando um token está ausente, toda ferramenta afetada retorna a mesma mensagem:

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.

Gere um token no painel do Socket em API tokens, depois exporte-o antes de iniciar o servidor:

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

Exemplo prático: detalhes da organização e alertas

Com SOCKET_API_TOKEN definido, peça ao seu assistente algo como "mostre-me os alertas críticos abertos para minha org Socket". Nos bastidores, o assistente encadeia duas ferramentas:

  1. Descubra o slug da organização. Chame organizations (sem argumentos). O servidor lê seu token, chama GET /v0/organizations e retorna as organizações que seu token pode ver. Escolha o slug que deseja, ex.: acme-robotics.

  2. Busque alertas para essa org. Chame alerts com o slug e quaisquer filtros:

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

    O servidor chama GET /v0/orgs/acme-robotics/alerts com o mesmo token e retorna os alertas correspondentes mais metadados de paginação. Para avançar de página, passe o endCursor da resposta de volta como cursor.

O mesmo token define o escopo de toda ferramenta com escopo de org, então threat_feed e package_files funcionam no momento em que organizations confirma a qual slug o token pertence.

Ajustando o uso de ferramentas via regras do cliente

Você pode personalizar como o servidor MCP interage com seu assistente de IA editando o arquivo de regras do seu cliente:

Cliente MCPLocalização do Arquivo de Regras
Claude Desktop/CodeCLAUDE.md
VSCode Copilot.github/copilot-instructions.md
Cursor.cursor/rules

Exemplo de regra:

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 do Claude Code (Opcional)

O repositório inclui um hook do Claude Code opcional que bloqueia pacotes de alto risco antes da instalação. Quando o Claude Code executa um comando de instalação, o hook consulta o servidor MCP público do Socket em https://mcp.socket.dev/ e nega a instalação quando a pontuação da cadeia de suprimentos do pacote está abaixo de 20 (malware conhecido, typosquats, sinais de alto risco na cadeia de suprimentos). Sem CLI para instalar - copie o arquivo e conecte-o; o servidor público faz login via OAuth no primeiro uso.

Ecossistemas e gerenciadores de pacotes suportados:

EcossistemaComandos
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

Configuração

Etapas de configuração por cliente - Claude Desktop, Claude Code, Cursor e VS Code

Pré-requisitos: Node.js 24+.

  1. Copie todo o diretório dist/socket-gate para sua pasta de hooks. O socket-gate.cjs incluído é autocontido, então executa sem dependências ao lado dele.

    De uma instalação publicada:

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

    De um checkout, compile-o primeiro:

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

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

Veja hooks/socket-gate/README.md para a referência completa.

Como funciona

O hook nega a instalação quando supplyChain < 20, e permite caso contrário — por exemplo, express/lodash/react (75–97) permitem, browserlist (typosquat de browserslist, 15) e malware confirmado (0) bloqueiam. Erros de rede, timeout ou parsing falham abertos, então uma indisponibilidade do Socket não bloqueará trabalho legítimo.

Limitações

Uma proteção de melhor esforço, não uma defesa completa. Lacunas conhecidas:

  • Edições de manifesto + instalações via lockfile. Se o Claude editar um manifesto diretamente (package.json, requirements.txt, Cargo.toml, Gemfile, go.mod, *.csproj) e depois executar uma instalação simples (npm install, pip install -r requirements.txt, cargo build, bundle install, go mod tidy, dotnet restore), não há nome de pacote na linha de comando para verificar.
  • Apenas invocações de gerenciadores de pacotes. Downloads diretos (curl | sh, wget), scripts pós-instalação de pacotes já aceitos e dependências transitivas não são re-verificados.
  • Caminhos indiretos do Claude. Subagentes, ferramentas MCP que executam comandos externos e chamadas de ferramentas que não são Bash não são cobertas, a menos que o matcher seja ampliado.

Inspirado no dependency hook do Jimmy Vo.

Desenvolvimento

Comandos para contribuidores

Este repositório usa pnpm, e todos os comandos são executados a partir da raiz do repositório. Node.js 24+ é necessário.

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

Execute a partir do código-fonte. Nenhuma etapa de build é necessária, pois o Node 24 remove o TypeScript automaticamente:

export SOCKET_API_TOKEN=your_api_token_here
pnpm run server-stdio

Ou em modo HTTP:

pnpm run server-http

Ambos os scripts leem SOCKET_API_TOKEN (com fallback para SOCKET_API_KEY) do seu ambiente. Adicione :debug a qualquer um deles (pnpm run server-http:debug) para definir SOCKET_DEBUG=1 e obter rastreamento por requisição no stderr.

TarefaComando
Testepnpm test
Testar um arquivopnpm test test/repo/unit/purl.test.mts
Testes de ponta a ponta com API ao vivopnpm run test:e2e
Verificação de tipospnpm run type
Lint e formataçãopnpm run fix --all
Suíte completa de verificaçãopnpm run check --all
Empacotar para dist/pnpm run build

Nunca coloque -- antes de um caminho de teste; isso amplia a execução para toda a suíte. Escreva pnpm test test/repo/unit/purl.test.mts.

Para operar um servidor em execução manualmente, veja depuração com mock-client.

Endpoint de verificação de saúde

Ao executar em modo HTTP, GET /health retorna a versão do servidor em execução e ignora a validação de origem, o que o torna seguro para ser chamado por uma sonda que não envia cabeçalho Origin:

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

Adequado para sondas de liveness/readiness do Kubernetes, verificações de saúde do Docker e balanceadores de carga.

Solução de problemas

P: O servidor público não está respondendo — Verifique a URL https://mcp.socket.dev/, confirme a configuração do seu cliente MCP e reinicie o cliente MCP.

P: Obtendo um erro 403 Forbidden: Invalid origin, ou o conector nunca abre uma tela OAuth — O servidor aceita cabeçalhos Origin do cliente quando o Host da requisição corresponde à implantação hospedada. Confirme que seu cliente usa https://mcp.socket.dev/ e siga as etapas de configuração acima. Uma resposta persistente Invalid origin exige verificar se a implantação hospedada inclui a correção.

P: O servidor local falha ao iniciar — Garanta que o Node.js 24+ esteja instalado, verifique se SOCKET_API_TOKEN está definido e confirme que o token da API tem permissão packages:list. No modo stdio, um token ausente é fatal: o servidor imprime SOCKET_API_TOKEN environment variable is required in stdio mode e sai com código 1.

P: O servidor sai com Incomplete OAuth configuration for HTTP mode — SOCKET_OAUTH_ISSUER, SOCKET_OAUTH_INTROSPECTION_CLIENT_ID e SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRET devem estar todos definidos ou todos não definidos.

P: Obtendo erros de autenticação com o servidor local — Verifique novamente se sua chave de API é válida, garanta o escopo packages:list e regenere se necessário. Se a ferramenta que falhou foi organizations, alerts, threat_feed ou package_files em uma implantação HTTP, o servidor se recusa a responder com o token do operador por design; envie o seu próprio em um cabeçalho Authorization: Bearer.

P: O assistente de IA não encontra a ferramenta depscore — Reinicie seu cliente MCP após alterações de configuração, verifique se a configuração foi salva e confirme que o servidor está em execução. tools/list anuncia um cache público de uma hora, então um cliente que armazena em cache a lista de ferramentas pode precisar de uma reinicialização para detectar uma ferramenta recém-adicionada.

Obtendo ajuda

Licença

MIT

Socket