A side-by-side look at the Pageindex MCP and Sequential Thinking MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Pageindex MCP for knowledge & memory work as a local process; choose Sequential Thinking for knowledge & memory as a local process. You can also run both side by side in one mcpServers block.
process_document, browse_documents, search_documents.create_entities, create_relations, add_observations.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Knowledge & Memory | Knowledge & Memory |
| Quality signal | 65/100 · Great | 90/100 · Excellent |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | No auth required |
| Pricing | Not declared | Free |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Verified |
| GitHub stars | 402 | 91,405 |
| Directory activity | 3 views 0 installs 0 upvotes | 4 views 3 installs 0 upvotes |
| Tools | 9 | 9 |
| Full listing | View Pageindex MCP | View Sequential Thinking |
process_documentUpload and process PDF documents from URLs or local files. Supports OCR processing, hierarchical content extraction, and intelligent document analysis. Returns a unique doc_id for subsequent operations. Processing typically takes 0-3 minutes depending on document size (estimate: 2 seconds per page). Supports files up to 100MB.browse_documentsPrimary document retrieval tool. After orienting with get_folder_structure() (when available), use this for all document-related questions. The bare call returns root-level sub-folders and documents; pass folder_id to drill into a sub-folder level by level. Use sort="relevance" + query for semantic ranking. Do NOT jump to search_documents() first — it is an escalation path, only after browse_documents(sort="relevance") has failed.search_documentsESCALATION tool — never the first step. Use only after `browse_documents(sort="relevance", query=...)` missed a document you strongly believe exists by precise term, acronym, or file-name fragment. Query must be keywords only — see the `query` schema describe. Each result has a `score` (6-10, higher is more relevant). On result: single best match → read it; several equally good → ask user; none → fall back to `browse_documents(sort="relevance")`.get_folder_structureOrientation step: show the folder hierarchy as a tree (like `tree -d`). **Call this before browse_documents()** to plan targeted retrieval — folder names reveal content domains (e.g. "Research", "Finance") and return folder IDs you pass to browse_documents(folder_id=…). Wait for this result before issuing browse_documents() or search_documents(). For folder_id="root" (default), returns the entire folder tree; for a specific folder_id, returns that subtree only.get_documentCheck a document's processing status and metadata. `status` is one of "pending", "queued", "processing", "completed", or "failed" — call this before `get_document_structure()` or `get_page_content()` to confirm the document is ready.get_document_structureExtract a document's hierarchical outline (headers, sections, page references). REQUIRED for documents over 20 pages — call this first to locate relevant sections, then pass their page numbers to `get_page_content()`. Use the `part` parameter to iterate large outlines until `pagination.has_more` is false.get_page_contentExtract page content from a processed document. Use tight, targeted page ranges — never the whole document at once. For documents over 20 pages, call `get_document_structure()` first to pick relevant sections. Embedded image paths in the response feed into `get_document_image()`.get_document_imageRetrieve an image from a document — pass an `image_path` from a `get_page_content()` response: either an embedded image (from a content block) or a full rendered page (from the `page_images` array, useful when a page is scanned or its meaning depends on visual layout). Returns the image as an MCP image content block (base64 data + MIME type). Do NOT repeat the raw base64 value in your text response.remove_documentPermanently delete documents and all associated data. Only invoke when the user explicitly names the documents AND confirms deletion. Returns `results` — one entry per requested document: `{ doc_name, status: "deleted" | "not_found" | "failed", error? }`. Inspect each entry for per-document failures. This action is irreversible.create_entitiesCreate multiple new entities in the knowledge graphcreate_relationsCreate multiple new relations between entities in the knowledge graph. Relations should be in active voiceadd_observationsAdd new observations to existing entities in the knowledge graphdelete_entitiesDelete multiple entities and their associated relations from the knowledge graphdelete_observationsDelete specific observations from entities in the knowledge graphdelete_relationsDelete multiple relations from the knowledge graphread_graphRead the entire knowledge graphsearch_nodesSearch for nodes in the knowledge graph based on a queryopen_nodesOpen specific nodes in the knowledge graph by their namesPaste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"pageindex-mcp": {
"command": "npx",
"args": [
"-y",
"@pageindex/mcp"
]
}
}
}
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-memory"
]
}
}
}