11---
2- // Simple list of Cloudflare MCP servers.
3- // Renders each server as an orange name (+ optional "bundled" tag) followed
4- // by a short description.
5- //
6- // Sources:
7- // • Code Mode API server — https://github.com/cloudflare/mcp (README + /.mcp.json)
8- // • Domain-specific servers — https://github.com/cloudflare/mcp-server-cloudflare
9- // • Plugin bundle — https://github.com/cloudflare/skills (/.mcp.json)
10- //
11- // When new servers are added upstream, add them here.
12-
13- interface McpServer {
14- /** Server name as it appears in JSON config (e.g. `"cloudflare-api"`). */
15- name: string ;
16- /** One-line purpose, sourced from the upstream README. */
17- description: string ;
18- /** True if this server is pre-registered by the cloudflare/skills plugin. */
19- bundled? : boolean ;
20- }
2+ import { getEntry } from " astro:content" ;
213
224interface Props {
235 /** Whether to show the "bundled" chip. Only relevant for plugin-based agents (Claude Code, Cursor). */
@@ -26,94 +8,83 @@ interface Props {
268
279const { showBundled = false } = Astro .props ;
2810
29- const SERVERS: McpServer [] = [
30- {
31- name: " cloudflare-api" ,
32- description:
33- " Entire Cloudflare API (2,500+ endpoints) in ~1,000 tokens via Code Mode." ,
34- bundled: true ,
35- },
36- {
37- name: " cloudflare-docs" ,
38- description: " Up-to-date Cloudflare documentation and reference." ,
39- bundled: true ,
40- },
41- {
42- name: " cloudflare-bindings" ,
43- description:
44- " Build Workers applications with storage, AI, and compute primitives." ,
45- bundled: true ,
46- },
47- {
48- name: " cloudflare-builds" ,
49- description: " Manage and get insights into Workers builds." ,
50- bundled: true ,
51- },
52- {
53- name: " cloudflare-observability" ,
54- description: " Debug and analyze application logs and analytics." ,
55- bundled: true ,
56- },
57- {
58- name: " cloudflare-radar" ,
59- description:
60- " Global Internet traffic insights, trends, URL scans, and utilities." ,
61- },
62- {
63- name: " cloudflare-containers" ,
64- description: " Spin up a sandbox development environment." ,
65- },
66- {
67- name: " cloudflare-browser" ,
68- description:
69- " Fetch web pages, convert them to markdown, and take screenshots." ,
70- },
71- {
72- name: " cloudflare-logpush" ,
73- description: " Quick summaries for Logpush job health." ,
74- },
75- {
76- name: " cloudflare-ai-gateway" ,
77- description:
78- " Search AI Gateway logs and inspect prompts, responses, and token usage." ,
79- },
80- {
81- name: " cloudflare-autorag" ,
82- description: " List and search documents on your AutoRAGs." ,
83- },
84- {
85- name: " cloudflare-auditlogs" ,
86- description: " Query audit logs and generate reports for review." ,
87- },
88- {
89- name: " cloudflare-dns-analytics" ,
90- description:
91- " Optimize DNS performance and debug issues based on current setup." ,
92- },
93- {
94- name: " cloudflare-dex" ,
95- description:
96- " Digital Experience Monitoring — insights on critical applications." ,
97- },
98- {
99- name: " cloudflare-casb" ,
100- description:
101- " Cloudflare One CASB — identify SaaS security misconfigurations." ,
102- },
103- {
104- name: " cloudflare-graphql" ,
105- description: " Query analytics data through Cloudflare's GraphQL API." ,
106- },
107- ];
11+ const card = await getEntry (" cloudflare-mcp-server-card" , " cloudflare-mcp" );
12+
13+ /**
14+ * Descriptions are not available in the server-card spec, so they are
15+ * maintained here and keyed by the server name derived from the remote URL.
16+ *
17+ * Name derivation: the subdomain of *.mcp.cloudflare.com becomes the suffix
18+ * after "cloudflare-", except for the root mcp.cloudflare.com which maps to
19+ * "cloudflare-api" (the Code Mode server).
20+ */
21+ const DESCRIPTIONS: Record <string , string > = {
22+ " cloudflare-api" :
23+ " Entire Cloudflare API (2,500+ endpoints) in ~1,000 tokens via Code Mode." ,
24+ " cloudflare-docs" : " Up-to-date Cloudflare documentation and reference." ,
25+ " cloudflare-bindings" :
26+ " Build Workers applications with storage, AI, and compute primitives." ,
27+ " cloudflare-builds" : " Manage and get insights into Workers builds." ,
28+ " cloudflare-observability" :
29+ " Debug and analyze application logs and analytics." ,
30+ " cloudflare-radar" :
31+ " Global Internet traffic insights, trends, URL scans, and utilities." ,
32+ " cloudflare-containers" : " Spin up a sandbox development environment." ,
33+ " cloudflare-browser" :
34+ " Fetch web pages, convert them to markdown, and take screenshots." ,
35+ " cloudflare-logs" : " Quick summaries for Logpush job health." ,
36+ " cloudflare-ai-gateway" :
37+ " Search AI Gateway logs and inspect prompts, responses, and token usage." ,
38+ " cloudflare-auditlogs" :
39+ " Query audit logs and generate reports for review." ,
40+ " cloudflare-dns-analytics" :
41+ " Optimize DNS performance and debug issues based on current setup." ,
42+ " cloudflare-dex" :
43+ " Digital Experience Monitoring — insights on critical applications." ,
44+ " cloudflare-casb" :
45+ " Cloudflare One CASB — identify SaaS security misconfigurations." ,
46+ " cloudflare-graphql" :
47+ " Query analytics data through Cloudflare's GraphQL API." ,
48+ };
49+
50+ /**
51+ * Servers included in the cloudflare/skills plugin bundle (Claude Code, Cursor).
52+ */
53+ const BUNDLED = new Set ([
54+ " cloudflare-api" ,
55+ " cloudflare-docs" ,
56+ " cloudflare-bindings" ,
57+ " cloudflare-builds" ,
58+ " cloudflare-observability" ,
59+ ]);
60+
61+ /**
62+ * Derive a stable server name from a remote URL.
63+ *
64+ * https://mcp.cloudflare.com/mcp → cloudflare-api
65+ * https://docs.mcp.cloudflare.com/mcp → cloudflare-docs
66+ * https://ai-gateway.mcp.cloudflare.com → cloudflare-ai-gateway
67+ */
68+ function nameFromUrl(url : string ): string {
69+ const { hostname } = new URL (url );
70+ // hostname: "mcp.cloudflare.com" or "{sub}.mcp.cloudflare.com"
71+ const sub = hostname .replace (/ \. mcp\. cloudflare\. com$ / , " " );
72+ return sub === " mcp" ? " cloudflare-api" : ` cloudflare-${sub } ` ;
73+ }
74+
75+ // Use only the streamable-http remotes to get one entry per logical server.
76+ const servers = (card ?.data .remotes ?? [])
77+ .filter ((r ) => r .type === " streamable-http" )
78+ .map ((r ) => nameFromUrl (r .url ));
10879---
10980
11081<ul class =" agent-simple-list" >
11182 {
112- SERVERS .map ((s ) => (
83+ servers .map ((name ) => (
11384 <li class = " agent-simple-item" >
11485 <span class = " agent-simple-name" >
115- { s . name }
116- { showBundled && s . bundled && (
86+ { name }
87+ { showBundled && BUNDLED . has ( name ) && (
11788 <span
11889 class = " agent-simple-tag"
11990 title = " Included in the cloudflare/skills plugin"
@@ -122,7 +93,9 @@ const SERVERS: McpServer[] = [
12293 </span >
12394 )}
12495 </span >
125- <span class = " agent-simple-desc" >{ s .description } </span >
96+ <span class = " agent-simple-desc" >
97+ { DESCRIPTIONS [name ] ?? " " }
98+ </span >
12699 </li >
127100 ))
128101 }
0 commit comments