Protocol-gated tools (delete_repository) are listed based on the client's requested protocolVersion string, not the negotiated version
Mantenedores costumam responder em até 2 dias
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 43/100
Direção de pesquisa
Start with pkg/inventory/tool_availability.go at the reported checks around lines 120, 136, 148–151, and 175; then read the pinned SDK implementation in mcp/shared.go around lines 674–686. Trace how initialization negotiates the session protocol version and how tool availability handles unknown versions. Done means delete_repository is omitted when the negotiated version is below the minimum, unknown requested strings do not qualify as newer, and the stated elicitation and read-only conditions still hold.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Describe the bug
delete_repository is meant to be available only to sessions on protocol ≥ 2026-07-28 with form elicitation. The availability check reads req.ProtocolVersion(). For a session started with initialize, that returns the version the client requested (InitializeParams.ProtocolVersion), not the version the server answered. The comparison is also a plain string compare. As a result:
- A client that requests
2026-07-28is negotiated down to2025-11-25(deliberate in go-sdk, sinceinitializeis deprecated in 2026-07-28), yettools/listincludesdelete_repository. - Any string that sorts after
2026-07-28, such aszzz, does the same.
Impact is low. By code reading (not tested), --read-only should still remove the tool and deletion still requires the elicitation confirmation. But the listed tool set doesn't match the protocol the session actually speaks.
Upstream context: go-sdk issue modelcontextprotocol/go-sdk#1258 (closed 2026-11-03 by go-sdk PR #1266) fixed the same requested-vs-negotiated confusion inside the SDK, through an unexported ServerSession.protocolVersion(). The public ServerRequest.ProtocolVersion() on go-sdk main still returns InitializeParams.ProtocolVersion. That fix isn't in a go-sdk release yet (latest v1.8.0, which this repo pins), so a go-sdk bump alone will not change this server's behaviour.
Code (main 99d6d650, unchanged since v2.1.0): pkg/inventory/tool_availability.go:120,136,175 (req.ProtocolVersion()), :148-151 (protocolVersion >= minimum, string compare). go-sdk v1.8.0 mcp/shared.go:674-686 (ServerRequest.ProtocolVersion).
Affected version
v2.1.0 (image sha256:f6056fc1…0f8a, commit 4bcdcdf8) and main nightly (image sha256:48bc16d0…338f, revision 99d6d650). stdio, --toolsets=all.
Steps to reproduce the behavior
initialize:
The result has{"protocolVersion":"2026-07-28","capabilities":{"elicitation":{"form":{}}},"clientInfo":{"name":"t","version":"0"}}protocolVersion: "2025-11-25".tools/list: 92 tools, includingdelete_repository.- Same with
"protocolVersion":"zzz","capabilities":{"elicitation":{}}. Negotiated2025-11-25, 92 tools, includingdelete_repository. - Same with
"protocolVersion":"2025-11-25"and form elicitation: 91 tools, nodelete_repository. "2026-07-28"without an elicitation capability: 91 tools, nodelete_repository.
Expected vs actual behavior
Expected: availability follows the negotiated version (2025-11-25 in steps 1 and 2), so delete_repository is not listed. Unknown version strings are not treated as newer.
Actual: the requested string decides, and zzz counts as newer than 2026-07-28.
Suggested fix: gate on the negotiated version. Either have go-sdk expose it, or make ServerRequest.ProtocolVersion() return it (a follow-up to go-sdk #1266). Meanwhile, when there is no per-request _meta version, cap the session value to the initialize result's version. Compare against a list of known versions, not lexically.
Logs
requested 2026-07-28 + elicitation.form -> negotiated 2025-11-25, tools/list 92, delete_repository listed
requested zzz + elicitation -> negotiated 2025-11-25, tools/list 92, delete_repository listed
requested 2025-11-25 + elicitation.form -> negotiated 2025-11-25, tools/list 91
requested 2026-07-28, no elicitation -> negotiated 2025-11-25, tools/list 91
Same on v2.1.0 and main.
Found during an independent audit of v2.1.0 on a throwaway org and private test repo. Prepared with AI assistance (Claude Code); reproduced by two independent test runs before filing.
- Linguagem predominante
- Go
- Estrelas
- 34.2k
- Forks
- 5.3k
- Merge médio
- 5d 18h
- PRs com merge (30d)
- 13
Preparar o ambiente
- Inclui um Dockerfile ou arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de github/github-mcp-server
-
update_issue_labels is annotated destructiveHint: false but replaces (removes) existing labelsAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 69/100
github/github-mcp-server#3760 ·
Mantenedores costumam responder em até 2 dias
-
docs(install-claude): "environment variable" examples put the PAT in argv and the saved configAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
github/github-mcp-server#3758 ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 69/100
github/github-mcp-server#3729 ·
Mantenedores costumam responder em até 2 dias
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
github/github-mcp-server#3722 ·
Mantenedores costumam responder em até 2 dias
-
Insiders Feedback: PR created UI doesn't link to the PRTalvez já em andamento @genius-0963 assumiu há 5 dias. Abertabug insiders user-experience
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 65/100
github/github-mcp-server#3658 ·
Mantenedores costumam responder em até 2 dias
Todas as issues de github/github-mcp-server
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
prime-radiant-inc/evener#5901 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 69/100
-
kind/bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
kyma-project/serverless#2769 ·
Mantenedores costumam responder em até 1 dia
-
Update the mise toolsAbertaready-for-agent
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
hexlet-basics/hexlet-basics#962 ·
Mantenedores costumam responder em até 1 dia
-
imapproxy closeForMaintenance grace timer calls clientConn.Close() before closeMaintenanceTransportTalvez já em andamento @dejanstrbac assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
Mantenedores costumam responder em até 1 dia