Overview
Beyond the voice avatar, LAPLACE Eidolon opens a read-only Model Context Protocol (MCP) server to the public. It exposes the same RAG indexes that drive the voice pipeline — streamer Milky Green's persona facts and past stream transcriptions — to any MCP client (Claude Desktop, Cursor, your own agent, and so on), so they can look up "who she is" and "what she said on a given stream"
The server is mounted on the bot's main app over Streamable HTTP, and the public instance lives at:
https://eidolon.vrp.moe/mcpThe service endpoint is canonicalized to /mcp/ (with a trailing slash), and
/mcp 307-redirects to it. Clients that do not follow redirects should use
the trailing-slash address directly
Connecting
Most MCP clients that speak Streamable HTTP only need a URL:
{
"mcpServers": {
"laplace-eidolon": {
"url": "https://eidolon.vrp.moe/mcp"
}
}
}Older clients limited to the stdio transport can bridge through mcp-remote:
{
"mcpServers": {
"laplace-eidolon": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://eidolon.vrp.moe/mcp"]
}
}
}Tools
The server exposes two read-only search tools. Both take a single query string parameter and return a list of hits:
search_persona_facts
Searches hand-curated persona facts about the streamer — identity, lore, preferences, and running jokes. Suited to stable "who is she" questions rather than recalling a specific moment from one stream
Response shape:
{
"count": 2,
"results": [
{
"text": "人设事实原文",
"date": "2026-05-09",
"score": 0.82
}
]
}| Field | Meaning |
|---|---|
text | The persona fact verbatim |
date | Source date for the fact (may be null) |
score | Relevance score |
search_streams
Searches past stream transcriptions and returns the most relevant ~5-minute stream segments, each with its air date and topics. Suited to recalling "what she said or did on a given stream"
Response shape:
{
"count": 1,
"results": [
{
"stream_date": "2026-04-20",
"content": "经精炼的直播片段叙述",
"topics": ["话题A", "话题B"],
"score": 0.77
}
]
}| Field | Meaning |
|---|---|
stream_date | Air date of the stream (may be null) |
content | Refined segment narrative (prefers details, falls back to summary / raw transcription) |
topics | Array of topic tags for the segment |
score | Relevance score |
What score means depends on the retrieval path: with Cohere reranking
enabled it is a relevance score (higher is more relevant); on the plain vector
path without reranking it is a distance (lower is more relevant). When the
matching LanceDB index has not been built yet, the tool returns count: 0 and
an explanatory note instead of an error
Authentication and Rate Limiting
The server is open to anonymous access by default and needs no credentials to call. Both kinds of caller get the same tools and the same public data — a token only raises the throughput quota and unlocks no private content (no Mem0, and nothing partitioned per viewer)
| Caller | Authentication | Default Quota |
|---|---|---|
| Anonymous | By client IP | 20/hour |
| Signed in | Authorization: Bearer <loginSyncToken> | 120/hour |
The loginSyncToken you pass is the same one used for the WebRTC handshake, validated by LAPLACE Login Sync; the resolved Bilibili UID becomes the rate-limit key. Invalid, expired, or missing tokens are silently treated as anonymous rather than rejected. Every search costs one embedding (plus an optional Cohere rerank), and the quota is what bounds that cost
Self-Hosting
Beyond the public instance, a self-hosted Eidolon mounts the same server by default. The relevant environment variables:
| Environment Variable | Description |
|---|---|
EIDOLON_MCP_ANON_RATE_LIMIT_PER_HOUR | Anonymous hourly quota, defaults to 20 |
EIDOLON_MCP_AUTH_RATE_LIMIT_PER_HOUR | Signed-in hourly quota, defaults to 120 |
EIDOLON_MCP_RATE_LIMIT_WINDOW_SEC | Rate-limit window in seconds, defaults to 3600 |
EIDOLON_MCP_ALLOWED_HOSTS | Host allowlist against DNS rebinding (comma-separated) |
Behind a reverse proxy, put the public domain in EIDOLON_MCP_ALLOWED_HOSTS
so it passes the SDK's Host check, and pass POST /mcp/ through unbuffered
the same way you do /api/offer. Leaving EIDOLON_MCP_ALLOWED_HOSTS empty
turns that protection off, which suits local localhost debugging only
Source Code
Last updated on September 19, 2026