MCP Ekosistemi ve AI Platformlarına Açık Kaynak Katkılarım
Ocak ayından itibaren Model Context Protocol (MCP) ekosistemi ve AI platformlarına yaptığım katkılar, technical solutions ve öğrenilen dersler.
Bu blog yazısında, Model Context Protocol (MCP) ekosistemi ve AI platformlarına yaptığım katkılardan bahsedeceğim.
Bu dönemde, Playwright’de Unicode sanitization sorununu çözdüm, GitHub MCP server’ında security validation ekledim ve LobeHub platformunda onboarding crash fix’i yaptım.
Model Context Protocol (MCP), AI asistanları ve araçlar arasında standart bir iletişim katmanı sağlıyor.
MCP Ekosistemi Nedir?
Model Context Protocol (MCP), AI asistanları ile harici araçlar arasında güvenli ve verimli iletişim kurmak için geliştirilmiş açık bir standart. Claude Code, Cursor, Windsurf gibi AI kod editörleri, bu protokolü kullanarak extensibility (genişletilebilirlik) sağlıyor.
Geçen yıl yaptığım DevTo-MCP ve OmniWire-MCP projelerinde, MCP’nin pratik kullanım senaryolarını deneyimlemiştim. Bu dönemde ise, bu ekosisteme doğrudan katkıda bulunmaya odaklandım.
1. Playwright: MCP Unicode Sanitization
Problemi Keşfetmek
playwright-mcp projesinde bir issue’ya rastladım. Bir başka katkıda bulunan (frankhommers), #1447 numaralı issue‘de MCP responses’larında malformed Unicode (bozuk Unicode) karakterler nedeniyle JSON serialization hataları yaşandığını bildirmişti. Sonra frankhommers, PR #1448 ile bu sorunu çözmeye çalışmıştı, ancak bu PR transport layer’da (cli.js) çözüm sunuyordu ve kapatılmıştı.
Sorun, web sayfalarındaki “lone surrogate” karakterlerinin (örneğin yarım kalmış emoji parçaları) JSON’a serialize edilirken hata oluşturmasıydı.
1
2
3
// Hata veren durum
const text = "Hello\uD800"; // Lone high surrogate
JSON.stringify({ content: text }); // Error!
Çözüm: Core Layer Sanitization
Playwright’in core katmanında (response.ts) zaten redactText() fonksiyonu ile metin işleme yapıldığını fark ettim. Buraya sanitizeUnicode() fonksiyonu ekleyerek sorunu kökten çözmeye karar verdim.
1
2
3
4
5
6
7
8
9
10
11
12
13
// packages/playwright-core/src/tools/response.ts
function sanitizeUnicode(text: string): string {
// Node 20+ için native API
if (typeof String.prototype.toWellFormed === 'function') {
return text.toWellFormed();
}
// Node 18 için fallback
return text.replace(
/[\uD800-\uDDBF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF])^[\uDC00-\uDFFF]/g,
'\uFFFD' // Replacement character
);
}
PR’ın Durumu
11 Mart’ta açtığım #39625 numaralı PR şu anda açık durumda. Core katmanında yapılan değişiklik olduğu için review süreci daha uzun sürüyor.
Playwright, modern web testing ve automation için kullanılan güçlü bir araç.
Öğrenilen Dersler
Transport vs Core Layer: Çözümün yerini doğru seçmek kritik. CLI’da geçici çözüm yapmak yerine, core’da kalıcı çözüm bulmak daha doğru.
Native API vs Polyfill:
String.prototype.toWellFormed()gibi modern JavaScript API’lerini kullanırken, Node 18 gibi older versiyonlar için fallback sunmak gerekiyor.Test Coverage: Unicode testleri yazmak, edge case’leri yakalamak için kritik. Lone high/low surrogates, valid surrogate pairs (emoji, CJK), mixed content gibi tüm durumları test ettim.
2. GitHub MCP Server: Discussions API ve Read-Only Mode
Problemi Keşfetmek
GitHub MCP server’ında iki farklı eksiklik tespit ettim. Birincisi, discussions oluşturmak için bir tool yoktu. İkincisi, --read-only flag’i HTTP mode’da çalışmıyordu - write tools (create_branch, create_pull_request, merge_pull_request) read-only mode’da bile erişilebiliyordu.
Çözüm: Create Discussion Tool ve Read-Only Fix
#1519 numaralı PR ile create_discussion tool ekledim:
1
2
3
4
5
6
7
8
9
10
11
12
# pkg/github/discussions.go
func CreateDiscussion(ctx context.Context, client *github.Client, input DiscussionInput) (*github.Discussion, error) {
// GraphQL mutation ile discussion oluşturma
mutation := `
mutation {
createDiscussion(input: {repositoryId: $repoId, categoryId: $catId, title: $title, body: $body}) {
discussion { title, url, number }
}
}
`
// ...
}
#2200 numaralı PR ile read-only flag fix’i yaptım:
1
2
3
4
5
6
7
8
9
// pkg/http/server.go
type ServerConfig struct {
ReadOnly bool `json:"read_only"`
}
// withGlobalReadonly middleware ile write tools'u block'la
if config.ReadOnly {
// create_branch, create_pull_request, merge_pull_request gizle
}
Öğrenilen Dersler
GraphQL Mutation: GitHub Discussions API’si GraphQL üzerinden çalışıyor.
Middleware Pattern: Read-only mode enforcement için middleware pattern kullanımı.
Tool Discovery: MCP server’larında tools/list endpoint’i ile hangi tool’ların available olduğunu belirtmek.
3. LobeHub: Onboarding Crash Fix
Problemleri Keşfetmek
LobeHub organizasyonunda iki farklı sorun tespit ettim:
- High Priority Regression: ModelSelect onboarding crash (#12817)
- Feature Request: 4 MCP server’ını marketplace’e ekleme talebi (#12805)
Çözüm: Crash Regression Fix
#12818 numaralı PR ile onboarding crash’ini fix ettim:
1
2
3
4
5
6
7
8
9
10
// packages/ui/model-select/components/onboarding.tsx
// Önceki: Null check eksikti
const selectedModel = models.find(m => m.id === modelId);
// Sonrası: Null check eklendi
const selectedModel = models.find(m => m.id === modelId);
if (!selectedModel) {
console.warn(`Model not found: ${modelId}`);
return <FallbackComponent />;
}
GitHub açık kaynak katkıları, kod kalitesini ve community growth’yi artırıyor.
Issue #12817: High Priority Regression
#12817 numaralı issue ile bu critical regression’ı rapor ettim. React Error #185, null check eksikliğinden kaynaklanıyordu.
Issue #12805: MCP Marketplace Submission
#12805 numaralı issue ile 4 MCP server’ını (DevTo-MCP, OmniWire-MCP, NotebookLM-MCP, Whop-MCP) LobeHub marketplace’e eklenmesini talep ettim.
Öğrenilen Dersler
- Regression Testing: Yeni features’lar var olan functionality’ı bozabilir
- Null Safety: TypeScript’te null check importance
- Error Boundaries: React error boundary pattern kullanımı
- Community Engagement: Open source projelerde feature request süreçleri
MCP Server Development Best Practices
Bu projelerde çalışırken öğrendiklerim:
MCP Server Mimarisı
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
// Standart bir MCP server yapısı
const server: Server = {
name: "my-mcp-server",
version: "1.0.0",
// Tools (kullanılabilir fonksiyonlar)
tools: [
{
name: "get_data",
description: "Fetch data from API",
inputSchema: {
type: "object",
properties: {
id: { type: "string" }
}
}
}
],
// Resources (dosya veya veri kaynakları)
resources: [
{
uri: "file:///config.json",
name: "Configuration"
}
]
};
Security Considerations
- Authenticated User Validation: MCP server’larında user authentication kontrolü
- Input Sanitization: Kullanıcı inputu sanitization
- Access Control: Private vs public resource access control
- Rate Limiting: API rate limiting implementation
LobeHub Platformu
LobeHub, AI uygulamaları için modern ve user-friendly bir platform.
LobeHub, yapay zeka uygulamaları için modern bir platform. Şubat ayında bir PR ve iki issue ile katkıda bulundum:
LobeHub Architecture
Bu projeler, modern React, TypeScript ve monorepo mimarisi kullanıyor. Katkılarım sırasında öğrendiklerim:
- Monorepo Management: pnpm workspace kullanımı
- TypeScript Project References: Büyük projelerde type management
- Module Resolution:
exportsfield kullanımı - Build Optimization: Incremental compilation
Unicode Handling in JavaScript
Playwright projesinde öğrendiklerim:
Lone Surrogates
1
2
3
4
5
6
7
8
// Lone high surrogate (0xD800-0xDBFF)
const loneHigh = "Hello\uD800"; // ❌ Invalid
// Lone low surrogate (0xDC00-0xDFFF)
const loneLow = "Hello\uDC00"; // ❌ Invalid
// Valid surrogate pair
const validPair = "Hello\uD83D\uDE00"; // ✅ Emoji (😀)
String.prototype.toWellFormed()
1
2
3
4
5
6
7
8
9
10
11
// Modern JavaScript (Node 20+)
const malformed = "Hello\uD800World";
const wellFormed = malformed.toWellFormed(); // "Hello�World"
// Fallback for older versions
function toWellFormedPolyfill(str) {
return str.replace(
/[\uD800-\uDDBF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF])^[\uDC00-\uDFFF]/g,
'\uFFFD'
);
}
Sonuç: Açık Kaynak Katkılarının Önemi
Ocak ayından itibaren 3 farklı projeye katkıda bulunarak, hem teknik bilgilerimi geliştirdim hem de açık kaynak topluluğuna değer kattım. Öğrendiklerim:
- Transport vs Core Layer: Çözümün yerini doğru seçmek
- Authenticated User Validation: MCP security’i
- Regression Testing: Yeni features’lar var olan functionality’ı bozabilir
- Unicode Handling: JavaScript’te lone surrogate problemi
- Open Source Communication: PR description’ları, review süreçleri
Açık kaynak katkılarının sadece kod yazmak değil, aynı zamanda community ile iletişim kurmak, documentation okumak ve issue’ları analiz etmek gerektiğini öğrendim.
Eğer siz de MCP ekosistemine katkıda bulunmak isterseniz, GitHub’daki modelcontextprotocol organizasyonunu incelemenizi öneriyorum.
Furkan Köykıran - Senior Software Engineer
