# Tool Use: Granting Claude Real Capabilities

> Source: https://sukruyusufkaya.com/en/learn/claude-ustaligi/tool-use
> Updated: 2026-05-13T11:38:19.503Z
> Category: Claude Ustalığı
> Module: 7. Claude's Superpowers
**TLDR:** How to teach Claude to use a calculator, database, email, Slack, code sandbox? Anatomy of tool use and production patterns.

> **Bu derste**
>
> Tool Use'un üç adımı: (1) tool tanımla, (2) Claude tool çağırsın, (3) sonucu döndür ve final cevap üret.

# Tool Use Nedir?

Bir LLM'in metni çok iyi yazması, dünyada eylem yapabildiği anlamına gelmez. **Tool Use** Claude'a önceden tanımladığın fonksiyonları **doğru zamanda çağırma** yeteneği verir.

Tipik örnekler:
- Hesap makinesi
- Hava durumu API'si
- Veritabanı sorgusu
- E-posta gönderimi
- İç bilgi tabanı arama (RAG)
- Kod sandbox'ı

![Tool use akışı: kullanıcı → Claude → tool call → executor → tool result → Claude → kullanıcı](/images/learn/claude-ustaligi/diagram-tooluse.svg)

_Tool use sıralı akış._

## API Anatomisi

```python
import anthropic
client = anthropic.Anthropic()

tools = [{
  "name": "get_weather",
  "description": "Bir şehrin anlık hava durumunu getirir.",
  "input_schema": {
    "type": "object",
    "properties": {
      "city": {"type":"string", "description":"Şehir adı"}
    },
    "required": ["city"]
  }
}]

resp = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    tools=tools,
    messages=[{"role":"user","content":"İstanbul'da bugün hava nasıl?"}],
)

# resp.stop_reason == "tool_use"
# resp.content[0].type == "tool_use"  →  isim ve input içerir
# Sen tool'u kendi kodunla çalıştır, sonucu role:"user", type:"tool_result" mesajıyla geri yolla

```

```python
# Tool Use loop pseudo-code (yerel test)
def get_weather(city: str):
    fake = {"İstanbul": {"temp_c": 18, "cond": "yağmurlu"}}
    return fake.get(city, {"temp_c": None, "cond": "bilinmiyor"})

# Claude bu adımı simüle ediyor diyelim:
tool_call = {"name": "get_weather", "input": {"city": "İstanbul"}}

# 1) tool çalıştır
result = get_weather(**tool_call["input"])
# 2) sonucu Claude'a geri yolla (psödo)
print("Tool sonucu:", result)
print("Claude'un üreteceği final cevap:")
print("- İstanbul'da bugün 18°C ve yağmurlu görünüyor; şemsiyeni unutma.")
```

### Tool tasarımı için 5 kural

1. **Atomik:** Tek sorumluluk; "doğru sorgu" yerine "user_id'ye göre kullanıcı getir".
2. **Deterministik:** Aynı girdi → aynı çıktı (mümkün olduğunca).
3. **Hata-tolerant:** Bozulduğunda Claude'a anlamlı hata mesajı dön ('not_found', 'rate_limited').
4. **Schema sıkı:** Gereksiz alan yok, default değer net.
5. **Ucuz çağrı:** Pahalı tool için cache / quota planla.

### Çok sayıda tool olduğunda

20+ tool olduğunda Claude doğru tool seçimini zorlanır. Çözüm:

- Tool'ları **kategoriye böl**, ön sınıflandırıcı çağrı yap.
- Tool isimlerini **kendi içinde anlamlı** tut.
- Description alanını sıkı yaz: "Ne zaman bu tool'u kullan, ne zaman kullanma".

### Streaming ile tool use

Tool use streaming desteklenir; modelin tool call'u tamamlandığında stream o anda durur. Sen tool'u koşturup sonucu mesajına ekleyip yeni bir stream çağrısı yaparsın.

```json
{
  "name": "search_orders",
  "description": "Sipariş veritabanında arama yapar. Sadece müşteri kendi sipariş kimliğini sorduğunda kullan.",
  "input_schema": {
    "type": "object",
    "properties": {
      "order_id": {"type":"string", "pattern":"^ORD-[0-9]{6}$"},
      "include_items": {"type":"boolean", "default": true}
    },
    "required": ["order_id"],
    "additionalProperties": false
  }
}
```

**Boşluk doldurma egzersizi (text):**
```text
Tool use'da Claude tool _____ üretir, sen _____ , sonra sonucu role 'user' içinde tool_result olarak geri yollarsın. Tool tasarımının ilk kuralı _____ olmasıdır.
```

> ✋ Kontrol noktası: `q-701-mc1`