• 7.09.2026 13:27:35
  • Admin Admin

AI destekli yazılım geliştirme akışlarında MCP araçlarını modelden değil, sunucu tarafı yetki, şema doğrulama, idempotency ve izlenebilirlik katmanlarından kontrol edin.

AI Destekli Yazılım Geliştirmede MCP Araç Yetki Sınırları ve Denetim

AI destekli yazılım geliştirme için MCP yetki modelini kurun

Model Context Protocol (MCP) aracını çağırma kararı, yetki kararı değildir. Modelin ürettiği tool_name, kullanıcı girdisi gibi güvenilmez kabul edilmelidir. Gateway katmanında kimlik, tenant, izin verilen araçlar, maksimum etki alanı ve son kullanma zamanı içeren kısa ömürlü bir capability token üretin. Token içindeki izin kümesini istemcinin gönderdiği parametreyle birleştirmeyin; yalnızca sunucuda doğrulanmış claim listesini kullanın. Bu ayrım, modelin delete_repository gibi listede olmayan bir araç adı üretmesi halinde çağrıyı araca ulaşmadan keser.

import Ajv from "ajv";
import { verifyCapability } from "./capability.js";

const ajv = new Ajv({ allErrors: true, removeAdditional: "all" });
const schemas = {
  createIssue: {
    type: "object",
    additionalProperties: false,
    required: ["repository", "title"],
    properties: {
      repository: { type: "string", pattern: "^[a-z0-9._-]+/[a-z0-9._-]+$" },
      title: { type: "string", minLength: 1, maxLength: 180 },
      body: { type: "string", maxLength: 10000 }
    }
  }
};

export async function invokeTool(req, res) {
  const cap = await verifyCapability(req.headers.authorization);
  const { name, arguments: args } = req.body;

  if (!cap.tools.includes(name)) {
    return res.status(403).json({ error: "tool_not_granted" });
  }
  if (cap.expiresAt < Date.now() || cap.tenantId !== req.auth.tenantId) {
    return res.status(403).json({ error: "invalid_capability" });
  }

  const validate = ajv.compile(schemas[name]);
  if (!validate || !validate(args)) {
    return res.status(422).json({ error: "invalid_tool_arguments", details: validate?.errors });
  }
  return executeAsServiceIdentity(name, args, cap);
}

Ajv ile additionalProperties: false kullanmak incelikli fakat önemlidir: yalnızca beklenen alanları denetlemek yeterli değildir. Aksi halde model veya bir ara katman, downstream API'nin ileride yorumlayacağı admin=true, dry_run=false gibi bugün şemada bulunmayan parametreler ekleyebilir. Her araç için ayrı servis kimliği kullanın; Git sağlayıcı token'ı, bulut yönetici kimliği veya üretim veritabanı parolası MCP istemci sürecine verilmemelidir.

Vibe coding eğitimi sırasında dosya sistemi ve ağ etkisini izole edin

vibe coding eğitimi veya vibe coding kursu laboratuvarlarında en sık yapılan hata, ajanı geliştiricinin gerçek çalışma dizininde çalıştırmaktır. Bunun yerine her görev için git worktree ile ayrı bir çalışma alanı üretin ve aracı root olmayan kullanıcıyla, salt okunur kök dosya sistemiyle başlatın. Ajanın değiştirebildiği alan yalnızca iş worktree'si olmalıdır; ~/.ssh, Docker socket'i, bulut credential dizinleri ve ana repository mount edilmemelidir.

git fetch origin main
git worktree add --detach /srv/agent-worktrees/task-184 origin/main

# Ağ erişimi olmayan, minimum yetkili çalışma konteyneri
docker run --rm   --user 10001:10001   --read-only   --cap-drop ALL   --security-opt no-new-privileges:true   --network none   --tmpfs /tmp:rw,noexec,nosuid,size=256m   --mount type=bind,src=/srv/agent-worktrees/task-184,dst=/workspace   --workdir /workspace   registry.example.com/agent-runner:stable   sh -lc 'npm ci && npm test'

--network none paket indirmeniz gerektiğinde doğrudan kullanılamaz. Bu durumda konteynere sınırsız ağ vermek yerine, bağımlılıkları CI aşamasında önceden indirilmiş bir artifact veya iç paket aynasıyla sağlayın. Egress zorunluysa HTTP CONNECT proxy üzerinden hedef allowlist'i, DNS kaydını ve byte sınırını kaydedin. Özellikle /var/run/docker.sock mount etmek root yetkisine yakın bir kaçış yoludur; Docker API üzerinden ayrıcalıklı konteyner başlatılabildiği için bunu 'yalnızca build için' istisnası olarak bile kabul etmeyin.

