Aggregators C# ★ 702

microsoft/mcp-gateway

MCP sunucuları için bir reverse proxy ve yönetim katmanı, Kubernetes ortamlarında ölçeklenebilir, oturum farkında yönlendirme ve lifecycle yönetimi sağlar.

Claude Desktop config.json'a ekle

{
  "mcpServers": {
    "microsoft-mcp-gateway": {
      "command": "node",
      "args": [
        "~/.mcp/mcp-gateway/index.js"
      ]
    }
  }
}

MCP Gateway

MCP Gateway, Model Context Protocol (MCP) sunucuları için bir ters proxy ve yönetim katmanıdır. Kubernetes ortamlarında MCP sunucularının ölçeklenebilir, oturum farkında yönlendirme, yetkilendirme ve yaşam döngüsü yönetimini sağlar.

İçindekiler

Genel Bakış

Bu proje aşağıdakileri sağlar:

  • MCP sunucularına oturum affinitesiyle trafik yönlendirmek için bir veri ağ geçidi.
  • MCP sunucusu yaşam döngüsünü (dağıt, güncelle, sil) yönetmek için bir kontrol düzlemi.
  • Telemetri, erişim kontrolü ve gözlemlenebilirlik dahil olmak üzere kurumsal düzeyde entegrasyon noktaları.

Temel Kavramlar

  • MCP Sunucusu: Model Context Protocol'ü uygulayan bir sunucu; tipik olarak akışlanabilir bir HTTP endpoint'idir.
  • Adaptörler: Ağ geçidinde MCP sunucularını temsil eden ve /adapters kapsamı altında yönetilen mantıksal kaynaklar. Birleşik bir AI geliştirme platformunda diğer kaynak türleriyle (örn. /agents) bir arada bulunmak için tasarlanmıştır.
  • Araçlar: MCP araç tanımlarıyla kaydedilen ve araç ağ geçidi yönlendiricisi aracılığıyla dinamik olarak yönlendirilebilen kaynaklar. Her araç, yürütme endpoint'i ve giriş şeması hakkında meta veriler içerir.
  • Araç Ağ Geçidi Yönlendiricisi: Akıllı bir yönlendirici olarak çalışan ve araç tanımlarına göre araç yürütme isteklerini uygun kayıtlı araç sunucularına yönlendiren bir MCP sunucusu. Oturum affinitesi için ağ geçidinin arkasında birden çok yönlendirici örneği çalışabilir.
  • Oturum Farkında Durumsal Yönlendirme: Belirli bir session_id ile tüm isteklerin aynı MCP sunucusu örneğine tutarlı bir şekilde yönlendirilmesini sağlar.
  • Aracılar ve Oturumlar (Ön İzleme): Kayıtlı MCP araçlarının üstünde LLM tabanlı aracıları çalıştırmak için isteğe bağlı, opt-in kaynakları. Aracılar meta verilerdir (sistem istemi + model + izin verilen araç listesi); Oturumlar Server-Sent Events üzerinden olayları akışlayan bireysel çalıştırmalardır. FoundrySettings:Endpoint yapılandırılmadığı sürece devre dışıdır.

Mimari

