{"_id":"@accucrazy/pandora-mcp","_rev":"7-ea98cab0afdd7df8786c56890fac8b3f","name":"@accucrazy/pandora-mcp","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@accucrazy/pandora-mcp","version":"0.1.0","_id":"@accucrazy/pandora-mcp@0.1.0","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"175ed76d013459610a9159d1e6cecc28cf616fd7","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.1.0.tgz","fileCount":3,"integrity":"sha512-+tC/E4bFe8iN5QkpE/vdeo0rZMHhhN5i9X7N4QK0rdqNs9l1VZJhXuWxqUE4PcB2AW2gVKqUSF+4LeAofZqzXA==","signatures":[{"sig":"MEUCIQD4nt0wCUHvKb5u1oTBTcy7RP3y7sys9TdnpcaShYGPyQIgVuhhBos89wpY9QiytGUoczBClc+XCmFXKwa8mjnnyNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8442},"type":"module","engines":{"node":">=18"},"gitHead":"1edfdad3a5d384fbc15a9add1746f489eaa350af","scripts":{"smoke":"node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, BigQuery posts search, trends","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.1.0_1786351549606_0.9051742812689243","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@accucrazy/pandora-mcp","version":"0.1.1","_id":"@accucrazy/pandora-mcp@0.1.1","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"5d9619d63afb73b3a786ce4bcb1baffbfde72eaf","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.1.1.tgz","fileCount":3,"integrity":"sha512-mjCK+E2h2mY2qcDziw/x3FVIplNUoJaqaP+9LyKo9GNyH6EhgwkG8Uwf/vgAAgbm9WIQQqNgov6nJgAGk8C5oA==","signatures":[{"sig":"MEQCIBLXNkT22K/U8GIGScKXq/wbGeSmp5LzeinMdl4F8ZP3AiBqpe6Ig4bJgWdrC1kU29vkIS5fMEeseQTQlOqRzVdRBw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9660},"type":"module","engines":{"node":">=18"},"gitHead":"00cd731b56e54bcf64030b5dc532d222654ff040","scripts":{"smoke":"node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, BigQuery posts search, trends","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.1.1_1786357155428_0.5733335612477992","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@accucrazy/pandora-mcp","version":"0.2.0","_id":"@accucrazy/pandora-mcp@0.2.0","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"18830a48b19d54615118f1131f6b474185e04115","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.2.0.tgz","fileCount":3,"integrity":"sha512-1yfy1hEnvyNYOGPpHD6YUVXC13A/lV0O86RmdGaAWCdm41kJrIVDdU6gk44iYdS7Dbl+W0MzOocbB6cT/9U4Qw==","signatures":[{"sig":"MEQCIC+dM/lK3q0ChVFEFt/y579vNQtt53YTNhGfiqu2MuwOAiAFrzE4HyGGEcOwsCY8iXWcypDx/qOjpfg2eyP3GvsAjQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11846},"type":"module","engines":{"node":">=18"},"gitHead":"898fed8641c2a87be1bb453de2b88aeded45d091","scripts":{"smoke":"node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery posts search, trends","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.2.0_1787722658021_0.6743032045476094","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@accucrazy/pandora-mcp","version":"0.3.0","_id":"@accucrazy/pandora-mcp@0.3.0","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"cf0c85165a7ed10ba3312f5fcf987ec399c77e77","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.3.0.tgz","fileCount":3,"integrity":"sha512-dNNjCbqBG5FJCD5Xt6GFXhK7armm2r67a0z+FX0Q4VugxF0ZvRkS3pP2KI57QUl4De0Rkcuy6ueR+1Ix+wk/1Q==","signatures":[{"sig":"MEUCIEc2T0BJzBv+AyE+iyZY4S7I7+U7KJlEdLoHmLWzuU8UAiEA2JF7/wmP2J/CPN0UKZlA8ZCGHQzNcL7kgMFleTeLJWs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15793},"type":"module","engines":{"node":">=18"},"gitHead":"f0a1b4eacb72d17e4860ff1a9435cab7a926c803","scripts":{"smoke":"node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery posts search, trends, Culture Listening reports","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.3.0_1788328895441_0.009557755998315542","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@accucrazy/pandora-mcp","version":"0.3.1","_id":"@accucrazy/pandora-mcp@0.3.1","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"24f2ad37c9b999fbd779b7aac18fdd5eed988ff6","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.3.1.tgz","fileCount":3,"integrity":"sha512-bWl5TBDtUhzHo6HJUYfs/s1a0O5GzLbc+0Fto8VAXL9fYE+9rIwBppMiJGJeDrg0oIP8A9JKb18/91/sncq/jQ==","signatures":[{"sig":"MEUCIHDUiOawGbVuJKjgjG1MXE4TmkK01QfJvy6l4Q7DzQgtAiEA3rGFz9lNoNgEH6mWs8wLGn2DSzRgFizqSDLtCIuAApY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":16541},"type":"module","engines":{"node":">=18"},"gitHead":"4246be812caec181bf1065de998a7afeecb5d0b4","scripts":{"smoke":"node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery posts search, trends, Culture Listening reports","directories":{},"_nodeVersion":"22.23.1","dependencies":{"@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.3.1_1788335698174_0.030121772374989142","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@accucrazy/pandora-mcp","version":"0.4.0","_id":"@accucrazy/pandora-mcp@0.4.0","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"c5d4007c53399351c96ca3fe469fc5af21b32473","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.4.0.tgz","fileCount":4,"integrity":"sha512-vWOgnA0cKI95Rkbvw/yBlxIhd+eBouXx5ACPOZymep1FA/iJrGATVmDb41975Ue9oOg44JL1fIC3T76+AfI8Rg==","signatures":[{"sig":"MEYCIQDyC8+jw5++TaZ/XsoDbOqh5ar20DOwQmDxTFvLkmOtWwIhAKBlw/odYsT27FKfvyp8rvRWIEeIvRwPbA+stAM/J/0b","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDyQaahs7pV+krcsN1X6T20x2uGSKXI+TJMdjQcUWY+QgIhAOSjT1bOXBFTO8jfcJmfRKw9g2EDeErsZr6fUEBW7Yqx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39313},"type":"module","engines":{"node":">=18"},"gitHead":"f0709521b74334e676151bb5067ef37c11cb0f0f","scripts":{"smoke":"node export-posts.smoke.mjs && node smoke.mjs"},"_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery pool search with local jsonl/xlsx export, trends, Culture Listening reports","directories":{},"_nodeVersion":"22.23.1","dependencies":{"xlsx":"^0.18.5","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/pandora-mcp_0.4.0_1790156567409_0.2425013580484514","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"_id":"@accucrazy/pandora-mcp@0.5.0","bin":{"pandora-mcp":"bin/pandora-mcp.mjs"},"dist":{"shasum":"1d45754471500b8de1d692fc512362f4e27e4f14","tarball":"https://registry.npmjs.org/@accucrazy/pandora-mcp/-/pandora-mcp-0.5.0.tgz","fileCount":6,"integrity":"sha512-Wv2J4UVBsnRlYOkmoUGs925LFFg9Hi7SLDiH/RACXA2mTTeSy//8XHlVJxzIVXntiwHfRB7l08KaUwBIiH/N4w==","signatures":[{"sig":"MEUCIQCdZ9IP1xbxTd9ppTPEB78dr0PD0vZtivcLfaoqajKTggIgExcyCisl4+Wn8dt9uwXOJUH/9XM5PumhtpYAgflq/Ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC3cZXnrh2X01OXZuo+H3pKBhUhgGO8j/ImeohkN5I1eAIhAOaI3KnEuiK3guF8fYdqzyn0D4aYq6qGIEYKr0UDRoPq"}],"unpackedSize":89015},"name":"@accucrazy/pandora-mcp","type":"module","engines":{"node":">=18"},"scripts":{"smoke":"node export-posts.smoke.mjs && node xlsx-stream.smoke.mjs && node jobs.smoke.mjs && node smoke.mjs"},"version":"0.5.0","_npmUser":{"name":"accucrazy-game","email":"game@accucrazy.com"},"_npmVersion":"10.9.8","description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery pool search with local jsonl/xlsx export, trends, Culture Listening reports","directories":{},"maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"_nodeVersion":"22.23.1","dependencies":{"yazl":"^3.3.1","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"xlsx":"^0.18.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pandora-mcp_0.5.0_1790254158873_0.2946546635268026"}}},"time":{"created":"2026-08-10T08:45:49.445Z","modified":"2026-09-24T12:49:19.158Z","0.1.0":"2026-08-10T08:45:49.742Z","0.1.1":"2026-08-10T10:19:15.547Z","0.2.0":"2026-08-26T05:37:38.144Z","0.3.0":"2026-09-02T06:01:35.572Z","0.3.1":"2026-09-02T07:54:58.348Z","0.4.0":"2026-09-23T09:42:47.492Z","0.5.0":"2026-09-24T12:49:18.962Z"},"description":"Pandora social listening MCP server: Threads quick-scrape, single-post URL scrape, BigQuery pool search with local jsonl/xlsx export, trends, Culture Listening reports","maintainers":[{"name":"accucrazy-game","email":"game@accucrazy.com"}],"readme":"# @accucrazy/pandora-mcp\n\nPandora social listening MCP server：Threads 即時速爬、指定貼文網址爬取、訂閱池檢索與下載、趨勢排行、Culture Listening 報告檢索。\n\n需要 Pandora 發給你的 API key（`pk_` 開頭）。\n\n## Claude Desktop / Cursor\n\n```json\n{\n  \"mcpServers\": {\n    \"pandora\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@accucrazy/pandora-mcp\"],\n      \"env\": { \"PANDORA_API_KEY\": \"pk_your_key_here\" }\n    }\n  }\n}\n```\n\n## Claude Code\n\n```bash\nclaude mcp add pandora -e PANDORA_API_KEY=pk_your_key_here -- npx -y @accucrazy/pandora-mcp\n```\n\n> **第一次連線顯示失敗是正常的。** `npx` 要先去 npm 下載套件，可能超過客戶端等待連線的時間（Claude Code 會顯示 `Failed to connect`）。下載完成後重開一次客戶端就會正常連上，不需要改設定。\n\n## 工具\n\n工具依你的 key 權限（scope）自動出現，沒開通的不會列出來：\n\n| 工具 | 用途 | scope |\n| --- | --- | --- |\n| `quick_scrape_threads` | 對一組關鍵字即時速爬近期 Threads 貼文 | `scrape` |\n| `scrape_threads_post` | 爬指定的 Threads 貼文網址，回全文與互動數 | `scrape` |\n| `search_posts` | 訂閱池關鍵字檢索並下載成 jsonl 到本機（自動翻頁，回路徑、筆數與前 20 筆預覽） | `posts` |\n| `export_posts` | 訂閱池檢索結果完整匯出成 xlsx 存到本機（自動翻頁，內文不截斷） | `posts` |\n| `export_status` | 查 `search_posts`／`export_posts` 背景工作的進度，完成後拿完整結果（見下方「兩段式」） | `posts` |\n| `get_trends` | Threads 趨勢排行／批次／趨勢詞／貼文 | `trends` |\n| `list_cl_reports` | 列出 Culture Listening 分析報告（可依市場／日期過濾，或用 `q` 關鍵字檢索） | `cl_reports` |\n| `get_cl_report` | 取單份報告的各節 insight 全文與引用清單 | `cl_reports` |\n| `get_cl_report_articles` | 取該報告引用的原始貼文快照（與報告是兩份資料） | `cl_reports` |\n\n### 訂閱池檢索：`search_posts` 與 `export_posts`\n\n這兩支查的是**訂閱池**：五個平台（threads／dcard／ptt／fb／instagram）爬回來的全部貼文，**沒有經過品牌相關性判定**，所以會有字面命中但跟你要的主題無關的貼文；用 `excludeKeywords` 可以把這類誤命中濾掉。\n\n兩支都會自動翻頁拉完，然後把結果**下載到你本機**，不把貼文塞進對話（一次幾萬篇塞進去，模型的上下文會爆掉、也很貴）：\n\n- `search_posts` → **jsonl**（一行一篇），給 agent 用讀檔／grep 工具自己去翻。回傳只有檔案路徑、筆數與前 20 筆預覽。\n- `export_posts` → **xlsx**，給人用 Excel 開。內文不截斷，超過 Excel 單格上限的長文會放到「完整文字」工作表，用主表的 No. 對照。\n\n**不帶 `limit` 就把命中的文章全部拉完**（0.5.0 起；0.4.x 預設 5,000 篇、最多 50,000 篇）。管理員可以替你的 key 設「單次查詢篇數上限」，工具描述裡 `limit` 的說明會寫出這把 key 的上限（殼啟動當下後端暫時讀不到今日用量時，描述會退回通用說明、不寫數字，重開客戶端即可）；你帶的 `limit` 比上限大時會被夾到上限。\n\n完成時的回傳：\n\n| 欄位 | 意思 |\n| --- | --- |\n| `status` | `done`＝完成；`running`＝還在跑（見下方「兩段式」） |\n| `savedTo` | 檔案路徑 |\n| `rows`／`pages` | 實際寫入的篇數與翻頁數 |\n| `totalRows` | 後端快照的總列數；搜尋式含 `&`、`\\|`、`()` 時還有一層精過濾，實際篇數可能略少 |\n| `limit` | 這次的有效上限（你帶的 `limit` 與金鑰上限取小；`null`＝不限） |\n| `limitReached` | `true`＝撞到上限，可能還有較舊的文章沒有包含（結果依發文時間由新到舊）；`message` 會說明是金鑰上限還是你帶的 `limit` |\n| `quota` | 今日配額 `{ limit, used, remaining }`，`search_posts`／`export_posts`／趨勢／CL 報告共用；一次查詢只在第一頁扣 1 次，翻頁不另外扣 |\n| `preview`／`sheetNames` | `search_posts` 的前 20 筆預覽／`export_posts` 的工作表名稱 |\n\n`export_posts` 邊翻頁邊串流寫檔，幾十萬篇也不會吃爆記憶體；超過 Excel 單表 1,048,575 列時，同一個檔會自動分成 `Search Results`、`Search Results 2`…多張工作表。\n\n檔案預設落在 `~/Downloads/`，檔名帶時間戳；要自己指定就傳 `outputPath`，但只允許家目錄底下、副檔名要對。\n\n### 兩段式：大量匯出不會被客戶端逾時切斷\n\n一年份幾十萬篇要翻頁好幾分鐘，但多數 MCP 客戶端對單次工具呼叫有固定上限（最嚴格的約 60 秒，例如 Cursor CLI、Codex 預設），且多半不能調。所以 `search_posts`／`export_posts` 最多只等約 45 秒，一定趕在這類上限之前先回應，不用改客戶端的工具逾時設定：\n\n1. 45 秒內做完：直接回完整結果（`status: 'done'`）。\n2. 還沒做完：回 `status: 'running'`、`jobId`、預定的 `savedTo` 與目前寫了幾篇；匯出在本機的 MCP 行程裡**繼續跑**。\n3. 呼叫 `export_status({ jobId })`：每次最多等 30 秒（`waitSeconds` 可調，上限 45），做完就回完整結果，還沒做完就再問一次。\n\n注意：\n\n- **匯出期間不要關掉客戶端或對話 session。** 背景工作跑在客戶端啟動的 MCP 行程裡，客戶端一關行程就被結束，匯出中斷、不會產生正式檔，要重新查詢（會再扣一次配額）。目標資料夾（預設 `~/Downloads/`）可能留下檔名結尾是 `.part` 的暫存檔（`export_posts` 還可能有 `.part.overflow-1`、`.part.overflow-2`…），可以直接刪。只取消這次工具呼叫不會中斷背景匯出。\n- 工作狀態只存在記憶體，完成後保留 1 小時；客戶端重開後 `export_status` 會回「找不到 jobId」。這時先看先前回傳的 `savedTo` 有沒有檔案：有就是已完成的完整結果（只有全部成功才會存成正式檔），沒有才重新查詢（會再扣一次配額）。\n- 客戶端有帶 `progressToken` 時（例如 Claude Code），等待期間會送進度通知（已寫篇數／總列數）。\n- 續頁遇到暫時性錯誤（5xx、伺服器忙碌、伺服器滿載的 HTTP 429、網路中斷、逾時）會自動退避重試最多 4 次（間隔約 2、5、10、20 秒，後端有給 `Retry-After` 就照它），翻頁不扣配額；重試用盡仍失敗時，已寫的部分會丟棄、暫存檔清掉，重新查詢會再扣一次配額。快照從查詢完成起保留 24 小時，過期會明講要重新查詢（會再扣一次配額）。\n- 第一頁只在尚未扣配額的兩種情況自動重試：排隊逾時（`busy`），以及伺服器滿載的 HTTP 429（沒有 `quota_exceeded`，請求沒進到服務；今日配額用完的 429 不重試）；`upstream_busy`、`query_timeout`、`query_too_expensive`、`result_too_large` 都發生在扣配額之後，殼不重試，錯誤訊息會講明這次已扣配額、重新查詢會再扣一次。\n- 資料全部取回後，最後一步存成正式檔若失敗（例如 `outputPath` 指到資料夾，或在 Windows 上同名檔正被其他程式開著），取回的資料不會保留；換一個 `outputPath` 或關掉該檔後重新查詢（會再扣一次配額）。\n\n各客戶端的設定：\n\n- Claude Code：不用設。Claude Code 預設工具逾時很長（未設 `MCP_TOOL_TIMEOUT` 時約 28 小時），殼 45 秒內一定先回應。\n- Codex CLI：建議在 `~/.codex/config.toml` 的 `[mcp_servers.pandora]` 加 `startup_timeout_sec = 30`（第一次 `npx` 下載較慢）；`tool_timeout_sec = 900` 選填，預設 60 秒已大於 45 秒。範例見下方。\n- 其他客戶端照預設即可：看到 `status: 'running'` 就用 `export_status` 接著查。\n\n工具逾時比 45 秒還短的客戶端，請在 MCP 設定的 `env` 加 `\"PANDORA_MCP_WAIT_MS\": \"20000\"`（毫秒，要比客戶端逾時短），殼最多等 20 秒就先回 `jobId`，`export_status` 每次也最多等這麼久。不調的話客戶端會先逾時、拿不到 `jobId`：背景匯出照跑，但模型可能改成重新查詢，再扣一次配額。\n\nCodex 的 `config.toml` 範例：\n\n```toml\n[mcp_servers.pandora]\ncommand = \"npx\"\nargs = [\"-y\", \"@accucrazy/pandora-mcp\"]\nenv = { PANDORA_API_KEY = \"pk_your_key_here\" }\nstartup_timeout_sec = 30\ntool_timeout_sec = 900  # 選填：預設 60 秒已大於 45 秒\n```\n\n> **0.5.0 行為變更**：\n> - 不帶 `limit` 從「預設 5,000 篇」改成「命中的全部拉完」（受金鑰單次上限約束）；回傳的 `limit` 改成有效上限，不限時是 `null`。\n> - 超過約 45 秒的查詢改回 `status: 'running'` 與 `jobId`，要再用 `export_status` 取結果；舊流程若直接讀回傳的 `savedTo`，要先看 `status` 是不是 `done`。\n> - 回傳新增 `status`、`totalRows`、`quota`；`export_posts` 另回 `sheetNames`。\n> - 從 0.4.x 升級要**重開 MCP 客戶端**，`npx` 才會抓到新版。還在跑 0.4.x 的客戶端搭配新後端（不帶 `limit` 就全部拉完）會有這些問題：\n>   - `export_posts` 一次拉十幾萬篇以上會把本機 MCP 行程的記憶體吃爆（伺服器不受影響）。\n>   - 0.4.x 沒有兩段式，要翻完全部頁才回應；大量查詢會先撞到客戶端工具逾時（Cursor CLI、Codex 約 60 秒），模型看到失敗可能重查，每次多扣一次配額。\n>   - 0.4.x 的「已達筆數上限 5000」是寫死的說法，已不正確；模型照提示帶 `limit` 重查會再扣一次配額。\n>   - 0.4.x 續頁遇到伺服器忙碌（`busy`）不會重試，整個匯出失敗，第一頁的配額已經扣了。\n>\n>   請重開客戶端讓 `npx` 抓到 0.5.0。\n\n> **0.4.0 行為變更**：0.3.x 的 `search_posts` 會把貼文直接回到對話，0.4.0 起改成回檔案路徑與預覽。舊流程若是靠回傳內容直接分析，要改成先讀檔。\n\nCL 報告的用法是三段式：`list_cl_reports` 挑報告 → `get_cl_report` 讀分析 → `get_cl_report_articles` 看依據的原始貼文。\n\n要找「有沒有講到某個品牌／議題」的報告，`list_cl_reports` 帶 `q`（例如 `q: \"麥當勞\"`）就好，不用逐頁翻。伺服器端會對報告標題、需求描述、最終摘要與各節 insight 全文做不分大小寫的子字串比對；**不含報告引用的貼文內文**（那是「引用貼文提到 X」，不是「報告在談 X」）。\n","readmeFilename":"README.md"}