はじめに
Model Context Protocol(MCP)を用いたAIエージェントとローカル・リモートツールの連携開発が急速に普及しています。しかし、TypeScriptでMCPサーバーを実装する際、多くの開発者が遭遇するのが「標準出力(stdout)汚染によるJSON-RPC通信エラー」です。
本記事では、この問題の技術的原因、npxコマンドに潜む罠、および安定したMCPサーバー運用のためのベストプラクティスを解説します。
1. 問題の根幹:stdioトランスポートと「stdoutの黄金律」
stdio(標準入出力)トランスポートを使用するMCPサーバーでは、stdoutは厳密にJSON-RPCメッセージ専用の通信チャネルとして予約されています。たとえ1行のデバッグログやカラーコードであっても、stdoutに出力されるとクライアント側のJSONパースが破壊され、通信が切断されます。
- stdout(標準出力): JSON-RPCプロトコルメッセージのみ
- stderr(標準エラー出力): ログ、デバッグ情報、エラー出力すべて(
console.errorを使用)
2. npx コマンドの罠と対策
開発時によく使われる npx tsx src/index.ts ですが、npx はパッケージのダウンロード確認やプロンプト(◇ Need to install...)をstdoutに書き出してしまう性質があります。これが原因で invalid character '◇' といった原因特定が難しい通信エラーが発生します。
解決策:本番・定常運用では、事前に tsc でコンパイルを行い、node dist/index.js のように純粋な node コマンドで直接起動することが最も安定した選択肢となります。
3. Neon PostgreSQL へのダイレクト書き込み構成
さらに、MCPサーバーからデータベース(Neon Serverless Postgres等)へ直接書き込む構成をとることで、中間のREST APIサーバーを常時起動しておく必要がなくなり、AIエージェントからの完全全自動な投稿パイプラインが実現します。
まとめ
MCPサーバー開発では、ログはすべて stderr へ出力し、運用環境では事前コンパイル済みのコードを node で実行することが、100%の安定稼働を実現する鍵となります。



