Azure Haberler Microsoft

Tek Çağrıdan Ajanlara: Claude İçin Microsoft Foundry’de Beş Yeni Yetenek

Claude için Microsoft Foundry'de beş yeni yetenek

Microsoft Foundry ekibinden Haoran Cheng, Claude modelleri için beş yeni yeteneğin Foundry’de kullanıma açıldığını duyurdu: Structured outputs, Web search, Web fetch, MCP connector ve Tool search. Bunlar, bir model endpoint’ini production seviyesinde bir ajan platformuna dönüştüren yapı taşları. Ve en kritik detay: hepsi artık Hosted on Azure dağıtımlarında da çalışıyor.

Claude Microsoft Foundry beş yeni yetenek

Claude modelleri Haziran 2026’da Microsoft Foundry’de genel kullanıma açıldığında manşet “Azure üzerinde barındırılan erişim” idi: frontier Claude modelleri, Azure-native endpoint’ler, Entra ID kimlik doğrulama ve Azure Marketplace faturalandırması. Bu, satın alma ve yönetişim problemini çözmüştü. Ekipler nihayet Claude’u Azure varlıklarının geri kalanıyla aynı abonelik, ağ çevresi ve maliyet yönetimi yüzeyi içinde çalıştırabiliyordu.

Ancak bir modele erişim, ajanlar için bir platforma sahip olmakla aynı şey değil. Yazının tespit ettiği tekrar eden desen şu: bir ekip güçlü bir Claude destekli özellik yayınlıyor, sonraki çeyreği ise aynı dört iskele parçasını yeniden inşa ederek geçiriyor.

  1. Model sondaki virgülle JSON döndürdüğü için modeli yeniden prompt’layan bir retry döngüsü.
  2. Kendi crawler’ı, cache’i, robots.txt işlemesi ve atıf altyapısıyla özel bir arama-ve-kazıma servisi.
  3. Modelin Jira, ServiceNow, Confluence ve üç dahili API’ye ulaşabilmesi için elle yazılmış bir MCP istemcisi.
  4. 300 tool bağladıktan sonra model yanlış olanı seçmeye başladığı için bir tool router.

Bunların hiçbiri farklılaştırıcı mühendislik değil. Hiçbiri sizin ürününüz değil. Bu sürüm dördünü de platforma taşıyor ve kritik olarak Hosted on Azure dağıtımlarına taşıyor. Yani artık agentic yetenek ile prompt’ları ve completion’ları Azure içinde tutmak arasında seçim yapmak zorunda değilsiniz.

Bu yazıda her yetenek için: ne yaptığı, Foundry’deki API şekli, gerçekçi bir kurumsal kullanım senaryosu ve production’da sizi ısıracak kısıtlar ele alınıyor. Kod örnekleri Anthropic Foundry SDK’ları ile Python ve TypeScript olarak veriliyor.

Mimariyi değiştiren kısım: bunlar artık Hosted on Azure’da çalışıyor

Microsoft Foundry’deki Claude modelleri, dağıtım oluşturulurken seçilen iki barındırma seçeneğiyle geliyor. Önceden agentic özellik seti yalnızca Hosted on Anthropic dağıtımlarında mevcuttu ve bu bir ödünleşim dayatıyordu: prompt’ların ve completion’ların Azure içinde kalmasına dair veri işleme taahhüdü olan ekipler ya bu taahhütten vazgeçmek ya da search, fetch, MCP ve tool routing’i istemci tarafında yeniden inşa etmek zorundaydı.

Bu ödünleşim artık çözüldü. Structured outputs, Web search, Web fetch, MCP connector ve Tool search, Hosted on Azure dağıtımlarında kullanılabiliyor.

Hosted on AzureHosted on Anthropic
Inference nerede çalışırAzure altyapısı üzerinde Anthropic tarafından işletilen servisAnthropic altyapısı üzerinde Anthropic tarafından işletilen servis
Model erişilebilirliğiEn son Opus, Sonnet ve Haiku modelleriFoundry’deki tüm Claude kataloğu
Dağıtım türleriGlobal Standard, US Data Zone StandardGlobal Standard
Bu yazıdaki beş özellik
Önerilen kullanımİş yüklerinin çoğuHenüz Azure’da barındırılmayan modellere erişim

