Socket
Examine dependências em busca de vulnerabilidades e problemas de segurança usando a API Socket.
Documentação
Servidor MCP Socket
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.
- Abra Personalizar > Conectores no Claude.
- 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. - Selecione Conectar e complete o fluxo de autorização do Socket quando solicitado.
- 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 processo | Seu cliente MCP, sob demanda | Você, como um serviço de longa duração |
| Quem ele atende | Um usuário local | Qualquer cliente que possa alcançar a porta |
| Onde o token fica | Na configuração do cliente, como uma variável de ambiente | No ambiente do servidor, ou em cabeçalhos Authorization por solicitação |
| Use quando | Você é um desenvolvedor configurando seu próprio editor | Você 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ável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
MCP_HTTP_MODE | Sim, a menos que você passe --http | false | Defina como true para servir HTTP em vez de stdio. O sinalizador de CLI --http faz o mesmo. |
MCP_PORT | Não | 3000 | Porta para vincular o servidor HTTP. |
SOCKET_API_TOKEN | Obrigatória a menos que OAuth esteja habilitado | Nenhum | Token de API do Socket para chamadas de API de saída. Veja a lista de aliases abaixo. |
SOCKET_OAUTH_ISSUER | Com OAuth | Nenhum | URL do emissor OAuth. Deve ser https em um host público. Veja "Habilitando OAuth" abaixo. |
SOCKET_OAUTH_INTROSPECTION_CLIENT_ID | Com OAuth | Nenhum | ID do cliente usado para introspecção de token RFC 7662. |
SOCKET_OAUTH_INTROSPECTION_CLIENT_SECRET | Com OAuth | Nenhum | Segredo do cliente usado para introspecção de token RFC 7662. |
SOCKET_OAUTH_REQUIRED_SCOPES | Não | Nenhum | Escopos exigidos em tokens de acesso recebidos, separados por espaços ou vírgulas. Quando não definido, qualquer token ativo passa. |
SOCKET_OAUTH_REQUIRE_AUDIENCE | Não | false | Quando 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_URL | Não | Nenhum | Substitui o endpoint da API Socket upstream. Volta para https://api.socket.dev quando não definido. |
SOCKET_DEBUG | Não | false | Ativa o rastreamento detalhado de solicitações e cache no stderr, aponta depscore para http://localhost:8866 e permite um emissor OAuth local. |
TRUST_PROXY | Não | false | Confia 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ável | Padrão | Descrição |
|---|---|---|
SOCKET_BLOB_CACHE_BYTES | 67108864 (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_URL | https://socketusercontent.com | URL base de onde os blobs são buscados. |
SOCKET_BROWSER_USER_AGENT | Uma string de UA do Chrome | User-Agent enviado nas buscas de blobs. |
SOCKET_BYPASS_HEADER_NAME | Nenhum | Nome de um cabeçalho extra enviado em cada busca de blob. Nome e valor devem estar definidos para que seja aplicado. |
SOCKET_BYPASS_HEADER_VALUE | Nenhum | Valor para esse cabeçalho. |
SOCKET_INTERNAL_USER_AGENT | socket-internal-tool/1.0 | User-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 nenhumaud, 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 preencheaud; se ele não preencher, nenhum público está sendo verificado. DefinaSOCKET_OAUTH_REQUIRE_AUDIENCE=truepara exigir adicionalmente a presença da declaração, mas somente depois de confirmar que seu servidor de autorização retornaaudna 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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
packages | Array | ✅ Sim | - | Array de objetos de pacote para analisar |
packages[].ecosystem | String | Não | "npm" | Ecossistema do pacote. Veja Ecossistemas suportados abaixo. |
packages[].depname | String | ✅ Sim | - | Nome da dependência/pacote |
packages[].version | String | Não | "unknown" | Versão da dependência |
platform | String | Nã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:
| Ecossistema | Tipo PURL | Gerenciadores de pacotes | Maturidade |
|---|---|---|---|
| JavaScript e TypeScript | npm | npm, yarn, pnpm, Bun, VLT | GA |
| Python | pypi | uv, pip, Poetry, Anaconda | GA |
| Go | golang | Go Modules | GA |
| Java / Scala / Kotlin | maven | Maven, Gradle, sbt | GA |
| Ruby | gem | Bundler | GA |
| .NET (C#, F#, VB) | nuget | NuGet | GA |
| Rust | cargo | cargo | GA |
| PHP | composer | Composer | Experimental |
| GitHub Actions | actions | Fluxos de trabalho do GitHub Actions | Experimental (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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
org_slug | String | ✅ Sim | - | Slug da organização (obtenha na ferramenta organizations) |
severity | String | Não | - | Subconjunto separado por vírgulas de low,medium,high,critical |
status | String | Não | - | open ou cleared |
category | String | Não | - | Subconjunto separado por vírgulas de supplyChainRisk,maintenance,quality,license,vulnerability |
artifact_type | String | Não | - | Ecossistemas separados por vírgulas: npm,pypi,gem,maven,golang,nuget,cargo,chrome,openvsx |
artifact_name | String | Não | - | Restringir a um único nome de pacote |
alert_type | String | Não | - | Tipos de alerta Socket separados por vírgulas (ex.: usesEval,unmaintained) |
repo_slug | String | Não | - | Slugs de repositórios separados por vírgulas |
per_page | Integer | Não | 100 | Resultados por página (1–5000) |
cursor | String | Nã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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
org_slug | String | ✅ Sim | - | Slug da organização (obtenha-o na ferramenta organizations) |
filter | String | Não | mal | Categoria de ameaça: mal (malware), vuln, typ (typosquat), obf (ofuscado), mjo, kes, spy, etc. |
ecosystem | String | Não | - | Ecossistema: npm, pypi, gem, maven, golang, nuget, cargo, chrome, openvsx, vscode, huggingface |
name | String | Não | - | Filtrar por nome do pacote |
version | String | Não | - | Filtrar por versão do pacote |
is_human_reviewed | Boolean | Não | false | Retornar apenas itens revisados por humanos |
sort | String | Não | updated_at | Campo de ordenação: id, created_at, updated_at |
direction | String | Não | desc | Direção da ordenação: asc, desc |
updated_after | String | Não | - | Timestamp ISO; apenas itens atualizados após este |
created_after | String | Não | - | Timestamp ISO; apenas itens criados após este |
per_page | Integer | Não | 30 | Resultados por página (1–100) |
cursor | String | Nã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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
ecosystem | String | Não | npm | npm, pypi, gem, cargo, maven, golang, nuget, chrome, openvsx |
depname | String | ✅ Sim | - | Nome do pacote (ex.: lodash, @babel/core, org.springframework:spring-core) |
version | String | ✅ Sim | - | Versão do pacote |
artifactId | String | Não | - | Desambiguador por versão (nome de arquivo PyPI, artifact id Maven, asset NuGet) |
platform | String | Nã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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
hash | String | ✅ Sim | - | Hash do blob de package_files |
path | String | Nã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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
hash | String | ✅ Sim | - | Hash do blob de package_files |
pattern | String | ✅ Sim | - | Expressão regular JavaScript (literais simples também funcionam) |
caseInsensitive | Boolean | Não | false | Corresponder sem diferenciar maiúsculas/minúsculas |
contextLines | Integer | Não | 0 | Linhas de contexto antes e depois de cada correspondência (0–5) |
maxMatches | Integer | Não | 100 | Limite de linhas correspondentes retornadas (1–500) |
path | String | Nã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 desafio401, 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 respondeorganizations,alerts,threat_feedoupackage_filescom os dados do operador: quando uma requisição não carrega token, essas ferramentas retornam o erro de autenticação necessária.depscoresozinho 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:
-
Descubra o slug da organização. Chame
organizations(sem argumentos). O servidor lê seu token, chamaGET /v0/organizationse retorna as organizações que seu token pode ver. Escolha oslugque deseja, ex.:acme-robotics. -
Busque alertas para essa org. Chame
alertscom o slug e quaisquer filtros:{ "org_slug": "acme-robotics", "severity": "high,critical", "status": "open" }O servidor chama
GET /v0/orgs/acme-robotics/alertscom o mesmo token e retorna os alertas correspondentes mais metadados de paginação. Para avançar de página, passe oendCursorda resposta de volta comocursor.
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 MCP | Localização do Arquivo de Regras |
|---|---|
| Claude Desktop/Code | CLAUDE.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:
| Ecossistema | Comandos |
|---|---|
| npm | npm install, npm i, npm add, yarn add, pnpm add, bun add |
| PyPI | pip install, pip3 install, uv add, uv pip install, poetry add, pipenv install |
| Cargo | cargo add, cargo install |
| RubyGems | gem install, bundle add |
| Go | go get, go install |
| NuGet | dotnet 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+.
-
Copie todo o diretório
dist/socket-gatepara sua pasta de hooks. Osocket-gate.cjsincluí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/ -
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
Bashnão são cobertas, a menos que omatcherseja 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.
| Tarefa | Comando |
|---|---|
| Teste | pnpm test |
| Testar um arquivo | pnpm test test/repo/unit/purl.test.mts |
| Testes de ponta a ponta com API ao vivo | pnpm run test:e2e |
| Verificação de tipos | pnpm run type |
| Lint e formatação | pnpm run fix --all |
| Suíte completa de verificação | pnpm 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