Docs / Developers
MCP server
The hosted Mindola MCP server lets any AI assistant create a lens, add knowledge, and check ingestion, with nothing to install and no auth required.
Mindola runs a hosted MCP server that lets any MCP client (Claude, Cursor, VS Code, Codex, ChatGPT, and others) create a lens, add knowledge to it, and check ingestion status. The server is remote: there is nothing to install or run, you add one URL to your client. For per-client setup steps, see Connect overview.
Endpoints
| Endpoint | Purpose |
|---|---|
https://app.mindola.ai/mcp/lens | Canonical endpoint, listed in the official MCP registry as ai.mindola/lens. Use this in most clients. |
https://app.mindola.ai/mcp/claude | Alias for the Claude connector. Same server. |
https://app.mindola.ai/mcp | ChatGPT endpoint (ChatGPT Apps SDK variant, same create tool). |
Transport
The server speaks Streamable HTTP and supports MCP protocol versions 2025-03-26, 2025-06-18, and 2025-11-25, negotiated during initialize. It is stateless: every request stands on its own. The server issues an Mcp-Session-Id header on initialize and clients may echo it back, but no server-side state depends on it. A GET with Accept: text/event-stream answers 405 (there is no server push stream); a GET without that header returns a JSON info document, which makes a handy browser smoke test. DELETE is a no-op, since there is no session state to tear down.
No authentication, by design
Anonymous calls work, and that is the normal flow. It is safe because an anonymous call can only create an unclaimed lens, which is rate limited and expires unless claimed. Ownership is established at the claim step, when the lens is tied to a signed-in account; after that, anonymous connectors can no longer modify it.
Optionally, you can send Authorization: Bearer with a Mindola session token. The lens is then created directly under that account, with no claim step.
The unclaimed lens lifecycle
Anonymous creation returns an unclaimed lens. It is live immediately at its shareUrl, and the response also includes a claimUrl. Open the claim URL and sign up (signup is free) to make the lens yours permanently. Unclaimed lenses expire after 30 days if never claimed.
Two consequences matter for tool use:
- While a lens is unclaimed,
add_lens_knowledgecan add knowledge to it with just the lens token. - Once claimed, anonymous connectors can no longer modify the lens. Changes then go through the app or the authenticated REST API.
Rate limits
Anonymous traffic is limited per MCP session, falling back to the caller’s IP:
| Action | Limit |
|---|---|
create_digital_twin_lens | 2 per minute and 10 per hour |
add_lens_knowledge and get_lens_status | 20 per minute per IP |
Retry rate-limited calls later, not immediately.
create_digital_twin_lens
Creates a lens from a profile the user approved in the conversation. The tool contract asks every assistant to summarize the proposed profile and get the user’s explicit confirmation before calling, and to only include information the user provided or confirmed. A lens is a public page that speaks on someone’s behalf, so consent comes first.
All input fields are optional; send only what the user confirmed. The fields: displayName (max 80 chars), tagline, bio, context (extra grounding for how the lens answers), audience (max 500 chars), sourceSummary (what the assistant used to assemble the profile), topicName (max 80 chars, names the space that holds the seeded facts), locale (BCP-47), tone (one of warm, neutral, professional, playful), accentColor (hex like #4f46e5), expertise[], boundaries[] (things the lens should not claim or discuss), facts[] (max 30 user-approved facts that seed the lens), suggestedPrompts[] (max 4), and vibeWords[] (max 4).
The output includes displayName, topicName, shareUrl (live immediately), claimUrl, manageUrl (null until the lens is claimed), claimRequired, expiresAt, factCount, and suggestedPrompts. For anonymous creation the claim URL equals the share URL. Show the user both: the share URL to try the lens right away, and the claim URL to keep it before it expires.
add_lens_knowledge
Adds knowledge to an unclaimed lens by its share token, the part of the share URL after /me/. Input: lens_token, plus items (max 20 per call), each item being { type, content, title? } where type is "text" or "url", content is at most 20000 characters, and title is an optional label of at most 80 characters. Each item runs through the standard ingest pipeline (parse, chunk, embed), so the lens can answer from it with citations. Returns { ok, sourcesQueued, shareUrl } or an error.
Claimed lenses are rejected. The lens token is part of the public share URL, so anyone with the link could send this call. That is fine while the lens is an unclaimed draft, but once claimed it belongs to an account, and anonymous writes would let strangers edit a live page. The error points to the app and the authenticated REST API, which is where changes happen after claiming.
get_lens_status
Read-only. Input: lens_token. Returns shareUrl, claimed (boolean), and knowledge counts { total, ready, pending, failed }. Use it to poll ingestion after adding knowledge: when pending reaches zero, everything left is either ready or failed, and the lens answers from all ready sources.
Try it with plain JSON-RPC
The server answers raw JSON-RPC with no auth, no client, and nothing installed:
curl -s https://app.mindola.ai/mcp/lens \
-H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
The response lists the three tools. For ready-to-paste prompts and runnable scripts, see Examples.