コンテンツへスキップ
Guide

10,000 台の MCP サーバーが存在します: 優良サーバーを分けるものは次のとおりです

| 9 min read

MCP エコシステムは、2026 年 4 月にサーバー数 10,000 台を超えました。有用な MCP サーバーと放棄された MCP サーバーを区別する 7 つのプラクティスと、49 ツールの実稼働サーバーの例を示します。

Server room with network cables and rack-mounted hardware representing MCP server infrastructure
Photo by Jordan Harrison on Unsplash

MCP エコシステムは、2026 年 4 月に 10,000 のパブリック サーバーを超えました。TypeScript、Python、Java、Kotlin、 C# と Swift SDK の月間ダウンロード数は合わせて 9,700 万件に達しました。 OAuth 2.1 およびストリーミング可能な HTTP トランスポート 安定しています。 Linux Foundation がガバナンスを監督しています。 クロード デスクトップ、カーソル、ウィンドサーフィン、ゼッド、続行、 Sourcegraph Cody と Taskade Genesis はすべて、MCP クライアント サポートとともに出荷されます。

これら 10,000 台のサーバーのほとんどは放棄された実験です。 あいまいなツール名、入力検証なし、ダンプされる API サーフェスと一般的なエラー メッセージ。 開発者が 7 つを共有するために戻ってくる一握りの 実践。

この投稿では、次の 7 つのプラクティスについて、製品コードを使用して説明します。 Botoi の MCP サーバー、150 以上の API エンドポイントから 49 の厳選されたツールを公開します。 毎 コード例は、実行中のサーバーからのものです。 api.botoi.com/mcp

1. ツールを厳選する。 API 全体をダンプしないでください

最大の間違いは、すべての API エンドポイントを MCP ツールとして登録することです。 Botoi には 150 以上のエンドポイントがあります。 それらがすべて MCP ツールである場合、ツール マニフェストは会話の前に 30,000 以上のトークンを消費することになります。 が始まります。 これにより、ユーザーの実際の質問の余地が少なくなり、モデルが質問を選択する可能性が高くなります。 ツールが間違っており、モデルは何百ものツールを読み込む必要があるため、すべてのリクエストが遅くなります 定義。

Botoi レジスタ 49. 選択基準: 開発者がコーディング セッション中に利用するツール (DNS) ルックアップ、JWT デコード、ハッシュ生成など)、構造化された出力モデルを生成するツールは、次のことを推論できます。 (JSON 検証、PII 検出)、およびコンテキスト スイッチを保存するツール (Base64 エンコード、URL メタデータ) 抽出)。

// curated-tools.ts - 49 tools from 150+ endpoints
export const CURATED_TOOLS: Record<string, CuratedTool> = {
  lookup_dns: {
    path: "/v1/dns/lookup",
    method: "post",
    title: "DNS Lookup",
    description:
      "Query DNS records (A, AAAA, MX, TXT, CNAME, NS) for a domain. " +
      "Use when you need to check DNS configuration or troubleshoot domain resolution.",
    annotations: { readOnlyHint: true, openWorldHint: true },
  },
  dev_hash: {
    path: "/v1/hash",
    method: "post",
    title: "Hash Text",
    description:
      "Generate a hash (MD5, SHA-1, SHA-256, SHA-512) of input text. " +
      "Use for checksums, data integrity, or fingerprinting.",
    annotations: { readOnlyHint: true },
  },
  // ... 47 more curated tools
};

うまくいかなかったツール: 大きなペイロードを伴うバッチ操作 (HTML からの PDF 生成)、 バイナリ データ (QR コード画像、スクリーンショット キャプチャ) を返すツール、および重複するツール 機能(3 つの異なるハッシュ エンドポイントが 1 つにまとめられています)。 追加するツールごとにトークンがかかります。 MCP マニフェストを API ドキュメントのミラーではなく、製品のように扱います。

経験則: 50 を超えるツールがある場合、モデルはツール定義の読み取りにより多くの時間を費やします。 役に立つ仕事をするよりも。 マニフェストを四半期ごとに監査し、呼び出しがゼロのツールを削除します。

2. モデルが正しく選択できるようにツールの説明を書きます。

モデルはツールの説明を読み取って、それを呼び出すかどうかを決定します。 「~します」のような曖昧な説明 DNS のもの」では、モデルに推測を強制します。 実装の詳細を詰め込んだ説明はトークンを無駄にします モデルに必要のない情報について。

機能するパターン: ツールの機能を説明する動詞で始まる 1 つの文に、その後に続く 「Use when」で始まる 2 番目の文は、トリガー条件を説明します。

不適切な説明

// Bad: vague, no trigger condition
{
  name: "dns",
  description: "Does DNS stuff"
}

// Bad: too long, includes implementation details
{
  name: "dns_lookup_tool",
  description: "This tool uses the DNS-over-HTTPS protocol to query Cloudflare's 1.1.1.1 resolver via a GET request to https://cloudflare-dns.com/dns-query with an Accept header of application/dns-json. It supports A, AAAA, MX, TXT, CNAME, and NS record types and returns the raw DNS response parsed into JSON format."
}

良い説明

// Good: verb-first, one sentence what + one sentence when
{
  name: "lookup_dns",
  description:
    "Query DNS records (A, AAAA, MX, TXT, CNAME, NS) for a domain. " +
    "Use when you need to check DNS configuration or troubleshoot domain resolution."
}

// Good: specific about capabilities and trigger condition
{
  name: "security_pii_detect",
  description:
    "Scan text for personal identifiable information (emails, phones, SSNs, credit cards). " +
    "Use when you need to audit user input or log output for sensitive data before storage."
}

最初の文はツールの選択に関するもので、ツールが何をするのか、何を入力するのかをモデルに伝えます。 受け入れます。 2 番目の文は曖昧さ回避のためのものです。2 つのツールが一致する場合、「Use when」句が使用されます。 モデルが正しいものを選択するのに役立ちます。

Botoi の MCP サーバー内の 49 ツールはすべてこのパターンに従います。 結果: モデルは一貫して 複数のツールに重複する機能がある場合でも、最初の試行で正しいツールを選択できます (例: lookup_emaillookup_dns MX レコードのチェック用)。

3. ツールの注釈を使用する

MCP 仕様では、次の 4 つの注釈ヒントが定義されています。 readOnlyHintdestructiveHintidempotentHint、 そして openWorldHint。 ほとんどのサーバーはそれらを無視します。 モデルと これらのヒントを尊重するクライアントは、より安全な決定を下します。クライアントは、 確認のため、失敗した場合には冪等ツールを再試行し、ツールの前にユーザーに警告します。 外部サービスにお問い合わせください。

// Annotations from Botoi's curated-tools.ts
lookup_dns: {
  path: "/v1/dns/lookup",
  annotations: {
    readOnlyHint: true,    // reads data, changes nothing
    openWorldHint: true,   // contacts external DNS servers
  },
},

storage_paste_create: {
  path: "/v1/paste/create",
  annotations: {
    destructiveHint: true,   // creates new data
    idempotentHint: false,   // each call creates a new paste
  },
},

dev_hash: {
  path: "/v1/hash",
  annotations: {
    readOnlyHint: true,      // pure computation
    idempotentHint: true,    // same input = same output
  },
},
注釈 意味
readOnlyHint: true データを読み取り、何も変更しません DNS ルックアップ、SSL チェック、IP 地理位置情報
destructiveHint: true データを作成、更新、または削除します ペーストの作成、短縮URLの生成
idempotentHint: true 同じ入力で複数回呼び出しても安全 ハッシュ生成、JSONフォーマット化
openWorldHint: true 外部サービスに連絡する DNS over HTTPS、WHOIS、URL メタデータ

アノテーションはマニフェストのサイズに関してはほとんどコストがかかりませんが、クライアントとモデルに 複数ステップのワークフローを安全に計画するために必要なメタデータ。 すべてのツールに設定します。

4. ストリーミング可能な HTTP によるステートレス化

SSE (Server-Sent Events) トランスポートは MCP 仕様では非推奨になりました。 粘り強さが必要でした 接続、セッション管理、再接続ロジック。 ストリーミング可能な HTTP が標準の HTTP に置き換わります JSON-RPC 2.0 ペイロードを含む HTTP POST リクエスト。 永続的な接続はありません。 セッション状態がありません。 作品 CDN、ロードバランサー、エッジランタイム、サーバーレスプラットフォームなど、あらゆる HTTP インフラストラクチャと連携します。

Botoi の MCP サーバーは Cloudflare Workers 上で実行されます。 リクエストごとに新しいものが作成されます McpServer インスタンスを作成し、49 個のツールすべてを登録し、リクエストを処理して戻ります。 セッションIDなし、再接続なし ハンドラー、リクエスト間で管理する状態がありません。

// MCP server on Cloudflare Workers with Streamable HTTP
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import {
  WebStandardStreamableHTTPServerTransport
} from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";

