Repository navigation
Closed
Labels
Ghidra🐉 - Related to the Ghidra extension🐉 - Related to the Ghidra extensionbugSomething isn't workingSomething isn't working
Description
I think the MCP protocol was updated in VSCode. This is what I get when attempting to communicate with it in VSCode. I'm still on 6.0.1:
2025-12-24 15:00:25.772 [info] Starting server ReVa
2025-12-24 15:00:25.772 [info] Connection state: Starting
2025-12-24 15:00:25.773 [info] Starting server from LocalProcess extension host
2025-12-24 15:00:25.773 [info] Connection state: Running
2025-12-24 15:00:25.779 [info] 400 status sending message to http://localhost:8080/mcp/message, will attempt to fall back to legacy SSE
2025-12-24 15:00:25.785 [info] Connection state: Error 400 status connecting to http://localhost:8080/mcp/message as SSE: {"cause":null,"stackTrace":[{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doGet","fileName":"HttpServletStreamableServerTransportProvider.java","lineNumber":264,"nativeMethod":false,"className":"io.modelcontextprotocol.server.transport.HttpServletStreamableServerTransportProvider"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"service","fileName":"HttpServlet.java","lineNumber":633,"nativeMethod":false,"className":"jakarta.servlet.http.HttpServlet"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"service","fileName":"HttpServlet.java","lineNumber":723,"nativeMethod":false,"className":"jakarta.servlet.http.HttpServlet"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"handle","fileName":"ServletHolder.java","lineNumber":764,"nativeMethod":false,"className":"org.eclipse.jetty.servlet.ServletHolder"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doHandle","fileName":"ServletHandler.java","lineNumber":529,"nativeMethod":false,"className":"org.eclipse.jetty.servlet.ServletHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"nextHandle","fileName":"ScopedHandler.java","lineNumber":221,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ScopedHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doHandle","fileName":"SessionHandler.java","lineNumber":1580,"nativeMethod":false,"className":"org.eclipse.jetty.server.session.SessionHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"nextHandle","fileName":"ScopedHandler.java","lineNumber":221,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ScopedHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doHandle","fileName":"ContextHandler.java","lineNumber":1381,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ContextHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"nextScope","fileName":"ScopedHandler.java","lineNumber":176,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ScopedHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doScope","fileName":"ServletHandler.java","lineNumber":484,"nativeMethod":false,"className":"org.eclipse.jetty.servlet.ServletHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doScope","fileName":"SessionHandler.java","lineNumber":1553,"nativeMethod":false,"className":"org.eclipse.jetty.server.session.SessionHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"nextScope","fileName":"ScopedHandler.java","lineNumber":174,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ScopedHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doScope","fileName":"ContextHandler.java","lineNumber":1303,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ContextHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"handle","fileName":"ScopedHandler.java","lineNumber":129,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.ScopedHandler"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"handle","fileName":"HandlerWrapper.java","lineNumber":122,"nativeMethod":false,"className":"org.eclipse.jetty.server.handler.HandlerWrapper"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"handle","fileName":"Server.java","lineNumber":563,"nativeMethod":false,"className":"org.eclipse.jetty.server.Server"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"dispatch","fileName":"HttpChannel.java","lineNumber":1598,"nativeMethod":false,"className":"org.eclipse.jetty.server.HttpChannel$RequestDispatchable"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"dispatch","fileName":"HttpChannel.java","lineNumber":753,"nativeMethod":false,"className":"org.eclipse.jetty.server.HttpChannel"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"handle","fileName":"HttpChannel.java","lineNumber":501,"nativeMethod":false,"className":"org.eclipse.jetty.server.HttpChannel"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"onFillable","fileName":"HttpConnection.java","lineNumber":287,"nativeMethod":false,"className":"org.eclipse.jetty.server.HttpConnection"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"succeeded","fileName":"AbstractConnection.java","lineNumber":314,"nativeMethod":false,"className":"org.eclipse.jetty.io.AbstractConnection$ReadCallback"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"fillable","fileName":"FillInterest.java","lineNumber":100,"nativeMethod":false,"className":"org.eclipse.jetty.io.FillInterest"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"run","fileName":"SelectableChannelEndPoint.java","lineNumber":53,"nativeMethod":false,"className":"org.eclipse.jetty.io.SelectableChannelEndPoint$1"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"runTask","fileName":"AdaptiveExecutionStrategy.java","lineNumber":421,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"consumeTask","fileName":"AdaptiveExecutionStrategy.java","lineNumber":390,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"tryProduce","fileName":"AdaptiveExecutionStrategy.java","lineNumber":277,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"produce","fileName":"AdaptiveExecutionStrategy.java","lineNumber":193,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"runJob","fileName":"QueuedThreadPool.java","lineNumber":969,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.QueuedThreadPool"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"doRunJob","fileName":"QueuedThreadPool.java","lineNumber":1194,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.QueuedThreadPool$Runner"},{"classLoaderName":null,"moduleName":null,"moduleVersion":null,"methodName":"run","fileName":"QueuedThreadPool.java","lineNumber":1149,"nativeMethod":false,"className":"org.eclipse.jetty.util.thread.QueuedThreadPool$Runner"},{"classLoaderName":null,"moduleName":"java.base","moduleVersion":"25.0.1","methodName":"run","fileName":"Thread.java","lineNumber":1474,"nativeMethod":false,"className":"java.lang.Thread"}],"jsonRpcError":null,"message":"Session ID required in mcp-session-id header","suppressed":[],"localizedMessage":"Session ID required in mcp-session-id header"}
Metadata
Metadata
Assignees
Labels
Ghidra🐉 - Related to the Ghidra extension🐉 - Related to the Ghidra extensionbugSomething isn't workingSomething isn't working
Activity
cyberkaida commentedon Dec 24, 2025
In your log it says it is trying to fall back to SSE, I am not sure why it is trying this. It is saying it is falling back but missing the header streaming HTTP requires. ReVa is serving Streaming HTTP and VSCode is trying SSE.
The SSE transport was deprecated.
https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#backwards-compatibility
VSCode documentation says "legacy" support is included:
https://code.visualstudio.com/docs/copilot/customization/mcp-servers#_http-and-serversent-events-sse-servers
DaCodeChick commentedon Dec 25, 2025
This is how it's set up currently in mcp.json:
karliky commentedon Jan 4, 2026
I have the exact same problem, my mpc config:
karliky commentedon Jan 4, 2026
Took me a lot of time but I finally tracked down what’s actually going on, and it’s not SSE and not a VS Code config problem.
The root cause is a protocol mismatch between newer VS Code MCP clients and the MCP Java SDK ReVa is using.
Recent VS Code versions send a newer
initializepayload that includes fields under:The MCP Java SDK currently used by ReVa doesn’t recognize that field and fails JSON deserialization, returning a 400 during
initializewith errors like:Once VS Code sees a 400 during Streamable HTTP startup, it automatically falls back to legacy SSE. That fallback then fails because ReVa correctly expects Streamable HTTP + a valid session ID, which is why everyone sees:
So that error is just a symptom, not the real problem.
I confirmed this by running a small proxy that strips
capabilities.elicitationout of theinitializerequest before it reaches ReVa. With that one change, everything works immediately, no 400s, no SSE fallback, normal Streamable HTTP session.ReVa needs to update its MCP Java SDK (or relax JSON parsing):
io.modelcontextprotocolJava SDK that supports the newer MCP spec fields@JsonIgnoreProperties(ignoreUnknown = true))Either of those fixes this cleanly and keeps ReVa forward-compatible with newer MCP clients.
I confirmed this by running this script, which acts like a middleware:
Then I connected to it with this copilot mcp config:
Run it with
node mcp.jscyberkaida commentedon Jan 5, 2026
I wish MCP is versioned better 😢
I will upgrade Java MCP and and do a release. Thank you so much @karliky 💜
karliky commentedon Jan 5, 2026
Thanks, I stopped using this MCP because it freezes my visual studio code while listing functions from the ghidra process.... but anyways, thanks!
cyberkaida commentedon Jan 5, 2026
I have made a new release, v7.1.0. This includes many MCP protocol improvements. Please try this release.
I have included a new debug option to help with these issues. Please try enabling the Debug mode and the request logging in the ReVa settings (Project window, Edit -> Tool Options), trigger the bug and then create a debug capture (Project window, Tool -> ReVa). This will capture the information I need to debug issues like this.
If VSCode freezes when listing functions, please create an issue @karliky and I will debug it.
cyberkaida commentedon Jan 5, 2026
This should be fixed in #232 #243 and release v7.1.0
InitializeRequestdoesn't accept non-empty Elicitation, violating 2025-11-25 spec modelcontextprotocol/java-sdk#724cyberkaida commentedon Jan 7, 2026
I thought they merged the fix. It has not been merged.
Workaround for issue #239 and #249
Workaround for issue cyberkaida#239 and cyberkaida#249