Dossier over MCP.
One remote MCP server, one tool. Give it the messages of a conversation the user already has, and it returns an insightful, helpful and often funny read of the relationship between contacts. This page is the contract.
https://qpjhbdrrtmkucjjtcynb.supabase.co/functions/v1/mcp- Endpointhttps://qpjhbdrrtmkucjjtcynb.supabase.co/functions/v1/mcp
- TransportStreamable HTTPPOST only. The server is stateless and issues no session id, so it accepts no GET stream and no DELETE teardown.
- ImplementationOfficial MCP TypeScript SDK, server 2.0.0Server and transport state are built per HTTP request, so two clients can never observe each other.
- Response modeJSON, or SSE when the analysis runs longKeepalive comment frames every 15 seconds hold the connection open through the analysis.
- Toolsanalyze_conversationOne. There are no resources and no prompts.
Every request carries a bearer token, and the account behind it must have a confirmed email address. There is no anonymous tier on this endpoint.
- SchemeBearer token in the Authorization headerThe token is a Dossier account access token, issued by the majr identity service and signed ES256.
- Account requiredThe account must have a confirmed email addressDossier's own apps serve anonymous users. This connector does not, because an anonymous account is reachable only from the client that created it — the person could never open a browser and add credits to it.
- No token401, with a WWW-Authenticate challengeThe challenge carries a resource_metadata pointer, per RFC 9728.
- Bad token401
- Anonymous account403 account_required, with a signup URLChecked before anything else, so the gate cannot be probed around.
- Reach of your tokenThis connector, and nothing elseA token issued to a third party carries a client_id claim, and every other Dossier endpoint refuses it with 403. You cannot read or delete the dossiers the account has saved, buy credits, read or write the birthday, or obtain the keys Dossier uses to recognise contacts. This is enforced at each endpoint, not promised in this document.
- What the connector storesNothingA report generated through this connector is returned to you and never written to the account's archive, even if the request asks for it.
analyze_conversation. Send the messages of one two-party conversation and get a report on the other person.
messagesarray, 1 to 250The conversation, oldest first. Each entry is { date, text, isFromMe }. Send the real message text — Dossier reads the words, so a paraphrase produces a worthless report.messages[].datestringWhen the message was sent. ISO 8601, or YYYY-MM-DD.messages[].textstring, max 10,000 charactersThe message exactly as written. Do not clean up, translate, or shorten it.messages[].isFromMebooleantrue if the user wrote it, false if the other person did. Getting this backwards inverts the entire report.displayNamestring, max 256 charactersWhat the user calls the other person — a first name or nickname. Never a full name, email address, or phone number.mode"canonical" | "brutal" · optionalcanonical is the default and is measured and constructive. brutal is blunt and unsparing; use it only if the user asks for it in those terms.
{
"name": "analyze_conversation",
"arguments": {
"displayName": "Sam",
"mode": "canonical",
"messages": [
{ "date": "2026-08-02T19:04:00Z", "text": "are you around later?", "isFromMe": false },
{ "date": "2026-08-02T19:31:00Z", "text": "should be, after 8", "isFromMe": true }
]
}
}What the schema leaves out, and why:
- No person identifierThe connector cannot read or write a stored dossierEvery call is a fresh analysis of the messages in that call.
- No persistence flagNothing from a connector call is ever saved
- No date of birthDossier is 13+, and the age gate is collected in a browserAn age gate an agent can fill in is not an age gate. A transcript can also carry an instruction to supply one, and a date of birth typed into a chat becomes part of the host's conversation history.
- No group flagTwo-party conversations onlyPinned server-side, not taken from the caller.
- content[0].textThe full report as MarkdownUsable on its own, for a client that ignores structured output.
- structuredContentThe same report as blocksTen sections: headline, communication signature, linguistic tells, missed cues, relational dynamics, unspoken subtext, growth opportunities, conversation starters, partner insights, and a constructive summary.
- ErrorsisError true, with a code and a messageThe message is written for the agent to act on, not only to print. Both the text and the structured output carry it.
- Messages per call250More than 250 is rejected. Send the most recent ones.
- Characters per message10,000
- Transcript size512 KB of UTF-8
- Request body2 MB
- Duration30 to 90 secondsMeasured at 36 to 47 seconds across small, medium, and 510 KB inputs. Do not call the tool twice for one conversation while the first call is running.
- Rate limit429, with Retry-AfterPer account and per source address.
A tool failure returns isError with a code and a message. The message tells the agent what to do next, which for the two account codes means sending the person to a URL and waiting.
invalid_requestThe input failed validation — most often more than 250 messages.free_limit_reachedThe account used all of its free analyses. The message carries an upgrade URL for the person to open in a browser.request_too_largeThe transcript is over the size limit. Send fewer messages.age_confirmation_requiredThe account has not confirmed a date of birth. The agent must not ask for one or supply one; it sends the person to the URL in the message.rate_limitedToo many analyses in a short window. retry_after_seconds is set when the server supplies it.analysis_failedThe model returned something unusable. Dossier tries to return the generation automatically, though that is not guaranteed. Retry once.internal_errorAnything else.
- AccountA free Dossier account with a confirmed email addressCreated by one-time code at justdossier.com/login. No password.
- Free analyses3 per account
- After thatCredits, bought at justdossier.com/upgradeThe agent cannot buy them. It sends the person to the URL, and waits for them to say they are done.
- Age13+
What this endpoint keeps, and what it does not. The last two rows are the limits of the claim, printed next to it rather than below it.
- The conversation is not storedIt exists in memory for the one requestDossier writes no transcript to disk and logs none.
- The report is not storedA connector call can never write a dossierThe tool has no persistence flag and no person identifier, so there is nothing for it to write to.
- Nothing carries between callsThe server keeps no memory of an earlier call
- Errors carry no contentA failure never echoes the transcript or the model's response body
- What this does not coverThe claim above is about Dossier's own storageThe analysis is produced by a third-party model provider under Dossier's commercial terms. Their retention is theirs to state, and this page does not speak for it.
- Third parties in the transcriptThe other person has not consentedBoth the server instructions and the tool description tell the agent to name whose conversation it is about to send and get an explicit go-ahead first. Dossier asks for a first name or nickname, never a full name, an email address, or a phone number.