Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

[v2] requireBearerAuth: drop error="invalid_token" when no credentials were sent and resource_metadata is set (RFC 6750 §3.1)

Aberta Para iniciantes
#3,124 1 comentário 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 1 dia

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
82/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Ativa
Stack de tecnologia
typescript
Domínio
api, authentication

Direção de pesquisa

Em packages/server, encontre requireBearerAuth e a bearerAuthChallengeResponse compartilhada usada pelo adaptador Express; comece lendo como eles constroem o challenge e os testes próximos. Adicione ou atualize testes para credenciais ausentes com resource_metadata ou scope, credenciais ausentes sem outros parâmetros e um token inválido. A tarefa estará concluída quando o primeiro caso omitir invalid_token, o segundo mantiver o challenge atual e a resposta ao token inválido permanecer inalterada.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

v2
What happened?

When a request has no Authorization header, requireBearerAuth answers:

WWW-Authenticate: Bearer error="invalid_token", error_description="Missing Authorization header", scope="a:read", resource_metadata="https://mcp.example/.well-known/oauth-protected-resource/mcp"

RFC 6750 §3.1 says that when a request has no authentication information, the server SHOULD NOT include an error code.

This was tried in #785 (v1) and closed. The blocker there was §3: a Bearer challenge MUST carry at least one auth-param, so removing the error code meant adding a realm, which didn't fit.

That's different for MCP servers now. resource_metadata (RFC 9728) is the param MCP clients need to start sign-in, and the SDK already adds it when resourceMetadataUrl is set (and scope when requiredScopes is set).

Why it matters: the first request from every MCP client has no token, so this is the challenge every client sees first. invalid_token says "your token went bad" to a client that hasn't signed in yet. We ran into this building the MCP server for Bachs (a payments API), and write the challenge ourselves for now.

Would you take a PR for this? It's a small change plus tests in packages/server (the Express adapter shares bearerAuthChallengeResponse, so it would follow), and a v1.x backport if you want one.

What did you expect?

Drop the error code only when another param remains:

  • no credentials, resource_metadata or scope present → Bearer scope="a:read", resource_metadata="…"
  • no credentials, no other params → unchanged, so the challenge is never a bare "Bearer"
  • a token was sent but is bad → unchanged
Code to reproduce
import { requireBearerAuth } from '@modelcontextprotocol/server';

const gate = requireBearerAuth({
  verifier: { verifyAccessToken: async () => { throw new Error('unused'); } },
  requiredScopes: ['a:read'],
  resourceMetadataUrl: 'https://mcp.example/.well-known/oauth-protected-resource/mcp',
});
const res = await gate(new Request('https://mcp.example/mcp', { method: 'POST' }));
console.log(res.status, res.headers.get('www-authenticate'));
SDK version

@modelcontextprotocol/server 2.4.0

Area

Auth

Linguagem predominante
TypeScript
Estrelas
13.7k
Forks
2.3k
Merge médio
1d 5h
PRs com merge (30d)
51

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de modelcontextprotocol/typescript-sdk

Todas as issues de modelcontextprotocol/typescript-sdk

Issues semelhantes

Mais issues de TypeScript

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.