
Thu Sep 10 2026

Merhaba! 👋
Ben de bir süre önce Model Context Protocol (MCP) ile tanıştım ve “Bu tam da aradığım şey!” diye düşündüm. Hadi birlikte neden bu kadar heyecan verici olduğunu keşfedelim.
| Eski Yöntem | MCP ile Yeni Yöntem |
|---|---|
| Her araç için özel client kodu yazılır | Tek bir MCP client tüm sunucularla çalışır |
| Versiyon değişikliklerinde tüm kod güncellenir | Sunucu tarafında güncelleme, client değişmez |
| Test ve bakım ziyadesiyle zahmetli | Merkezi sözleşme sayesinde testler basitleşir |
Bir süre önce bir RAG tabanlı asistan geliştiriyordum. Her yeni veri kaynağı (Notion, GitHub, PostgreSQL…) için ayrı bir wrapper yazdım. Kod tabanı büyüdükçe “Bu tekrar edilebilir mi?” diye sordum kendime. MCP’yi keşfettiğimde, tek bir sunucu yazdım ve tüm istemciler (CLI, web UI, Slack botu) sorunsuz bağlandı. Zaman kazancı ve bakım kolaylığı inanılmazdı ✨.
Hazırsanız ilk adımı atıp, MCP’nin nasıl çalıştığını derinlemesine inceleyelim! 🚀
Her yeni araç geldiğinde “yine mi wrapper yazayım?” diye düşünüyordum 🤦♂️.
Gerçekte şu acıların hepsini yaşıyordum:
Örneklerim:
PaymentAdapterEmailWrapperStorageClientHepsi aynı tekrar eden kod: auth header, timeout, loglama…
Ben de önce her proje için ayrı bir wrapper yazıyordum, sonra MCP keşfettim 🎯.
MCP (Modüler Bağdaştırıcı Katmanı) sayesinde:
Ne kazandım?
Kısacası: Özel entegrasyonlar yazmak “hızlıca çözüm” gibi görünse de, uzun vadede size maliyetli bir teknolojik borç bırakır.
Hadi bir sonraki bölümde MCP’nin nasıl kurulduğunu ve ilk adapter’ımızı nasıl yazdığımı görelim 🚀.
Hazırsan MCP’nin üç ana taşıyıcısını hızlıca tanıyalım 🎯. Düşün ki bir restoran var:
Aşağıda bu üç bileşenin sorumlulukları ve birbiriyle nasıl konuştuğu özetlenmiş 👇
| Araç Türü | Ne İşe Yarar? | Sunucu‑İstemci Arasındaki Rol |
|---|---|---|
| Veritabanı (PostgreSQL, Mongo…) | Kalıcı veri saklar | Sunucu veri okur/yazar |
| Cache (Redis, Memcached) | Hızlı okuma/yazma | Sunucu gecikmeyi azaltır |
| Message Queue (Kafka, RabbitMQ) | Asenkron işlemler | Sunucu arka plan işlerini tetikler |
| Service Mesh / API Gateway | Trafik yönetimi, güvenlik | İstemci‑Sunucu iletişimini yönlendirir |
| Observability (Prometheus, Grafana, ELK) | İzleme, loglama | Her iki taraf da sağlık kontrolü yapar |
Nasıl çalışıyor?
Bu basit diyagram ve tablo, MCP mimarisinin kim ne yapar ve nasıl konuşur sorularına cevap veriyor ✅. İlerleyen bölümlerde her bir bileşeni kod örnekleri ile somutlaştıracağız 🚀.
Hazırsan başlayalım! Geliştirme ortamını tek seferde kurmak için ihtiyacımız olan temel araçlar şunlar:
Aşağıdaki adımları sırasıyla takip ederseniz, terminalinizde ben de kuruyorum diyerek hızlıca hazır hale gelirsiniz 🚀
macOS (Homebrew)
brew install node # Node.js + npm
# veya Python için:
# brew install python
Ubuntu / Debian
sudo apt update
sudo apt install -y nodejs npm
# Python için:
# sudo apt install -y python3 python3-pip
Windows – nodejs.org adresinden LTS sürümünü indirip çalıştırın.
İpucu:
nvm(Node Version Manager) kullanarak birden fazla Node sürümünü kolayca yönetebilirsiniz.
# npm zaten Node ile gelir
# yarn için:
npm install -g yarn
# pnpm için (hızlı ve disk dostu):
npm install -g pnpm
Hangi birini seçmelisiniz?
macOS – Docker Desktop indirin: https://docker.com/products/docker-desktop
Linux – Tek komutla:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER # kullanıcıyı docker grubuna ekle
newgrp docker # değişiklik hemen etkili olsun
Windows – Docker Desktop Installer’ı çalıştırın, WSL2 backend’ini etkinleştirin.
# macOS
brew install git
# Ubuntu/Debian
sudo apt install -y git
# Windows – https://git-scm.com/download/win
Hepsi yolunda mı? Tek bir komutla versiyonları kontrol edelim 👇
node --version && npm --version && docker --version && git --version
Beklenen çıktı örneği
v20.12.0
10.5.0
Docker version 25.0.3, build 4debf41
git version 2.44.0
Eğer her satırda bir sürüm numarası görüyorsanız tamamsınız! 🎉
Artık ortamınız hazır! 🎯 Bir sonraki bölümde proje iskeletini oluşturup ilk konteynerimizi ayağa kaldıracağız. Hadi devam edelim! 🚀
Hazırsan, sıfırdan bir MCP sunucusu iskeleti kuralım. Önce klasör yapısı, sonra konfig dosyaları, en sonda da src/server.ts — hepsini kopyala-yapıştır yapıp npm run dev dersen çalışır hale gelsin. Hadi başlayalım 🚀
Önce terminalde şu komutları sırayla çalıştır:
mkdir mcp-serverim
cd mcp-serverim
mkdir src
Şu an şöyle bir yapımız var:
mcp-serverim/
├── src/
│ └── (server.ts buraya gelecek)
├── package.json
├── tsconfig.json
└── .env (opsiyonel, secret'lar için)
Önce package.json dosyasını kök dizine oluştur. İçine şunu yapıştır:
{
"name": "mcp-serverim",
"version": "1.0.0",
"description": "Benim ilk MCP sunucum 🎉",
"main": "dist/server.js",
"type": "module",
"scripts": {
"build": "tsc",
"dev": "tsx watch src/server.ts",
"start": "node dist/server.js"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^3.23.0"
},
"devDependencies": {
"typescript": "^5.5.0",
"tsx": "^4.16.0",
"@types/node": "^22.0.0"
}
}
Ne var burada?
@modelcontextprotocol/sdk → MCP'nin resmi TypeScript SDK'sızod → Şema doğrulama için (tool parametrelerinde kullanacağız)tsx → TypeScript'i derlemeden doğrudan çalıştırır (hot-reload ile)type: "module" → ESM modül sistemi (import/export kullanacağız)İpucu:
npm installçalıştırmayı unutma 😉
Kök dizine tsconfig.json oluştur, şunu yapıştır:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022"],
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Önemli noktalar:
module: "NodeNext" + moduleResolution: "NodeNext" → ESM + Node.js package.json exports desteğioutDir: "./dist" → Derlenen JS dosyalar buraya giderstrict: true → Tip güvenliği maksimal olsunŞimdi asıl kısım. src/server.ts dosyasını oluştur ve şunu yapıştır:
// src/server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
/**
* MCP sunucumuzu oluşturan ana fonksiyon.
* Burada tool'ları, resource'ları, prompt'ları kaydedeceğiz.
*/
async function createServer(): Promise<McpServer> {
const server = new McpServer({
name: "benim-mcp-serverim",
version: "1.0.0",
description: "Örnek MCP sunucusu — tool ve resource demo",
});
// 🎯 Örnek bir tool: basit bir hesap makinesi
server.registerTool(
"topla",
{
title: "İki sayıyı topla",
description: "Verilen iki sayıyı toplar ve sonucu döner",
inputSchema: {
a: z.number().describe("İlk sayı"),
b: z.number().describe("İkinci sayı"),
},
},
async ({ a, b }) => {
const sonuc = a + b;
return {
content: [{ type: "text", text: `Sonuç: ${sonuc}` }],
};
},
);
// 🎯 Örnek bir resource: statik bir merhaba mesajı
server.registerResource(
"hosgeldin",
"merhaba://mesaj",
{
title: "Hoş geldin mesajı",
description: "Basit bir karşılama metni",
mimeType: "text/plain",
},
async () => ({
contents: [
{
uri: "merhaba://mesaj",
text: "Merhaba! Bu benim ilk MCP sunucum 🎉",
},
],
}),
);
return server;
}
/**
* Sunucuyu başlatır ve stdio transport üzerinden dinlemeye alır.
* Bu fonksiyon `npm run dev` ile çalıştırıldığında devreye girer.
*/
async function main() {
try {
const server = await createServer();
const transport = new StdioServerTransport();
await server.connect(transport);
console.error(
"✅ MCP sunucusu başarıyla başlatıldı ve bağlantı bekleniyor...",
);
} catch (error) {
console.error("❌ Sunucu başlatılamadı:", error);
process.exit(1);
}
}
// Program entry point
main();
| Parça | Görev |
|---|---|
McpServer |
Sunucunun çekirdeği — tool/resource/prompt kaydı yapar |
registerTool("topla", ...) |
topla adında bir tool kaydeder, Zod şeması ile parametre doğrulaması yapar |
registerResource("hosgeldin", ...) |
merhaba://mesaj URI'li bir resource tanımlar |
StdioServerTransport |
MCP iletişimini stdin/stdout üzerinden yapar (CLI client'lar için standart) |
server.connect(transport) |
Bağlantıyı kurar ve mesaj döngüsünü başlatır |
Terminalde:
npm install # bağımlılıkları yükle
npm run dev # geliştirme modunda başlat (tsx watch ile)
Eğer terminalde ✅ MCP sunucusu başarıyla başlatıldı... mesajını görüyorsan — tamam, iskelet hazır 🎉
Bir sonraki bölümde bu sunucuya gerçek tool'lar ekleyeceğiz, Zod şemalarını detaylandıracağız ve hata yönetimine bakacağız. Hazır mısın? 😊
Hazırsan bu üç katmanı tek tek inceleyelim. Her biri neden gerekiyor, nasıl ekleyeceğiz ve pratik ipuçları nelerdir diye konuşacağız 🚀
Sorun: Herkes endpoint’lere serbest erişmemeli. Hem kullanıcıyı tanımak hem de yetki kontrolü merkezi bir yerde olmalı.
Çözüm:
Pratik ipuçları
app.use(authMiddleware) şeklinde çağır.exp claim’ini kontrol et, yoksa 401 Unauthorized dön.Kod örneği – src/middleware/auth.ts
// src/middleware/auth.ts
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
const JWT_SECRET = process.env.JWT_SECRET!; // .env’den alıyoruz
export interface AuthRequest extends Request {
user?: { id: string; roles: string[] };
}
export const authMiddleware = (
req: AuthRequest,
res: Response,
next: NextFunction,
) => {
const authHeader = req.headers.authorization;
if (!authHeader?.startsWith("Bearer ")) {
return res.status(401).json({ message: "Token eksik" });
}
const token = authHeader.split(" ")[1];
try {
const payload = jwt.verify(token, JWT_SECRET) as {
id: string;
roles: string[];
};
req.user = payload; // downstream controller’lar erişebilir
next();
} catch (err) {
return res
.status(401)
.json({ message: "Geçersiz veya süresi dolmuş token" });
}
};
Ne oluyor burada?
Authorization: Bearer <token> header’ını okur.jwt.verify ile imza ve süresi doğrulanır.req.user’a payload atar, sonraki middleware/controller bu bilgiyi kullanır. ✅Neden?
Nasıl?
windowMs ve max değerlerini ortamına göre ayarla (ör. 15 dk / 100 istek).İpucu:
import rateLimit from "express-rate-limit";
export const apiLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 dakika
max: 100, // IP başına max 100 istek
message: { error: "Çok fazla istek, lütfen biraz bekleyin" },
standardHeaders: true,
legacyHeaders: false,
});
app.use('/api/', apiLimiter); ile tüm API rotalarını koru. 🎯
Fikir: Her “tool” (ör. e‑posta gönderici, PDF üretici, ödeme sağlayıcı) bağımsız bir modül olsun. Uygulama çekirdeği sadece interface’i bilir, implementasyonu runtime’da yükler.
Avantajları
npm install ile kullan.Yapı örneği
src/
└─ tools/
├─ index.ts // Plugin kayıt merkezi
├─ email/
│ ├─ EmailTool.ts // Interface
│ └─ SendGridEmailTool.ts
└─ pdf/
├─ PdfTool.ts
└─ PuppeteerPdfTool.ts
src/tools/index.ts – Kayıt motoru
// src/tools/index.ts
import { EmailTool } from "./email/EmailTool";
import { SendGridEmailTool } from "./email/SendGridEmailTool";
import { PdfTool } from "./pdf/PdfTool";
import { PuppeteerPdfTool } from "./pdf/PuppeteerPdfTool";
type ToolMap = {
email: EmailTool;
pdf: PdfTool;
};
const registry: Partial<ToolMap> = {};
export function registerTool<K extends keyof ToolMap>(
name: K,
impl: ToolMap[K],
) {
registry[name] = impl;
}
export function getTool<K extends keyof ToolMap>(name: K): ToolMap[K] {
const tool = registry[name];
if (!tool) throw new Error(`Tool "${name}" kayıtlı değil`);
return tool;
}
// Uygulama başlangıcında (ör. main.ts)
registerTool("email", new SendGridEmailTool());
registerTool("pdf", new PuppeteerPdfTool());
Kullanım
const email = getTool("email");
await email.send({
to: "user@example.com",
subject: "Hoş geldin!",
body: "...",
});
Pratik ipucu:
@types paketi olarak paylaş, implementasyonları ayrı repo’larda tut.registerTool fonksiyonunu testlerde mock ile override et → registerTool('email', mockEmailTool). 🛠| Katman | Neden? | Nasıl? | Anahtar İpucu |
|---|---|---|---|
| Auth (JWT/API Key) | Kimliği doğrula, yetki merkezi | Middleware (authMiddleware) |
Secret .env’de, req.user tipini genişlet |
| Rate Limiting | Aşırı yükü engelle, maliyet kontrolü | express-rate-limit (IP / user) |
windowMs / max ortama göre ayarla |
| Plugin Pattern | Araçları soyutla, yeniden kullan | Interface + runtime registry | registerTool / getTool ile gevşek bağlılık |
Bu üç katmanı bir arada kullandığında güvenli, ölçeklenebilir ve bakımı kolay bir mikroservis / API iskeleti elde edersin. 🚀
Hadi şimdi src/middleware/auth.ts dosyasını projene ekle, rate limiter’ı app.ts’e bağla ve ilk plugin’i (email) kaydet. Kodunuz hem güvenli hem de modüler olacak! 🎉
Bir projeyi açık kaynak olarak paylaştığımızda, topluluk büyürken bize yardımcı olacak bir altyapı hazırlamamız gerekiyor. Aşağıdaki maddeler, katkıda bulunanların hayatını kolaylaştıran ve projenin sürdürülebilirliğini sağlayan en iyi uygulamalardır 🎯
git clone, bağımlılık kurulumu, ilk çalıştırma komutları.CONTRIBUTING.md ve CODE_OF_CONDUCT.md’ye link.LICENSE dosyasına link.İpucu: README’yi bir “landing page” gibi düşünün; ziyaretçi 30 saniyede projenin ne olduğunu anlasın.
MAJOR.MINOR.PATCH.YYYY‑AA‑GG.standard-version veya changesets araçlarını deneyin 🔁| Değişiklik türü | Sürüm etkisi |
|---|---|
| Breaking change | MAJOR artır, MINOR & PATCH sıfırla |
| Yeni özellik (geriye uyumlu) | MINOR artır, PATCH sıfırla |
| Hata düzeltmesi | PATCH artır |
Bu kural sayesinde tüketciler ^1.2.3 gibi aralıklarla güvenle bağımlılık alabilir ✅
main, develop, feature/*, bugfix/*.CHANGELOG güncellenmeli.LICENSE dosyası bulundurun (MIT, Apache‑2.0, GPL‑3.0 vb.)..github/ISSUE_TEMPLATE/ ve .github/PULL_REQUEST_TEMPLATE/ klasörlerine şu dosyaları koyun:
bug_report.md
## 🐛 Hata Açıklaması
<!-- Ne oldu? -->
## 🔁 Yeniden Üretim Adımları
1. ...
2. ...
## ✅ Beklenen Davranış
<!-- Ne olması gerekiyordu? -->
## 📷 Ekran Görüntüleri / Loglar
feature_request.md
## ✨ Özellik Önerisi
<!-- Ne eklenmeli? -->
## 🎯 Kullanım Senaryosu
<!-- Hangi sorunu çözer? -->
## 📦 Alternatifler / Çözümler
pull_request_template.md
## 📋 Açıklama
<!-- Bu PR ne yapıyor? -->
## 🔗 İlgili Issue
Closes #<issue-no>
## ✅ Kontrol Listesi
- [ ] Testler eklendi / güncellendi
- [ ] Dokümantasyon güncellendi
- [ ] CHANGELOG girişi yapıldı
Bu şablonlar sayesinde katkıda bulunanlar ne isteniyor bilerek hızlıca hareket edebilir ❗️
README.md İskeleti (MCP Sunucusu Kullanım Kılavuzu)# 🚀 MCP Sunucusu – Hızlı Başlangıç ve Kullanım Kılavuzu
[](https://github.com/your-org/mcp-server/actions)
[](LICENSE)
[](CHANGELOG.md)
> **MCP Sunucusu**, mikro hizmet iletişimini basitleştiren hafif bir mesaj kuyruğu sunucusudur.
## 📦 Kurulum
```bash
git clone https://github.com/your-org/mcp-server.git
cd mcp-server
make deps # Bağımlılıkları çek
make build # Binary üret
```
| Değişken | Açıklama | Varsayılan |
|---|---|---|
MCP_PORT |
Dinlenecek port | 8080 |
MCP_LOG_LEVEL |
Log seviyesi (debug, info, warn, error) |
info |
MCP_STORAGE |
Depolama backend (memory, redis, postgres) |
memory |
Örnek .env:
MCP_PORT=9090
MCP_LOG_LEVEL=debug
MCP_STORAGE=redis
# Development
make run
# Production (Docker)
docker compose up -d
/publish – Mesaj gönder/subscribe?topic=... – Mesaj dinle (WebSocket)/health – Sağlık kontrolüDetaylı şema için docs/api.md dosyasına bakın.
Katkı rehberimiz için CONTRIBUTING.md dosyasını inceleyin.
Davranış kuralları: CODE_OF_CONDUCT.md
Bu proje MIT Lisansı altında yayınlanmıştır. Detaylar için LICENSE dosyasına bakın.
Tüm sürüm notları CHANGELOG.md dosyasında.
Keyifli kodlamalar! 🎉
—Siz ve MCP Topluluğu
Bu iskeleti projenizin köküne `README.md` olarak koyduğunuzda, yeni gelenler **anında** ne yapmaları gerektiğini anlar ve katkı süreci sorunsuz başlar ✅
---
## 🛠 Test ve Doğrulama: Birim Testler, Entegrasyon Testleri, CI/CD
Hadi şimdi **"test yazmak sıkıcı"** diyenlerin fikrini değiştirelim 😄. Güvenilir bir MCP sunucusu istiyorsan, testler **opsiyonel değil, şart**. İyi haber: basit başlayıp, yol aldııkça genişletiyorsun. Benim sürecim şöyle:
### 1️⃣ Birim Testler — Jest ile Hızlı ve İzole
**Sorun:** Tek bir fonksiyonun (örneğin `validateToolInput`) doğru davrandığından emin olmak.
**Çözüm:** Jest. Sıfır kurulum, anlık geri bildirim.
```ts
// src/__tests__/validateToolInput.test.ts
import { validateToolInput } from '../utils/validateToolInput';
describe('validateToolInput', () => {
test('geçerli JSON şeması için true döner', () => {
const input = { name: 'test', version: '1.0.0' };
const schema = { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] };
expect(validateToolInput(input, schema)).toBe(true);
});
test('eksik required alan için false döner', () => {
const input = { version: '1.0.0' };
const schema = { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] };
expect(validateToolInput(input, schema)).toBe(false);
});
});
Ne oldu?
describe/test yapısıyla okunabilir spec yazdık.npm test -- --watch) sayesinde kod değiştirdikçe testler anında çalışıyor ⚡.Sorun: Express app'inin /mcp endpoint'i gerçek isteklerle nasıl davranıyor?
Çözüm: Supertest. Sunucuyu başlatmadan app objesine istek atıyoruz.
// src/__tests__/mcp.integration.test.ts
import request from "supertest";
import { createApp } from "../app";
const app = createApp();
describe("MCP /tools endpoint", () => {
test("GET /tools → 200 ve dizi döner", async () => {
const res = await request(app).get("/mcp/tools");
expect(res.status).toBe(200);
expect(Array.isArray(res.body)).toBe(true);
});
test("POST /tools/call geçersiz tool → 404", async () => {
const res = await request(app)
.post("/mcp/tools/call")
.send({ name: "olmayan-tool", arguments: {} });
expect(res.status).toBe(404);
});
});
Püf noktası: createApp() test için ayrı bir instance döndürmeli — production config (DB, logger) karışmasın 🛡.
Hedef: main branch'ine her push'ta lint → test → build → docker push zinciri otomatik çalışsın.
Dosya: .github/workflows/ci.yml
name: CI / CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
lint-test-build:
runs-on: ubuntu-latest
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: 🟢 Setup Node
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
- name: 📦 Install deps
run: npm ci
- name: 🔍 Lint (ESLint + Prettier)
run: npm run lint
- name: ✅ Run tests (Jest + Supertest)
run: npm test -- --ci --coverage
- name: 🏗 Build TypeScript
run: npm run build
docker-push:
needs: lint-test-build
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
steps:
- name: 📥 Checkout code
uses: actions/checkout@v4
- name: 🐳 Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: 🔐 Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: 🏷 Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha
type=ref,event=branch
type=raw,value=latest,enable={{is_default_branch}}
- name: 🚀 Build & Push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Bu pipeline ne sağlıyor?
| Adım | Neden Önemli? |
|---|---|
| Lint | Kod stili tutarlı, contibutor'ler şaşırmıyor 🎨 |
| Test | Regression yakalıyor, coverage raporu çıkıyor 📊 |
| Build | TS derlenebiliyor mu? Tip hataları erken çıkıyor 🔎 |
| Docker Push | ghcr.io/username/mcp-server:sha-abc123 hazır → deploy bir kubectl apply mesafesinde 🚢 |
 koy, takip et 🏷.Artık "test yazmak sıkıcı" demezsin; "test yazmadığımda geceleri rahat uyuyamam" dersin 😴➡️😴✅.
Sonraki bölümde bu Docker image'ı Kubernetes'e deploy edip, Helm chart ile canlıya almayı anlatacağız. Hazır mısın? 🚀
Harika bir yolculuktan geçtik, değil mi? 🎉
MCP sayesinde araçlarımızı standartlaştırdık, güvenli bir mimari kurguladık ve hepsini topluluk odaklı bir şekilde dağıtmayı öğrendik. Artık elinizde production-ready, ölçeklenebilir ve başkalarının da kullanabileceği bir altyapı var.
Şimdi sıra sizde. 🚀
Kendi MCP sunucunuzu yazın, kırın, düzeltin, paylaşın. Hata yapmaktan çekinmeyin — en iyi öğrenme yolu o zaten. Toplulukla etkileşime girin, issue açın, PR gönderin. Her katkı, ekosistemin biraz daha güçlenmesi demek.
publish komutu bir bazen tek tık, ama erişiminiz binlerce geliştiriciye oluyor.Hadi, klavyeyi başınıza koyun ve bir şeyler üretmeye başlayın. 🛠
Toplulukta görüşmek üzere! 👋
Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.
All rights reserved