İçeriğe atla

MCP vs Doğrudan API Erişimi: MCP Katmanını Ne Zaman Atlamalı

Production takımları geniş MCP erişimini neden scoped API proxy'leriyle değiştirir? Atlassian, Google Workspace ve Notion için FastAPI, CLI ve n8n örnekleri.

Ayhan Sipahi Ayhan Sipahi

Atlassian’ın Rovo MCP Server’ı yapay zeka agentlerini birkaç dakikada Jira ve Confluence’a bağlıyor; karşılığında kimlik doğrulayan kullanıcının görebildiği her şeyi agente açıyor. Onlarca proje ve alanın bulunduğu bir organizasyonda bunun anlamı şu: sunucu tarafında proje kapsamı kısıtlaması yok, araç şemaları iş başlamadan context window’u tüketiyor ve Jira, Confluence ile Compass işlemleri ya hep ya hiç açılıyor.

Production için daha iyi varsayılan bir scoped API proxy: agent ile Atlassian REST API arasında duran, projeleri, işlemleri ve yanıt alanlarını whitelist’leyen ve her isteği kaydeden ince bir katman. İki hafif seçenek de kenar durumları kapatıyor: lokalde çalışan tek geliştirici için ACLI shell wrapper, kapsam kurallarını geliştirici olmayan kişilerin yönetmesi gerektiğinde n8n workflow. Üçünün de arkasındaki ilke aynı ve MCP’nin tersi: agent yalnızca izin verdiğin endpoint’leri görür, izin vermediklerinden haberi bile olmaz.

Sorun: Atlassian Ekosisteminde MCP#

Atlassian Rovo MCP Server, Şubat 2026’da GA olarak yayınlandı. Claude, Cursor, GitHub Copilot ve diğer AI istemcilerinin Jira, Confluence ve Compass ile çalışmasını sağlayan tek bir güvenli bağlantı sunuyor. Kurulumu basit: bağlan, OAuth 2.1 ile kimlik doğrula ve agent tüm ürünlerde arama, oluşturma, güncelleme ve bağlantı işlemlerine erişim kazansın.

Bu basitlik aynı zamanda sorunun kendisi. Onlarca Jira projesi ve Confluence alanı olan organizasyonlarda MCP’nin erişim modeli, çoğu takımın istediğinden fazlasını açığa çıkarır.

Erişim Kapsamı Daraltılamıyor#

Rovo MCP Server kullanıcı seviyesinde izinlere uyar. Kimlik doğrulaması yapan kullanıcı 200 Jira projesi görebiliyorsa, yapay zeka agenti de 200 projenin hepsini görür. Agenti yalnızca takımınızın sprint board’una kısıtlayacak sunucu tarafı bir mekanizma yok. Resmi repository’deki GitHub issue #79 (yeni sekmede açılır) bu özelliği açıkça talep ediyor. Atlassian’ın mevcut önerisi istemci tarafında AGENTS.md dosyasına varsayılanlar eklemek; ancak bu bir öneri, zorlama değil.

Topluluk tarafından geliştirilen mcp-atlassian (yeni sekmede açılır) (sooperset) sunucusu JIRA_PROJECTS_FILTER ve CONFLUENCE_SPACES_FILTER ortam değişkenlerini destekliyor. Ancak resmi Rovo MCP Server’ın eşdeğer bir özelliği yok.

Token Maliyeti Yüksek#

MCP araç tanımları, herhangi bir gerçek iş yapılmadan önce context window token’larını tüketir. Anthropic’in kendi mühendislik blogu, araç tanımlarının tek başına 58 araç için 55K token (yeni sekmede açılır) tükettiği kurulumları belgeliyor. Atlassian MCP sunucusu, yalnızca Jira issue aramasına ihtiyacınız olsa bile Jira, Confluence ve Compass araçlarını aynı anda açığa çıkarır.

Cloudflare’in araştırması, kendi API’leri için standart bir MCP sunucusunun Code Mode yaklaşımlarıyla karşılaştırıldığında 1.17 milyon token yerine 1.000 token (yeni sekmede açılır) tüketeceğini gösteriyor. Atlassian’ın araç seti daha küçük olsa da prensip aynı: kullanılmayan araçları açığa çıkarmak token israfıdır.

