# MCPとAPIの作り比べ

2026-10-01（Asia/Singapore）、同じ「都市の現在の天気を返す」処理を、REST APIの直接呼び出し（`a_rest.mjs`）とMCPサーバー（`server.mjs`）で作った記録です。

| ファイル | 内容 |
|---|---|
| [README.md](./README.md) | 保存・実行手順と観測の条件 |
| [package.json](./package.json) | 実験で使う依存関係 |
| [a_rest.mjs](./a_rest.mjs) | Open-Meteoを直接呼ぶ |
| [server.mjs](./server.mjs) | 同じ処理のMCPサーバー（stdio） |
| [raw_client.mjs](./raw_client.mjs) | SDKクライアントを使わず生のJSON-RPCを送る |
| [raw.out](./raw.out) | 修正前コードの実行ログ |
| [llm_obs.mjs](./llm_obs.mjs) | Claude Agent SDKでAIにMCPサーバーだけを渡す |
| [llm.out](./llm.out) | 修正前コードでAIに1回聞いたログ |

## 保存と実行

Node 24とnpm、curlが必要です。天気の接続先Open-Meteoは認証不要です。
8ファイルを同じdirectoryへ保存します。次のURLは記事の掲載サイトです。

```sh
mkdir mcp-vs-api
cd mcp-vs-api
base=https://aachat.app/blog/mcp-vs-api
for file in README.md package.json a_rest.mjs server.mjs raw_client.mjs llm_obs.mjs raw.out llm.out; do
  curl -fSLO "$base/$file" || exit 1
done
npm install
node a_rest.mjs Tokyo
node raw_client.mjs
```

以後もこのdirectoryで実行してください。A/Cとも現在のサンプルは `timezone=GMT` を指定し、`time` を末尾 `Z` のUTCで返します。正常な検索0件と上流HTTP失敗は区別し、後者は `geocoding HTTP 429` / `forecast HTTP 503` のように段階とstatusを返します。

LLM実験だけは、ローカルでClaude Codeにログイン済みの環境が別途必要です。`node llm_obs.mjs < /dev/null` と実行します。モデルの回答は実行ごとに変わりえます。

## 保存済みログの条件と訂正

`raw.out` と `llm.out` は修正前コードによる2026-10-01の観測を原文のまま保持しています。現在のサンプルの再実行結果ではありません。旧出力の `2026-10-01T03:30` はUTCで、東京では同日12:30 JSTです。AIの「東京の現在（10月1日3時30分時点）」という回答は時刻基準を欠く不正確な説明でした。ツール呼び出しの成立は、最終回答の意味の正確性まで保証しません。

## 限界

- 小さな読み取り専用の処理1つの比較です。書き込み、認証つきサービス、複数ツールでは差の出方が違います。
- `@modelcontextprotocol/sdk` 1.31.0のサーバーは2025-11-25版までを話します。現行の仕様（2026-07-28）の`server/discover`には応答しません（`Method not found`を確認）。
- AIの挙動は各1回の観測です。毎回同じツールを呼ぶとは言えません。
