Anki MCP

ทางการ

เซิร์ฟเวอร์ MCP ที่ช่วยให้ผู้ช่วย AI สามารถโต้ตอบกับ Anki ซึ่งเป็นแอปพลิเคชันบัตรคำศัพท์แบบเว้นระยะซ้ำได้

GitHub
482
ลองใช้ MCP นี้ผู้สนับสนุน

คุณทำอะไรได้บ้างด้วย Anki MCP?

  • ทบทวนการ์ดที่ถึงกำหนดแบบสนทนา — ให้ผู้ช่วยของคุณดึงการ์ดที่ถึงกำหนดด้วย get_due_cards นำเสนอแต่ละใบผ่าน present_card และบันทึกการให้คะแนนของคุณด้วย rate_card
  • สร้างและเพิ่มแฟลชการ์ดเป็นชุด — ให้ผู้ช่วยสร้างโน้ตเป็นจำนวนมากด้วย addNotes และอาจสร้างโมเดลที่กำหนดเองก่อนด้วย createModel และ updateModelStyling
  • ค้นหาและแก้ไขโน้ตที่มีอยู่ — ใช้ findNotes กับไวยากรณ์คำค้นหาแบบ Anki ตรวจสอบรายละเอียดผ่าน notesInfo และอัปเดตฟิลด์ด้วย updateNoteFields
  • จัดการเด็คและกำหนดเวลา — สร้างเด็คด้วย createDeck ย้ายการ์ดผ่าน changeDeck หรือจัดตารางการ์ดใหม่โดยใช้ setDueDate และ forgetCards
  • นำสื่อเข้าไปในโน้ต — ให้ผู้ช่วยอัปโหลดรูปภาพในเครื่องหรือ URL ด้วย storeMediaFile และฝังลงในฟิลด์ของโน้ต
  • ควบคุมอินเทอร์เฟซ Anki — เปิดเบราว์เซอร์หรือตัวแก้ไขด้วย guiBrowse และ guiEditNote หรือรับโน้ตที่เลือกผ่าน guiSelectedNotes

เอกสาร

เซิร์ฟเวอร์ Anki MCP

Tests npm version

Anki + MCP Integration

ผสานรวม Anki เข้ากับผู้ช่วย AI ผ่าน Model Context Protocol

เบต้า - โปรเจกต์นี้อยู่ระหว่างการพัฒนาอย่างต่อเนื่อง API และฟีเจอร์ต่างๆ อาจมีการเปลี่ยนแปลง

เซิร์ฟเวอร์ Model Context Protocol (MCP) ที่ช่วยให้ผู้ช่วย AI สามารถโต้ตอบกับ Anki ซึ่งเป็นแอปพลิเคชันแฟลชการ์ดแบบเว้นระยะ

เปลี่ยนประสบการณ์การใช้งาน Anki ของคุณด้วยการโต้ตอบด้วยภาษาธรรมชาติ - เหมือนมีครูสอนพิเศษส่วนตัว ผู้ช่วย AI ไม่เพียงแต่นำเสนอคำถามและคำตอบเท่านั้น แต่ยังสามารถอธิบายแนวคิด ทำให้กระบวนการเรียนรู้มีส่วนร่วมและเป็นธรรมชาติมากขึ้น ให้บริบท และปรับให้เข้ากับสไตล์การเรียนรู้ของคุณ มันสามารถสร้างและแก้ไขโน้ตได้ทันที เปลี่ยนช่วงเวลาการเรียนของคุณให้เป็นการสนทนาที่มีชีวิตชีวา ฟีเจอร์เพิ่มเติมกำลังจะมาเร็วๆ นี้!

ตัวอย่างและบทช่วยสอน

สำหรับคำแนะนำที่ครอบคลุม ตัวอย่างจริง และบทช่วยสอนทีละขั้นตอนเกี่ยวกับการใช้เซิร์ฟเวอร์ MCP นี้กับ Claude Desktop โปรดเยี่ยมชม:

ankimcp.ai - เอกสารประกอบที่สมบูรณ์พร้อมตัวอย่างเชิงปฏิบัติและกรณีการใช้งาน

ดู docs/ สำหรับเอกสารประกอบเพิ่มเติม รวมถึง คู่มือการตั้งค่าผู้ตรวจทาน และสำรับ Anki ตัวอย่าง

ตัวอย่างกรณีการใช้งาน

พรอมต์ตัวอย่างสามแบบที่แสดงโฟลว์เครื่องมือที่เซิร์ฟเวอร์นี้เปิดใช้งาน:

  1. "ช่วยฉันทบทวนสำรับภาษาสเปนหน่อย" — ผู้ช่วยซิงค์กับ AnkiWeb (sync) ดึงการ์ดที่ถึงกำหนด (get_due_cards พร้อมตัวกรองสำรับ) นำเสนอการ์ดแต่ละใบ (present_card) และบันทึกการให้คะแนนของคุณ (rate_card) บทสนทนาการเรียนที่เป็นธรรมชาติพร้อมคำอธิบายที่ปรับให้เหมาะกับคุณ

  2. "สร้างการ์ดคำศัพท์ภาษาอาหรับ 10 ใบพร้อมสไตล์ RTL" — ผู้ช่วยแสดงรายการประเภทโน้ต (modelNames) สร้างโมเดล RTL ที่กำหนดเองหากจำเป็น (createModel + updateModelStyling สำหรับ CSS แบบขวาไปซ้าย) จากนั้นสร้างการ์ดเป็นชุด (addNotes)

  3. "นำเข้ารูปภาพนี้จากโฟลเดอร์ Downloads ของฉันไปไว้ที่ด้านหน้าของโน้ตที่เลือก" — ผู้ช่วยอัปโหลดไฟล์ในเครื่อง (storeMediaFile พร้อมเส้นทางไฟล์) อ่านโน้ตที่เลือกอยู่ในปัจจุบันจากเบราว์เซอร์ (guiSelectedNotes + notesInfo) และอัปเดตฟิลด์ด้านหน้าด้วยแท็ก <img> (updateNoteFields)

เครื่องมือที่มีให้ใช้งาน

เซิร์ฟเวอร์เปิดเผย เครื่องมือ MCP จำนวน 50 รายการ — เครื่องมือจำเป็น 39 รายการสำหรับการดำเนินการ Anki ในชีวิตประจำวัน และเครื่องมือ GUI 11 รายการที่ขับเคลื่อนอินเทอร์เฟซเดสก์ท็อป Anki สำหรับเวิร์กโฟลว์การแก้ไข/สร้างโน้ต

เครื่องมือจำเป็น

ทบทวนและศึกษา

  • sync - ซิงค์กับ AnkiWeb เพื่อดึงข้อมูลล่าสุดและส่งการเปลี่ยนแปลง
  • get_due_cards - รับการ์ดที่ถึงกำหนดทบทวน โดยสามารถกรองตามสำรับได้ (ไม่แสดงคำตอบเว้นแต่ include_answer: true, ค่าเริ่มต้น false)
  • get_cards - รับการ์ดพร้อมการกรองที่ยืดหยุ่นตามสถานะ (ถึงกำหนด ใหม่ กำลังเรียนรู้ ระงับ ฝัง) และสำรับ (ไม่แสดงคำตอบเว้นแต่ include_answer: true, ค่าเริ่มต้น false)
  • present_card - แสดงการ์ดสำหรับทบทวนพร้อมด้านคำถาม/ด้านหน้า
  • rate_card - ให้คะแนนประสิทธิภาพการ์ด (อีกครั้ง ยาก ดี ง่าย) และกำหนดเวลาการทบทวนครั้งถัดไป
  • forgetCards - รีเซ็ตการ์ดเป็นสถานะใหม่ โดยละทิ้งกำหนดเวลาโดยไม่บันทึกการทบทวน
  • setDueDate - กำหนดเวลาการ์ดใหม่ให้ถึงกำหนดในอีก N วัน ("0", "3-7", "1!") โดยไม่บันทึกการทบทวน

หมายเหตุ: forgetCards และ setDueDate เปลี่ยนกำหนดเวลา โดยไม่ บันทึกการทบทวน ซึ่งเป็นสิ่งที่แยกออกจาก rate_card ใช้เมื่อกำหนดเวลาของการ์ดผิดพลาดมากกว่าคำตอบ: การให้คะแนนการ์ด Again เพื่อฝังให้ลึกลงไปจะบันทึกการพลาดจริงและลดปัจจัยความง่ายลง ซึ่งจะทำให้ทั้งกำหนดเวลาในอนาคตและสถิติของคุณคลาดเคลื่อนอย่างถาวร forgetCards ล้างช่วงเวลาและเริ่มการ์ดใหม่ setDueDate เก็บประวัติการ์ดไว้และเพียงเลื่อนการทบทวนครั้งถัดไป

หมายเหตุ: เนื้อหาการ์ด front/back ถูกเรนเดอร์ต่อการ์ดจากเทมเพลตของตัวเอง (ตามที่ Anki แสดง) ดังนั้นการ์ดแบบกลับด้านและการ์ด cloze จะแสดงทิศทางที่ถูกต้อง ข้อความคงที่ที่เพิ่มโดยเทมเพลตการ์ดของคุณจะปรากฏในผลลัพธ์ด้วย

การจัดการสำรับ

  • listDecks - แสดงรายการสำรับทั้งหมด พร้อมสถิติคิวการศึกษาต่อสำรับ (ไม่บังคับ)
  • deckStats - รับสถิติที่ครอบคลุมสำหรับสำรับเดียว (คิวการศึกษา จำนวนสถานะการ์ดจริง การกระจายความง่าย/ช่วงเวลา)
  • createDeck - สร้างสำรับว่างใหม่ (รองรับ Parent::Child, สูงสุด 2 ระดับ)
  • changeDeck - ย้ายการ์ดไปยังสำรับอื่น (สร้างหากยังไม่มี)