Yan etkili MCP araçlarında idempotency ve transactional outbox

Bilet açma, ödeme talebi gönderme veya deployment başlatma gibi yan etkili araçlarda ağ zaman aşımı, işlemin başarısız olduğu anlamına gelmez. İstemci yanıtı almadan önce uzak API işlemi tamamlamış olabilir. Her çağrı için istemciden gelen tekrar anahtarını tenant ve araç adıyla birlikte benzersizleştirin; aynı anahtar farklı payload ile gelirse 409 döndürün. Bu kontrol, LLM'in aynı görevi yeniden denemesi veya kuyruk tüketicisinin mesajı tekrar alması halinde çift yan etkiyi engeller.

CREATE TABLE tool_intent (
  tenant_id uuid NOT NULL,
  tool_name text NOT NULL,
  idempotency_key text NOT NULL,
  payload_sha256 text NOT NULL,
  status text NOT NULL CHECK (status IN ('pending', 'sent', 'failed')),
  result jsonb,
  PRIMARY KEY (tenant_id, tool_name, idempotency_key)
);

CREATE TABLE outbox (
  id bigserial PRIMARY KEY,
  topic text NOT NULL,
  payload jsonb NOT NULL,
  created_at timestamptz NOT NULL DEFAULT now(),
  published_at timestamptz
);

BEGIN;
INSERT INTO tool_intent (tenant_id, tool_name, idempotency_key, payload_sha256, status)
VALUES ($1, $2, $3, $4, 'pending')
ON CONFLICT (tenant_id, tool_name, idempotency_key) DO NOTHING;

-- Yeni intent eklendiyse aynı transaction içinde outbox kaydı oluşturulur.
INSERT INTO outbox (topic, payload)
SELECT 'mcp.tool.execute', jsonb_build_object('tenantId', $1, 'key', $3)
WHERE EXISTS (
  SELECT 1 FROM tool_intent
  WHERE tenant_id = $1 AND tool_name = $2 AND idempotency_key = $3
    AND payload_sha256 = $4 AND status = 'pending'
);
COMMIT;

Worker, outbox satırlarını FOR UPDATE SKIP LOCKED ile almalı ve uzak sağlayıcının desteklediği idempotency header'ına aynı anahtarı iletmelidir. Uzak çağrıdan sonra intent sonucunu yazıp outbox satırını işaretleyin. Veritabanı transaction'ı açıkken HTTP çağrısı yapmak bağlantıları gereksiz kilitler; transactional outbox bu yüzden kullanılır. Bu konu, generative ai ile üretilen iş akışlarının klasik 'en az bir kez teslim' kuyruk semantiğiyle birleştiği noktada kritik hale gelir.

MCP gecikmesini OpenTelemetry ve k6 ile ölçerek azaltın

Araç çağrılarında optimizasyon yapmadan önce OpenTelemetry span'larını üç bölüme ayırın: agent.plan, mcp.gateway.authorize ve tool.provider. Her span'a araç adı, tenant tier, sonuç sınıfı ve payload byte sayısını ekleyin; prompt veya erişim token'ı gibi hassas verileri attribute'a koymayın. Tempo, Jaeger veya başka bir OTLP uyumlu backend üzerinde p50, p95 ve p99 değerlerini araç adına göre inceleyin. Sadece toplam istek süresi, gecikmenin modelde mi, gateway doğrulamasında mı, uzak sağlayıcıda mı olduğunu göstermez.

import http from 'k6/http';
import { check } from 'k6';

export const options = {
  scenarios: {
    tool_reads: {
      executor: 'constant-vus',
      vus: 40,
      duration: '5m'
    }
  },
  thresholds: {
    'http_req_duration{tool:searchCode}': ['p(95)<800'],
    'http_req_failed': ['rate<0.01']
  }
};

export default function () {
  const r = http.post(__ENV.GATEWAY + '/tools/invoke', JSON.stringify({
    name: 'searchCode', arguments: { query: 'idempotency key', limit: 20 }
  }), { headers: { 'Content-Type': 'application/json' }, tags: { tool: 'searchCode' } });
  check(r, { 'accepted': (x) => x.status === 200 });
}

