recruiting-ops-mcp
Provides tools for searching repositories, listing repository languages, and searching commits, enabling research into engineering candidates' public work.
Provides tools for listing threads, retrieving message attachments, sending emails, and creating drafts, used for application intake and candidate communication.
Provides tools for listing and inserting calendar events, used to schedule interview panels and new-hire meetings.
Integrates with Google Docs to create and fill offer letters, job descriptions, and survey summary documents.
Provides tools for creating files, copying files, and managing permissions, used to store CVs, offer letters, and onboarding folders.
Integrates with Google Forms to send pulse surveys and collect responses for leadership summaries.
Provides tools for appending and reading spreadsheet values, used to track candidates and interview schedules.
Integrates with Linear to manage team memberships and onboarding tasks for new hires.
Provides tools for creating, updating, and retrieving pages, used for candidate pages, interview debriefs, onboarding docs, and offer templates.
Provides tools for posting messages and inviting users to channels, used for hiring updates, onboarding, and pulse surveys.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@recruiting-ops-mcpfile new applications from my Gmail into the candidate sheet"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Recruiting and Onboarding
Applications to a candidate sheet, interview scheduling, debriefs and a new hire's day one.
An MCP server with 8 workflows across Gmail, Google Drive, Google Sheets, Google Calendar, Granola, Notion, Slack, GitHub, Linear, Google Forms, Google Docs, Tavily and Firecrawl. Each workflow is a prompt your agent runs as a slash command, over the 27 tools it needs and no others.
uv tool install https://github.com/r28ai/recruiting-ops-mcp/releases/download/v0.1.0/recruiting_ops_mcp-0.1.0-py3-none-any.whl
claude mcp add hiring -- recruiting-ops-mcpIt installs with uv from this repository's release, with no git and nothing to build; nothing but Charter and the libraries it uses comes from PyPI. To update, run the install line from the latest release. If a desktop app cannot find recruiting-ops-mcp, give it the full path from which recruiting-ops-mcp (where recruiting-ops-mcp on Windows).
Then ask your agent to connect your apps, or run /mcp__hiring__setup.
Connect your apps
Ask the agent to connect one ("connect Linear"). It tells you where to get that app's key and the command that stores it, and the next call works, with no restart. The agent never asks for a key in the chat.
Or connect everything this server uses from a terminal:
recruiting-ops-mcp login # each app in turn
recruiting-ops-mcp login granola # just one
recruiting-ops-mcp status # what is connectedTokens and keys go to your operating system's keychain (macOS Keychain, Windows Credential Manager, the Secret Service on Linux), and are checked with one read-only call to the app's own API before they are kept. Every key, token and OAuth client is yours: we register no app with any of these services, and nothing passes through a server of ours, because there isn't one.
App | How it connects | Or set |
Browser sign-in, over your own OAuth client (make one). |
| |
Granola | Your own key (get one), entered once. In the Granola app: Settings → Connectors → API keys. Business plan or above. |
|
Notion | Your own key (get one), entered once. Then share the pages it should see with the integration. |
|
Slack | Your own key (get one), entered once. A bot token from your own Slack app, which the guide sets up in about three minutes. |
|
GitHub | Your own key (get one), entered once. |
|
Linear | Your own key (get one), entered once. |
|
Tavily | Your own key (get one), entered once. |
|
Firecrawl | Your own key (get one), entered once. |
|
A variable set in your client's config always wins over the keychain.
Related MCP server: recruiting-jobs-mcp
Workflows
Workflow | What you get | Apps |
Applications inbox → candidate sheet | Every application filed with its CV and a row, no ATS needed at ten hires a year. | Gmail, Google Drive, Google Sheets |
Interview scheduling | Panels booked around everyone's calendars with the candidate confirmed. | Google Sheets, Google Calendar, Gmail |
Interview debrief | Each interviewer's notes summarised onto the candidate page, posted to the hiring channel. | Granola, Notion, Slack |
Engineering candidate's public work | What they've built in public, summarised before the technical interview. | GitHub, Notion |
New hire day one | Week-one meetings, channels, team, folders and checklist, from one name and start date. | Google Calendar, Slack, Linear, Google Drive, Notion |
Pulse survey | Survey sent where people are, results summarised for leadership. | Google Forms, Slack, Google Docs |
Offer letter | Template copied, filled from the candidate page and drafted to send. | Notion, Google Drive, Google Docs, Gmail |
Job post from the market | A job description benchmarked against how others describe and pay the role. | Tavily, Firecrawl, Google Docs |
Every prompt takes one optional argument, details: the repo, team, channel, customer or date range you mean, so the agent does not have to ask. In Claude Code, put it in quotes, or only its first word arrives:
/mcp__hiring__applications_inbox_to_candidate_sheet "the jobs@ inbox, sheet 'Candidates 2026'"Reads run without asking. Before anything that creates, sends, changes or deletes, the prompt tells the agent to show you the call and wait.
1 of the 8 workflows need no Google or Granola credential.
Other clients
Claude Desktop: install uv if you have not, since Claude Desktop starts the server with it, then open the .mcpb from the latest release. Claude asks for any keys in its own settings and keeps them in your keychain. The first start takes a few seconds longer, while uv installs it.
VS Code (.vscode/mcp.json): VS Code asks for each key the first time the server starts and stores it securely. Leave out any you stored with login.
{
"inputs": [
{
"type": "promptString",
"id": "google-client-secret",
"description": "Google: OAuth client secret",
"password": true
},
{
"type": "promptString",
"id": "granola-api-key",
"description": "Granola: API key",
"password": true
},
{
"type": "promptString",
"id": "notion-api-key",
"description": "Notion: Integration secret (ntn_\u2026)",
"password": true
},
{
"type": "promptString",
"id": "slack-bot-token",
"description": "Slack: Bot token (xoxb-\u2026)",
"password": true
},
{
"type": "promptString",
"id": "github-token",
"description": "GitHub: Personal access token",
"password": true
},
{
"type": "promptString",
"id": "linear-api-key",
"description": "Linear: Personal API key",
"password": true
},
{
"type": "promptString",
"id": "tavily-api-key",
"description": "Tavily: API key",
"password": true
},
{
"type": "promptString",
"id": "firecrawl-api-key",
"description": "Firecrawl: API key",
"password": true
}
],
"servers": {
"hiring": {
"type": "stdio",
"command": "recruiting-ops-mcp",
"env": {
"GOOGLE_CLIENT_SECRET": "${input:google-client-secret}",
"GRANOLA_API_KEY": "${input:granola-api-key}",
"NOTION_API_KEY": "${input:notion-api-key}",
"SLACK_BOT_TOKEN": "${input:slack-bot-token}",
"GITHUB_TOKEN": "${input:github-token}",
"LINEAR_API_KEY": "${input:linear-api-key}",
"TAVILY_API_KEY": "${input:tavily-api-key}",
"FIRECRAWL_API_KEY": "${input:firecrawl-api-key}",
"GOOGLE_CLIENT_ID": ""
}
}
}
}Cursor (.cursor/mcp.json) starts it the same way:
{
"mcpServers": {
"hiring": {
"command": "recruiting-ops-mcp"
}
}
}Codex (~/.codex/config.toml) starts a turn without waiting for a server unless it is required, and then the agent has none of its tools. required = true makes the session wait for it, and startup_readiness = "catalog" waits for its tool list rather than just its connection:
[mcp_servers.hiring]
command = "recruiting-ops-mcp"
required = true
startup_readiness = "catalog"
startup_timeout_sec = 30Name the server hiring. A host builds each tool's name from that key, and a longer one can push a tool past the 64 characters a function name allows.
Built with Charter
Every tool here is a Charter declaration: a Pydantic schema saying where each field goes on the wire. Charter's runtime builds the request, attaches and refreshes the credential, and trims the response before the model reads it. It runs in your process, with no proxy and no telemetry.
The 27 tool schemas come to 46,924 tokens.
The same tools work in your own agent, without MCP:
from charter.adapters.openai import to_openai_tools
from charter_packs_mcp import FAMILIES
tools = FAMILIES["people"].tools()
definitions = to_openai_tools(tools) # or charter.adapters.langchainNeed an API that isn't here? Write a pack: your coding agent writes the declarations, and Charter's conformance suite checks them.
Gmail:
gmail_threads_list,gmail_messages_attachments_get,gmail_messages_send,gmail_drafts_createGoogle Drive:
gdrive_files_create,gdrive_permissions_create,gdrive_files_copyGoogle Sheets:
gsheets_spreadsheets_values_append,gsheets_spreadsheets_values_getGoogle Calendar:
gcalendar_events_list,gcalendar_events_insertGranola:
granola_notes_getNotion:
notion_pages_update,notion_pages_create,notion_pages_retrieveSlack:
slack_chat_post_message,slack_conversations_inviteGitHub:
github_search_repositories,github_repos_list_languages,github_search_commitsLinear:
linear_team_membership_createGoogle Forms:
gforms_forms_create,gforms_forms_responses_listGoogle Docs:
gdocs_documents_create,gdocs_documents_batch_updateTavily:
tavily_searchFirecrawl:
firecrawl_scrape
License
Apache 2.0.
Available Tools
29 toolsconnectA
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_status. Never ask the user for a key in the chat.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | The app to connect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description contradicts the openWorldHint=false annotation. It explicitly says the tool starts a browser sign-in for Google, where the user approves in the browser, which is an external OAuth interaction. That is inconsistent with the annotation declaring a closed-world tool. Despite other rich behavioral context, the contradiction mandates a score of 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: it states the core action, explains key-app behavior, explains Google's special flow, points to connection_status, and adds a security rule. The most important information is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and minimal annotations, the description supplies enough context to call the tool correctly for Google and key-issuing apps, and it routes status checks to the sibling. It could clarify behavior for other OAuth-based apps or return values, but it is largely complete for a one-parameter setup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already lists the enum and describes the app parameter, so baseline is 3. The description adds meaningful app-specific semantics: for key-issuing apps it says where to get a key and the terminal command to store it, and for Google it describes the OAuth client prerequisite and browser sign-in flow. That goes beyond the enum values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: connecting one app that the server uses. It distinguishes the tool from connection_status by naming the status sibling and explaining what connect does for Google and key-issuing apps. Slightly vague on what 'connect' means for all apps, but overall clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use it and names the alternative `connection_status` for checking which apps are connected. It also includes a concrete negative instruction ('Never ask the user for a key in the chat'), which is useful guidance, though it does not exhaustively cover when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connection_statusARead-only
See which apps this server is connected to, and how to connect each one that is not. Changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered by structured data. 'Changes nothing' restates the readOnly hint rather than adding new behavior; the only incremental value is noting that connect instructions are returned for unconnected apps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence that front-loads the primary purpose and appends the secondary benefit with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-param, read-only status tool with no output schema, the description covers both what is inspected and the shape of the useful payload (connect guidance). Return format details are absent but minimal given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing for the description to disambiguate, and it correctly implies no input is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('See') and resource ('which apps this server is connected to'), and adds the secondary payload of connect instructions for missing apps. This distinguishes it from the sibling 'connect' tool, which performs the connection rather than reporting status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'how to connect each one that is not' implies this tool is the discovery step before using 'connect', but the sibling is never named and there is no explicit when-to-use/when-not statement. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The URL to scrape | |
| proxy | No | Specifies the type of proxy to use. | |
| maxAge | No | Returns a cached version of the page if it is younger than this age in milliseconds. The server applies 172800000 (2 days) when this is absent. | |
| minAge | No | When set, the request only checks the cache and never triggers a fresh scrape. | |
| mobile | No | Emulate scraping from a mobile device. | |
| actions | No | Actions to perform on the page before grabbing the content. | |
| formats | No | Output formats to include in the response. Strings or objects. The server applies markdown when this is absent. | |
| headers | No | Headers to send with the request. | |
| parsers | No | Controls how files are processed during scraping. | |
| profile | No | Persistent browser storage across scrape and interact sessions. | |
| timeout | No | Timeout in milliseconds. The server applies 60000 when this is absent. | |
| waitFor | No | Specify a delay in milliseconds before fetching the content. The server applies 0 when this is absent. | |
| blockAds | No | Enables ad-blocking and cookie popup blocking. | |
| location | No | Location settings for the request. | |
| lockdown | No | Serve from cache only and never make an outbound request. On miss, returns 404 SCRAPE_LOCKDOWN_CACHE_MISS. | |
| redactPII | No | Redact personally identifiable information from returned markdown. Pass true for defaults, or an object to tune it. | |
| excludeTags | No | Tags to exclude from the output. | |
| includeTags | No | Tags to include in the output. | |
| storeInCache | No | If true, the page will be stored in the Firecrawl index and cache. | |
| auditMetadata | No | User attribution included with SIEM logging events when SIEM is enabled. | |
| onlyMainContent | No | Only return the main content of the page excluding headers, navs, footers, etc. The server applies true when this is absent. | |
| onlyCleanContent | No | Beta. LLM pass over markdown to remove residual boilerplate that onlyMainContent can miss. | |
| threatProtection | No | Per-request threat protection override. Enterprise feature. | |
| zeroDataRetention | No | If true, this will enable zero data retention for this scrape. To enable this feature, please contact help@firecrawl.dev | |
| removeBase64Images | No | Removes all base64 images from the markdown output. | |
| skipTlsVerification | No | Skip TLS certificate verification when making requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the agent knows this touches external state. The description adds the supported output formats, which is useful, but it omits behavior implied by the schema — that actions (click/write/executeJavascript) mutate the page, that storeInCache writes to an external index, and that some features cost credits. Nothing contradicts the annotations, but the added behavioral detail is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core purpose front-loaded and no filler. The trailing format list is somewhat redundant with the schema's formats enum, which keeps it short of ideal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a 26-parameter tool with no output schema and only minimal annotations, yet the description is three sentences long. It omits cost/credit implications, caching/lockdown semantics, the relationship to firecrawl_extract, and any hint of what the response looks like, so an agent invoking it correctly still depends almost entirely on reading the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 26 parameters are already documented in-schema and the baseline is 3. The description echoes the formats dimension ('markdown, HTML, screenshots, structured JSON extraction') but adds no format syntax, precedence, or interaction detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Scrape a single URL') plus an optional outgrowth ('optionally extract information'), so an agent can tell it is a per-URL content fetcher. The phrase 'a single URL' gestures at the multi-URL alternative but never names firecrawl_extract, so sibling differentiation is only implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one clear trigger ('Use when the user wants to read or summarize a specific webpage'), which is real usage guidance. But it never states when NOT to use it, nor does it point to firecrawl_extract for bulk/structured extraction, so the routing decision against the closest sibling is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gcalendar_events_insertC
Create a calendar event; returns details of the event.
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes | The event to insert. | |
| calendarId | Yes | Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword. | |
| sendUpdates | No | Guests who should receive notifications about the change. Acceptable values are: "all" (notifications are sent to all guests), "externalOnly" (notifications are sent to non-Google Calendar guests only), "none" (no notifications are sent; for calendar migration tasks, consider using the Events.import method instead). | |
| maxAttendees | No | The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional. | |
| eventLabelVersion | No | Version number of the event label feature supported by the API client. Version 0 assumes no event label support and processes the colorId field for color management. Version 1 enables support for event labels, and processes the eventLabelId in the event's body. In this case, the colorId field is ignored. The default is 0. Acceptable values are 0 to 1, inclusive. | |
| supportsAttachments | No | Whether API client performing operation supports event attachments. Optional. The default is False. | |
| conferenceDataVersion | No | Version number of conference data supported by the API client. Version 0 assumes no conference data support and ignores conference data in the event's body. Version 1 enables support for copying of ConferenceData as well as for creating new conferences using the createRequest field of conferenceData. The default is 0. Acceptable values are 0 to 1, inclusive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (a mutation) and openWorldHint=true. The description adds only 'returns details of the event' and omits meaningful behavioral context for a mutation tool of this complexity: guest notifications, the sendUpdates/conferenceDataVersion/supportsAttachments side-effect flags, permission requirements, and attendee-invitation behavior are all undisclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action front-loaded and no filler. It is efficient, though the trailing return-value clause could arguably be dropped since it is the only content beyond the verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the brief note about returned details is helpful, but for a mutation tool with 7 parameters and rich side-effect potential (invitations, notifications, conference generation) the description is thin. It is minimally adequate rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents all 7 parameters including sendUpdates, conferenceDataVersion, and maxAttendees. Per the rubric, that establishes a baseline of 3; the description adds nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a calendar event'), which clearly distinguishes it from the sibling gcalendar_events_list. It does not, however, differentiate itself from similar write operations or mention scope (which calendar), so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use context, prerequisites, or alternatives. An agent must infer that this is the creation counterpart to gcalendar_events_list without any explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gcalendar_events_listCRead-onlyIdempotent
List events matching a given search filter.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free text search terms to find events that match these terms in the following fields: summary, description, location, attendee's displayName, attendee's email, organizer's displayName, organizer's email, workingLocationProperties.officeLocation.buildingId, workingLocationProperties.officeLocation.deskId, workingLocationProperties.officeLocation.label, workingLocationProperties.customLocation.label. These search terms also match predefined keywords against all display title translations of working location, out-of-office, and focus-time events. Optional. | |
| iCalUID | No | Specifies an event ID in the iCalendar format to be provided in the response. Optional. Use this if you want to search for an event by its iCalendar ID. | |
| orderBy | No | The order of the events returned in the result. Optional. The default is an unspecified, stable order. Acceptable values are: "startTime" (order by the start date/time, ascending; this is only available when querying single events, i.e. the parameter singleEvents is True), "updated" (order by last modification time, ascending). | |
| timeMax | No | Upper bound (exclusive) for an event's start time to filter by. Optional. The default is not to filter by start time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMin is set, timeMax must be greater than timeMin. | |
| timeMin | No | Lower bound (exclusive) for an event's end time to filter by. Optional. The default is not to filter by end time. Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax. | |
| timeZone | No | Time zone used in the response. Optional. The default is the time zone of the calendar. | |
| pageToken | No | Token specifying which result page to return. Optional. | |
| syncToken | No | Token obtained from the nextSyncToken field returned on the last page of results from the previous list request. It makes the result of this list request contain only entries that have changed since then. All events deleted since the previous list request will always be in the result set and it is not allowed to set showDeleted to False. There are several query parameters that cannot be specified together with nextSyncToken to ensure consistency of the client state. These are: iCalUID, orderBy, privateExtendedProperty, q, sharedExtendedProperty, timeMin, timeMax, updatedMin. All other query parameters should be the same as for the initial synchronization to avoid undefined behavior. If the syncToken expires, the server will respond with a 410 GONE response code and the client should clear its storage and perform a full synchronization without any syncToken. Optional. The default is to return all entries. | |
| calendarId | Yes | Calendar identifier. To retrieve calendar IDs call the calendarList.list method. If you want to access the primary calendar of the currently logged in user, use the "primary" keyword. | |
| eventTypes | No | Event types to return. Optional. This parameter can be repeated multiple times to return events of different types. If unset, returns all event types. Acceptable values are: "birthday" (special all-day events with an annual recurrence), "default" (regular events), "focusTime" (focus time events), "fromGmail" (events from Gmail), "outOfOffice" (out of office events), "workingLocation" (working location events). | |
| maxResults | No | Maximum number of events returned on one result page. The number of events in the resulting page may be less than this value, or none at all, even if there are more events matching the query. Incomplete pages can be detected by a non-empty nextPageToken field in the response. By default the value is 250 events. The page size can never be larger than 2500 events. Optional. | |
| updatedMin | No | Lower bound for an event's last modification time (as a RFC3339 timestamp) to filter by. When specified, entries deleted since this time will always be included regardless of showDeleted. Optional. The default is not to filter by last modification time. | |
| showDeleted | No | Whether to include deleted events (with status equals "cancelled") in the result. Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False. If showDeleted and singleEvents are both True, only single instances of deleted events (but not the underlying recurring events) are returned. Optional. The default is False. | |
| maxAttendees | No | The maximum number of attendees to include in the response. If there are more than the specified number of attendees, only the participant is returned. Optional. | |
| singleEvents | No | Whether to expand recurring events into instances and only return single one-off events and instances of recurring events, but not the underlying recurring events themselves. Optional. The default is False. | |
| showHiddenInvitations | No | Whether to include hidden invitations in the result. Optional. The default is False. | |
| sharedExtendedProperty | No | Extended properties constraint specified as propertyName=value. Matches only shared properties. This parameter might be repeated multiple times to return events that match all given constraints. | |
| privateExtendedProperty | No | Extended properties constraint specified as propertyName=value. Matches only private properties. This parameter might be repeated multiple times to return events that match all given constraints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds nothing beyond that — no pagination behavior, no sync-token semantics, no note that results are scoped to a single calendar. It contributes no behavioral context of its own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with zero waste, and the action is front-loaded. But the brevity is under-specification rather than disciplined conciseness — it omits any usable context an agent would want for a 18-parameter list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with 18 parameters, no output schema, and paging/sync behavior, a single sentence is insufficient. The rich schema mitigates some of this, but the description supplies no operational framing (single-calendar scope, pagination, recurring-event expansion) that an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 18 parameters, so the schema carries full semantic burden (time bounds, orderBy constraints, syncToken exclusions, etc.). The description adds no parameter meaning whatsoever, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (events) plus a scope qualifier ('matching a given search filter'). However, 'search filter' is vague against an 18-parameter schema and the description offers no differentiation from the sibling gcalendar_events_insert or any hint of what the tool actually filters on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus alternatives, no mention of prerequisites (calendarId required, calendarList.list to discover IDs), and no exclusions. The single sentence gives only the bare action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The edits to apply. | |
| documentId | Yes | The ID of the document to update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true — a thin profile. The description adds the critical non-obvious behavior that edits apply sequentially and indices shift, which annotations do not convey. It does not mention revision/concurrency behavior (writeControl) or error semantics, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and then the ordering caveat. The long 'and so on' list of request types is slightly loose but it efficiently signals the breadth of the union without enumerating all ~30 variants.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch mutation with only readOnly/openWorld annotations and no output schema, the description covers the essential sequential-index behavior an agent must know to avoid corrupting positions. It omits concurrency/revision guidance that lives in the schema's writeControl, which is acceptable though slightly incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents documentId, body, requests, and writeControl with rich nested descriptions. The description only restates the request structure and ordering. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (apply edits) and resource (a document), plus enumerates the edit kinds (insert_text, replace_all_text, update_text_style, insert_table). It is clearly distinguishable from siblings like gdocs_documents_create, which makes a new document rather than modifying one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use ordering rule for a common case (order back-to-front when inserting at several indices). It does not explicitly name alternatives such as gdocs_documents_create or explain when not to batch, but the batch semantics are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | The document to create. Only the title is honoured. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true, so the description carries the behavioral load and does well: it discloses the critical constraint that only the title is honoured and the document is created empty. It also notes the documentId is returned, which matters with no output schema. It stops short of noting auth/permission or quota behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, zero padding, and the most important constraint (empty document, title-only) is front-loaded before the follow-up instructions. Every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by mentioning the returned documentId and the batch_update follow-up, which is what an agent needs to chain calls. For a single-param mutation tool with annotations covering the safety profile, this is nearly complete; only auth/error behavior is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the title field already states it is the only honoured field, so the description largely restates structured data. Baseline 3 applies; the emphasis on the empty-document effect is useful but not new information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) and resource (document), and immediately disambiguates the scope: it produces a blank/empty document, not a content-bearing one. This is a distinct action an agent can tell apart from content-writing operations. The mention of documents_batch_update further fixes its place in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear sequencing guidance: to add content, create first and then call documents_batch_update with the returned documentId. It does not state explicit exclusions or alternatives (e.g., when to use a copy/template flow instead), so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdrive_files_copyA
Create a copy of a file and apply any requested updates with patch semantics. Typically send a new name and optionally parents.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The file resource to apply on the copy, with patch semantics. Typically `name` and optionally `parents`. If `parents` is omitted, the copy inherits any discoverable parent of the source file. | |
| fileId | Yes | The ID of the file. | |
| ocrLanguage | No | A language hint for OCR processing during image import (ISO 639-1 code). | |
| copyComments | No | Whether to copy the comments associated with the file. | |
| includeLabels | No | A comma-separated list of IDs of labels to include in the `labelInfo` part of the response. | |
| supportsAllDrives | No | Whether the requesting application supports both My Drives and shared drives. | |
| keepRevisionForever | No | Whether to set the `keepForever` field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions. | |
| ignoreDefaultVisibility | No | Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders. | |
| includePermissionsForView | No | Specifies which additional view's permissions to include in the response. Only `published` is supported. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/non-safe nature is covered structurally. The description adds 'patch semantics' and the inheritance rule for omitted parents, but says nothing about the copy's sharing/permission behavior, comment copying, or quota effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the core action plus the common invocation pattern are front-loaded. Nothing here could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 9 parameters all documented in the schema and no output schema, the description covers the basics of what the tool does. However, it omits the behavioral context an agent needs for a mutation tool: whether the source is modified, what the response contains, and permission/quota implications.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's note about name/parents largely restates what the `file` parameter description in the schema already says, adding no new syntax or format detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Create a copy of a file', which is plainly distinguishable from the sibling gdrive_files_create. It does not explicitly name or contrast the sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'Typically send a new `name` and optionally `parents`' gives practical guidance on the common call shape, but there is no when-to-use/when-not-to-use framing, no prerequisite permissions, and no routing against alternatives like gdrive_files_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdrive_files_createA
Create a file's metadata: a folder (mimeType application/vnd.google-apps.folder), a Google Doc / Sheet / Slide, or an empty blob. Media upload is not expressed here. parents takes at most one folder ID.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The file resource to create. For a folder, set `mimeType` to `application/vnd.google-apps.folder`. For a Google Doc, Sheet or Slide, use the corresponding `application/vnd.google-apps.*` MIME type. `parents` takes at most one folder ID. | |
| ocrLanguage | No | A language hint for OCR processing during image import (ISO 639-1 code). | |
| includeLabels | No | A comma-separated list of IDs of labels to include in the `labelInfo` part of the response. | |
| supportsAllDrives | No | Whether the requesting application supports both My Drives and shared drives. | |
| keepRevisionForever | No | Whether to set the `keepForever` field in the new head revision. This is only applicable to files with binary content in Google Drive. Only 200 revisions for the file can be kept forever. If the limit is reached, try deleting pinned revisions. | |
| ignoreDefaultVisibility | No | Whether to ignore the domain's default visibility settings for the created file. Domain administrators can choose to make all uploaded files visible to the domain by default; this parameter bypasses that behavior for the request. Permissions are still inherited from parent folders. | |
| includePermissionsForView | No | Specifies which additional view's permissions to include in the response. Only `published` is supported. | |
| useContentAsIndexableText | No | Whether to use the uploaded content as indexable text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false (a write) and openWorldHint=true, so the safety profile is partly covered. The description adds a meaningful scope constraint — metadata only, not media upload — but says nothing about permissions, reversibility, or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler. The core action and the two most consequential constraints (no media upload, single parent) appear immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given full schema coverage and existing annotations, the description is adequate for calling the tool. However, with no output schema, it omits any statement about what is returned (the created file resource), and gives no hint about required permissions or behavior when the parent is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters in detail. The mimeType values and the 'parents takes at most one folder ID' note in the description merely restate what the nested `file` parameter description already provides, adding no new syntax or format information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a file's metadata') and enumerates the three things it can create — a folder, a Google Doc/Sheet/Slide, or an empty blob. It does not, however, explicitly distinguish itself from a possible native-doc creator, so the differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Media upload is not expressed here' gives one negative scoping cue (don't use this to upload content), which is useful. But it names no alternative tool and gives no explicit when-to-use conditions, leaving usage largely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gdrive_permissions_createA
Create a permission for a file or shared drive. type is user, group, domain or anyone; role is owner, organizer, fileOrganizer, writer, commenter or reader. For user or group, send emailAddress. Concurrent permission writes on the same file are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | The ID of the file or shared drive. | |
| permission | Yes | The permission to create. | |
| emailMessage | No | A plain text custom message to include in the notification email. | |
| supportsAllDrives | No | Whether the requesting application supports both My Drives and shared drives. | |
| transferOwnership | No | Whether to transfer ownership to the specified user and downgrade the current owner to a writer. This parameter is required as an acknowledgement of the side effect. For more information, see Transfer file ownership. | |
| moveToNewOwnersRoot | No | This parameter only takes effect if the item isn't in a shared drive and the request is attempting to transfer the ownership of the item. If set to `true`, the item is moved to the new owner's My Drive root folder and all prior parents removed. If set to `false`, parents aren't changed. | |
| useDomainAdminAccess | No | Issue the request as a domain administrator. If set to `true`, and if the following additional conditions are met, the requester is granted access: (1) The file ID parameter refers to a shared drive. (2) The requester is an administrator of the domain to which the shared drive belongs. For more information, see Manage shared drives as domain administrators. | |
| sendNotificationEmail | No | Whether to send a notification email when sharing to users or groups. This defaults to `true` for users and groups, and is not allowed for other requests. It must not be disabled for ownership transfers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true, a minimal profile for a mutation tool. The description adds one genuinely valuable behavioral fact – concurrent writes on the same file are unsupported – but it does not disclose notification-email side effects, the ownership-transfer side effect, or permission-scope requirements, so it only partly fulfills the disclosure burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and followed by the constraint-critical facts. Slight redundancy with the schema's own enum listings keeps it from being maximally efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with no output schema, the description covers the core grant semantics and one concurrency caveat but says nothing about what the call returns (the created Permission resource) or about the high-impact optional flags that live only in the schema. It is usable but not fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description repeats the type and role enums and the emailAddress rule, all of which the schema already documents verbatim, and it adds no meaning for the other six parameters (transferOwnership, sendNotificationEmail, useDomainAdminAccess, etc.).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a permission for a file or shared drive') and no sibling tool overlaps with permission management, so ambiguity is nil. The follow-on sentences make clear it is about granting a role on a Drive item rather than creating the item itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the create semantics and the field-combination rules (emailAddress for user/group, role/type pairings), but there is no explicit statement of when to use this versus a sibling or what prerequisites/auth are needed. Adequate but leaves the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The form to create. | |
| unpublished | No | Optional. Whether the form is unpublished. If set to `true`, the form doesn't accept responses. If set to `false` or unset, the form is published and accepts responses. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and openWorldHint=true, but the description adds real behavioral context: only title and documentTitle survive, the form starts with no description/items and default settings, and unpublished controls whether responses are accepted. That is exactly the kind of side-effect disclosure a mutation tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and scope, then the chaining instruction, then the flag. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation scope, the chaining workflow, and the unpublished flag; mentioning the returned formId partially compensates for the absent output schema. Minor gaps remain (e.g., auth or quota requirements), but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents body.info and unpublished, including the unpublished response-acceptance semantics. The description's 'only title and documentTitle are honoured' mirrors the schema's own wording on body.info, adding little beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new form from a title') and immediately scopes what the created object contains. It is clearly distinguishable from gdocs_documents_create and other create-style siblings by naming the Google Forms resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent the follow-up path for adding questions: 'call this and then forms_batch_update with the returned formId', naming the sibling tool and the condition. It also explains the unpublished=true branch, so the agent knows when to use that flag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gforms_forms_responses_listARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Which form responses to return. Currently, the only supported filters are: `timestamp > N` which means to get all form responses submitted after (but not at) timestamp N, and `timestamp >= N` which means to get all form responses submitted at and after timestamp N. For both supported filters, timestamp must be formatted in RFC3339 UTC "Zulu" format. Examples: "2014-10-02T15:01:23Z" and "2014-10-02T15:01:23.045123456Z". The whole filter is one string, operator included: 'timestamp >= 2014-10-02T15:01:23Z'. There is no other filterable field — a question, an email or a score cannot be filtered here. | |
| formId | Yes | Required. ID of the Form whose responses to list. | |
| pageSize | No | The maximum number of responses to return. The service may return fewer than this value. If unspecified or zero, at most 5000 responses are returned. | |
| pageToken | No | A page token returned by a previous list response. If this field is set, the form and the values of the filter must be the same as for the original request. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds behavior the annotations do not: newest-first ordering, the 5000-per-page ceiling, and that answers are keyed by questionId. It omits pagination semantics (that pageToken must repeat the same filter), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the resource and ordering, then the filter rule, then the return shape. Every sentence carries information an agent needs and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description partially compensates by noting answers are keyed by questionId, plus it gives ordering and page limits. It stops short of describing the response envelope (e.g. nextPageToken, responseId) or how to continue paging, which is the remaining gap for a paginated list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters including the full filter grammar, RFC3339 format and the pageToken consistency rule. The description's filter example and questionId note mostly restate that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List a form's submitted responses') plus ordering ('newest page first') and a hard cap ('up to 5000 per page'). No other Google Forms tool exists among the siblings, so there is nothing to disambiguate against, and the purpose is unambiguous on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the operative constraint clearly: the only supported filter is on submission time, with a worked example that shows what the filter buys you ('read what has arrived since a point in time'). It does not state when *not* to use it or how pagination resumes, but for a single-purpose list tool the context given is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_repos_list_languagesARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | The name of the repository without the `.git` extension. The name is not case sensitive. | |
| owner | Yes | The account owner of the repository. The name is not case sensitive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint, idempotentHint and openWorldHint already covering the safety profile, the description still earns credit by disclosing the return shape (an object keyed by language) and the absence of pagination, which matters since no output schema exists. It does not mention auth requirements or rate limits, so it is not fully exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tightly written sentence that front-loads the action and resource, then appends the two facts an agent needs (bytes per language, no paging). Zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with a fully documented schema and no output schema, the description supplies everything missing: what it returns, its keying, and that there is no pagination to handle. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required parameters (owner, repo) are documented in the schema, so the baseline is 3. The description adds no formatting or case-sensitivity guidance beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (a repository's languages) and adds the payload detail (bytes of code each). An agent immediately knows this is the language-breakdown read, distinct from the GitHub search tools among the siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for use — 'the quickest way to find out what a repository is written in before reading any of it' — which tells the agent when this tool is the right first step. It does not, however, name an alternative tool or state exclusions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_search_commitsARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The search query, with commit qualifiers: `repo:owner/name`, `author:LOGIN`, `committer-date:>2026-01-01`, `merge:false`. A bare term searches commit messages. | |
| page | No | The page number of the results to fetch. Defaults to 1. | |
| sort | No | Sorts the results by author or committer date. Absent, results come back by best match. | |
| order | No | Determines whether the first search result returned is the highest number of matches (`desc`) or lowest (`asc`). Ignored unless `sort` is provided. GitHub uses `desc` when this is absent. | |
| perPage | No | The number of results per page (max 100). Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds a genuine behavioral constraint not present in structured data: a rate limit of 30 requests per minute, which an agent must respect when issuing repeated searches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and scoped qualifiers, then a purpose statement and a rate-limit caveat. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with a fully documented schema, the description covers purpose, the query shape and a rate limit. It says nothing about result shape or pagination behavior, though the page/perPage params imply paging; with no output schema, a brief note on what a result contains would have closed the gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters including the qualifier syntax for `q` are already documented. The example query 'repo:owner/name fix flaky test' illustrates composition of qualifiers, but it repeats qualifiers the schema already enumerates, so it adds only marginal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (commits) plus the axes of search (message, author, date) and the target system (GitHub). The second sentence clarifies the higher-order purpose — locating where a change was introduced — which no sibling tool covers, so it is trivially distinguishable from the rest of the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use case: 'The way to find where a change was introduced,' which tells the agent when this tool is the right pick. It does not name an alternative or state exclusions, but no sibling tool overlaps with commit search, so the omission costs little.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_search_repositoriesARead-onlyIdempotent
Search repositories with qualifiers, e.g. 'topic:cli language:go stars:>500'. Rate limited to 30 requests per minute.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The query containing one or more search keywords and qualifiers, e.g. `tetris language:assembly stars:>100`. Qualifiers include `language:`, `stars:`, `forks:`, `topic:`, `org:`, `user:`, `license:`. | |
| page | No | The page number of the results to fetch. Defaults to 1. | |
| sort | No | Sorts the results by number of stars, forks, help-wanted issues, or how recently the items were updated. Default: best match. | |
| order | No | Determines whether the first search result returned is the highest number of matches (`desc`) or lowest (`asc`). Ignored unless `sort` is provided. GitHub uses `desc` when this is absent. | |
| perPage | No | The number of results per page (max 100). Defaults to 30. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, and idempotent behavior. The description adds a valuable operational constraint: a rate limit of 30 requests per minute, which is not available from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no waste. The purpose and example are front-loaded, followed by the rate limit. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and annotations are rich, and the description adds a key rate-limit detail. It is nearly complete for a search tool, though it could note that results are paginated or what the response contains if an agent needed that reassurance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters and qualifier syntax. The description's example query is consistent with the schema but does not add meaning beyond it, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: search repositories. The example query with qualifiers makes the scope unambiguous and distinguishes it from sibling tools like github_search_commits or github_repos_list_languages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool name and description, but there is no explicit when-to-use or when-not-to-use guidance, nor any comparison to alternatives such as github_repos_list_languages or tavily_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_drafts_createC
Save an email draft to Gmail.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The draft to create. | |
| userId | No | The user's email address. The special value 'me' can be used to indicate the authenticated user. | me |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/non-read nature is covered structurally. The description adds nothing beyond that: it does not say the draft is not sent, whether creation is idempotent, or what auth is required, so the behavioral burden is largely unmet.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler, which is well structured. It is arguably under-specified rather than bloated, but as a size/structure judgment it is tight and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with only minimal annotations and no output schema, the description should at least clarify that it saves rather than sends and hint at the returned draft. The rich input schema compensates for parameters, but the core behavioral distinction is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested Message/Draft/EmailContent fields are richly documented (threadId rules, bodyHtml multipart behavior, in_reply_to threading). The description adds no parameter meaning at all, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Save an email draft') and destination (Gmail), which is enough to know it creates a draft rather than sending. However, it does not distinguish itself from the adjacent gmail_messages_send sibling, so an agent gets no explicit routing cue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of the alternative tool (gmail_messages_send) for actually delivering mail. The agent must infer that this only persists a draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_messages_attachments_getARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The ID of the attachment. | |
| userId | No | The user's email address. The special value 'me' can be used to indicate the authenticated user. | me |
| messageId | Yes | The ID of the message containing the attachment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered. The description adds real behavioral value beyond them: text attachments return as text and binary ones are 'reported, not decoded', which sets return expectations for a tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler; the core action and the id provenance are front-loaded, and the return-format caveat follows.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description covers the important unknown (how content is returned). What 'reported, not decoded' actually looks like for a binary attachment remains slightly ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both required params and userId are documented in the schema; baseline is 3. The description clarifies where the attachmentId originates, but adds no format or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Read one attachment') and it explicitly names the sibling tools (messages_get, threads_get) that produce the attachmentId, so the agent can place it precisely among the gmail_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the context of use by tying the call to the id returned by messages_get/threads_get, which is the key prerequisite. It does not, however, state any exclusion or alternative for fetching attachment content another way.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_messages_sendC
Send an email via the Gmail API.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The email message data. | |
| userId | No | The user's email address. The special value 'me' can be used to indicate the authenticated user. | me |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the safety profile is partially covered. The description adds no behavioral traits beyond that, such as immediate sending, authentication requirements, irreversibility, or threading behavior; it essentially restates the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single, front-loaded sentence with no wasted words. While it is sparse, the structure is efficient and the core action is stated first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with open-world annotations and no output schema, the description is incomplete. It does not clarify that the message is sent immediately rather than saved as a draft, nor does it describe return behavior or error handling, leaving important context gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the nested EmailContent fields are fully documented. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Send) and resource (email via Gmail API), which is clearer than a generic action. However, it does not differentiate from sibling tools like gmail_drafts_create or slack_chat_post_message, so it misses the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives, no prerequisites, and no exclusions. It simply states the action without any contextual routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gmail_threads_listCRead-onlyIdempotent
List Gmail threads.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Only return threads matching this Gmail search query string. | |
| userId | No | The user's email address. The special value 'me' can be used to indicate the authenticated user. | me |
| labelIds | No | Return only threads with all of these label IDs. | |
| pageToken | No | Page token to retrieve a specific page of results in the list. | |
| maxResults | No | Maximum number of threads to return (default 100, max 500). | |
| includeSpamTrash | No | Include threads from SPAM and TRASH in the results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered by structured data. The description adds nothing beyond that — no note on pagination behavior, result ordering, or the fact that a full mailbox scan may be needed without filters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler and the key information front-loaded. It is efficient, though the extreme brevity shades into under-specification rather than pure conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read tool with no output schema, the description is minimally viable: the schema covers all inputs, but the description omits pagination semantics and what a thread result contains. Nothing is misleading, but an agent gets no help beyond the structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (q, userId, labelIds, pageToken, maxResults, includeSpamTrash) is already documented in the schema. The description contributes no additional meaning, which is the baseline 3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('Gmail threads'), which is unambiguous and distinguishable from write-oriented siblings like gmail_messages_send and gmail_drafts_create. It stops short of scope details (e.g. mailbox-wide vs. label-filtered), so it is clear but not maximally informative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, no mention of prerequisites or the conditions under which a caller should prefer it. The sibling set contains other Gmail operations but the description offers no routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
granola_notes_getARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | The ID of the note, as returned by the list endpoint — a `not_` prefix followed by fourteen alphanumeric characters. The UUID in a Granola web app URL is a different identifier and is not accepted here. | |
| include | No | Include the note transcript in the response. If it is too large to return inline, Get Note returns `TRANSCRIPT_TOO_LARGE`; retrieve it in pages from `/v1/notes/{note_id}/transcript`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds materially useful behavior beyond that: the 413 TRANSCRIPT_TOO_LARGE failure mode and the fallback path to notes_transcript_get, which an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose and followed by the opt-in parameter and its failure path. No filler and every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden, and it does so by enumerating the returned fields (summary, attendees, calendar event, folders). Combined with the error-handling note, nothing needed to call or interpret this read tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both noteId (format constraints) and include are already fully documented in the schema, making 3 the baseline. The description's 'Pass include=transcript' largely restates the schema description and its TRANSCRIPT_TOO_LARGE note, adding little syntax or format detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Read one meeting note') and immediately distinguishes scope from the sibling granola_notes_list by emphasizing the singular note. It enumerates exactly what comes back (AI summary, attendees, calendar event, folders), so an agent knows the payload without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional guidance for the transcript case ('Pass include=transcript') and routes to the alternative tool (notes_transcript_get) when the transcript is too large. It does not explicitly contrast with granola_notes_list, which is left implicit via 'one meeting note'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsheets_spreadsheets_values_appendC
Appends values to a spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | The A1 notation of a range to search for a logical table of data. Values are appended after the last row of the table. | |
| valueRange | Yes | The request body contains an instance of ValueRange. | |
| spreadsheetId | Yes | The ID of the spreadsheet to update. | |
| insertDataOption | No | How the input data should be inserted. | |
| valueInputOption | Yes | How the input data should be interpreted. | |
| includeValuesInResponse | No | Determines if the update response should include the values of the cells that were appended. By default, responses do not include the updated values. | |
| responseValueRenderOption | No | Determines how values in the response should be rendered. The default render option is FORMATTED_VALUE. | |
| responseDateTimeRenderOption | No | Determines how dates, times, and durations in the response should be rendered. This is ignored if responseValueRenderOption is FORMATTED_VALUE. The default dateTime render option is SERIAL_NUMBER. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false and openWorldHint=true, indicating a mutating, external operation. The description adds nothing beyond this – it doesn't disclose how appended data interacts with existing tables, whether headers are auto-detected, or rate-limit/permission requirements. For a mutation tool, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single, front-loaded sentence that wastes no words. However, the extreme brevity contributes to gaps elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, nested value types, mutation behavior), the description is critically underspecified. It omits key behavioral details like how the append range is determined, interaction with existing data, and available options (insertDataOption, valueInputOption). No output schema exists to compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description adds no parameter-level detail beyond what's already provided. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (appends) and resource (values to a spreadsheet), which is clear but does not differentiate from the sibling gsheets_spreadsheets_values_update or clarify the 'logical table' append behavior. It's clear but lacks sibling differentiation within the gsheets tool family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like gsheets_spreadsheets_values_update, and no mention of required preconditions or idempotency considerations. The description is silent on usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsheets_spreadsheets_values_getCRead-onlyIdempotent
Returns a range of values from a spreadsheet.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | The A1 notation or R1C1 notation of the range to retrieve values from. | |
| spreadsheetId | Yes | The ID of the spreadsheet to retrieve data from. | |
| majorDimension | No | The major dimension that results should use. For example, if the spreadsheet data in Sheet1 is: A1=1,B1=2,A2=3,B2=4, then requesting range=Sheet1!A1:B2?majorDimension=ROWS returns [[1,2],[3,4]], whereas requesting range=Sheet1!A1:B2?majorDimension=COLUMNS returns [[1,3],[2,4]]. | |
| valueRenderOption | No | How values should be represented in the output. The default render option is FORMATTED_VALUE. | |
| dateTimeRenderOption | No | How dates, times, and durations should be represented in the output. This is ignored if valueRenderOption is FORMATTED_VALUE. The default dateTime render option is SERIAL_NUMBER. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that — no mention of behavior for missing/empty ranges, error cases, or whether the range must already exist — so it contributes essentially no behavioral context of its own.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero padding. It is efficient, though arguably terse given the tool takes five parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Annotations cover the safety profile and the schema fully documents inputs, so the description's burden is lighter. Still, with no output schema, it says only that 'values' are returned without hinting at the row/column shape that majorDimension controls, which is the main thing an agent must reason about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameters (range, spreadsheetId, majorDimension, valueRenderOption, dateTimeRenderOption) are already richly documented in the schema, including an example for majorDimension. The description adds no parameter meaning at all, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns a range of values from a spreadsheet'), which is clearly readable. However, it does not differentiate this from siblings such as gsheets_spreadsheets_values_update or gdocs_documents_get, leaving the agent to infer the read-vs-write distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no mention of when NOT to use it, and no reference to the sibling update tool. The agent gets an implied read-only purpose from the verb but nothing explicit about context or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linear_team_membership_createC
Add a member to a team.
| Name | Required | Description | Default |
|---|---|---|---|
| variables | Yes | The membership to create. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, so the agent knows this mutates state in an external system. The description adds nothing beyond that: no idempotency behavior, no handling of the optional owner flag, and no note on duplicate-membership errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with zero waste, but it is under-specified rather than lean. Brevity here costs information an agent needs for a mutation call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with only a readOnlyHint/openWorldHint annotation pair and no output schema, the description should disclose permissions, duplicate handling, and the meaning of the owner flag. None of that is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with teamId, userId, id, owner, and sortOrder all documented inline, so the schema does the heavy lifting. The description adds no extra meaning about the optional owner or sortOrder fields, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add) and resource (member to a team), which is unambiguous about what the tool does. It does not differentiate from any sibling or note scope constraints, but no linear siblings exist to confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no when-to-use guidance, prerequisites, or alternatives. There is no mention of required permissions, whether the target user must already exist, or what happens if the membership already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notion_pages_createA
Create a page — as a subpage of another page, or as a row of a database by giving its data_source_id as the parent. Content comes as a markdown string Notion parses into blocks, or from a template: one or the other, never both.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The page to create. | |
| filterProperties | No | Property IDs to return on the page that comes back, instead of all of them. A page that does not have a listed property omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, establishing this as an external write. The description adds the meaningful markdown/template mutual exclusion. It does not disclose auth requirements, rate limits, or the allowAsync async-202 behavior, but with annotations carrying the safety profile a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, front-loaded with the verb and the two modes, with the exclusivity constraint phrased crisply. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex creation tool with a fully documented schema, the description covers parent selection and content sourcing adequately. It omits the async task path (allowAsync → 202) and return shape, but with no output schema and 100% schema coverage these are minor gaps, and annotations cover the write semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real value: it clarifies that `parent` takes `data_source_id` to make a database row and that template vs. markdown are mutually exclusive — beyond the schema's raw field docs. It doesn't add detail on `properties` or `filterProperties`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a page') and immediately delineates the two creation modes — subpage vs. database row — which is exactly what separates it from siblings like notion_pages_update. An agent can identify the tool's scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear conditional guidance: use a page parent for a subpage, `data_source_id` for a database row, and content comes from `markdown` OR a template, 'never both.' The mutual-exclusion rule is explicit. However, it names no sibling alternatives (e.g., update vs. create routing) and states no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notion_pages_retrieveARead-onlyIdempotent
Get a page's properties. This does not return the page's content — the blocks are read with blocks_children_list, or all at once as Markdown with pages_retrieve_markdown. A property holding more than 25 entries comes back truncated; read it in full with pages_retrieve_property_item.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | The ID of the page. | |
| filterProperties | No | Property IDs to return, instead of all of them. A page that does not have a listed property simply omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, openWorldHint), so the description is free to add the traits the annotations cannot: that properties are truncated past 25 entries and where to read the full value. It does not cover anything about rate limits or auth scope, but the truncation disclosure is a genuinely useful behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, front-loaded with the core statement of scope followed by the exclusions and the truncation caveat. Every sentence earns its place by preventing a specific misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description tells the agent what the response does and does not contain, and what to do when it comes back incomplete. For a two-parameter read tool this covers everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so pageId and filterProperties (including the omit-on-missing-property behavior) are already documented in the schema. The description adds nothing about parameter formatting or the filterProperties include-list. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a page's properties') and immediately draws the boundary against the nearby concept of page content, so an agent can distinguish it from notion_pages_update, pages_retrieve_markdown and blocks_children_list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when NOT to use it ('This does not return the page's content') and routes to the correct alternatives by name (blocks_children_list, pages_retrieve_markdown, pages_retrieve_property_item). The condition that selects the alternative (truncation over 25 entries) is given, not left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 pages_move.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The fields to change. | |
| pageId | Yes | The ID of the page. | |
| filterProperties | No | Property IDs to return on the page that comes back, instead of all of them. A page that does not have a listed property omits it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and openWorldHint=true, so the description usefully adds partial-update semantics (unnamed properties untouched, null clears a value). However, it omits the destructive `eraseContent` behavior (deletes every block on the page) and the `isArchived`/`isLocked` nuances, which matter a lot for a write tool with no annotation detail beyond the read-only flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core capability, then the partial-update rule, then the routing exclusion. Every sentence carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a large, deeply nested mutation schema with no output schema and minimal annotations, the description covers the headline operations and the move exclusion, but leaves out destructive behaviors (`eraseContent`), the template/lock fields, and the `filterProperties` return-shaping parameter. An agent can call it, but not without risking unintended destruction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters in depth. The description reinforces the properties-clearing semantics ('a value set to null is cleared'), which the schema also states, and says nothing about `filterProperties`, so it adds little beyond structured data. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) and resource (page) plus the exact facets it can change (properties, icon, cover, trash state). It also explicitly carves out what it does NOT do and names the sibling (`pages_move`) that handles it, so an agent can distinguish it from related tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear exclusion: it cannot move a page, so use `pages_move` instead. It also implies the partial-update use case by saying unnamed properties are left alone. It does not, however, contrast with `notion_pages_create` or say when a caller should prefer this over other page operations, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_chat_post_messageA
Send a message to a Slack channel, private group, or DM. Provide text for a plain message; set thread_ts to reply inside an existing thread.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | The main body text of the message. Required unless blocks or attachments are provided. Used as the fallback string for notifications when blocks are provided, so it is worth setting even then. | |
| parse | No | Change how messages are treated. Accepts 'none' or 'full'. | |
| blocks | No | A JSON-based array of structured Block Kit blocks. | |
| mrkdwn | No | Disable Slack markup parsing by setting to false. Defaults to true. | |
| channel | Yes | An encoded ID or channel name that represents a channel, private group, or IM channel to send the message to. Prefer the encoded ID (e.g. 'C123ABC456'). | |
| iconUrl | No | URL to an image to use as the icon for this message. Requires the chat:write.customize scope. | |
| metadata | No | Application-specific metadata to attach to the message. | |
| threadTs | No | Provide another message's 'ts' value to make this message a reply in that thread. Avoid using a reply's ts value; use the parent's. | |
| username | No | Set the bot's user name. Requires the chat:write.customize scope. | |
| iconEmoji | No | Emoji to use as the icon for this message, e.g. ':chart_with_upwards_trend:'. Requires the chat:write.customize scope. | |
| linkNames | No | Find and link user groups. | |
| attachments | No | A JSON-based array of structured attachments. | |
| unfurlLinks | No | Pass true to enable unfurling of primarily text-based content. | |
| unfurlMedia | No | Pass false to disable unfurling of media content. | |
| markdownText | No | Accepts message text formatted in markdown. Limit this field to 12,000 characters. Cannot be used together with blocks or text. | |
| replyBroadcast | No | Used in conjunction with thread_ts and indicates whether the reply should be made visible to everyone in the channel. Defaults to false. | |
| unfurlAppLinks | No | Pass true to enable unfurling of links to installed apps. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/external nature is covered. The description adds the threading behavior, but does not disclose required scopes, rate limits, message-size limits, or what a successful send returns — and most scope info already lives in the schema parameter descriptions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and then the two most important parameter behaviors. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no output schema, the description is thin but the schema carries full parameter documentation, so an agent can call it correctly. Missing behavioral context (rate limits, required scopes, response shape) keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 17 parameters are documented in the schema itself. The description's notes on `text` and `thread_ts` largely restate what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Send') and resource ('a message to a Slack channel, private group, or DM'), making the action and destination unambiguous. An agent can distinguish this from siblings like slack_conversations_create without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives implied usage for `text` and `thread_ts`, but there is no explicit when-to-use vs. when-not, no mention of prerequisites (e.g. chat:write scope), and no reference to alternative messaging tools such as gmail_messages_send. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slack_conversations_inviteA
Add people to a channel. With force set, Slack adds everyone it can and reports the rest alongside a success, so read the result.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Invite everyone who can be invited rather than failing the whole call on the first bad id. | |
| users | Yes | Comma-separated user IDs, up to a thousand. | |
| channel | Yes | The channel to invite people to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, openWorldHint=true), and the description adds real behavioral context beyond them: with force set, Slack invites everyone it can and reports the failures alongside a success rather than failing outright. That partial-success semantics is the kind of detail annotations cannot express. It stops short of 5 because permission requirements and rate-limit/error behavior are unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero padding, with the core action front-loaded and the force caveat second. Efficient, though the second sentence is dense and could be split for scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description correctly warns that partial failures are reported in the response and tells the agent to inspect the result. Annotations carry the safety profile. The main gap is that it never states permission requirements or what a failure response looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters (channel, users, force) are already documented in the schema. The description restates the force behavior and adds the nuance that partial results are reported 'alongside a success,' which slightly enriches the schema's wording but does not cover anything the schema omits. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add people to a channel'), which is unambiguous and distinct from sibling slack_chat_post_message. However, it does not name or contrast any alternative tool, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this versus alternatives, nor any prerequisites (e.g. bot must be in the channel, needs channel-management scope). The only usage-adjacent statement is 'read the result,' which is a hint, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query to execute. | |
| topic | No | Search category. The server applies `general` when this is absent. `news` automatically enables `include_published_date`. | |
| country | No | Boost results from a country using Tavily's lowercase English country name (for example `united states`). Available only when `topic` is `general`. | |
| endDate | No | Return results before this date (`YYYY-MM-DD`). | |
| language | No | Boost or filter results by language — an ISO 639-1 code (for example `en`, `fr`, `zh-cn`) or English language name (for example `english`, `french`). | |
| startDate | No | Return results after this date (`YYYY-MM-DD`). | |
| timeRange | No | Filter by publish or last-updated date window. | |
| exactMatch | No | Return only results containing the exact quoted phrase(s) in the query. | |
| maxResults | No | Maximum search results to return. The server applies 10 when this is absent. | |
| safeSearch | No | Filter adult or unsafe content. Not supported when `search_depth` is `fast` or `ultra-fast`. | |
| searchDepth | No | Latency/relevance tradeoff. The server applies `basic` when this is absent. `advanced` costs 2 credits; `basic`, `fast` and `ultra-fast` cost 1 credit. | |
| includeUsage | No | Include credit usage in the response. | |
| includeAnswer | No | Include an LLM-generated answer. `true` or `basic` returns a quick answer; `advanced` returns a detailed answer. The server applies `false` when this is absent. | |
| includeImages | No | Include query-related images and per-result `images`. | |
| autoParameters | No | Let Tavily configure parameters from the query. Explicit values override auto-selected ones. `include_answer`, `include_raw_content` and `max_results` must always be set manually when using this. | |
| excludeDomains | No | Domains to exclude (max 150). | |
| includeDomains | No | Domains to include (max 300). | |
| includeFavicon | No | Include a favicon URL per result. | |
| chunksPerSource | No | Maximum relevant chunks per source in each result's `content`. The server applies 3 when this is absent. Available only when `search_depth` is `advanced`, `basic` or `fast`. Each chunk is at most 500 characters and joined with `[...]`. | |
| filterByLanguage | No | Strictly filter out non-matching languages. Requires `language`. | |
| includeRawContent | No | Include cleaned page content per result. `true` or `markdown` returns markdown; `text` returns plain text and may increase latency. The server applies `false` when this is absent. | |
| includeDomainsMode | No | How `include_domains` is applied. Requires `include_domains` to be set. | |
| includePublishedDate | No | Include `published_date` on each result. Beta feature. Automatically enabled when `topic` is `news`. | |
| filterByPublishedDate | No | Remove results outside the date window or with no detectable date. Also enables `include_published_date`. | |
| includeImageDescriptions | No | Add descriptive text per image when `include_images` is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true, which is an unusual pairing for a read-only search and is left unexplained. The description adds a config recommendation (search_depth advanced, chunks_per_source 3) but doesn't clarify the credit costs or why a read-only operation isn't marked read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it does, when to use it, and an actionable configuration tip. Front-loaded and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a large but fully documented 25-parameter schema with no output schema, the description covers the essential purpose, usage trigger, and a key tuning recommendation. It's adequate, though the odd readOnlyHint=false on a search tool could have been addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 25 parameters is already documented in the schema. The description names two parameters and their preferred values without adding semantics beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Execute a real-time web search') and scopes it ('optimized for AI agents'). It distinguishes itself from tavily_research_create by being a real-time search vs. a research task, though it never explicitly names that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage trigger: 'Use when sources are unknown or current web context is needed.' This tells the agent when to reach for it over knowledge-only answers, though it doesn't name alternatives like firecrawl_scrape or tavily_research_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
29 tool updates
v0.1.0- First observed
connect - First observed
connection_status - First observed
firecrawl_scrape - First observed
gcalendar_events_insert - First observed
gcalendar_events_list - First observed
gdocs_documents_batch_update - First observed
gdocs_documents_create - First observed
gdrive_files_copy - First observed
gdrive_files_create - First observed
gdrive_permissions_create - First observed
gforms_forms_create - First observed
gforms_forms_responses_list - First observed
github_repos_list_languages - First observed
github_search_commits - First observed
github_search_repositories - First observed
gmail_drafts_create - First observed
gmail_messages_attachments_get - First observed
gmail_messages_send - First observed
gmail_threads_list - First observed
granola_notes_get - First observed
gsheets_spreadsheets_values_append - First observed
gsheets_spreadsheets_values_get - First observed
linear_team_membership_create - First observed
notion_pages_create - First observed
notion_pages_retrieve - First observed
notion_pages_update - First observed
slack_chat_post_message - First observed
slack_conversations_invite - First observed
tavily_search
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.
Maintenance
Related MCP Connectors
Aya, Talpy's AI recruiter, in your assistant. Read jobs, candidates and evidence-backed interview scores; with write access, create jobs and send candidates to Aya's interview by WhatsApp or web link, in English, Spanish, German, French and Portuguese. See your plan and upgrade link. Hiring decisions stay human.
Score resumes, screen candidates by phone, and check references from your AI assistant.
Hire real humans for tasks agents can't do alone. 36 tools for the full hiring lifecycle.
Search Recruitee candidates, jobs, pipelines and interviews, and add notes, tags and tasks.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects Claude to the Ashby ATS to manage the hiring pipeline through natural conversation. It enables users to browse jobs, manage candidate profiles, track applications, and coordinate interview stages.245MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.-
- FlicenseNot gradedqualityCmaintenanceEnables Claude to securely search, read, and update your ATS data — candidates, mandates, pipelines, tasks, and interviews — through natural language, with configurable write permissions and confirmation for actions like scheduling and emailing.-
- AlicenseAqualityDmaintenanceEnables multi-turn recruiting workflows by exposing tools to search jobs and candidates, fetch details, score matches, and retrieve policy, with guardrails against prompt injection and PII leakage.6MIT