flowchart LR
    subgraph Clients[" "]
        direction TB
        DataClient["🔌 Agent/MCP<br>Data Client"]
        MgmtClient["⚙️ Management<br>Client"]
    end

    subgraph Gateway["MCP Gateway"]
        direction TB
        
        subgraph Auth1["Authentication & Authorization"]
            Auth["🔐 Data Plane Auth<br>Bearer Token / RBAC"]
            Auth2["🔐 Control Plane Auth<br>Bearer Token / RBAC"]
        end
        
        subgraph DataPlane["Data Plane"]
            Routing["🔀 Adapter Routing<br>/adapters/{name}/mcp"]
            ToolRouting["🔀 Tool Router Gateway<br>/mcp"]
        end

        subgraph ControlPlane["Control Plane"]
            direction LR
            AdapterMgmt["📦 Adapter Management<br>/adapters CRUD"]
            ToolMgmt["🔧 Tool Management<br>/tools CRUD"]
        end
        
        subgraph Management["Backend Services"]
            DeploymentMgmt["☸️ Deployment Manager"]
            MetadataMgmt["📋 Metadata Manager"]
        end
    end

    subgraph Cluster["Kubernetes Cluster"]
        direction TB
        
        subgraph ServerRow[" "]
            direction LR
            
            subgraph MCPServers["MCP Servers"]
                direction TB
                PodA["mcp-a-0"]
                PodA1["mcp-a-1"]
                PodB["mcp-b-0"]
            end
            
            subgraph ToolRouters["Tool Gateway Routers"]
                direction TB
                Router1["toolgateway-0"]
                Router2["toolgateway-1"]
            end
        end
        
        subgraph ToolServers["Registered Tool Servers"]
            direction LR
            Tool1["tool-1-0"]
            Tool2["tool-2-0"]
        end
    end

    Metadata[("💾 Metadata Store<br>Server & Tool Info")]

    DataClient -->|"MCP Requests"| Auth
    MgmtClient -->|"API Calls"| Auth2
    
    Auth --> Routing
    Auth --> ToolRouting
    Auth2 --> AdapterMgmt
    Auth2 --> ToolMgmt
    
    AdapterMgmt & ToolMgmt --> DeploymentMgmt
    AdapterMgmt & ToolMgmt --> MetadataMgmt
    
    Routing -.->|"Session Affinity"| MCPServers
    ToolRouting -.->|"Session Affinity"| ToolRouters
    ToolRouters ==>|"Dynamic Routing"| ToolServers
    
    DeploymentMgmt -->|"Deploy & Monitor"| Cluster
    MetadataMgmt <-->|"Read/Write"| Metadata

    style Gateway fill:#e1f5ff
    style Cluster fill:#fff4e1
    style Metadata fill:#f0f0f0

Özellikler

Kontrol Düzlemi – MCP Sunucusu Yönetimi için RESTful API'ları

MCP Sunucusu Yönetimi (Adaptörler)

  • POST /adapters — Yeni bir MCP sunucusu dağıt ve kaydet.
  • GET /adapters — Kullanıcının erişebildiği tüm MCP sunucularını listele.
  • GET /adapters/{name} — Belirli bir adaptörün meta verilerini al.
  • GET /adapters/{name}/status — Dağıtım durumunu kontrol et.
  • GET /adapters/{name}/logs — Sunucunun çalışan günlüklerine erişebil.
  • PUT /adapters/{name} — Dağıtımı güncelle.
  • DELETE /adapters/{name} — Sunucuyu kaldır.

Araç Kaydı ve Yönetimi

  • POST /tools — MCP araç tanımı meta verileriyle bir araç kaydet ve dağıt.
  • GET /tools — Kullanıcının erişebildiği tüm kayıtlı araçları listele.
  • GET /tools/{name} — Belirli bir araçın meta verilerini ve araç tanımını al.
  • GET /tools/{name}/status — Araç dağıtım durumunu kontrol et.
  • GET /tools/{name}/logs — Araç sunucusunun çalışan günlüklerine erişebil.
  • PUT /tools/{name} — Bir araç dağıtımını ve tanımını güncelle.
  • DELETE /tools/{name} — Kayıtlı bir araç kaldır.

Aracı ve Oturum Yönetimi (Ön İzleme, opt-in)

