Agent-Native Calendar
Agent-Native Google Calendar - manage events, sync, and public booking
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Extract text from local PDF documents with optional pluggable OCR. Read-only, no network.
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": [
"-y",
"@sezzlee/pdf-mcp"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add pdf -- npx -y @sezzlee/pdf-mcpตัวนี้ต้องใส่ค่าในคำสั่งเปิดเอง ให้คัดลอกค่าตั้งแล้วเติมค่า
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"pdf": {
"command": "npx",
"args": [
"-y",
"@sezzlee/pdf-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้ต้องใส่ค่าในคำสั่งเปิดเอง ให้คัดลอกค่าตั้งแล้วเติมค่า
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"pdf": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@sezzlee/pdf-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub sezzlee ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.2) เข้า registry 26 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Node.js ในเครื่องด้วย
ในหมวดเดียวกันมี Agent-Native Calendar, Excel MCP Server, MCP Server for Excel
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
Agent-Native Google Calendar - manage events, sync, and public booking
ให้ AI สร้างและแก้ไฟล์ Excel ได้เอง ทั้งสูตร กราฟ และ PivotTable โดยไม่ต้องมีโปรแกรม Excel ในเครื่อง
Excel automation for AI - Sheets, Power Query, DAX, VBA, Tables, Ranges and more. Windows only.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
A read-only, sandboxed MCP server for local PDF documents. It builds on @sezzlee/file-core, which supplies sandbox path resolution, the response budget, the error envelope, cursors and the document cache. Text extraction uses @firecrawl/pdf-inspector. The server never reaches the network: OCR is optional, and when it is enabled, the connection decision belongs entirely to whoever supplies the two injected ports.
{
"mcpServers": { "pdf": { "command": "npx", "args": ["-y", "@sezzlee/pdf-mcp", "/path/to/documents"] } } }
To enable OCR, point --ocr at a module whose default export is an OcrBinding (see Configuration and OCR):
{
"mcpServers": { "pdf": { "command": "npx", "args": [ "-y", "@sezzlee/pdf-mcp", "/path/to/documents", "--ocr", "/path/to/ollama-binding.js" ] } } }
| Tool | What it does | Key arguments |
|---|---|---|
list_documents | Lists readable PDF candidates under the root; never opens a file | subdirectory, pattern, maxResults |
describe_document | Page count, document type, per-page OCR need, server capabilities | filePath |
read_pages | Reads selected pages as Markdown, page numbers 1-based | filePath, pages, maxPages, ocr, cursor |
find_in_document | Literal search over extracted text, with page number and match context | filePath, query, matchMode, caseSensitive, ocr, cursor |
If the file path is already known, describe_document is optional: read_pages and find_in_document work from filePath alone.
CLI (sezzlee-pdf [--ocr ]):
| Argument | Default | Meaning |
|---|---|---|
| required | Sandbox root; every readable path is resolved and checked against it. |
--ocr | none | Path or package specifier to a module whose default export is { rasterizer, provider }. Absent means no OCR: read_pages/find_in_document refuse ocr: true and describe_document reports capabilities.ocr: false. |
Programmatic (createPdfMcpServer(root, options)):
| Option | Default | Meaning |
|---|---|---|
documentCacheSize | 2 | Extracted documents held in memory at once, 1–16. A budget, not a guard: each cached document holds every page's Markdown on the heap. |
maxConcurrentListings | 4 | Concurrent list_documents calls before a request is refused. |
maxConcurrentExtractions | 2 | Concurrent PDF extractions before a request is refused. |
ocr | none | An OcrBinding ({ rasterizer, provider, dpi?, maxPagesPerCall?, timeoutMs? }). Neither port is a dependency of this package. |
The server does not perform OCR; it supports it. Two ports are injected — neither the raster library nor the model client is a dependency of this package.
interface PageRasterizer {
render(job: { bytes: Buffer; pages: readonly number[]; dpi: number; signal?: AbortSignal; }): Promise ; // { page, image, mediaType } }
interface OcrProvider { readonly name: string; recognize(job: { pages: readonly RenderedPage[]; signal?: AbortSignal; }): Promise ; // { page, markdown, confidence? } }
The server does exactly this: it renders the pages the text layer could not answer, recognizes the resulting images, substitutes the result for that page, and marks it source: "ocr".
Programmatic binding:
createPdfMcpServer(root, {
ocr: { rasterizer: pdfjsRasterizer, provider: ollamaProvider, dpi: 200 }, });
CLI binding — a module whose default export matches OcrBinding, loaded with --ocr (see examples/ollama-binding.ts in this package for a working example built from @sezzlee/pdf-raster-pdfjs and @sezzlee/ocr-ollama):
import { createPdfjsRasterizer } from "@sezzlee/pdf-raster-pdfjs";
import { createOllamaOcrProvider } from "@sezzlee/ocr-ollama"; import type { OcrBinding } from "@sezzlee/pdf-mcp";
const binding: OcrBinding = { rasterizer: createPdfjsRasterizer(), provider: createOllamaOcrProvider({ baseUrl: process.env["SEZZLEE_PDF_OCR_URL"] ?? "http://127.0.0.1:11434", model: process.env["SEZZLEE_PDF_OCR_MODEL"] ?? "deepseek-ocr:3b", }), dpi: 200, };
export default binding;
ocr_unavailable), never a silent fall back to the text layer. Otherwise an agent that asked for OCR could mistake "nobody transcribed this document" for "no match". describe_document → capabilities.ocr reports whether one is bound.needsOcr — "the model returned nothing" is not the same as "this page is blank".src/engine/, and lint bans importing @firecrawl/pdf-inspector outside that folder — a second import site would reintroduce the bug (measured on 1.23.0: PageMarkdownResult.page is 0-based, sibling pagesNeedingOcr is 1-based).needsOcr; a negative index wraps through u32. Both would look like a real page to the agent.classifyPdf marks every page of a document that contains a single scanned page. The list comes from the per-page extraction instead. classificationConfidence is confidence in the classifier's own verdict, not in any extracted text's accuracy.true; empty is true` only for a page the engine trusted and found genuinely blank.
coverageComplete is false, and an empty match list is not proof the query is absent from the whole document.pages selection is preserved across a cursor: it carries forward the rest of that selection and never wanders into unselected pages. A cursor resuming inside a page carries that page's text fingerprint; if the text changed since transcription, the response is stale_cursor rather than silently skipping content.fetch, node:http, node:net and their siblings are lint-banned inside src/, and the ban is repeated in every layer's override — a later oxlint override replaces no-restricted-imports rather than merging with it, so a single top-level ban would not apply everywhere.darwin-x64 binary and its wasm fallback is unpublished. On an unsupported host the server stops at startup with a one-line message (exit code 3).pnpm turbo run build --filter=@sezzlee/pdf-mcp
node packages/servers/pdf-mcp/dist/cli.js /path/to/documents
Tests: pnpm turbo run test --filter=@sezzlee/pdf-mcp (Vitest). A live-Ollama suite (test/ocr-live.spec.ts) is skipped unless SEZZLEE_PDF_OCR_URL is set; it also reads SEZZLEE_PDF_OCR_MODEL (default deepseek-ocr:3b). Everything else in test/ocr.spec.ts runs against fake ports; the live suite only proves the two real adapters compose.