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ที่อยู่หนึ่งรายการ โดยใช้ idGET /identities/{id}
list_threadsบทสนทนาในที่อยู่หนึ่งรายการ เรียงจากใหม่ไปเก่าGET /threads
get_threadบทสนทนาหนึ่งรายการ โดยใช้ idGET /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_podspod เป็นคอนเทนเนอร์สำหรับลูกค้าของคุณรายหนึ่ง โดยเก็บที่อยู่และโดเมนไว้ และ **อีเมลที่ส่งจาก 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 สำหรับการส่งและรับอีเมล