# Shager için Claude becerisi oluşturun: SKILL.md, klasör yapısı ve çok hesaplı paylaşımı tekrarlanabilir kılan kurallar

_2026-09-30 · Shager dağıtımını bir Claude Agent Skill olarak paketleyin: iyi tetiklenen ön bilgi, referans dosyaları, bir REST yardımcı betiği ve becerinin duracağı yer._

Shager için bir Claude becerisi (skill), YAML ön bilgisinde bir `name` ve bir `description` bulunan bir `SKILL.md` dosyası içeren bir klasördür. Ardından Claude'a dağıtımı Shager'ın araçlarıyla nasıl yürüteceğini anlatan talimatlar gelir: hangi çağrıların, hangi sırayla yapılacağı ve hangi kuralların asla esnemeyeceği. Kendiniz için `~/.claude/skills/shager-distribution/` klasörüne, ekibiniz için bir depoda `.claude/skills/shager-distribution/` klasörüne koyun; Claude Code bir istek eşleştiğinde ya da `/shager-distribution` yazdığınızda onu yükler.

Shager'a bağlanmak işin kolay kısmı. Muhakemeyi beceriye işlersiniz: açıklama çeşitlemesi, takip linkleri, varsayılan olarak taslak ve API hayır dediğinde ne yapılacağı.

## Neden uzun bir istem yerine beceri yazmalı?

Çünkü salı günü mükemmelleştirdiğiniz istem perşembe günü kaybolmuş olur ve onu görmeyen ekip arkadaşınız daha kötüsünü yazar. Anthropic'in [Agent Skills genel bakış](https://platform.claude.com/docs/en/agents-and-tools/agent-skills/overview) sayfası, becerileri isteğe bağlı olarak yüklenen dosya sistemi kaynakları olarak tanımlar. Beceri tetiklenene kadar bağlamda yalnızca adı ve açıklaması durur. Ardından `SKILL.md` okunur ve işaret ettiği ek dosyalar yalnızca gerektiğinde okunur. Böylece her konuşmada bedelini ödemeden ayrıntılı talimatlar yazmayı göze alabilirsiniz.

Özellikle Shager için prosedür sabit kalırken içerik her hafta değişir. İyi bir becerinin profili tam olarak budur.

## SKILL.md ön bilgisinin kuralları neler?

Aynı genel bakış sayfasına göre `name` ve `description` zorunludur. `name` en fazla 64 karakterdir, yalnızca küçük harf, rakam ve kısa çizgi içerebilir ve "anthropic" ya da "claude" gibi ayrılmış kelimeleri içeremez. `description` boş olamaz, en fazla 1.024 karakterdir ve becerinin hem ne yaptığını hem de ne zaman kullanılacağını söylemelidir; çünkü Claude istekleri buna göre eşleştirir.