หมายเหตุ: สถิติสำรับมีสองรูปแบบ บล็อก counts (และทุกอย่างที่ listDecks รายงาน) สะท้อนเบราว์เซอร์สำรับของ Anki: การ์ดที่ถึงกำหนดวันนี้ จำกัดโดยขีดจำกัดการ์ดใหม่/การทบทวนรายวันของแต่ละสำรับ โดยไม่รวมการ์ดที่ระงับและฝัง — ดังนั้น review จึงไม่ใช่ "การ์ดที่โตเต็มที่" และกลุ่ม other เป็นเพียงเศษที่เหลือทางคณิตศาสตร์ (ส่วนใหญ่เป็นการ์ดทบทวนที่ยังไม่ถึงกำหนดวันนี้บวกการ์ดใหม่ที่เกินขีดจำกัดรายวัน) สำหรับยอดรวมตามสถานะจริง ให้ใช้บล็อก states บน deckStats / collection_stats ซึ่งนับ new, learning, review, suspended และ buried ผ่านการค้นหา Anki โดยไม่สนใจวันที่ถึงกำหนดและขีดจำกัดรายวัน

การจัดการโน้ต

  • addNote - สร้างโน้ตเดียวพร้อมฟิลด์และแท็กที่ระบุ
  • addNotes - สร้างเป็นชุดสูงสุด 100 โน้ตที่ใช้สำรับและโมเดลร่วมกัน (รองรับความสำเร็จบางส่วน)
  • findNotes - ค้นหาโน้ตโดยใช้ไวยากรณ์การค้นหา Anki (deck:, tag:, is:due, ฯลฯ)
  • notesInfo - รับข้อมูลโดยละเอียดเกี่ยวกับโน้ต (ฟิลด์ แท็ก สไตล์ CSS)
  • updateNoteFields - อัปเดตฟิลด์โน้ตที่มีอยู่ (รองรับ CSS รองรับเนื้อหา HTML)
  • deleteNotes - ลบโน้ตและการ์ดที่เกี่ยวข้องทั้งหมด (ทำลายล้าง ต้องยืนยัน)

การจัดการแท็ก

  • getTags - รับแท็กทั้งหมดในคอลเลกชัน (ใช้รายการแรกเพื่อหลีกเลี่ยงการซ้ำซ้อน)
  • addTags - เพิ่มแท็กที่คั่นด้วยช่องว่างให้กับโน้ตที่ระบุ
  • removeTags - ลบแท็กที่คั่นด้วยช่องว่างจากโน้ตที่ระบุ
  • replaceTags - เปลี่ยนชื่อแท็กในโน้ตที่ระบุ
  • clearUnusedTags - ลบแท็กที่ไม่มีเจ้าของซึ่งไม่ได้ใช้โดยโน้ตใดๆ (ทำลายล้าง)

การจัดการสื่อ

  • getMediaFilesNames - แสดงรายการไฟล์สื่อใน collection.media, กรองตามรูปแบบได้ (ไม่บังคับ)
  • retrieveMediaFile - ดาวน์โหลดไฟล์สื่อเป็นเนื้อหา base64
  • storeMediaFile - อัปโหลดสื่อจากข้อมูล base64 เส้นทางไฟล์สัมบูรณ์ หรือ URL
  • deleteMediaFile - ลบไฟล์สื่อจาก collection.media (ทำลายล้าง)

