{
  "name": "unlob MCP tools",
  "description": "11 tools exposed over stdio JSON-RPC via the Model Context Protocol. Tool calls bill as ordinary API requests.",
  "documentation": "https://www.unlob.com/mcp",
  "dateModified": "2026-08-05",
  "config": {
    "mcpServers": {
      "unlob": {
        "command": "npx",
        "args": [
          "-y",
          "@unlob/mcp"
        ],
        "env": {
          "UNLOB_API_KEY": "ulb_your_key_here"
        }
      }
    }
  },
  "tools": [
    {
      "name": "web_search",
      "slug": "web-search",
      "group": "search",
      "summary": "Searches the agent-first web index and returns metadata-only hits — url, host, snippet, score — never the page body.",
      "collapses": "The default retrieval step, without burning the context window on ten full pages.",
      "httpEndpoint": "/search",
      "arguments": [
        {
          "name": "query",
          "type": "string",
          "required": true,
          "description": "Boolean query. AND / OR, `-` negation, \"quoted phrases\"."
        },
        {
          "name": "mode",
          "type": "string",
          "required": false,
          "description": "keyword, semantic or hybrid. Defaults to hybrid."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Result count. Defaults to 10."
        },
        {
          "name": "vertical",
          "type": "string",
          "required": false,
          "description": "Restrict to a vertical, or omit to auto-route."
        },
        {
          "name": "site",
          "type": "string",
          "required": false,
          "description": "Restrict to one host."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Language code."
        },
        {
          "name": "from / to",
          "type": "integer",
          "required": false,
          "description": "Unix timestamp range."
        },
        {
          "name": "min_host_rank",
          "type": "number",
          "required": false,
          "description": "Authority floor."
        },
        {
          "name": "min_quality",
          "type": "integer",
          "required": false,
          "description": "Quality floor."
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "relevance, recency, host_rank, quality, published, words, centrality."
        },
        {
          "name": "collapse",
          "type": "string",
          "required": false,
          "description": "none, host, page or story."
        }
      ],
      "returns": "Metadata-only hits with scores and world-model signals.",
      "example": {
        "prompt": "Find recent Rust async runtime documentation, excluding Python results.",
        "call": "{ \"query\": \"rust AND async -python\", \"vertical\": \"code\", \"sort\": \"published\", \"limit\": 8 }"
      },
      "documentation": "https://www.unlob.com/mcp/web-search"
    },
    {
      "name": "get_document",
      "slug": "get-document",
      "group": "search",
      "summary": "Fetches the full cleaned text of one passage by id — the lazy read path.",
      "collapses": "Fetch-and-clean, without a separate scraping service in the stack.",
      "httpEndpoint": "/doc/:id",
      "arguments": [
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "A passage id from a search hit."
        }
      ],
      "returns": "The cleaned passage text plus its metadata.",
      "example": {
        "prompt": "Read the tokio documentation page you just found.",
        "call": "{ \"id\": \"p:8f2c9a\" }"
      },
      "documentation": "https://www.unlob.com/mcp/get-document"
    },
    {
      "name": "similar",
      "slug": "similar",
      "group": "search",
      "summary": "More-like-this: given a passage id, returns its semantic neighbours.",
      "collapses": "Query reformulation — the agent stops guessing at synonyms.",
      "httpEndpoint": "/similar",
      "arguments": [
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "Seed passage id."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Neighbour count."
        }
      ],
      "returns": "Neighbouring passages in the same metadata-only shape.",
      "example": {
        "prompt": "Find more pages like this one.",
        "call": "{ \"id\": \"p:8f2c9a\", \"limit\": 10 }"
      },
      "documentation": "https://www.unlob.com/mcp/similar"
    },
    {
      "name": "browse",
      "slug": "browse",
      "group": "search",
      "summary": "Browses without a query: the most recent, or highest-ranked, passages — optionally within one vertical.",
      "collapses": "The \"what is new\" poll, without inventing a query to represent it.",
      "httpEndpoint": "/browse",
      "arguments": [
        {
          "name": "vertical",
          "type": "string",
          "required": false,
          "description": "Restrict to a vertical."
        },
        {
          "name": "sort",
          "type": "string",
          "required": false,
          "description": "recency or host_rank."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Passage count."
        }
      ],
      "returns": "A window over the index in the standard hit shape.",
      "example": {
        "prompt": "What has been published in the code vertical recently?",
        "call": "{ \"vertical\": \"code\", \"sort\": \"recency\", \"limit\": 20 }"
      },
      "documentation": "https://www.unlob.com/mcp/browse"
    },
    {
      "name": "why_not",
      "slug": "why-not",
      "group": "search",
      "summary": "Explains why a URL is or is not in the index: present, removed with a reason, or never admitted.",
      "collapses": "Guessing at absence. The agent gets an answer instead of an empty result set.",
      "httpEndpoint": "/why_not",
      "arguments": [
        {
          "name": "url",
          "type": "string",
          "required": true,
          "description": "The URL to explain."
        }
      ],
      "returns": "present, removed with reason and replacement, or unknown.",
      "example": {
        "prompt": "Why is this documentation page not showing up in results?",
        "call": "{ \"url\": \"https://docs.rs/tokio\" }"
      },
      "documentation": "https://www.unlob.com/mcp/why-not"
    },
    {
      "name": "related",
      "slug": "related",
      "group": "graph",
      "summary": "Returns the connected neighbourhood of a passage from the coverage graph — the edges are what to read next.",
      "collapses": "A search per hop. One call replaces the whole chain.",
      "httpEndpoint": "/related",
      "arguments": [
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "Seed passage id."
        },
        {
          "name": "hops",
          "type": "integer",
          "required": false,
          "description": "Traversal depth, bounded breadth-first."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Neighbour cap."
        }
      ],
      "returns": "Connected passages, each with the edge type that reached it.",
      "example": {
        "prompt": "What else is connected to this article?",
        "call": "{ \"id\": \"p:8f2c9a\", \"hops\": 2, \"limit\": 15 }"
      },
      "documentation": "https://www.unlob.com/mcp/related"
    },
    {
      "name": "corroborate",
      "slug": "corroborate",
      "group": "graph",
      "summary": "Reports how many distinct hosts independently carry a story — the anti-hallucination check.",
      "collapses": "Manual cross-searching to verify a claim.",
      "httpEndpoint": "/corroborate",
      "arguments": [
        {
          "name": "id",
          "type": "string",
          "required": true,
          "description": "A passage id in the story."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Maximum source groups."
        }
      ],
      "returns": "Independent source count, merged duplicate count, and the hosts.",
      "example": {
        "prompt": "Is this claim independently reported, or is everyone copying one source?",
        "call": "{ \"id\": \"p:8f2c9a\" }"
      },
      "documentation": "https://www.unlob.com/mcp/corroborate"
    },
    {
      "name": "authorities",
      "slug": "authorities",
      "group": "graph",
      "summary": "Returns the top passages on a topic ranked by graph centrality — trust-triage a field without reading junk into context.",
      "collapses": "Reading twenty mediocre results to find the three that mattered.",
      "httpEndpoint": "/authorities",
      "arguments": [
        {
          "name": "topic",
          "type": "string",
          "required": true,
          "description": "Topic tag or entity."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Passage count."
        }
      ],
      "returns": "Passages ordered by centrality.",
      "example": {
        "prompt": "What are the authoritative sources on this topic?",
        "call": "{ \"topic\": \"science\", \"limit\": 10 }"
      },
      "documentation": "https://www.unlob.com/mcp/authorities"
    },
    {
      "name": "dossier",
      "slug": "dossier",
      "group": "graph",
      "summary": "Builds a one-hop brief on an entity: mentions, the hosts covering it, and the entities co-mentioned with it.",
      "collapses": "~10 searches plus a manual merge, in one call.",
      "httpEndpoint": "/dossier",
      "arguments": [
        {
          "name": "entity",
          "type": "string",
          "required": true,
          "description": "Entity name."
        },
        {
          "name": "limit",
          "type": "integer",
          "required": false,
          "description": "Cap on each section."
        }
      ],
      "returns": "Mentions, top sources with counts, related entities with counts.",
      "example": {
        "prompt": "Give me a brief on this company.",
        "call": "{ \"entity\": \"Common Crawl\", \"limit\": 10 }"
      },
      "documentation": "https://www.unlob.com/mcp/dossier"
    },
    {
      "name": "path",
      "slug": "path",
      "group": "graph",
      "summary": "Finds the shortest chain of edges linking two passages — reasoning-path retrieval, or connect-the-dots.",
      "collapses": "Open-ended investigation, reduced to a structural query.",
      "httpEndpoint": "/path",
      "arguments": [
        {
          "name": "from",
          "type": "string",
          "required": true,
          "description": "Start passage id."
        },
        {
          "name": "to",
          "type": "string",
          "required": true,
          "description": "End passage id."
        },
        {
          "name": "max_hops",
          "type": "integer",
          "required": false,
          "description": "Depth ceiling."
        }
      ],
      "returns": "Whether a path was found, its length, and the typed nodes along it.",
      "example": {
        "prompt": "How are these two articles connected?",
        "call": "{ \"from\": \"p:8f2c9a\", \"to\": \"p:41ab7c\", \"max_hops\": 4 }"
      },
      "documentation": "https://www.unlob.com/mcp/path"
    },
    {
      "name": "assemble_context",
      "slug": "assemble-context",
      "group": "graph",
      "summary": "GraphRAG as a service: returns a ready-to-read context pack — corroborated, story-deduplicated, trust-ranked and packed to a token budget, each passage carrying the reason it was included.",
      "collapses": "The entire do-it-yourself RAG loop.",
      "httpEndpoint": "/assemble_context",
      "arguments": [
        {
          "name": "query",
          "type": "string",
          "required": true,
          "description": "The question."
        },
        {
          "name": "budget",
          "type": "integer",
          "required": false,
          "description": "Token budget. Defaults to 4000."
        },
        {
          "name": "lang",
          "type": "string",
          "required": false,
          "description": "Language restriction."
        }
      ],
      "returns": "A context pack: budget, estimated tokens, and items with reasons.",
      "example": {
        "prompt": "Get me everything I need to answer this question, in 4,000 tokens.",
        "call": "{ \"query\": \"who funds independent web indexes\", \"budget\": 4000 }"
      },
      "documentation": "https://www.unlob.com/mcp/assemble-context"
    }
  ]
}