Hosted on Azure dağıtımlarında prompt’lar ve completion’lar Azure içinde kalıyor; yalnızca kullanım metadata’sı ve Anthropic’in güvenlik sistemleri tarafından işaretlenen içerik Anthropic’e çıkıyor. Anthropic, Microsoft için bağımsız bir işleyici (independent processor) olarak hareket ediyor ve Claude’u Foundry üzerinden kullanan müşteriler Anthropic’in veri kullanım şartlarına tabi oluyor.

Regüle sektörler için pratik sonuç ciddi. Bir US Data Zone Standard dağıtımı inference’ı Amerika Birleşik Devletleri içinde tutuyor — Claude API’de inference_geo: "us" ayarlamaya eşdeğer. Ve bu dağıtım artık web arama destekli bir araştırma ajanı çalıştırabiliyor, dahili MCP sunucularınıza bağlanabiliyor ve gramer kısıtlı JSON döndürebiliyor. On iki ay önce bu kombinasyon, yetenek ile veri ikametliği duruşu arasında seçim yapmayı gerektiriyordu. Artık gerektirmiyor.

1. Structured Outputs: JSON.parse() ruletinin sonu

Problem

Bir LLM’i veri hattına koyan her ekip bu kodu yazmıştır:

for attempt in range(3):
    raw = call_model(prompt)
    try:
        data = json.loads(raw)
        validate(data)
        break
    except (json.JSONDecodeError, ValidationError):
        prompt += "\n\nYour last response was invalid JSON. Try again."

Çoğu zaman işe yarıyor. Ancak “çoğu zaman”, gece boyunca 400.000 doküman işleyen bir batch iş için berbat bir özellik. Çünkü %0,3 hata oranı, birinin Pazartesi günü tek tek elemesi gereken 1.200 satırlık bir dead-letter kuyruğu demek.

Ne yapıyor

Structured outputs, üretimin kendisini kısıtlıyor. Modelin decoding’i, JSON Schema’nızdan derlenen bir gramerle sınırlandırılıyor; böylece çıktı bozuk olamıyor. Birlikte veya ayrı ayrı kullanılabilen iki tamamlayıcı özellik var:

  • JSON outputs (output_config.format) — Claude’un yanıt metninin şeklini kontrol eder.
  • Strict tool use (bir tool üzerinde strict: true) — şema geçerli tool girdilerini garanti eder.

Birincisi Claude’un ne söylediğini, ikincisi Claude’un fonksiyonlarınızı nasıl çağırdığını yönetiyor.

Kullanım senaryosu: uzman bir sigortacıda hasar ihbarı alımı

Bir ticari sigorta şirketi, ilk hasar bildirimlerini (first-notice-of-loss) serbest metin e-posta, broker PDF’leri ve eksper sesli not transkriptleri olarak alıyor. Alt sistem, katı şemalı bir Azure SQL tablosu ve önem derecesine göre yönlendiren bir Logic Apps iş akışı. Geçmişte çıkarım, formatların yaklaşık %60’ını kapsayan regex-ve-sezgisel bir hattan geçiyor, kalanı manuel kuyruğa düşüyordu.

Structured outputs ile çıkarım sözleşmesi doğrudan şemanın kendisi oluyor:

from pydantic import BaseModel
from typing import Literal
from anthropic import AnthropicFoundry

class ClaimIntake(BaseModel):
    policy_number: str
    claimant_name: str
    loss_date: str                       # ISO 8601
    loss_type: Literal[
        "property_damage", "bodily_injury", "business_interruption",
        "auto_liability", "other",
    ]
    estimated_severity_usd: float
    third_party_involved: bool
    injuries_reported: bool
    summary: str
    escalate_to_adjuster: bool

client = AnthropicFoundry(resource="contoso-ai")

response = client.messages.parse(
    model="claude-opus-5",
    max_tokens=2048,
    system=(
        "You are a claims intake analyst. Extract only what is stated or "
        "clearly implied in the submission. If severity is not stated, "
        "estimate conservatively from comparable losses."
    ),
    messages=[{"role": "user", "content": submission_text}],
    output_format=ClaimIntake,
)

claim = response.parsed_output      # zaten doğrulanmış bir ClaimIntake nesnesi
if claim.escalate_to_adjuster:
    enqueue_for_adjuster(claim)

Zod kullanan TypeScript karşılığı:

import { z } from "zod";
import AnthropicFoundry from "@anthropic-ai/foundry-sdk";
import { zodOutputFormat } from "@anthropic-ai/sdk/helpers/zod";