Gecikmeler Üst Üste Biniyor#

MCP, modelin araçları nasıl kullanacağına karar verdiği bir akıl yürütme katmanı ile JSON-RPC serileştirme yükü ekler. Basit “aktif sprint issue’larını getir” sorguları için, doğrudan REST API çağrısına kıyasla ölçülebilir bir gecikme ekler. CI/CD pipeline’larında veya otomasyon iş akışlarında bu yük, düzinelerce çağrıda birikir.

Güvenlik ve Denetim Boşlukları#

5.200’den fazla MCP sunucu uygulamasını analiz eden araştırma, %53’ünün güvensiz uzun ömürlü statik sırlar kullandığını (yeni sekmede açılır), modern OAuth kullanımının ise yalnızca %8,5 olduğunu ortaya koydu. MCP ekosistemi çoğu zaman, uyumluluk gereksinimleri için yeterli ayrıntıda standart denetim kaydı sunmuyor.

Ya Hep Ya Hiç Araç Erişimi#

Atlassian MCP sunucusuna bağlandığında yapay zeka agenti tüm mevcut araçları keşfeder: Jira arama, Jira oluşturma, Jira güncelleme, Confluence arama, Confluence oluşturma, Confluence güncelleme ve Compass işlemleri. Yalnızca “X projesinden Jira issue’larını oku” erişimini açmanın bir yolu yok; agent aynı anda Confluence sayfası oluşturabileceğini ve Compass bileşenlerini yönetebileceğini de öğreniyor.

Whitelist Öncelikli Erişim Modeli#

Whitelist öncelikli kurgu, MCP’nin “her şeyi keşfet, sonra filtrele” modelini tersine çevirir. Agentin hangi endpoint’lere, projelere ve işlemlere ulaşabileceğini sen tanımlarsın; listenin dışındakileri keşfedemez. Bu, en az yetki ilkesinin araç erişimine uygulanmış hali.

Hangi uygulamanın uygun olduğu, agentin kaç projeye dokunduğuna ve uyumluluk kurallarının geçerli olup olmadığına bağlı:

1-2 proje, kişisel kullanım

2-5 proje, takım kullanımı

5+ proje veya organizasyon çapında

Yalnızca geliştirici, lokal

Teknik olmayan takım

Hayır

Evet

AI Agent Atlassian Verisine İhtiyaç Duyuyor

Agent kaç projeye erişim sağlamalı?

MCP Kullan (Rovo veya mcp-atlassian)

Uyumluluk gereksinimleri var mı?

Scoped Proxy Kullan

ACLI + CLI Wrapper Kullan

n8n Workflow Kullan

mcp-atlassian + PROJECTS_FILTER Kullan

Yöntem A: FastAPI/Express Scoped Proxy (Önerilen)#

Bu en esnek yaklaşım. Yapay zeka agentin ile Atlassian REST API arasına oturan ince bir API katmanı yazarsın. Proxy, proje/alan kısıtlamalarını uygular, yanıt alanlarını filtreler ve her isteği kaydeder.

AI Agent (Claude, Cursor)

Scoped Proxy (FastAPI / Express)

Whitelist Config (YAML)

Jira REST API /rest/api/3/

Confluence REST API /rest/api/content/

Whitelist Yapılandırması#

Proxy’nin tam olarak neye izin verdiğini tanımlayan bir YAML yapılandırma dosyasıyla başla:

# proxy-config.yml
jira:
  base_url: "https://your-org.atlassian.net"
  allowed_projects: ["MOBILE", "BACKEND"]
  allowed_operations: ["search", "get_issue"]
  denied_operations: ["create", "update", "delete", "transition"]
  max_results: 25
  fields_whitelist:
    - "summary"
    - "description"
    - "status"
    - "priority"
    - "assignee"
    - "labels"

confluence:
  base_url: "https://your-org.atlassian.net/wiki"
  allowed_spaces: ["ARCH", "RUNBOOK"]
  allowed_operations: ["search", "get_page"]
  denied_operations: ["create", "update", "delete"]
  max_results: 10
  strip_attachments: true
  output_format: "markdown"

FastAPI ile Jira Proxy (Python)#

