recruiting-ops-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GITHUB_TOKEN | No | GitHub: Personal access token | |
| LINEAR_API_KEY | No | Linear: Personal API key | |
| NOTION_API_KEY | No | Notion: Integration secret (ntn_…) | |
| TAVILY_API_KEY | No | Tavily: API key | |
| GRANOLA_API_KEY | No | Granola: API key | |
| SLACK_BOT_TOKEN | No | Slack: Bot token (xoxb-…) | |
| GOOGLE_CLIENT_ID | No | Google: OAuth client ID | |
| FIRECRAWL_API_KEY | No | Firecrawl: API key | |
| GOOGLE_CLIENT_SECRET | No | Google: OAuth client secret |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| gmail_threads_listC | List Gmail threads. |
| gmail_messages_attachments_getA | Read one attachment, by the attachmentId messages_get or threads_get lists. A text file comes back as text; a binary one is reported, not decoded. |
| gdrive_files_createA | Create a file's metadata: a folder ( |
| gsheets_spreadsheets_values_appendC | Appends values to a spreadsheet. |
| gsheets_spreadsheets_values_getC | Returns a range of values from a spreadsheet. |
| gcalendar_events_listC | List events matching a given search filter. |
| gcalendar_events_insertC | Create a calendar event; returns details of the event. |
| gmail_messages_sendC | Send an email via the Gmail API. |
| granola_notes_getA | Read one meeting note: its AI summary, the people who attended, the calendar event it was taken against, and the folders it belongs to. Pass include='transcript' to get the transcript inline as well. A transcript too large to inline answers 413 TRANSCRIPT_TOO_LARGE. Read it with notes_transcript_get instead. |
| notion_pages_updateA | Update a page's property values, icon, cover, or trash state. Properties not named are left alone, and a value set to null is cleared. This cannot move a page — use |
| slack_chat_post_messageA | Send a message to a Slack channel, private group, or DM. Provide |
| github_search_repositoriesA | Search repositories with qualifiers, e.g. 'topic:cli language:go stars:>500'. Rate limited to 30 requests per minute. |
| github_repos_list_languagesA | List a repository's languages with bytes of code each — the quickest way to find out what a repository is written in before reading any of it. Answers with an object keyed by language, so there is nothing to page. |
| github_search_commitsA | Search commits by message, author or date across GitHub — 'repo:owner/name fix flaky test'. The way to find where a change was introduced. Rate limited to 30 requests per minute. |
| slack_conversations_inviteA | Add people to a channel. With |
| linear_team_membership_createC | Add a member to a team. |
| gdrive_permissions_createA | Create a permission for a file or shared drive. |
| notion_pages_createA | Create a page — as a subpage of another page, or as a row of a database by giving its |
| gforms_forms_createA | Create a new form from a title. Only the title and the document title are honoured: the form is created with no description, no items and default settings. To add questions, call this and then forms_batch_update with the returned formId. Pass unpublished=true to create a form that does not yet accept responses. |
| gforms_forms_responses_listA | List a form's submitted responses, newest page first, up to 5000 per page. The only supported filter is on submission time: pass filter='timestamp >= 2026-01-01T00:00:00Z' to read what has arrived since a point in time. Answers come back keyed by questionId. |
| gdocs_documents_createA | Create a blank document with a title. Only the title is honoured — the document is created empty. To add content, call this and then documents_batch_update with the returned documentId. |
| notion_pages_retrieveA | Get a page's properties. This does not return the page's content — the blocks are read with |
| gdrive_files_copyA | Create a copy of a file and apply any requested updates with patch semantics. Typically send a new |
| gdocs_documents_batch_updateA | Apply a list of edits to a document. Each request sets exactly one kind of edit — insert_text, replace_all_text, update_text_style, insert_table and so on. Edits apply in order against a document that shifts as they do: when inserting at several indices, order the requests back-to-front so earlier insertions do not move the positions later ones refer to. |
| gmail_drafts_createC | Save an email draft to Gmail. |
| tavily_searchA | Execute a real-time web search optimized for AI agents. Use when sources are unknown or current web context is needed. Prefer search_depth advanced with chunks_per_source 3 for stronger evidence per source. |
| firecrawl_scrapeB | Scrape a single URL and optionally extract information. Use when the user wants to read or summarize a specific webpage. Supports markdown, HTML, screenshots, and structured JSON extraction. |
| connectA | Connect one app this server uses. For an app that issues keys, says where to get one and the terminal command that stores it. For Google, once the user's own OAuth client is set, starts the browser sign-in and returns at once: the user approves in the browser and the next call works. To see which apps are connected, call |
| connection_statusA | See which apps this server is connected to, and how to connect each one that is not. Changes nothing. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| setup | Connect every app this server uses, the quickest way each one allows. |
| applications_inbox_to_candidate_sheet | Every application filed with its CV and a row, no ATS needed at ten hires a year. |
| interview_scheduling | Panels booked around everyone's calendars with the candidate confirmed. |
| interview_debrief | Each interviewer's notes summarised onto the candidate page, posted to the hiring channel. |
| engineering_candidate_s_public_work | What they've built in public, summarised before the technical interview. |
| new_hire_day_one | Week-one meetings, channels, team, folders and checklist, from one name and start date. |
| pulse_survey | Survey sent where people are, results summarised for leadership. |
| offer_letter | Template copied, filled from the candidate page and drafted to send. |
| job_post_from_the_market | A job description benchmarked against how others describe and pay the role. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 29 tools
Each tool has a distinct service prefix and action, e.g., gmail_threads_list vs gmail_messages_attachments_get, making purposes clear. No two tools appear to do the same thing; overlapping actions are differentiated by resource and service.
Most tools follow a service_entity_action snake_case pattern (e.g., gdrive_files_create, notion_pages_update). Minor deviations like connect, connection_status, tavily_search, and slack_chat_post_message break the pattern but remain readable.
29 tools across 11+ services is excessive for a focused recruiting ops server; many services have only one or two operations. The set feels like a broad integration grab bag rather than a well-scoped toolkit.
Core CRUD is missing for most services: Gmail lacks message reading, GDrive lacks list/get, GSheets lacks spreadsheet creation, and GitHub/Linear have only search or membership creation. References to non-existent tools (e.g., blocks_children_list) indicate an incomplete surface.