MCP server
Run your hiring pipeline from your AI assistant
The Greet MCP server lets Claude, ChatGPT, Cursor, Codex and other MCP clients work in your workspace: find the best applicants, create sessions, send invites and open recordings — as you, with the access you approve.
https://messaging.greetai.co/mcpConnect
Add the URL to your client. The first time it calls Greet, a browser window opens: sign in at app.greetai.co, choose Read only or Read & write, and approve. There's no API key to copy.
claude mcp add --transport http greet https://messaging.greetai.co/mcp/mcp in Claude Code, pick greet and sign in. Add --scope user to use it in every project.Permissions
You choose the access when you approve. Your client can only use the tools that access allows.
read- List and open sessions, applications and recordings.
write- Everything in read, plus create and edit sessions, invite applicants and re-run analysis.
- Every member connects their own client. The connection acts as that member inside their workspace — it sees what they see.
- Viewers can only grant read. Editors and owners can grant read & write.
- Sessions stay signed in. Access tokens last 1 hour and refresh on their own; refresh tokens rotate on every use and expire after 30 days unused.
- Revoke anytime at app.greetai.co/mcp under Connected AI apps.
Tools
Nine tools. Your assistant picks them from what you ask — you don't call them by name.
list_sessions
readSessions in your workspace, newest first.
querystring- Filter by name.
pageintegerdefault1- Page number.
page_sizeintegerdefault20- Up to 100.
Returns Sessions with id, name, type, duration, status and apply link.
“Which sessions do we have running?”
get_session
readOne session with all of its settings.
session_idstringrequired- Session id.
Returns Instructions, questions, phases, voice, language, duration, recording and anti-cheat settings.
“Show me the questions in the Front desk screen.”
list_session_options
readValid values for create_session and update_session.
languagestring- Only voices that speak this language, e.g. es-ES.
Returns Languages, durations, voices (with preview links), assessment blocks and plan limits.
“Which Spanish voices can I use?”
list_applications
readApplications across your workspace or one session, filtered and paginated.
session_idstring- Only this session.
statusstring[]- e.g.
completed,scheduled,imported,idle. min_scorenumber- Only scores at or above this (0–100).
searchstring- Name or email contains.
include_archivedbooleandefaultfalse- Include archived applications.
sort"created_at" | "completed_at" | "score"defaultcreated_at- Sort field.
order"desc" | "asc"defaultdesc- Sort order.
pageintegerdefault1- Page number.
page_sizeintegerdefault20- Up to 100.
Returns { items, page, page_size, total, has_more } — each item has the applicant, status, score and dates.
“Who are the top 5 applicants for Front desk this week?”
get_application
readOne application in full.
application_idstringrequired- Application id.
Returns Scores per question and assessment, summary, transcript link and recording view link.
“Why did Maya score 92?”
list_recordings
readRecorded conversations you're allowed to watch.
session_idstring- Only this session.
include_media_urlsbooleandefaulttrue- Include signed video links.
pageintegerdefault1- Page number.
page_sizeintegerdefault20- Up to 50.
Returns Each item: application_id, candidate, completed_at, view_url (opens the recording in the Greet app; workspace sign-in required) and media_url (signed video link, expires in 1 hour).
“Open the recording of Maya's interview.”
create_session
writeCreate a session with the same settings as the session editor in the app.
namestringrequired- Shown to applicants.
instructionsstringrequired- What the AI should do and look for.
questions{ text, max_score }[]- Asked in order. Up to 30; max_score defaults to 10.
descriptionstring- Internal description.
session_type"company-job-interview" | "general" | "presentation"defaultcompany-job-interview- Kind of conversation.
introstring- First line the AI says.
duration_minutes5 | 10 | 15 | 30default5- 10 needs a Pro plan; 15 and 30 need extended sessions.
language"en-US" | "es-ES" | "fr-FR" | "de-DE" | "pt-PT" | "cmn-CN" | "ka-GE"defaulten-US- Spoken language.
voice_idstring- From
list_session_options; default voice if empty. recordingbooleandefaultfalse- Record audio and video (Pro plan).
camera_requiredbooleandefaultfalse- Applicant can't start until their camera is on.
block_copy_pastebooleandefaultfalse- No copying or pasting during the session.
hide_transcriptionbooleandefaultfalse- Hide the live transcript.
enable_text_inputbooleandefaultfalse- Let applicants type answers.
push_to_talkbooleandefaulttrue- Applicants hold a button to speak (more reliable).
allow_interruptionbooleandefaulttrue- Applicants can talk over the AI.
show_feedbackbooleandefaultfalse- Show applicants their results at the end.
phases{ phase, label, percentage, instruction }[]- Introduction / middle / conclusion split; percentages add up to 100.
steps{ label, description?, goal? }[]- Visible form steps, up to 8 (e.g. Background, Financials, Contact info). The call screen shows the current step in the top corner, and the AI moves it on as it goes.
goaltells the AI what to find out and is never shown.[]removes them. assessment_blocksstring[]- Keys from
list_session_options; default is the standard set (match rate, key points, summary…). use_realtime_modelbooleandefaultfalse- Native speech-to-speech model.
realtime_provider"openai" | "google"defaultopenai- With use_realtime_model.
publishbooleandefaulttrue- Publish right away, or keep as a draft.
Returns The session, its apply link and a ready-to-paste widget snippet.
“Create a 10-minute Spanish voice screen for medical receptionists and give me the widget code.”
update_session
writeChange any setting of an existing session.
session_idstringrequired- Session id.
…- Any
create_sessionfield. Only the fields you pass change.
Returns The updated session. With publish: false the change is saved as a draft and the live session stays as it was.
“Require camera on the Front desk screen and add a question about night shifts.”
invite_applicants
writeEmail people a link to a session. Built not to spam.
session_idstringrequired- Session to invite to.
applicants{ name, email, phone? }[]required- Up to 50 per call.
dry_runbooleandefaultfalse- Show who would be invited and who skipped, without sending.
Returns { invited[], skipped[{ email, reason }] } — reasons: already_invited, already_applied, duplicate_in_request, invalid_email, daily_limit, failed. Also remaining_today.
“Invite these 12 people from my spreadsheet to the Front desk screen.”
reanalyze_applications
writeRe-run scoring and the summary, e.g. after you changed the questions.
application_idsstring[]required- Up to 50.
Returns { queued, skipped[{ id, reason }] } — reasons: not_found, not_completed, cooldown. Each application can be re-analyzed once every 10 minutes.
“Re-score everyone who applied to Front desk yesterday.”
Example prompts
- “Who are the top 5 applicants for Front desk this week?”
- “Create a 10-minute Spanish voice screen for medical receptionists and give me the widget code.”
- “Invite these 12 people from my spreadsheet.”
- “Open the recording of Maya's interview.”
- “Everyone who scored under 50 on Sales — re-run the analysis with the new questions.”
No spam, by design
An email gets at most one invitation per session, ever — asking twice skips them with already_invited. People who already applied are skipped too, and a workspace can send up to 200 invitations a day. Use dry_run to preview a list first.
Security
- OAuth 2.1 authorization code flow with PKCE (S256 only). No passwords or API keys pass through your client.
- Redirect URIs must match exactly and use https, or a localhost loopback address for desktop clients.
- Tokens are stored hashed. Revoking a connection ends it immediately.
- Every invite and re-analysis is recorded with the member and client that made it.
- Recording links from
list_recordingsare signed and expire after 1 hour.
Raw HTTP
For building your own client. The server speaks Streamable HTTP (MCP 2025-11-25; 2025-06-18 and 2025-03-26 also work). Clients discover the authorization server through Protected Resource Metadata (RFC 9728) and register with Dynamic Client Registration (RFC 7591) or a Client ID Metadata Document.
1. An unauthenticated call points to the auth metadata
curl -i -X POST https://messaging.greetai.co/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'HTTP/2 401
WWW-Authenticate: Bearer resource_metadata="https://messaging.greetai.co/.well-known/oauth-protected-resource", scope="read write"2. With a token
curl -X POST https://messaging.greetai.co/mcp \
-H "Authorization: Bearer $GREET_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "MCP-Protocol-Version: 2025-11-25" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{ "name": "list_applications", "description": "…", "inputSchema": { "type": "object", "properties": { … } } }
]
}
}A call that needs write with a read-only token returns 403 with error="insufficient_scope", so the client can ask you to approve more access.
Questions or a client that won't connect?
Write to hello@greetai.co with the client name and version.