Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Requests with "id": null are run like notifications

Ouverte
#601 0 commentaires 0 réactions 1 personne assignée Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@koic y travaille déjà.

Depuis le 14/10/2026.

  • #612 par @koic — ouverte

Évaluation

Cette issue n'a pas encore été évaluée.

Description

bug

I'm wiring the SDK into a Rails app (stateless Streamable HTTP, JSON responses) and noticed that a request with "id": null isn't rejected. The server treats it like a notification: the method runs, but no response is produced, so over HTTP the client gets a 202 Accepted with an empty body.

For a tool that changes data, that's a write the client never hears about. The spec rules null ids out for requests:

  • Requests MUST include a string or integer ID.
  • Unlike base JSON-RPC, the ID MUST NOT be null.

(Basic Protocol, Requests, same wording in 2026-07-28)

Repro with 1.7.0 (main at 9d12f51 behaves the same):

require "mcp"

calls = 0
echo = MCP::Tool.define(
  name: "echo",
  description: "Echoes the text back",
  input_schema: { properties: { text: { type: "string" } }, required: ["text"] },
) do |text:, server_context: nil|
  calls += 1
  MCP::Tool::Response.new([{ type: "text", text: text }])
end

server = MCP::Server.new(name: "repro", version: "1.0.0", tools: [echo], capabilities: { tools: {} })

server.handle_json('{"jsonrpc":"2.0","id":null,"method":"tools/call","params":{"name":"echo","arguments":{"text":"hi"}}}')
# => nil
server.handle_json('{"jsonrpc":"2.0","method":"tools/call","params":{"name":"echo","arguments":{"text":"hi"}}}')
# => nil

calls # => 2

JsonRpcHandler.valid_id? accepts nil on purpose (the error message says "or be an integer or null"), which fits plain JSON-RPC but not MCP.

The second call, without any id, is a notification by JSON-RPC rules, so it's a slightly different case. But tools/call isn't a notification in MCP, and the Streamable HTTP transport allows a server to answer a notification it can't accept with an HTTP error (e.g. 400). Running it silently seems like the riskiest option.

What I'd expect:

  • "id": null is answered with Invalid Request (-32600) and the method doesn't run.
  • A request method sent without an id is refused, or at least not executed.
Langage dominant
Ruby
Étoiles
924
Forks
136
Merge moyen
1 j 5 h
PR mergées (30 j)
37

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de modelcontextprotocol/ruby-sdk

Toutes les issues de modelcontextprotocol/ruby-sdk

Issues similaires

Plus d'issues Ruby

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.