Bu proxy iki endpoint sunar: search ve get_issue. Tüm sorguların kapsamını otomatik olarak whitelist’teki projelerle sınırlar ve yalnızca whitelist’teki alanları döndürür.

# jira_proxy.py
import yaml
import logging
from datetime import datetime, timezone
from fastapi import FastAPI, HTTPException, Request
from atlassian import Jira

# Whitelist yapılandırmasını yükle
with open("proxy-config.yml") as f:
    config = yaml.safe_load(f)

app = FastAPI(title="Jira Scoped Proxy")
logger = logging.getLogger("jira_proxy")

jira = Jira(
    url=config["jira"]["base_url"],
    username="svc-ai-agent@your-org.com",
    password="SCOPED_API_TOKEN",  # Jira'ya salt okunur erişimi olan, kapsamı daraltılmış API token
    cloud=True,
)

ALLOWED_PROJECTS = config["jira"]["allowed_projects"]
ALLOWED_FIELDS = config["jira"]["fields_whitelist"]
MAX_RESULTS = config["jira"]["max_results"]


def validate_project(project_key: str) -> bool:
    return project_key.upper() in ALLOWED_PROJECTS


def filter_issue(issue: dict) -> dict:
    """Yalnızca whitelist'teki alanları token-verimli formatta döndür."""
    fields = issue.get("fields", {})
    return {
        "key": issue["key"],
        "summary": fields.get("summary", ""),
        "status": fields.get("status", {}).get("name", ""),
        "priority": fields.get("priority", {}).get("name", ""),
        "assignee": (fields.get("assignee") or {}).get("displayName", "Unassigned"),
        "labels": fields.get("labels", []),
        "description": fields.get("description", ""),
    }


@app.get("/api/jira/search")
async def search_issues(request: Request, query: str, project: str | None = None):
    """Kapsamı whitelist'teki projelerle sınırlı Jira issue araması."""
    # İzin verilen projelere otomatik kapsam daraltma
    project_filter = ", ".join(f'"{p}"' for p in ALLOWED_PROJECTS)
    scoped_jql = f"project IN ({project_filter}) AND ({query})"

    if project:
        if not validate_project(project):
            raise HTTPException(403, f"Project {project} is not in the whitelist")
        scoped_jql = f'project = "{project}" AND ({query})'

    logger.info(
        "search | ip=%s | jql=%s | time=%s",
        request.client.host,
        scoped_jql,
        datetime.now(timezone.utc).isoformat(),
    )

    try:
        # Jira Cloud v3 için enhanced_jql kullan (nextPageToken sayfalandırma)
        results = jira.enhanced_jql(scoped_jql, limit=MAX_RESULTS)
        issues = [filter_issue(issue) for issue in results.get("issues", [])]
        return {"count": len(issues), "issues": issues}
    except Exception as e:
        raise HTTPException(502, f"Jira API error: {str(e)}")


@app.get("/api/jira/issue/{issue_key}")
async def get_issue(request: Request, issue_key: str):
    """Projesi whitelist'te olan tek bir Jira issue'yu getir."""
    project_key = issue_key.split("-")[0]
    if not validate_project(project_key):
        raise HTTPException(403, f"Project {project_key} is not in the whitelist")

    logger.info(
        "get_issue | ip=%s | key=%s | time=%s",
        request.client.host,
        issue_key,
        datetime.now(timezone.utc).isoformat(),
    )

    try:
        issue = jira.issue(issue_key)
        return filter_issue(issue)
    except Exception as e:
        raise HTTPException(502, f"Jira API error: {str(e)}")

Çalıştırmak için:

pip install fastapi uvicorn atlassian-python-api pyyaml
uvicorn jira_proxy:app --host 0.0.0.0 --port 8100

Express.js ile Confluence Proxy#

JavaScript/TypeScript tercih eden takımlar için Confluence’a yönelik Express.js versiyonu. CQL sorgularına otomatik olarak alan kısıtlamaları enjekte eder ve içeriği markdown olarak döndürür.

// confluence_proxy.js
const express = require("express");
const yaml = require("js-yaml");
const fs = require("fs");
const TurndownService = require("turndown");

const config = yaml.load(fs.readFileSync("proxy-config.yml", "utf8"));
const app = express();
const turndown = new TurndownService();

