Skip to content
~/sph.sh

MCP Katmanını Atla: AI Agentleri için Kapsamlı API Erişimi

Production takımlarının geniş MCP erişimini neden scoped API proxy'leriyle değiştirdiğini anlatan rehber. Atlassian (Jira/Confluence), Google Workspace ve Notion örnekleriyle FastAPI proxy, CLI wrapper ve n8n workflow'ları.

Özet

Atlassian'ın Rovo MCP Server'ı yapay zeka agentlerini Jira ve Confluence'a bağlar, ancak geniş erişim modeli production ortamlarında ciddi sorunlar yaratır: zayıf proje kapsamı, yüksek token maliyeti ve ya hep ya hiç araç erişimi. Bu yazıda üç somut alternatifi ele alıyoruz: FastAPI/Express scoped proxy, ACLI CLI wrapper ve n8n workflow. Her biri çalışan kodlarla birlikte. Temel fikir: yapay zeka agentine yalnızca ihtiyacı olan endpoint'leri göster, geri kalanını gizle.

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ı Zayıf

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 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 (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 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 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.

Gecikme Birikir

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ı, modern OAuth kullanımının ise yalnızca %8,5 olduğunu ortaya koydu. MCP ekosistemi, uyumluluk gereksinimleri için yeterli düzeyde 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. Agentin Confluence sayfası oluşturabileceğini veya Compass bileşenlerini yönetebileceğini bilmeden, yalnızca "X projesinden Jira issue'larını oku" şeklinde seçici erişim sağlayamazsın.

Yeni Felsefe: Yapay Zekaya Yalnızca İzin Verdiğini Göster

Yükselen alternatif, whitelist-first yaklaşımı: yapay zeka agentinin hangi endpoint'lere, projelere ve işlemlere erişebileceğini kesin olarak tanımla. Agent, erişim izni olmayan projeler, alanlar veya araçlar hakkında bilgi sahibi bile olmamalı.

Bu, en az yetki ilkesinin yapay zeka agent araç erişimine uygulanmasıdır. MCP'nin "her şeyi keşfet, sonra filtrele" modeli yerine, agente küratörlüğünü yaptığın bir yüzey alanı gösterirsin.

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.

Whitelist Yapılandırması

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

yaml
# proxy-config.ymljira:  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ı otomatik olarak whitelist'teki projelere kapsam olarak bağlar ve yalnızca whitelist'teki alanları döndürür.

python
# jira_proxy.pyimport yamlimport loggingfrom datetime import datetime, timezonefrom fastapi import FastAPI, HTTPException, Requestfrom atlassian import Jira
# Whitelist yapilandirmasini yuklewith 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="[email protected]",    password="SCOPED_API_TOKEN",  # salt okunur Jira erisimli kapsamli 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:    """Yalnizca whitelist'teki alanlari token-verimli formatta dondur."""    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):    """Whitelist'teki projelere kapsamli Jira issue aramasi."""    # Izin verilen projelere otomatik kapsam    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 icin enhanced_jql kullan (nextPageToken sayfalandirma)        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:

bash
pip install fastapi uvicorn atlassian-python-api pyyamluvicorn 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.

javascript
// confluence_proxy.jsconst 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("[email protected]: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 arama (whitelist'teki alanlara kapsamli)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 (alanin 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:

bash
npm install express js-yaml turndownnode 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:

bash
# .claude/tools/jira-search.shcurl -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:

json
{  "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) aracını kapsamlı 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.

Kapsamlı Shell Wrapper

bash
#!/usr/bin/env bash# jira-scoped.sh -- Proje kisitlamalari ile ACLI wrapper
ALLOWED_PROJECTS="MOBILE,BACKEND"ACLI_CMD="acli jira"
# Projenin whitelist'te olduğunu doğrulavalidate_project() {    local project="$1"    if [[ ! ",$ALLOWED_PROJECTS," == *",$project,"* ]]; then        echo "HATA: '$project' projesi izin verilen listede degil: $ALLOWED_PROJECTS" >&2        exit 1    fi}
case "$1" in    search)        # Aramayi izin verilen projelere otomatik kapsam        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 once projeyi dogrula        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'larini 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 "Kullanim: jira-scoped.sh {search|get|sprint} <arguman>"        echo "  search \"status = Open\"    -- Otomatik kapsamli JQL ile arama"        echo "  get MOBILE-123            -- Issue getir (proje whitelist'te olmali)"        echo "  sprint MOBILE             -- Aktif sprint issue'larini goster"        exit 1        ;;esac

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

bash
# Whitelist'teki projelerde acik bug'lari ara./jira-scoped.sh search "type = Bug AND status = Open"
# Belirli bir issue getir./jira-scoped.sh get MOBILE-456
# Aktif sprint'i goruntule./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 güçlü bir orta yol sunar.

Workflow Mimarisi

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 (kapsamlı 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.

Ödünleşim 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 Hala Mantıklı Olduğu Durumlar

MCP her senaryo için yanlış seçim değil. Ş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 için AGENTS.md'ye Güvenmek

Atlassian, kapsam belirleme için AGENTS.md dosyasına varsayılanlar eklemeyi öneriyor. Bu, AI modeline bir öneridir, zorlama değil. Yapay zeka agenti yine de herhangi bir projeyi sorgulayabilir. Sunucu tarafı zorlama, tek güvenilir erişim kontrolüdür.

Confluence API Sonuç Limitlerini Unutmak

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 için Kişisel API Token Kullanmak

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ıtlamalı Atlassian kapsamlı API token'ları kullan.

Jira v3 API Geçişini Görmezden Gelmek

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: Aynı Desen Her Yerde Geçerli

Bu scoped proxy yaklaşımı Atlassian'a özgü değil. 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.

python
# Google Docs scoped proxy: yalnızca whitelist'teki klasörlerALLOWED_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)",  # icerik 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 doküman başlıkları ve ID'leri görüyor, başka bir şey değil.

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 yalnızca mobil takımın issue'larını görüyor, yönetim takımının OKR'lerini değil.
  • 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 özelliklerini kullanarak dar, PII içermeyen bir görünüm oluştur. AI agent, proxy üzerinden sanitize edilmiş veri alıyor. Whitelist dışında hiçbir şeyi keşfedemiyor, göz atamıyor veya erişemiyor.

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 bilgi içeriyor mu? Evetse ifşa etme. Hayırsa scoped proxy en hızlı ve en ucuz yolu sunuyor.

Sonuç

MCP, AI-Atlassian entegrasyonu için iyi bir başlangıç noktası, son mimari değil. Kişisel kullanım ve prototipleme için iyi çalışır. Birden fazla proje, uyumluluk gereksinimleri veya token bütçesi kısıtlamaları olan production ortamları için scoped proxy, yapay zeka agentinin ne göreceği ve ne yapacağı üzerinde kesin kontrol sağlar.

"İki endpoint'li proxy" deseni (search ve get_detail) Jira ve Confluence için yapay zeka agent ihtiyaçlarının yaklaşık %90'ını karşılar. Yalnızca araç tanımlarında token kullanımını %80-95 azaltır, proje ve alan kısıtlamalarını sunucu tarafında uygular ve tam bir denetim izi sağlar.

Gereksinimlerine uyan en basit yaklaşımla başla. Bireysel bir geliştirici isen ACLI wrapper yeterli olabilir. Takım çapında deployment yapıyorsan FastAPI proxy'nin kurulumu birkaç saat sürer ve minimum bakımla çalışır. Organizasyonun görsel denetim izleri ve geliştirici olmayan kişilerin yapılandırması gerekliyse n8n bu boşluğu doldurur.

Bu desen Atlassian'ın ötesine uzanıyor. Google Workspace, Notion, Linear veya başka bir SaaS platformuyla çalışıyor olsan da PII sınır prensibi aynı kalıyor: sanitize edilmiş, PII içermeyen içeriği scoped proxy üzerinden aç ve hassas verileri yalnızca insan erişim kontrolleri arkasında tut.

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