const ClaimIntake = z.object({
  policy_number: z.string(),
  claimant_name: z.string(),
  loss_date: z.string(),
  loss_type: z.enum([
    "property_damage", "bodily_injury", "business_interruption",
    "auto_liability", "other",
  ]),
  estimated_severity_usd: z.number(),
  third_party_involved: z.boolean(),
  injuries_reported: z.boolean(),
  summary: z.string(),
  escalate_to_adjuster: z.boolean(),
});

const client = new AnthropicFoundry({ resource: "contoso-ai" });

const response = await client.messages.parse({
  model: "claude-opus-5",
  max_tokens: 2048,
  messages: [{ role: "user", content: submissionText }],
  output_config: { format: zodOutputFormat(ClaimIntake) },
});

2. Web Search: crawler olmadan, atıflı güncel bilgi

Ne yapıyor

İsteğe tek bir tool ekliyorsunuz; Claude ne zaman arama yapacağına kendisi karar veriyor, limitiniz dahilinde ihtiyaç duyduğu kadar arama çalıştırıyor ve yararlandığı belirli metin parçalarına iliştirilmiş atıflarla bir yanıt döndürüyor. Siz crawler çalıştırmıyor, index yönetmiyor veya re-ranker yazmıyorsunuz.

Mevcut sürüm web_search_20250305 — temel arama:

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": "What's the current state of the EU AI Act's GPAI obligations?"}],
    tools=[{"type": "web_search_20250305", "name": "web_search", "max_uses": 5}],
)

Dinamik filtreleme: token ekonomisi değişiyor

Temel aramada her sonuç tamamıyla context window’a yükleniyor — boilerplate, navigasyon öğeleri ve sorunuzla hiç ilgisi olmayan dört paragraf dahil. Araştırma yoğun bir istekte bu, tur başına on binlerce boşa giden input token demek.

web_search_20260209 ve sonrasında ise Claude, sonuçları context’e ulaşmadan önce filtreleyen kod yazıp çalıştırıyor ve yalnızca ilgili içeriği tutuyor. Mekanik olarak arama, code execution tool’unun içinden çalışıyor: bu sürümlerde allowed_callers varsayılan olarak ["code_execution_20260120"] değerini alıyor ve Foundry, isteğin ihtiyaç duyduğu code execution’ı otomatik sağlıyor. tools dizinize code execution eklemiyorsunuz ve standart token maliyetleri dışında bu çağrılar için ek ücret yok.

Dinamik filtreleme olmadan doğrudan çağrıları zorlamak için allowed_callers: ["direct"] ayarlayın. Programatik tool çağrısını desteklemeyen modeller bunu gerektiriyor; ayarlamazsanız size bunu söyleyen bir 400 alırsınız.

Kullanım senaryosu: küresel bir bankada mevzuat değişikliği takibi

Tier 1 bir bankanın mevzuat işleri ekibi, bir düzine yargı bölgesinde kural değişikliklerini takip ediyor. Eski süreç RSS beslemeleri ve paylaşılan bir gelen kutusuyla çalışan bir analist ekibiydi; yayından dahili etki notuna kadar geçen medyan süre altı gündü.

Yeniden inşa, gecelik çalışan bir Azure Container Apps işi. Kritik tasarım tercihi prompt değil — allowed_domains. Mevzuat takibi, ikincil bir kaynağın bir kuralı yanlış aktarmasını göze alamayacağınız tam da o durum:

REGULATOR_DOMAINS = [
    "eba.europa.eu", "esma.europa.eu", "eur-lex.europa.eu",
    "federalreserve.gov", "sec.gov", "occ.gov",
    "bankofengland.co.uk", "fca.org.uk",
    "mas.gov.sg", "apra.gov.au",
]

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=8192,
    system=(
        "You monitor prudential and conduct regulation for a global bank. "
        "Report only changes published in the last 7 days. For each change, "
        "state the regulator, the instrument, the effective date, and the "
        "business lines affected. Do not speculate beyond the source text."
    ),
    messages=[{"role": "user", "content": "What changed this week in capital and liquidity rules?"}],
    tools=[{
        "type": "web_search_20260318",
        "name": "web_search",
        "max_uses": 12,
        "allowed_domains": REGULATOR_DOMAINS,
        "user_location": {
            "type": "approximate",
            "city": "London",
            "region": "England",
            "country": "GB",
            "timezone": "Europe/London",
        },
    }],
)
const response = await client.messages.create({
  model: "claude-opus-5",
  max_tokens: 8192,
  system: "You monitor prudential and conduct regulation for a global bank. ...",
  messages: [{ role: "user", content: "What changed this week in capital and liquidity rules?" }],
  tools: [{
    type: "web_search_20260318",
    name: "web_search",
    max_uses: 12,
    allowed_domains: REGULATOR_DOMAINS,
    user_location: {
      type: "approximate", city: "London", region: "England",
      country: "GB", timezone: "Europe/London",
    },
  }],
});

