Skip to content

MCP servers fail to start when non-JSON output is written to stdout (e.g. console.log) #298

@Kaspazza

Description

@Kaspazza

To upvote this issue, give it a thumbs up. See this list for the most upvoted issues.

When using the TailwindCSS MCP server with ECA, the server fails to start if it writes non-JSON output to stdout. Any log line printed to stdout (e.g. via console.log) is interpreted as an MCP message and causes a JSON parse error, crashing the connection.

This happens even though the server otherwise starts correctly. Redirecting logs from stdout to stderr resolves the issue.

Other MCP clients (Claude Code, Windsurf, Cursor, etc.) appear to handle this more defensively and do not crash in this scenario.

To Reproduce
Add to eca config.json TailwindCSS MCP server:
https://github.com/CarbonoDev/tailwindcss-mcp-server

when starting eca mcp fails with error:

[MCP] [tailwindcss-server] TailwindCSS MCP server running on stdio [MCP] Error processing inbound message for line: DocumentationScraperService initialized com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'DocumentationScraperService': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: REDACTED (StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); line: 1, column: 28] at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:2596) at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2622) at com.fasterxml.jackson.core.JsonParser._constructReadException(JsonParser.java:2630) at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:830) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._reportInvalidToken(ReaderBasedJsonParser.java:3017) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:2051) at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:780) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5058) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4961) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3887) at io.modelcontextprotocol.json.jackson.JacksonMcpJsonMapper.readValue(JacksonMcpJsonMapper.java:57) at io.modelcontextprotocol.spec.McpSchema.deserializeJsonRpcMessage(McpSchema.java:208) at io.modelcontextprotocol.client.transport.StdioClientTransport.lambda$startInboundProcessing$6(StdioClientTransport.java:253) at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68) at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28) at java.base@24.0.2/java.util.concurrent.FutureTask.run(FutureTask.java:328) at java.base@24.0.2/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1095) at java.base@24.0.2/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:619) at java.base@24.0.2/java.lang.Thread.runWith(Thread.java:1460) at java.base@24.0.2/java.lang.Thread.run(Thread.java:1447) at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:832) at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:808)

Expected behavior

ECA should:

Ignore non-JSON lines on stdout defensively.

Additional context:

A fix was applied in the TailwindCSS MCP server by replacing console.log with console.error, which makes it work correctly:
fixes to tailwindcss mcp server

The same issue was reported with Amazon Q CLI tool.

This appears to be a common MCP pitfall: stdout is reserved strictly for protocol messages, but many servers still log to it.

While this is technically a server-side bug, other MCP clients seem to tolerate or filter such output (e.g. this tailwindcss mcp server works with claude code, windsurf, cursor ide)

Question is if mcp-java-sdk which is used in eca allows to control that.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Projects

    Status

    Ready

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions