Langsung ke konten
Guide

Ada 10.000 server MCP: inilah yang membedakan server yang bagus

| 9 min read

Ekosistem MCP melintasi 10.000 server pada bulan April 2026. Tujuh praktik yang memisahkan server MCP yang berguna dari server yang ditinggalkan, dengan contoh dari server produksi 49 alat.

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

Ekosistem MCP melintasi 10.000 server publik pada bulan April 2026. TypeScript, Python, Java, Kotlin, C#, dan Swift SDK mencapai 97 juta unduhan bulanan jika digabungkan. OAuth 2.1 dan transportasi HTTP yang dapat dialirkan stabil. Linux Foundation mengawasi tata kelola. Claude Desktop, Kursor, Selancar Angin, Zed, Lanjutkan, Sourcegraph Cody, dan Taskade Genesis semuanya dikirimkan dengan dukungan klien MCP.

Sebagian besar dari 10.000 server tersebut adalah eksperimen yang ditinggalkan. Nama alat tidak jelas, tidak ada validasi masukan, dibuang Permukaan API, dan pesan kesalahan umum. Segelintir pengembang terus datang kembali untuk membagikan tujuh praktik.

Posting ini mencakup tujuh praktik dengan kode produksi dari Server MCP Botoi, yang menampilkan 49 alat pilihan dari 150+ titik akhir API. Setiap contoh kode berasal dari server yang sedang berjalan di api.botoi.com/mcp.

1. Alat kurasi; jangan membuang seluruh API Anda

Satu-satunya kesalahan terbesar: mendaftarkan setiap titik akhir API sebagai alat MCP. Botoi memiliki 150+ titik akhir. Jika semuanya adalah alat MCP, manifes alat akan menggunakan 30.000+ token sebelum percakapan dimulai. Hal ini memberikan lebih sedikit ruang untuk pertanyaan aktual pengguna, meningkatkan kemungkinan model memilih alat yang salah, dan memperlambat setiap permintaan karena model harus membaca ratusan alat definisi.

Botoi mendaftar 49. Kriteria pemilihan: pengembang alat meraih selama sesi pengkodean (DNS pencarian, dekode JWT, pembuatan hash), alat yang menghasilkan model keluaran terstruktur dapat memikirkannya (Validasi JSON, deteksi PII), dan alat yang menyimpan peralihan konteks (encode Base64, metadata URL ekstraksi).

// 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
};

Alat yang tidak berhasil: operasi batch dengan muatan besar (pembuatan PDF dari HTML), alat yang mengembalikan data biner (gambar kode QR, tangkapan layar), dan alat yang tumpang tindih fungsionalitas (tiga titik akhir hash yang berbeda diciutkan menjadi satu). Setiap alat yang Anda tambahkan memerlukan token. Perlakukan manifes MCP Anda seperti sebuah produk, bukan cerminan dari dokumen API Anda.

Aturan praktisnya: jika Anda memiliki lebih dari 50 alat, model menghabiskan lebih banyak waktu untuk membaca definisi alat daripada melakukan pekerjaan yang bermanfaat. Audit manifes Anda setiap tiga bulan dan hapus alat yang tidak memiliki pemanggilan apa pun.

2. Tulis deskripsi alat yang membantu model memilih dengan benar

Model membaca deskripsi alat Anda untuk memutuskan apakah akan memanggilnya. Deskripsi yang tidak jelas seperti "Apakah Hal DNS" memaksa model untuk menebak. Deskripsi yang diisi dengan detail implementasi akan membuang-buang token pada informasi yang tidak dibutuhkan model.

Pola yang berhasil: satu kalimat dimulai dengan kata kerja yang menyatakan apa yang dilakukan alat tersebut, diikuti dengan kalimat kedua dimulai dengan "Gunakan saat" yang menjelaskan kondisi pemicu.

Deskripsi yang buruk

// 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."
}

Deskripsi yang bagus

// 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."
}

Kalimat pertama adalah untuk pemilihan alat: kalimat ini memberi tahu model apa yang dilakukan alat tersebut dan apa yang dimasukkannya menerima. Kalimat kedua adalah untuk disambiguasi: ketika dua alat bisa cocok, klausa "Gunakan ketika". membantu model memilih yang tepat.

Ke-49 alat di server MCP Botoi mengikuti pola ini. Hasilnya: model secara konsisten memilih alat yang benar pada percobaan pertama, meskipun beberapa alat memiliki kemampuan yang tumpang tindih (misalnya, lookup_email vs. lookup_dns untuk memeriksa data MX).

3. Gunakan anotasi alat

Spesifikasi MCP mendefinisikan empat petunjuk anotasi: readOnlyHint, destructiveHint, idempotentHint, Dan openWorldHint. Kebanyakan server mengabaikannya. Model dan klien yang menghormati petunjuk ini membuat keputusan yang lebih aman: mereka tidak akan memanggil alat yang merusak tanpanya konfirmasi, mereka akan mencoba kembali alat idempoten jika gagal, dan mereka akan memperingatkan pengguna sebelum alat tersebut hubungi layanan eksternal.

// 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
  },
},
Anotasi Arti Contoh
readOnlyHint: true Membaca data, tidak mengubah apa pun Pencarian DNS, pemeriksaan SSL, geolokasi IP
destructiveHint: true Membuat, memperbarui, atau menghapus data Buat tempel, buat URL pendek
idempotentHint: true Aman untuk menelepon berkali-kali dengan masukan yang sama Pembuatan hash, pemformatan JSON
openWorldHint: true Menghubungi layanan eksternal DNS melalui HTTPS, WHOIS, metadata URL

Anotasi hampir tidak memerlukan biaya apa pun dalam hal ukuran manifes, tetapi anotasi memberikan klien dan model kemampuan metadata yang mereka perlukan untuk merencanakan alur kerja multi-langkah dengan aman. Atur di setiap alat.

4. Menjadi tanpa kewarganegaraan dengan HTTP Streamable

Transportasi SSE (Server-Sent Events) tidak digunakan lagi dalam spesifikasi MCP. Untuk itu diperlukan ketekunan koneksi, manajemen sesi, dan logika koneksi ulang. HTTP yang dapat dialirkan menggantikannya dengan standar Permintaan HTTP POST membawa muatan JSON-RPC 2.0. Tidak ada koneksi yang persisten. Tidak ada status sesi. Bekerja dengan setiap infrastruktur HTTP: CDN, penyeimbang beban, runtime edge, platform tanpa server.

Server MCP Botoi berjalan di Cloudflare Workers. Setiap permintaan menciptakan permintaan baru McpServer misalnya, mendaftarkan semua 49 alat, menangani permintaan, dan mengembalikan. Tidak ada ID sesi, tidak ada koneksi ulang handler, tidak ada status untuk mengelola antar permintaan.

// 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);
});

Itu WebStandardStreamableHTTPServerTransport dari MCP SDK berfungsi dengan runtime apa pun yang mendukung Standar Web Request/Response API: Pekerja Cloudflare, Deno Deploy, Bun, Fungsi Vercel Edge, dan Node.js 18+. Jika Anda memulai server MCP baru 2026, gunakan HTTP yang Dapat Dialirkan. Jika Anda menjalankan server SSE, migrasikan sebelum klien menghentikan dukungan.

Server stateless berskala horizontal tanpa koordinasi. Titik akhir MCP Botoi berjalan di Cloudflare jaringan tepi; meminta rute ke pusat data terdekat. Alat komputasi saja (hashing, Base64, Pemformatan JSON) merespons dalam waktu kurang dari 50 md.

5. Validasi masukan dengan skema

Alat MCP menerima JSON sewenang-wenang dari model. Seorang model dapat mengirim di mana Anda mengharapkan string, menyertakan bidang yang tidak diketahui, atau menghilangkan parameter yang diperlukan. Memvalidasi masukan sebelum eksekusi menangkap kesalahan ini lebih awal dan mengembalikan umpan balik terstruktur yang dapat digunakan oleh model mengoreksi diri sendiri.

Pendekatan Botoi: the schema-builder.ts modul membaca definisi jalur OpenAPI di waktu pendaftaran dan mengonversi setiap properti menjadi tipe Zod. MCP SDK memvalidasi masukan skema Zod sebelum penangan alat dijalankan.

// 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;
}

Loop registrasi meneruskan skema yang dihasilkan sebagai inputSchema untuk setiap alat:

// 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);
  });
}

Artinya setiap alat mendapatkan validasi input secara gratis. Jika model mengirimkan bilangan bulat ke mana string diharapkan, MCP SDK mengembalikan kesalahan terstruktur sebelum kode pengendali Anda dijalankan. Modelnya melihat kesalahan, memperbaiki masukan, dan mencoba lagi.

6. Mengembalikan kesalahan terstruktur yang dapat dijadikan alasan oleh model

Ketika suatu alat gagal, model memerlukan informasi yang cukup untuk memulihkannya. "Ada yang tidak beres" tidak ada gunanya. Kesalahan terstruktur dengan nama bidang, apa yang diharapkan, dan apa yang diterima memberikan model a jalur yang jelas untuk mencoba lagi dengan masukan yang diperbaiki.

Respon kesalahan yang buruk

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

Respon kesalahan yang bagus

// 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
}

milik Botoi callApi wrapper menangkap kesalahan terstruktur dari REST API yang mendasarinya dan meneruskannya ke respons MCP dengan 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),
    }],
  };
}

Detail utama: itu isError: true flag memberi tahu model bahwa pemanggilan alat gagal. JSON terstruktur di text lapangan menceritakan alasannya. Model dilatih tentang pola penggunaan alat akan membaca kesalahan, mengidentifikasi bidang masalah, dan mencoba lagi dengan nilai yang diperbaiki. Kesalahan umum string memaksa model untuk menebak atau menyerah.

7. Tambahkan autentikasi tanpa merusak pengalaman pengembang

Server MCP memerlukan autentikasi. Spesifikasinya mendukung OAuth 2.1 untuk alur otorisasi penuh, tetapi sebagian besar alat pengembang berfungsi dengan baik dengan penerusan kunci API. Pengembang menambahkan kuncinya ke klien MCP konfigurasi sekali; server mengekstraknya dari header permintaan dan meneruskannya ke setiap panggilan API.

Berikut konfigurasi klien untuk Claude Desktop dengan kunci API:

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

Server mengekstrak kunci dari salah satu Authorization tajuk atau X-API-Key header, lalu meneruskannya ke setiap panggilan API internal:

// 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);
});

Tanpa kunci, server tetap berfungsi. Botoi mengizinkan akses anonim dengan 5 permintaan per menit dan 100 per hari, cukup untuk penggunaan biasa selama sesi coding. Dengan kunci, batasi skala hingga tingkat rencana pengembang. Pendekatan ini berarti orientasi tanpa gesekan (tidak perlu mendaftar untuk mencobanya) dengan jalur peningkatan yang jelas saat penggunaan bertambah.

Kunci API pengembang tidak pernah meninggalkan server MCP. Mulai dari konfigurasi klien ke MCP header permintaan ke panggilan API internal. Model tidak pernah melihatnya dalam konteks percakapan.

Server MCP bagus vs. server MCP buruk

Sifat Server buruk Server yang bagus
Jumlah alat Membuang setiap titik akhir (100+) Mengkurasi alat bernilai tinggi (di bawah 50 tahun)
Deskripsi alat "Apakah DNS berfungsi" atau dinding 200 kata Kata kerja + fungsinya + pemicu "Gunakan kapan".
Anotasi Hilang di semua alat Diatur pada setiap alat: readOnly, destruktif, idempoten, openWorld
Mengangkut SSE dengan manajemen sesi HTTP yang Dapat Dialirkan Tanpa Kewarganegaraan
Validasi masukan Tidak ada; crash pada input yang buruk Skema Zod dihasilkan dari spesifikasi OpenAPI
Respons kesalahan "Ada yang tidak beres" JSON terstruktur dengan bidang, diharapkan, dan diterima
Otentikasi Tidak ada, atau memblokir penggunaan anonim sepenuhnya Penerusan kunci API dengan fallback anonim dan batas kecepatan

Lanskap 10.000 server

The growth from 1,000 to 10,000 MCP servers in six months happened because the protocol stabilized. OAuth 2.1 menggantikan pola autentikasi ad-hoc. HTTP yang dapat dialirkan menggantikan SSE. Yayasan Linux tata kelola memberi perusahaan kepercayaan diri untuk membangun server produksi. SDK dalam enam bahasa diturunkan penghalang untuk masuk.

Namun kuantitas tidak membawa kualitas. Sebagian besar server tersebut merupakan eksperimen akhir pekan yang belum pernah terjadi sebelumnya tahap "daftarkan semua titik akhir saya dan lihat apa yang terjadi". Server yang digunakan pengembang setiap hari diinvestasikan dalam kurasi, deskripsi, skema, penanganan kesalahan, dan autentikasi. Kelima area tersebut adalah tempat 90% of the usability gap lives.

Jika Anda membuat server MCP pada tahun 2026, batasannya tidak "berfungsi". Bilahnya adalah "apakah modelnya pilih alat yang tepat, pahami kesalahan saat mengambil alat yang salah, dan pulihkan tanpa campur tangan manusia." Tujuh praktik di atas membawa Anda ke sana.

Server MCP Botoi terbuka untuk pengujian. Hubungkan dari Claude Desktop, Claude Code, Cursor, VS Code, atau Selancar Angin menggunakan konfigurasi di halaman pengaturan MCP. Manifes alat selengkapnya adalah di api.botoi.com/v1/mcp/tools.json, dan itu dokumen API menutupi setiap titik akhir di belakang alat.

FAQ

Berapa banyak server MCP yang ada pada tahun 2026?
Ekosistem MCP melampaui 10.000 server publik pada bulan April 2026, naik dari sekitar 1.000 pada akhir tahun 2025. Pertumbuhan ini didorong oleh dukungan OAuth 2.1 yang stabil, transportasi HTTP yang dapat dialirkan menggantikan SSE, dan integrasi klien di Claude Desktop, Cursor, Windsurf, Zed, Continue, Sourcegraph Cody, dan Taskade Genesis.
Berapa banyak alat yang harus diekspos oleh server MCP?
Tidak ada batasan yang tegas, tetapi lebih sedikit lebih baik. Setiap definisi alat menggunakan token di jendela konteks model. Manifes yang berisi 150 alat dapat menghabiskan biaya 30.000+ token sebelum percakapan dimulai. Botoi mengumpulkan 49 alat dari 150+ titik akhir API. Usahakan untuk menggunakan kurang dari 50 alat yang dijelaskan dengan baik kecuali jika kasus penggunaan Anda memerlukan lebih banyak.
Transportasi MCP apa yang harus saya gunakan pada tahun 2026?
HTTP yang dapat dialirkan adalah transportasi yang stabil dan direkomendasikan. Transportasi SSE (Server-Sent Events) tidak digunakan lagi dalam spesifikasi MCP. HTTP yang dapat dialirkan menggunakan HTTP POST standar dengan payload JSON-RPC 2.0, berfungsi dengan infrastruktur HTTP apa pun (CDN, penyeimbang beban, runtime edge), dan tidak memerlukan koneksi persisten.
Apa yang dimaksud dengan anotasi alat MCP dan mengapa itu penting?
Anotasi alat adalah petunjuk metadata yang ditentukan dalam spesifikasi MCP: readOnlyHint, destruktifHint, idempotentHint, dan openWorldHint. Mereka memberi tahu model AI apakah suatu alat membaca data, menulis data, aman untuk dicoba ulang, atau menghubungi layanan eksternal. Model menggunakan petunjuk ini untuk merencanakan alur kerja multi-langkah yang lebih aman dan menghindari panggilan yang merusak tanpa konfirmasi pengguna.
Apakah server MCP memerlukan otentikasi?
Ya. Spesifikasi MCP sekarang menyertakan OAuth 2.1 untuk autentikasi. Bahkan untuk penyiapan yang lebih sederhana, memerlukan token Pembawa atau kunci API pada setiap permintaan. Akses anonim harus memiliki batasan tarif yang ketat. Botoi mengizinkan akses anonim dengan 5 permintaan per menit dan 100 per hari, dengan batas lebih tinggi untuk kunci yang diautentikasi.

Mulai membangun dengan botoi

150+ endpoint API untuk pencarian, pemrosesan teks, pembuatan gambar, dan utilitas developer. Paket gratis, tanpa kartu kredit.