Skip to content

fix: report an unknown MCP method as "Method not found" - #6

Merged
VikramLex merged 1 commit into
Graphicle-AI:mainfrom
rudycelekli:fix/mcp-unknown-method-code
Oct 18, 2026
Merged

VikramLex merged 1 commit into
Graphicle-AI:mainfrom
rudycelekli:fix/mcp-unknown-method-code

Conversation

@rudycelekli

Copy link
Copy Markdown
Contributor

The graphicle program's MCP server answers a method a connection does not serve with JSON-RPC error -32602 ("Invalid params") instead of -32601 ("Method not found").

What happens

On a workspace connection (which offers no resources):

→ {"jsonrpc":"2.0","id":1,"method":"resources/list","params":{}}
← {"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"Unsupported MCP method"}}

The same happens for prompts/list, completion/complete, logging/setLevel or a misspelt method.

Why it matters

JSON-RPC 2.0 (which MCP builds on) reserves -32601 for a method the server does not have. Clients rely on that code to treat an optional method as absent, and to tell that case apart from a call to a method the server has that was refused (-32602). The graph engine's own MCP server already answers -32601 (serve.rs).

Change

mcp_in answers -32601 when the method is not served. The message, "Unsupported MCP method", is unchanged. Every other error (an unknown tool, bad arguments, an access refusal) keeps -32602.

Test

workspace_scope::a_workspace_connection_serves_the_graph_tools_of_the_project_repo_names already checks the message resources/list gets on a workspace connection. It now also checks that the code is -32601, and that a tools/call naming an unknown tool still gets -32602.

Verification

In crates/graphicle, with Rust 1.95.0:

  • cargo fmt --check: clean
  • cargo clippy --locked --all-targets -- -D warnings: clean on Rust 1.95.0 (macOS). Not run locally with --features local-inference; CI covers that.
  • cargo test --locked --all-targets: 690 passed, 0 failed.

I left CHANGELOG.md to you.

🤖 Generated with Claude Code

The graphicle program's MCP server answered a method a connection does
not serve (`resources/list` on a workspace connection, `prompts/list`,
`completion/complete`, any typo) with JSON-RPC error -32602, "Invalid
params", the code it uses for every refused call. JSON-RPC 2.0 and MCP
reserve -32601, "Method not found", for that case, and clients use it to
tell an optional method the server lacks from a call it refused. The
graph engine's own server already answers -32601.

The message is unchanged; only its code is -32601 now. Every other
refusal keeps -32602.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Rudy Celekli <rudy@gradiahq.com>
@VikramLex
VikramLex merged commit 51536c2 into Graphicle-AI:main Oct 18, 2026
VikramLex added a commit that referenced this pull request Oct 18, 2026
…-off

Dashboard: the app that `graphicle open` shows, and its product and
documentation pages, get a light theme. It follows the operating
system's light or dark setting; Settings > Appearance picks System,
Light or Dark, kept per browser. The theme is set before the first
paint by /theme.js (the Content-Security-Policy allows no inline
script). Every colour of the stylesheets is a token whose dark value is
the old colour, so the dark theme is unchanged; in the light theme, text
is at least 4.5:1 against its background, and control borders and focus
rings at least 3:1.

MCP Registry: from this release on, the mcp-registry workflow adds one
MCP bundle (.mcpb) for each release target to the GitHub release and
lists the release as io.github.Graphicle-AI/graphicle
(packaging/mcpb/, .github/workflows/mcp-registry.yml, glama.json).

Update check: each check is recorded before its request goes out, so a
check still running when a command ends counts as that day's check
instead of running again with the next command. Checks whose requests
fail, or that GitHub refuses or limits, back off a day, then two, then
four. Still one GET with no code or data, and the notice at most once a
day.

Other changes:
- The rcfile tests that use the process-wide state hold a lock, so one
  test can no longer clear the warned folders between another's calls.
- The engine's file ledger marks each application module with a passing
  comparison receipt against Graphify 0.9.91 as verified; STATUS.md,
  AUDIT.json and PROGRESS.json describe the 0.9.91 port.
- cargo-deny ignores RUSTSEC-2026-0367, RUSTSEC-2026-0368 and
  RUSTSEC-2026-0369 (zip 8.6.0): they affect only zip's extract-to-disk
  APIs, and Graphicle reads archive members in memory and never
  extracts them. The ignores go once calamine moves to zip 9.
- Every crate is at 0.1.2, with a CHANGELOG entry. It also credits the
  four contributed fixes merged just before this commit: #3 (a Codex
  config with non-ASCII text in a multi-line string), #4 (a conversation
  opening cut on a character boundary), #5 (initialize answers a protocol
  version the engine speaks) and #6 (Method not found for an unknown MCP
  method), all by @rudycelekli.

Closes #2

Signed-off-by: VikramLex <vikramlex@karlexai.com>
@VikramLex

Copy link
Copy Markdown
Member

Thank you, @rudycelekli. Merged for 0.1.2. -32601 for a method the connection does not serve, and -32602 kept for a refused call, lets clients tell the two apart. Thanks for the extra assertions. The CHANGELOG credits you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants