MCP dan akses agen
Cara memberi agen akses yang aman ke sebuah brand, dan apa yang bisa serta tidak bisa dilakukannya.
Baca 4 menit
Apa itu token agen
Token agen adalah kredensial untuk program dari luar, misalnya asisten AI, yang bekerja pada satu brand. Awalannya atl_agent_, ATLAS menampilkannya sekali saat dibuat dan hanya menyimpan hash-nya.
Di balik setiap token ada pengguna agen tersembunyi dengan peran editor yang tetap. Pengguna itu tidak pernah muncul di daftar anggota. Karena perannya editor, aturan yang berlaku untuk manusia berlaku juga untuk agen: tipe konten dengan min_role lebih tinggi tidak terlihat olehnya, dan record milik brand lain dijawab 404.
Token agen membawa scope. Anda memilih minimal satu saat membuatnya.
| Scope | Yang diizinkan di pintu agen saat ini |
|---|---|
read | Membaca brand, tipe konten, skema block, entri (termasuk draf), revisi, term, menu, dan dashboard kecil. |
draft:write | Membuat entri draf, menyimpan draf, dan mengatur term pada entri draf. |
media:write, translate, review:request, settings:read | Bisa dibuat, tetapi belum ada route di pintu agen yang memakainya. |
Scope publish dan schedule tidak bisa dibuat. Memintanya dijawab 422.
Agen tidak pernah menerbitkan
Semua yang ditulis agen berupa revisi draf. Seseorang membukanya di dashboard, meninjau, lalu menerbitkannya. Tidak ada route terbitkan, jadwalkan, rollback, atau hapus di pintu agen, dan tidak ada tool seperti itu di endpoint MCP.
Membuat token agen
Admin mengaktifkan akses agen untuk brand terlebih dahulu. Pengaturan brand agent.enabled mati secara default. Selama mati, membuat token agen dijawab 403 agent_disabled.
/v1/manage/api-tokensIni panggilan dashboard, jadi butuh sesi admin yang sedang masuk dan header X-Brand-Id.
{
"name": "Content assistant",
"kind": "agent",
"scopes": ["read", "draft:write"],
"expires_in_minutes": 43200
}expires_in_minutes opsional. Nilainya antara 15 menit dan 129600 menit (90 hari), default 43200 (30 hari). Jawabannya 201 berisi baris token dan nilai token polos. Simpan segera di secret manager.
Mencabut token (DELETE /v1/manage/api-tokens/{token}) langsung menonaktifkan pengguna agen tersembunyi. Token agen yang kedaluwarsa juga dinonaktifkan oleh penyapu per jam.
Pintu agen
Pintu agen ada di https://api.atlascms.id/v1/agent. Token menentukan brand-nya, jadi Anda tidak mengirim X-Brand-Id maupun cookie.
curl -s "https://api.atlascms.id/v1/agent/entries?per_page=10" \
-H "Authorization: Bearer $ATLAS_AGENT_TOKEN"| Method | Path | Scope |
|---|---|---|
| GET | /v1/agent/brand | read |
| GET | /v1/agent/content-types, /v1/agent/content-types/{key} | read |
| GET | /v1/agent/block-schemas | read |
| GET | /v1/agent/entries, /v1/agent/entries/{entry}, /v1/agent/entries/{entry}/revisions | read |
| GET | /v1/agent/terms, /v1/agent/menus, /v1/agent/dashboard | read |
| POST | /v1/agent/entries | draft:write |
| PUT | /v1/agent/entries/{entry}/draft | draft:write |
| PUT | /v1/agent/entries/{entry}/terms | draft:write |
Daftar menerima per_page (default 20, maksimum 50). Unggah media, penulisan menu, pembuatan term, terjemahan, dan tinjauan belum ada di pintu ini.
Penulisan butuh idempotency key
Setiap penulisan harus membawa header Idempotency-Key berisi 16 sampai 64 huruf, angka, titik, titik dua, tanda hubung, atau garis bawah. Tanpa itu panggilan dijawab 422 idempotency_key_required.
curl -s -X POST "https://api.atlascms.id/v1/agent/entries" \
-H "Authorization: Bearer $ATLAS_AGENT_TOKEN" \
-H "Idempotency-Key: 01JD6N9V0Q8KZC3F5H7M2T4W6Y" \
-H "Content-Type: application/json" \
-d '{"type":"page","locale":"en","path":"/about","title":"About","blocks":[]}'- Mengulang dengan key dan isi yang sama memutar ulang jawaban pertama (header
Idempotent-Replay: true) dan tidak menulis apa pun. - Key yang sama dengan isi berbeda dijawab 422
idempotency_key_reuse. Panggilan saat yang pertama masih berjalan dijawab 409idempotency_in_progress. - Key berlaku per token dan disimpan 24 jam.
- Menyimpan draf butuh
base_revision_id, yaitu revisi terbaru yang dibaca agen. Jika seseorang sudah menyimpan di sela itu, jawabannya 409revision_changeddan tidak ada yang ditulis. - Menyimpan draf dari entri yang sudah terbit tidak pernah mengubah halaman yang tayang.
Batas dan kuota
| Batas | Nilai |
|---|---|
| Baca | 120 panggilan per menit per token dan 600 per menit per brand |
| Tulis | 30 per menit per token dan 150 per menit per brand |
| Tulis harian | 500 per token, lalu 429 agent_quota_exceeded |
| Ukuran body | 256 KiB, lalu 413 payload_too_large |
Batas lainnya dijawab 429 dengan header Retry-After.
Endpoint MCP jarak jauh
MCP adalah cara standar bagi klien AI untuk memanggil tool. POST /mcp membuka pintu agen sebagai server MCP jarak jauh, untuk klien yang tidak bisa menjalankan paket lokal.
- Endpoint ini mati secara default. Instalasi menyalakannya dengan
ATLAS_MCP_REMOTE=true. Selama mati, path-nya dijawab 404. - Memakai Streamable HTTP mode stateless: satu permintaan JSON-RPC per
POST, satu jawaban JSON.GET /mcpdijawab 405. - Autentikasi hanya
Authorization: Bearer atl_agent_.... Token di query string ditolak. - Permintaan dengan header
Originharus berasal dari origin yang tercantum diATLAS_MCP_ALLOWED_ORIGINS(kosong secara default), jika tidak dijawab 403. HTTP polos ditolak di produksi. - Saklar brand
agent.enabledtetap berlaku.
tools/list mengembalikan 13 tool. Sepuluh tool baca butuh scope read: get_brand, list_content_types, get_content_type, list_block_schemas, list_entries, get_entry, list_revisions, list_terms, list_menus, dan get_dashboard. Tiga tool tulis butuh draft:write: create_entry, save_draft, dan sync_entry_terms.
Pemanggilan tool menjalankan route agen yang sesuai di dalam proses, jadi scope, batas, kuota, dan baris audit sama seperti di pintu agen. Tool tulis membawa key-nya di params._meta.idempotencyKey.
{"jsonrpc": "2.0", "id": 3, "method": "tools/call", "params": {
"name": "create_entry",
"arguments": {"type": "page", "locale": "en", "path": "/about", "title": "About", "blocks": []},
"_meta": {"idempotencyKey": "01JD6N9V0Q8KZC3F5H7M2T4W6Y"}
}}Klien yang menerima header bisa dikonfigurasi seperti ini:
{
"mcpServers": {
"atlas": {
"type": "http",
"url": "https://api.atlascms.id/mcp",
"headers": { "Authorization": "Bearer ${ATLAS_AGENT_TOKEN}" }
}
}
}Biarkan klien membaca token dari environment atau secret store. Jangan pernah meng-commit-nya.
Keamanan dan kendali
- Konten adalah data, bukan instruksi. Teks bebas di jawaban berada di bawah
content, dan jawaban membawameta.trust: "untrusted_content". Hasil MCP mengulang peringatan itu. Perlakukan teks halaman sebagai input tak tepercaya di agen Anda. - String berbentuk token disamarkan. Nilai apa pun yang menyerupai token ATLAS diganti
[redacted]di jawaban. - Saklar pemutus. Matikan
agent.enableduntuk menghentikan pembuatan token agen baru. Untuk menghentikan token yang sudah diterbitkan, cabut token itu. Instalasi juga punya saklar platform yang menolak semua baca agen atau semua tulis agen sekaligus. - Baris audit. Setiap panggilan agen menulis baris audit
agent.callberisi tool, scope, hasil, dan status, tidak pernah body atau judul. Baris disimpan 90 hari. Admin bisa membacanya lewatGET /v1/manage/audit-logs?action=agent.call. - Hak minimum. Buat token dengan umur sesingkat dan scope sesedikit yang dibutuhkan pekerjaan, satu token per agen, dan rotasi dengan membuat token baru sebelum mencabut yang lama.
Token sync bukan token agen
Jenis token sync yang terpisah hanya ada untuk CI proyek sendiri saat menerbitkan dokumentasi dan changelog. Token itu tidak bisa dipakai sebagai token agen, dan Anda tidak membutuhkannya.
Untuk peran, jenis token, dan siapa yang boleh membuatnya, lihat peran dan izin. Untuk daftar lengkap jenis token, lihat token dan keamanan.
Apakah halaman ini membantu?