allowed_domains ve blocked_domains birbirini dışlıyor — ikisini birden gönderirseniz 400 alırsınız. Girdiler, şema olmadan, opsiyonel bir yol ile birlikte çıplak alan adları oluyor (example.com, example.com/blog).

3. Web Fetch: verdiğiniz belgeyi okur

Ne yapıyor

Web search keşfederken, web fetch okuyor. Bir URL gösteriyorsunuz; tam sayfa metnini, PDF’ler içinse doğrudan eklenmiş bir PDF gibi işlenen base64 doküman içeriğini döndürüyor.

Sürümler yine anlamlı: web_fetch_20250910 — temel fetch.

Kullanım senaryosu: bir sağlık sisteminde üçüncü taraf risk değerlendirmesi

Bir hastane ağı çeyrekte yaklaşık 40 SaaS tedarikçisini sisteme alıyor. Her biri bir güvenlik incelemesi tetikliyor: tedarikçinin trust center’ını, alt işleyici listesini, en güncel SOC 2 kapsam özetini, DPA’sını ve status page geçmişini okumak. Bir analist tedarikçi başına iki ila üç saatini PDF okuyarak geçiriyor.

VENDOR_DOCS = [
    "https://vendor.example.com/trust",
    "https://vendor.example.com/legal/subprocessors",
    "https://vendor.example.com/security/soc2-scope.pdf",
    "https://vendor.example.com/legal/dpa.pdf",
]

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=8192,
    system=(
        "You are a third-party risk analyst for a healthcare system subject to "
        "HIPAA. Assess each vendor against: data residency, subprocessor "
        "disclosure, breach notification SLA, encryption at rest and in transit, "
        "BAA availability, and SOC 2 scope coverage. Cite the source for every "
        "finding. If a control is not addressed in the documents, say so "
        "explicitly rather than inferring."
    ),
    messages=[{
        "role": "user",
        "content": "Assess this vendor:\n" + "\n".join(VENDOR_DOCS),
    }],
    tools=[{
        "type": "web_fetch_20260318",
        "name": "web_fetch",
        "max_uses": 8,
        "allowed_domains": ["vendor.example.com"],
        "citations": {"enabled": True},
        "max_content_tokens": 60000,
    }],
)
const response = await client.messages.create({
  model: "claude-opus-5",
  max_tokens: 8192,
  system: "You are a third-party risk analyst for a healthcare system ...",
  messages: [{ role: "user", content: `Assess this vendor:\n${VENDOR_DOCS.join("\n")}` }],
  tools: [{
    type: "web_fetch_20260318",
    name: "web_fetch",
    max_uses: 8,
    allowed_domains: ["vendor.example.com"],
    citations: { enabled: true },
    max_content_tokens: 60000,
  }],
});

Burada üç parametre gerçek iş yapıyor:

  • citations: { enabled: true } — web search’ün aksine fetch’te atıflar varsayılan olarak kapalı. Bir risk değerlendirmesi için bu tam tersi olmalı, o yüzden açın.
  • allowed_domains — modelin bir pazarlama blogına savrulmasını engelliyor.
  • max_content_tokens — aşırı büyük metin içeriğini context’e girmeden önce kırpıyor.

Bütçenizi buna göre planlayın: ortalama 10 kB‘lık bir web sayfası kabaca 2.500 token, 100 kB‘lık bir dokümantasyon sayfası kabaca 25.000 token, 500 kB‘lık bir araştırma makalesi PDF’i kabaca 125.000 token. Bu boyutta dört doküman, tek bir turda context window’unuzun ciddi bir bölümünü tüketir.

Search ve fetch’i birlikte kullanmak

Bu sürümdeki en yüksek kaldıraçlı desen, iki tool’u birlikte etkinleştirmek. Kullanıcı URL vermeden belirli bir dokümanı adlandırdığında — “anthropics/anthropic-sdk-python reposundaki README’yi oku”, “tedarikçinin en son DPA’sını getir” — Claude önce onu bulmak için search, sonra tamamını okumak için fetch kullanıyor:

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=8192,
    messages=[{
        "role": "user",
        "content": (
            "Find the three most recent independent analyses of hospital "
            "ransomware incidents in 2026 and give me a detailed comparison "
            "of the attack vectors described."
        ),
    }],
    tools=[
        {"type": "web_search_20260318", "name": "web_search", "max_uses": 5},
        {
            "type": "web_fetch_20260318",
            "name": "web_fetch",
            "max_uses": 5,
            "citations": {"enabled": True},
            "max_content_tokens": 50000,
        },
    ],
)

