Pidgeon
ทางการกล่องจดหมายอีเมลสำหรับ AI agent: ที่อยู่อีเมลของตนเอง เธรด การส่งอีเมล การตอบกลับ และอีเมลที่เข้ามา
คุณทำอะไรได้บ้างด้วย Pidgeon MCP?
- อ่านกล่องจดหมาย — แสดงรายการที่อยู่ อีเมลชุดสนทนา และข้อความ จากนั้นค้นหาทั่วทุกที่อยู่ที่คีย์เข้าถึงได้
- ส่งและตอบกลับ — ส่งจากที่อยู่ที่ได้รับอนุญาต ตอบกลับโดยใช้ผู้รับและหัวเรื่องจากข้อความต้นฉบับ หรือส่งต่อพร้อมไฟล์แนบ
- รอรับรหัสยืนยัน — รอให้ข้อความมาถึง แล้วรับรหัสและลิงก์ยืนยันที่ดึงออกมา เช่น หลังส่งแบบฟอร์มสมัครใช้งาน
- รออนุมัติฉบับร่าง — เขียนฉบับร่างโดยไม่ส่ง จากนั้นตรวจสอบว่ามีผู้อนุมัติ ปฏิเสธ หรือปล่อยให้หมดอายุหรือไม่
- จัดการป้ายกำกับและโฟลเดอร์ — สร้างป้ายกำกับแยกตามที่อยู่ เพิ่มหรือนำป้ายกำกับออกจากบทสนทนา และแสดงรายการโฟลเดอร์พร้อมจำนวนรายการ
- จัดการคำเชิญในปฏิทิน — อ่านกำหนดการและกิจกรรมของที่อยู่ สร้างหรืออัปเดตกิจกรรม และตอบรับ ปฏิเสธ หรือตอบรับแบบไม่ยืนยันคำเชิญ
เซิร์ฟเวอร์ MCP แบบโฮสต์
npx add-mcp 'https://pidgeon.ai/api/mcp'ติดตั้งลง Claude Code, Codex, Cursor และอื่นๆ
เอกสาร
เอเจนต์สามารถจัดการกล่องจดหมาย Pidgeon ได้โดยตรง ทั้งอ่าน ตอบกลับ และสร้างที่อยู่ในกล่องจดหมายนั้น Pidgeon ใช้ Model Context Protocol ผ่าน API เดียวกับที่เอกสารนี้อธิบาย — เป็นเพียงตัวปรับโปรโตคอลเท่านั้น
มีสองวิธีในการเชื่อมต่อ และทั้งคู่ใช้เซิร์ฟเวอร์เดียวกัน แบบโฮสต์ไม่ต้องติดตั้ง ส่วนแพ็กเกจจะเรียกใช้บนเครื่องของคุณ
แบบโฮสต์ ซึ่งเป็น URL
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp
การเรียกครั้งแรกจะตอบกลับ 401 แล้วไคลเอนต์จะพาคุณไปที่ Pidgeon เพื่อลงชื่อเข้าใช้ คุณเลือกได้ว่าจะให้ทำอะไรได้บ้าง — อ่าน อ่านและส่ง หรือเข้าถึงได้เต็มรูปแบบ — และเข้าถึงอะไรได้บ้าง: ที่อยู่เดียว หรือทุกที่อยู่หากคุณเป็นเจ้าของบัญชี ตัวเลือกนั้นจะกลายเป็น API key และไคลเอนต์จะถือโทเค็นสำหรับ key นั้น โดยจะแสดงอยู่ที่ Developers → API keys → Connected apps และการกด Disconnect ที่นั่นจะมีผลเมื่อไคลเอนต์เรียกครั้งถัดไป
Claude's custom connectors, ChatGPT, Grok, Cursor, Codex และ VS Code ใช้ URL เดียวกันและลงชื่อเข้าใช้แบบเดียวกัน แต่ละคำขอจะได้รับการตอบกลับแยกกัน: เซิร์ฟเวอร์ไม่เก็บเซสชัน เพราะไม่มีสถานะของตัวเองที่ต้องเก็บรักษา
สำหรับเอเจนต์ที่ไม่มีคนอยู่ตรงนั้นเพื่อลงชื่อเข้าใช้ ให้ส่ง key แทน:
claude mcp add --transport http pidgeon https://pidgeon.ai/api/mcp \
--header "Authorization: Bearer $PIDGEON_API_KEY"
x-api-key ก็ใช้ได้เช่นกัน ดูขั้นตอนทีละขั้นสำหรับ Cursor, Codex (ซึ่งอ่าน TOML ไม่ใช่ JSON) และ VS Code; Windsurf และ Gemini CLI ใช้ URL และ header เดียวกัน
ใน Grok
ใน Grok ให้ไปที่ Connectors → Custom วาง https://pidgeon.ai/api/mcp แล้วลงชื่อเข้าใช้ที่หน้าจอขอความยินยอม ไม่ต้องใช้ key (ดูขั้นตอนทีละขั้น) Muse ของ Meta อยู่ระหว่างการตรวจสอบกับ Meta
ใน Cursor
เพิ่ม Pidgeon ใน Cursor จากรายการใน cursor.directory ซึ่งมีเซิร์ฟเวอร์แบบโฮสต์และ skill รวมอยู่ด้วย
หรือเพิ่มเซิร์ฟเวอร์ด้วยตนเองใน ~/.cursor/mcp.json (หรือ .cursor/mcp.json สำหรับโปรเจกต์เดียว) ใช้เพียง URL เท่านั้น; Cursor จะให้คุณลงชื่อเข้าใช้เมื่อเรียกครั้งแรก:
{
"mcpServers": {
"pidgeon": {
"url": "https://pidgeon.ai/api/mcp"
}
}
}
สำหรับเอเจนต์ที่ไม่มีคนอยู่ตรงนั้นเพื่อลงชื่อเข้าใช้ ให้เพิ่ม "headers": { "Authorization": "Bearer ${env:PIDGEON_API_KEY}" } ไว้ข้าง URL แล้ว Cursor จะดึงค่าจาก environment ของคุณ
Codex, VS Code และ Gemini CLI
สำหรับ Codex, VS Code และ Gemini CLI คำสั่งเดียวจะเขียนเซิร์ฟเวอร์ลงในไฟล์ของไคลเอนต์เอง:
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
หากไม่ได้ตั้ง key ไว้ คำสั่งจะเขียนเฉพาะ URL แล้วไคลเอนต์จะให้คุณลงชื่อเข้าใช้ หากตั้ง PIDGEON_API_KEY ไว้ คำสั่งจะตรวจสอบ key ก่อน จากนั้นให้ไคลเอนต์อ่านค่าจากตัวแปรนั้น (Codex, Gemini CLI) หรือขอให้คุณป้อนครั้งเดียว (VS Code) เพื่อไม่ให้ key ถูกบันทึกลงในไฟล์ คำสั่งจะเพิ่มข้อมูลต่อจากเนื้อหาที่มีอยู่ รวมถึงคอมเมนต์ คัดลอกไฟล์ที่แก้ไขไปยัง <file>.bak ไม่ทำอะไรเมื่อเรียกครั้งที่สอง และจะแทนที่รายการ pidgeon อื่นก็ต่อเมื่อใช้ --force เท่านั้น --scope user หรือ --scope project ใช้เลือกไฟล์อีกไฟล์; --print จะไม่เขียนอะไรเลย
หรือติดตั้ง ซึ่งเป็นแพ็กเกจ
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp init
คำสั่งนี้จะตรวจสอบ key กับ API ก่อนเขียนสิ่งใด และแจ้งให้คุณทราบว่าเข้าถึงที่อยู่ใดได้บ้าง — ซึ่งเป็นคำถามเดียวที่บล็อก JSON ตอบไม่ได้ และหากไม่ตรวจสอบ คำถามนี้จะปรากฏในรูปแบบที่โมเดลได้รับข้อผิดพลาดอย่างเงียบ ๆ โดยที่คุณไม่เห็น จากนั้นคำสั่งจะเขียน .mcp.json ในไดเรกทอรีปัจจุบันและแสดงสิ่งที่เขียน โดยจะไม่แทนที่รายการที่มีอยู่แล้ว: --force ใช้ทำเช่นนั้น ส่วน --print จะแสดง config โดยไม่เขียนอะไร ซึ่งเหมาะเมื่อไคลเอนต์เก็บไฟล์ของตัวเองไว้ที่อื่น
key จะถูกอ้างอิงจาก environment แทนการเขียนลงในไฟล์ ดังนั้นจึง commit config ได้โดยไม่ทำให้ credential รั่วไหล:
{
"mcpServers": {
"pidgeon": {
"command": "npx",
"args": ["-y", "@pidgeon-ai/mcp"],
"env": { "PIDGEON_API_KEY": "${PIDGEON_API_KEY}" }
}
}
}
Claude Desktop หรือ MCP client อื่น ๆ ใช้บล็อกเดียวกันได้ หากต้องการเรียกใช้เซิร์ฟเวอร์โดยตรง ซึ่งส่วนใหญ่มีประโยชน์สำหรับดูการเริ่มทำงาน:
PIDGEON_API_KEY=pgn_live_… npx -y @pidgeon-ai/mcp
PIDGEON_BASE_URL ใช้ชี้ไปยังที่อื่นที่ไม่ใช่ production ซึ่งมีประโยชน์เฉพาะเมื่อคุณเรียกใช้ Pidgeon เอง
key คือกลไกควบคุมการเข้าถึงทั้งหมด
การตั้งค่านี้จะมอบ API key ให้โมเดล — ไม่ว่าจะเป็น key ที่คุณสร้างขึ้นเอง หรือ key ที่คุณอนุญาตผ่านการลงชื่อเข้าใช้ ไม่มีสิ่งใดในแพ็กเกจที่กำหนดว่าจะเข้าถึงอะไรได้บ้าง: ขอบเขตสูงสุดของ key และที่อยู่ที่ได้รับอนุญาตเป็นตัวกำหนดทั้งหมด โดยทำงานฝั่งเซิร์ฟเวอร์เหมือนกับผู้เรียกใช้งานรายอื่น ไม่มีชุดกฎอีกชุดให้ต้องกังวลว่าจะตั้งค่าผิด
ดังนั้น ให้ key ที่มีสิทธิ์แคบที่สุดเท่าที่เอเจนต์ต้องใช้ key ที่สร้างที่ read จะส่งไม่ได้ไม่ว่าจะได้รับอนุญาตให้เข้าถึงกล่องจดหมายมากเพียงใด — ดู Authentication เพื่อทำความเข้าใจขอบเขตการเข้าถึงของ key และวิธีจำกัดขอบเขต เอเจนต์ที่ทำหน้าที่คัดกรองเท่านั้นควรถือ key ที่อ่านได้อย่างเดียว แล้วคำถามว่าจะส่งอะไรที่น่าอับอายออกไปหรือไม่ก็จะไม่ใช่คำถามเกี่ยวกับ prompt
ขอบเขตการเข้าถึงของ key เป็นภาพ ณ เวลาที่ได้รับอนุญาตให้เข้าถึงที่อยู่ ดังนั้นที่อยู่ที่สร้างขึ้นหลังจากสร้าง key จะไม่รวมอยู่ด้วย
สิ่งที่เปิดให้ใช้งาน
มีทั้งหมด 42 รายการ โดยอ่านจากรายการของเซิร์ฟเวอร์เอง เพื่อให้หน้านี้ไม่ล้าหลัง:
| Tool | ทำอะไร | Endpoint |
|---|---|---|
list_addresses | ที่อยู่ที่ credential นี้เข้าถึงได้ | GET /identities |
create_address | สร้างที่อยู่ให้เอเจนต์ใช้งาน | POST /identities |
get_address | ที่อยู่หนึ่งรายการ โดยใช้ id | GET /identities/{id} |
list_threads | บทสนทนาในที่อยู่หนึ่งรายการ เรียงจากใหม่ไปเก่า | GET /threads |
get_thread | บทสนทนาหนึ่งรายการ โดยใช้ id | GET /threads/{id} |
list_messages | ข้อความของบทสนทนาหนึ่งรายการ เรียงจากเก่าไปใหม่ — ข้อความที่ต้องอ่านก่อนตอบกลับ | GET /messages |
search_messages | ค้นหาข้อความแบบเต็มในทุกที่อยู่ที่ credential นี้เข้าถึงได้ โดยจัดอันดับตามความเกี่ยวข้อง | GET /messages/search |
send_message | ส่งจากที่อยู่ที่ credential นี้ได้รับอนุญาตให้ส่งในนามของที่อยู่นั้น | POST /messages |
get_message | ข้อความหนึ่งรายการ โดยใช้ id พร้อมเนื้อหา header ที่เราเก็บไว้ และหลักฐานจากระเบียนของโดเมนผู้ส่ง — authentication.spf\, .dkim\, .dmarc\ โดย null หมายถึงไม่มีรายงาน ไม่ใช่การตรวจสอบไม่ผ่าน | GET /messages/{id} |
await_message | รอจนกว่าจะมีข้อความมาถึงที่อยู่ — เช่น หลังจากส่งแบบฟอร์มสมัครสมาชิก — แล้วส่งกลับพร้อม extracted.codes\ และ extracted.links\: รหัสยืนยันและลิงก์ยืนยัน โดยเรียงรายการที่น่าจะใช่ที่สุดไว้ก่อน | GET /messages/await |
reply_to_message | ผู้รับ หัวเรื่อง และเธรดจะอ่านจากข้อความที่กำลังตอบกลับ คุณจึงต้องระบุเพียงเนื้อความเท่านั้น | POST /messages/{id}/reply |
forward_message | ส่งต่อข้อความหนึ่งรายการไปยังผู้ที่ไม่ได้เป็นผู้รับเดิม พร้อมไฟล์แนบ โดยส่งจากที่อยู่ที่ได้รับข้อความนั้น | POST /messages/{id}/forward |
create_draft | เขียนข้อความโดยไม่ส่ง เพื่อให้มนุษย์อ่านและส่ง — ใช้เมื่อมีผู้ขอให้เตรียมคำตอบเพื่อรออนุมัติ | POST /drafts |
get_draft_approval | ตรวจสอบสถานะของการส่งที่พักไว้ โดยใช้ draft\_id\: pending\ จนกว่าจะมีคนอนุมัติหรือปฏิเสธในแดชบอร์ด จากนั้นเป็น approved\ (ส่งแล้ว และ message\_id\ คือข้อความนั้น), rejected\ หรือ expired\ หลังผ่านไป 24 ชั่วโมงโดยไม่มีใครตัดสินใจ | GET /drafts/{id}/approval |
list_drafts | ฉบับร่างทั้งหมดในที่อยู่หนึ่งรายการ เรียงจากใหม่ไปเก่า พร้อมผู้รับและเนื้อหา — เพื่อให้กลับมาแก้ไขและส่งต่อได้ | GET /drafts |
get_draft | ฉบับร่างหนึ่งรายการโดยใช้ id: ผู้ส่ง ผู้รับ หัวเรื่อง ข้อความ และไฟล์แนบ | GET /drafts/{id} |
update_draft | เปลี่ยนเฉพาะฟิลด์ที่ระบุและคงส่วนที่เหลือไว้; null\ ใช้ล้างหัวเรื่องหรือข้อความ | PATCH /drafts/{id} |
delete_draft | ลบฉบับร่างหนึ่งรายการ และยกเลิกการส่งหากมีการตั้งเวลาไว้ | DELETE /drafts/{id} |
read_attachment | ข้อความในไฟล์แนบหนึ่งรายการ — CSV, log, JSON, ไฟล์ปฏิทิน, PDF, Word .docx\ หรือ Excel .xlsx\ | GET /attachments/{id}/text |
update_thread | ใครเป็นเจ้าของบทสนทนาและดำเนินไปถึงไหนแล้ว | PATCH /threads/{id} |
update_message | ติดดาวข้อความ หรือย้ายไปที่ archive\, spam\ หรือ trash\ | PATCH /messages/{id} |
list_send_rules | รายการอนุญาตและรายการบล็อกของที่อยู่หนึ่งรายการ รวมถึงนโยบายการส่งที่รายการเหล่านั้นใช้ | GET /identities/{id}/send-rules |
list_receive_rules | กฎที่กำหนดว่าจะให้สิ่งใดเข้าถึงที่อยู่หนึ่งรายการ — ปฏิเสธ ทำเครื่องหมายเป็นสแปม ทิ้ง เก็บถาวร หรือส่งเข้ากล่องจดหมาย โดยกำหนดแยกตามผู้ส่งหรือโดเมน — และ receive\_policy\ ของที่อยู่นั้น | GET /identities/{id}/receive-rules |
list_folders | โฟลเดอร์ทั้งหมดของที่อยู่หนึ่งรายการพร้อมจำนวนรายการ | GET /mailboxes |
list_folder | โฟลเดอร์หนึ่งของที่อยู่หนึ่งรายการ เรียงจากใหม่ไปเก่า โดยแต่ละแถวเป็นหนึ่งบทสนทนา — list\_threads\ ระบุว่ามีบทสนทนาใดบ้าง ส่วนรายการนี้ระบุว่าจัดเก็บไว้ที่ใดและแสดงอย่างไรในรายการ | GET /mailboxes/{folder} |
list_changes | ทุกสิ่งที่เปลี่ยนแปลงในกล่องจดหมายหนึ่งรายการนับจาก sync\_cursor\ รวมถึงข้อความที่เข้ามา เพื่อให้เอเจนต์ที่ทำงานต่อเนื่องไม่ต้องอ่านโฟลเดอร์ซ้ำเพื่อหาข้อความใหม่ | GET /mailboxes/changes |
list_events | ทุกเหตุการณ์ในทุกที่อยู่ที่ credential นี้เข้าถึงได้ — รับ ส่ง ส่งถึง ตีกลับ และจัดเก็บ | GET /events |
list_labels | ป้ายกำกับเป็นของที่อยู่ ไม่ใช่ของ workspace ดังนั้นชื่อเดียวกันในสามที่อยู่จึงเป็นป้ายกำกับสามรายการที่มี id ต่างกัน | GET /labels |
create_label | ป้ายกำกับหนึ่งรายการในที่อยู่หนึ่งรายการ | POST /labels |
apply_label | ป้ายกำกับต้องเป็นของที่อยู่เดียวกับบทสนทนา — list\_labels\ ของที่อยู่นั้นจะให้ id ที่ถูกต้องแก่คุณ | POST /threads/{id}/labels |
remove_label | นำป้ายกำกับหนึ่งรายการออกจากบทสนทนาหนึ่งรายการ | DELETE /threads/{id}/labels |
list_pods | pod เป็นคอนเทนเนอร์สำหรับลูกค้าของคุณรายหนึ่ง โดยเก็บที่อยู่และโดเมนไว้ และ **อีเมลที่ส่งจาก pod จะใช้ชื่อเสียงด้านการส่งของ pod นั้นเอง** เพื่อไม่ให้ลูกค้ารายหนึ่งส่งผลเสียต่อการส่งอีเมลของอีกราย | GET /pods |
create_pod | คอนเทนเนอร์สำหรับลูกค้ารายหนึ่งของคุณ พร้อมชื่อเสียงด้านการส่งของตัวเอง | POST /pods |
get_metrics | จำนวนอีเมลที่ส่ง ส่งถึง ตีกลับ ถูกปฏิเสธ มีการร้องเรียน ได้รับ และเป็นสแปม ในช่วงเวลา days\ — นับจากบันทึกเหตุการณ์ จึงรวมผลลัพธ์ที่ผู้ให้บริการรายงานภายหลังด้วย | GET /metrics |
get_calendar | ปฏิทินของที่อยู่หนึ่งรายการ โดยใช้ id\ ของที่อยู่นั้น: เขตเวลาเริ่มต้นและจำนวนกิจกรรมในปฏิทิน | GET /identities/{id}/calendar |
update_calendar | เขตเวลาที่กิจกรรมซึ่งไม่ได้ระบุเขตเวลาจะใช้ เช่น ชื่อ IANA อย่าง Europe/Lisbon\ | PATCH /identities/{id}/calendar |
get_agenda | สิ่งที่อยู่ในปฏิทินของที่อยู่ระหว่าง after\ และ before\ (วันเวลา ISO 8601) เรียงตามเวลาเริ่มต้น โดยแสดงแต่ละวันที่ของกิจกรรมที่เกิดซ้ำแยกกัน | GET /identities/{id}/calendar/agenda |
get_calendar_event | กิจกรรมหนึ่งรายการโดยใช้ eventId\ ในปฏิทินของที่อยู่ id\: เวลา คำอธิบาย สถานที่ การเกิดซ้ำ และผู้เข้าร่วมพร้อมคำตอบของแต่ละคน | GET /identities/{id}/calendar/events/{eventId} |
create_calendar_event | เพิ่มกิจกรรมลงในปฏิทินของที่อยู่ id\ | POST /identities/{id}/calendar/events |
update_calendar_event | เปลี่ยนกิจกรรมหนึ่งรายการในปฏิทิน โดยเปลี่ยนเฉพาะฟิลด์ที่ระบุและคงส่วนที่เหลือไว้ | PATCH /identities/{id}/calendar/events/{eventId} |
delete_calendar_event | นำกิจกรรมออกจากปฏิทินของที่อยู่ id\ | DELETE /identities/{id}/calendar/events/{eventId} |
respond_to_invitation | ตอบรับคำเชิญประชุมที่ได้รับทางอีเมล โดยใช้ id\ ของข้อความ: accepted\, declined\ หรือ tentative\ พร้อม comment\ ซึ่งเป็นตัวเลือก | POST /messages/{id}/invitation/respond |
แต่ละรายการคือ endpoint ที่อยู่ข้างกันใน reference และใช้การปฏิเสธแบบเดียวกัน Tool ที่ key ไม่ได้รับอนุญาตให้ใช้จะล้มเหลวแบบเดียวกับ API พร้อมข้อความที่ API จะแสดง
การค้นหาครอบคลุมทุกที่อยู่ที่ key เข้าถึงได้ เว้นแต่คุณจะระบุที่อยู่ และผลการค้นหาแต่ละรายการจะบอกว่าพบในที่อยู่ใด
สิ่งที่ไม่ใช่
นี่ไม่ใช่ agent runtime และไม่ได้ตัดสินใจอะไร Pidgeon ไม่มีความเห็นว่าคุณใช้โมเดลใดหรือโมเดลได้รับอนุญาตให้สรุปอะไรได้บ้าง — เช่นเดียวกับจุดยืนที่ Threads and hand-off อธิบายไว้เกี่ยวกับส่วนอื่นของผลิตภัณฑ์ หากเอเจนต์ติดขัด การส่งต่อบทสนทนาให้คนเป็นสถานะของเธรด ไม่ใช่ฟีเจอร์ของแพ็กเกจนี้
อ่านเพิ่มเติม: เปรียบเทียบ email MCP servers สำหรับการส่งและรับอีเมล