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.
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ı:
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:
# 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#
| Kriter | ACLI + CLI Wrapper | Scoped Proxy (FastAPI/Express) |
|---|---|---|
| En uygun | Bireysel geliştirici iş akışları | Takım çapında deployment |
| Kurulum süresi | ~1 saat | ~2-4 saat |
| Çoklu agent desteği | Sı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 entegrasyonu | Mümkün ama zahmetli | Temiz REST API |
| Bakım | Minimal | ~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#
Uygulama Adımları#
-
Webhook trigger: Yapay zeka agentinden arama sorguları alan bir n8n webhook oluştur.
-
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.
-
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.
-
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.
-
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#
| Kriter | Atlassian Rovo MCP | Scoped Proxy (FastAPI/Express) |
|---|---|---|
| Erişim Kapsamı | Kullanıcı seviyesi (tüm görünür projeler) | Whitelist (yalnızca belirli projeler/alanlar) |
| Token Maliyeti | Yüksek (araç şemaları için ~5K-15K token) | Düşük (2-3 endpoint için ~500-1K token) |
| Gecikme | Daha 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 İşlemleri | Varsayılan olarak tam CRUD | Yapılandırılabilir (salt okunur önerilir) |
| Denetim Kaydı | Sınırlı | Tam (istek başına özel kayıt) |
| Araç Erişimi | Tüm Jira/Confluence/Compass araçları | Yalnızca whitelist’teki endpoint’ler |
| Bakım | Atlassian tarafından yönetilir | Kendi başına bakım |
| Çoklu Agent Desteği | Tüm agentler için aynı yapılandırma | Agent başına yapılandırma mümkün |
| Uyumluluk | Atlassian’ı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:
| Scope | Erişim Seviyesi |
|---|---|
drive.file | Yalnızca uygulamanın oluşturduğu veya kullanıcının açtığı dosyalar |
drive.readonly | Tüm dosyalara salt okunur erişim |
documents.readonly | Google Docs’a salt okunur erişim |
spreadsheets.readonly | Google 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#
- Getting Started with the Atlassian Rovo MCP Server (yeni sekmede açılır) - Resmi kurulum rehberi, bilinen kısıtlamalar ve güvenlik mimarisi
- Atlassian Rovo MCP Server is Now GA (yeni sekmede açılır) - GA duyurusu, özellik genel bakışı ve desteklenen AI istemcileri
- GitHub Issue #79: Restrict MCP to Certain Spaces and Projects (yeni sekmede açılır) - Erişim kapsam boşluğunu belgeleyen topluluk özellik talebi
- sooperset/mcp-atlassian (yeni sekmede açılır) - JIRA_PROJECTS_FILTER ve CONFLUENCE_SPACES_FILTER destekli topluluk MCP sunucusu
- Advanced Tool Use (Anthropic Engineering) (yeni sekmede açılır) - 58 araçta 55K token bulgusu dahil MCP token yükü analizi
- Code Mode: Give Agents an Entire API in 1,000 Tokens (Cloudflare) (yeni sekmede açılır) - MCP token’larını 1.17M’den 1K’ya düşüren Cloudflare yaklaşımı
- State of MCP Server Security 2025 (Astrix) (yeni sekmede açılır) - 5.200+ MCP sunucusunu güvenlik uygulamaları açısından analiz eden araştırma
- Jira Cloud REST API - Issue Search (yeni sekmede açılır) - nextPageToken sayfalandırmalı v3 arama endpoint dokümantasyonu
- Advanced Searching Using CQL (Confluence) (yeni sekmede açılır) - Alanla sınırlandırılmış aramalar için CQL söz dizimi referansı
- Scoped API Tokens in Confluence Cloud (yeni sekmede açılır) - Kısıtlı ürün ve kapsam erişimli API token’ları
- atlassian-python-api Documentation (yeni sekmede açılır) - Atlassian REST API’leri için Python kütüphanesi
- Securing the AI Agent Revolution (CoSAI) (yeni sekmede açılır) - Coalition for Secure AI’ın MCP güvenlik desenleri rehberi
- MCP vs APIs: When to Use Which (Tinybird) (yeni sekmede açılır) - AI agent geliştirmede MCP ile doğrudan API’nin pratik karşılaştırması
İlgili yazılar
Zapier MCP'nin AI agent'lar için aksiyon bazlı beyaz liste, merkezi kimlik yönetimi ve insan onay mekanizması sunması. Özel proxy çözümlerine yönetilen bir alternatif.
mcp · security · ai-agents +4
Model Context Protocol için kurumsal kalıplar: araç bileşimi, çoklu ajan orkestrasyonu, rol tabanlı erişim kontrolü ve production gözlemlenebilirlik.
mcp · ai-adoption-strategy · authorization +4
Production'da AI agent'ları güvenli kılmak: AWS Bedrock Guardrails, defense-in-depth ve prompt injection, tool misuse ile multi-agent saldırılarına karşı pattern'ler.
ai-agents · aws-bedrock · security +3
AWS Dogwood, Cedar politikalarına zamansal koşullar ekler, bunları düz Cedar'a indirger ve ajan korumalarını Amazon Bedrock AgentCore ağ geçidinde uygular.
authorization · security · ai-agents +2
MCP'nin AI tool entegrasyonunu nasıl standartlaştırdığını, TypeScript örnekleriyle server geliştirme, güvenlik yönetimi ve production performans optimizasyonunu öğren.
mcp · ai-adoption-strategy · claude +3