Claude arıyor, en umut vaat eden sonuçları seçiyor, tamamını çekiyor ve atıflarla analiz ediyor. Search size ucuza genişlik veriyor; fetch ise önemli olan birkaç kaynakta derinlik.

4. MCP Connector: MCP istemcisi yazmadan kayıt sistemlerinize erişim

Ne yapıyor

Model Context Protocol, kurumsal sistemleri modellere açmak için fiili standart hâline geldi. MCP connector, Messages API’yi doğrudan uzak MCP sunucularına yöneltmenizi sağlıyor — istemci implementasyonu yok, oturum yönetimi yok, tool şema çeviri katmanı yok. Bağlantıyı ve tool çağrılarını servis sizin adınıza gerçekleştiriyor.

API’nin iki yarısı var: mcp_servers bağlantıları tanımlıyor, tools içindeki bir mcp_toolset girdisi ise o sunucunun hangi tool’larının etkin olduğunu ve nasıl çalışacağını tanımlıyor.

response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": "What's blocking the payments release?"}],
    mcp_servers=[{
        "type": "url",
        "url": "https://mcp.contoso.com/jira/sse",
        "name": "jira",
        "authorization_token": jira_oauth_token,
    }],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "jira"}],
    betas=["mcp-client-2025-11-20"],
)

client.beta.messages.create kullanımına ve betas başlığına dikkat edin — MCP connector, Claude API’de olduğu gibi Foundry’de de beta aşamasında.

Kullanım senaryosu: dahili bir BT destek ajanı

Bir üreticinin BT servis masası ayda 12.000 talep işliyor. Yaklaşık %40’ı sabit bir sırayla çözülebiliyor: kullanıcıyı dizinde bul, cihaz uyumluluk durumunu kontrol et, bilgi bankasında ara ve ya bilinen bir düzeltmeyi uygula ya da bağlamı ekleyerek yukarı taşı. Ekip zaten ServiceNow, Intune ve Confluence bilgi bankası için MCP sunucuları çalıştırıyor — bunlar dahili Claude Code dağıtımları için kurulmuştu.

MCP connector, aynı sunucuların hiçbir yeni entegrasyon işi olmadan müşteriye dönük bir ajanı beslemesini sağlıyor. İlginç kısım tool yönetişimi:

response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=4096,
    system=(
        "You are an IT support agent. Diagnose using read-only tools first. "
        "Never make a change without stating what you are about to do."
    ),
    messages=[{"role": "user", "content": user_ticket}],
    mcp_servers=[
        {"type": "url", "url": "https://mcp.contoso.com/servicenow/sse",
         "name": "servicenow", "authorization_token": snow_token},
        {"type": "url", "url": "https://mcp.contoso.com/intune/sse",
         "name": "intune", "authorization_token": intune_token},
        {"type": "url", "url": "https://mcp.contoso.com/confluence/sse",
         "name": "kb", "authorization_token": kb_token},
    ],
    tools=[
        # ServiceNow: yıkıcı operasyonlar hariç her şey
        {
            "type": "mcp_toolset",
            "mcp_server_name": "servicenow",
            "configs": {
                "delete_incident": {"enabled": False},
                "bulk_close_incidents": {"enabled": False},
                "modify_sla": {"enabled": False},
            },
        },
        # Intune: katı allowlist, salt okunur
        {
            "type": "mcp_toolset",
            "mcp_server_name": "intune",
            "default_config": {"enabled": False},
            "configs": {
                "get_device_compliance": {"enabled": True},
                "list_user_devices": {"enabled": True},
            },
        },
        # Bilgi bankası: büyük, nadiren hepsi aynı anda gerekli
        {
            "type": "mcp_toolset",
            "mcp_server_name": "kb",
            "default_config": {"defer_loading": True},
        },
    ],
    betas=["mcp-client-2025-11-20"],
)
const response = await client.beta.messages.create({
  model: "claude-opus-5",
  max_tokens: 4096,
  system: "You are an IT support agent. Diagnose using read-only tools first. ...",
  messages: [{ role: "user", content: userTicket }],
  mcp_servers: [
    { type: "url", url: "https://mcp.contoso.com/intune/sse", name: "intune",
      authorization_token: intuneToken },
  ],
  tools: [{
    type: "mcp_toolset",
    mcp_server_name: "intune",
    default_config: { enabled: false },
    configs: {
      get_device_compliance: { enabled: true },
      list_user_devices: { enabled: true },
    },
  }],
  betas: ["mcp-client-2025-11-20"],
});

