# Tambahkan Shager ke Cursor dengan .cursor/mcp.json: Ubah Catatan Rilis Jadi Draf untuk Setiap Akun Klien

_2026-08-28 · Konfigurasikan server MCP remote Shager di Cursor dengan url dan header Authorization dari env var, lalu ubah changelog menjadi draf postingan per akun._

Untuk menghubungkan Shager ke Cursor, buat `.cursor/mcp.json` di proyek Anda (atau `~/.cursor/mcp.json` untuk semua proyek) dengan entri `shager` yang `url`-nya `https://app.shager.ai/api/mcp` dan `headers`-nya mengisi `Authorization` dengan `Bearer ${env:SHAGER_API_KEY}`. Cursor mengambil nilai variabel itu dari environment Anda, terhubung lewat HTTP, dan agen langsung mendapat akses ke tool Shager. Tanpa server lokal, tanpa jembatan.

Cursor adalah tempat yang menarik untuk menjalankan distribusi konten, karena bahan mentahnya sudah ada di repo: changelog, dokumentasi, catatan rilis, draf blog. Panduan ini menyiapkan koneksinya dengan benar, lalu memakainya untuk pekerjaan tersebut.

## Seperti apa konfigurasi MCP Cursor untuk server remote?

[Dokumentasi MCP](https://cursor.com/docs/context/mcp) Cursor menggambarkan server remote sebagai `url` ditambah objek `headers` opsional, dan mendokumentasikan interpolasi `${env:NAME}` di field `url` dan `headers`. Dokumentasi itu juga menyebut dua lokasi: `.cursor/mcp.json` di dalam proyek untuk tool khusus proyek, dan `~/.cursor/mcp.json` di direktori home untuk tool yang tersedia di mana saja.

Untuk Shager:

```json
{
  "mcpServers": {
    "shager": {
      "url": "https://app.shager.ai/api/mcp",
      "headers": {
        "Authorization": "Bearer ${env:SHAGER_API_KEY}"
      }
    }
  }
}
```

Dan di profil shell Anda:

```bash
export SHAGER_API_KEY="shgr_live_your_key_here"
```

Cursor membaca environment variable dari proses yang menjalankannya. Di macOS, aplikasi yang dibuka dari Dock mungkin tidak melihat variabel yang Anda set di `~/.zshrc`. Jika server gagal dengan 401 padahal kuncinya benar, tutup Cursor dan jalankan dari terminal dengan `cursor .` untuk memastikan itulah penyebabnya.

## File proyek atau file global?

| Lokasi | Cocok untuk | Yang perlu diwaspadai |
|---|---|---|
| `.cursor/mcp.json` di repo | Repo situs marketing atau dokumentasi tempat pekerjaan konten berlangsung | Commit hanya dengan bentuk `${env:...}`, jangan pernah dengan kunci asli |
| `~/.cursor/mcp.json` | Anda ingin Shager tersedia di setiap workspace | Agen di proyek mana pun kini bisa menjangkau workspace Shager Anda |

Bagi developer agensi yang memelihara beberapa situs klien, file proyek biasanya lebih tepat. Repo untuk klien A tidak semestinya punya agen yang bisa seenaknya membuat draf di workspace klien B. Padukan file proyek dengan kunci yang organisasinya hanya memuat workspace yang relevan untuk repo tersebut, atau setidaknya sebut nama workspace secara eksplisit di prompt Anda.

## Dari mana kuncinya berasal?

Seseorang membuatnya di https://app.shager.ai/dashboard/agents dan memilih scope-nya. Untuk pekerjaan di dalam editor, `read` ditambah `write` adalah default yang tepat: agen bisa mengunggah media dan membuat draf, tetapi Shager menolak menjadwalkan atau memublikasikan tanpa scope `publish`. Jika Anda sedang membuat prototipe dan belum punya akun, agen bisa membuat sandbox lewat [pendaftaran mandiri](/en/blog/agent-self-signup-and-claim); resepnya dipublikasikan di shager.ai/auth.md.

## Bagaimana memastikan Cursor melihat tool-nya?

Buka pengaturan MCP di Cursor dan cari `shager` dengan status terhubung beserta daftar tool-nya: `whoami`, `list_workspaces`, `create_workspace`, `list_channels`, `create_connect_link`, `list_groups`, `create_group`, `upload_media_from_url`, `create_post`, `schedule_post`, `request_approval`, `get_post`, `list_posts`, `cancel_post`, dan `get_analytics`. Jika server menampilkan error, tiga penyebab yang biasa adalah environment variable yang belum ada, kata `Bearer` yang hilang dari nilai header, atau kesalahan sintaks JSON di file.

Lalu, di chat agen:

```text
Call shager whoami and tell me which scopes this key has.
```

## Alur kerjanya: changelog menjadi draf per akun

Berikut pekerjaan nyata yang sangat cocok untuk Cursor. Misalkan Anda memelihara situs sebuah reseller software dengan dua belas halaman partner regional di Facebook dan Instagram. Setiap kali ada rilis, seseorang menulis ulang changelog menjadi postingan media sosial secara manual. Dengan Shager terhubung, agen bisa mengerjakan versi pertamanya.

```text
Read CHANGELOG.md and take the entry for v4.2 only.
In Shager workspace "Brightline Partners":
1. list_groups and use the group "Regional partners".
2. list_channels so you know each channel's name and network.
3. Write one short post about v4.2 for a non-technical audience.
4. Create a DRAFT with create_post (no schedule_at):
   group_ids: the "Regional partners" group
   per_channel: a caption per channel that names the region from the channel
   name and varies the opening line; keep facts identical
   cta_url: https://brightline.example/releases/4-2
   campaign: "release-4-2"
   first_comment: "Full notes: " followed by the link
5. Print the post id and a table of channel, caption first line, format.
```

Beberapa pilihan dalam prompt itu memang disengaja.

Faktanya tetap sama, sementara susunan katanya bervariasi. `per_channel` menimpa caption untuk setiap akun, dan inilah pola yang direkomendasikan. Dua belas salinan teks yang sama di halaman-halaman yang saling terkait adalah jenis pengulangan yang diperingatkan dalam artikel kami tentang [menghindari blokir spam saat posting dalam skala besar](/en/blog/avoid-spam-blocks-when-posting-at-scale), dan terasa janggal bagi siapa pun yang mengikuti dua halaman tersebut.

Tautannya dilacak per akun. Dengan mengirim `cta_url`, Shager membuat tautan pendek dan set UTM terpisah untuk setiap akun, dengan `utm_content` sebagai penandanya. Nantinya, `get_analytics` mengembalikan data klik per akun dan per postingan, sehingga partner di satu wilayah bisa melihat apa yang dihasilkan halamannya.

Hasilnya berupa draf. Tetap ada orang yang membacanya di Shager sebelum terbit, entah peninjau internal atau klien lewat tautan persetujuan.

## Bagaimana jika Anda lebih suka memanggil API dari kode?

Terkadang Anda ingin ini berupa skrip di repo, bukan chat. Alur rilis di CI, misalnya, tidak semestinya bergantung pada seseorang yang membuka Cursor. Operasi yang sama tersedia lewat REST, dijelaskan di [dokumen OpenAPI](https://app.shager.ai/api/v1/openapi.json). Padanan langkah 4 di atas dalam TypeScript:

```typescript
const API = "https://app.shager.ai/api/v1";
const headers = {
  Authorization: `Bearer ${process.env.SHAGER_API_KEY}`,
  "Content-Type": "application/json",
};

const res = await fetch(`${API}/workspaces/${workspaceId}/posts`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    caption: defaultCaption,
    group_ids: [groupId],
    per_channel: captions.map((c) => ({ channel_id: c.channelId, caption: c.text })),
    cta_url: "https://brightline.example/releases/4-2",
    campaign: "release-4-2",
    first_comment: "Full notes: https://brightline.example/releases/4-2",
  }),
});

const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data.id, body.data.status); // a DRAFT post
```

Respons dibungkus dalam `{ "data": ... }` dan error dalam `{ "error": { "code", "message" } }`, jadi penanganan error-nya seragam di mana-mana. [Quickstart REST](/en/blog/shager-rest-api-quickstart) membahas urutan lengkapnya.

## Aturan yang layak ditambahkan ke proyek

Cursor mendukung project rules, dan satu aturan pendek bisa menghemat Anda dari mengulang batasan yang sama di setiap prompt. Misalnya:

```text
When using the shager MCP server:
Never pass schedule_at unless I explicitly give a date and time.
Always use per_channel captions when posting to more than one account.
Always pass cta_url for any link instead of pasting raw URLs into captions.
Use ISO 8601 with an offset for any time, in the workspace timezone.
```

Rules hanyalah panduan bagi model, bukan penegakan. Penegakannya ada pada scope kunci. Jangan beri `publish` pada kunci untuk editor, maka aturan pertama tidak bisa dilanggar meskipun model mengabaikannya.

## FAQ

### Apakah Cursor bisa memakai Shager tanpa OAuth?

Bisa. Cursor mengirim header apa pun yang Anda konfigurasikan, jadi kunci API bearer langsung berfungsi. Server MCP Shager juga mendukung login OAuth untuk klien yang lebih memilihnya, tetapi di Cursor kunci saja sudah cukup.

### Bisakah saya memakai kunci yang sama di Cursor dan Claude Code?

Bisa, tetapi kunci terpisah lebih baik. Setiap panggilan tercatat di log audit Shager atas nama kunci yang melakukannya, dan kunci terpisah memungkinkan Anda mencabut akses satu tool tanpa mengganggu yang lain. Pengaturan Claude Code punya panduan tersendiri dalam seri ini.

### Apakah agen akan langsung memposting jika saya bilang "publikasikan ini"?

Hanya jika kuncinya punya scope `publish`, akunnya sudah diklaim oleh manusia, dan workspace-nya tidak mewajibkan persetujuan klien lebih dulu. Dengan kunci read dan write, permintaan itu gagal dengan 403 yang jelas dan tidak ada yang terkirim.

## Langkah berikutnya

Setelah koneksi berjalan, keuntungan yang lebih besar datang dari prosedur yang bisa diulang, bukan dari prompt yang cerdik. Baca [cara membangun Claude skill untuk Shager](/en/blog/build-a-claude-skill-for-shager) untuk strukturnya, karena instruksi yang sama mudah diterjemahkan menjadi Cursor rules, dan biarkan [halaman agen](/en/agents) tetap terbuka sebagai referensi setiap tool dan field.

---
Source: https://shager.ai/id/blog/connect-shager-to-cursor
