# 建置指南:打造本地 Notion + WordPress RAG 知識庫 > 這份指南是給想要自己動手複製的讀者。 > 你不需要懂程式——你只需要把下面的提示詞,貼給 Claude Code 執行就好。 > 每個 Phase 都附有「驗收方式」,確認成功再繼續下一步。 ## 這套系統的架構特色:RAG + SQL 雙引擎 很多人說的「本地 RAG 知識庫」,指的是語意向量搜尋(Qdrant)。 這套系統多加了一層:**同時跑 SQLite 做精準條件篩選**。 兩個引擎各自解決不同的問題: | 查詢類型 | 引擎 | 範例 | |---------|------|------| | 語意模糊查詢 | Qdrant 向量資料庫(RAG) | 「有沒有關於讀書方法的筆記?」 | | 精準條件篩選 | SQLite(SQL) | 「所有狀態是 Finished、分類是商業管理的書」 | 光用語意搜尋,你問「Finished 的書有哪些」可能出不來——因為語意搜尋是找「意思相近」的,不做條件過濾。 光用 SQL,你問「有什麼讀書心得」找到的可能很有限——因為它只找文字完全吻合的。 兩個並行,才能涵蓋你所有可能問的問題類型。 --- ## 你需要準備什麼 ### 軟體安裝(事前準備) | 項目 | 說明 | 下載位置 | |------|------|---------| | Python 3.11 以上 | 整套系統的執行環境 | python.org | | Ollama | 本機跑 AI 圖片分析模型 | ollama.com | | Claude Desktop | 對話介面,連接你的知識庫 | claude.ai/download | | Claude Code | 幫你寫程式的 AI 工程師 | claude.ai/code | 安裝 Ollama 後,開終端機執行: ```bash ollama pull llava-phi3 ``` 這會下載圖片分析模型(約 2.9 GB),只需下載一次。 ### 帳號 & API | 項目 | 說明 | |------|------| | Notion Integration Token | 到 notion.so/my-integrations 建立,選「Read content」權限即可 | | WordPress 網址 | 你的 WordPress 部落格網址(選配,有才需要做 Phase 9) | > **Notion Integration 設定提醒**:建立 Integration 後,要去每個 Notion 資料庫,點右上角「...」→「連結到」,把你建立的 Integration 加進去,AI 才讀得到。 ### 磁碟空間 | 項目 | 估計空間 | |------|---------| | Python 套件 | 約 3-5 GB | | llava-phi3 模型 | 約 2.9 GB | | 圖片下載(視資料量) | 視個人 Notion 而定 | | 建議總預留空間 | 15 GB 以上 | --- ## 系統架構全貌 ### 整體架構(RAG + SQL 雙引擎) ``` ┌──────────────────────────────────────────────────┐ │ 資料來源 │ │ Notion(3,000+ 頁筆記、圖片、PDF) │ │ WordPress(100+ 篇部落格文章) [選配] │ └──────────────┬───────────────────────────────────┘ │ 每天凌晨自動同步 ↓ ┌──────────────────────────────────────────────────┐ │ 本地資料儲存 │ │ pages.json 圖片附件 PDF 附件 │ └──┬─────────────────┬──────────────────┬──────────┘ ↓ ↓ ↓ sqlite_sync process_images process_pdfs (屬性索引) (AI 看圖說話) (PDF 文字擷取) ↓ ↓ ↓ ┌──────────────────────────────────────────────────┐ │ build_vector_db.py │ │ 把所有資料合併,建立語意向量索引 │ └──────────────┬───────────────────────────────────┘ │ ┌────────┴─────────┐ ↓ ↓ ┌──────────┐ ┌──────────────┐ │ Qdrant │ │ SQLite │ │ 向量資料庫│ │ 屬性資料庫 │ │ (語意) │ │ (精準篩選)│ └────┬─────┘ └──────┬───────┘ └─────────┬──────────┘ ↓ ┌──────────────┐ │ MCP Server │ │(本地自建橋接)│ └──────┬───────┘ ↓ ┌───────────────┐ │ Claude Desktop│ │ │ │ 3 個工具可用 │ │ search_knowledge 語意搜尋 │ query_properties 精準篩選 │ get_page_content 取完整頁面+自動開啟圖片 └───────────────┘ ``` ### 每日自動同步流程 ``` 凌晨 3:00 │ ↓ [1] Windows 工作排程器觸發 daily_sync.bat │ ↓ [2] 同步資料來源 sync_all.py ├── notion_sync.py(增量同步 Notion,只處理有變動的頁面) └── wordpress_sync.py(增量同步 WordPress)[選配] │ ↓ [3] 處理附件 process_pdfs.py(擷取 PDF 文字,增量,已處理跳過) │ ↓ [4] AI 圖片描述 process_images.py(llava-phi3 看圖,增量,已描述跳過) │ ↓ [5] 重建向量索引 build_vector_db.py(把所有資料向量化存入 Qdrant) │ ↓ 記錄 log,寫入 last_sync_status.txt 完成 ``` --- ## 完整提示詞(依序執行) > **使用方式**:開啟 Claude Code,切換到你的專案資料夾,把以下提示詞貼入,讓 Claude Code 幫你完成。 > 每個 Phase 完成後,先驗收,再繼續下一步。 --- ### Phase 1:環境準備 **完成這個 Phase 之後**:你的電腦上會有一個完整的專案資料夾結構、Python 虛擬環境、以及所有必要設定檔。 ``` 我要建立一套本地 RAG 知識庫系統,讓 Claude Desktop 可以智慧查詢我的 Notion 筆記。 這個系統會: 1. 把 Notion 所有筆記同步到本地 2. 建立語意搜尋(Qdrant 向量資料庫) 3. 建立屬性精準篩選(SQLite) 4. 透過 MCP Server 讓 Claude Desktop 可以查詢 請幫我完成環境準備: 1. 建立專案資料夾結構: 專案根目錄/ ├── .env # 存放 API Token ├── .gitignore ├── sync/ │ └── data/ # 存放 pages.json ├── embeddings/ ├── mcp_server/ ├── scripts/ ├── attachments/ │ ├── images/ │ └── pdfs/ └── logs/ 2. 建立 Python 虛擬環境(venv),安裝以下套件: notion-client, qdrant-client, sentence-transformers, python-dotenv, mcp, beautifulsoup4, Pillow, PyMuPDF, requests 3. 建立 sync/config.py,集中管理所有設定: - 專案根目錄路徑 - pages.json 路徑 - attachments 路徑 - API 請求間隔(SLEEP_BETWEEN_REQUESTS = 0.5) - 每批處理頁面數(BATCH_SIZE = 10) - Embedding batch size(EMBEDDING_BATCH_SIZE = 32) 4. 建立 .env 模板(只含變數名稱,不含實際值): NOTION_TOKEN= NOTION_WORKSPACE_NAME= 5. 建立 .gitignore(包含 .env、venv/、qdrant_data/、*.db、sync/data/) 請確認每個步驟是否完成,最後列出已安裝的套件清單。 ``` **驗收**:資料夾結構存在,`venv\Scripts\python.exe -c "import notion_client; print('OK')"` 不報錯。 --- ### Phase 2:Notion 同步腳本 **完成這個 Phase 之後**:可以把你的 Notion 所有頁面同步到本地 pages.json,包含圖片和 PDF 附件下載。 ``` 環境準備已完成(Phase 1),現在要建立 Notion 同步腳本。 請建立 sync/notion_sync.py,功能如下: 1. 讀取 .env 的 NOTION_TOKEN 2. 抓取我的 Notion 所有頁面(搜尋所有 page 和 database 類型) 3. 每個頁面儲存以下資料: - id(Notion UUID) - title(標題) - source(固定值 "notion") - last_edited_time - created_time - url(Notion 頁面網址) - database_name(所屬資料庫名稱) - properties(頁面的所有屬性值) - text_content(純文字內容,從 blocks 擷取) - attachments(圖片和 PDF 的本地路徑) - content_hash(md5,用於增量偵測) 4. 增量同步邏輯: - 比對 last_edited_time,沒變動的頁面跳過 - 新頁面才下載附件 5. 圖片和 PDF 附件下載到 attachments/images/ 和 attachments/pdfs/ 6. 結果存為 sync/data/pages.json 7. API 速率保護:每次請求之間 sleep(0.5),每批 10 頁 重要注意事項: - Notion parent type 有時是 "data_source_id"(不是 "database_id"),兩種都需要處理 - 建立 database_names.json 快取,記錄 database_id → 名稱的對應,減少重複 API 呼叫 - 同步完成後印出統計:總頁面數、文字頁面數、下載附件數 請同時建立一個簡單的測試腳本,讓我可以先測試 API Token 是否有效。 ``` **驗收**:執行後 pages.json 出現資料,確認有你的 Notion 頁面標題。 --- ### Phase 3:語意向量資料庫 **完成這個 Phase 之後**:pages.json 的所有內容會被向量化,存入 Qdrant,可以做語意搜尋。 ``` Notion 同步腳本已完成(Phase 2),pages.json 已有資料。 請建立 embeddings/build_vector_db.py,功能如下: 1. 使用 sentence-transformers 的 paraphrase-multilingual-MiniLM-L12-v2 模型 (支援中英混雜,384 維向量) 2. 建立本地 Qdrant 資料庫(存在 qdrant_data/ 資料夾),Collection 名稱 "notion_pages", 使用 Cosine 相似度 3. 為每個頁面建立 combined_text(供向量化用): 標題 + 屬性摘要(屬性名稱: 屬性值) + 文字內容前 1000 字 如果有 image_descriptions(圖片 AI 描述),也納入 如果有 pdf_texts(PDF 文字),也納入 4. Qdrant payload(必須包含以下欄位,之後搜尋時需要): - id(頁面 UUID) - title(標題) - source("notion" 或 "wordpress") - database_name(所屬資料庫名稱) - url(頁面連結) - property_summary(屬性摘要,搜尋結果顯示用) 5. 分批處理,batch_size = 32(記憶體保護,不要改大) 6. 支援增量更新:已存在且內容未變的跳過 重要注意事項: - qdrant-client 1.12 以上已棄用 search(),改用 query_points() API - Collection 不存在時自動建立 - 完成後印出統計:向量總數、本次新增數 請同時建立 embeddings/verify_index.py,讓我可以輸入關鍵字測試搜尋是否正常。 ``` **驗收**:執行 `verify_index.py`,輸入任意關鍵字,能搜到相關頁面。 --- ### Phase 4:MCP Server **完成這個 Phase 之後**:Claude Desktop 可以透過 MCP 協定,呼叫兩個工具查詢你的知識庫。 ``` 向量資料庫已建好(Phase 3)。 請建立 mcp_server/server.py,這是一個 MCP Server(stdio 模式),提供兩個工具: 工具一:search_knowledge - 功能:語意搜尋,返回最相關的頁面(預設 top 5) - 輸入參數:query(搜尋詞),top_k(返回數量,預設 5) - 使用 Qdrant query_points() 搜尋 - 返回格式: [1] 頁面標題 📔 Notion / 📝 WordPress(根據 source 欄位) 資料庫:所屬資料庫名稱 屬性摘要(如果有) 相關度:0.XX 網址:https://... - 搜尋結果顯示 📔 Notion 或 📝 WordPress 來源標示 工具二:get_page_content - 功能:根據頁面 ID 取得完整內容 - 輸入參數:page_id - 返回:頁面標題 + 所有文字內容 + 圖片本機路徑(最多 5 張) - 圖片會同時用 os.startfile() 在 Windows 自動彈開(Claude Desktop 不支援在對話視窗渲染圖片) 重要注意事項: - MCP Server 使用 stdio 模式,所有 print() 和 log 必須輸出到 stderr (print("...", file=sys.stderr)),絕不能輸出到 stdout, 否則會汙染 MCP JSON 通訊導致 Claude Desktop 無法讀取 - 使用 mcp 套件,工具定義使用 @server.call_tool() 裝飾器 請同時建立 mcp_server/claude_desktop_config.json, 內容是 Claude Desktop 的 MCP 設定,讓我知道要貼到哪裡。 ``` **驗收**:重啟 Claude Desktop,在設定 → MCP Server 確認你的 server 出現,並對 Claude 問一個問題,確認它會呼叫 search_knowledge。 這邊我還有去claude desktop的個人設定(setting)敘述如何調用知識庫工具,內容如下: ## 本地知識庫 MCP 使用規則 當我說查找我知識庫資料的時候, 請使用本地端MCP ( local-rag-knowledge)來執行查詢 我有一個本地端 Notion RAG 知識庫,透過 MCP 連接,有三個工具: **工具一:search_knowledge(語意搜尋)** 用途:找「跟某主題相關的內容」、筆記、想法、文章 範例:「我有沒有讀過關於投資心理的書」、「跟咖啡相關的記錄」 **工具二:query_properties(精準屬性篩選)** 用途:找「符合某條件的項目」,凡是涉及以下條件一律用這個: - 位置(例:淑娟電腦、世傑電腦、世傑隨身) - 狀態(使用中、備用、退役) - 閱讀狀態(Reading、Finished、排隊中) - 廠牌、購買通路、分類 - 日期範圍、金額大小比較 **工具三:get_page_content(取得完整頁面內容與附件圖片)** 用途:取得某頁面的完整內容,包含文字、屬性、以及原始圖片附件 使用時機: - 找到頁面後想看詳細內容或圖片 - 使用者問「能看到圖片嗎」、「有附件嗎」、「詳細內容是什麼」 - 需要判讀圖片內容(產品圖、截圖、掃描文件等) 注意:最多回傳 5 張圖片,需要先有 page_id 才能呼叫 **使用原則:** - 問「XX有哪些設備/物品」→ query_properties,key=位置 - 問「我買了哪些XX牌的東西」→ query_properties,key=廠牌 - 問「讀完的書有哪些」→ query_properties,key=閱讀狀態 - 問「某筆記說了什麼」→ search_knowledge - 問「這個頁面的圖片/附件是什麼」→ get_page_content - 不確定時,優先用 query_properties,沒結果再用 search_knowledge - 需要圖片或完整內容時,先用前兩個工具找到 page_id,再用 get_page_content 取得 當我說「查找我知識庫資料」,請使用本地端 MCP(local-rag-knowledge)執行查詢。 --- ### Phase 5:SQLite 精準屬性篩選 **完成這個 Phase 之後**:多了一個資料庫專門處理精確條件查詢(指定狀態、分類、標籤等)。 ``` MCP Server 基礎版已完成(Phase 4)。 要新增 SQLite 精準屬性篩選功能,請做以下事情: 1. 建立 sync/sqlite_sync.py: - 建立 SQLite 資料庫 notion_properties.db - Table 結構: pages 表(page_id, title, database_name, source, url, last_edited_time) page_properties 表(page_id, property_name, property_value, property_type) - upsert_page():更新頁面基本資料 - upsert_properties():更新屬性值(先刪後寫) - delete_removed_pages():刪除已移除的頁面 2. 建立 sync/build_sqlite_from_json.py: 一次性從 pages.json 建立完整 SQLite(初始化用) 3. extract_property_value() 函數,支援以下 Notion 屬性類型: title, rich_text, select, multi_select, number, date, url, checkbox, email, phone_number 4. 修改 notion_sync.py,在同步完成後自動寫入 SQLite 5. 修改 mcp_server/server.py,新增第三個工具: 工具名稱:query_properties 功能:支援條件篩選,例如: - 「閱讀清單裡狀態是 Finished 的書」 - 「金額超過 5000 的支出」 - 「WordPress 部落格的所有文章」 輸入:自然語言條件,轉成 SQL WHERE 條件 重要注意事項: - Notion parent 有時 type = "data_source_id"(不是 "database_id") 兩種情況都要能正確提取 database_id ``` **驗收**:執行 `build_sqlite_from_json.py`,然後在 Claude Desktop 問「我的閱讀清單有哪些書」確認 query_properties 工具有被呼叫並返回結果。 --- ### Phase 6:圖片 AI 描述 + 圖片自動開啟 **完成這個 Phase 之後**:Notion 裡的圖片可以被語意搜尋找到;呼叫 get_page_content 時,圖片會自動用 Windows 預設程式彈開給你看。 > **重要說明**:Claude Desktop 收到 MCP 工具回傳的 `ImageContent` 時,Claude 自己(AI)確實看得到圖片並可以描述,但對話視窗**不會把圖片渲染出來給使用者看**。解決辦法是讓 MCP Server 在回傳圖片的同時,呼叫 `os.startfile()` 自動用 Windows 預設程式開啟圖片。 ``` SQLite 已完成(Phase 5),本機已安裝 Ollama 並拉好 llava-phi3 模型。 請建立 embeddings/process_images.py: 1. 掃描 attachments/images/ 資料夾的所有圖片 2. 對每張圖片呼叫本機 Ollama API(llava-phi3 模型),請它用中文描述圖片內容 3. 描述結果存回 pages.json 對應頁面的 image_descriptions 欄位 4. 增量處理:已有描述的圖片跳過,節省時間 重要注意事項 1(這是一個容易踩到的坑): Notion 下載的圖片,副檔名可能是 .png,但實際格式是 WEBP。 直接把 WEBP 格式的圖片送給 Ollama 會報錯。 解決方法:先用 Pillow 的 Image.open() 偵測真實格式(檢查 img.format), 如果不是 JPEG 或 PNG,就先轉成 JPEG 再送給 Ollama。 重要注意事項 2: 如果 Ollama 沒有在跑,跳過圖片描述,不要讓程式崩潰。 請同時修改 mcp_server/server.py 的 get_page_content 工具: - 頁面有 attachments 時,從本地讀取圖片檔案 - 用 ImageContent 型別(base64)回傳圖片(Claude AI 可看到並描述),最多 5 張 - 回傳每張圖片時,同步呼叫 os.startfile(local_path),自動用 Windows 預設程式開啟 - 在回應文字末尾附上每張圖片的本機絕對路徑(使用者可手動開啟備用) 【os.startfile() 的效果】:等同使用者在 Windows 資料夾裡雙擊圖片, 會用預設看圖程式(Windows Photos 等)自動彈開,使用者立刻看到圖片, 不需要自己去找資料夾。 ``` **驗收**:執行 `process_images.py` 後,在 Claude Desktop 說「把 [某有圖片的頁面] 完整給我看」,確認: 1. Claude 對話框出現「已自動開啟 X 張圖片」的訊息 2. Windows 看圖程式自動彈出,圖片顯示正常 --- ### Phase 7:每日自動排程(Windows) **完成這個 Phase 之後**:系統每天凌晨 3 點自動同步,早上起來知識庫已是最新狀態。 ``` 所有核心功能已完成(Phase 1-6)。 請建立自動排程: 1. 建立 scripts/daily_sync.bat,依序執行 5 個步驟: [1/5] 設定路徑和記錄開始時間 [2/5] 執行 Notion 增量同步(sync/notion_sync.py) [3/5] 擷取 PDF 文字(embeddings/process_pdfs.py) [4/5] AI 圖片描述(embeddings/process_images.py) [5/5] 重建向量資料庫(embeddings/build_vector_db.py) - 每個步驟失敗都記錄到 logs/sync_YYYYMMDD.log - 全部完成後寫入 logs/last_sync_status.txt(包含 SUCCESS/FAILED 和時間) - 執行 build_vector_db.py 之前,先用 taskkill 關閉所有 python.exe (因為 Qdrant 被 MCP Server 佔用時無法重建) 2. 建立 scripts/setup_scheduler.bat: 使用 Windows schtasks 設定每天凌晨 3:00 執行 daily_sync.bat (提示:schtasks /create /tn "NotionSync" /tr "..." /sc DAILY /st 03:00) 執行 setup_scheduler.bat 完成排程設定後, 教我如何確認排程有沒有設定成功(Windows 工作排程器查看方式)。 ``` **驗收**:Windows 工作排程器裡看到 "NotionSync" 任務,狀態為「就緒」。手動執行一次 daily_sync.bat,確認 last_sync_status.txt 出現 SUCCESS。 --- ### Phase 8:PDF 文字擷取 **完成這個 Phase 之後**:Notion 附件裡的 PDF 內容也會被索引,可以被語意搜尋找到。 ``` 每日排程已完成(Phase 7)。 請建立 embeddings/process_pdfs.py: 1. 掃描 attachments/pdfs/ 的所有 PDF 檔案 2. 使用 PyMuPDF(import fitz)擷取每個 PDF 的純文字 3. 把文字存回 pages.json 對應頁面的 pdf_texts 欄位(是個 list,每個元素一個 PDF 的文字) 4. 增量處理:已有 pdf_texts 的頁面跳過 請確認 build_vector_db.py 在建立 combined_text 時,也把 pdf_texts 的內容納入向量化。 安裝指令:venv\Scripts\pip.exe install PyMuPDF ``` **驗收**:執行後,對 Claude 問「我有沒有關於 [你某個 PDF 的主題] 的資料」,確認搜尋結果出現 PDF 相關內容。 --- ### Phase 9:WordPress 部落格同步(選配) **完成這個 Phase 之後**:你的 WordPress 部落格文章也會進入知識庫,可以和 Notion 筆記一起搜尋。 > 只有 WordPress 部落格才適用。其他部落格平台需要調整 API 呼叫方式。 ``` Notion RAG 系統已完成(Phase 1-8),現在要把 WordPress 部落格一起納入。 我的 WordPress 網址:[填入你的 WordPress 網址] 請建立 sync/wordpress_sync.py: 1. 呼叫 WordPress REST API 抓取所有已發布文章: GET https://你的網址/wp-json/wp/v2/posts?per_page=100&status=publish&_embed=1 (_embed=1 可以一次拿到分類、標籤、特色圖片,不需要額外 API) 2. 每篇文章轉成以下格式(與 Notion pages 相容): - id:使用 uuid.uuid5(uuid.NAMESPACE_URL, "https://你的網址/?p={post_id}") (確定性 UUID,同一篇文章每次 ID 相同,且不與 Notion UUID 衝突) - source:"wordpress" - title:文章標題 - database_name:"WordPress部落格"(固定值) - last_edited_time:modified_gmt + "Z"(用於增量偵測) - text_content:用 BeautifulSoup 把 HTML 轉成純文字 - properties:包含分類、標籤、發布日期、文章連結 - attachments:特色圖片 + 內文圖片(最多 5 張,下載到 attachments/images/wp_{id}_{n}.jpg) 3. pages.json merge 策略: - 讀取現有 pages.json,把 WordPress 文章(source == "wordpress")和 Notion 分開 - 更新 WordPress 部分 - 合併後存回 pages.json(Notion 頁面完整保留,不刪除) 4. 同步寫入 SQLite 5. 建立 sync/sync_all.py,統一入口:先跑 notion_sync,再跑 wordpress_sync 重要注意事項(避免踩坑): - 修改 notion_sync.py 的 delete_removed_pages(): 加入保護邏輯,把 SQLite 裡所有 database_name='WordPress部落格' 的頁面 ID, 加進「不刪除」的保護清單,避免 Notion 同步時誤刪 WordPress 頁面。 - 修改 notion_sync.py 的 load_existing_data() 和 save_results(): load 時把 source != "notion" 的頁面分開保存到 self._preserved_pages; save 時把 self._preserved_pages 一起合回去存檔。 (否則每次 Notion 同步後,WordPress 頁面會消失,下次 WordPress 同步就要重抓全部) - 修改 build_vector_db.py,Qdrant payload 加入 source 和 database_name 欄位 (否則 Claude 無法區分 Notion 和 WordPress 的搜尋結果) - 修改 mcp_server/server.py: 搜尋結果根據 source 欄位,在標題後加上 📝 WordPress 或 📔 Notion 標示 - 修改 scripts/daily_sync.bat 的 [2/5],改成執行 sync_all.py 請說明安裝 beautifulsoup4 的指令,以及如何驗收(100 篇全部可以搜尋到)。 ``` **驗收**:重建向量庫後,對 Claude 說「我部落格裡有哪些讀書心得文章」,確認搜尋結果出現 📝 WordPress 標示的文章。 --- ## 常見問題 & 踩坑清單 以下是建置過程中容易遇到的問題,提前知道可以省很多時間: ### 坑 1:圖片副檔名是 .png,但實際是 WEBP 格式 - **症狀**:process_images.py 跑完一大堆錯誤,圖片描述一片空白 - **原因**:Notion 下載的圖片有時副檔名是 .png,但實際格式是 WEBP,Ollama 不接受 - **解法**:用 Pillow 的 `Image.open()` 偵測真實格式,不是 JPEG/PNG 就先轉換再送 ### 坑 2:向量庫重建時報「Qdrant 被鎖定」 - **症狀**:執行 build_vector_db.py 報錯,說資料庫被佔用 - **原因**:Claude Desktop 開著時,MCP Server (python.exe) 還在跑,Qdrant 被鎖住 - **解法**:重建向量庫前先執行 `taskkill /IM python.exe /F` 關閉所有 Python 程序 ### 坑 3:MCP Server 啟動後 Claude Desktop 沒有反應 - **症狀**:Claude Desktop 重啟後,問問題 AI 不呼叫任何工具 - **原因 A**:server.py 裡有 print() 輸出到 stdout,汙染了 MCP JSON 通訊 - **解法 A**:所有 log 改成 `print("...", file=sys.stderr)` - **原因 B**:Claude Desktop config.json 路徑填錯 - **解法 B**:確認 config.json 的 python 路徑和 server.py 路徑都是絕對路徑 ### 坑 4:WordPress 文章搜尋只出現少數幾篇 - **症狀**:明明同步了 100 篇,搜尋只找到 3-5 篇 - **原因**:Qdrant payload 沒有 source 和 database_name 欄位 - **解法**:確認 build_vector_db.py 的 payload 包含 `source` 和 `database_name` 欄位 ### 坑 5:每天同步後,WordPress 文章全部重新下載 - **症狀**:每次凌晨同步都要跑 100 次 API,花很多時間 - **原因**:notion_sync.py 的清理邏輯把 WordPress 頁面從 pages.json 刪掉 - **解法**:在 notion_sync.py 加入 `_preserved_pages` 機制保留 WordPress 頁面 ### 坑 6:Notion Integration 設定後仍讀不到資料 - **症狀**:同步程式跑完但頁面數是 0 - **原因**:Notion Integration 需要手動連結到每個 database - **解法**:進每個 Notion Database → 右上角「...」→「連結到」→ 選你建立的 Integration --- ## 驗收清單 完成全部建置後,用以下問題測試你的知識庫: **語意搜尋測試(search_knowledge)** - [ ] 「有沒有關於時間管理的筆記?」→ 出現相關頁面 - [ ] 「讀書心得有哪些?」→ 出現結果,WordPress 文章有 📝 標示 **精準篩選測試(query_properties)** - [ ] 「我的閱讀清單裡狀態是 Finished 的書有哪些?」→ 返回精確清單 - [ ] (如有 WordPress)「WordPress 部落格的所有文章」→ 返回完整清單 **完整內容測試(get_page_content)** - [ ] 在搜尋結果後說「把第一篇完整給我看」→ 返回全文 - [ ] (如果該頁面有圖片)Claude 回應出現「已自動開啟 X 張圖片」,Windows 看圖程式自動彈開 **自動同步測試** - [ ] logs/last_sync_status.txt 顯示 SUCCESS - [ ] 修改一篇 Notion 筆記後,第二天早上搜尋能找到更新後的內容 --- ## 後記 整套系統建完之後,你有一個每天自動維護的私人知識庫。 Notion 和部落格的累積,不再是搜不到、找不到的死資料, 而是可以對話、可以整合、可以跨來源查詢的第二大腦。 建置過程中遇到問題很正常——把問題描述清楚,貼給 Claude Code, 通常幾分鐘內就能找到根因並修好。 --- *複製指南版本:2026-02-27* *對應系統版本:Phase 9(Notion + WordPress 完整整合)*