const ATLASSIAN_BASE = config.confluence.base_url;
const ALLOWED_SPACES = config.confluence.allowed_spaces;
const MAX_RESULTS = config.confluence.max_results;
const API_TOKEN = Buffer.from("svc-ai-agent@your-org.com:SCOPED_API_TOKEN").toString("base64");

async function atlassianFetch(path) {
  const response = await fetch(`${ATLASSIAN_BASE}${path}`, {
    headers: {
      Authorization: `Basic ${API_TOKEN}`,
      Accept: "application/json",
    },
  });
  if (!response.ok) throw new Error(`Atlassian API: ${response.status}`);
  return response.json();
}

function scopeCql(userCql) {
  const spaceFilter = ALLOWED_SPACES.map((s) => `"${s}"`).join(", ");
  return `space IN (${spaceFilter}) AND (${userCql})`;
}

// Confluence araması (yalnızca whitelist'teki alanlarda)
app.get("/api/confluence/search", async (req, res) => {
  const { query } = req.query;
  if (!query) return res.status(400).json({ error: "query parameter required" });

  const scopedCql = scopeCql(query);
  console.log(`[${new Date().toISOString()}] search | cql=${scopedCql}`);

  try {
    const data = await atlassianFetch(
      `/rest/api/content/search?cql=${encodeURIComponent(scopedCql)}&limit=${MAX_RESULTS}&expand=body.storage`
    );

    const pages = data.results.map((page) => ({
      id: page.id,
      title: page.title,
      space: page.space?.key,
      content: turndown.turndown(page.body?.storage?.value || ""),
    }));

    res.json({ count: pages.length, pages });
  } catch (err) {
    res.status(502).json({ error: err.message });
  }
});

// Tek sayfa getir (alanın whitelist'te olduğunu doğrula)
app.get("/api/confluence/page/:pageId", async (req, res) => {
  try {
    const page = await atlassianFetch(
      `/rest/api/content/${req.params.pageId}?expand=body.storage,space`
    );

    if (!ALLOWED_SPACES.includes(page.space?.key)) {
      return res.status(403).json({ error: "Space not in whitelist" });
    }

    res.json({
      id: page.id,
      title: page.title,
      space: page.space?.key,
      content: turndown.turndown(page.body?.storage?.value || ""),
    });
  } catch (err) {
    res.status(502).json({ error: err.message });
  }
});

app.listen(8200, () => console.log("Confluence proxy on :8200"));

Çalıştırmak için:

npm install express js-yaml turndown
node confluence_proxy.js

Proxy’yi AI Agentlere Bağlama#

Proxy standart bir REST API’dir. Yaygın AI agent platformlarına nasıl bağlanacağı:

Claude Code: bash aracı olarak kaydet:

# .claude/tools/jira-search.sh
curl -s "http://localhost:8100/api/jira/search?query=$1" | jq '.issues[] | "\(.key): \(.summary) [\(.status)]"'

Cursor: .cursor/mcp.json dosyasına custom API endpoint olarak ekle:

{
  "mcpServers": {
    "jira-proxy": {
      "url": "http://localhost:8100",
      "type": "openapi"
    }
  }
}

HTTP araç desteği olan herhangi bir agent: REST endpoint’lerini doğrudan çağır. Proxy OpenAPI uyumludur.

Yöntem B: ACLI + Custom CLI Wrapper#

Lokal geliştirici iş akışları için Appfire CLI (ACLI) (yeni sekmede açılır) aracını kapsamı daraltılmış bir shell script ile sarmalamak en basit yaklaşımdır. ACLI, Jira, Confluence, Bitbucket ve Bamboo işlemlerini destekleyen olgun bir Java tabanlı CLI aracıdır.

Kapsamı Daraltılmış Shell Wrapper#

#!/usr/bin/env bash
# jira-scoped.sh -- Proje kısıtlamaları ile ACLI wrapper

ALLOWED_PROJECTS="MOBILE,BACKEND"
ACLI_CMD="acli jira"

# Projenin whitelist'te olduğunu doğrula
validate_project() {
    local project="$1"
    if [[ ! ",$ALLOWED_PROJECTS," == *",$project,"* ]]; then
        echo "HATA: '$project' projesi izin verilen listede değil: $ALLOWED_PROJECTS" >&2
        exit 1
    fi
}