Kurumların ajanları gerçekte nasıl yönettiğine birebir karşılık geldiği için adlandırılmayı hak eden üç desen var:

  • Denylist — her şeyi etkinleştir, yıkıcı operasyonları kapat. Sunucu güvenilirse ve geniş yetenek faydalıysa iyi bir varsayılan.
  • Allowlistdefault_config: {enabled: false}, sonra adlandırılmış tool’ları aç. Kimlik, uç nokta veya paraya dokunan her şey için doğru duruş. Gerçekten salt okunur bir ajanı böyle inşa edersiniz.
  • Deferreddefault_config: {defer_loading: true}; sunucunun tool’larını context’e yüklemek yerine tool search’e devrediyor.

Yapılandırma öncelik sırasıyla birleşiyor: tool başına configs > set seviyesindeki default_config > sistem varsayılanları.

Yanıt blokları

MCP tool çağrıları mcp_tool_use ve mcp_tool_result blokları olarak görünüyor; kaynağı tanımlayan server_name ile birlikte. Bu, sunucu bazlı denetim loglaması için kullanışlı:

for block in response.content:
    if block.type == "mcp_tool_use":
        audit_log.record(server=block.server_name, tool=block.name, args=block.input)

5. Tool Search: ajanların kafasının karıştığı noktanın ötesine ölçeklenmek

Problem

Aynı eşikte iki hata modu ortaya çıkıyor ve ikisi de sekiz tool ile sorunsuz çalışan ajanı olan ekipler için sezgiye aykırı.

Context şişmesi. Mütevazı bir çoklu sunucu kurulumu — GitHub, Slack, Sentry, Grafana, Splunk — model daha hiçbir iş yapmadan tool tanımlarında kabaca 55.000 token tüketiyor. Bu, her turda ödediğiniz ama kullanamadığınız context demek.

Seçim doğruluğunun çöküşü. Claude’un doğru tool’u seçme becerisi, kabaca 30-50 kullanılabilir toolu aştığınızda bozuluyor. Üstelik nazikçe değil. Ajan search_pull_requests isterken search_issues çağırmaya başlıyor ve eval’leriniz prompt sorunu gibi görünen ama olmayan bir şekilde gürültülenmeye başlıyor.

Ne yapıyor

Tool search, yükleme modelini tersine çeviriyor. Her tanımın baştan context’e girmesi yerine Claude kataloğunuzda arama yapıyor ve yalnızca ihtiyaç duyduğunu yüklüyor — tipik olarak istek başına 3-5 tool, tanım tokenlerini %85’in üzerinde azaltıyor. Çalışma seti küçük kaldığı için seçim doğruluğu binlerce tool arasında bile yüksek kalıyor.

İki varyant var:

  • tool_search_tool_regex_20251119 — Claude Python re.search() desenleri yazıyor (maksimum 200 karakter, büyük-küçük harf duyarsız)
  • tool_search_tool_bm25_20251119 — Claude doğal dil sorguları yazıyor (maksimum 500 karakter)

İkisi de tool adlarını, açıklamalarını, argüman adlarını ve argüman açıklamalarını arıyor.

response = client.messages.create(
    model="claude-opus-5",
    max_tokens=4096,
    messages=[{"role": "user", "content": "Open a Sev-2 for the checkout latency spike and page the on-call."}],
    tools=[
        {"type": "tool_search_tool_regex_20251119", "name": "tool_search_tool_regex"},
        # ~3-5 sık kullanılan tool yüklü kalır
        {"name": "search_incidents", "description": "...", "input_schema": {...}},
        # geri kalan her şey ertelenir
        {"name": "create_incident", "description": "...", "input_schema": {...},
         "defer_loading": True},
        {"name": "page_oncall", "description": "...", "input_schema": {...},
         "defer_loading": True},
        # ... 400 tane daha
    ],
)