Yalnızca FoundrySettings:Endpoint yapılandırılırken kullanılabilir. Ayrıntılar için aşağıdaki Aracılar ve Oturumlar bölümüne bakınız.

  • POST /agents, GET /agents, GET|PUT|DELETE /agents/{name} — Aracı tanımları için CRUD işlemleri.
  • POST /sessions, GET /sessions, GET|DELETE /sessions/{id} — Oturumlar için CRUD işlemleri.
  • POST /sessions/run — Bir oturum başlat ve olayları akışla (SSE).
  • POST /sessions/{id}/messages — Mevcut bir oturumu yeni bir kullanıcı mesajıyla devam ettir; olayları akışla (SSE).

Veri Düzlemi – MCP Sunucuları için Ağ Geçidi Yönlendirmesi

Doğrudan MCP Sunucusu Erişimi

  • POST /adapters/{name}/mcp — Akışlanabilir bir HTTP bağlantısı kur.

Araç Ağ Geçidi Yönlendiricisi Aracılığıyla Dinamik Araç Yönlendirmesi

  • POST /mcp — Istekleri araç ağ geçidi yönlendiricisine yönlendir; bu yönlendirici araç tanımlarına göre istekleri kayıtlı araçlara dinamik olarak yönlendirir. Yönlendirici kendisi ölçeklenebilirlik için ağ geçidinin arkasında çalışan birden çok örneğe sahip bir MCP sunucusudur.

Kimlik Doğrulama ve Yetkilendirme Desteği

Ağ geçidi, MCP sunucuları ve araçları için Entra ID kimlik doğrulaması ve temel uygulama rolü yetkilendirmesi sağlar:

  • Okuma erişimi, kaynağın oluşturucusuna, yapılandırılmış requiredRoles değerleri atanmış müdürlere (örneğin mcp.engineer) ve zorunlu yönetici rolü mcp.admin sahibi herkese verilir. requiredRoles boş veya belirtilmediğinde, yalnızca oluşturucu ve mcp.admin müdürleri kaynağı okuyabilir.
  • Yazma erişimi kaynağın oluşturucusuyla veya mcp.admin rolüne sahip müdürlerle sınırlıdır.

Azure Entra ID'i yapılandırmak (mcp.admin ve diğer rol değerleri oluşturmak, bunları kullanıcılara veya hizmet müdürlerine atamak ve bu değerleri adaptör/araç payload'larında sağlamak) için adım adım yardım için bkz. docs/entra-app-roles.md.

Ek Yetenekler

  • Yerel ve Uzak MCP Sunucularının Proxy'lenmesi için destek. Bkz. örnekler ve kullanım.
  • Dağıtılmış bir oturum deposu olan durumsuz ters proxy (üretim modu).
  • StatefulSets ve headless hizmetleri kullanarak Kubernetes-native dağıtım.

Araç Kaydı ve Dinamik Yönlendirme

MCP Gateway artık MCP araçlarını yönetmek ve yürütmek için ölçeklenebilir bir mimari sağlayan araç kaydı ve dinamik yönlendirme yeteneklerini desteklemektedir.

Nasıl Çalışır

  1. Araç Kaydı: Geliştiriciler /tools API endpoint'i aracılığıyla araçları kaydeder:

    • Container görüntüsü detayları (ad ve sürüm)
    • MCP araç tanımı (ad, açıklama, giriş şeması)
    • Yürütme endpoint'i yapılandırması (port ve yol)
    • Dağıtım yapılandırması (replikalar, ortam değişkenleri)
  2. Araç Ağ Geçidi Yönlendiricisi: Akıllı bir yönlendirici olarak çalışan bir uzman MCP sunucusu:

    • Yüksek kullanılabilirlik için ağ geçidinin arkasında birden çok örnek olarak çalışır
    • Tüm kayıtlı araçlar ve tanımlarının farkındadır
    • Araç yürütme isteklerini uygun araç sunucusuna dinamik olarak yönlendirir
    • POST /mcp endpoint'i aracılığıyla erişilir (adaptör adı olmadan)
  3. Dinamik Yönlendirme: İstemciler /mcp'ye MCP istekleri gönderdiğinde:

    • Ağ geçidi istekleri oturum affinitesiyle kullanılabilir araç ağ geçidi yönlendirici örneklerine yönlendirir
    • Yönlendirici istekteki araç çağrısını analiz eder
    • Araç tanımına göre, yürütmeyi doğru kayıtlı araç sunucusuna iletir
    • Sonuçlar yönlendirici aracılığıyla istemciye döndürülür