case "$1" in
    search)
        # Aramanın kapsamını izin verilen projelerle sınırla
        jql="project IN ($ALLOWED_PROJECTS) AND ($2)"
        echo "[$(date -u +%FT%TZ)] search | jql=$jql" >> /tmp/jira-audit.log
        $ACLI_CMD --action getIssueList --jql "$jql" --outputFormat 2
        ;;
    get)
        # Issue'yu getirmeden önce projeyi doğrula
        project=$(echo "$2" | cut -d'-' -f1)
        validate_project "$project"
        echo "[$(date -u +%FT%TZ)] get | key=$2" >> /tmp/jira-audit.log
        $ACLI_CMD --action getIssue --issue "$2"
        ;;
    sprint)
        # Belirli bir projenin aktif sprint issue'larını getir
        validate_project "$2"
        jql="project = $2 AND sprint IN openSprints()"
        echo "[$(date -u +%FT%TZ)] sprint | project=$2" >> /tmp/jira-audit.log
        $ACLI_CMD --action getIssueList --jql "$jql" --outputFormat 2
        ;;
    *)
        echo "Kullanım: jira-scoped.sh {search|get|sprint} <argüman>"
        echo "  search \"status = Open\"  -- Kapsamı otomatik daraltılan JQL ile arama"
        echo "  get MOBILE-123  -- Issue getir (proje whitelist'te olmalı)"
        echo "  sprint MOBILE  -- Aktif sprint issue'larını göster"
        exit 1
        ;;
esac

Bunu Claude Code veya Cursor’da araç olarak kaydet ve doğrudan kullan:

# Whitelist'teki projelerde açık bug'ları ara
./jira-scoped.sh search "type = Bug AND status = Open"

# Belirli bir issue getir
./jira-scoped.sh get MOBILE-456

# Aktif sprint'i görüntüle
./jira-scoped.sh sprint BACKEND

ACLI vs. Proxy: Ne Zaman Hangisi#

KriterACLI + CLI WrapperScoped Proxy (FastAPI/Express)
En uygunBireysel geliştirici iş akışlarıTakım çapında deployment
Kurulum süresi~1 saat~2-4 saat
Çoklu agent desteğiSınırlı (yalnızca lokal)Farklı yapılandırmalarla birden fazla agent
Denetim kaydıTemel (dosya tabanlı)Tam (yapılandırılmış, merkezi)
CI/CD entegrasyonuMümkün ama zahmetliTemiz REST API
BakımMinimal~1 saat/ay

Yöntem C: n8n / Low-Code Alternatifi#

Görsel iş akışlarını tercih eden veya geliştiriciler dışındaki kişilerin Atlassian-AI entegrasyonunu yönetmesi gereken takımlar için n8n (yeni sekmede açılır) güçlü bir orta yol sunar.

Workflow Mimarisi#

İzin Verildi

Reddedildi

AI Agent

n8n Webhook Trigger

Proje/Alan Doğrulama

HTTP Request Jira/Confluence API

403 Yasak Döndür

Yanıtı AI için Formatla

Uygulama Adımları#

  1. Webhook trigger: Yapay zeka agentinden arama sorguları alan bir n8n webhook oluştur.

  2. Doğrulama node’u: Talep edilen projenin/alanın önceden yapılandırılmış whitelist’te olup olmadığını kontrol eden bir koşullu node ekle. Whitelist dışı kaynaklar için 403 yanıtı döndür.

  3. HTTP Request node’u: Atlassian API kimlik bilgileriyle (kapsamı daraltılmış API token ile Basic Auth) bir HTTP Request node’u yapılandır. Jira için JQL, Confluence için CQL kullan ve alan/proje kısıtlamasını otomatik olarak enjekte et.

  4. Format node’u: API yanıtını token-verimli bir formata dönüştür. Gereksiz alanları çıkar, HTML’i markdown’a dönüştür ve binary ekleri kaldır.

  5. Yanıt: Formatlanmış yanıtı webhook yanıtı olarak yapay zeka agentine geri gönder.

