Pidgeon

resmi

Kotak 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:

ToolFungsiEndpoint
list_addressesAlamat yang dapat diakses oleh kredensial ini.GET /identities
create_addressMembuat alamat untuk digunakan agen.POST /identities
get_addressSatu alamat, berdasarkan id.GET /identities/{id}
list_threadsPercakapan dalam satu alamat, dari yang terbaru.GET /threads
get_threadSatu percakapan, berdasarkan id.GET /threads/{id}
list_messagesPesan dalam satu percakapan, dari yang terlama — teks yang perlu dibaca sebelum membalas.GET /messages
search_messagesPencarian teks lengkap di semua alamat yang dapat diakses kredensial ini, diurutkan berdasarkan relevansi.GET /messages/search
send_messageMengirim dari alamat yang diizinkan untuk digunakan mengirim oleh kredensial ini.POST /messages
get_messageSatu 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_messageMenunggu 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_messagePenerima, subjek, dan utas diambil dari pesan yang dibalas, jadi Anda hanya perlu menulis isi pesannya.POST /messages/{id}/reply
forward_messageMeneruskan satu pesan kepada seseorang yang bukan penerima awalnya, beserta lampirannya, dari alamat yang menerima pesan tersebut.POST /messages/{id}/forward
create_draftMenulis pesan tanpa mengirimkannya, agar dapat dibaca dan dikirim oleh manusia — gunakan saat Anda diminta menyiapkan balasan untuk disetujui.POST /drafts
get_draft_approvalStatus 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_draftsSemua draf di satu alamat, dari yang terbaru, beserta penerima dan isi pesannya — agar Anda dapat kembali dan menyelesaikan salah satunya.GET /drafts
get_draftSatu draf berdasarkan id: pengirim, penerima, subjek, teks, dan lampirannya.GET /drafts/{id}
update_draftMengubah kolom yang Anda berikan dan membiarkan sisanya; null\ mengosongkan subjek atau teks.PATCH /drafts/{id}
delete_draftMenghapus satu draf dan membatalkan pengirimannya jika dijadwalkan.DELETE /drafts/{id}
read_attachmentTeks dari satu lampiran — CSV, log, JSON, file kalender, PDF, dokumen Word .docx\, atau Excel .xlsx\.GET /attachments/{id}/text
update_threadSiapa pemilik percakapan dan sejauh mana prosesnya.PATCH /threads/{id}
update_messageMemberi bintang pada pesan atau memindahkannya ke archive\, spam\, atau trash\.PATCH /messages/{id}
list_send_rulesDaftar izinkan dan blokir untuk satu alamat, serta kebijakan pengiriman yang terkait dengannya.GET /identities/{id}/send-rules
list_receive_rulesAturan 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_foldersSemua folder untuk satu alamat beserta jumlah isinya.GET /mailboxes
list_folderSatu 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_changesSemua 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_eventsSemua peristiwa di seluruh alamat yang dapat diakses kredensial ini — email diterima, dikirim, terkirim, gagal terkirim, atau diarsipkan.GET /events
list_labelsLabel dimiliki oleh alamat, bukan workspace, jadi nama yang sama di tiga alamat berarti tiga label dengan tiga id.GET /labels
create_labelSatu label pada satu alamat.POST /labels
apply_labelLabel harus dimiliki oleh alamat yang sama dengan percakapannya — list\_labels\ untuk alamat tersebut akan memberi Anda id yang benar.POST /threads/{id}/labels
remove_labelMenghapus satu label dari satu percakapan.DELETE /threads/{id}/labels
list_podsPod 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_podWadah untuk salah satu pelanggan Anda, dengan reputasi pengiriman sendiri.POST /pods
get_metricsTerkirim, 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_calendarKalender satu alamat, berdasarkan id\ alamat tersebut: zona waktu default dan jumlah acara di dalamnya.GET /identities/{id}/calendar
update_calendarZona waktu yang digunakan untuk acara yang dibuat tanpa zona waktu, dalam format nama IANA seperti Europe/Lisbon\.PATCH /identities/{id}/calendar
get_agendaIsi 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_eventSatu acara berdasarkan eventId\ di kalender alamat id\: waktu, deskripsi, lokasi, pengulangan, dan peserta beserta jawaban mereka.GET /identities/{id}/calendar/events/{eventId}
create_calendar_eventMenambahkan acara ke kalender alamat id\.POST /identities/{id}/calendar/events
update_calendar_eventMengubah satu acara kalender: kolom yang Anda berikan, sementara sisanya dibiarkan.PATCH /identities/{id}/calendar/events/{eventId}
delete_calendar_eventMenghapus acara dari kalender alamat id\.DELETE /identities/{id}/calendar/events/{eventId}
respond_to_invitationMenjawab 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.