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.

Server URL
https://messaging.greetai.co/mcp

Connect

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
Then type /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

read

Sessions in your workspace, newest first.

querystring
Filter by name.
pageintegerdefault 1
Page number.
page_sizeintegerdefault 20
Up to 100.

Returns Sessions with id, name, type, duration, status and apply link.

“Which sessions do we have running?”

get_session

read

One 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

read

Valid 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

read

Applications 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_archivedbooleandefault false
Include archived applications.
sort"created_at" | "completed_at" | "score"default created_at
Sort field.
order"desc" | "asc"default desc
Sort order.
pageintegerdefault 1
Page number.
page_sizeintegerdefault 20
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

read

One 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

read

Recorded conversations you're allowed to watch.

session_idstring
Only this session.
include_media_urlsbooleandefault true
Include signed video links.
pageintegerdefault 1
Page number.
page_sizeintegerdefault 20
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

write

Create 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"default company-job-interview
Kind of conversation.
introstring
First line the AI says.
duration_minutes5 | 10 | 15 | 30default 5
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"default en-US
Spoken language.
voice_idstring
From list_session_options; default voice if empty.
recordingbooleandefault false
Record audio and video (Pro plan).
camera_requiredbooleandefault false
Applicant can't start until their camera is on.
block_copy_pastebooleandefault false
No copying or pasting during the session.
hide_transcriptionbooleandefault false
Hide the live transcript.
enable_text_inputbooleandefault false
Let applicants type answers.
push_to_talkbooleandefault true
Applicants hold a button to speak (more reliable).
allow_interruptionbooleandefault true
Applicants can talk over the AI.
show_feedbackbooleandefault false
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. goal tells 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_modelbooleandefault false
Native speech-to-speech model.
realtime_provider"openai" | "google"default openai
With use_realtime_model.
publishbooleandefault true
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

write

Change any setting of an existing session.

session_idstringrequired
Session id.
…
Any create_session field. 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

write

Email 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_runbooleandefault false
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

write

Re-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_recordings are 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

Request
curl -i -X POST https://messaging.greetai.co/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Response
HTTP/2 401
WWW-Authenticate: Bearer resource_metadata="https://messaging.greetai.co/.well-known/oauth-protected-resource", scope="read write"

2. With a token

Request
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"}'
Response
{
  "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.

AlsoPut a voice form on your website