Önce seri araç çağrılarıyla bir baseline alın: aynı commit, aynı test verisi, sabit 40 VU ve en az 5 dakikalık k6 koşusu kullanın. Sonra yalnızca bağımsız salt-okunur çağrılar için bounded concurrency uygulayın; örneğin en fazla 4 paralel istek. Mutasyon yapan iki çağrıyı aynı repository veya aynı müşteri kaynağı üzerinde paralelleştirmeyin. Değişiklik sonrası p95'i, hata oranını ve sağlayıcı 429 oranını aynı dashboard'da önceki koşuyla karşılaştırın. Paralellik p95'i düşürürken kuyruk taşmasıyla 429 oranını artırıyorsa başarı değildir.

Cloud native mimari laboratuvarını CI/CD ve Kubernetes üzerinde kurun

Bu konuyu yazılım eğitimi içinde kalıcı hale getirmek için laboratuvarı yerelde minikube ile başlatıp aynı manifestleri CI ortamında çalıştırın. Bu yaklaşım, teknoloji eğitimi ve yapay zeka eğitimi programlarında model davranışından bağımsız olarak ağ, kimlik ve dağıtım sınırlarını test edilebilir hale getirir. minikube start sonrasında gateway namespace'inde varsayılan deny egress politikası uygulayın; yalnızca DNS ve izinli araç backend'leri için ayrı egress kuralları ekleyin.

minikube start
kubectl create namespace agent-gateway
kubectl -n agent-gateway apply -f - <<'YAML'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-egress
spec:
  podSelector: {}
  policyTypes: [Egress]
  egress: []
YAML

terraform plan -out=platform.tfplan
terraform show -json platform.tfplan | jq '.resource_changes[] | select(.change.actions | index("delete"))'

devops eğitimi, docker eğitimi ve kubernetes eğitimi kapsamında bu laboratuvarın ci cd pipeline adımları sırasıyla image digest doğrulama, manifest şema kontrolü, ephemeral namespace testi ve Terraform plan incelemesi olabilir. terraform ile yazılan infrastructure as code değişikliklerinde plan çıktısındaki silme işlemlerini insan onayına yönlendirin; salt terraform apply çalıştırmak yeterli koruma değildir. aws eğitimi veya google cloud eğitimi rotalarında aynı prensip, bulut sağlayıcısına ait uzun ömürlü anahtar yerine iş yükü kimliği ve kısa ömürlü federasyon token'ı kullanmaktır. Bu yapı cloud native mimari ve container orchestration pratiklerini doğrudan ajan gateway'ine bağlar; llm eğitimi veya yapay zeka kursu katılımcısı da araç çağrısının üretim etkisini gözlemleyebilir.

Sık Sorulan Sorular

AI destekli yazılım geliştirme için MCP aracına doğrudan OAuth token vermek güvenli mi?

Hayır. OAuth token'ı model istemcisine vermek yerine gateway'in servis kimliğiyle saklayın. Gateway, capability token içindeki araç ve tenant sınırını doğruladıktan sonra kısa ömürlü veya dar kapsamlı sağlayıcı erişimi kullanmalıdır. Çağrı günlüğünde token yerine token kimliği ve izin sonucu tutulmalıdır.

vibe coding kursu projelerinde Docker sandbox nasıl test edilir?

CI içinde konteyneri --read-only, --cap-drop ALL ve --network none ile başlatın. Negatif test olarak /etc dosyasına yazma, dış DNS çözme ve /var/run/docker.sock erişme denemeleri ekleyin; üçünün de başarısız olması gerekir. Test worktree'sinde beklenen dosya diff'ini git diff --exit-code ile doğrulayın.

Kubernetes eğitimi için minikube üzerinde MCP gateway egress kuralı nasıl doğrulanır?

Default-deny NetworkPolicy uygulandıktan sonra gateway pod'undan kubectl exec ile izinli ve izinsiz hedeflere bağlantı testi çalıştırın. Kümeniz NetworkPolicy uygulayan bir CNI kullanmıyorsa politika nesnesi kabul edilse bile trafik engellenmeyebilir; önce CNI'nin egress enforcement desteğini doğrulayın.

DevOps eğitimi içinde Terraform ve infrastructure as code değişiklikleri AI ajanından nasıl ayrılır?

Ajan yalnızca feature branch üzerinde .tf dosyası için patch üretsin; terraform fmt -check, validate ve plan CI servis hesabıyla çalışsın. Plan JSON'unda delete veya replace aksiyonu varsa pipeline otomatik apply yerine onay beklemeli, apply ise ayrı ve denetlenmiş bir iş yükü kimliğiyle yapılmalıdır.

AI / LLM Discovery

Bu makale Opendart Akademi Güncel Teknoloji eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

Opendart Akademi llms.txt