Modül 7 · Atölye: AI Destekli Veri Alımı · ⏱ 6 dk

dlt + Cursor/Windsurf + dlt MCP ile agentic ingestion

dlt + AI Copilot

Bu derste neler öğreneceksin

  • Cursor da dlt MCP server kurar
  • Prompt ile pipeline kurgular
  • AI agent ın ürettiği kodu inceler

Agentic ingestion: 2026’nın yeni iş akışı

2024’te “dlt ile pipeline yaz” bir mühendislik göreviydi. 2026’da bu görevin bir kısmı AI agent’lara devredildi — ama mühendisin rolü azalmadı, dönüştü. Artık kod yazmaktan çok: prompt tasarlamak, agent çıktısını denetlemek ve production’a uygunluğunu doğrulamak ön plana çıkıyor.

Bu ders, dlt ekibinin resmi MCP server’ı + Cursor/Windsurf agent loop’unu kullanarak uçtan uca bir ingestion pipeline’ı kurgulamayı gösteriyor.

Mimari: üç parça

┌─────────────┐    prompt     ┌──────────────┐
│   Siz       │ ───────────► │   AI Agent   │
│ (mühendis)  │              │ (Cursor/LLM) │
└─────────────┘              └──────┬───────┘
                                    │ tool call

                             ┌──────────────┐
                             │  dlt MCP     │
                             │  server      │
                             └──────┬───────┘
                                    │ kod yazar

                             ┌──────────────┐
                             │ pipeline.py  │
                             │  (onayınız)  │
                             └──────────────┘
  1. Siz doğal dilde niyetinizi söylüyorsunuz.
  2. Agent niyetinizi dlt’nin MCP tool’larına dönüştürüyor.
  3. dlt MCP server size kaynak şablonları, destination config kontrolü ve best-practice snippet’leri sunuyor.

Son söz sizin: agent kodu üretir, siz inceler ve çalıştırırsınız.

MCP server kurulumu (production-ready)

.cursor/mcp.json veya global ~/.cursor/mcp.json içine:

{
  "mcpServers": {
    "dlt": {
      "command": "uvx",
      "args": ["--from", "dlt", "dlt", "mcp", "run"],
      "env": {
        "DLT_PROJECT_DIR": "${workspaceFolder}"
      }
    }
  }
}

Kurulum doğrulama: Cursor → Settings → MCP → listede dlt yeşil tikli görünmeli. Tıklamazsanız terminal log’unda dlt mcp run çıktısını kontrol edin.

Not: dlt mcp run komutu dlt >= 1.0 ile gelir. Eski sürümdeyse pip install -U dlt ile güncelleyin.

İlk agentic pipeline: GitHub → Postgres

Agent’a verdiğimiz prompt (net, kabul kriterleri ile):

GitHub GraphQL API v4 kullanarak github.com/<org> organizasyonundaki
tüm public repo'ları çek. dlt pipeline yaz:
- source: REST/GraphQL API source
- destination: postgres (production credentials .dlt/secrets.toml'da)
- tablo: repos (kolonlar: id, name, full_name, stars, language, created_at)
- primary_key: id
- write_disposition: merge
- batch_size: 200
Üretim kodun pytest ile test edilebilir olsun.

Agent çıktısı kabaca şöyle olacak (github_repos_pipeline.py):

import dlt
from dlt.sources.rest_api import rest_api_source

@dlt.source(name="github_repos")
def github_source(api_token: str = dlt.secrets.value):
    return rest_api_source(
        {
            "client": {
                "base_url": "https://api.github.com/graphql",
                "headers": {"Authorization": f"Bearer {api_token}"},
            },
            "resources": [
                {
                    "name": "repos",
                    "endpoint": {
                        "path": "/",
                        "method": "POST",
                        "json": {"query": GITHUB_REPOS_QUERY},
                    },
                    "primary_key": "id",
                }
            ],
        }
    )

pipeline = dlt.pipeline(
    pipeline_name="github_repos",
    destination="postgres",
    dataset_name="raw_github",
    progress="log",
)

if __name__ == "__main__":
    load_info = pipeline.run(github_source())
    print(load_info)

Agent bu kodu 15-30 saniyede üretir.

Code review checklist (yapay zekâ değilsiniz)

1. Secrets & güvenlik

  • API token dlt.secrets.value ile mi çekiliyor? Yoksa hard-coded mi?
  • .dlt/secrets.toml .gitignore’da mı?

2. Schema ve incremental

  • primary_key doğru mu? (GitHub id immutable, ama updated_at ile incremental yapılabilir)
  • write_disposition: ilk çalıştırma replace, sonraki merge olmalı

3. Rate limit ve pagination

  • GitHub API: 5000 req/h authenticated. dlt.sources.rest_api default 100 sayfa/sayfa — toplam sayfa sayısı hesaplanmalı.
  • GraphQL pageInfo.hasNextPage ile cursor-based pagination kullanılıyor mu?

4. Hata yönetimi

  • 5xx geldiğinde retry var mı? (dlt default 5 retry; yeterli mi?)
  • 403 (rate limit) → exponential backoff yapılmış mı?

5. Observability

  • progress="log" production’da yeterli mi? Yoksa progress="tqdm" veya ["log", "pipeline"] mi?
  • load_info Slack/email’e gönderiliyor mu? (Kestra webhook entegrasyonu bir sonraki derste)

Production’a alırken

Agent’ın ürettiği kodu asla doğrudan main branch’e merge etmeyin. Önerilen akış:

agent_draft/  →  PR aç  →  code review (siz)  →
   CI (pytest + dlt pipeline dry-run)  →  staging ortamı  →  production

CI’da çalışacak minimal test:

def test_pipeline_runs():
    pipeline = dlt.pipeline(
        pipeline_name="github_repos_test",
        destination="duckdb",
        dataset_name="_test",
        dev_mode=True,
    )
    load_info = pipeline.run(github_source().add_limit(5))
    assert load_info.loads_ids

dev_mode=True ile çalışan pipeline fixture’ı gerçek Postgres’e dokunmadan hızlıca validate eder.

Hands-on (15 dk)

  1. Cursor’da dlt MCP server’ı kur, listede yeşil olduğunu doğrula.
  2. Yukarıdaki GitHub prompt’unu kendi org/unuz için uyarla.
  3. Agent’ın ürettiği *.py dosyasını aç, checklist’teki 5 maddeyi tek tek işaretle.
  4. dlt pipeline github_repos --dataset raw_github show komutu ile yüklenen tabloyu incele.
  5. Aynı pipeline’ı bir kez daha çalıştır — merge disposition sebebiyle duplicate oluşmadığını doğrula (SELECT COUNT(*) karşılaştır).

Trend notu (Haziran 2026)

  • Anthropic, OpenAI, Mistral hepsi agentic tool-use’u first-class destekliyor. MCP açık standart olarak bu yıl ilgi odağı.
  • dlt ekibi resmi MCP server’ı artık dlt mcp run ile dağıtıyor — bir dlt PR’ına katkı vermek artık agent-friendly.
  • Windsurf Cascade modu, Cursor’ın Agent moduna göre daha agresif (daha az onay sorar); production için Cursor’ın “Confirm each tool call” ayarı daha güvenli.

Sıradaki

Spark. Milyonlarca satırı pizzacı ekibi gibi paralel işleyen motor.

Sonraki ders: Spark nedir? Pizzacı ekibi analojisi →