MCP
MCP本番運用プレイブック2026:個人開発で安全にAIエージェントを回す設計
MCPを個人開発や小規模チームで本番運用するための実践ガイドです。stdioとStreamable HTTPの使い分け、OAuth同意設計、最小権限、観測性、30日導入プランまでを2026年の最新動向とともに整理します。
はじめに:MCPが「おもしろ技術」から「運用対象」になった話
ここ1年で、MCP(Model Context Protocol)が一気に「試してみた系」から「本番でどう回すか」へ話題が移ってきました。AIエージェントにツールを渡せば何でも解決……と言いたいところですが、実際は「便利さ」と「制御不能」の境目をどこに引くかが勝負です。雑に言うと、MCPは魔法の杖ではなく、ちゃんと取扱説明書が必要な電動工具です。うまく使えば爆速、雑に使えば指を詰めます。
この記事では、個人開発〜小規模チームを想定して、2026年時点のMCP運用をどう設計すると事故りにくいかをまとめます。特に以下を重視します。
- トランスポート選定(stdio / Streamable HTTP)
- 認可と同意の設計
- ツールの最小公開と観測性
- 失敗前提の運用(タイムアウト・リトライ・フェイルクローズ)
※MCP(Model Context Protocol): LLMが外部ツールやデータにアクセスするための共通プロトコルです。
2026年の変化:なぜ今MCP運用設計が必要か
まず背景です。MCPは「標準化の動きが速い」「対応製品が増える」「セキュリティ要件が重くなる」の3点が同時進行しています。
OpenAIはResponses APIでリモートMCPサーバー対応を打ち出し、画像生成やCode Interpreterなどのツール連携を単一のAPI文脈で扱える方向に進めています。これで「エージェントは社内ツールもSaaSも横断して使う」が一気に現実的になりました。一方で、使えるツールが増えるほど、権限境界の設計ミスがそのまま事故になります。
さらにMCP仕様側でも、トランスポートやセキュリティのベストプラクティスが整理され続けています。特に「とりあえずSSEでつなぐ」時代から、より明示的な運用前提へ移っているのがポイントです。
要するに、2026年のMCPは「接続できたら勝ち」ではなく「安全に運用できて初めて勝ち」です。ここを無視すると、デモは100点、本番で0点になります。デモは拍手、本番は監査。人生そんなものです。
トランスポート設計:stdioとStreamable HTTPを使い分ける
MCP仕様では標準トランスポートとしてstdioとStreamable HTTPが定義されています。選定指針はシンプルです。
- 同一ホストで完結: まずstdio
- ネットワーク越しの共有: Streamable HTTP
stdioは構成が単純で、ローカル開発や1対1接続に強いです。プロセスライフサイクルも把握しやすく、最初の検証に向いています。反面、複数クライアントやリモート公開には向きません。
Streamable HTTPはサーバーを独立プロセスとして扱え、複数クライアント接続を前提にできます。実運用はこちらが中心になりますが、セキュリティ要件が増えます。仕様にもある通り、Origin検証、認証、ローカルバインド方針などを明確にしないと、DNS Rebindingなどの古典的な攻撃が普通に刺さります。
最初の実装で迷ったら、以下のルールで十分です。
- 開発初期はstdioでユースケースを固める
- 公開前にStreamable HTTPへ移行
- 移行時に認証・監査ログ・レート制限を同時導入
「まず動かしてから守る」も悪くはないですが、守りを後付けすると高確率で設計負債になります。引っ越し前提で家具を買うのと同じで、玄関を通らない棚を買ってから泣くタイプの失敗です。
認可設計:OAuthと同意画面を甘く見ない
MCPのセキュリティ文書では、Confused Deputy(権限の取り違え)問題が具体例付きで説明されています。これ、個人開発でも無関係ではありません。むしろ小規模環境ほど「まあ自分しか使わないし」で飛ばしがちです。
最低限、以下は守るべきです。
- クライアント単位の同意を保持する
- 同意画面で「誰が」「何の権限を」要求しているかを明示する
- CSRF対策(state等)を入れる
- トークンや同意Cookieを安全属性付きで管理する
特に危ないのが「同意済みだから次もOKでしょ」の雑な実装です。便利ですが、攻撃者にも便利です。セキュリティの世界では、開発者の優しさはしばしば脆弱性と同義になります。悲しいですが、現実です。
ツール公開の原則:最小権限 + 意図が伝わるスキーマ
MCP運用でハマるのは、技術よりも設計の雑さです。代表例が「とりあえず全部のツールを見せる」。これはだいたい失敗します。
公開ツールは以下を基準に絞るのが有効です。
- ユーザー価値が明確なものだけ公開
- 破壊的操作(削除・上書き)は別サーバーに隔離
- ツール説明文に副作用を明記
- 引数スキーマで危険値を通しにくくする
例えばGitHub連携なら、最初は「read系(issue一覧、PR参照)」だけで十分です。いきなりwrite系を開けると、モデルの暴走というより設計者の期待値設定ミスで事故ります。
GitHub公式MCPサーバーの公開プレビューが示したように、実用性は「数」より「説明の質」で決まります。ツールが100個あっても、モデルが正しく選べなければ0個と同じです。むしろ迷わせる分だけマイナスです。
観測性:ログがない運用は「祈り」に近い
MCPを本番で回すなら、観測性(Observability)を後回しにしてはいけません。
最低でも次を残します。
- どの入力で
- どのツールが呼ばれ
- 何秒かかり
- 成功/失敗したか
- 失敗理由は何か
クラウド側ではAI Gatewayのように、複数プロバイダをまたいで可視化・制御する仕組みが一般化しつつあります。個人開発でも、せめて「1リクエスト1トレースID」で追えるようにしておくと、障害対応の体感難易度が段違いです。
「ログは出してる」だけでは不十分で、「あとから読める」形式にするのが大事です。JSON構造化ログ、相関ID、サンプリング方針。この3点があるだけで、真夜中の障害調査が“地獄”から“めんどう”くらいに下がります。めんどうで済めば勝ちです。
まず動く実装テンプレート(Node.js + HTTP MCP前提)
以下はあくまで最小構成の例です(動作未検証)。重要なのは「実装より運用フック」です。
# 例: 必要パッケージを追加
npm i express pino pino-http zod
// server.js (動作未検証のサンプル)
import express from "express";
import pinoHttp from "pino-http";
import { z } from "zod";
const app = express();
app.use(express.json({ limit: "1mb" }));
app.use(pinoHttp());
const ToolInput = z.object({
action: z.enum(["list_posts", "get_post"]),
id: z.string().optional(),
});
app.post("/mcp", async (req, res) => {
const traceId = req.headers["x-trace-id"] || crypto.randomUUID();
// 1) Origin / Auth 検証(本番では必須)
// 2) JSON-RPC バリデーション
// 3) タイムアウト制御
const parsed = ToolInput.safeParse(req.body?.params?.arguments ?? {});
if (!parsed.success) {
return res.status(400).json({ error: "invalid_arguments", traceId });
}
// 読み取り系だけ公開する例
if (parsed.data.action === "list_posts") {
return res.json({ result: [{ id: "1", title: "Hello MCP" }], traceId });
}
return res.json({ result: { id: parsed.data.id, title: "Post" }, traceId });
});
app.listen(8787, "127.0.0.1", () => {
console.log("MCP server listening on http://127.0.0.1:8787/mcp");
});
この段階で最低限やるべきチェックは以下です。
actionを列挙型で制限できているか- 想定外引数を落とせるか
- タイムアウトと最大入力サイズがあるか
- トレースIDで1件追跡できるか
MCP Inspectorを使えば、ツール一覧や引数検証、失敗パターンの確認を対話的に進められます。ローカル検証での“雑な安心感”を減らすのにかなり有効です。
個人開発での現実的ロードマップ(30日)
最後に、私が個人開発で実際に回しやすいと感じる30日プランを置いておきます。
- 1週目: 1ユースケースだけ作る(read-only)
- 2週目: 監査ログ、タイムアウト、リトライ方針を追加
- 3週目: 認可フローと同意画面を導入
- 4週目: 失敗事例を収集してプロンプト・スキーマを修正
ポイントは「先に機能を増やさない」ことです。MCPの価値は接続数ではなく、再現性ある成功率です。10個つながるけど毎日壊れるより、2個で安定する方が100倍えらいです。
AIエージェントの未来は明るいですが、運用は地味です。地味ですが、地味こそが本番を救います。派手なデモの翌日に静かに動き続けるシステム、それが正義です。
参考リンク
- OpenAI: New tools and features in the Responses API
https://openai.com/index/new-tools-and-features-in-the-responses-api/ - Model Context Protocol: Transports (2025-03-26)
https://modelcontextprotocol.io/specification/2025-03-26/basic/transports - Model Context Protocol: Security Best Practices
https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices - GitHub Changelog: github-mcp-server public preview
https://github.blog/changelog/2025-04-04-github-mcp-server-public-preview/ - Cloudflare Blog: AI Gateway refresh (2025-08)
https://blog.cloudflare.com/ai-gateway-aug-2025-refresh/ - MCP Inspector docs
https://modelcontextprotocol.io/docs/tools/inspector