app.all("/mcp", async (c) => {
  const apiKey =
    c.req.header("X-API-Key") ||
    c.req.header("Authorization")?.replace("Bearer ", "");

  const server = createMcpServer(apiKey, c.env);
  const transport = new WebStandardStreamableHTTPServerTransport();
  await server.connect(transport);
  return transport.handleRequest(c.req.raw);
});

WebStandardStreamableHTTPServerTransport MCP SDK はあらゆるランタイムで動作します Web標準をサポートする Request/Response API: Cloudflare ワーカー、 Deno Deploy、Bun、Vercel Edge Functions、Node.js 18+。 新しい MCP サーバーを起動する場合は、 2026 では、ストリーミング可能な HTTP を使用します。 SSE サーバーを実行している場合は、クライアントがサポートを終了する前に移行してください。

ステートレス サーバーは、調整なしで水平方向に拡張します。 Botoi の MCP エンドポイントは Cloudflare 上で実行されます エッジネットワーク。 最寄りのデータセンターへのルートをリクエストします。 計算専用ツール (ハッシュ、Base64、 JSON 形式) は 50 ミリ秒未満で応答します。

5. スキーマを使用して入力を検証する

MCP ツールはモデルから任意の JSON を受け取ります。 モデルが送信できるのは 文字列が予期されている場合、不明なフィールドが含まれている場合、または必須パラメータが省略されている場合。 入力の検証 実行前にこれらのエラーを早期に検出し、モデルが使用できる構造化されたフィードバックを返します。 自己正しい。

Botoi のアプローチ: schema-builder.ts モジュールは OpenAPI パス定義を読み取ります 登録時に各プロパティを Zod タイプに変換します。 MCP SDK は入力を検証します。 ツール ハンドラーが実行される前の Zod スキーマ。

// schema-builder.ts - OpenAPI to Zod conversion
import { z } from "zod";
import { paths } from "../../openapi-paths";

function mapPropertyToZod(
  prop: OpenApiProperty,
  isRequired: boolean
): z.ZodTypeAny {
  let schema: z.ZodTypeAny;

  if (prop.enum && prop.enum.length > 0) {
    schema = z.enum(prop.enum as [string, ...string[]]);
  } else {
    switch (prop.type) {
      case "number":
      case "integer":
        schema = z.number(); break;
      case "boolean":
        schema = z.boolean(); break;
      default:
        schema = z.string(); break;
    }
  }

  if (!isRequired) schema = schema.optional();
  return schema;
}

export function buildZodSchema(
  apiPath: string,
  method: "get" | "post"
): Record<string, z.ZodTypeAny> {
  const operation = getOperation(apiPath, method);
  if (!operation) return {};

  const schema = operation.requestBody?.content?.["application/json"]?.schema;
  if (!schema?.properties) return {};

  const required = new Set(schema.required ?? []);
  const result: Record<string, z.ZodTypeAny> = {};

  for (const [key, prop] of Object.entries(schema.properties)) {
    result[key] = mapPropertyToZod(prop, required.has(key));
  }

  return result;
}

登録ループは、生成されたスキーマを次のように渡します。 inputSchema 各ツールについて:

// server.ts - register tools with Zod schemas
for (const [toolName, tool] of Object.entries(CURATED_TOOLS)) {
  const zodSchema = buildZodSchema(tool.path, tool.method);

  server.registerTool(toolName, {
    title: tool.title,
    description: tool.description,
    inputSchema: zodSchema,
    annotations: tool.annotations,
  }, async (args: Record<string, unknown>) => {
    return callApi(tool.path, tool.method, args, apiKey, env);
  });
}

これは、すべてのツールが無料で入力検証を受けることを意味します。 モデルが整数を送信する場合、文字列は が予期される場合、MCP SDK はハンドラー コードが実行される前に構造化エラーを返します。 モデルが見ているのは エラーを確認し、入力を修正して再試行します。

6. モデルが推論できる構造化エラーを返す

ツールが失敗した場合、モデルは回復するために十分な情報を必要とします。 「何か問題が発生しました」ではダメです。 フィールド名、期待内容、受信内容に関する構造化エラーにより、モデルに 修正された入力で再試行するためのパスをクリアします。

不正なエラー応答

// Bad: the model can't fix this
{
  "content": [{ "type": "text", "text": "Something went wrong" }],
  "isError": true
}

良好なエラー応答

