バックエンドと連携したいエンジニア向けClaude×nanoservice-tsのMCPサーバー実装ポイント

Published on: | Last updated:

這可能是你聽過最大的誤解:MCP 不是「讓 AI 直接打你 API」那麼粗暴;MCP 是 Anthropic 的 Model Context Protocol,用 discover と execute 把 Nanoservice-ts の Nodes と Workflows を安全に“ツール化”して Claude から呼べる規格だ(來源:Anthropic MCP 仕様・Nanoservice-ts)。

  • まず見る場所:discover で「使える道具の一覧」を返す
  • 次に起きる:execute で「この道具をこの引数で実行」を受ける
  • 守るポイント:公開するツールを絞る+JSON Schema(入力の型と制約)で弾く
  • 設計の癖:ビジネスロジックはそのまま、薄いアダプタだけ足す
  • 地味に大事:監査ログと認可。ここサボると後で泣く

「AI とつなぐ」って聞くと、みんな最初は“魔改造”の匂いを想像するんだよね。既存のバックエンドが、急に会話っぽい何かに飲み込まれる感じ。違う。そこ、違うの。ほんとに。

で、MCP はその混乱を避けるための“取り決め”。会話でお願いされた内容を、いきなり内部の関数に投げない。いったん「道具箱」を見せて(discover)、その後に「どれを、どういう引数で使うか」を決めて(execute)、結果を返す。

…って言うと簡単そうだけど、簡単に見えるところほど事故る。えぐい。

画像1(前段):MCP の全体像を一枚で
画像1(前段):MCP の全体像を一枚で

まず結論から言うと MCP は道具箱の見せ方と呼び方の約束

MCP は discover でツール定義(name・description・schema)を返し、execute でツール名と parameters を受け取り、実行結果を構造化して返すプロトコルだ(來源:Anthropic MCP 仕様)。

用語の置き場:ここ、混ぜるとチームが揉めるから先に固定しとくね。

  • Model Context Protocol:AI が「使えるツール」と「呼び出し方」を理解するための共通フォーマット
  • JSON Schema(入力の型と制約):parameters の必須・形式・範囲を機械的に検証する定義
  • Stateless Trigger(状態を持たない入口):HTTP みたいにリクエスト単位で処理して終わる入口。セッション依存にしない

この discover / execute の分離が、地味に効く。なぜかっていうと、AI 側は「勝手に何でも叩ける」状態じゃないから。道具箱に入ってないものは、存在しないのと同じ扱いになる。

それと、返す結果も “文字列でそれっぽく” じゃなくて、JSON で返す。ここが「会話→行動」を壊さないコツ。

MCP のキモは「AI に自由を渡す」じゃなくて、「使っていい範囲を形式で囲う」こと。

discover はツール一覧のカタログで execute はレジの会計

discover は name・description・schema を列挙して返し、execute は name と parameters を受けてバックエンド処理を走らせる二段構えだ。

たとえば、原文の例だとこういうやつ。

[
  {
    "name": "create_user_account",
    "description": "Creates a new user given an email and optional name.",
    "schema": { "type": "object", "properties": { "email": { "type": "string" } } }
  },
  {
    "name": "send_welcome_email",
    "description": "Sends a welcome email to a user.",
    "schema": { "type": "object", "properties": { "userId": { "type": "string" } } }
  }
]

で、呼び出し側(Claude みたいなアシスタント)が「じゃあこれ使う」って決めたら execute。

{
  "name": "create_user_account",
  "parameters": {
    "email": "john@example.com"
  }
}

返すのはこう。うん、こういうのがいい。余計な飾りなし。

{
  "userId": "abc123",
  "status": "success"
}

ちょっと怖い話:ここで “description を雑に書く” と、AI がツールの用途を誤解して変な順番で叩くことがある。説明文、後回しにしがちだけど、割と痛い目みる。

あ、あと。schema ね。ここを空にしたくなる瞬間あるけど、やめときな…。夜に呼び出しログ見て固まるやつ。

画像2(中段):discover→execute の流れを手順で
画像2(中段):discover→execute の流れを手順で

Nanoservice-ts が刺さるのは Node と Workflow がそのまま道具になるから

Nanoservice-ts は Nodes(単機能でテストしやすい関数)と Workflows(Nodes の合成)を持つため、MCP の「小さく定義されたツール」にそのまま対応する(來源:Nanoservice-ts ドキュメント)。

ここ、私はけっこう好き。理由が生々しいから。

普通のバックエンドって、API の都合で処理が太るでしょ。エンドポイントに色々詰め込みがち。で、後から AI 連携したいってなると「何をツールとして切り出す?」で揉める。揉めるのよ。

でも Nanoservice-ts は最初から “細い部品” が前提。Node は「これだけやる」、Workflow は「順番に組む」。MCP が欲しがる粒度に近い。

トリガーの話:Stateless Triggers が入口になれる、ってやつ。HTTP でもキューでも、入口が「状態を持たない」設計だと、会話のたびに変な状態が残らない。ここ、地味だけど後々ラク。

あ、そうだ。TypeScript の型。型があると schema を起こすのが…まあ、少しは、気がラク。全部自動は期待しすぎだけどね。

安全にやるなら allowlist と JSON Schema と認可をセットで持て

MCP サーバーは allowlist(公開ツールの許可リスト)と JSON Schema 検証と認可を同時に実装し、実行ログを監査可能な形で残すべきだ。

規則:「動く」より先に「止められる」を作る。これ、順番。

  • allowlist:公開するツール名を固定。内部用の危ない処理は最初から出さない
  • JSON Schema 検証:必須項目抜け、文字列の形式、想定外のフィールドを弾く
  • 認可:誰がどのツールを実行できるか。ユーザー権限・ロールで切る
  • レート制限:連打でメール送信とか、普通に起きる。止める壁を置く
  • 監査ログ:誰が・いつ・何を・どの引数で・結果はどうだったか

