_ registry / mcp http-sse · checked 2h ago

pageindex-chat

https://chat.pageindex.ai

Registry code: 8d63899fe22aef9f

api record

PageIndex by Vectify AI is a document platform for uploading and managing long PDFs (research papers, financial reports, legal docs, textbooks, etc.).

READING WORKFLOW:

endpoint
https://chat.pageindex.ai/mcp
protocol
http-sse ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is pageindex-chat live?
Yes — it answered the hub's last check (checked 2h ago). It answered 100% of checks over the last 30 days.
Is pageindex-chat free to use?
Not anonymously — it asks for a key or a login before it will serve. Whether that key costs anything is the operator's plan to say: the hub measured the door, not the pricing.
What tools does pageindex-chat have?
9 tools: browse_documents, get_folder_structure, remove_document, process_document, search_documents, get_document_structure, get_document, get_page_content, ….
Is pageindex-chat safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.7%

90 days 99.8%· all time 99.8%

latency
299ms

last good check

priced tools
0

of 9 tools

_ answered our checks, 90 days 419 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • down → live
  • unknown → live
_ what it is for
used for
  • upload and process a long pdf
  • get document outline
  • extract page content from pdf
  • search documents
takes → gives
documents, web pages → text, data, images
tools
7 reads2 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 9 tools
9 auth-required 9 of 9 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • browse_documents reads auth-required 6h ago

    Primary 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "sort": {
          "enum": [
            "time",
            "relevance"
          ],
          "type": "string",
          "default": "time",
          "description": "Sort order. \"time\" (default) sorts by upload date (newest first); \"relevance\" orders documents by semantic relevance to `query`. Relevance also works inside the read-only shared folders — pass their folder_id — but at the library root it ranks only your own documents."
        },
        "limit": {
          "type": "number",
          "default": 10,
          "maximum": 50,
          "minimum": 1,
          "description": "Number of documents to return per page (1-50, default 10)"
        },
        "query": {
          "type": "string",
          "description": "Search query for relevance ranking. Required when sort=\"relevance\"."
        },
        "offset": {
          "type": "integer",
          "default": 0,
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "Zero-based pagination offset. Pass the value of `next_offset` from the previous response to fetch the next page."
        },
        "folder_id": {
          "type": "string",
          "default": "root",
          "description": "Folder scope (default \"root\"). Pass a specific folder ID to scope into that folder, or \"root\" to reference the library root. The read-only \"shared-with-me\" and \"following\" folders live at the library root — pass one of those ids to browse them. Copy any folder_id verbatim from a browse/tree response, never construct one. Combine with `recursive` to control breadth."
        },
        "recursive": {
          "type": "boolean",
          "default": false,
          "description": "Whether to include documents from descendant folders. When false (default), returns the direct contents of folder_id along with its sub-folders — prefer this for level-by-level exploration so you retain folder hierarchy context. When true, flattens all descendant documents into one list and omits sub-folders — use only when a non-recursive browse of the target folder returned no relevant results and you need to widen the scope, or the user explicitly requests a flat listing."
        }
      }
    }
    arguments 43 lines
  • get_folder_structure reads auth-required 6h ago

    Orientation 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "properties": {
        "path": {
          "type": "string",
          "description": "Human-readable folder path (e.g. \"Research/Papers/2024\"). Alternative to folder_id — copy a `path` value from any browse_documents() or search_documents() response. When provided, folder_id is ignored."
        },
        "depth": {
          "type": "integer",
          "default": 10,
          "maximum": 10,
          "minimum": 1,
          "description": "Maximum depth to traverse (1-10, default 10). Use a smaller value for very large folder trees."
        },
        "folder_id": {
          "type": "string",
          "default": "root",
          "description": "Subtree root (default \"root\" = entire library). Pass a specific folder ID to get only that subtree, or \"shared-with-me\"/\"following\" for the read-only folders at the library root. Copy any folder_id verbatim from a browse/tree response, never construct one. Ignored when `path` is provided."
        },
        "include_counts": {
          "type": "boolean",
          "default": true,
          "description": "Include file_count and children_count per folder (default true). Set false to reduce response size; the root node of the tree always carries its counts regardless of this flag."
        }
      }
    }
    arguments 27 lines
  • remove_document changes data auth-required never probed

    Permanently 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "doc_names"
      ],
      "properties": {
        "doc_names": {
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "maxItems": 10,
          "minItems": 1,
          "description": "Array of document names to delete. Each name must be copied verbatim from the `name` field of a browse_documents() or search_documents() response (case-sensitive, include extension). Example: [\"Q3 Report.pdf\", \"draft.pdf\"]. Max 10 per call."
        },
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Disambiguator for same-name documents. Copy the `folder_id` from the intended browse/search result; use \"root\" for root-level documents, or \"shared-with-me\"/\"following\" for the read-only folders at the library root; omit if `doc_name` is unique. Copy any folder_id verbatim from a browse_documents()/get_folder_structure() response, never construct one."
        }
      }
    }
    arguments 30 lines
  • process_document changes data auth-required never probed

    Upload and process a PDF from a public URL (≤100MB). Only invoke with a valid URL the user has provided — never guess one. After processing, call `get_document()` to confirm status before reading content.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "url"
      ],
      "properties": {
        "url": {
          "type": "string",
          "format": "uri",
          "description": "Direct URL to PDF file"
        },
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Target folder ID. Use \"root\" for the root folder, or omit to use the user's default folder (configured in settings)."
        }
      }
    }
    arguments 25 lines
  • search_documents reads auth-required 17h ago

    ESCALATION 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")`.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "query"
      ],
      "properties": {
        "limit": {
          "type": "number",
          "default": 10,
          "maximum": 50,
          "minimum": 1,
          "description": "Number of documents to return (1-50, default 10)"
        },
        "query": {
          "type": "string",
          "minLength": 1,
          "description": "Keyword query. Pass keyword(s) only — NOT a natural-language sentence. Multiple keywords are AND-matched: every token must appear in the file name or description. Examples: \"machine learning safety\" ✓; \"documents about machine learning safety\" ✗ (stop words \"documents\"/\"about\" will block matches)."
        },
        "folder_id": {
          "type": "string",
          "default": "root",
          "description": "Folder scope (default \"root\"). Pass a specific folder ID to scope into that folder, or \"root\" to reference the library root. Combine with `recursive` to control breadth. Mirrors browse_documents — copy any folder_id from a browse/tree response verbatim, never construct one. The default root search ALREADY covers the read-only \"shared-with-me\" and \"following\" folders; pass one of those ids (or one of their sub-folder ids) only to narrow the search to shared content."
        },
        "recursive": {
          "type": "boolean",
          "default": true,
          "description": "Whether to include documents from descendant folders. When true (default), searches the entire subtree of folder_id — for \"root\" that means the whole library, including the read-only \"shared-with-me\" and \"following\" folders. Set false to restrict to the direct contents of folder_id: root-level documents for \"root\", directly-shared documents for the read-only folders."
        }
      }
    }
    arguments 31 lines
  • get_document_structure reads auth-required 17h ago

    Extract 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "doc_name"
      ],
      "properties": {
        "part": {
          "type": "integer",
          "default": 1,
          "maximum": 9007199254740991,
          "minimum": 1,
          "description": "Part number for pagination (1-based, default 1). For large outlines, increment until the response's `pagination.has_more` becomes false."
        },
        "doc_name": {
          "type": "string",
          "minLength": 1,
          "description": "Copy the `name` field verbatim from a browse_documents() or search_documents() response (case-sensitive, include extension). Example: \"Q3 Report.pdf\". If the response shows two documents with the same name, pass `folder_id` alongside to disambiguate."
        },
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Disambiguator for same-name documents. Copy the `folder_id` from the intended browse/search result; use \"root\" for root-level documents, or \"shared-with-me\"/\"following\" for the read-only folders at the library root; omit if `doc_name` is unique. Copy any folder_id verbatim from a browse_documents()/get_folder_structure() response, never construct one."
        },
        "wait_for_completion": {
          "type": "boolean",
          "default": false,
          "description": "If true and document is processing, automatically wait up to 3 minutes until completed. Reduces repeated tool calls."
        }
      }
    }
    arguments 37 lines
  • get_document reads auth-required 17h ago

    Check 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "doc_name"
      ],
      "properties": {
        "doc_name": {
          "type": "string",
          "minLength": 1,
          "description": "Copy the `name` field verbatim from a browse_documents() or search_documents() response (case-sensitive, include extension). Example: \"Q3 Report.pdf\". If the response shows two documents with the same name, pass `folder_id` alongside to disambiguate."
        },
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Disambiguator for same-name documents. Copy the `folder_id` from the intended browse/search result; use \"root\" for root-level documents, or \"shared-with-me\"/\"following\" for the read-only folders at the library root; omit if `doc_name` is unique. Copy any folder_id verbatim from a browse_documents()/get_folder_structure() response, never construct one."
        },
        "wait_for_completion": {
          "type": "boolean",
          "default": false,
          "description": "If true and document is processing, automatically wait up to 3 minutes until completed. Reduces repeated tool calls."
        }
      }
    }
    arguments 30 lines
  • get_page_content reads auth-required 13h ago

    Extract 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()`.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "doc_name",
        "pages"
      ],
      "properties": {
        "pages": {
          "type": "string",
          "pattern": "^(\\d+(-\\d+)?)(,\\s*\\d+(-\\d+)?)*$",
          "minLength": 1,
          "description": "Page specification: \"5\", \"3,7,10\", \"5-10\", or \"1-3,7,9-12\""
        },
        "doc_name": {
          "type": "string",
          "minLength": 1,
          "description": "Copy the `name` field verbatim from a browse_documents() or search_documents() response (case-sensitive, include extension). Example: \"Q3 Report.pdf\". If the response shows two documents with the same name, pass `folder_id` alongside to disambiguate."
        },
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Disambiguator for same-name documents. Copy the `folder_id` from the intended browse/search result; use \"root\" for root-level documents, or \"shared-with-me\"/\"following\" for the read-only folders at the library root; omit if `doc_name` is unique. Copy any folder_id verbatim from a browse_documents()/get_folder_structure() response, never construct one."
        },
        "wait_for_completion": {
          "type": "boolean",
          "default": false,
          "description": "If true and document is processing, automatically wait up to 3 minutes until completed. Reduces repeated tool calls."
        }
      }
    }
    arguments 37 lines
  • get_document_image reads auth-required 6h ago

    Retrieve 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.

    mcp-tool

    {
      "type": "object",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "required": [
        "image_path"
      ],
      "properties": {
        "folder_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Disambiguator when the document name inside image_path is not unique (e.g. two documents in different folders share the same name). Copy the `folder_id` of the intended document from a browse/search result; use \"root\" for root-level documents, or \"shared-with-me\"/\"following\" to pin one of the read-only library-root folders; omit if the name is unique. Copy any folder_id verbatim from a browse_documents()/get_folder_structure() response, never construct one."
        },
        "image_path": {
          "type": "string",
          "minLength": 1,
          "description": "An image_path from a get_page_content() response, passed back exactly as returned — never constructed or modified. Two sources: an embedded image_path (or img_path) on a content block, or a full-page image_path from the page_images array (format \"<doc_name>/_page_images/page-<N>.jpg\")."
        }
      }
    }
    arguments 25 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 8d63899fe22aef9f.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/8d63899fe22aef9f/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/8d63899fe22aef9f/badge.svg)](https://brick.blue/agent/8d63899fe22aef9f?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.