Mevcut Gin web framework API'larını otomatik olarak MCP tool'ları olarak açığa çıkaran, sıfır konfigürasyonlu Go kütüphanesi.
Claude Desktop config.json'a ekle
{
"mcpServers": {
"ckanthony-gin-mcp": {
"command": "node",
"args": [
"~/.mcp/gin-mcp/index.js"
]
}
}
} Kaynak kodu al ve yerel olarak çalıştır
git clone https://github.com/ckanthony/gin-mcp.git ~/.mcp/gin-mcp
cd ~/.mcp/gin-mcp |
Herhangi bir Gin API'sı için tek satır kod ile MCP özelliklerini etkinleştirin.
Gin-MCP, mevcut Gin endpoint'lerinizi otomatik olarak Model Context Protocol (MCP) tool'ları olarak açığa çıkaran görüşlü, sıfır-konfigürasyonlu bir kütüphanedir ve bunları Cursor, Claude Desktop, Continue, Zed ve diğer MCP etkinli tool'lar gibi MCP uyumlu istemciler tarafından anında kullanılabilir hale getirir. Felseféimiz basittir: minimum kurulum, maksimum verimlilik. Gin-MCP'yi Gin uygulamanıza takın ve geri kalanını biz hallederiz. |
|
gin.Engine üzerine monte eder.RegisterSchema kullanarak belirli route'lar için şema'ları manuel olarak kaydedin ve hassas kontrol sağlayın.Authorization başlığını otomatik olarak her dahili tool-execution çağrısına ileterek, JWT korumalı API'lere MCP erişimi etkinleştirin.go get github.com/ckanthony/gin-mcp
Minimal kod ile MCP sunucunuzu dakikalar içinde çalıştırın:
package main
import (
"net/http"
server "github.com/ckanthony/gin-mcp/"
"github.com/gin-gonic/gin"
)
func main() {
// 1. Gin engine'i oluşturun
r := gin.Default()
// 2. API route'larınızı tanımlayın (Gin-MCP bunları keşfedecek)
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
r.GET("/users/:id", func(c *gin.Context) {
// Örnek handler...
userID := c.Param("id")
c.JSON(http.StatusOK, gin.H{"user_id": userID, "status": "fetched"})
})
// 3. MCP server'ını oluşturun ve yapılandırın
// MCP istemcisi için gerekli detayları sağlayın.
mcp := server.New(r, &server.Config{
Name: "My Simple API",
Description: "An example API automatically exposed via MCP.",
// BaseURL çok önemli! MCP istemcilerine istekleri nereye göndereceğini söyler.
BaseURL: "http://localhost:8080",
})
// 4. MCP server endpoint'ini monte edin
mcp.Mount("/mcp") // MCP istemcileri buraya bağlanacak
// 5. Gin sunucunuzu çalıştırın
r.Run(":8080") // Gin server'ı normal şekilde çalışır
}
Hepsi bu! MCP tool'larınız artık http://localhost:8080/mcp adresinde mevcuttur. Gin-MCP otomatik olarak /ping ve /users/:id için tool'lar oluşturdu.
BaseURLHakkında Not: Her zaman açık birBaseURLsağlayın. Bu, MCP server'ına istemci tarafından bir tool çalıştırıldığında API isteklerini nereye ileteceğini söyler. Olmadan, otomatik algılama başarısız olabilir, özellikle proxy'ler veya farklı dahili/harici URL'ler olan ortamlarda.
Gin-MCP sıfır konfigürasyonu hedeflese de, davranışını özelleştirebilirsiniz.
Gin-MCP, zengin tool açıklamaları oluşturmak için handler function yorumlarından meta veri'yi otomatik olarak çıkarır. Bu açıklamaları MCP tool'larınızı daha keşfedilebilir ve kullanışlı hale getirmek için kullanın:
// listProducts, ürünlerin sayfalanmış listesini alır
// @summary Tüm ürünleri listele
// @description Fiyat, tag'ler ve kullanılabilirliğe göre isteğe bağlı filtreleme ile ürünlerin sayfalanmış listesini döndürür
// @param page Sayfalama için sayfa numarası (varsayılan: 1)
// @param limit Sayfa başına öğe sayısı (varsayılan: 10, maks: 100)
// @param minPrice Minimum fiyat filtresi
// @param tag Ürünleri tag'e göre filtrele
// @tags public catalog
func listProducts(c *gin.Context) {
// Handler implementasyonu...
}
Desteklenen Açıklamalar:
@summary - Kısa tek satırlık açıklama, tool'un ana açıklaması olur@description - Özete eklenen ek detaylı açıklama@param <name> <text> - Oluşturulan şema'daki belirli giriş parametrelerine açıklayıcı metin ekler@tags - Tool'ları filtrelemek için kullanılan boşluk veya virgülle ayrılmış tag'ler (aşağıda "Açığa Çıkarılan Endpoint'leri Filtreleme" bölümüne bakın)@operationId <id> - Tool için özel operation ID (varsayılan METHOD_path adlandırma şemasını geçersiz kılar). Tüm route'lar arasında benzersiz olmalı; yinelemeler atlanacak (ilk bildirim kazanır) ve bir uyarı kaydedilecektir.Tüm açıklamalar isteğe bağlıdır, ancak bunları kullanmak API tool'larınızı Claude Desktop ve Cursor gibi MCP istemcilerde çok daha kullanıcı dostu hale getirir.
Özel Operation ID'ler:
Varsayılan olarak, Gin-MCP operation ID'ler METHOD_path formatını kullanarak oluşturur (örn. GET_users_id). Çok uzun yollara sahip route'lar için, daha kısa, daha yönetilebilir bir ad belirtmek üzere @operationId kullanabilirsiniz:
// getUserProfile, genişletilmiş meta veri ile bir kullanıcının profilini alır
// @summary Kullanıcı profilini al
// @operationId getUserProfile
// @param id Kullanıcı tanımlayıcı
func getUserProfile(c *gin.Context) {
// Varsayılan "GET_api_v2_users_userId_profile_extended" yerine
// bu tool "getUserProfile" olarak adlandırılacak
}
Önemli: Operation ID'ler benzersiz olmalı. İki handler aynı @operationId kullanırsa, yineleme tamamen atlanacak (ilk bildirim kazanır) ve her zaman bir uyarı kaydedilecektir. Bu, tool listesi ile operations map'i arasında tutarlılık sağlar.
RegisterSchema ile Hassas Schema KontrolüBazen otomatik schema çıkarımı yeterli değildir. RegisterSchema, belirli route'lar için query parametreleri veya request body'ler için açıkça şema tanımlamanıza izin verir. Bu kullanışlıdır:
ShouldBindQuery).package main
import (
// ... diğer import'lar
"github.com/ckanthony/gin-mcp/pkg/server"
"github.com/gin-gonic/gin"
)
// Query parametreleri için örnek struct
type ListProductsParams struct {
Page int `form:"page,default=1" json:"page,omitempty" jsonschema:"description=Page number,minimum=1"`
Limit int `form:"limit,default=10" json:"limit,omitempty" jsonschema:"description=Items per page,maximum=100"`
Tag string `form:"tag" json:"tag,omitempty" jsonschema:"description=Filter by tag"`
}
// POST request body'si için örnek struct
type CreateProductRequest struct {
Name string `json:"name" jsonschema:"required,description=Product name"`
Price float64 `json:"price" jsonschema:"required,minimum=0,description=Product price"`
}
func main() {
r := gin.Default()
// --- Route'ları Tanımlayın ---
r.GET("/products", func(c *gin.Context) { /* ... handler ... */ })
r.POST("/products", func(c *gin.Context) { /* ... handler ... */ })
r.PUT("/products/:id", func(c *gin.Context) { /* ... handler ... */ })
// --- MCP Sunucusunu Yapılandırın ---
mcp := server.New(r, &server.Config{
Name: "Product API",
Description: "API for managing products.",
BaseURL: "http://localhost:8080",
})
// --- Şema'ları Kaydedin ---
// ListProductsParams'ı GET /products için query şema'sı olarak kaydedin
mcp.RegisterSchema("GET", "/products", ListProductsParams{}, nil)
// CreateProductRequest'i POST /products için request body şema'sı olarak kaydedin
mcp.RegisterSchema("POST", "/products", nil, CreateProductRequest{})
// Gerektiğinde diğer method'lar/route'lar için şema'lar kaydedebilirsiniz
// örn. mcp.RegisterSchema("PUT", "/products/:id", nil, UpdateProductRequest{})
mcp.Mount("/mcp")
r.Run(":8080")
}
Açıklama:
mcp.RegisterSchema(method, path, querySchema, bodySchema)method: HTTP method'u (örn. "GET", "POST").path: Gin rota yolu (örn. "/products", "/products/:id").querySchema: Query parametreleri için kullanılan struct'ın bir instance'ı (veya hiç yoksa nil). Gin-MCP şema'yı oluşturmak için reflection ve jsonschema tag'lerini kullanır.bodySchema: Request body'si için kullanılan struct'ın bir instance'ı (veya hiç yoksa nil).Operation ID'ler veya tag'ler kullanarak hangi Gin endpoint'lerinin MCP tool'ları olacağını kontrol edin. Tag'ler handler fonksiyon yorumlarınızdan @tags açıklamasından gelir (yukarıda "Handler'ları Açıklama" bölümüne bakın).
Tag'ler handler function yorumlarında @tags açıklaması kullanarak belirtilir. Tag'leri boşluk, virgül veya her ikisi ile ayrılmış olarak belirtebilirsiniz:
// listUsers kullanıcı listelemeyi işler
// @summary Tüm kullanıcıları listele
// @tags public users
func listUsers(c *gin.Context) {
// Implementasyon...
}
// deleteUser kullanıcı silmeyi işler
// @summary Kullanıcı sil
// @tags admin, internal
func deleteUser(c *gin.Context) {
// Implementasyon...
}
// Sadece belirli operation'ları Operation ID'lerine göre dahil et
mcp := server.New(r, &server.Config{
// ... diğer config ...
IncludeOperations: []string{"GET_users", "POST_users"},
})
// Belirli operation'ları hariç tut
mcp := server.New(r, &server.Config{
// ... diğer config ...
ExcludeOperations: []string{"DELETE_users_id"}, // Sil tool'unu açığa çıkarma
})
// Sadece "public" veya "users" tag'leri ile etiketlenen operation'ları dahil et
// Bir tool belirtilen tag'lerden HERHANGİ BİRİNE sahipse dahil edilir
mcp := server.New(r, &server.Config{
// ... diğer config ...
IncludeTags: []string{"public", "users"},
})
// "admin" veya "internal" tag'leri ile etiketlenen operation'ları hariç tut
// Bir tool belirtilen tag'lerden HERHANGİ BİRİNE sahipse hariç tutulur
mcp := server.New(r, &server.Config{
// ... diğer config ...
ExcludeTags: []string{"admin", "internal"},
})
Filtreleme Kuralları:
IncludeOperations VEYA IncludeTags) kullanabilirsiniz.
IncludeOperations önceliklidir ve bir uyarı kaydedilir.ExcludeOperations VEYA ExcludeTags) kullanabilirsiniz.
ExcludeOperations önceliklidir ve bir uyarı kaydedilir.Örnekler:
// "public" endpoint'lerini dahil et ama "internal" tag'leri de olanları hariç tut
mcp := server.New(r, &server.Config{
IncludeTags: []string{"public"},
ExcludeTags: []string{"internal"},
})
// Belirli operation'ları dahil et ama admin endpoint'lerini hariç tut
mcp := server.New(r, &server.Config{
IncludeOperations: []string{"GET_users", "GET_products"},
ExcludeTags: []string{"admin"}, // Bu göz ardı edilecek (öncelik kuralı)
})
Yanıt şema'larının oluşturulan tool'larda açıklanma şeklinin üzerinde gelişmiş kontrol için (genellikle gerekli değildir):
mcp := server.New(r, &server.Config{
// ... diğer config ...
DescribeAllResponses: true, // Tüm olası response şema'larını (örn. 200, 404) tool açıklamalarına dahil et
DescribeFullResponseSchema: true, // Sadece bir referans yerine tam JSON schema object'ini dahil et
})
Çeşitli özelikleri gösteren tam, çalıştırılabilir örnekler için examples dizinine bakın:
examples/simple/main.go - Statik BaseURL konfigürasyonu ile tam ürün mağazası API'siexamples/simple/quicknode.go - Quicknode proxy ortamları için dinamik BaseURL konfigürasyonuexamples/simple/ragflow.go - RAGFlow dağıtım senaryoları için dinamik BaseURL konfigürasyonuHer kullanıcı/dağıtımın farklı bir endpoint'e sahip olduğu ortamlarda (Quicknode veya RAGFlow gibi), dinamik BaseURL çözünürlüğünü yapılandırabilirsiniz:
// Quicknode örneği - kullanıcıya özel endpoint'leri çözer
mcp := server.New(r, &server.Config{
Name: "Your API",
Description: "API with dynamic Quicknode endpoints",
// Statik BaseURL gerekmez!
})
resolver := server.NewQuicknodeResolver("http://localhost:8080")
mcp.SetExecuteToolFunc(func(operationID string, parameters map[string]interface{}) (interface{}, error) {
return mcp.ExecuteToolWithResolver(operationID, parameters, resolver)
})
Desteklenen Ortam Değişkenleri:
QUICKNODE_USER_ENDPOINT, USER_ENDPOINT, HOSTRAGFLOW_ENDPOINT, RAGFLOW_WORKFLOW_URL, RAGFLOW_BASE_URL + WORKFLOW_IDBu, başlangıçta statik BaseURL konfigürasyonunun ihtiyacını ortadan kaldırır, çok kiracılı proxy ortamları için mükemmeldir!
Varsayılan olarak, Gin-MCP SSE transport'unu (MCP spec 2024-11-05) kullanır, bu da kalıcı bir GET bağlantısının sonraki POST istekleri ile aynı pod'a yönlendirilmesi gerektirir. Bu, load balancer'ları oturum yakınlığı (sticky sessions) kullanmaya zorlar, bu da yatay autoscaling ile uyumsuz ve birçok yönetilen load balancer tarafından desteklenmez (örn. GCP, AWS ALB).
Streamable HTTP transport'u (MCP spec 2025-03-26) bunu çözer: her POST JSON-RPC yanıtını doğrudan HTTP body'sine döndürür. Önceki GET bağlantısı veya pod yakınlığı gerekli değildir.
mcp := server.New(r, &server.Config{
Name: "My API",
BaseURL: "https://api.example.com",
TransportType: server.TransportTypeStreamableHTTP,
})
mcp.Mount("/mcp")
MCP istemcileri tek bir POST /mcp ile bağlanırlar — önceki GET gerekmez.
MCP spec 2025-03-26 §Security uyarınca, sunucular Origin başlığını doğrulamalıdır. AllowedOrigins kullanarak tarayıcı kaynağındaki istekleri kısıtlayın:
mcp := server.New(r, &server.Config{
Name: "My API",
BaseURL: "https://api.example.com",
TransportType: server.TransportTypeStreamableHTTP,
// Sadece bu tarayıcı kaynağından isteklere izin ver.
// Kimlik doğrulama zaten yetkisiz erişimi engellediğinde atlanız (veya nil olarak bırakınız).
AllowedOrigins: []string{"https://app.example.com"},
})
Origin başlığına sahip istekler → 403 Forbidden.Origin başlığı olmayan istekler (sunucu-sunucu arası: curl, Node.js vb.) → her zaman izin verilir.AllowedOrigins → tüm kaynaklara izin verilir (Bearer token gerekli olduğunda uygun).Gin endpoint'leriniz JWT Bearer token'ları tarafından korunuyorsa, istemcinin Authorization başlığını her dahili tool-execution HTTP çağrısına iletebilirsiniz:
mcp := server.New(r, &server.Config{
Name: "My API",
BaseURL: "https://api.example.com",
ForwardAuthHeaders: true,
})
mcp.Mount("/mcp")
false (devre dışı, geriye uyumluluk için).Gin-MCP ile Gin uygulamanız çalıştığında:
http://localhost:8080/mcp):
Katkılar hoş geldinir! Lütfen issues veya Pull Requests göndermekten çekinmeyin.
AI destekli geliştirme için yapay zeka tabanlı görev yönetim sistemi. PRD ayrıştırma, görev genişletme, çoklu provider desteği (Claude, OpenAI, Gemini, Perplexity, xAI) ve optimize edilmiş context kullanımı için seçmeli tool yükleme özelliklerine sahiptir.
Kodlama ajanlarına Figma verilerine doğrudan erişim sağlayarak tasarım implementasyonunu tek adımda tamamlamalarını sağlar.
Yüksek performanslı kod zekası MCP sunucusu. Codebase'leri kalıcı bir knowledge graph'e indeksler — ortalama repo milisaniyeler içinde. 66 dil desteği, sub-ms sorgular, %99 daha az token. Tek statik binary, hiç bağımlılık yok.
gitmcp.io, herhangi bir GitHub repository veya projeye bağlanıp belgelendirme yapabilen genel amaçlı bir remote MCP server'ıdır.
Android/iOS uygulamaları ve cihazların otomasyon, geliştirme ile app scraping işlemleri için MCP Server. iPhone, Google Pixel, Samsung gibi simülatör, emülatör ve fiziksel cihazları destekler.
21st.dev'in en iyi tasarım mühendislerinden ilham alarak özel olarak hazırlanmış UI bileşenleri oluşturun.