Aracılar ve Oturumlar (Ön İzleme)

Ön İzleme / tek-replika. Bu alt sistem opt-in olup değerlendirme ve tek-pod dağıtımları için tasarlanmıştır. Yerleşik araçlar ağ geçidi pod'u içinde işlem içinde yürütülür ve oturum başına durum (çalışma dizini, disk-kota sayaçları) o pod'a yereldir. Bir şandal sandbox ve paylaşılan oturum depolaması eklemeden bu özelliği çoklu replika veya çoklu kiracılı üretim dağıtımında etkinleştirmeyin.

Ağ geçidi isteğe bağlı olarak kayıtlı MCP araçlarını ve küçük bir yerleşik araç kümesini (builtin:bash, builtin:read_file, builtin:write_file) çağıran LLM tabanlı aracıları çalıştırabilir. Aracı CRUD endpoint'leri (/agents, /sessions GET/DELETE/LIST) her zaman kullanılabilir, ancak oturum yürütmesini akışla (POST /sessions/run, POST /sessions/{id}/messages) yalnızca FoundrySettings:Endpoint yapılandırıldığında etkinleştirilir. Olmadan, bir akışlama isteği Foundry'nin yapılandırılması gerektiğini söyleyen bir error SSE olayıyla hızlı bir şekilde başarısız olur.

Etkinleştirme

appsettings.json'e (veya ortam değişkenleri aracılığıyla) bir FoundrySettings bölümü ekleyin:

{
  "FoundrySettings": {
    "Endpoint": "https://<your-resource>.cognitiveservices.azure.com/",
    "DeploymentName": "gpt-4o"
  }
}