n8n Yaklaşımının Avantajları#

  • Görsel denetim izi: Her çalıştırma, n8n arayüzünde tam istek/yanıt verileriyle kaydedilir.
  • Kod deployment’ı gerekmez: Kapsam kurallarını web arayüzünden herhangi bir yeniden deployment olmadan değiştir.
  • Birleştirilebilir: Atlassian çağrılarını Slack bildirimleri, e-posta uyarıları veya veritabanı yazma işlemleriyle tek bir workflow’da zincirle.
  • Self-hosted seçeneği: Veri egemenliği için n8n’i kendi altyapında çalıştır.

Trade-off olarak n8n ek bir platform bağımlılığı ekler ve yüksek throughput kullanım durumlarında doğrudan proxy’den daha yavaş olabilir.

Karşılaştırma: MCP vs. Scoped Proxy#

KriterAtlassian Rovo MCPScoped Proxy (FastAPI/Express)
Erişim KapsamıKullanıcı seviyesi (tüm görünür projeler)Whitelist (yalnızca belirli projeler/alanlar)
Token MaliyetiYüksek (araç şemaları için ~5K-15K token)Düşük (2-3 endpoint için ~500-1K token)
GecikmeDaha yüksek (MCP akıl yürütme + JSON-RPC)Daha düşük (doğrudan REST çağrıları)
Kurulum KarmaşıklığıDüşük (bağlan ve kullan)Orta (proxy yaz ve deploy et)
Yazma İşlemleriVarsayılan olarak tam CRUDYapılandırılabilir (salt okunur önerilir)
Denetim KaydıSınırlıTam (istek başına özel kayıt)
Araç ErişimiTüm Jira/Confluence/Compass araçlarıYalnızca whitelist’teki endpoint’ler
BakımAtlassian tarafından yönetilirKendi başına bakım
Çoklu Agent DesteğiTüm agentler için aynı yapılandırmaAgent başına yapılandırma mümkün
UyumlulukAtlassian’ın kaydına bağlıDenetim izi üzerinde tam kontrol

Token Maliyeti Pratikte#

Scoped proxy’ye geçişten elde edilen tahmini token tasarrufu:

  • MCP tam araç şeması: Oturum başlatma başına ~5.000-15.000 token (Jira + Confluence + Compass araçları)
  • 2-3 endpoint’li scoped proxy: Oturum başına ~500-1.000 token
  • Azalma: Yalnızca araç tanımlarında %80-95 daha az token harcanır

Ölçekte (günde yüzlerce agent oturumu), bu fark LLM API maliyetleri için önemlidir. Proxy’deki yanıt alanı filtreleme ile birleştirildiğinde toplam token tasarrufu daha da yüksek olabilir.

MCP’nin Hâlâ Mantıklı Olduğu Durumlar#

MCP birkaç senaryoda yerini hak ediyor. Şu durumlarda kullan:

  • Prototipleme veya AI agent entegrasyonunu değerlendirme
  • Tek projeli kişisel geliştirici verimliliği
  • Az projeli ve uyumluluk gereksinimleri olmayan küçük takımlar
  • Hızlı kurulum öncelik olduğunda (bir saatten kısa sürede çalışan entegrasyon)

Şu durumlarda scoped proxy kullan:

  • Çok projeli Jira/Confluence instance’larına production deployment
  • Uyumluluk gereksinimleri mevcut (SOC2, ISO 27001, GDPR veri minimizasyonu)
  • Yüksek hacimde token bütçesi önemli
  • Birden fazla agentin farklı erişim seviyelerine ihtiyacı var
  • Hassas projeler (İK, hukuk, finans) aynı Atlassian instance’ını paylaşıyor

Yaygın Tuzaklar#

Güvenlik Sınırı Olarak AGENTS.md#

Atlassian, kapsam belirleme için AGENTS.md dosyasına varsayılanlar eklemeyi öneriyor. Model bu dosyayı görmezden gelebilir ve agent, kimlik bilgisi olan herhangi bir projeyi yine sorgulayabilir. Sunucu tarafında zorlanan kural, tek güvenilir erişim kontrolüdür.

Confluence API Sonuç Limitleri#

Confluence REST API’nin sabit kodlanmış arka uç limitleri var: body içeriği genişletildiğinde 50 sonuç, diğer genişletmelerde 200, genişletme olmadan 1.000. Proxy’nin sayfalandırmayı şeffaf şekilde yönetmesi gerekir. CQL sayfalandırmasını yapay zeka agentine açığa çıkarma.

