I’ll add that I tried to get Open WebUI to “talk to” the official MCP add-on yesterday, and failed. I must say that the way you configure these things in Open WebUI is some of the most messy thing I’ve ever seen. It’s really, really confusing, and the permission/access setting is especially so.
But, I think there are some pretty basic bugs in the MCP add-on as well. I ended up trying to use Postman to query the MCP add-on directly, because nothing would happen in Open WebUI (the MCP would show as “green” but be unavailable for use in chat sessions).
I tried several JSONs, and they all got the same response. Here is one of the request JSONs I sent:
{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "Postman-Test",
"version": "1.0.0"
}
},
"id": 1
}
The answer I get depends on what I put in the Accept header, if I use text/event-stream, I get:
{
"cause": null,
"stackTrace": [
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "build",
"fileName": "McpError.java",
"lineNumber": 72,
"className": "io.modelcontextprotocol.spec.McpError$Builder",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "responseError",
"fileName": "JavaxStreamableServerTransportProvider.java",
"lineNumber": 491,
"className": "org.openhab.io.mcp.internal.servlet.JavaxStreamableServerTransportProvider",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doPost",
"fileName": "JavaxStreamableServerTransportProvider.java",
"lineNumber": 345,
"className": "org.openhab.io.mcp.internal.servlet.JavaxStreamableServerTransportProvider",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "HttpServlet.java",
"lineNumber": 681,
"className": "javax.servlet.http.HttpServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "HttpServlet.java",
"lineNumber": 764,
"className": "javax.servlet.http.HttpServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "OsgiInitializedServlet.java",
"lineNumber": 102,
"className": "org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ServletHolder.java",
"lineNumber": 799,
"className": "org.eclipse.jetty.servlet.ServletHolder",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doFilter",
"fileName": "ServletHandler.java",
"lineNumber": 1656,
"className": "org.eclipse.jetty.servlet.ServletHandler$ChainEnd",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doFilter",
"fileName": "OsgiFilterChain.java",
"lineNumber": 113,
"className": "org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "PaxWebServletHandler.java",
"lineNumber": 334,
"className": "org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ScopedHandler.java",
"lineNumber": 143,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "SecurityHandler.java",
"lineNumber": 600,
"className": "org.eclipse.jetty.security.SecurityHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HandlerWrapper.java",
"lineNumber": 127,
"className": "org.eclipse.jetty.server.handler.HandlerWrapper",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextHandle",
"fileName": "ScopedHandler.java",
"lineNumber": 235,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "SessionHandler.java",
"lineNumber": 1624,
"className": "org.eclipse.jetty.server.session.SessionHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextHandle",
"fileName": "ScopedHandler.java",
"lineNumber": 233,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "ContextHandler.java",
"lineNumber": 1440,
"className": "org.eclipse.jetty.server.handler.ContextHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextScope",
"fileName": "ScopedHandler.java",
"lineNumber": 188,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "ServletHandler.java",
"lineNumber": 505,
"className": "org.eclipse.jetty.servlet.ServletHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "SessionHandler.java",
"lineNumber": 1594,
"className": "org.eclipse.jetty.server.session.SessionHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextScope",
"fileName": "ScopedHandler.java",
"lineNumber": 186,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "ContextHandler.java",
"lineNumber": 1355,
"className": "org.eclipse.jetty.server.handler.ContextHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ScopedHandler.java",
"lineNumber": 141,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ContextHandlerCollection.java",
"lineNumber": 234,
"className": "org.eclipse.jetty.server.handler.ContextHandlerCollection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "PrioritizedHandlerCollection.java",
"lineNumber": 96,
"className": "org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HandlerWrapper.java",
"lineNumber": 127,
"className": "org.eclipse.jetty.server.handler.HandlerWrapper",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "Server.java",
"lineNumber": 516,
"className": "org.eclipse.jetty.server.Server",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "lambda$handle$1",
"fileName": "HttpChannel.java",
"lineNumber": 487,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "dispatch",
"fileName": "HttpChannel.java",
"lineNumber": 732,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HttpChannel.java",
"lineNumber": 479,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "onFillable",
"fileName": "HttpConnection.java",
"lineNumber": 277,
"className": "org.eclipse.jetty.server.HttpConnection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "succeeded",
"fileName": "AbstractConnection.java",
"lineNumber": 311,
"className": "org.eclipse.jetty.io.AbstractConnection$ReadCallback",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "fillable",
"fileName": "FillInterest.java",
"lineNumber": 105,
"className": "org.eclipse.jetty.io.FillInterest",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "ChannelEndPoint.java",
"lineNumber": 104,
"className": "org.eclipse.jetty.io.ChannelEndPoint$1",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "runTask",
"fileName": "EatWhatYouKill.java",
"lineNumber": 338,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doProduce",
"fileName": "EatWhatYouKill.java",
"lineNumber": 315,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "tryProduce",
"fileName": "EatWhatYouKill.java",
"lineNumber": 173,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "EatWhatYouKill.java",
"lineNumber": 131,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "ReservedThreadExecutor.java",
"lineNumber": 409,
"className": "org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "runJob",
"fileName": "QueuedThreadPool.java",
"lineNumber": 883,
"className": "org.eclipse.jetty.util.thread.QueuedThreadPool",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "QueuedThreadPool.java",
"lineNumber": 1034,
"className": "org.eclipse.jetty.util.thread.QueuedThreadPool$Runner",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": "java.base",
"moduleVersion": "21.0.5",
"methodName": "run",
"fileName": "Thread.java",
"lineNumber": 1583,
"className": "java.lang.Thread",
"nativeMethod": false
}
],
"jsonRpcError": {
"code": -32603,
"message": "application/json required in Accept header"
},
"message": "application/json required in Accept header",
"suppressed": [],
"localizedMessage": "application/json required in Accept header"
}
…and if I use application/json, I get:
{
"cause": null,
"stackTrace": [
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "build",
"fileName": "McpError.java",
"lineNumber": 72,
"className": "io.modelcontextprotocol.spec.McpError$Builder",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "responseError",
"fileName": "JavaxStreamableServerTransportProvider.java",
"lineNumber": 491,
"className": "org.openhab.io.mcp.internal.servlet.JavaxStreamableServerTransportProvider",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doPost",
"fileName": "JavaxStreamableServerTransportProvider.java",
"lineNumber": 345,
"className": "org.openhab.io.mcp.internal.servlet.JavaxStreamableServerTransportProvider",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "HttpServlet.java",
"lineNumber": 681,
"className": "javax.servlet.http.HttpServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "HttpServlet.java",
"lineNumber": 764,
"className": "javax.servlet.http.HttpServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "service",
"fileName": "OsgiInitializedServlet.java",
"lineNumber": 102,
"className": "org.ops4j.pax.web.service.spi.servlet.OsgiInitializedServlet",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ServletHolder.java",
"lineNumber": 799,
"className": "org.eclipse.jetty.servlet.ServletHolder",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doFilter",
"fileName": "ServletHandler.java",
"lineNumber": 1656,
"className": "org.eclipse.jetty.servlet.ServletHandler$ChainEnd",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doFilter",
"fileName": "OsgiFilterChain.java",
"lineNumber": 113,
"className": "org.ops4j.pax.web.service.spi.servlet.OsgiFilterChain",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "PaxWebServletHandler.java",
"lineNumber": 334,
"className": "org.ops4j.pax.web.service.jetty.internal.PaxWebServletHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ScopedHandler.java",
"lineNumber": 143,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "SecurityHandler.java",
"lineNumber": 600,
"className": "org.eclipse.jetty.security.SecurityHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HandlerWrapper.java",
"lineNumber": 127,
"className": "org.eclipse.jetty.server.handler.HandlerWrapper",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextHandle",
"fileName": "ScopedHandler.java",
"lineNumber": 235,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "SessionHandler.java",
"lineNumber": 1624,
"className": "org.eclipse.jetty.server.session.SessionHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextHandle",
"fileName": "ScopedHandler.java",
"lineNumber": 233,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doHandle",
"fileName": "ContextHandler.java",
"lineNumber": 1440,
"className": "org.eclipse.jetty.server.handler.ContextHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextScope",
"fileName": "ScopedHandler.java",
"lineNumber": 188,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "ServletHandler.java",
"lineNumber": 505,
"className": "org.eclipse.jetty.servlet.ServletHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "SessionHandler.java",
"lineNumber": 1594,
"className": "org.eclipse.jetty.server.session.SessionHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "nextScope",
"fileName": "ScopedHandler.java",
"lineNumber": 186,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doScope",
"fileName": "ContextHandler.java",
"lineNumber": 1355,
"className": "org.eclipse.jetty.server.handler.ContextHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ScopedHandler.java",
"lineNumber": 141,
"className": "org.eclipse.jetty.server.handler.ScopedHandler",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "ContextHandlerCollection.java",
"lineNumber": 234,
"className": "org.eclipse.jetty.server.handler.ContextHandlerCollection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "PrioritizedHandlerCollection.java",
"lineNumber": 96,
"className": "org.ops4j.pax.web.service.jetty.internal.PrioritizedHandlerCollection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HandlerWrapper.java",
"lineNumber": 127,
"className": "org.eclipse.jetty.server.handler.HandlerWrapper",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "Server.java",
"lineNumber": 516,
"className": "org.eclipse.jetty.server.Server",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "lambda$handle$1",
"fileName": "HttpChannel.java",
"lineNumber": 487,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "dispatch",
"fileName": "HttpChannel.java",
"lineNumber": 732,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "handle",
"fileName": "HttpChannel.java",
"lineNumber": 479,
"className": "org.eclipse.jetty.server.HttpChannel",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "onFillable",
"fileName": "HttpConnection.java",
"lineNumber": 277,
"className": "org.eclipse.jetty.server.HttpConnection",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "succeeded",
"fileName": "AbstractConnection.java",
"lineNumber": 311,
"className": "org.eclipse.jetty.io.AbstractConnection$ReadCallback",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "fillable",
"fileName": "FillInterest.java",
"lineNumber": 105,
"className": "org.eclipse.jetty.io.FillInterest",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "ChannelEndPoint.java",
"lineNumber": 104,
"className": "org.eclipse.jetty.io.ChannelEndPoint$1",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "runTask",
"fileName": "EatWhatYouKill.java",
"lineNumber": 338,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "doProduce",
"fileName": "EatWhatYouKill.java",
"lineNumber": 315,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "tryProduce",
"fileName": "EatWhatYouKill.java",
"lineNumber": 173,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "EatWhatYouKill.java",
"lineNumber": 131,
"className": "org.eclipse.jetty.util.thread.strategy.EatWhatYouKill",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "ReservedThreadExecutor.java",
"lineNumber": 409,
"className": "org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "runJob",
"fileName": "QueuedThreadPool.java",
"lineNumber": 883,
"className": "org.eclipse.jetty.util.thread.QueuedThreadPool",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": null,
"moduleVersion": null,
"methodName": "run",
"fileName": "QueuedThreadPool.java",
"lineNumber": 1034,
"className": "org.eclipse.jetty.util.thread.QueuedThreadPool$Runner",
"nativeMethod": false
},
{
"classLoaderName": null,
"moduleName": "java.base",
"moduleVersion": "21.0.5",
"methodName": "run",
"fileName": "Thread.java",
"lineNumber": 1583,
"className": "java.lang.Thread",
"nativeMethod": false
}
],
"jsonRpcError": {
"code": -32603,
"message": "text/event-stream required in Accept header"
},
"message": "text/event-stream required in Accept header",
"suppressed": [],
"localizedMessage": "text/event-stream required in Accept header"
}
This looks pretty broken to me, even if the request is invalid in some way, why convert a whole stack trace to JSON and dump that as a response? And, why require that the Accept header is two things at once?