Kimlik doğrulama DefaultAzureCredential kullanır; ağ geçidinin kimliğine (AKS'deki yönetilen kimlik veya az login aracılığıyla yerel kullanıcı) hedef kaynakta Cognitive Services User rolünü verin. Araç yayınlayan modeller boş olmayan bir tools dizisine sahip herhangi bir aracı için gereklidir — gpt-4o-sınıfı dağıtımlar önerilir.

Bir aracı tanımlama

POST /agents
Authorization: Bearer <token>
Content-Type: application/json
{
  "name": "weather-helper",
  "model": "gpt-4o",
  "system": "You answer weather questions concisely.",
  "tools": ["mcp:weather"],
  "description": "Demo agent backed by the weather MCP tool."
}

tools girişleri ön ek tarafından ad alanlandırılır:

  • mcp:<tool-name>/tools aracılığıyla kayıtlı bir araçla yönlendir.
  • agent:<agent-name> — başka bir aracıya delege et (alt aracı / Task deseni).
  • builtin:bash, builtin:read_file, builtin:write_file — işlem içi yerleşikler (aşağıda Yerleşik araçlar ve sınırlamalar'a bakınız).

Başvurulan mcp: ve agent: kaynakları aracı oluştur/güncelle zamanında doğrulanır: oluşturucu bu kaynakları doğrudan çağıramadığından kaynak mevcut değilse veya arayanın okuma erişimi yoksa çağrı başarısız olur.

Bir oturum çalıştırma

POST /sessions/run
Authorization: Bearer <token>
Content-Type: application/json
Accept: text/event-stream
{ "agentName": "weather-helper", "input": "What's the weather in Seattle?" }

Yanıt Server-Sent Events akışıdır; her olay event: <type>\ndata: <json>\n\n'dir. Olay türleri Started, ToolCallStarted, ToolCallCompleted, TokenDelta, Completed ve Failed olabilir.

Mevcut bir oturumu sonraki bir mesajla devam ettirmek için:

POST /sessions/{id}/messages
Content-Type: application/json

{ "input": "And in Portland?" }

Yerleşik araçlar ve sınırlamalar

Bir aracı builtin:bash / builtin:read_file / builtin:write_filetools içinde listelemişse, bu yerleşikler ağ geçidi pod'u içinde bir oturum başına çalışma dizini altında çalışır. Korunurlar:

  • Açıkça tehlikeli kabuk operasyonları (sudo, ağ çıkışı, bağlamalar, paket yöneticileri, vb.) için bir regex yasaklama listesi. Bu derinlemesinde savunmadır, bir sandbox değildir.
  • 30s varsayılan / 120s maksimum bash zaman aşımı; akış başına 16 KiB çıkış sınırı; 256 KiB maksimum dosya boyutu; oturum başına 4 MiB toplam yazma.
  • Yol çözümlemesi mutlak yolları ve .. geçişini reddeder.

Çoklu kiracı veya üretim kullanımı için, bunları gerçek bir oturum başına sandbox (örn. ephemeral pod, gVisor, firejail) ile değiştirin — BuiltinToolExecutor.cs'deki satır içi yorumlara bakınız.

Başlarken - Yerel Dağıtım

1. Yerel Geliştirme Ortamını Hazırla

2. Yerel Docker Kayıt Defterini Çalıştır

docker run -d -p 5000:5000 --name registry registry:2.7

3. MCP Sunucusu Görüntülerini Derle ve Yayınla

MCP sunucusu görüntülerini yerel kayıt defterinize (localhost:5000) derle ve push'la.

docker build -f sample-servers/mcp-example/Dockerfile sample-servers/mcp-example -t localhost:5000/mcp-example:1.0.0
docker push localhost:5000/mcp-example:1.0.0

4. MCP Gateway ve Araç Ağ Geçidi Yönlendiricisini Derle ve Yayınla

(İsteğe bağlı) Visual Studio ile dotnet/Microsoft.McpGateway.sln'i aç.

MCP Gateway görüntüsünü yayınla:

dotnet publish dotnet/Microsoft.McpGateway.Service/src/Microsoft.McpGateway.Service.csproj -c Release /p:PublishProfile=localhost_5000.pubxml

Araç Ağ Geçidi Yönlendiricisi görüntüsünü yayınla:

dotnet publish dotnet/Microsoft.McpGateway.Tools/src/Microsoft.McpGateway.Tools.csproj -c Release /p:PublishProfile=localhost_5000.pubxml

5. MCP Gateway'i Kubernetes Kümesine Dağıt

Dağıtım manifestlerini uygula:

kubectl apply -f deployment/k8s/local-deployment.yml

6. Port İletimini Etkinleştir

Ağ geçidi hizmet portunu ilet:

kubectl port-forward -n adapter svc/mcpgateway-service 8000:8000

7. API'yi Test Et - MCP Sunucusu Yönetimi

  • OpenAPI tanımını openapi/mcp-gateway.openapi.json'den Postman, Bruno veya Swagger Editor gibi araçlara aktarın.

  • Yeni bir adaptör kaynağı oluşturmak için bir istek gönderin:

    POST http://localhost:8000/adapters
    Content-Type: application/json
    
    {
       "name": "mcp-example",
       "imageName": "mcp-example",
       "imageVersion": "1.0.0",
       "description": "test"
    }
    

8. API'yi Test Et - MCP Sunucusu Erişimi

  • MCP sunucusunu dağıttıktan sonra bağlantıyı test etmek için VS Code gibi bir istemci kullanın. Rehbere bakınız: VS Code'da MCP sunucularını kullan.

    Not: En son MCP özelliklerine erişmek için VSCode'un güncel olduğundan emin olun.

    • Dağıtılmış mcp-example sunucusuna bağlanmak için şunu kullanın:
      • http://localhost:8000/adapters/mcp-example/mcp (Streamable HTTP)

    mcp-example sunucusuna bağlanan örnek .vscode/mcp.json

    {
      "servers": {
        "mcp-example": {
          "url": "http://localhost:8000/adapters/mcp-example/mcp",
        }
      }
    }
    
  • Diğer sunucular için:

    • http://localhost:8000/adapters/{name}/mcp (Streamable HTTP)

9. Araç Kaydını ve Dinamik Yönlendirmeyi Test Et

Bir Araç Sunucusu Görüntüsünü Derle ve Yayınla

Önce yerel kayıt defterinize bir araç sunucusu görüntüsünü derle ve push'la:

docker build -f sample-servers/tool-example/Dockerfile sample-servers/tool-example -t localhost:5000/weather-tool:1.0.0
docker push localhost:5000/weather-tool:1.0.0

Bir Araçı Kaydet

Tanımıyla birlikte bir araçı kaydetmek için bir istek gönderin:

POST http://localhost:8000/tools
Content-Type: application/json
{
  "name": "weather",
  "imageName": "weather-tool",
  "imageVersion": "1.0.0",
  "description": "Weather tool for getting current weather information",
  "toolDefinition": {
    "tool": {
      "name": "weather",
      "title": "Weather Information",
      "description": "Gets the current weather for a specified location.",
      "type": "http",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and state, e.g. San Francisco, CA"
          }
        },
        "required": ["location"]
      }
    },
    "port": 8000
  }
}

