Bot WhatsApp multi-fitur berbasis zapo-js β 700+ plugin, ESM murni, hot-reload.
Pemakaian
Pengembangan
Lain-lain
| Perubahan | Keterangan |
|---|---|
| Pindah ke zapo-js | Library WhatsApp diganti dari Baileys ke zapo-js. Dokumentasi & MCP di zapo.to/mcp |
| ESM (ECMAScript Modules) | Semua file pakai import/export native, bukan require |
| Server HTTP native | Dependensi express dibuang, pakai modul http bawaan Node |
| Sesi lokal SQLite | Kredensial WhatsApp di sessions/state.sqlite (@zapo-js/store-sqlite + better-sqlite3) |
| Database bot 3 tipe | sqlite (default), json, atau mongodb β pilih di config.js. Semua file database ada di folder database/ |
| Login dual mode | QR Code (default) atau Pairing Code, diatur lewat usePair di config.js |
API key lewat .env |
Key bisa diisi di .env supaya tidak ikut ter-commit |
| Update LID resolver | Penanganan JID @lid (format baru WhatsApp) diperbarui |
| Wajib Node.js 22+ | Versi di bawah 22 ditolak saat boot |
| Database aman saat stop | Database di-flush saat bot berhenti, bukan cuma tiap 30 detik |
| Pengaturan privasi akun | .privacy β last seen, foto profil, siapa boleh menambahkan ke grup, deny-list per kategori |
| Pengaturan per-chat | .chat β pin, arsip, mute, tandai baca/belum baca, lock. Tersinkron ke semua perangkat tertaut |
| Pesan sementara grup | .pesansementara off/24jam/7hari/90hari |
| Komponen | Keterangan |
|---|---|
| Node.js | Versi 22 atau lebih baru (dicek saat boot, di bawah itu langsung exit) |
| ffmpeg | Pemrosesan video & audio |
| imagemagick | Manipulasi gambar |
| webp | Konversi stiker |
| python3 | Opsional β hanya untuk .speedtest (menjalankan speed.py) |
Saat pertama jalan, bot mengecek tool-tool ini dan menampilkan hasilnya (x/7 tools found). Fitur yang butuh tool yang hilang akan gagal, tapi bot tetap jalan.
Catatan: Script ini tidak mendukung eksekusi di Termux.
Unduh dan instal:
- Git
- Node.js 22+
- FFmpeg β tambahkan ke PATH
- ImageMagick
apt update && apt upgrade -y
apt install nodejs imagemagick ffmpeg -y
node -v
# Jika versi masih di bawah 22:
curl -s https://deb.nodesource.com/setup_22.x | sudo bash
apt-get install -y nodejsgit clone https://github.com/BOTCAHX/RTXZY-MD
cd RTXZY-MD
npm install
cp .env.example .env # lalu isi API key-nyadocker build -t rtxzy-md .
docker run -it -p 5000:5000 rtxzy-mdPakai -it supaya QR Code atau prompt nomor bisa muncul dan terbaca. Agar sesi & data tidak hilang setiap container dibuat ulang, mount volume untuk sessions/ dan database/:
docker run -it -p 5000:5000 \
-v "$PWD/sessions:/app/sessions" \
-v "$PWD/database:/app/database" \
rtxzy-mdCaranya tergantung letak file:
Opsi 1 β File langsung di /home/container (bukan dalam folder):
- Set startup ke
node index.jsataunpm start
Opsi 2 β File berada dalam folder (contoh /home/container/RTXZY-MD):
- Buka Terminal panel, lalu install dependensinya:
cd RTXZY-MD # atau nama folder kamu npm install
- Set startup panel ke
node RTXZY-MD/index.js(sesuaikan nama foldernya)
Catatan:
sessions/,database/, dantmp/dibuat relatif terhadap direktori kerja panel, bukan folder bot. Jadi dengan startup di atas, folder-folder itu muncul di/home/container. Kalau ingin semuanya rapi di dalam satu folder, pakai Opsi 3.
Opsi 3 β Pindahkan semua file ke /home/container:
Pindahkan semua isi folder bot langsung ke /home/container, lalu set startup ke node index.js atau npm start.
Cara upload file ke panel:
Bot bisa di-clone via git clone langsung dari terminal panel, atau diupload sebagai arsip. Rekomendasi:
- Download repo sebagai ZIP dari GitHub
- Edit file (
config.js,.env, dll) di lokal - Upload ke panel sebagai ZIP atau tar.gz, lalu extract di panel
Panel biasanya punya batas view per file, jadi editing lokal lalu upload arsip lebih praktis.
Konfigurasi tiap panel bisa berbeda. Pahami struktur folder server kamu dan sesuaikan startup command-nya.
Pastikan Node.js egg yang dipakai versi 22+, kalau tidak bot akan error.
Kalau panel tidak punya akses bash sama sekali, gunakan Opsi 1 atau Opsi 3.
Semua pengaturan bot ada di satu file: config.js. File ini di-watchFile β begitu disimpan, config langsung dimuat ulang tanpa restart bot.
| Field | Wajib | Keterangan |
|---|---|---|
owner.number |
β | Nomor owner, format internasional tanpa + (contoh 628xxx) |
owner.name |
β | Nama owner, dipakai di beberapa pesan |
owner.mail |
Email owner | |
usePair |
false = login QR Code (default), true = Pairing Code |
|
botNumber |
Nomor bot. Hanya dipakai saat usePair: true; kalau kosong, nomor diminta lewat prompt terminal |
|
pairingCode |
Kode pairing custom, wajib 8 karakter | |
prefix |
β | Array karakter prefix, satu karakter per entry: ['.', '#', '!', '/'] |
database |
Tipe & lokasi database β lihat Database | |
access.owner |
β | Array nomor dengan akses owner penuh (plugin bertanda rowner/owner) |
access.mods |
β | Array nomor moderator (plugin bertanda mods) |
access.prems |
β | Array nomor premium |
links.group / links.instagram |
Link yang ditampilkan di beberapa menu | |
branding.watermark |
Nama bot, dipakai di footer pesan | |
branding.stickerPackname / stickerAuthor |
Metadata EXIF stiker | |
branding.thumb |
URL thumbnail default | |
messages.wait / error / stickerWait |
Template balasan untuk plugin wait: true, error, dan pembuatan stiker |
|
maxWarn |
Jumlah peringatan sebelum user ditindak | |
api.* |
β | Endpoint & key API β lihat API Key |
Bot ini menggunakan 97% fitur dari Rest API, jadi kamu wajib mengisi apikey.
- Daftar di
BOTCAHX API - Pilih paket yang sesuai:
Lihat Paket - Copy apikey kamu
| Tipe | Batas |
|---|---|
| Free | 15 request/hari |
| Premium | Sesuai paket yang dibeli (recommended) |
Ada dua cara mengisinya. Lewat .env (disarankan) β key tidak ikut ter-commit karena .env sudah masuk .gitignore:
cp .env.example .envBOTCAHX_APIKEY=apikey_kamu
BOTCAHX_AKSESKEY=akseskey_kamu # opsional, untuk suno ai & fitur premium
WHOISJSON_KEY=key_kamu # opsional, untuk .whois2Atau langsung di config.js pada api.botcahx.key. Nilai di config.js hanya dipakai kalau variabel .env-nya kosong.
Semua plugin memakai key ini lewat helper Api di lib/system/api.js β apikey disuntik otomatis ke setiap URL, tidak perlu ditulis manual per plugin.
Database bot menyimpan users, chats, stats, msgs, dan sticker. Isinya ditulis otomatis setiap 30 detik, dan sekali lagi saat bot berhenti (Ctrl+C, SIGTERM, atau restart) supaya perubahan di antara dua penulisan tidak hilang.
database: {
type: 'sqlite', // 'sqlite' | 'json' | 'mongodb'
mongoUrl: '' // wajib diisi kalau type: 'mongodb'
},| Tipe | Lokasi data | Catatan |
|---|---|---|
sqlite (default) |
database/database.sqlite |
Mode WAL, satu baris per entry β tidak menulis ulang seluruh file setiap simpan |
json |
database/database.json |
Satu file JSON, ditulis ulang penuh setiap simpan |
mongodb |
Server MongoDB | Isi mongoUrl, contoh mongodb://user:pass@host:27017/bot |
Catatan penting:
- Semua file database ada di folder
database/. Kalau kamu upgrade dari versi lama yang menyimpandatabase.jsondi root, datanya diimpor sekali otomatis pada boot pertama. File lama tidak dihapus, jadi aman sebagai backup. - Argumen
--dbmenimpadatabase.typetanpa mengubahconfig.js. - Kalau
type: 'mongodb'tapimongoUrlkosong, bot berhenti dengan pesan error β bukan diam-diam jatuh ke SQLite. - Menjalankan beberapa bot di satu folder: argumen posisional jadi prefix nama file, misal
node index.js bot2memakaidatabase/bot2_database.sqlite. - Saat berhenti, supervisor menunggu maksimal 5 detik sampai
main.jsselesai menyimpan sebelum ikut keluar. Kalau lewat, prosesnya dipaksa mati dan log-nya berbunyimain.js tidak berhenti dalam 5s, dipaksa.
Logika pemilihan adapter ada di lib/database/adapter.js, dan bisa diuji sendiri:
node lib/database/adapter.js # -> adapter.js self-check OKnpm start
# atau
node index.jsSecara default QR Code muncul di terminal β scan dari WhatsApp di HP (Perangkat tertaut β Tautkan perangkat). Kalau QR di terminal terlalu besar atau rusak, bot juga mencetak link untuk scan lewat browser.
Mau pakai Pairing Code? Set di config.js:
usePair: true,
botNumber: '628xxxxxxxxxx', // kosongkan kalau mau diminta lewat prompt
pairingCode: 'ABCD1234', // wajib 8 karakterKode 8 karakter akan muncul di terminal β masukkan di HP lewat Perangkat tertaut β Tautkan dengan nomor telepon.
Sesi tersimpan di sessions/state.sqlite, jadi login cuma sekali. Kalau bot gagal link dengan pesan "Couldn't link device", hapus folder sessions/ lalu jalankan ulang.
node index.js [--options]Autentikasi
| Argumen | Fungsi |
|---|---|
--qr |
Paksa mode QR Code, mengabaikan usePair di config.js |
Batasan respon
| Argumen | Fungsi |
|---|---|
--self |
Hanya merespon owner & bot sendiri |
--pconly |
Hanya merespon chat pribadi |
--gconly |
Hanya merespon chat grup |
--swonly |
Hanya merespon status |
--nyimak |
Mode silent β hanya log, tidak membalas |
--restrict |
Aktifkan plugin bertag admin (berisiko kena banned) |
Database
| Argumen | Fungsi |
|---|---|
--db sqlite |
Pakai SQLite (database/database.sqlite) |
--db json |
Pakai file JSON (database/database.json) |
--db <mongodb url> |
Pakai MongoDB, contoh --db mongodb://user:pass@host:27017/bot |
--db <https://...> |
Pakai cloud adapter |
Tanpa --db, bot memakai database.type dari config.js.
Lain-lain
| Argumen | Fungsi |
|---|---|
--prefix <prefix> |
Override prefix (setiap karakter jadi prefix terpisah) |
--autoread |
Tandai semua pesan masuk sebagai sudah dibaca |
--queque |
Antrikan pesan masuk (delay 1 detik per pesan di antrian) |
--img |
Tampilkan gambar di terminal |
--tmp |
Matikan pembersihan otomatis folder tmp (default: file lebih dari 3 menit dihapus tiap 30 detik) |
--test |
Mode pengembangan β matikan penulisan database & pembersihan tmp berkala |
--debug-lid |
Log tambahan untuk debugging resolusi JID @lid |
<nama> |
Argumen posisional jadi prefix nama sesi & file database (multi-bot) |
Bot membuka HTTP server di process.env.PORT (atau port acak kalau tidak diset) yang membalas GET / dengan status JSON β dipakai platform hosting untuk health check.
index.js Supervisor: HTTP health server, spawn main.js, auto-restart
main.js Wiring: config, database, plugin loader, hot-reload
config.js Semua pengaturan bot
handler.js Router pesan: parsing prefix, cek izin, jalankan plugin
test.js Cek sintaks + lint semua file (npm test)
lib/
simple.js Layer kompatibilitas: ~90 helper di objek conn (sendFile, reply, dll)
system/
connection.js Setup koneksi zapo-js, login QR/pairing, translasi event
userDefaults.js Nilai default untuk entry user & chat di database
api.js Client API botcahx (apikey otomatis)
print.js Log pesan masuk ke terminal
levelling.js Rumus level & XP
functions.js Helper umum
database/
adapter.js Pemilihan adapter database (sqlite/json/mongodb/cloud)
sqliteDB.js Adapter lowdb berbasis SQLite
mongoDB.js Adapter lowdb berbasis MongoDB
cloudDBAdapter.js Adapter lowdb berbasis HTTP
media/ Konversi stiker, webp, gambar, video
games/ State game (werewolf, tictactoe, ular tangga, dll)
plugins/ Semua fitur bot, satu file = satu fitur
_events/ Hook otomatis tanpa perintah (autodownload, anti-link, dll)
main/ core/ owner/ group/ tools/ info/
downloader/ internet/ news/ ai/ maker/ sticker/ stalker/
rpg/ game/ xp/ fun/ quotes/ islam/ primbon/ misc/ cmd/
sessions/ Kredensial WhatsApp (SQLite) β jangan di-commit
database/ Data bot β jangan di-commit
tmp/ File media sementara, dibersihkan otomatis
index.js ββspawnβββΆ main.js βββΆ config.js
β β
β βββΆ database (lowdb + adapter)
β βββΆ createClient() βββΆ lib/system/connection.js βββΆ zapo-js WaClient
β βββΆ authenticate() βββΆ QR / Pairing Code
β βββΆ load semua plugins/**/*.js
β βββΆ reloadHandler() βββΆ handler.js
β
βββΆ restart otomatis kalau main.js exit / error
index.js adalah proses induk: ia menyalakan HTTP health server, lalu menjalankan main.js sebagai child process dengan channel IPC. Kalau child mati atau melempar error, induk menghidupkannya kembali. Ini juga yang membuat perintah restart dari dalam bot bisa bekerja.
zapo-js punya API sendiri yang berbeda dari Baileys, sedangkan ratusan plugin di repo ini ditulis untuk gaya Baileys. Jembatannya ada dua lapis:
lib/system/connection.jsmembungkusWaClientjadi objek yang bentuknya seperti socket Baileys (conn.ev,conn.authState,conn.user,conn.ws) dan menerjemahkan setiap event zapo-js ke nama event Baileys (messages.upsert,group-participants.update,connection.update, dan seterusnya).lib/simple.jsmenempelkan ~90 method helper ke objek itu lewatattach()βsendMessage,sendFile,reply,downloadM,groupMetadata,copyNForward, dan lainnya.
Efeknya: plugin tidak perlu tahu library WhatsApp mana yang dipakai di bawahnya.
zapo-jsmenerima pesan,connection.jsmenerjemahkannya, lalu emitmessages.upsert.handler.jsmenerima, memanggilsmsg()untuk membuat objekmyang mudah dipakai.- Default user & chat diisi lewat
ensureUserAndChatDefaults(). - Semua plugin dengan hook
alldijalankan. - Semua plugin dengan hook
beforedijalankan β di sini fitur otomatis seperti autodownload bekerja. - Prefix dicocokkan,
commanddicari, izin dicek, lalurunplugin yang cocok dijalankan. Pencarian berhenti pada plugin pertama yang cocok. - XP, limit, dan statistik dicatat; pesan dicetak ke log terminal.
Bot tidak perlu restart saat kamu mengedit kode:
| File yang diubah | Yang terjadi |
|---|---|
plugins/**/*.js |
Plugin itu di-import ulang. Kalau ada syntax error, error dicetak dan versi lama tetap dipakai |
handler.js |
Handler di-import ulang, listener dipasang ulang |
config.js |
Config dimuat ulang |
main.js |
Bot restart penuh oleh index.js |
Satu file di plugins/ = satu fitur. Simpan file baru di kategori yang sesuai, bot langsung memuatnya tanpa restart.
// plugins/tools/ping.js
const handler = {
help: ['ping'],
tags: ['tools'],
command: ['ping', 'p'],
run: async (m, { conn }) => {
await m.reply('Pong!');
}
};
export default handler;Contoh dengan argumen, limit, dan validasi:
// plugins/internet/translate.js
const handler = {
help: ['tr'],
usage: 'leng text',
tags: ['tools'],
command: ['translate', 'tl', 'tr'],
limit: 1,
run: async (m, { args, usedPrefix, command }) => {
if (!args[0]) throw `*β’ Contoh:* ${usedPrefix}${command} id how are you`;
// ... proses ...
await m.reply('hasil terjemahan');
}
};
export default handler;Identitas & menu
| Properti | Tipe | Fungsi |
|---|---|---|
command |
string | RegExp | array |
Perintah yang memicu plugin |
hidden |
array |
Alias tambahan yang dikenali tapi tidak muncul di menu |
help |
array |
Nama perintah yang ditampilkan di .menu |
usage |
string |
Petunjuk argumen di .menu, contoh 'nama_guild' |
tags |
array |
Kategori menu (tools, rpg, downloader, game, owner, dan lainnya) |
disabled |
boolean |
Matikan plugin tanpa menghapus file |
Prefix
| Properti | Tipe | Fungsi |
|---|---|---|
noPrefix |
boolean |
Perintah jalan tanpa prefix |
customPrefix |
string | RegExp | array |
Prefix khusus untuk plugin ini |
Izin & syarat β kalau tidak lolos, bot membalas pesan penolakan standar dan plugin dilewati
| Properti | Syarat |
|---|---|
rowner |
Hanya nomor di access.owner |
owner |
Owner atau pesan dari bot sendiri |
mods |
Owner atau nomor di access.mods |
premium |
User premium |
group |
Hanya di grup |
private |
Hanya di chat pribadi |
admin |
Pengirim harus admin grup |
botAdmin |
Bot harus admin grup |
register |
User harus sudah .daftar |
rpg |
Fitur RPG harus aktif di chat itu |
nsfw |
Fitur NSFW harus aktif di chat itu |
limit |
number β limit yang dipotong per pemakaian |
level |
number β level minimum user |
Lain-lain
| Properti | Tipe | Fungsi |
|---|---|---|
exp |
number |
XP yang didapat user (default 17) |
wait |
boolean |
Balas messages.wait dulu sebelum run |
fail |
function |
Handler custom saat izin tidak lolos (default global.dfail) |
| Hook | Kapan jalan | Catatan |
|---|---|---|
run(m, extra) |
Saat perintah cocok | Isi utama plugin |
before(m, extra) |
Setiap pesan, sebelum parsing perintah | Return nilai truthy untuk menghentikan pemrosesan plugin ini |
after(m, extra) |
Setelah run, di blok finally |
Jalan walaupun run error |
all(m, chatUpdate, Api) |
Setiap pesan, paling awal | Untuk fitur pasif |
Plugin di plugins/_events/ umumnya hanya memakai before atau all β itulah cara fitur otomatis seperti autodownload link bekerja.
| Properti | Isi |
|---|---|
m.chat |
JID chat (grup atau pribadi) |
m.sender |
JID pengirim |
m.participant |
Pengarang pesan, selalu terisi β key.participant hanya ada di grup |
m.isGroup |
true kalau dari grup |
m.fromMe |
true kalau pesan dari bot sendiri |
m.text |
Isi teks pesan |
m.name |
Nama tampilan pengirim |
m.senderUsername |
Username WhatsApp pengirim, null kalau tidak ada |
m.mtype |
Tipe pesan (conversation, imageMessage, dan seterusnya) |
m.mentionedJid |
Array JID yang di-mention |
m.quoted |
Pesan yang di-reply, null kalau tidak ada |
m.id / m.key |
ID & key pesan |
| Method | Fungsi |
|---|---|
m.reply(text) |
Balas pesan |
m.download(saveToFile) |
Unduh media pesan jadi Buffer (atau file) |
m.delete() |
Hapus pesan |
m.copyNForward(jid) |
Teruskan pesan ke chat lain |
m.quoted.download() |
Unduh media dari pesan yang di-reply |
m.quoted.reply(text) |
Balas ke pesan yang di-reply |
m.getQuotedObj() |
Ambil pesan yang di-reply sebagai objek m lengkap |
| Nama | Isi |
|---|---|
conn |
Objek koneksi, semua helper lib/simple.js ada di sini |
Api |
Client API botcahx, apikey otomatis |
command |
Nama perintah yang dipakai user |
usedPrefix |
Prefix yang dipakai user |
args |
Argumen sebagai array |
text |
Argumen sebagai satu string |
groupMetadata |
Metadata grup |
participants |
Daftar anggota grup |
user / bot |
Entry peserta grup untuk pengirim dan bot |
isOwner / isROwner |
Status owner |
isAdmin / isBotAdmin |
Status admin grup |
isPrems |
Status premium |
chatUpdate |
Event mentah dari WhatsApp |
await conn.sendFile(m.chat, url, 'nama.jpg', 'caption', m); // kirim media apa pun
await conn.sendMessage(m.chat, { text: 'hai', mentions: [jid] }); // kirim dengan mention
await conn.sendImageAsSticker(m.chat, buffer, m); // gambar jadi stiker
await conn.reply(m.chat, 'teks', m); // balasan
const buffer = await conn.getFile(url); // unduh file
const name = await conn.getName(jid); // nama kontak/grup
const handle = await conn.getUsername(jid); // username WhatsApp, null kalau tidak adaconn.getUsername() di-cache, termasuk hasil negatifnya, jadi aman dipanggil
per pesan. Lewati jaringan sepenuhnya dengan conn.getUsername(jid, true).
conn.getName() sendiri sudah memakai username sebagai fallback sebelum
menampilkan digit LID mentah.
Pengaturan per-chat dipanggil lewat conn.chatModify(mods, jid), bentuk yang
sama seperti Baileys β satu operasi per panggilan:
await conn.chatModify({ archive: true }, m.chat);
await conn.chatModify({ pin: true }, m.chat);
await conn.chatModify({ mute: 8 * 3600 * 1000 }, m.chat); // milidetik; null = unmute
await conn.chatModify({ markRead: true }, m.chat);
await conn.chatModify({ clear: 'all' }, m.chat);
await conn.chatModify({ delete: true }, m.chat);mods yang tidak dikenal melempar error, bukan diabaikan β kalau salah
tulis, kamu tahu langsung dan tidak menyangka pengaturannya tersimpan. Semua ini
app-state mutation: ikut tersinkron ke perangkat lain yang tertaut, dan hanya
mengubah tampilan akun bot, bukan tampilan peer.
Perubahan username kontak, rotasi LID, dan status kuota pesan keluar datang lewat satu event:
conn.ev.on('mex.notification', (ev) => {
if (ev.kind === 'username_set') console.log(ev.lidJid, '->', ev.username);
if (ev.kind === 'message_capping') console.log(ev.cappingStatus, ev.usedQuota, '/', ev.totalQuota);
});kind yang tersedia: username_set, username_delete, username_update_hint,
own_username_sync, text_status_update, text_status_update_hint,
lid_change, message_capping, unknown. Bot sudah otomatis mencetak
peringatan ke terminal kalau message_capping bukan NONE β itu tanda akun
mendekati batas kirim.
Pakai global.db.data β jangan menulis file database secara manual. Perubahan pada objek ini otomatis disimpan setiap 30 detik, apa pun tipe database yang dipakai.
const user = global.db.data.users[m.sender];
user.money += 1000;
const chat = global.db.data.chats[m.chat];
if (chat.antilink) {
/* ... */
}throw dengan string dipakai untuk pesan validasi β teksnya dibalas apa adanya ke user:
if (!text) throw `*β’ Contoh:* ${usedPrefix}${command} halo`;Error asli (bug, request gagal, dan sejenisnya) tidak pernah dibalas mentah ke chat: user hanya menerima messages.error, sementara detail lengkapnya masuk ke log server. Ini disengaja β stack trace bisa membocorkan path server, dan API key di dalamnya disensor jadi #HIDDEN#.
npm test # cek sintaks + lint seluruh file
npm run lint # eslint
npm run lint:fix # eslint + perbaiki otomatis
npm run format # prettier --writeJalankan npm test sebelum commit. Ia mengecek setiap file bisa di-parse dan lolos lint, jadi plugin yang rusak ketahuan sebelum bot dijalankan.
Bot ini menyertakan @zapo-js/mcp-server β server Model Context Protocol yang mengekspos sesi zapo-js (koneksi, pairing, kirim pesan, query grup, inspeksi event) sebagai tools untuk LLM agent (Claude Code, Cursor, dan lainnya). Cocok untuk development/testing, bukan production.
npm run mcp # = zapo-mcp-server (stdio)
MCP_TRANSPORT=http MCP_AUTH_PATH=sessions/mcp.sqlite zapo-mcp-server| Variabel | Fungsi |
|---|---|
MCP_AUTH_PATH |
Path store SQLite kredensial. Gunakan path terpisah dari bot utama (mis. sessions/mcp.sqlite) supaya tidak terjadi konflik SQLITE_BUSY saat bot & MCP jalan bersamaan |
MCP_SESSION_ID |
Sesi default (mendukung multi-sesi di satu store) |
MCP_MAX_SESSIONS |
Batas jumlah sesi |
MCP_TRANSPORT |
stdio (default) atau http |
MCP_LOG_LEVEL |
Level log |
claude mcp add zapo -- node node_modules/@zapo-js/mcp-server/dist/bin.jsclient.connect() memblokir sampai pairing selesai β selalu panggil dengan noAwait:
call({ path: 'connect', noAwait: true })
events({ types: ['auth_qr', 'auth_pairing_code', 'auth_paired', 'connection'] })
# tampilkan QR ke user, tunggu auth_paired, lalu lanjut
call({ path: 'message.send', args: ['628xxx@s.whatsapp.net', { conversation: 'halo' }] })
Dokumentasi lengkap & skill MCP ada di zapo.to/mcp.
| Tio | Erlan | Bochilgaming | Nurutomo |
|---|---|---|---|
| Recode | Contributor | Sepuh | Sepuh |
Base original: ZukaBet



