Tüm MCP şey hakkında hiç sevmediğim bir şey, bir sunucu oluşturmanız ve kendiniz barındırmanız gerektiğidir. Bunu duyduğumdan beri, temelde sadece istediğim işlevselliği tanımlayabileceğim ve altyapının kendisi ele alınabileceği bağımsız bir çözüm arıyordum.
Cloudflare’nin aslında bunu yapmak için bir çözümü olduğu ortaya çıkıyor ve bunu Cloudflare hakkında seviyorum. Aslında bu konuda başka bir yerde konuştum, burada Cloudflare’nin temelde bir kerelik hizmetleri gerçekten iyi yaparak dünyayı nasıl yediği hakkında konuştum.
MCP sunucuları nedir?
Model Bağlam Protokolü (MCP) sunucuları, AI asistanlarını özel araçlar ve veri kaynakları ile genişletmenin bir yoludur. AI Asistanınıza veritabanlarını sorgulamak, API’leri çağırmak veya özel görevler yerine getirmek gibi belirli yeteneklere erişim sağlamanıza izin verir. Sorun şu ki, geleneksel olarak:
- Bir sunucu kurun
- Kimlik Doğrulamayı Çıkarın
- Ölçeklendirmeyi Yönetin
- Altyapı ile uğraşmak
- Çalışma süresini korumak
AI iş akışınıza basit bir özellik eklemek istediğinizde bu çok fazla ek yük.
Cloudflare’nin tek tıklamalı çözümünü girin
Cloudflare çalışanları MCP sunucuları için mükemmel bir platform sağlar çünkü:
- Altyapı yönetimi yok – Cloudflare tüm ölçeklendirme ve dağıtım işler
- Global Edge Network – MCP sunucunuz her yerde kullanıcılara yakın çalışır
- Basit dağıtım – Push kodu ve canlı
- Kullanım başına ödeme fiyatlandırması – boş sunucular için ödeme yok
Çalışan bir MCP sunucusu oluşturmak
Kullanabileceğim gerçek bir MCP sunucusu oluşturalım. Herhangi bir web sitesinin içeriğini getirebilecek ve analiz edebilen basit bir “web sitesi analizörü” oluşturacağım.
1. Adım: Projeyi kurun
mkdir cloudflare-mcp-analyzer
cd cloudflare-mcp-analyzer
npm init -y
npm install @modelcontextprotocol/sdk wrangler
1
2
3
4
2. Adım: MCP sunucusunu oluşturun
Yaratmak src/index.ts
:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{
name: "website-analyzer",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
},
);
// Define our tool
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "analyze_website",
description: "Analyze a website and extract key information",
inputSchema: {
type: "object",
properties: {
url: {
type: "string",
description: "The URL to analyze",
},
},
required: ["url"],
},
},
],
}));
// Handle tool execution
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "analyze_website") {
const { url } = request.params.arguments as { url: string };
try {
const response = await fetch(url);
const html = await response.text();
// Extract basic info
const titleMatch = html.match(/( .*?)<\/title>/i);
const title = titleMatch ? titleMatch[1] : "No title found";
const metaDescription = html.match(
/\s+name="description"\s+content="(.*?)"/i,
);
const description = metaDescription
? metaDescription[1]
: "No description found";
// Count common elements
const linkCount = (html.match(/\s/gi) || []).length;
const imageCount = (html.match(/
\s/gi) || []).length;
const headingCount = (html.match(/[1-6]\s/gi) || []).length;
return {
content: [
{
type: "text",
text: JSON.stringify(
{
url,
title,
description,
stats: {
links: linkCount,
images: imageCount,
headings: headingCount,
contentLength: html.length,
},
},
null,
2,
),
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: `Error analyzing website: ${error.message}`,
},
],
};
}
}
throw new Error(`Unknown tool: ${request.params.name}`);
});
// For Cloudflare Workers
export default {
async fetch(request: Request): Promise<Response> {
if (request.method === "OPTIONS") {
return new Response(null, {
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
},
});
}
// Handle MCP requests over HTTP
const transport = new StdioServerTransport();
await server.connect(transport);
return new Response("MCP Server Running", { status: 200 });
},
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
Adım 3: Cloudflare için yapılandırma
Yaratmak wrangler.toml
:
name = "mcp-website-analyzer"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[build]
command = "npm run build"
[build.upload]
format = "modules"
main = "./index.js"
1
2
3
4
5
6
7
8
9
10
4. Adım: CloudFlare’e konuşlandırın
# Login to Cloudflare
wrangler login
# Deploy the worker
wrangler deploy
1
2
3
4
5
İşte bu! MCP sunucunuz artık Cloudflare’in Global Network’ünde canlı.
Adım 5: AI asistanınıza bağlanın
MCP yapılandırmanıza ekleyin:
{
"mcpServers": {
"website-analyzer": {
"url": "https://mcp-website-analyzer.YOUR-SUBDOMAIN.workers.dev",
"description": "Analyzes websites and extracts key information"
}
}
}
1
2
3
4
5
6
7
8
Bu yaklaşımın güzelliği
Bununla ilgili sevdiğim şey:
- Sıfır altyapı – Yönetecek sunucu yok, endişelenecek ölçekleme yok
- Küresel performans – Cloudflare’nin Edge Network’te çalışır
- Basit Fiyatlandırma – Yalnızca kullandıklarınız için ödeyin
- Kolay Güncellemeler – Sadece yeni koda basın
Tam olarak aradığım şey bu – AI yeteneklerini altyapı yükü olmadan genişletmenin bir yolu.
Özet
- MCP sunucuları geleneksel olarak kendi altyapınızı yönetmeyi gerektirir
- Cloudflare çalışanları bu ek yükü tek tıklamayla dağıtımla ortadan kaldırır
- Cloudflare arka ucu işlerken işlevselliğe odaklanabilirsiniz
- Örnek web sitesi analizörü ne kadar basit olabileceğini gösterir
- Bu yaklaşım, MCP sunucularını sadece altyapı uzmanları değil, herkes için erişilebilir hale getirir