Pidgeon
resmiKotak masuk email untuk agen AI: alamat mereka sendiri, utas, pengiriman, balasan, dan email masuk.
Apa yang bisa Anda lakukan dengan Pidgeon MCP?
- Baca kotak masuk — Daftar alamat, utas, dan pesan, lalu telusuri semua alamat yang dapat dijangkau oleh kunci.
- Kirim dan balas — Kirim dari alamat yang diizinkan, balas dengan penerima dan subjek yang diambil dari pesan asli, atau teruskan dengan lampiran.
- Tunggu kode verifikasi — Tunggu pesan masuk dan dapatkan kode serta tautan konfirmasi yang diekstrak, misalnya setelah mengirim formulir pendaftaran.
- Buat draf untuk persetujuan — Tulis draf tanpa mengirimnya, lalu periksa apakah seseorang menyetujui, menolak, atau membiarkannya kedaluwarsa.
- Kelola label dan folder — Buat label untuk setiap alamat, terapkan atau hapus label pada percakapan, dan tampilkan daftar folder beserta jumlahnya.
- Tangani undangan kalender — Baca agenda dan acara suatu alamat, buat atau perbarui acara, serta terima, tolak, atau jawab undangan dengan tentatif.
Server MCP Terhosting
npx add-mcp 'https://pidgeon.ai/api/mcp'Terpasang ke Claude Code, Codex, Cursor, dan lainnya
Dokumentasi
Agen dapat langsung mengelola kotak masuk Pidgeon: membacanya, membalas dari sana, dan membuat alamat di dalamnya. Pidgeon menggunakan Model Context Protocol melalui API yang sama dengan yang dijelaskan dalam dokumentasi ini — sebuah adaptor protokol, tidak lebih.
Ada dua cara untuk mengaksesnya, dan keduanya menggunakan server yang sama. Versi hosted tidak perlu diinstal; paketnya menjalankan server di mesin Anda.
Hosted, berupa URL
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp
Panggilan pertama menjawab 401, lalu klien mengarahkan Anda ke Pidgeon untuk masuk. Anda memilih apa saja yang boleh dilakukannya — membaca, membaca dan mengirim, atau akses penuh — serta apa saja yang boleh diaksesnya: satu alamat, atau semua alamat jika Anda pemilik akun. Pilihan itu menjadi kunci API, dan klien menyimpan token untuk kunci tersebut. Kunci ini muncul di Developers → API keys → Connected apps, dan memilih Disconnect di sana akan mengakhiri akses pada panggilan klien berikutnya.
Claude's custom connectors, ChatGPT, Grok, Cursor, Codex, dan VS Code menggunakan URL yang sama dan proses masuk yang sama. Setiap permintaan dijawab secara mandiri: server tidak menyimpan sesi karena tidak memiliki status sendiri yang perlu dipertahankan.
Untuk agen yang tidak memiliki orang yang bisa masuk, kirimkan kunci:
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp \
--header "Authorization: Bearer $PIDGEON_API_KEY"
x-api-key juga bisa digunakan. Panduan langkah demi langkah untuk Cursor, Codex (yang membaca TOML, bukan JSON), dan VS Code; Windsurf dan Gemini CLI menggunakan URL dan header yang sama.
Di Grok
Di Grok, buka Connectors → Custom, tempel https://pidgeon.ai/api/mcp, lalu masuk di layar persetujuan; kunci tidak diperlukan (panduan langkah demi langkah). Muse dari Meta sedang ditinjau oleh Meta.
Di Cursor
Tambahkan Pidgeon ke Cursor dari listing-nya di cursor.directory, yang menyertakan server hosted dan skill.
Atau tambahkan server secara manual di ~/.cursor/mcp.json (atau .cursor/mcp.json untuk satu proyek). URL saja sudah cukup; Cursor akan meminta Anda masuk pada panggilan pertama:
{
"mcpServers": {
"pidgeon": {
"url": "https://pidgeon.ai/api/mcp"
}
}
}
Untuk agen yang tidak memiliki orang yang bisa masuk, tambahkan "headers": { "Authorization": "Bearer ${env:PIDGEON_API_KEY}" } di samping URL, lalu Cursor akan mengisinya dari lingkungan Anda.
Codex, VS Code, dan Gemini CLI
Untuk Codex, VS Code, dan Gemini CLI, satu perintah menulis server ke file milik klien:
npx -y @pidgeon-ai/mcp init --client codex # ~/.codex/config.toml
npx -y @pidgeon-ai/mcp init --client vscode # .vscode/mcp.json
npx -y @pidgeon-ai/mcp init --client gemini # .gemini/settings.json
Jika tidak ada kunci yang ditetapkan, perintah ini hanya menulis URL, lalu klien akan meminta Anda masuk. Jika PIDGEON_API_KEY ditetapkan, perintah ini akan memeriksa kunci terlebih dahulu, lalu meminta klien membacanya dari variabel tersebut (Codex, Gemini CLI) atau meminta Anda memasukkannya sekali (VS Code), sehingga kunci tidak pernah tersimpan di file. Perintah ini menambahkan konfigurasi ke isi yang sudah ada, termasuk komentar, menyalin file yang diubah ke <file>.bak, tidak melakukan apa pun pada pemanggilan kedua, dan hanya mengganti entri pidgeon yang berbeda jika disertai --force. --scope user atau --scope project memilih file lainnya; --print tidak menulis apa pun.
Atau diinstal sebagai paket
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp init
Perintah ini memeriksa kunci terhadap API sebelum menulis apa pun, lalu memberi tahu alamat mana saja yang dapat diaksesnya — satu-satunya pertanyaan yang tidak bisa dijawab oleh blok JSON, dan yang jika tidak, baru akan diketahui saat model diam-diam menerima error yang tidak pernah Anda lihat. Setelah itu, perintah ini menulis .mcp.json di direktori saat ini dan menampilkan isi yang ditulisnya. Perintah ini tidak pernah mengganti entri yang sudah ada: --force yang melakukannya, sedangkan --print menampilkan konfigurasi tanpa menulis apa pun. Gunakan opsi ini jika klien Anda menyimpan konfigurasinya sendiri di lokasi lain.
Kunci dirujuk dari lingkungan, bukan ditulis ke file, sehingga konfigurasi dapat di-commit tanpa menyertakan kredensial:
{
"mcpServers": {
"pidgeon": {
"command": "npx",
"args": ["-y", "@pidgeon-ai/mcp"],
"env": { "PIDGEON_API_KEY": "${PIDGEON_API_KEY}" }
}
}
}
Claude Desktop atau klien MCP lainnya menggunakan blok yang sama. Untuk menjalankan server secara langsung, yang biasanya berguna hanya untuk melihat proses startup:
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp
PIDGEON_BASE_URL mengarahkannya ke tempat selain production, yang hanya berguna jika Anda menjalankan Pidgeon sendiri.
Kunci adalah keseluruhan kontrol akses
Ini memberikan kunci API kepada model — kunci yang Anda buat sendiri atau yang Anda berikan dengan masuk. Paket ini tidak menentukan apa yang boleh diakses: batas kunci itu sendiri dan alamat yang diberikan kepadanya menentukan semuanya, di sisi server, persis seperti untuk pemanggil lainnya. Tidak ada aturan tambahan di sini yang bisa salah diterapkan.
Jadi, berikan kunci sesempit mungkin sesuai kebutuhan agen. Kunci yang dibuat di read tidak akan pernah bisa mengirim, seberapa luas pun akses kotak masuk yang diberikan kepadanya — lihat Authentication untuk memahami cakupan akses kunci dan cara membatasinya. Agen yang hanya melakukan triase sebaiknya memegang kunci yang hanya bisa membaca. Dengan begitu, pertanyaan apakah agen mungkin mengirim sesuatu yang memalukan bukan lagi soal prompt.
Cakupan akses kunci merupakan snapshot alamat yang diberikan kepadanya, jadi alamat yang dibuat setelah kunci tersebut tidak termasuk di dalamnya.
Yang disediakan
Semua 42 tool, dibaca dari daftar milik server sendiri agar halaman ini selalu sesuai:
| Tool | Fungsi | Endpoint |
|---|---|---|
list_addresses | Alamat yang dapat diakses oleh kredensial ini. | GET /identities |
create_address | Membuat alamat untuk digunakan agen. | POST /identities |
get_address | Satu alamat, berdasarkan id. | GET /identities/{id} |
list_threads | Percakapan dalam satu alamat, dari yang terbaru. | GET /threads |
get_thread | Satu percakapan, berdasarkan id. | GET /threads/{id} |
list_messages | Pesan dalam satu percakapan, dari yang terlama — teks yang perlu dibaca sebelum membalas. | GET /messages |
search_messages | Pencarian teks lengkap di semua alamat yang dapat diakses kredensial ini, diurutkan berdasarkan relevansi. | GET /messages/search |
send_message | Mengirim dari alamat yang diizinkan untuk digunakan mengirim oleh kredensial ini. | POST /messages |
get_message | Satu pesan, berdasarkan id, beserta isi, header yang kami simpan, dan bukti dari catatan domain pengirim — authentication.spf\, .dkim\, .dmarc\, dengan null berarti tidak dilaporkan, bukan gagal. | GET /messages/{id} |
await_message | Menunggu hingga pesan tiba di suatu alamat — misalnya setelah Anda mengirim formulir pendaftaran — lalu mengembalikannya beserta extracted.codes\ dan extracted.links\: kode verifikasi dan tautan konfirmasi ditampilkan lebih dahulu. | GET /messages/await |
reply_to_message | Penerima, subjek, dan utas diambil dari pesan yang dibalas, jadi Anda hanya perlu menulis isi pesannya. | POST /messages/{id}/reply |
forward_message | Meneruskan satu pesan kepada seseorang yang bukan penerima awalnya, beserta lampirannya, dari alamat yang menerima pesan tersebut. | POST /messages/{id}/forward |
create_draft | Menulis pesan tanpa mengirimkannya, agar dapat dibaca dan dikirim oleh manusia — gunakan saat Anda diminta menyiapkan balasan untuk disetujui. | POST /drafts |
get_draft_approval | Status pengiriman tertahan, berdasarkan draft\_id\-nya: pending\ hingga seseorang menyetujui atau menolaknya di dasbor, lalu menjadi approved\ (pesan telah dikirim, dan message\_id\ adalah pesannya), rejected\, atau expired\ setelah 24 jam tanpa keputusan. | GET /drafts/{id}/approval |
list_drafts | Semua draf di satu alamat, dari yang terbaru, beserta penerima dan isi pesannya — agar Anda dapat kembali dan menyelesaikan salah satunya. | GET /drafts |
get_draft | Satu draf berdasarkan id: pengirim, penerima, subjek, teks, dan lampirannya. | GET /drafts/{id} |
update_draft | Mengubah kolom yang Anda berikan dan membiarkan sisanya; null\ mengosongkan subjek atau teks. | PATCH /drafts/{id} |
delete_draft | Menghapus satu draf dan membatalkan pengirimannya jika dijadwalkan. | DELETE /drafts/{id} |
read_attachment | Teks dari satu lampiran — CSV, log, JSON, file kalender, PDF, dokumen Word .docx\, atau Excel .xlsx\. | GET /attachments/{id}/text |
update_thread | Siapa pemilik percakapan dan sejauh mana prosesnya. | PATCH /threads/{id} |
update_message | Memberi bintang pada pesan atau memindahkannya ke archive\, spam\, atau trash\. | PATCH /messages/{id} |
list_send_rules | Daftar izinkan dan blokir untuk satu alamat, serta kebijakan pengiriman yang terkait dengannya. | GET /identities/{id}/send-rules |
list_receive_rules | Aturan yang menentukan pesan mana yang masuk ke satu alamat — tolak, spam, sampah, arsip, atau kotak masuk, berdasarkan pengirim atau domain — serta receive\_policy\-nya. | GET /identities/{id}/receive-rules |
list_folders | Semua folder untuk satu alamat beserta jumlah isinya. | GET /mailboxes |
list_folder | Satu folder dari satu alamat, dari yang terbaru, satu percakapan per baris — list\_threads\ menunjukkan percakapan yang ada, sedangkan ini menunjukkan lokasi penyimpanannya dan tampilannya dalam daftar. | GET /mailboxes/{folder} |
list_changes | Semua perubahan di satu kotak masuk sejak sync\_cursor\, termasuk pesan yang masuk, agar agen yang berjalan lama tidak perlu membaca ulang folder untuk menemukan satu pesan baru. | GET /mailboxes/changes |
list_events | Semua peristiwa di seluruh alamat yang dapat diakses kredensial ini — email diterima, dikirim, terkirim, gagal terkirim, atau diarsipkan. | GET /events |
list_labels | Label dimiliki oleh alamat, bukan workspace, jadi nama yang sama di tiga alamat berarti tiga label dengan tiga id. | GET /labels |
create_label | Satu label pada satu alamat. | POST /labels |
apply_label | Label harus dimiliki oleh alamat yang sama dengan percakapannya — list\_labels\ untuk alamat tersebut akan memberi Anda id yang benar. | POST /threads/{id}/labels |
remove_label | Menghapus satu label dari satu percakapan. | DELETE /threads/{id}/labels |
list_pods | Pod adalah wadah untuk salah satu pelanggan Anda sendiri: pod menampung alamat dan domain, dan **email yang dikirim darinya menggunakan reputasi pengirimannya sendiri**, sehingga satu pelanggan tidak dapat merusak pengiriman email pelanggan lain. | GET /pods |
create_pod | Wadah untuk salah satu pelanggan Anda, dengan reputasi pengiriman sendiri. | POST /pods |
get_metrics | Terkirim, berhasil diterima, gagal terkirim, ditolak, dikeluhkan, diterima, dan spam selama rentang waktu days\ — dihitung dari log peristiwa, sehingga mencakup hasil yang dilaporkan penyedia setelahnya. | GET /metrics |
get_calendar | Kalender satu alamat, berdasarkan id\ alamat tersebut: zona waktu default dan jumlah acara di dalamnya. | GET /identities/{id}/calendar |
update_calendar | Zona waktu yang digunakan untuk acara yang dibuat tanpa zona waktu, dalam format nama IANA seperti Europe/Lisbon\. | PATCH /identities/{id}/calendar |
get_agenda | Isi kalender alamat antara after\ dan before\ (tanggal-waktu ISO 8601), diurutkan berdasarkan waktu mulai, dengan setiap tanggal acara berulang dicantumkan tersendiri. | GET /identities/{id}/calendar/agenda |
get_calendar_event | Satu acara berdasarkan eventId\ di kalender alamat id\: waktu, deskripsi, lokasi, pengulangan, dan peserta beserta jawaban mereka. | GET /identities/{id}/calendar/events/{eventId} |
create_calendar_event | Menambahkan acara ke kalender alamat id\. | POST /identities/{id}/calendar/events |
update_calendar_event | Mengubah satu acara kalender: kolom yang Anda berikan, sementara sisanya dibiarkan. | PATCH /identities/{id}/calendar/events/{eventId} |
delete_calendar_event | Menghapus acara dari kalender alamat id\. | DELETE /identities/{id}/calendar/events/{eventId} |
respond_to_invitation | Menjawab undangan rapat yang diterima melalui email, berdasarkan id\ pesan: accepted\, declined\, atau tentative\, dengan comment\ opsional. | POST /messages/{id}/invitation/respond |
Masing-masing adalah endpoint yang tercantum di sebelahnya dalam referensi, dengan penolakan yang sama. Tool yang dilarang untuk kunci akan gagal seperti API, dengan kalimat yang akan digunakan API.
Pencarian mencakup semua alamat yang dapat diakses kunci, kecuali jika Anda menyebutkan alamat tertentu, dan setiap hasil menunjukkan alamat tempat hasil itu ditemukan.
Bukan untuk apa
Ini bukan runtime agen dan tidak mengambil keputusan apa pun. Pidgeon tidak memiliki pendapat tentang model yang Anda jalankan atau kesimpulan yang boleh diambilnya — sama seperti sikap yang dijelaskan dalam Threads and hand-off mengenai bagian produk lainnya. Jika agen mengalami kebuntuan, menyerahkan percakapan kepada seseorang adalah status utas, bukan fitur paket ini.
Bacaan lanjutan: server MCP email untuk mengirim dan menerima, dibandingkan.