2026-03-12
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:
# 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ı otomatik olarak whitelist’teki projelere kapsam olarak bağlar 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 yapilandirmasini yukle
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="[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:
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("[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:
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) 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
#!/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ğrula
validate_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:
# 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
| 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 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 (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.
-
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.
Ö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
| 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 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:
| 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)", # 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
- Getting Started with the Atlassian Rovo MCP Server - Resmi kurulum rehberi, bilinen kısıtlamalar ve güvenlik mimarisi
- Atlassian Rovo MCP Server is Now GA - GA duyurusu, özellik genel bakışı ve desteklenen AI istemcileri
- GitHub Issue #79: Restrict MCP to Certain Spaces and Projects - Erişim kapsam boşluğunu belgeleyen topluluk özellik talebi
- sooperset/mcp-atlassian - JIRA_PROJECTS_FILTER ve CONFLUENCE_SPACES_FILTER destekli topluluk MCP sunucusu
- Advanced Tool Use (Anthropic Engineering) - 58 araçta 55K token bulgusu dahil MCP token yükü analizi
- Code Mode: Give Agents an Entire API in 1,000 Tokens (Cloudflare) - MCP token’larını 1.17M’den 1K’ya düşüren Cloudflare yaklaşımı
- State of MCP Server Security 2025 (Astrix) - 5.200+ MCP sunucusunu güvenlik uygulamaları açısından analiz eden araştırma
- Jira Cloud REST API - Issue Search - nextPageToken sayfalandırmalı v3 arama endpoint dokümantasyonu
- Advanced Searching Using CQL (Confluence) - Alana kapsamlı aramalar için CQL söz dizimi referansı
- Scoped API Tokens in Confluence Cloud - Kısıtlı ürün ve kapsam erişimli API token’ları
- atlassian-python-api Documentation - Atlassian REST API’leri için Python kütüphanesi
- Securing the AI Agent Revolution (CoSAI) - Coalition for Secure AI’ın MCP güvenlik desenleri rehberi
- MCP vs APIs: When to Use Which (Tinybird) - 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.
Model Context Protocol implementasyonları için kurumsal düzeyde kalıplar: araç bileşimi, çoklu ajan orkestrasyonu, rol tabanlı erişim kontrolü ve production gözlemlenebilirlik.
Production ortamında AI agent'ları güvenli hale getirmek için AWS Bedrock Guardrails, defense-in-depth stratejileri ve prompt injection, tool misuse ve multi-agent saldırılarını önlemeye yönelik pratik implementasyon pattern'leri rehberi.
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.
AWS Cognito ve Verified Permissions ile SaaS yetkilendirme mimarisi. Cedar politika dili, çok kiracılı desenler, JWT token akışı, maliyet analizi ve TypeScript örnekleriyle yaygın hatalar.