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
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?"}'