Filtrelenmemiş API Yanıtlarından Token İsrafı#

Jira issue JSON’u düzinelerce alan içerir: değişiklik günlüğü, iş günlüğü, özel alanlar, render edilmiş HTML. Tam JSON’u yapay zeka agentine göndermek, ilgisiz verilere token harcar. Proxy’de yanıt alanlarını her zaman whitelist’le ve yalnızca AI’ın ihtiyacını döndür.

Takım Çapında Proxy’de Kişisel API Token Riski#

Kişisel token’lar kullanıcının tam izinlerini devralır ve kullanıcı organizasyondan ayrıldığında süresi dolar. OAuth 2.0 servis hesabı kimlik bilgileri veya ürün başına kısıtlanabilen Atlassian scoped API token’ları (yeni sekmede açılır) kullan.

Jira v3 API Geçişi#

Eski /rest/api/3/search endpoint’i Jira Cloud’dan kaldırıldı. Yeni endpoint, startAt yerine nextPageToken sayfalandırmalı /rest/api/3/search/jql. atlassian-python-api kütüphanesini kullanıyorsan enhanced_jql metodunu kullan. Geleneksel jql metodu Cloud için kullanımdan kaldırıldı.

İlk Günden Aşırı Mühendislik#

Başlangıçtan itibaren rate limiting, önbellekleme ve yük dengeleme içeren tam bir API gateway’e ihtiyacın yok. YAML whitelist’li 100 satırlık bir FastAPI uygulaması çoğu takım için production-ready. Kapsam kurallarını uygulayan en basit proxy’yi yayınla, sonra iterasyon yap.

Atlassian Ötesinde: Google Workspace, Notion, Linear#

Scoped proxy deseni Atlassian’ın çok ötesine taşınıyor. Aynı erişim kontrolü ve verimlilik sorunları her MCP ekosisteminde karşına çıkıyor: Google Workspace, Notion, Linear, GitHub ve diğerleri.

Google Workspace: Docs, Sheets, Drive#

Google’ın MCP entegrasyonları aynı “ya hep ya hiç” sorununu ortaya çıkarıyor. Bir AI agent Google Drive’a MCP üzerinden bağlandığında, workspace’teki her belgeye potansiyel olarak göz atabiliyor. İK politikaları, maaş tabloları ve hukuki sözleşmeleri mühendislik dokümanlarıyla aynı yerde saklayan takımlar için bu ciddi bir veri ifşa riski.

Google Workspace API’leri, MCP sunucularının nadiren kullandığı granüler OAuth scope’ları sunuyor:

ScopeErişim Seviyesi
drive.fileYalnızca uygulamanın oluşturduğu veya kullanıcının açtığı dosyalar
drive.readonlyTüm dosyalara salt okunur erişim
documents.readonlyGoogle Docs’a salt okunur erişim
spreadsheets.readonlyGoogle Sheets’e salt okunur erişim

Google Workspace için scoped proxy aynı deseni izliyor: belirli klasör ID’lerini veya doküman ID’lerini whitelist’le, en dar OAuth scope’unu kullan (drive yerine drive.file) ve yalnızca sanitize edilmiş içerik döndür. Mühendislik wikileri, runbook’lar ve herkese açık dokümanlar (PII içermeyen içerik) için proxy üzerinden doğrudan API erişimi daha hızlı, daha ucuz ve AI agentinin ihtiyacı olmayan hiçbir şeyi ifşa etmiyor.

# Google Docs scoped proxy: yalnızca whitelist'teki klasörler
ALLOWED_FOLDER_IDS = ["1a2b3c_engineering_wiki", "4d5e6f_runbooks"]

@app.get("/docs/search")
async def search_docs(q: str):
    results = []
    for folder_id in ALLOWED_FOLDER_IDS:
        query = f"'{folder_id}' in parents and fullText contains '{q}'"
        response = drive_service.files().list(
            q=query,
            fields="files(id, name, modifiedTime)",  # içerik yok, sahip PII'si yok
            supportsAllDrives=True
        ).execute()
        results.extend(response.get("files", []))
    return {"results": results}