Araç Dağıtımını Doğrula

Araç dağıtım durumunu kontrol et:

GET http://localhost:8000/tools/weather/status

Araç Ağ Geçidi Yönlendiricisi Aracılığıyla Araç Yönlendirmesini Test Et

Araç ağ geçidi yönlendiricisine bağlanmak için bir MCP istemcisi (VS Code gibi) kullanın:

Araç ağ geçidi yönlendiricisine bağlanan örnek .vscode/mcp.json:

{
  "servers": {
    "tool-gateway": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

Yönlendirici, MCP isteğindeki araç adına göre araç çağrılarını uygun kayıtlı araç sunucularına otomatik olarak yönlendirecektir.

10. Ortamı Temizle

Dağıtılan tüm kaynakları kaldırmak için Kubernetes ad alanını silin:

kubectl delete namespace adapter

Başlarken - Azure'ye Tek Tıkla Dağıt

Bulut Altyapısı

Mimari Diyagramı

1. Bulut Geliştirme Ortamını Hazırla

2. Entra ID'i Kur (Azure Active Directory)

Bulutta dağıtılan hizmet Azure Entra ID kullanarak bearer token kimlik doğrulaması gerektirir. Bir uygulama kaydını yapılandırmak için aşağıdaki adımları izleyin.

Uygulama Kaydını Oluştur ve Yapılandır

  1. Uygulama Kayıtları'na gidin

  2. + Yeni kayıt seçeneğine tıklayın

    • Ad: Anlamlı bir ad seçin, örn. mcp-gateway
    • Desteklenen hesap türleri: Tek kiracı seçin
    • Kaydet'e tıklayın
  3. Uygulama kaydının Genel Bakış sayfasına gidin ve aşağıdakileri kopyalayın:

    • Uygulama (istemci) Kimliği — bu dağıtımınız için API İstemci Kimliğidir

Bir API Açığa Çıkar (Bir Kapsam Tanımla)

  1. Sol menüde API Açığa Çıkar seçeneğine gidin

  2. Uygulama Kimliği URI'sinin yanında Ekle'ye tıklayın ve varsayılan değeri olarak bırakın:

    api://<your-client-id>
    
  3. + Kapsam Ekle'ye tıklayın

    • Kapsam adı: access
    • **Yönetici

Benzer MCP sunucuları

Daha fazla: Aggregators →