ここで日本ローカルの話も混ぜるね。SaaS で個人情報(メールアドレスとか)を触るなら、個人情報保護法の観点で「アクセス制御」と「ログ」って、後から説明を求められる側に回りがち。つまり、最初から用意しておくと眠れる。(來源:個人情報保護委員会 公開資料)

あと、社内の監査とか ISMS(ISO/IEC 27001)を通す会社だと、ツール実行の証跡を聞かれる。聞かれるの。ほんとに。

AI 連携は「便利」より先に「誰が責任持つの?」が来る。逃げ場ない。

画像3(転折處):安全設計の比較
画像3(転折處):安全設計の比較

時間とお金のマトリクス どこに投資すると損しにくいか

MCP 導入は「アダプタ実装」「スキーマ整備」「認可とログ」「運用監視」に分かれ、時間と費用の配分を誤ると手戻りが発生しやすい。

ここ、計算しよ。ふわっと「やってみよう」って言い出す人、だいたい後で消えるから。残るのは実装した人。あなた。私。うん…。

投資ポイント 時間コスト 金銭コスト サボった時に起きがち 先にやる目安
ツールの棚卸しと命名 0.5〜2日 ほぼ0円 似たツール名が増えて AI が誤爆、運用がカオス 最初
JSON Schema 整備 1〜5日 ほぼ0円 入力が崩れて例外祭り、ログが赤く染まる 最初
allowlist+認可 1〜3日 0〜(既存 IAM 次第) 権限の穴から内部操作が走る。後で説明地獄 最初
監査ログ設計 1〜4日 0〜(ログ基盤次第) 原因追跡できず、障害対応が長引く 最初〜早め
アダプタ実装(Node/Workflow を MCP 化) 2〜10日 0円 ここだけ先にやると“動くけど危ない”が完成 安全設計の後
監視とレート制限 0.5〜3日 0〜(監視ツール次第) 連打・暴走に気づけない、コストも跳ねる リリース前

私のおすすめの順番:「棚卸し→Schema→認可→ログ→アダプタ」。逆にすると、後で全部やり直す率が上がる。ほんと。静かに死ぬ。

あ、金銭コストのところが “0〜” なの、現実の匂いするでしょ。既存の認証基盤、ログ基盤、監視がある会社は強い。ない会社は、そこから。

手を動かすなら まずは入口とレジストリとアダプタを作る

実装は Stateless MCP Server Node を入口にし、Tool Registry で自動 discover を実現し、Node と Workflow をアダプタで MCP 準拠ツールに包むのが基本形だ(來源:Nanoservice-ts・Anthropic MCP 仕様)。

原文の「Part 2 でやること」を、会話っぽく並べ替えるとこう。

  • 入口:Stateless MCP Server Node(HTTP ハンドラみたいなやつ)
  • 台帳:Tool Registry(discover の返却をここから作る)
  • 包み紙:Adapters(既存 Node/Workflow を MCP の tool 形に合わせる)
  • 往復:Claude から呼んで結果が返るところまで通す

このへんで急に「全部自動で discovery できる?」って聞かれるんだけど、できる範囲はある。Node と Workflow が明確なら、列挙はしやすい。

ただ、description と schema は、人間の責任が残る。残るよ。AI に任せると、それっぽいけど危ないのが出てくる。ここは、あなたの目。

具体ツール名:JSON Schema を扱うなら Ajv みたいなバリデータを使うチームが多い(來源:Ajv 公開情報,建議查證)。ログは OpenTelemetry を噛ませておくと、後から追跡しやすい(來源:CNCF OpenTelemetry)。

うん、今 OpenTelemetry って言った瞬間、眠くなった人いるでしょ😶 でも障害の夜に助けてくれるのも、だいたいそういう地味なやつ。

画像4(結尾前):実装の部品地図
画像4(結尾前):実装の部品地図

FAQ ここだけは先に潰しておきたい

規則:FAQ の答えは短く断言で書く。ここは迷わせない。

Q:MCP を入れると既存 API を作り直す必要ある?

MCP は既存の Node と Workflow を薄いアダプタで包む方式なので、ビジネスロジックを作り直さずにツール公開へ寄せられる(來源:Nanoservice-ts ドキュメント)。

Q:discover で全部の機能を公開していい?

discover は allowlist で公開範囲を固定し、内部運用や危険操作の Node は一覧に出さないのが前提だ。

Q:JSON Schema は何のために入れる?

JSON Schema は parameters の必須・型・制約を機械検証して不正入力を遮断し、ツール実行の例外と誤動作を減らすために使う(來源:JSON Schema 仕様)。

Q:会話からユーザー作成やメール送信って、怖くない?

会話経由の実行は認可・レート制限・監査ログを揃えれば統制でき、誰が何を実行したか追える状態にできる。

Q:Nanoservice-ts じゃないとダメ?

MCP は実装言語に依存しないが、Nanoservice-ts は Node と Workflow の粒度が MCP ツールに合わせやすい設計だ(來源:Anthropic MCP 仕様・Nanoservice-ts)。

最後に一個だけ:「言語が UI になる」って、聞こえは派手。でも現場は、地味な配線の勝負。discover の中身、schema の硬さ、ログの粒度。そういうの。

で、聞きたい。あなたの現場だと、いま Claude に「ユーザー作成」「メール送信」「注文処理」みたいな操作、どこまで許せそう?それとも、まずは “読み取り専用のレポート生成” から始める感じ?

Related to this topic:

Comments