İnsanların takıldığı zihinsel model şu: defer_loading, context window’a neyin gireceğini kontrol ediyor, ne göndereceğinizi değil. Her istekte tools dizisindeki tüm tool tanımlarını yine de iletiyorsunuz — API’nin aramayı çalıştırmak ve tool_reference bloklarını genişletmek için bunlara sunucu tarafında ihtiyacı var.

En az bir tool ertelenmemiş kalmalı; normalde bu, tool search tool’unun kendisi oluyor. Tool search tool’una asla defer_loading: true ayarlamayın ve her tool’u ertelemenin 400 döndürdüğünü unutmayın: At least one tool must have defer_loading=false.

Kullanım senaryosu: 600 tool üzerinde bir saha servis ajanı

Bir endüstriyel ekipman üreticisi, 3.000 teknisyen için bir saha servis ajanı çalıştırıyor. Ajan dokuz MCP sunucusuna yayılıyor — parça envanteri, garanti, CRM, planlama, telematik, sevkiyat, faturalama, doküman deposu ve tanılama servisi — toplamda 600’den fazla tool. Hepsi baştan yüklendiğinde tool tanımları tek başına 200k context window’un çoğunu tüketiyordu ve ajanın tool seçimi pilot projeyi neredeyse öldürecek kadar güvenilmezdi.

MCP sunucularında defer_loading‘i tek tek tool tanımlarına ayarlamıyorsunuz. Toolset üzerinde bir kez ayarlıyorsunuz:

response = client.beta.messages.create(
    model="claude-opus-5",
    max_tokens=8192,
    system=(
        "You support field technicians. You can search for tools covering parts "
        "inventory, warranty claims, customer records, scheduling, telematics, "
        "shipping, billing, service documentation, and diagnostics."
    ),
    messages=[{"role": "user", "content": (
        "Unit SN-44812 is throwing a hydraulic pressure fault. Check whether "
        "it's under warranty, find the replacement seal kit, and see if we can "
        "get it on site by Thursday."
    )}],
    mcp_servers=[
        {"type": "url", "url": "https://mcp.contoso.com/parts/sse",
         "name": "parts", "authorization_token": parts_token},
        {"type": "url", "url": "https://mcp.contoso.com/warranty/sse",
         "name": "warranty", "authorization_token": warranty_token},
        {"type": "url", "url": "https://mcp.contoso.com/logistics/sse",
         "name": "logistics", "authorization_token": logistics_token},
        # ... altı tane daha
    ],
    tools=[
        {"type": "tool_search_tool_bm25_20251119", "name": "tool_search_tool_bm25"},
        {"type": "mcp_toolset", "mcp_server_name": "parts",
         "default_config": {"defer_loading": True},
         "configs": {"search_parts": {"defer_loading": False}}},
        {"type": "mcp_toolset", "mcp_server_name": "warranty",
         "default_config": {"defer_loading": True}},
        {"type": "mcp_toolset", "mcp_server_name": "logistics",
         "default_config": {"defer_loading": True}},
    ],
    betas=["mcp-client-2025-11-20"],
)

search_parts sistemdeki en çok kullanılan tek tool olduğu için defer_loading: false ile sıcak kalıyor, parça sunucusunun geri kalanı ise erteleniyor. Desen bu: en yüksek frekanslı 3-5 tool’unuzu yüklü tutun, uzun kuyruğu erteleyin.

System prompt’a da dikkat edin. Modele hangi kategorilerde tool bulunduğunu söylemek arama kalitesini ölçülebilir şekilde artırıyor — model, aramayı bilmediği yetenekler için yapamaz.

Yanıt akışı

{
  "type": "server_tool_use",
  "id": "srvtoolu_01ABC123",
  "name": "tool_search_tool_bm25",
  "input": { "query": "warranty coverage lookup by serial number", "limit": 10 }
}

ardından:

{
  "type": "tool_search_tool_result",
  "tool_use_id": "srvtoolu_01ABC123",
  "content": {
    "type": "tool_search_tool_search_result",
    "tool_references": [{ "type": "tool_reference", "tool_name": "get_warranty_status" }]
  }
}

API, tool_reference bloklarını Claude görmeden önce tam tanımlara genişletiyor. Bunları kendiniz genişletmiyorsunuz. srvtoolu_... ID’si için asla bir tool_result döndürmeyin — API bunu reddediyor. Asistanın içeriğini bir sonraki turda değiştirmeden geri geçirin ve aynı tam tools dizisiyle birlikte gönderin; böylece Claude keşfettiği tool’ları sonraki turlarda tekrar aramadan kullanabilir.