Claude Code, [Use Skills in Claude Code](https://code.claude.com/docs/en/skills) sayfasında belgelenen isteğe bağlı alanlar ekler: beceri etkinken Claude'un sormadan kullanabileceği araçlar için `allowed-tools`, beceriyi yalnızca elle çalıştırılır hale getirmek için `disable-model-invocation`, otomatik tamamlama için `argument-hint` ve diğerleri. Klasör adı ya da tanımlanmışsa `name`, eğik çizgi komutu olur.

## Klasör nasıl görünmeli?

```text
shager-distribution/
  SKILL.md
  reference/
    tools.md
    errors.md
  scripts/
    shager.py
```

`SKILL.md` prosedürü tutar. `reference/tools.md`, `create_post` ve `upload_media_from_url` için alan düzeyindeki ayrıntıları tutar ve yalnızca Claude'un ihtiyacı olduğunda okunur. `scripts/shager.py`, MCP sunucusu olmayan ortamlar için isteğe bağlı bir REST yedeğidir. Claude Code belgeleri `SKILL.md` dosyasını 500 satırın altında tutmayı ve ayrıntıları ayrı dosyalara taşımayı önerir; bu bölümleme tam olarak bunu yapıyor.

Shager ayrıca https://shager.ai/skills/shager/SKILL.md adresinde güncel tutulan bir beceri dosyası yayımlar. Kendi becerinizi yazmadan önce okumak için iyi bir başlangıç noktası; aşağıdaki sürüm ajanslara özgü kurallar ekliyor.

## SKILL.md

```markdown
---
name: shager-distribution
description: Distribute a post or video to many social accounts through Shager (Facebook Pages, Instagram professional accounts, YouTube channels). Use when the user asks to post, schedule, draft or distribute content to client accounts, account groups or "all locations", or asks which account drove clicks.
argument-hint: "[workspace] [brief or media URL]"
allowed-tools: mcp__shager__whoami mcp__shager__list_workspaces mcp__shager__list_channels mcp__shager__list_groups mcp__shager__get_post mcp__shager__list_posts mcp__shager__get_analytics
---

# Shager distribution

## Before anything
1. Call whoami. Note the scopes and whether this is a sandbox.
2. Resolve the workspace by name with list_workspaces. If two match, ask.
3. Call list_channels and list_groups. Only target channels with status ACTIVE.

## Building the post
1. Media: call upload_media_from_url. For vertical video pass width,
   height and duration_ms so Shager can validate Reels, Shorts and Stories.
2. Captions: write one caption per channel in per_channel. Keep facts,
   prices and dates identical; vary the opening line, structure and the
   local detail (city, branch, presenter) taken from the channel name.
3. Links: never paste a raw URL into captions. Pass it as cta_url so each
   account gets its own short link and UTM tags. Put the call to action
   in first_comment for Facebook and YouTube. Instagram does not make
   comment links clickable, so for Instagram channels mention "link in bio".
4. Set campaign to a lowercase slug, e.g. "spring-open-day-2026".
5. Set label to something a human will recognize in the calendar.

## Drafts by default
Create the post WITHOUT schedule_at unless the user gave an explicit date
and time in this conversation. Show a table of channel, network, format and
the first line of each caption, and wait for confirmation.

## Scheduling
Only when confirmed: call schedule_post with schedule_at in ISO 8601 with
the workspace's UTC offset. If the workspace requires approval, call
request_approval instead and return the approval_url to the user.

## When Shager says no
Read error.code, do not retry blindly. See reference/errors.md.

## Reporting
For "how did it do", call get_analytics for the date range and present
clicks by account, highest first, plus the top posts.

Field details for create_post: reference/tools.md
```

Buradaki birkaç karar savunulmaya değer.

`allowed-tools` listesi yalnızca okuma işlemlerini içerir. `create_post`, `schedule_post`, `request_approval` ve `cancel_post`, Claude Code'da yine de izin ister; böylece her yazma işlemini bir insan görür. MCP araçları `mcp__<server>__<tool>` biçiminde adlandırılır; bu da sunucuyu [Shager'ı Claude Code'a bağlamak](/en/blog/connect-shager-to-claude-code) yazısındaki gibi `shager` adıyla kaydettiğinizi varsayar.

Instagram satırı ağın davranışını yansıtır: orada açıklamalardaki ve yorumlardaki linkler tıklanamaz. Takip linkli ilk yorum, asıl değerini Facebook Sayfalarında ve YouTube'da gösterir.

"Varsayılan olarak taslak" iki kez uygulanır. Bir kez talimatlarda, bir kez de becerinin ortamına `publish` yetkisi olmayan bir anahtar verilerek. Talimatlar yön gösterir; yetkiler zorunlu kılar.

## reference/errors.md

```markdown
# Shager error codes

401 unauthorized: key missing or malformed. Stop and tell the user.
403 forbidden: key lacks a scope. If scheduling, say a human must schedule
    or grant publish at app.shager.ai/dashboard/agents.
403 sandbox_unclaimed: show the claim link from signup; nothing else to do.
404 not_found: re-list channels or posts; ids are per workspace.
409 not_scheduled: the post is not scheduled; get_post and report status.
422 rejected: a network rule failed. Quote the message, fix the input
    (length, format, media), and try once more.
429 rate_limited: wait 60 seconds, then continue. Never loop per account.
```

## scripts/shager.py: REST yedeği

MCP yapılandırılmamışsa beceri, [OpenAPI belgesinde](https://app.shager.ai/api/v1/openapi.json) tanımlanan REST API üzerinden yine çalışabilir. Küçük bir yardımcı, Claude'un her seferinde HTTP kodu doğaçlamasını önler:

```python
#!/usr/bin/env python3
"""Usage: shager.py METHOD PATH [JSON_BODY]
Example: shager.py GET /workspaces
         shager.py POST /workspaces/WS_ID/posts '{"caption": "..."}'"""
import json, os, sys, requests

API = "https://app.shager.ai/api/v1"

def main():
    method, path = sys.argv[1].upper(), sys.argv[2]
    body = json.loads(sys.argv[3]) if len(sys.argv) > 3 else None
    r = requests.request(
        method, f"{API}{path}",
        headers={"Authorization": f"Bearer {os.environ['SHAGER_API_KEY']}"},
        json=body, timeout=90,
    )
    payload = r.json()
    if not r.ok:
        e = payload["error"]
        print(json.dumps({"status": r.status_code, "code": e["code"], "message": e["message"]}))
        sys.exit(1)
    print(json.dumps(payload["data"], indent=2))

if __name__ == "__main__":
    main()
```

`SKILL.md` dosyasına "If the shager MCP tools are unavailable, run scripts/shager.py with the same operation paths" gibi bir satır ekleyin ve yolları `reference/tools.md` içinde listeleyin. Genel bakış sayfası, Claude paketlenmiş bir betiği çalıştırdığında bağlama kodun değil yalnızca çıktısının girdiğini belirtir.

## Beceri nerede durmalı?

| Ortam | Konum | Shager'a erişebilir mi? |
|---|---|---|
| Claude Code, kişisel | `~/.claude/skills/shager-distribution/` | Evet, MCP ya da betik üzerinden. Oradaki beceriler, makinenizdeki herhangi bir programla aynı ağ erişimine sahiptir |
| Claude Code, ekip | Bir depoya eklenmiş `.claude/skills/shager-distribution/` | Evet, yukarıdakiyle aynı |
| claude.ai | Settings > Features bölümünden zip olarak yüklenir | Ağ erişimi kullanıcı ve yönetici ayarlarına göre değişir |
| Claude API | Skills API üzerinden yüklenir | Hayır: API'deki beceriler ağ erişimi olmadan çalışır |

Son satır doğrudan genel bakış sayfasındaki çalışma zamanı kısıtlarından geliyor ve insanları şaşırtıyor. API'de ağ tarafı için Shager'ın MCP sunucusunu ya da kendi araç çağrılarınızı kullanın ve beceriyi talimatlarla sınırlı tutun. Ayrıca özel becerilerin ortamlar arasında eşitlenmediğini unutmayın; claude.ai'ye yüklenen bir beceri Claude Code'da bulunmaz.

## Nasıl test edilir?

1. Adını anmadan onu tetiklemesi gereken bir şey isteyin: "Draft this week's open-day post for all Harbor Fitness locations." Claude'un beceriyi okuduğunu kontrol edin.
2. Tetiklememesi gereken bir şey sorun: "What's a good caption length for Reels?" Beceri devreye girmemeli.
3. `/shager-distribution Harbor Fitness https://example.com/clip.mp4` çalıştırın ve taslak tablosunda durduğunu kontrol edin.
4. `publish` yetkisi olmayan bir anahtar kullanın ve planlama yapmasını isteyin. Döngüye girmek yerine 403'ü açıklamalı.

## SSS

### Becerinin adı "claude" içerebilir mi?

Hayır. Anthropic'in beceri kuralları `name` alanında "anthropic" ve "claude" kelimelerini ayırır. `shager-distribution` gibi bir ad kullanın; belgelerinizin başlığında bunun bir Claude becerisi olduğunu yine de söyleyebilirsiniz.

### Beceri API anahtarını saklamalı mı?

Hayır. Anahtarı MCP istemcisi yapılandırmasında ya da `SHAGER_API_KEY` gibi bir ortam değişkeninde tutun. Beceri paylaşılabilir bir klasördür ve çoğu zaman git'e girer; içindeki bir anahtar sonunda sızar.

### Aynı beceri Cursor ya da Codex'te çalışır mı?

`SKILL.md` formatı Anthropic'e ait, ama içindeki talimatlar düz metindir. Ekipler genellikle gövdeyi Cursor kurallarına ya da bir Codex istem dosyasına yapıştırır. Araç adları her istemcide aynıdır, çünkü Shager'ın MCP sunucusundan gelirler.

## Sonraki adım

İstek üzerine taslak hazırlayan bir beceri temeldir. Sonraki yazı onu, haftayı planlayan, her müşterinin gönderi taslaklarını hazırlayan, onayları yönlendiren ve tıklamaları raporlayan, insan kontrol noktaları da doğru yerlerde olan bir [haftalık dağıtım rutinine](/en/blog/skill-weekly-distribution-routine) dönüştürüyor.

---
Source: https://shager.ai/tr/blog/build-a-claude-skill-for-shager
