API & MCP access

The corpus is reachable two ways: a deployed Model Context Protocol server (Streamable HTTP) exposing seven tools, and the underlying /research HTTPS endpoint for clients that don't speak MCP. Both are public and require no authentication.

MCP endpoint

https://project-ggqu9.vercel.app/api/mcp

Transport: MCP Streamable HTTP. Hosted on Vercel as a FastMCP ASGI app. POSTs require the standard MCP headers; clients that implement the spec set these automatically.

Content-Type: application/json
Accept: application/json, text/event-stream

Tools exposed

ask_research_question(query: string, mode_override?: 'lookup' | 'claim_history' | 'qa')
Synthesised, cited answer. Auto-routes to passage lookup, claim historiography, or grounded QA. Start here for most questions.
search_sources(query: string, max_results?: number, similarity_threshold?: number)
Raw hybrid retrieval (vector + FTS). Returns ranked passages with similarity, passage_year, passage_author.
trace_claim_history(claim: string, include_passages?: boolean)
Historiographic evolution of a tracked claim — earliest advocacy, modern advocates/rejecters, verification gate. 30–45s.
verify_quotation(quoted_text: string, source_id: string, paragraph_index?: number)
Fuzzy-match a quotation against a source. Use before presenting any direct quote.
cite_passage(source_id: string, paragraph_index?: number)
Fetch the full text of a specific paragraph plus a citation string.
list_sources(limit?: number, offset?: number)
Paginate the full set of primary sources in the ledger.
source_status(source_id: string)
Metadata for one source — type, URL, title, fetch time, word count, sha256.

Claude — remote MCP

Claude Desktop's mcpServers config currently only spawns local stdio servers. Bridge to the remote URL with mcp-remote:

{
  "mcpServers": {
    "voynich-research": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://project-ggqu9.vercel.app/api/mcp"]
    }
  }
}

On claude.ai (web), add it directly under Settings → Integrations → Add custom integration, pointing at the URL above. No bridge needed.

OpenAI — Responses API with MCP

The Responses API accepts MCP servers as a tool type. The model can then call any of the seven tools above without further wiring:

const resp = await openai.responses.create({
  model: "gpt-5",
  tools: [{
    type: "mcp",
    server_label: "voynich-research",
    server_url: "https://project-ggqu9.vercel.app/api/mcp",
    require_approval: "never"
  }],
  input: "Who first proposed the Voynich slot grammar?"
});

For the Chat Completions API (no MCP), call /research directly from a function-calling tool — see the HTTP section below.

Google Gemini — MCP via SDK

The Gen AI SDK can attach an MCP client session as a tool. Connect once via Streamable HTTP, then pass the session to generateContent:

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport }
  from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const mcpClient = new Client({ name: "gemini-client", version: "1.0.0" });
await mcpClient.connect(
  new StreamableHTTPClientTransport(new URL("https://project-ggqu9.vercel.app/api/mcp"))
);

const response = await ai.models.generateContent({
  model: "gemini-2.5-pro",
  contents: "Trace the forgery hypothesis through time.",
  config: { tools: [mcpClient] }
});

Raw HTTP — /research

If your client can't speak MCP, the most useful tool — ask_research_question — is also a plain JSON endpoint. Public, 5–25s latency, occasional cold-start 503 (retry after 2s).

POST https://ymaqlcfjmdwncdbjprmw.supabase.co/functions/v1/research
Content-Type: application/json

{
  "query": "Was Hartlieb involved in the Voynich Manuscript?",
  "mode_override": null
}

Response envelope: mode, routing_note, payload (shape depends on mode — qa has answer + citations, claim_history has historiography, lookup has ranked passages), total_elapsed_ms.

Try it (curl)

curl -X POST 'https://ymaqlcfjmdwncdbjprmw.supabase.co/functions/v1/research' \
  -H 'Content-Type: application/json' \
  -d '{"query": "Who first proposed Voynich was written by Roger Bacon?"}'