// Structured error the model can reason about
{
  "content": [
    {
      "type": "text",
      "text": "{\\n  \\"error\\": \\"validation_error\\",\\n  \\"message\\": \\"Invalid record type\\",\\n  \\"field\\": \\"type\\",\\n  \\"expected\\": [\\"A\\", \\"AAAA\\", \\"MX\\", \\"TXT\\", \\"CNAME\\", \\"NS\\"],\\n  \\"received\\": \\"INVALID\\"\\n}"
    }
  ],
  "isError": true
}

ボトイさん callApi ラッパーは、基礎となる REST API から構造化エラーをキャプチャし、 それを MCP 応答に渡します。 isError: true:

// server.ts - API call wrapper with structured errors
async function callApi(
  path: string,
  method: string,
  body: unknown,
  apiKey: string | undefined,
  env: Env
) {
  const headers: Record<string, string> = {
    "Content-Type": "application/json",
  };
  if (apiKey) headers["X-API-Key"] = apiKey;

  const req = new Request(\`http://internal\${path}\`, {
    method: method.toUpperCase(),
    headers,
    body: method === "post" ? JSON.stringify(body) : undefined,
  });

  const res = await appFetcher(req, env);
  const json = await res.json();

  if (!json.success) {
    return {
      content: [{
        type: "text",
        text: JSON.stringify(json.error, null, 2),
      }],
      isError: true,
    };
  }

  return {
    content: [{
      type: "text",
      text: JSON.stringify(json.data, null, 2),
    }],
  };
}

重要な詳細: isError: true flag は、ツールの呼び出しが失敗したことをモデルに伝えます。 構造化された JSON text フィールドがその理由を教えてくれます。 ツールの使用パターンについてトレーニングされたモデル エラーを読み取り、問題のあるフィールドを特定し、修正された値で再試行します。 一般的なエラー 文字列はモデルに推測または諦めを強制します。

7. 開発者のエクスペリエンスを損なうことなく認証を追加する

MCP サーバーには認証が必要です。 この仕様では、完全な認証フローに対して OAuth 2.1 がサポートされていますが、ほとんどの 開発者ツールは API キー転送で正常に動作します。 開発者は自分のキーを MCP クライアントに追加します 一度設定します。 サーバーはそれをリクエストヘッダーから抽出し、すべての API 呼び出しに渡します。

API キーを使用した Claude Desktop のクライアント構成は次のとおりです。

// Client config: Claude Desktop
{
  "mcpServers": {
    "botoi": {
      "type": "streamable-http",
      "url": "https://api.botoi.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_API_KEY"
      }
    }
  }
}

サーバーは次のいずれかからキーを抽出します。 Authorization ヘッダーまたは X-API-Key ヘッダーを作成し、それをすべての内部 API 呼び出しに転送します。

// server.ts - extract API key from MCP request headers
app.all("/mcp", async (c) => {
  const apiKey =
    c.req.header("X-API-Key") ||
    c.req.header("Authorization")?.replace("Bearer ", "");

  // Pass the key through to every API call
  const server = createMcpServer(apiKey, c.env);
  const transport = new WebStandardStreamableHTTPServerTransport();
  await server.connect(transport);
  return transport.handleRequest(c.req.raw);
});

キーがなくてもサーバーは動作します。 Botoi では、1 分あたり 5 リクエストの匿名アクセスが可能です。 1 日あたり 100 件は、コーディング セッション中にカジュアルに使用するのに十分です。 キーを使用すると、スケールを次の範囲に制限します。 開発者プラン層。 このアプローチは、摩擦のないオンボーディングを意味します (試すためにサインアップは必要ありません) 使用量が増加した場合でも、明確なアップグレード パスを提供します。

開発者の API キーが MCP サーバーから離れることはありません。 クライアント設定から MCP に移行します 内部 API 呼び出しへのリクエスト ヘッダー。 モデルは会話のコンテキストでそれを認識することはありません。

良い MCP サーバーと悪い MCP サーバー

特性 悪いサーバー 良いサーバー
工具数 すべてのエンドポイント (100 以上) をダンプします 高価値ツール (50 未満) を厳選します
ツールの説明 「DNS に関するものはありますか」または 200 語の壁 動詞 + 動作 + 「いつ使用するか」トリガー
注釈 すべてのツールが不足している すべてのツールに設定: readOnly、破壊的、冪等、openWorld
輸送 セッション管理を備えた SSE ステートレス ストリーミング可能な HTTP
入力の検証 なし; 不正な入力でクラッシュする OpenAPI仕様から生成されたZodスキーマ
エラー応答 「何か問題が発生しました」 フィールド、期待値、および受信済みの構造化 JSON
認証 なし、または匿名の使用を完全にブロックします 匿名フォールバックとレート制限を備えた API キー転送

10,000 サーバーの状況

6 か月で MCP サーバーが 1,000 から 10,000 に増加したのは、プロトコルが安定したためです。 OAuth 2.1 は、アドホック認証パターンを置き換えました。 ストリーミング可能な HTTP が SSE に置き換わりました。 Linux財団 ガバナンスにより、企業は本番サーバーを構築する自信を得ることができました。 6 か国語の SDK が引き下げられる 参入障壁。

しかし、量は質をもたらしませんでした。 これらのサーバーのほとんどは週末の実験であり、決して成功することはありませんでした 「すべてのエンドポイントを登録して何が起こるかを確認する」段階。 開発者が毎日使用するサーバー キュレーション、説明、スキーマ、エラー処理、認証に重点を置いています。 これら 5 つの領域では 90% ユーザビリティギャップは生きています。

2026 年に MCP サーバーを構築している場合、ハードルは「機能するかどうか」ではありません。 バーは「モデルを実行しますか?」 適切なツールを選択し、間違ったツールを選択した場合のエラーを理解し、人間の介入なしに回復します。」 上記の 7 つの実践を実践すれば、そこに到達できます。

Botoi の MCP サーバーはテストのためにオープンされています。 クロード デスクトップ、クロード コード、カーソル、VS コード、 または、上の設定を使用したウィンドサーフィン MCP設定ページ。 完全なツール マニフェストは次のとおりです。 で api.botoi.com/v1/mcp/tools.json、 そして APIドキュメント ツールの背後にあるすべてのエンドポイントをカバーします。

FAQ

2026 年には MCP サーバーは何台存在しますか?
MCP エコシステムは、2025 年後半には約 1,000 台だったパブリック サーバーが、2026 年 4 月に 10,000 台を超えました。この成長は、安定した OAuth 2.1 サポート、SSE に代わるストリーミング可能な HTTP トランスポート、および Claude Desktop、Cursor、Windsurf、Zed、Continue、Sourcegraph Cody、および Taskade Genesis でのクライアント統合によって推進されています。
MCP サーバーはいくつのツールを公開する必要がありますか?
厳密な制限はありませんが、少ないほど良いです。 各ツール定義は、モデル コンテキスト ウィンドウ内のトークンを消費します。 150 ツールのマニフェストには、会話が始まるまでに 30,000 以上のトークンがかかる場合があります。 Botoi は、150 以上の API エンドポイントから 49 のツールを厳選しています。 ユースケースでそれ以上のことが要求されない限り、十分に説明されたツールを 50 個未満にすることを目指します。
2026 年にはどの MCP トランスポートを使用する必要がありますか?
ストリーミング可能な HTTP は、安定した推奨トランスポートです。 SSE (Server-Sent Events) トランスポートは MCP 仕様では非推奨になりました。 ストリーミング可能な HTTP は、JSON-RPC 2.0 ペイロードで標準の HTTP POST を使用し、あらゆる HTTP インフラストラクチャ (CDN、ロード バランサー、エッジ ランタイム) で動作し、永続的な接続を必要としません。
MCP ツールのアノテーションとは何ですか?なぜ重要ですか?
ツールのアノテーションは、MCP 仕様で定義されているメタデータ ヒントです (readOnlyHint、destructiveHint、idempotentHint、openWorldHint)。 これらは、ツールがデータを読み取るか、データを書き込むか、再試行しても安全か、または外部サービスに接続するかどうかを AI モデルに伝えます。 モデルはこれらのヒントを使用して、より安全な複数ステップのワークフローを計画し、ユーザーの確認なしでの破壊的な呼び出しを回避します。
MCP サーバーには認証が必要ですか?
はい。 MCP 仕様には、認証用の OAuth 2.1 が含まれるようになりました。 より単純なセットアップの場合でも、すべてのリクエストでベアラー トークンまたは API キーが必要です。 匿名アクセスには厳格なレート制限を設ける必要があります。 Botoi では、認証されたキーの制限が高く、1 分あたり 5 リクエスト、1 日あたり 100 リクエストの匿名アクセスが許可されます。

botoiで開発を始めよう

150以上のAPIエンドポイント。検索、テキスト処理、画像生成、開発者ユーティリティに対応。無料プラン、クレジットカード不要。