fields parametresi kritik: yalnızca id, name ve modifiedTime isteyerek proxy asla dosya sahibi e-postalarını, paylaşım izinlerini veya PII içerebilecek diğer metadata’yı döndürmüyor. AI agent yalnızca doküman başlıklarını ve ID’lerini alıyor.

Notion, Linear ve Diğer SaaS Araçları#

Aynı prensip, MCP sunucusu olan her SaaS aracına uygulanıyor:

  • Notion: Notion API’si veritabanı ID’si ve sayfa ID’sine göre filtrelemeyi destekliyor. Scoped proxy yalnızca belirli veritabanlarını (sprint board’ları, teknik dokümanlar) açığa çıkarırken İK veritabanlarını ve özel sayfaları görünmez tutuyor.
  • Linear: Takım ID’si ve proje ID’sine göre filtrele. Mühendislik AI agenti mobil takımın issue’larıyla çalışırken yönetim takımının OKR’leri görüş alanının dışında kalıyor.
  • GitHub: Belirli repository’ler ve salt okunur işlemlerle kısıtla. Code review’a yardımcı olan bir AI agentinin özel fork’lara veya organizasyon genelindeki ayarlara erişmesi gerekmiyor.

Ortak nokta platformun kendi API filtreleme özellikleri: onlarla dar ve PII içermeyen bir görünüm kur, agent bu görünüme yalnızca proxy üzerinden ulaşsın.

PII Sınır Prensibi#

Scoped proxy kullanma kararı, PII sınırını çizdiğinde netleşiyor:

  • PII yok, herkese açık içerik (mühendislik dokümanları, runbook’lar, herkese açık wikiler): Salt okunur proxy üzerinden açığa çıkarmak güvenli. İçerik zaten organizasyon içinde geniş çapta paylaşılıyor.
  • PII veya hassas veri içeriyor (İK kayıtları, maaş verileri, hukuki sözleşmeler, müşteri verileri): Herhangi bir MCP veya proxy üzerinden asla ifşa etme. Bunlar yalnızca insan erişim kontrolleri arkasında kalmalı.
  • Karışık içerik (müşteri adları içeren proje board’ları, destek talepleri): Proxy’de alan seviyesinde filtreleme kullan. Talebin durumunu ve önceliğini döndür, müşteri adlarını ve iletişim bilgilerini çıkar.

Bu sınır, kullanılan araçtan bağımsız olarak geçerli. Atlassian, Google Workspace veya Notion kullanıyor olsan da soru aynı: bu veri, bir AI agentinin asla görmemesi gereken bir şey içeriyor mu? İçeriyorsa yalnızca insan erişimine açık kalsın; içermiyorsa ona ulaşmanın en hızlı ve en ucuz yolu scoped proxy.

Sonuç#

Scoped proxy, birkaç projeden fazlası devredeyse ya da uyumluluk kuralları ve token bütçesi gereksinimin parçası hâline geldiyse varsayılan olarak geçerli. Bu çizginin altında MCP gerçekten daha hızlı: bir veya iki projeyle çalışan tek geliştirici Rovo’yu birkaç dakikada bağlar, proxy bile fazla geliyorsa lokal işleri ACLI wrapper kapatır. Kapsam kurallarını yöneten kişiler kodu deploy eden kişiler değilse varsayılanı n8n’e çevir.

“İki endpoint’li proxy” deseni (search ve get_detail) Jira ve Confluence için agent ihtiyaçlarının çoğunu karşılar, araç tanımı token’larını %80-95 azaltır ve proje ile alan kısıtlamalarını sunucu tarafında uygular. Buradan başla; rate limiting, önbellekleme veya agent başına yapılandırmayı ancak trafik gerektirdiğinde ekle.

MCP’nin kendisi hakkında daha derin bilgi için MCP Standardı: Production-Ready AI Entegrasyonları ve Custom MCP Server’lar Oluşturma yazılarına bakabilirsin. RBAC ve çoklu agent orkestrasyonu ile ileri düzey desenler için MCP İleri Düzey Desenler yazısına göz at. Genel AI agent güvenliği için AI Agent Güvenliği: Guardrails ve Savunma Desenleri yazısını incele.

Kaynaklar#

İlgili yazılar