💡 แนวทางปฏิบัติที่ดีที่สุดสำหรับรูปภาพ:

  • ใช้เส้นทางไฟล์ (เช่น /Users/you/image.png) - รวดเร็วและมีประสิทธิภาพ
  • ใช้ URL (เช่น https://example.com/image.jpg) - ดาวน์โหลดโดยตรง
  • หลีกเลี่ยง base64 - ช้ามากและไม่ประหยัดโทเค็น

เพียงบอก Claude ว่ารูปภาพอยู่ที่ไหน มันจะจัดการอัปโหลดโดยอัตโนมัติด้วยวิธีที่มีประสิทธิภาพสูงสุด

การจัดการโมเดล/เทมเพลต

  • modelNames - แสดงรายการประเภทโน้ต/โมเดลทั้งหมดที่มี
  • modelFieldNames - รับชื่อฟิลด์สำหรับประเภทโน้ตเฉพาะ
  • modelStyling - รับข้อมูลสไตล์ CSS สำหรับประเภทโน้ต
  • modelTemplates - รับเทมเพลตการ์ด (HTML ด้านหน้าและด้านหลัง) สำหรับประเภทโน้ต
  • createModel - สร้างประเภทโน้ตใหม่พร้อมฟิลด์ เทมเพลตการ์ด และ CSS ที่กำหนดเอง (เช่น โมเดล RTL)
  • updateModelStyling - อัปเดตสไตล์ CSS สำหรับประเภทโน้ตที่มีอยู่ (ใช้กับการ์ดทั้งหมด)
  • updateModelTemplates - อัปเดตเทมเพลตการ์ด (HTML ด้านหน้าและด้านหลัง) สำหรับประเภทโน้ตที่มีอยู่ (ใช้กับการ์ดทั้งหมด)
  • addModelField - เพิ่มฟิลด์ใหม่ให้กับประเภทโน้ตที่มีอยู่ (ต่อท้ายที่ส่วนท้ายหรือแทรกที่ตำแหน่งเฉพาะ)
  • removeModelField - ลบฟิลด์จากประเภทโน้ตที่มีอยู่ (ลบเนื้อหาจากโน้ตทั้งหมด ต้องยืนยันอย่างชัดเจน)
  • renameModelField - เปลี่ยนชื่อฟิลด์ในประเภทโน้ตที่มีอยู่ (เทมเพลตการ์ดที่อ้างอิงชื่อเก่าต้องอัปเดตแยกต่างหาก)
  • repositionModelField - เปลี่ยนตำแหน่งของฟิลด์ภายในประเภทโน้ตที่มีอยู่

สถิติ

  • collection_stats - สถิติรวมทั่วทุกสำรับพร้อมรายละเอียดต่อสำรับและจำนวนสถานะการ์ดทั่วคอลเลกชัน
  • review_stats - การวิเคราะห์ประวัติการทบทวน (รูปแบบเวลา ตัวชี้วัดการจดจำ ช่วงการศึกษาต่อเนื่อง)

เครื่องมือ GUI

เครื่องมือที่ขับเคลื่อนอินเทอร์เฟซเดสก์ท็อป Anki มีไว้สำหรับเวิร์กโฟลว์การแก้ไข/สร้างโน้ตและการจัดการสำรับ ไม่ใช่ สำหรับช่วงการทบทวน

  • guiBrowse - เปิดเบราว์เซอร์การ์ดและค้นหาการ์ด
  • guiSelectCard - เลือกการ์ดเฉพาะในเบราว์เซอร์การ์ด
  • guiSelectedNotes - รับ ID ของโน้ตที่เลือกอยู่ในปัจจุบันในเบราว์เซอร์การ์ด
  • guiAddCards - เปิดกล่องโต้ตอบเพิ่มการ์ดพร้อมรายละเอียดโน้ตที่ตั้งไว้ล่วงหน้า
  • guiEditNote - เปิดตัวแก้ไขโน้ตสำหรับโน้ตเฉพาะ
  • guiDeckOverview - เปิดกล่องโต้ตอบภาพรวมสำรับสำหรับสำรับเฉพาะ
  • guiDeckBrowser - เปิดกล่องโต้ตอบเบราว์เซอร์สำรับ
  • guiCurrentCard - รับข้อมูลเกี่ยวกับการ์ดปัจจุบันในโหมดทบทวน
  • guiShowQuestion - แสดงด้านคำถามของการ์ดปัจจุบัน
  • guiShowAnswer - แสดงด้านคำตอบของการ์ดปัจจุบัน
  • guiUndo - เลิกทำการกระทำล่าสุดใน Anki

ข้อกำหนดเบื้องต้น

  • Anki พร้อมปลั๊กอิน AnkiConnect ที่ติดตั้ง
  • Node.js 22.12.0+

การติดตั้ง

มีหลายวิธีในการติดตั้งเซิร์ฟเวอร์บนเครื่องของคุณ เมื่อติดตั้งแล้ว ไปที่ การเชื่อมต่อไคลเอ็นต์ AI เพื่อเชื่อมต่อกับผู้ช่วย AI ของคุณ — ในเครื่องหรือระยะไกล

npm (global หรือ npx)

วิธีทั่วไปในการติดตั้งเซิร์ฟเวอร์ เหมาะสำหรับไคลเอ็นต์ MCP ใดๆ ที่เปิดใช้งานโดยตรง

ติดตั้งแบบ global สำหรับไคลเอ็นต์ที่รันคำสั่ง ankimcp:

npm install -g @ankimcp/anki-mcp-server

หรือรันตามความต้องการโดยไม่ต้องติดตั้ง:

npx @ankimcp/anki-mcp-server

บันเดิล MCPB (แนะนำสำหรับ Claude Desktop)

วิธีที่ง่ายที่สุดในการติดตั้งเซิร์ฟเวอร์ MCP นี้สำหรับ Claude Desktop:

  1. ดาวน์โหลดบันเดิล .mcpb ล่าสุดจากหน้า Releases
  2. ใน Claude Desktop ติดตั้งส่วนขยาย:
    • วิธีที่ 1: ไปที่ การตั้งค่า → ส่วนขยาย จากนั้นลากและวางไฟล์ .mcpb
    • วิธีที่ 2: ไปที่ การตั้งค่า → นักพัฒนา → ส่วนขยาย → ติดตั้งส่วนขยาย จากนั้นเลือกไฟล์ .mcpb
  3. กำหนดค่า URL ของ AnkiConnect หากจำเป็น (ค่าเริ่มต้นคือ http://localhost:8765)
  4. รีสตาร์ท Claude Desktop

เพียงเท่านี้! บันเดิลมีทุกสิ่งที่จำเป็นในการรันเซิร์ฟเวอร์ในเครื่อง

สำหรับผู้ตรวจทานไดเรกทอรี MCP ของ Anthropic: คำแนะนำแบบ zero-to-integration พร้อมสำรับตัวอย่างที่เติมข้อมูลไว้ล่วงหน้าอยู่ใน docs/reviewer-setup.md

ติดตั้งจากซอร์ส (สำหรับการพัฒนา)

สำหรับการพัฒนาหรือการใช้งานขั้นสูง (การรันชุดทดสอบต้องใช้ Node.js 24.9+ — สคริปต์ทดสอบ npm โหลดแพ็คเกจ NestJS 12 ที่เป็น ESM-only ผ่าน require(esm) ซึ่ง Jest รองรับเฉพาะที่นั่น ข้อกำหนดรันไทม์สำหรับ การใช้ เซิร์ฟเวอร์ยังคงเป็น 22.12.0+):

npm install
npm run build

การเชื่อมต่อไคลเอ็นต์ AI

มีสองวิธีที่ผู้ช่วย AI สามารถเข้าถึงเซิร์ฟเวอร์นี้ ขึ้นอยู่กับว่าผู้ช่วยรันอยู่ที่ไหน:

  • ในเครื่อง — เซิร์ฟเวอร์รันบนเครื่องเดียวกับไคลเอ็นต์ AI (Claude Desktop, Cursor, Cline, Zed หรือเซสชันเบราว์เซอร์ในเครื่อง) ใช้ STDIO สำหรับไคลเอ็นต์ MCP เดสก์ท็อป HTTP สำหรับเครื่องมือบนเว็บในเครื่อง
  • ระยะไกล — AI ที่โฮสต์/ระยะไกล (เช่น ChatGPT หรือ Claude.ai ในคลาวด์) จำเป็นต้องเข้าถึง Anki ที่รันบนเครื่องท้องถิ่นของคุณ ใช้ Tunnel ที่จัดการ (✅ แนะนำ — มีการรับรองความถูกต้อง) หรือเป็นทางเลือกที่ไม่มีการรับรองความถูกต้องที่เบากว่า ให้ใช้ ngrok

ในเครื่อง

เซิร์ฟเวอร์รันบนคอมพิวเตอร์เครื่องเดียวกับไคลเอ็นต์ AI และสื่อสารกับ AnkiConnect บน localhost

STDIO (การรวมในเครื่องหลัก)

STDIO เป็นทรานสปอร์ตมาตรฐานสำหรับไคลเอ็นต์ MCP เดสก์ท็อปในเครื่อง — Claude Desktop, Cursor IDE, Cline, Zed Editor และอื่นๆ ไคลเอ็นต์เปิดใช้เซิร์ฟเวอร์เป็นซับโพรเซสและสื่อสารผ่านอินพุต/เอาต์พุตมาตรฐาน ไคลเอนต์ที่รองรับ:

  • Claude Desktop
  • Cursor IDE - โปรแกรมแก้ไขโค้ดที่ขับเคลื่อนด้วย AI
  • Cline - ส่วนขยาย VS Code สำหรับความช่วยเหลือจาก AI
  • Zed Editor - โปรแกรมแก้ไขโค้ดที่ทันสมัยและรวดเร็ว
  • ไคลเอนต์ MCP อื่น ๆ ที่รองรับการส่งข้อมูลแบบ STDIO

สำหรับ Claude Desktop บันเดิล MCPB เป็นวิธีที่ง่ายที่สุด สำหรับไคลเอนต์อื่น ๆ ให้กำหนดค่าแพ็กเกจ npm ด้วยแฟล็ก --stdio

การกำหนดค่า - เลือกหนึ่งวิธี:

วิธีที่ 1: ใช้ npx (แนะนำ - ไม่ต้องติดตั้ง)

{
  "mcpServers": {
    "anki-mcp": {
      "command": "npx",
      "args": ["-y", "@ankimcp/anki-mcp-server", "--stdio"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

วิธีที่ 2: ใช้การติดตั้งแบบ global

ขั้นแรก ติดตั้งแบบ global:

npm install -g @ankimcp/anki-mcp-server

จากนั้นกำหนดค่า:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "ankimcp",
      "args": ["--stdio"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

ตำแหน่งไฟล์กำหนดค่า:

  • Cursor IDE: ~/.cursor/mcp.json (macOS/Linux) หรือ %USERPROFILE%\.cursor\mcp.json (Windows)
  • Cline: เข้าถึงได้ผ่าน UI การตั้งค่าใน VS Code
  • Zed Editor: ติดตั้งเป็นส่วนขยาย MCP ผ่านตลาดส่วนขยาย

สำหรับคุณสมบัติเฉพาะของไคลเอนต์และการแก้ไขปัญหา โปรดดูเอกสารของไคลเอนต์ MCP ของคุณ ดูเพิ่มเติมที่ เชื่อมต่อกับ Claude Desktop สำหรับการกำหนดค่าที่ชี้ไปยัง dist/main-stdio.js ที่สร้างไว้แล้วโดยตรง

HTTP (AI บนเว็บแบบ local)

โหมด HTTP จะรันเซิร์ฟเวอร์เป็นเว็บเซิร์ฟเวอร์ท้องถิ่นที่พูดโปรโตคอล MCP Streamable HTTP เป็นการส่งข้อมูลที่เครื่องมือ AI บนเว็บใช้พูดคุยเมื่อชี้ไปที่เครื่องของคุณ และยังเป็นสิ่งที่ตัวเลือก Remote เปิดเผยสู่โลกภายนอก โดยตัวมันเอง โหมด HTTP จะผูกกับ localhost เท่านั้น

ผูกนอกเหนือจาก localhost หรือไม่? หากคุณส่ง --host 0.0.0.0 (หรือรัน behind reverse proxy/public domain) เซิร์ฟเวอร์จะยอมรับเฉพาะส่วนหัว Host แบบ loopback โดยค่าเริ่มต้นเพื่อป้องกัน DNS-rebinding — ตั้งค่า ALLOWED_HOSTS เป็นชื่อโฮสต์ที่ไคลเอนต์ใช้ ดู การกำหนดค่าโหมด HTTP

การตั้งค่า - เลือกหนึ่งวิธี:

วิธีที่ 1: ใช้ npx (แนะนำ - ไม่ต้องติดตั้ง)

# Quick start
npx @ankimcp/anki-mcp-server

# With custom options
npx @ankimcp/anki-mcp-server --port 8080 --host 0.0.0.0
npx @ankimcp/anki-mcp-server --anki-connect http://localhost:8765

วิธีที่ 2: ใช้การติดตั้งแบบ global

# Install once
npm install -g @ankimcp/anki-mcp-server

# Run the server
ankimcp

# With custom options
ankimcp --port 8080 --host 0.0.0.0
ankimcp --anki-connect http://localhost:8765

วิธีที่ 3: ติดตั้งจากซอร์ส (สำหรับการพัฒนา)

npm install
npm run build
npm run start:prod:http

เพื่อให้เซิร์ฟเวอร์ HTTP ท้องถิ่นเข้าถึงได้โดย AI ที่โฮสต์บนคลาวด์ ให้ใช้ตัวเลือก Remote ด้านล่าง

Remote

AI ที่โฮสต์/ระยะไกล (เช่น ChatGPT หรือ Claude.ai ที่รันบนคลาวด์) ไม่สามารถเข้าถึง localhost ได้โดยตรง ตัวเลือกเหล่านี้เปิดเผย Anki ท้องถิ่น ของคุณสู่อินเทอร์เน็ตเพื่อให้ผู้ช่วยระยะไกลสามารถพูดคุยได้

Tunnel (✅ แนะนำ)

เส้นทางระยะไกลที่แนะนำ — มีการรับรองความถูกต้องและปลอดภัย ต่างจากพอร์ตสาธารณะดิบ โหมด tunnel กำหนดให้คุณต้องเข้าสู่ระบบ (OAuth 2.0 device flow) ดังนั้น endpoint จะไม่เปิดให้ใครก็ตามที่เดา URL ได้

โหมด Tunnel ให้ผู้ช่วย AI บนเว็บเข้าถึง Anki ท้องถิ่น ของคุณได้โดยไม่ต้องรัน tunnel ของคุณเอง เซิร์ฟเวอร์เชื่อมต่อออกไปยังบริการ tunnel ที่จัดการโดย AnkiMCP (wss://tunnel.ankimcp.ai) ผ่าน WebSocket และได้รับ URL สาธารณะ การรับรองความถูกต้องมีในตัว — ไม่ต้องมีบัญชี ngrok หรือกระบวนการ tunnel แยก และคุณเข้าสู่ระบบเพียงครั้งเดียว

เข้าสู่ระบบ (OAuth device flow):

โหมด Tunnel ใช้ OAuth 2.0 Device Authorization Grant การเข้าสู่ระบบจะเปิดเบราว์เซอร์ของคุณไปยังหน้า approve โดยอัตโนมัติพร้อมรหัสที่ฝังอยู่ใน URL แล้ว — ไม่ต้องพิมพ์อะไร แค่กด approve (หากเบราว์เซอร์เปิดไม่ได้ เทอร์มินัลจะพิมพ์ URL สำหรับยืนยันและรหัสให้ป้อนด้วยตนเองเป็นทางเลือกสำรอง) เมื่อสำเร็จ ข้อมูลรับรองจะถูกบันทึกไปยัง ~/.ankimcp/credentials.json (สิทธิ์ไฟล์ 0600)

# Pre-authenticate (optional — --tunnel will trigger this automatically if needed)
ankimcp --login
npx @ankimcp/anki-mcp-server --login

# Clear saved credentials
ankimcp --logout

เริ่ม tunnel:

# Connect to the managed tunnel service (wss://tunnel.ankimcp.ai)
ankimcp --tunnel
npx @ankimcp/anki-mcp-server --tunnel

# Override the tunnel server URL (must be ws:// or wss://) — e.g. for self-hosting
ankimcp --tunnel wss://my-tunnel.example.com

หากไม่มีข้อมูลรับรอง --tunnel จะเริ่มขั้นตอนการเข้าสู่ระบบโดยอัตโนมัติก่อน จากนั้นจึงดำเนินการต่อกับ tunnel การเข้าสู่ระบบอัตโนมัตินี้ต้องใช้เทอร์มินัลแบบโต้ตอบ — เมื่อ stdout ไม่ใช่ TTY (systemd, headless Docker, CI) เซิร์ฟเวอร์จะล้มเหลวอย่างรวดเร็วและขอให้คุณรัน ankimcp --login ก่อน เมื่อเชื่อมต่อแล้ว URL tunnel สาธารณะจะถูกพิมพ์; กด Ctrl+C เพื่อตัดการเชื่อมต่อ แชร์ URL นั้นกับผู้ช่วย AI ของคุณ

ตัวแปรสภาพแวดล้อมสำหรับโหมด Tunnel:

ตัวแปรคำอธิบายค่าเริ่มต้น
TUNNEL_SERVER_URLURL WebSocket ของเซิร์ฟเวอร์ tunnel (ค่าแฟล็ก --tunnel/--login จะแทนที่ค่านี้)wss://tunnel.ankimcp.ai
TUNNEL_AUTH_CLIENT_IDOAuth client ID สำหรับ device flow ขั้นสูง — จำเป็นเมื่อชี้ไปที่บริการ tunnel/auth ที่โฮสต์เองเท่านั้น(ในตัว)

endpoint การรับรองความถูกต้องของ device-flow (/auth/device, /auth/token) มาจาก TUNNEL_SERVER_URL ดังนั้นการชี้ --tunnel (หรือ TUNNEL_SERVER_URL) ไปที่โฮสต์อื่นจะย้ายการรับรองความถูกต้องไปที่โฮสต์นั้นด้วย

วิธีการทำงาน: โหมด Tunnel รันเซิร์ฟเวอร์ MCP ในกระบวนการ behind transport ในหน่วยความจำ (TunnelTransport) transport นั้นเป็นเจ้าของเซิร์ฟเวอร์ MCP และเปลี่ยนเนื้อหาคำขอที่ถ่ายทอดแต่ละรายการเป็นการตอบสนอง และ TunnelClient เชื่อมต่อกับบริการ tunnel ระยะไกลผ่าน WebSocket — ถ่ายทอดคำขอ MCP เข้าและตอบกลับออก AnkiConnect ยังคงเข้าถึงได้เฉพาะบนเครื่องท้องถิ่นของคุณเท่านั้น

โปรโตคอล revisions: เนื่องจาก tunnel เชื่อมต่อเซิร์ฟเวอร์ MCP ในกระบวนการ โหมด tunnel ให้บริการเฉพาะ MCP protocol revision ปี 2025 ในขณะที่โหมด STDIO และ HTTP ให้บริการทั้งปี 2025 และ revision 2026-07-28 ที่ใหม่กว่า ทุกเครื่องมือทำงานเหมือนกันไม่ว่าจะด้วยวิธีใด — แต่ไคลเอนต์ที่พูดเฉพาะ 2026-07-28 จะถูกปฏิเสธผ่าน tunnel ด้วยข้อผิดพลาดเวอร์ชันโปรโตคอล; รันโหมด STDIO หรือ HTTP สำหรับไคลเอนต์นั้น

ngrok (ทางเลือกที่ไม่มีการรับรองความถูกต้อง)

หากคุณต้องการเปิดเผย โหมด HTTP ท้องถิ่น สู่สาธารณะโดยไม่ต้องมีบัญชีบน tunnel ที่จัดการ แฟล็ก --ngrok ในตัวจะเปิดใช้กระบวนการย่อย ngrok (src/services/ngrok.service.ts) และพิมพ์ URL สาธารณะในแบนเนอร์เริ่มต้น:

# One-time ngrok setup, then:
ankimcp --ngrok

เส้นทางนี้ไม่มีการรับรองความถูกต้อง — ใครก็ตามที่มี URL สามารถเข้าถึง Anki ของคุณได้ ดังนั้นจึงปลอดภัยน้อยกว่า Tunnel เลือกใช้ Tunnel เว้นแต่คุณมีเหตุผลเฉพาะในการจัดการ endpoint ngrok ของคุณเอง (ต้องติดตั้ง ngrok แบบ global และ authtoken)

แฟล็ก --ngrok เปิดใช้ ngrok ด้วย --host-header=rewrite ดังนั้น ngrok จะเขียน Host ต้นทางใหม่เป็น localhost ก่อนส่งต่อ ทำให้คำขออยู่ใน Host allowlist แบบ loopback (ดู การป้องกัน DNS-rebinding) โดยไม่ต้องเพิ่มโดเมน *.ngrok สาธารณะใน ALLOWED_HOSTS หากคุณรัน ngrok ด้วยตนเอง ให้ใช้แฟล็กเดียวกัน — ngrok http --host-header=rewrite 3000 — มิฉะนั้น ngrok จะส่งต่อชื่อโฮสต์ ngrok สาธารณะเป็น Host และเซิร์ฟเวอร์จะปฏิเสธด้วย 403

ตัวเลือก CLI (ทุกโหมด)

ankimcp [options]

Options:
  --stdio                        Run in STDIO mode (for MCP clients)
  --tunnel [url]                 Connect via the managed tunnel (authenticated)
  --login                        Authenticate for tunnel mode (OAuth device flow)
  --logout                       Clear saved tunnel credentials
  -p, --port <number>            Port to listen on (HTTP mode; default: 3000, or PORT env var)
  -h, --host <address>           Host to bind to (HTTP mode; default: 127.0.0.1, or HOST env var)
  -a, --anki-connect <url>       AnkiConnect URL (default: http://localhost:8765, or ANKI_CONNECT_URL env var)
  --ngrok                        Start ngrok tunnel (requires global ngrok installation)
  --read-only                    Run in read-only mode (blocks all write operations)
  --help                         Show help message

Usage with npx (no installation needed):
  npx @ankimcp/anki-mcp-server                        # HTTP mode
  npx @ankimcp/anki-mcp-server --port 8080            # Custom port
  npx @ankimcp/anki-mcp-server --stdio                # STDIO mode
  npx @ankimcp/anki-mcp-server --tunnel               # Managed tunnel mode
  npx @ankimcp/anki-mcp-server --ngrok                # HTTP mode with ngrok tunnel
  npx @ankimcp/anki-mcp-server --read-only            # Read-only mode

Usage with global installation:
  npm install -g @ankimcp/anki-mcp-server             # Install once
  ankimcp                                             # HTTP mode
  ankimcp --port 8080                                 # Custom port
  ankimcp --stdio                                     # STDIO mode
  ankimcp --tunnel                                    # Managed tunnel mode
  ankimcp --ngrok                                     # HTTP mode with ngrok tunnel
  ankimcp --read-only                                 # Read-only mode

โหมดอ่านอย่างเดียว (ทุกโหมด)

แฟล็ก --read-only ป้องกันการแก้ไขใด ๆ ต่อคอลเลกชัน Anki ของคุณ เมื่อเปิดใช้งาน:

  • การดำเนินการอ่านทั้งหมดทำงานตามปกติ (เรียกดูเด็ค ดูการ์ด ค้นหาโน้ต)
  • การดำเนินการรีวิวได้รับอนุญาต (sync, answerCards, suspend/unsuspend)
  • การแก้ไขเนื้อหาถูกบล็อก (addNote, deleteNotes, createDeck, updateNoteFields, ฯลฯ)
  • มีประโยชน์สำหรับการสำรวจข้อมูล Anki อย่างปลอดภัยโดยไม่มีความเสี่ยงต่อการเปลี่ยนแปลงโดยไม่ตั้งใจ
# HTTP mode with read-only
ankimcp --read-only

# STDIO mode with read-only
ankimcp --stdio --read-only

# Can combine with other flags
ankimcp --ngrok --read-only

คุณยังสามารถเปิดใช้งานโหมดอ่านอย่างเดียวผ่านตัวแปรสภาพแวดล้อม:

READ_ONLY=true ankimcp

หรือในการกำหนดค่าไคลเอนต์ MCP:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "npx",
      "args": ["-y", "@ankimcp/anki-mcp-server", "--stdio", "--read-only"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

เชื่อมต่อกับ Claude Desktop (โหมด Local)

คุณสามารถกำหนดค่าเซิร์ฟเวอร์ใน Claude Desktop โดย:

  • ไปที่: การตั้งค่า → นักพัฒนา → แก้ไขการกำหนดค่า
  • หรือแก้ไขไฟล์กำหนดค่าด้วยตนเอง

การกำหนดค่า

เพิ่มสิ่งต่อไปนี้ในการกำหนดค่า Claude Desktop ของคุณ:

{
  "mcpServers": {
    "anki-mcp": {
      "command": "node",
      "args": ["/path/to/anki-mcp-server/dist/main-stdio.js"],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

แทนที่ /path/to/anki-mcp-server ด้วยเส้นทางโปรเจกต์จริงของคุณ

ตำแหน่งไฟล์กำหนดค่า

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

สำหรับรายละเอียดเพิ่มเติม ดู เอกสาร MCP อย่างเป็นทางการ

ตัวแปรสภาพแวดล้อม (ไม่บังคับ)

ตัวแปรคำอธิบายค่าเริ่มต้น
ANKI_CONNECT_URLURL AnkiConnecthttp://localhost:8765
ANKI_CONNECT_API_VERSIONเวอร์ชัน API6
ANKI_CONNECT_API_KEYคีย์ API หากกำหนดค่าใน AnkiConnect-
ANKI_CONNECT_TIMEOUTหมดเวลาคำขอในหน่วย ms5000
READ_ONLYเปิดใช้งานโหมดอ่านอย่างเดียว (true หรือ 1)false
PORTโหมด HTTP: พอร์ตที่ฟัง (แฟล็ก --port มีลำดับความสำคัญกว่า)3000
HOSTโหมด HTTP: ที่อยู่ที่ผูก (แฟล็ก --host มีลำดับความสำคัญกว่า)127.0.0.1
ALLOWED_HOSTSโหมด HTTP: ค่าหัว Host เพิ่มเติมที่ยอมรับนอกเหนือจาก loopback (ชื่อโฮสต์คั่นด้วยเครื่องหมายจุลภาค) จำเป็นเมื่อผูกกับที่อยู่ LAN/สาธารณะหรือรัน behind reverse proxy ดู การกำหนดค่าโหมด HTTPloopback เท่านั้น
ALLOWED_ORIGINSโหมด HTTP: รายการอนุญาตรูปแบบ Origin/Referer ของเบราว์เซอร์คั่นด้วยเครื่องหมายจุลภาค (รองรับ wildcards เช่น https://*.ngrok.io)http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*
TUNNEL_SERVER_URLURL WebSocket ของเซิร์ฟเวอร์ tunnel (เฉพาะโหมด tunnel)wss://tunnel.ankimcp.ai
MEDIA_ALLOWED_TYPESประเภท MIME เพิ่มเติมที่อนุญาตสำหรับการนำเข้าเส้นทางไฟล์ (คั่นด้วยเครื่องหมายจุลภาค เช่น application/pdf)-
MEDIA_IMPORT_DIRจำกัดการนำเข้าเส้นทางไฟล์ไว้ที่ไดเรกทอรีนี้-
MEDIA_ALLOWED_HOSTSอนุญาตโฮสต์เครือข่ายส่วนตัวเฉพาะสำหรับการนำเข้า URL (คั่นด้วยเครื่องหมายจุลภาค เช่น 192.168.1.50,my-nas)-

ตัวอย่างการใช้งาน

การค้นหาและอัปเดตโน้ต

# Search for notes in a specific deck
findNotes(query: "deck:Spanish")

# Get detailed information about notes
notesInfo(notes: [1234567890, 1234567891])

# Update a note's fields (HTML content supported)
updateNoteFields(note: {
  id: 1234567890,
  fields: {
    "Front": "<b>¿Cómo estás?</b>",
    "Back": "How are you?"
  }
})

# Delete notes (requires confirmation)
deleteNotes(notes: [1234567890], confirmDeletion: true)

ตัวอย่างไวยากรณ์การค้นหา Anki

เครื่องมือ findNotes รองรับไวยากรณ์การค้นหาอันทรงพลังของ Anki:

  • "deck:DeckName" - โน้ตทั้งหมดในเด็คเฉพาะ
  • "tag:important" - โน้ตที่มีแท็ก "สำคัญ"
  • "is:due" - การ์ดที่ถึงกำหนดรีวิว
  • "is:new" - การ์ดใหม่ที่ยังไม่ได้ศึกษา
  • "added:7" - โน้ตที่เพิ่มใน 7 วันที่ผ่านมา
  • "front:hello" - โน้ตที่มี "สวัสดี" ในช่องด้านหน้า
  • "flag:1" - โน้ตที่มีธงสีแดง
  • "prop:due<=2" - การ์ดที่ถึงกำหนดภายใน 2 วัน
  • "deck:Spanish tag:verb" - โน้ตเด็คภาษาสเปนที่มีแท็กคำกริยา (AND)
  • "deck:Spanish OR deck:French" - โน้ตจากเด็คใดเด็คหนึ่ง

หมายเหตุสำคัญ

การจัดการ CSS และ HTML

  • เครื่องมือ notesInfo ส่งคืนข้อมูลการจัดรูปแบบ CSS เพื่อการแสดงผลที่เหมาะสม
  • เครื่องมือ updateNoteFields รองรับเนื้อหา HTML ในช่องและรักษาการจัดรูปแบบ CSS
  • แต่ละโมเดลโน้ตมีการจัดรูปแบบ CSS ของตัวเอง - ใช้ modelStyling เพื่อรับ CSS เฉพาะโมเดล

คำเตือนการอัปเดต

⚠️ สำคัญ: เมื่อใช้ updateNoteFields อย่าดูโน้ตในเบราว์เซอร์ของ Anki ขณะอัปเดต มิฉะนั้นช่องจะไม่อัปเดตอย่างถูกต้อง ปิดเบราว์เซอร์หรือสลับไปที่โน้ตอื่นก่อนอัปเดต ดู ปัญหาที่ทราบ สำหรับรายละเอียดเพิ่มเติม

ความปลอดภัยในการลบ

เครื่องมือ deleteNotes ต้องการการยืนยันอย่างชัดเจน (confirmDeletion: true) เพื่อป้องกันการลบโดยไม่ตั้งใจ การลบโน้ตจะลบการ์ดที่เกี่ยวข้องทั้งหมดอย่างถาวร

ความปลอดภัย

การตรวจสอบเส้นทางไฟล์สื่อและ URL

เครื่องมือสื่อ (storeMediaFile, retrieveMediaFile, deleteMediaFile) และช่องเสียง/รูปภาพ updateNoteFields รวมการตรวจสอบความปลอดภัยเพื่อป้องกันการใช้งานในทางที่ผิดผ่าน prompt injection:

  • การนำเข้าเส้นทางไฟล์ จำกัดเฉพาะประเภทไฟล์สื่อเท่านั้น (รูปภาพ เสียง วิดีโอ) ไฟล์ที่ไม่ใช่สื่อ (เช่น คีย์ SSH ข้อมูลรับรอง การกำหนดค่าเชลล์) จะถูกปฏิเสธตามประเภท MIME กำหนดค่า MEDIA_ALLOWED_TYPES เพื่ออนุญาตประเภทไฟล์เพิ่มเติม หรือ MEDIA_IMPORT_DIR เพื่อจำกัดการนำเข้าไปยังไดเรกทอรีเฉพาะ
  • การนำเข้า URL ถูกตรวจสอบการโจมตี SSRF คำขอไปยังเครือข่ายส่วนตัว (10.x, 172.16.x, 192.168.x), loopback (127.x), link-local (169.254.x) และ scheme ที่ไม่ใช่ HTTP(S) จะถูกบล็อก กำหนดค่า MEDIA_ALLOWED_HOSTS เพื่ออนุญาตโฮสต์เครือข่ายส่วนตัวเฉพาะ
  • ชื่อไฟล์ ถูกทำความสะอาดเพื่อป้องกัน path traversal (เช่น ลำดับ ../../ จะถูกลบออก)

การป้องกันเหล่านี้ใช้กับ storeMediaFile, retrieveMediaFile, deleteMediaFile และช่องเสียง/รูปภาพ updateNoteFields

ช่องโหว่ path traversal รายงานโดย Hideaki Takahashi

การป้องกัน DNS-Rebinding (การส่งข้อมูล HTTP)

เมื่อรันในโหมด HTTP เซิร์ฟเวอร์จะตรวจสอบ Host header ในทุกคำขอ โดยค่าเริ่มต้นจะยอมรับเฉพาะ loopback hosts (localhost, 127.0.0.1, ::1) โดยไม่คำนึงถึงพอร์ต Host เป็น header ที่เบราว์เซอร์ห้ามส่ง ดังนั้นเว็บเพจที่เป็นอันตรายจึงไม่สามารถปลอมแปลงได้ — ซึ่งเป็นการปิดช่องโหว่ DNS-rebinding ที่เพจที่ถูกเปลี่ยนเส้นทางสามารถเข้าถึงเซิร์ฟเวอร์ภายในด้วย Host ที่ปลอมแปลงและไม่มี Origin และเข้าถึงเครื่องมือ MCP ได้ Host ที่ไม่อนุญาตจะถูกปฏิเสธด้วย 403

หากคุณผูกกับ 0.0.0.0, รันอยู่เบื้องหลัง reverse proxy, หรือเปิดเผยโดเมน tunnel สาธารณะ ให้ตั้งค่า ALLOWED_HOSTS (รายชื่อโฮสต์คั่นด้วยเครื่องหมายจุลภาค) เพื่ออนุญาตโฮสต์เหล่านั้น เมื่อใช้ tunnel กับ ngrok เซิร์ฟเวอร์จะใช้ --host-header=rewrite ดังนั้น upstream ยังคงเห็น Host loopback ดู HTTP Mode Configuration สำหรับรายการตัวเลือกทั้งหมด

ช่องโหว่ DNS-rebinding รายงานโดย avishaigo-commits และ yotampe-pluto

นโยบายความเป็นส่วนตัว

MCP เซิร์ฟเวอร์นี้รันบนเครื่องของคุณเท่านั้น และไม่เก็บข้อมูล telemetry, analytics, หรือข้อมูลการใช้งานใดๆ

นโยบายฉบับเต็ม: https://ankimcp.ai/privacy/

  • การเก็บข้อมูล: เซิร์ฟเวอร์ไม่เก็บข้อมูลใดๆ มันทำหน้าที่เป็นตัวกลางส่งคำขอระหว่างผู้ช่วย AI ของคุณและปลั๊กอิน AnkiConnect ในเครื่องของคุณ
  • การใช้งาน / การจัดเก็บ: ไม่มีการจัดเก็บข้อมูลฝั่งเซิร์ฟเวอร์ ข้อมูลแฟลชการ์ดทั้งหมดอยู่ใน Anki ของคุณบนอุปกรณ์ของคุณเอง
  • การแชร์กับบุคคลที่สาม: ไม่มีการแชร์ เซิร์ฟเวอร์สื่อสารกับ URL AnkiConnect ที่คุณกำหนดค่าเท่านั้น (ค่าเริ่มต้น: localhost) หากคุณเปิดใช้งานการซิงค์ AnkiWeb ในตัวของ Anki การซิงค์นั้นเกิดขึ้นระหว่าง Anki ของคุณกับ AnkiWeb โดยตรง — อยู่นอกขอบเขตของเซิร์ฟเวอร์นี้
  • การเก็บรักษา: ไม่เกี่ยวข้อง — ไม่มีการเก็บข้อมูลฝั่งเซิร์ฟเวอร์
  • ติดต่อ: support@ankimcp.ai

ปัญหาที่ทราบ

สำหรับรายการปัญหาที่ทราบและข้อจำกัดทั้งหมด กรุณาเยี่ยมชมเอกสารของเรา:

เอกสารปัญหาที่ทราบ

ข้อจำกัดที่สำคัญ

การอัปเดตโน้ตล้มเหลวเมื่อเปิดดูในเบราว์เซอร์

⚠️ สำคัญ: เมื่ออัปเดตโน้ตด้วย updateNoteFields การอัปเดตจะล้มเหลวอย่างเงียบๆ หากโน้ตกำลังถูกเปิดดูในหน้าต่างเบราว์เซอร์ของ Anki นี่เป็นข้อจำกัดของ AnkiConnect ต้นทาง

วิธีแก้ไข: ปิดเบราว์เซอร์หรือไปที่โน้ตอื่นก่อนทำการอัปเดตเสมอ

สำหรับรายละเอียดเพิ่มเติมและปัญหาที่ทราบอื่นๆ ดู เอกสารฉบับเต็ม

การแก้ไขปัญหา

ข้อผิดพลาด ERR_REQUIRE_ESM

หากคุณเห็นข้อผิดพลาดเช่น:

Error [ERR_REQUIRE_ESM]: require() of ES Module not supported

หมายความว่าเวอร์ชัน Node.js ของคุณไม่ได้รับการสนับสนุน เซิร์ฟเวอร์ต้องการ Node.js 22.12.0+

หมายเหตุ: รันไทม์ขั้นต่ำที่สนับสนุนคือ Node.js 22.12.0 Node.js 20 (Iron) สิ้นสุดอายุการใช้งานเมื่อ 2026-04-30 และไม่ได้รับการสนับสนุนอีกต่อไป

ตรวจสอบเวอร์ชันของคุณ:

node --version

วิธีแก้ไข: อัปเดต Node.js เป็นเวอร์ชัน 22.12.0+ คุณสามารถดาวน์โหลดได้จาก nodejs.org หรือใช้ตัวจัดการเวอร์ชันเช่น nvm

การพัฒนา

โหมดการขนส่ง (Transport Modes)

เซิร์ฟเวอร์นี้สนับสนุนโหมดการขนส่ง MCP สามแบบผ่าน จุดเข้าใช้งานแยกต่างหาก:

โหมด STDIO (ค่าเริ่มต้น)

  • สำหรับ MCP ไคลเอนต์ในเครื่องเช่น Claude Desktop
  • ใช้ standard input/output สำหรับการสื่อสาร
  • จุดเข้าใช้งาน: dist/main-stdio.js
  • รัน: npm run start:prod:stdio หรือ node dist/main-stdio.js
  • MCPB bundle: ใช้โหมด STDIO

โหมด HTTP (Streamable HTTP)

  • สำหรับ MCP ไคลเอนต์ระยะไกลและการรวมเข้ากับเว็บ
  • ใช้โปรโตคอล MCP Streamable HTTP
  • จุดเข้าใช้งาน: dist/main-http.js
  • รัน: npm run start:prod:http หรือ node dist/main-http.js
  • พอร์ตเริ่มต้น: 3000 (กำหนดค่าได้ผ่านตัวแปรสภาพแวดล้อม PORT)
  • โฮสต์เริ่มต้น: 127.0.0.1 (กำหนดค่าได้ผ่านตัวแปรสภาพแวดล้อม HOST)
  • MCP endpoint: http://127.0.0.1:3000/ (เส้นทางราก)

โหมด Tunnel (Managed WebSocket Tunnel)

  • สำหรับผู้ช่วย AI บนเว็บผ่านบริการ tunnel AnkiMCP ที่จัดการ พร้อมการตรวจสอบสิทธิ์ในตัว
  • MCP เซิร์ฟเวอร์รันในกระบวนการเบื้องหลัง in-memory transport; TunnelTransport เป็นเจ้าของ MCP เซิร์ฟเวอร์และ TunnelClient เชื่อมต่อกับบริการ tunnel ผ่าน WebSocket
  • โปรโตคอล: ให้บริการเฉพาะ MCP revision ปี 2025 (STDIO และ HTTP ให้บริการ 2026-07-28 ด้วย)
  • จุดเข้าใช้งาน: dist/main-tunnel.js
  • รัน: node dist/main-tunnel.js --tunnel (หรือ ankimcp --tunnel)
  • การตรวจสอบสิทธิ์: ankimcp --login / ankimcp --logout; ข้อมูลประจำตัวเก็บที่ ~/.ankimcp/credentials.json (0600)
  • Dev: npm run start:dev:tunnel (โหมด watch, รัน --tunnel --debug)

การสร้าง (Building)

npm run build  # Builds once, creates dist/ with all three entry points

main-stdio.js, main-http.js, และ main-tunnel.js ทั้งหมดถูกสร้างในไดเรกทอรี dist/ เดียวกัน เลือกอันที่ต้องการรันตามความต้องการของคุณ

การกำหนดค่าโหมด HTTP

ตัวแปรสภาพแวดล้อม:

  • PORT - พอร์ต HTTP เซิร์ฟเวอร์ (ค่าเริ่มต้น: 3000)
  • HOST - ที่อยู่ผูก (ค่าเริ่มต้น: 127.0.0.1 สำหรับ localhost เท่านั้น)
  • ALLOWED_HOSTS - ค่า Host header เพิ่มเติมคั่นด้วยเครื่องหมายจุลภาคที่ยอมรับนอกเหนือจากชุด loopback ในตัว (localhost, 127.0.0.1, ::1) เฉพาะชื่อโฮสต์และไม่คำนึงถึงพอร์ต ค่าเริ่มต้น: loopback เท่านั้น
  • ALLOWED_ORIGINS - รายการอนุญาตของรูปแบบ Origin/Referer ของเบราว์เซอร์คั่นด้วยเครื่องหมายจุลภาค; รองรับ wildcards (เช่น https://*.ngrok.io) ค่าเริ่มต้น: http://localhost:*,http://127.0.0.1:*,https://localhost:*,https://127.0.0.1:*
  • LOG_LEVEL - ระดับการบันทึก (ค่าเริ่มต้น: info)

ความปลอดภัย:

  • การตรวจสอบ Host header (การป้องกัน DNS-rebinding) — ทุกคำขอ HTTP ต้องมี Host header ที่ตรงกับรายการอนุญาต โดยค่าเริ่มต้นจะยอมรับเฉพาะ loopback hosts (localhost, 127.0.0.1, ::1) โดยไม่คำนึงถึงพอร์ต Host เป็น header ที่เบราว์เซอร์ห้ามส่ง ดังนั้นเว็บเพจที่เป็นอันตรายจึงไม่สามารถปลอมแปลงได้ — ซึ่งเป็นการปิด DNS-rebinding path ที่เพจที่ถูกเปลี่ยนเส้นทางเข้าถึงเซิร์ฟเวอร์ด้วย Host ที่ปลอมแปลงและไม่มี Origin Host ที่ไม่อนุญาตจะถูกปฏิเสธด้วย 403
  • การตรวจสอบ Origin header — คำขอจากเบราว์เซอร์ที่มี Origin/Referer ที่มีอยู่แต่ไม่อนุญาตจะถูกปฏิเสธ คำขอที่ ไม่มี Origin (curl, Postman, MCP-over-HTTP ไคลเอนต์) จะได้รับอนุญาต; การตรวจสอบ Host คือการป้องกันการ rebinding
  • ผูกกับ localhost (127.0.0.1) โดยค่าเริ่มต้น
  • ไม่มีการตรวจสอบสิทธิ์ในเวอร์ชันปัจจุบัน (วางแผนรองรับ OAuth)

การเปิดเผยโหมด HTTP นอกเหนือจาก localhost — หากคุณผูกกับที่อยู่ LAN/สาธารณะหรือวางเซิร์ฟเวอร์ไว้เบื้องหลัง reverse proxy หรือโดเมนสาธารณะ คุณ ต้อง ตั้งค่า ALLOWED_HOSTS เป็นชื่อโฮสต์ที่ไคลเอนต์จะใช้ มิฉะนั้นทุกคำขอที่ไม่ใช่ loopback จะถูกปฏิเสธด้วย 403:

# Bind to all interfaces and accept the machine's LAN name + a public domain
ALLOWED_HOSTS=my-nas.local,anki.example.com PORT=8080 HOST=0.0.0.0 node dist/main-http.js

เมื่อคุณผูกกับ 0.0.0.0/:: โดยไม่มี ALLOWED_HOSTS เซิร์ฟเวอร์จะบันทึกคำเตือนตอนเริ่มต้นว่าเฉพาะ Host header แบบ loopback เท่านั้นที่จะถูกยอมรับ

Docker / reverse proxy / โดเมนสาธารณะ: กฎเดียวกันนี้ใช้ ใน Docker คำขอปกติจะมาพร้อมกับชื่อโฮสต์ที่เผยแพร่ของคอนเทนเนอร์หรือ Host ของ proxy ดังนั้นตั้งค่า ALLOWED_HOSTS ตามนั้น reverse proxy (nginx, Caddy, Traefik) ควรส่งต่อ Host เดิมและมีชื่อโฮสต์นั้นอยู่ในรายการ ALLOWED_HOSTS หรือเขียน Host upstream ใหม่เป็น localhost การรวม --ngrok ในตัวจัดการสิ่งนี้โดยอัตโนมัติ (ดูด้านล่าง)

ตัวอย่าง: โหมดการรัน

# Development - STDIO mode (watch mode with auto-rebuild)
npm run start:dev:stdio

# Development - HTTP mode (watch mode with auto-rebuild)
npm run start:dev:http

# Production - STDIO mode
npm run start:prod:stdio
# or
node dist/main-stdio.js

# Production - HTTP mode
npm run start:prod:http
# or
PORT=8080 HOST=0.0.0.0 node dist/main-http.js

การสร้าง MCPB Bundle

เพื่อสร้าง MCPB bundle ที่แจกจ่ายได้:

npm run mcpb:bundle

คำสั่งนี้จะ:

  1. ซิงค์เวอร์ชันจาก package.json ไปยัง manifest.json
  2. ลบไฟล์ .mcpb เก่า
  3. สร้างโปรเจกต์ TypeScript
  4. แพ็คเกจ dist/ และ node_modules/ ลงในไฟล์ .mcpb
  5. รัน mcpb clean เพื่อลบ devDependencies (ปรับขนาด bundle จาก ~47MB เป็น ~10MB)

ไฟล์ผลลัพธ์จะถูกตั้งชื่อ anki-mcp-server-X.X.X.mcpb และสามารถแจกจ่ายสำหรับการติดตั้งด้วยคลิกเดียว

สิ่งที่รวมใน Bundle

MCPB bundle ประกอบด้วย:

  • JavaScript ที่คอมไพล์แล้ว (ไดเรกทอรี dist/ - รวมจุดเข้าใช้งานทั้งสาม)
  • เฉพาะ production dependencies (node_modules/ - devDependencies ถูกลบโดย mcpb clean)
  • ข้อมูลเมตาของแพ็คเกจ (package.json)
  • การกำหนดค่า Manifest (manifest.json - กำหนดค่าให้ใช้ main-stdio.js)
  • ไอคอน (icon.png)

ไฟล์ต้นฉบับ, การทดสอบ, และการกำหนดค่าการพัฒนาจะถูกแยกออกโดยอัตโนมัติผ่าน .mcpbignore

การบันทึกใน Claude Desktop

เมื่อรันเป็นส่วนขยาย MCPB ใน Claude Desktop บันทึกจะถูกเขียนไปที่:

ตำแหน่งบันทึก: ~/Library/Logs/Claude/ (macOS)

บันทึกถูกแบ่งออกเป็นหลายไฟล์:

  • main.log - บันทึกแอปพลิเคชัน Claude Desktop ทั่วไป
  • mcp-server-Anki MCP Server.log - ข้อความโปรโตคอล MCP สำหรับส่วนขยายนี้
  • mcp.log - บันทึก MCP รวมจากเซิร์ฟเวอร์ทั้งหมด

หมายเหตุ: ผลลัพธ์ของ pino logger (ข้อความ INFO, ERROR, WARN จากโค้ดเซิร์ฟเวอร์) ไปที่ stderr และปรากฏในไฟล์บันทึกเฉพาะ MCP Claude Desktop กำหนดว่าไฟล์บันทึกใดได้รับข้อความใด แต่โดยทั่วไป:

  • การเริ่มต้นแอปพลิเคชันและการสื่อสารโปรโตคอล MCP → บันทึกเฉพาะ MCP
  • การบันทึกภายในเซิร์ฟเวอร์ (pino) → ทั้งบันทึกเฉพาะ MCP และบางครั้ง main.log

เพื่อดูบันทึกแบบเรียลไทม์:

tail -f ~/Library/Logs/Claude/mcp-server-Anki\ MCP\ Server.log

การดีบัก MCP เซิร์ฟเวอร์

คุณสามารถดีบัก MCP เซิร์ฟเวอร์โดยใช้ MCP Inspector และแนบดีบักเกอร์จาก IDE ของคุณ (WebStorm, VS Code, ฯลฯ)

หมายเหตุสำหรับโหมด HTTP: เมื่อทดสอบโหมด HTTP (Streamable HTTP) กับ MCP Inspector ให้ใช้ "Connection Type: Via Proxy" เพื่อหลีกเลี่ยงข้อผิดพลาด CORS

ขั้นตอนที่ 1: กำหนดค่า Debug Server ใน MCP Inspector

mcp-inspector-config.json มีการกำหนดค่า debug server อยู่แล้ว:

{
  "mcpServers": {
    "stdio-server-debug": {
      "type": "stdio",
      "command": "node",
      "args": ["--inspect-brk=9229", "dist/main-stdio.js"],
      "env": {
        "MCP_SERVER_NAME": "anki-mcp-stdio-debug",
        "MCP_SERVER_VERSION": "1.0.0",
        "LOG_LEVEL": "debug"
      },
      "note": "Anki MCP server with debugging enabled on port 9229"
    }
  }
}

ขั้นตอนที่ 2: เริ่ม Debug Server

รัน MCP Inspector พร้อม debug server:

npm run inspector:debug

这将เริ่มเซิร์ฟเวอร์โดยเปิดใช้งานการดีบัก Node.js บนพอร์ต 9229 และหยุดการทำงานชั่วคราวที่บรรทัดแรก

ขั้นตอนที่ 3: แนบดีบักเกอร์จาก IDE ของคุณ

WebStorm
  1. ไปที่ Run → Edit Configurations
  2. เพิ่มการกำหนดค่า Attach to Node.js/Chrome ใหม่
  3. ตั้งค่าพอร์ตเป็น 9229
  4. คลิก Debug เพื่อแนบ
VS Code
  1. เปิดแผง Debug (Ctrl+Shift+D / Cmd+Shift+D)
  2. เลือกการกำหนดค่า Debug MCP Server (Attach)
  3. กด F5 เพื่อแนบ

ขั้นตอนที่ 4: ตั้งจุดพักและดีบัก

เมื่อแนบแล้ว คุณสามารถ:

  • ตั้งจุดพักในไฟล์ต้นฉบับ TypeScript ของคุณ
  • ก้าวผ่านการทำงานของโค้ด
  • ตรวจสอบตัวแปรและ call stack
  • ใช้คอนโซลดีบักสำหรับการประเมินนิพจน์

ดีบักเกอร์จะทำงานร่วมกับ source maps ทำให้คุณสามารถดีบักโค้ด TypeScript ต้นฉบับแทน JavaScript ที่คอมไพล์แล้ว

การดีบักกับ Claude Desktop

คุณยังสามารถดีบัก MCP เซิร์ฟเวอร์ขณะที่มันรันภายใน Claude Desktop โดยเปิดใช้งาน Node.js debugger และแนบ IDE ของคุณ

ขั้นตอนที่ 1: กำหนดค่า Claude Desktop สำหรับการดีบัก

อัปเดตการกำหนดค่า Claude Desktop ของคุณเพื่อเปิดใช้งานการดีบัก:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "anki-mcp": {
      "command": "node",
      "args": [
        "--inspect=9229",
        "<path_to_project>/anki-mcp-server/dist/main-stdio.js"
      ],
      "env": {
        "ANKI_CONNECT_URL": "http://localhost:8765"
      }
    }
  }
}

การเปลี่ยนแปลงสำคัญ: เพิ่ม --inspect=9229 ก่อน path ไปยัง dist/main-stdio.js

ตัวเลือกการดีบัก:

  • --inspect=9229 - เริ่มดีบักเกอร์ทันที ไม่บล็อก (แนะนำ)
  • --inspect-brk=9229 - หยุดการทำงานชั่วคราวจนกว่าดีบักเกอร์จะแนบ (สำหรับดีบักปัญหาการเริ่มต้น)

ขั้นตอนที่ 2: รีสตาร์ท Claude Desktop

หลังจากบันทึกการกำหนดค่า ให้รีสตาร์ท Claude Desktop MCP เซิร์ฟเวอร์จะรันด้วยการดีบักที่เปิดใช้งานบนพอร์ต 9229

ขั้นตอนที่ 3: แนบดีบักเกอร์จาก IDE ของคุณ

WebStorm
  1. ไปที่ Run → Edit Configurations
  2. คลิกปุ่ม + และเลือก Attach to Node.js/Chrome
  3. กำหนดค่า:
    • Name: Attach to Anki MCP (Claude Desktop)
    • Host: localhost
    • Port: 9229
    • Attach to: Node.js < 8 หรือ Chrome or Node.js > 6.3 (ขึ้นอยู่กับเวอร์ชัน WebStorm)
  4. คลิก OK
  5. คลิก Debug (Shift+F9) เพื่อแนบ
VS Code
  1. เพิ่มใน .vscode/launch.json:
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "attach",
      "name": "Attach to Anki MCP (Claude Desktop)",
      "port": 9229,
      "skipFiles": ["<node_internals>/**"],
      "sourceMaps": true,
      "outFiles": ["${workspaceFolder}/dist/**/*.js"]
    }
  ]
}
  1. เปิดแผง Debug (Ctrl+Shift+D / Cmd+Shift+D)
  2. เลือก Attach to Anki MCP (Claude Desktop)
  3. กด F5 เพื่อแนบ

ขั้นตอนที่ 4: ดีบักแบบเรียลไทม์

เมื่อแนบแล้ว คุณสามารถ:

  • ตั้งจุดพัก (breakpoints) ในไฟล์ซอร์ส TypeScript ของคุณ (เช่น src/mcp/primitives/essential/tools/create-model.tool.ts)
  • ใช้ Claude Desktop ตามปกติ — จุดพักจะทำงานเมื่อมีการเรียกใช้เครื่องมือ
  • ไล่ขั้นตอนการทำงานของโค้ด
  • ตรวจสอบตัวแปรและ call stack
  • ใช้คอนโซลดีบัก

ตัวอย่าง: ตั้งจุดพักใน create-model.tool.ts ที่บรรทัด 119 จากนั้นให้ Claude สร้างโมเดลใหม่ ดีบักเกอร์จะหยุดที่จุดพักของคุณ!

หมายเหตุ: ดีบักเกอร์จะยังคงแนบอยู่ตราบเท่าที่ Claude Desktop ยังทำงานอยู่ คุณสามารถถอด/แนบใหม่ได้ตลอดเวลาโดยไม่ต้องรีสตาร์ท Claude Desktop

คำสั่งสำหรับการ Build

npm run build              # Build the project (compile TypeScript to JavaScript)
npm run start:dev:stdio    # STDIO mode with watch (auto-rebuild)
npm run start:dev:http     # HTTP mode with watch (auto-rebuild)
npm run type-check         # Run TypeScript type checking
npm run lint               # Run ESLint
npm run mcpb:bundle        # Sync version, clean, build, and create MCPB bundle

การทดสอบแพ็กเกจ npm (ในเครื่อง)

ทดสอบแพ็กเกจ npm ในเครื่องก่อนเผยแพร่:

# 1. Create local package
npm run pack:local         # Builds and creates @ankimcp/anki-mcp-server-*.tgz

# 2. Install globally from local package
npm run install:local      # Installs from ./@ankimcp/anki-mcp-server-*.tgz

# 3. Test the command
ankimcp                    # Runs HTTP server on port 3000

# 4. Uninstall when done testing
npm run uninstall:local    # Removes global installation

วิธีการทำงาน:

  • npm pack สร้างไฟล์ .tgz ที่เหมือนกับสิ่งที่ npm publish จะสร้าง
  • การติดตั้งจาก .tgz จำลองสิ่งที่ผู้ใช้ได้รับจาก npm install -g ankimcp
  • วิธีนี้ช่วยให้คุณทดสอบประสบการณ์ผู้ใช้ทั้งหมดก่อนเผยแพร่ไปยัง npm

คำสั่งสำหรับการทดสอบ

npm test              # Run all tests
npm run test:unit     # Run unit tests only
npm run test:tools    # Run tool-specific tests
npm run test:workflows # Run workflow integration tests
npm run test:e2e      # Run end-to-end tests
npm run test:cov      # Run tests with coverage report
npm run test:watch    # Run tests in watch mode
npm run test:debug    # Run tests with debugger
npm run test:ci       # Run tests for CI (silent, with coverage)

ความครอบคลุมการทดสอบ

โปรเจกต์นี้รักษาเกณฑ์ความครอบคลุมขั้นต่ำ 70% สำหรับ:

  • Branches
  • Functions
  • Lines
  • Statements

รายงานความครอบคลุมจะถูกสร้างในไดเรกทอรี coverage/

การกำหนดเวอร์ชัน

โปรเจกต์นี้ปฏิบัติตาม Semantic Versioning ด้วยแนวทางการพัฒนาแบบก่อน 1.0:

  • 0.x.x — เวอร์ชันเบต้า/พัฒนา (ระยะปัจจุบัน)

    • 0.1.x — การแก้ไขบั๊กและแพตช์
    • 0.2.0+ — ฟีเจอร์ใหม่หรือการปรับปรุงเล็กน้อย
    • การเปลี่ยนแปลงที่ทำลายความเข้ากันได้ สามารถเกิดขึ้นได้ในเวอร์ชัน 0.x
  • 1.0.0 — เวอร์ชันเสถียรแรก

    • จะเผยแพร่เมื่อ API มีความเสถียรและผ่านการทดสอบแล้ว
    • การเปลี่ยนแปลงที่ทำลายความเข้ากันได้จะต้องเพิ่มหมายเลขเวอร์ชันหลัก (2.0.0, ฯลฯ)

สถานะปัจจุบัน: 0.22.0 — การพัฒนาเบต้าที่ใช้งานอยู่ ฟีเจอร์ล่าสุดได้แก่ การวิเคราะห์การทบทวนทั้งคอลเลกชัน (review_stats ตอนนี้รวมข้อมูลทุกสำรับเมื่อละเว้น deck), การจัดการฟิลด์โมเดล (addModelField, removeModelField, renameModelField, repositionModelField), การสร้างโน้ตแบบกลุ่ม (addNotes), การทำอุโมงค์ ngrok ในตัว (แฟล็ก --ngrok), การจัดการไฟล์สื่อ, การจัดการโมเดล/เทมเพลต และสถิติสำรับที่ครอบคลุม API อาจมีการเปลี่ยนแปลงตามความคิดเห็นและการทดสอบ

วิวัฒนาการของสเปก MCPB

โปรเจกต์นี้กำหนดเป้าหมายสเปกบันเดิล MCPB ของ Anthropic ซึ่งยังคงมีการพัฒนา เราติดตามสเปกที่ https://github.com/modelcontextprotocol/mcpb และอาจมีการเปลี่ยนแปลงที่ทำลายความเข้ากันได้เพื่อให้เป็นไปตามข้อกำหนด การเปลี่ยนแปลงที่ทำลายความเข้ากันได้ได้รับอนุญาตภายใต้รูปแบบเวอร์ชัน 0.x.x

โปรเจกต์ที่คล้ายกัน

หากคุณกำลังสำรวจการผสานรวม Anki MCP นี่คือโปรเจกต์อื่น ๆ ในพื้นที่นี้:

scorzeth/anki-mcp-server

  • สถานะ: ดูเหมือนจะถูกทิ้งร้าง (ไม่มีการอัปเดตล่าสุด)
  • การใช้งานการผสานรวม Anki MCP ในช่วงแรก

nailuoGG/anki-mcp-server

  • แนวทาง: การใช้งานแบบไฟล์เดียวที่มีน้ำหนักเบา
  • สถาปัตยกรรม: โครงสร้างโค้ดแบบ Procedural โดยมีเครื่องมือทั้งหมดในไฟล์เดียว
  • เหมาะสำหรับ: กรณีการใช้งานง่าย ๆ ที่มีการพึ่งพาน้อยที่สุด

เหตุผลที่โปรเจกต์นี้แตกต่าง:

  • สถาปัตยกรรมระดับองค์กร: สร้างบน NestJS พร้อมการฉีด dependency
  • การออกแบบแบบโมดูลาร์: เครื่องมือแต่ละตัวเป็นคลาสแยกที่มีการแยกความรับผิดชอบอย่างชัดเจน
  • การบำรุงรักษา: ง่ายต่อการขยายด้วยฟีเจอร์ใหม่โดยไม่ต้องแก้ไขโค้ดที่มีอยู่
  • การทดสอบ: ชุดทดสอบที่ครอบคลุมพร้อมข้อกำหนดความครอบคลุม 70%
  • ความปลอดภัยของประเภทข้อมูล: TypeScript ที่เข้มงวดพร้อมการตรวจสอบ Zod
  • การจัดการข้อผิดพลาด: การจัดการข้อผิดพลาดที่แข็งแกร่งพร้อมข้อเสนอแนะที่เป็นประโยชน์ต่อผู้ใช้
  • พร้อมสำหรับการผลิต: การบันทึกที่เหมาะสม การรายงานความคืบหน้า และการสนับสนุนบันเดิล MCPB
  • ความสามารถในการขยาย: สามารถเติบโตจากเครื่องมือพื้นฐานไปจนถึงเวิร์กโฟลว์ที่ซับซ้อนได้อย่างง่ายดาย

กรณีการใช้งาน: หากคุณต้องการพื้นฐานที่มั่นคงสำหรับการสร้างการผสานรวม Anki ขั้นสูงหรือวางแผนที่จะขยายฟังก์ชันการทำงานอย่างมีนัยสำคัญ แนวทางสถาปัตยกรรมของโปรเจกต์นี้ทำให้ง่ายต่อการบำรุงรักษาและขยายเมื่อเวลาผ่านไป

ลิงก์ที่มีประโยชน์

สัญญาอนุญาตและการระบุแหล่งที่มา

โปรเจกต์นี้อยู่ภายใต้สัญญาอนุญาต MIT — ดู LICENSE สำหรับข้อความเต็ม

ลิขสิทธิ์ © 2026 Anatoly Tarnavsky

การระบุแหล่งที่มาของบุคคลที่สาม

  • Anki® เป็นเครื่องหมายการค้าจดทะเบียนของ Ankitects Pty Ltd โปรเจกต์นี้เป็นเครื่องมือบุคคลที่สามที่ไม่เป็นทางการ และไม่มีความเกี่ยวข้อง ได้รับการรับรอง หรือได้รับการสนับสนุนจาก Ankitects Pty Ltd โลโก้ Anki ถูกใช้ภายใต้สัญญาอนุญาตทางเลือกสำหรับการอ้างอิง Anki พร้อมลิงก์ไปยัง https://apps.ankiweb.net สำหรับแอปพลิเคชัน Anki อย่างเป็นทางการ โปรดเยี่ยมชม https://apps.ankiweb.net

  • Model Context Protocol (MCP) เป็นมาตรฐานเปิดโดย Anthropic โลโก้ MCP มาจาก ที่เก็บเอกสาร MCP อย่างเป็นทางการ และใช้ภายใต้สัญญาอนุญาต MIT สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ MCP โปรดเยี่ยมชม https://modelcontextprotocol.io

  • นี่เป็นโปรเจกต์อิสระที่เชื่อมโยงเทคโนโลยี Anki และ MCP เครื่องหมายการค้า เครื่องหมายบริการ ชื่อทางการค้า ชื่อผลิตภัณฑ์ และโลโก้ทั้งหมดเป็นทรัพย์สินของเจ้าของตามลำดับ