cesario-mcp
v0.4.0
Published
MCP server for cesario — lets an AI manage your cesario profile and CVs under your own account, scoped by Supabase RLS.
Maintainers
Readme
cesario-mcp
An MCP server that lets an AI assistant manage your cesario profile — on your own account, under your own permissions.
It reuses cesario's normal email-OTP login to obtain a per-user session and then acts as you through Supabase Row-Level Security. It never uses an admin / service-role key, and it ships with no secrets — only the same public project URL + publishable key the website already exposes.
Connect to cesario via MCP
There are two ways to give an AI assistant access to your cesario account.
Hosted — recommended, no install
cesario runs a hosted MCP server with a standard OAuth 2.1 flow, so any MCP client can connect in a few clicks:
- In Claude → Settings → Connectors → Add custom connector.
- Enter the URL:
https://cesario.cv/mcp - On the cesario consent screen, sign in: email → 6-digit code → Authorize.
The client is now connected as you, scoped to your account by Supabase RLS. Try it: "list my cesario templates", "what's my cesario username?", or "set my cesario bio to …". To revoke, remove the connector in your client.
Local — self-host or development
Run this package on your own machine over stdio, connecting with the same email-OTP flow (session stored locally). See Run it and Client configuration below.
How auth works (local package)
connect_account({ email })→ cesario emails you a 6-digit code.verify_connection({ email, code })→ the code is exchanged for a real Supabase session (access + refresh token), stored at~/.cesario/credentials.json(owner-only,chmod 0600).- Every other tool attaches that session's token, so all reads/writes run under
your
auth.uid()— you can only ever touch your own data.
Entering the code from your inbox is the consent step. To revoke, run
disconnect_account or delete ~/.cesario/credentials.json.
Tools
Connect & session
| Tool | What it does |
| --- | --- |
| connect_account | Send a login code to an email (new email = new account). |
| verify_connection | Exchange the code for a session and store it. |
| whoami | Summarize the connected account. |
| disconnect_account | Remove the local session. |
CVs & profiles
| Tool | What it does |
| --- | --- |
| list_cvs | List your CVs. |
| list_templates | List your own templates (usable as fromId for create_cv). |
| get_cv | Fetch a CV (summary, or full JSON with includeData:true). |
| create_cv | Create a CV by copying a template or existing CV (fromId). |
| duplicate_cv | Faithful copy of a CV/template (keeps profile + kind). |
| rename_cv | Change a CV's title. |
| delete_cv | Permanently delete a CV. |
| apply_profile_to_cv | Attach/detach a profile to a CV. |
| set_cv_visibility | Set a CV/template public or private on your creator page. |
| list_data_profiles | List your profiles (reusable content sets). |
| get_data_profile | Fetch a profile. |
| create_data_profile | Create a profile from another profile or from a CV's content. |
| duplicate_data_profile | Copy a profile. |
| update_data_profile | Update a profile's name and/or full content. |
| rename_data_profile | Rename a profile. |
| delete_data_profile | Permanently delete a profile. |
Defaults & notifications
| Tool | What it does |
| --- | --- |
| set_defaults | Set your default CV, profile, and/or template. |
| list_notifications | List in-app notifications (shares, new versions). |
| mark_notification_read | Mark one (or all) notifications read. |
A note on creation
Every create_* works by copying the content of a row you already own — a
template, a CV, or a profile — so new rows are always valid. Synthesizing a
brand-new CV from a built-in template (e.g. classic-fr) is not supported:
that content lives in the app's template tree (coupled to its build + icon
libraries) and does not belong in a standalone package. To enable it later,
either bundle the app's src/lib/cv tree into this package's build, or add a
small read-only app endpoint that returns a freshly-seeded CV data payload.
Run it
npm install
npm run build # → dist/index.jsLocal dev without building:
npm run dev # tsx src/index.tsInspect interactively with the MCP Inspector:
npm run inspectClient configuration
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"cesario": {
"command": "npx",
"args": ["-y", "cesario-mcp"]
}
}
}Claude Code (.mcp.json in your project, or claude mcp add):
{
"mcpServers": {
"cesario": {
"command": "npx",
"args": ["-y", "cesario-mcp"]
}
}
}Or with the Claude Code CLI: claude mcp add cesario -- npx -y cesario-mcp.
(To run from a local checkout instead of npm, use "command": "node", "args":
["/absolute/path/to/mcp/dist/index.js"].)
Pointing at a different environment
Defaults target production. Override with env vars (both public values):
CESARIO_SUPABASE_URL=https://<ref>.supabase.co
CESARIO_SUPABASE_ANON_KEY=sb_publishable_...Scope
Covers CV and profile (reusable CV content) management — copy-based creation. Account/creator-profile management (name, username, bio, publish) is intentionally out of scope, to keep "profile" unambiguous (it always means CV content here). A hosted, multi-user OAuth variant — so end users connect from Claude's connector UI instead of running this locally — is the next step up; see the project plan.