Operasyonel kontrol listesi

Bunlardan herhangi birini Foundry üzerinde production’a almadan önce:

  • Dağıtım. Bu yazıdaki her şey iki barındırma seçeneğinde de çalışıyor. İş yükünüz prompt ve completion’ların Azure içinde kalmasını gerektiriyorsa Hosted on Azure’ı, inference’ı ABD içinde tutmak için US Data Zone Standard’ı seçin. Henüz Azure’da barındırılmayan bir modele ihtiyacınız varsa Hosted on Anthropic’i seçin.
  • Kimlik doğrulama. API anahtarları yerine Azure RBAC ile Entra ID kullanın. Token’lar yaklaşık bir saat sonra doluyor — yenileyin.
  • Maliyet kontrolleri. Search ve fetch’te max_uses, fetch’te max_content_tokens, büyük toolset’lerde defer_loading. Web aramayı 1.000 arama başına 10 dolar olarak bütçeleyin; fetch ve tool search çağrı başına ek ücret getirmiyor. Hepsi Azure Marketplace üzerinden Claude Consumption Units olarak faturalanıyor; saatlik ölçülüp aylık olarak geriye dönük faturalanıyor.
  • Veri işleme. Structured outputs ZDR ile işleniyor ancak şemalar 24 saat cache‘leniyor — şemalara PHI koymayın. MCP connector’ün sunucu değişimi ZDR kapsamında değil. İkisini de incelemeye alın.
  • Güvenlik. Web fetch’teki allowed_domains‘i prompt injection’a karşı bir güvenlik kontrolü olarak ele alın. Kimlik, uç nokta veya paraya dokunan her şey için allowlist tarzı mcp_toolset yapılandırmaları kullanın. Denylist’leri CI’da doğrulayın, çünkü bilinmeyen tool adları hata değil uyarı üretiyor.
  • Dayanıklılık. Search’te pause_turn‘ü ele alın. encrypted_content‘i byte-byte aynen geri yansıtın. Structured output’u parse etmeden önce stop_reason‘ı kontrol edin. Exponential backoff uygulayın — Foundry, Anthropic’in rate-limit başlıklarını dışarı vermiyor.
  • Gözlemlenebilirlik. request-id ve apim-request-id‘yi loglayın. Azure Monitor ve Log Analytics’e yönlendirin; Anthropic en az 30 günlük döner saklama öneriyor. Tool search’ün hangi tool’ları keşfettiğini izleyin ve açıklamaları buna göre iyileştirin.
  • Foundry’de bulunmayanlar. Message Batches API, Admin API, Models API, Compliance API, Claude Managed Agents, sunucu tarafı fallback ve Advisor tool. Planınızı bunlara göre yapın.

Nereden başlamalı?

Bu hafta denemek için tek bir şey seçecekseniz, zaten yaşadığınız acıya uyanı seçin.

  • Retry döngüsü ve dead-letter kuyruğu olan bir veri hattı mı? Structured outputs. En küçük değişiklikle en anlık güvenilirlik kazancı — bir şema ve tek bir parametre.
  • Analistler elle kaynak doküman mı okuyor? Web search + web fetch, alan adı kısıtlı ve atıflar açık.
  • Dahili Claude Code dağıtımınız için zaten çalışan bir MCP sunucusu mu var? MCP connector. Entegrasyon işi bitmiş durumda; yalnızca yeni bir tüketiciyi ona yöneltiyorsunuz.
  • Demolarda çalışıp production’da kafası karışan bir ajan mı var? Tool’larınızı sayın. 30’u geçtiyse sorun prompt’unuz değil, tool search.

Yazının ana fikri şu: iskeleyi artık platform sahipleniyor. Size kalan, gerçekten sizin işiniz olan kısmı inşa etmek.

Kaynak dokümantasyon

Yazar: Haoran Cheng, Microsoft Foundry’de Claude API üzerine çalışan Product Manager.

Kaynak: https://devblogs.microsoft.com/foundry/five-new-claude-capabilities-now-available-in-foundry/

Yazar Hakkında

Kerem Şuğle

Solution Architect, VMware vExpert ve Microsoft sertifikalı altyapı uzmanı. VMware vSphere/vSAN/VCF, Azure, AWS, Google Cloud, enterprise sanallaştırma ve yapay zeka konularında 15+ yıl deneyim. AI/cloud dönüşümü, sovereign cloud, enterprise güvenlik ve modern altyapı mimarisi alanlarında yazıyor.

Leave a Comment