Slashy connects to the user's live email and calendar. Real mail sends and real events change, so read before you write and do not send or delete without explicit user intent.
Before using these tools, read the skill:
- skill://slashy-email/SKILL.md — Operate the user's real email, calendar, checklist tasks, reminders, meeting notes, Zoho CRM, and saved content through Slashy.
Discoverability
0/6 passed0 of 6 passed0/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
No matching mcp.json manifest or MCP Server Card was found at the checked URLs.
How to fix: For ChatGPT submission, set one exact HTTPS origin such as "https://app.example.com" on every view via _meta.ui.domain (or openai/widgetDomain). Paths are not valid and all views in one app must share the origin.
How to fix: Use a ui:// URI and text/html;profile=mcp-app. For mcp-use v1, use widgetMetadata.metadata.widgetDescription; for v2, use the bound tool's view.description. The current description check reads _meta.ui.widgetDescription or _meta["openai/widgetDescription"] on resource contents or linked tools, not resource.description. Consequently, v2 view.description alone may leave this warning: report the checker compatibility gap instead of adding unsupported v1 fields or claiming the warning is fixed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
Create, update, or delete an email draft. This operation does not send mail.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inbox_email
The email address of the inbox to send from (e.g., '[email protected]').
Clear enough to supply this argument.
draft_id
Existing draft identifier for an update; omitted values create a new draft.
Clear enough to supply this argument.
to
Complete To recipient list. An update replaces the existing list; omission leaves it unchanged. New drafts require a recipient in To, Cc, or Bcc.
Clear enough to supply this argument.
subject
Subject line; required for new drafts and optional for updates.
Clear enough to supply this argument.
body_blocks
Ordered email body paragraphs. Inline HTML and list markup are supported; block HTML is rendered by Slashy.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cc
Complete Cc recipient list. On an update, this replaces the existing Cc list; omission leaves it unchanged.
Clear enough to supply this argument.
bcc
Optional: the COMPLETE list of BCC recipient email addresses. On update this REPLACES the existing Bcc list (same semantics as cc — omitted addresses are removed). Omit the field entirely to leave Bcc untouched.
Clear enough to supply this argument.
cc_add
Addresses added to the draft's existing Cc list without replacing its other recipients.
Clear enough to supply this argument.
cc_remove
Addresses removed from the draft's existing Cc list; incompatible with the complete cc field.
Clear enough to supply this argument.
to_add
Convenient for adding TO recipients. Same semantics as cc_add. Cannot be combined with `to`.
Clear enough to supply this argument.
to_remove
Addresses removed from the draft's existing To list; incompatible with the complete to field.
Clear enough to supply this argument.
bcc_add
Convenient for adding BCC recipients. Same semantics as cc_add. Cannot be combined with `bcc`.
Clear enough to supply this argument.
bcc_remove
Addresses removed from the draft's existing Bcc list; incompatible with the complete bcc field.
Clear enough to supply this argument.
thread_id
Thread identifier for a reply or forward; for an update, it must match the draft's existing thread.
Clear enough to supply this argument.
in_reply_to
Optional RFC Message-ID header of the message being answered; otherwise the latest non-draft message is selected.
Clear enough to supply this argument.
forward_from_id
Identifier of the message being forwarded within thread_id; its original attachments are included.
Clear enough to supply this argument.
include_signature
Override for signature inclusion; omitted values use the user's compose or reply signature settings.
Clear enough to supply this argument.
attachment_file_ids
Complete set of file identifiers to attach to this draft; replaces any existing attachment set.
Clear enough to supply this argument.
clear_attachments
Optional: remove every attachment from the draft. The only way to reach an empty attachment set. Cannot be combined with attachment_file_ids.
Clear enough to supply this argument.
offered_times › items › date_time
Proposed slot in the user's timezone, consistent with the timezone field.
Clear enough to supply this argument.
offered_times › items › timezone
IANA timezone of the user for the proposed slot, such as America/Los_Angeles.
Clear enough to supply this argument.
offered_times › items › display_text
How the time appears in the draft text. May include the recipient's local time for clarity, e.g. 'Tue Mar 21 at 2pm PT (10pm London)'.
Clear enough to supply this argument.
override_calendar_check
Optional: Set true to allow saving a draft even when offered_times conflict with calendar.
Clear enough to supply this argument.
delete
Optional: Set to true with draft_id to delete the draft. No other fields needed besides inbox_email and draft_id.
Clear enough to supply this argument.
from_alias
Verified send-as alias for this inbox; omitted values use the inbox's default address.
Clear enough to supply this argument.
from_alias_name
Display name for the send-as alias; omitted values use the alias's configured display name.
Clear enough to supply this argument.
body
Legacy raw HTML email body. body_blocks provides structured paragraph rendering.
Clear enough to supply this argument.
base_version
Optional reviewed draft version; a changed version yields a version_conflict response.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "draft_email",
"description": "Create, update, or delete an email draft. This operation does not send mail.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email"
],
"properties": {
"cc": {
"type": "array",
"items": {
"type": "string"
},
"description": "Complete Cc recipient list. On an update, this replaces the existing Cc list; omission leaves it unchanged."
},
"to": {
"type": "array",
"items": {
"type": "string"
},
"description": "Complete To recipient list. An update replaces the existing list; omission leaves it unchanged. New drafts require a recipient in To, Cc, or Bcc."
},
"bcc": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: the COMPLETE list of BCC recipient email addresses. On update this REPLACES the existing Bcc list (same semantics as cc — omitted addresses are removed). Omit the field entirely to leave Bcc untouched."
},
"body": {
"type": "string",
"description": "Legacy raw HTML email body. body_blocks provides structured paragraph rendering."
},
"cc_add": {
"type": "array",
"items": {
"type": "string"
},
"description": "Addresses added to the draft's existing Cc list without replacing its other recipients."
},
"delete": {
"type": "boolean",
"description": "Optional: Set to true with draft_id to delete the draft. No other fields needed besides inbox_email and draft_id."
},
"to_add": {
"type": "array",
"items": {
"type": "string"
},
"description": "Convenient for adding TO recipients. Same semantics as cc_add. Cannot be combined with `to`."
},
"bcc_add": {
"type": "array",
"items": {
"type": "string"
},
"description": "Convenient for adding BCC recipients. Same semantics as cc_add. Cannot be combined with `bcc`."
},
"subject": {
"type": "string",
"description": "Subject line; required for new drafts and optional for updates."
},
"draft_id": {
"type": "string",
"description": "Existing draft identifier for an update; omitted values create a new draft."
},
"cc_remove": {
"type": "array",
"items": {
"type": "string"
},
"description": "Addresses removed from the draft's existing Cc list; incompatible with the complete cc field."
},
"thread_id": {
"type": "string",
"description": "Thread identifier for a reply or forward; for an update, it must match the draft's existing thread."
},
"to_remove": {
"type": "array",
"items": {
"type": "string"
},
"description": "Addresses removed from the draft's existing To list; incompatible with the complete to field."
},
"bcc_remove": {
"type": "array",
"items": {
"type": "string"
},
"description": "Addresses removed from the draft's existing Bcc list; incompatible with the complete bcc field."
},
"from_alias": {
"type": "string",
"description": "Verified send-as alias for this inbox; omitted values use the inbox's default address."
},
"body_blocks": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Ordered email body paragraphs. Inline HTML and list markup are supported; block HTML is rendered by Slashy."
},
"in_reply_to": {
"type": "string",
"description": "Optional RFC Message-ID header of the message being answered; otherwise the latest non-draft message is selected."
},
"inbox_email": {
"type": "string",
"description": "The email address of the inbox to send from (e.g., '[email protected]')."
},
"base_version": {
"type": "string",
"description": "Optional reviewed draft version; a changed version yields a version_conflict response."
},
"offered_times": {
"type": "array",
"items": {
"type": "object",
"required": [
"date_time",
"timezone",
"display_text"
],
"properties": {
"timezone": {
"type": "string",
"description": "IANA timezone of the user for the proposed slot, such as America/Los_Angeles."
},
"date_time": {
"type": "string",
"description": "Proposed slot in the user's timezone, consistent with the timezone field."
},
"display_text": {
"type": "string",
"description": "How the time appears in the draft text. May include the recipient's local time for clarity, e.g. 'Tue Mar 21 at 2pm PT (10pm London)'."
}
},
"additionalProperties": false
},
"description": "Proposed meeting times in the user's timezone for calendar availability validation."
},
"forward_from_id": {
"type": "string",
"description": "Identifier of the message being forwarded within thread_id; its original attachments are included."
},
"from_alias_name": {
"type": "string",
"description": "Display name for the send-as alias; omitted values use the alias's configured display name."
},
"clear_attachments": {
"type": "boolean",
"description": "Optional: remove every attachment from the draft. The only way to reach an empty attachment set. Cannot be combined with attachment_file_ids."
},
"include_signature": {
"type": "boolean",
"description": "Override for signature inclusion; omitted values use the user's compose or reply signature settings."
},
"attachment_file_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Complete set of file identifiers to attach to this draft; replaces any existing attachment set."
},
"override_calendar_check": {
"type": "boolean",
"description": "Optional: Set true to allow saving a draft even when offered_times conflict with calendar."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Draft email",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send_email",
"description": "Send an existing draft immediately or schedule its delivery for a specified time.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email",
"draft_id"
],
"properties": {
"draft_id": {
"type": "string",
"description": "The draft or scheduled email ID to send."
},
"inbox_email": {
"type": "string",
"description": "The email address of the inbox to send from (e.g., '[email protected]')."
},
"base_version": {
"type": "string",
"description": "Optional reviewed draft version; a changed version yields a version_conflict response."
},
"scheduled_at": {
"type": "string",
"description": "Scheduled delivery time as ISO 8601 with a UTC offset, at least five minutes in the future; omitted values send immediately."
},
"send_condition": {
"enum": [
"if_no_reply",
"regardless"
],
"type": "string",
"description": "Optional conditional delivery rule for a scheduled send, such as if_no_reply."
},
"confirm_send_without_attachments": {
"type": "boolean",
"description": "True only after an attachment-free send was refused and the user approved sending without attachments."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Send email",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Organize an email thread: archive, trash, mark read, star, report spam, set its category or follow-up status, or combine these changes. The unsubscribe action also contacts the sender's unsubscribe endpoint when available, blocks future mail from that sender, and archives that sender's existing mail.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Identifier of the entire email conversation to modify.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
action
One listed mailbox action. Unsubscribe affects the sender across threads: it may contact their unsubscribe endpoint, blocks future messages, and archives existing mail from them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
importance_category
Exact name of an active Slashy importance category, or 'other'.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
todo
Optional: Set todo status - 'reply' (needs response), 'followup' (waiting for reply), 'clear' (remove todo), or 'dismissed' (user reviewed and chose not to act - prevents daily digest from resurfacing this thread).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
todo_summary
Optional: Short description of what needs to be done (e.g., 'Respond about pricing'). Used with todo='reply' or todo='followup'.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "label_email",
"description": "Organize an email thread: archive, trash, mark read, star, report spam, set its category or follow-up status, or combine these changes. The unsubscribe action also contacts the sender's unsubscribe endpoint when available, blocks future mail from that sender, and archives that sender's existing mail.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email",
"thread_id"
],
"properties": {
"todo": {
"enum": [
"reply",
"followup",
"clear",
"dismissed"
],
"type": "string",
"description": "Optional: Set todo status - 'reply' (needs response), 'followup' (waiting for reply), 'clear' (remove todo), or 'dismissed' (user reviewed and chose not to act - prevents daily digest from resurfacing this thread)."
},
"action": {
"enum": [
"archive",
"trash",
"unarchive",
"untrash",
"mark_read",
"mark_unread",
"star",
"unstar",
"spam",
"unspam",
"unsubscribe"
],
"type": "string",
"description": "One listed mailbox action. Unsubscribe affects the sender across threads: it may contact their unsubscribe endpoint, blocks future messages, and archives existing mail from them."
},
"thread_id": {
"type": "string",
"description": "Identifier of the entire email conversation to modify."
},
"inbox_email": {
"type": "string",
"description": "The email address of the inbox (e.g., '[email protected]')."
},
"todo_summary": {
"type": "string",
"description": "Optional: Short description of what needs to be done (e.g., 'Respond about pricing'). Used with todo='reply' or todo='followup'."
},
"importance_category": {
"type": "string",
"description": "Exact name of an active Slashy importance category, or 'other'."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Label email",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description60/100
Create a Slashy email category with a description and optional training examples.
Describe the concrete operation and its scope instead of restating the tool name.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Short label name as it will appear in the sidebar (e.g. 'Hiring', 'Customer Feedback'). Max 50 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
The rule the AI applies to every future email to decide whether it belongs in this label. Describe the category itself, including what does NOT belong.
Clear enough to supply this argument.
matched_thread_ids
Identifiers of 3–8 matching threads, labeled immediately and used as positive category examples.
Resolve the mismatch between this description and its schema constraints.
unmatched_thread_ids
Identifiers of near-miss threads used as negative category examples; the threads are not relabeled.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › items › operator
Field to match on.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › items › value
Substring to match (e.g. 'greenhouse.io', 'invoice').
Clear enough to supply this argument.
auto_archive
Whether matching threads leave the inbox when categorized; default false.
Clear enough to supply this argument.
triggers_notification
Push-notify the user for new mail in this label. Default true; set false for low-signal labels.
Clear enough to supply this argument.
backfill_days
Number of past days of existing mail to categorize; zero limits categorization to new mail.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_label",
"description": "Create a Slashy email category with a description and optional training examples.",
"inputSchema": {
"type": "object",
"required": [
"name",
"description"
],
"properties": {
"name": {
"type": "string",
"maxLength": 50,
"description": "Short label name as it will appear in the sidebar (e.g. 'Hiring', 'Customer Feedback'). Max 50 characters."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"operator",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "Substring to match (e.g. 'greenhouse.io', 'invoice')."
},
"operator": {
"enum": [
"from",
"to",
"subject"
],
"type": "string",
"description": "Field to match on."
}
}
},
"description": "Eligibility filters limiting the category to matching senders, recipients, or subjects."
},
"description": {
"type": "string",
"description": "The rule the AI applies to every future email to decide whether it belongs in this label. Describe the category itself, including what does NOT belong."
},
"auto_archive": {
"type": "boolean",
"description": "Whether matching threads leave the inbox when categorized; default false."
},
"backfill_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Number of past days of existing mail to categorize; zero limits categorization to new mail."
},
"matched_thread_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 25,
"description": "Identifiers of 3–8 matching threads, labeled immediately and used as positive category examples."
},
"unmatched_thread_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 25,
"description": "Identifiers of near-miss threads used as negative category examples; the threads are not relabeled."
},
"triggers_notification": {
"type": "boolean",
"description": "Push-notify the user for new mail in this label. Default true; set false for low-signal labels."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create email label",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description63/100
Change an existing Slashy email category and its training examples or filters.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs73/100
9 of 11 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
name
Current name of the existing Slashy category, case-insensitive.
Clear enough to supply this argument.
new_name
Rename the label to this. Cascades to every thread already filed under it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Replace the classification rule. Describe the category, including what does NOT belong.
Clear enough to supply this argument.
add_matched_thread_ids
thread_ids to ADD as positive examples. These also get labeled immediately.
Clear enough to supply this argument.
add_unmatched_thread_ids
Additional near-miss thread identifiers used as negative category examples.
Clear enough to supply this argument.
add_filters › items › operator
Not provided
Missing description. Explain what this value means and how to supply it.
add_filters › items › value
Not provided
Missing description. Explain what this value means and how to supply it.
enabled
false switches the label off (reversible 'delete' — threads return to Other). true switches it back on.
Clear enough to supply this argument.
auto_archive
Whether the category's threads leave the inbox; turning it on also archives those already in the user's own inboxes (not unopened returned reminders), in the background.
Explain what happens when this optional value is omitted.
triggers_notification
Toggle push notifications for this label.
Explain what happens when this optional value is omitted.
backfill_days
Number of past days of existing mail to re-categorize using the updated rule.
Explain what happens when this optional value is omitted.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_label",
"description": "Change an existing Slashy email category and its training examples or filters.",
"inputSchema": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Current name of the existing Slashy category, case-insensitive."
},
"enabled": {
"type": "boolean",
"description": "false switches the label off (reversible 'delete' — threads return to Other). true switches it back on."
},
"new_name": {
"type": "string",
"maxLength": 50,
"description": "Rename the label to this. Cascades to every thread already filed under it."
},
"add_filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"operator",
"value"
],
"properties": {
"value": {
"type": "string"
},
"operator": {
"enum": [
"from",
"to",
"subject"
],
"type": "string"
}
}
},
"description": "Additional eligibility filters; alternatives use OR and existing filters remain in place."
},
"description": {
"type": "string",
"description": "Replace the classification rule. Describe the category, including what does NOT belong."
},
"auto_archive": {
"type": "boolean",
"description": "Whether the category's threads leave the inbox; turning it on also archives those already in the user's own inboxes (not unopened returned reminders), in the background."
},
"backfill_days": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Number of past days of existing mail to re-categorize using the updated rule."
},
"triggers_notification": {
"type": "boolean",
"description": "Toggle push notifications for this label."
},
"add_matched_thread_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 25,
"description": "thread_ids to ADD as positive examples. These also get labeled immediately."
},
"add_unmatched_thread_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 25,
"description": "Additional near-miss thread identifiers used as negative category examples."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update email label",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "snooze_email",
"description": "Set or change the time when an email thread resurfaces in the inbox.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email",
"email_id"
],
"properties": {
"someday": {
"type": "boolean",
"description": "Optional: Set to true to mark as a 'someday' reminder (no specific time)."
},
"email_id": {
"type": "string",
"description": "The email ID to set reminder on."
},
"inbox_email": {
"type": "string",
"description": "The email address of the inbox (e.g., '[email protected]')."
},
"delay_minutes": {
"type": "integer",
"maximum": 43200,
"minimum": 1,
"description": "Optional: Delay in minutes from now (e.g., 120 for 2 hours)."
},
"remind_at_iso": {
"type": "string",
"description": "Optional: Absolute reminder time in ISO 8601 format (e.g., '2025-10-30T14:00:00Z')."
},
"reminder_type": {
"enum": [
"if_no_reply",
"regardless",
"if_not_done_or_replied"
],
"type": "string",
"description": "Reminder condition: if_no_reply, regardless, or if_not_done_or_replied."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Snooze email",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
timezone
Optional IANA timezone for interpreting start_time/end_time (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). Only needed when the user specifies a timezone different from their own. If omitted, times are interpreted in the user's local timezone.
Clear enough to supply this argument.
start_timezone
IANA timezone for start_time; paired with end_timezone when event endpoints have different timezones.
Clear enough to supply this argument.
end_timezone
IANA timezone for end_time; paired with start_timezone when event endpoints have different timezones.
Clear enough to supply this argument.
datetime_human
Original natural-language date and time for cross-validation, including any stated day of week.
Clear enough to supply this argument.
notes
Private notes for this event (markdown). These are Slashy-only notes, not synced to Google Calendar. They often contain meeting prep notes. Each recurring event instance has its own notes.
Clear enough to supply this argument.
all_day
True for an all-day event (the calendar's 'All day' checkbox). start_time/end_time are then dates (YYYY-MM-DD); end_time is the LAST day of the event, inclusive.
Clear enough to supply this argument.
transparency
Whether the event blocks time: 'opaque' shows the user as Busy, 'transparent' shows them as Free. Omit unless the user asks — a new timed event is Busy, and an all-day event created in Google Calendar is Free.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_event",
"description": "Create a calendar event with the specified time, attendees, and conferencing details.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email",
"title",
"start_time",
"datetime_human"
],
"properties": {
"color": {
"enum": [
"lavender",
"sage",
"grape",
"pink",
"yellow",
"orange",
"blue",
"gray",
"indigo",
"green",
"red"
],
"type": "string",
"description": "Event color. Options: lavender (light purple), sage (light green), grape (dark purple), pink/coral, yellow, orange, blue/teal, gray, indigo (dark blue), green (dark green), red."
},
"notes": {
"type": "string",
"description": "Private notes for this event (markdown). These are Slashy-only notes, not synced to Google Calendar. They often contain meeting prep notes. Each recurring event instance has its own notes."
},
"title": {
"type": "string",
"description": "Event title."
},
"all_day": {
"type": "boolean",
"description": "True for an all-day event (the calendar's 'All day' checkbox). start_time/end_time are then dates (YYYY-MM-DD); end_time is the LAST day of the event, inclusive."
},
"end_time": {
"type": "string",
"description": "Event end time in ISO 8601 format; omitted values use the default 30-minute duration."
},
"location": {
"type": "string",
"description": "Event location."
},
"timezone": {
"type": "string",
"description": "Optional IANA timezone for interpreting start_time/end_time (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). Only needed when the user specifies a timezone different from their own. If omitted, times are interpreted in the user's local timezone."
},
"attendees": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string",
"description": "Email address (required attendee)"
},
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string"
},
"optional": {
"type": "boolean"
}
}
}
]
},
"description": "Attendees: email strings (required by default) or objects with {\"email\": \"...\", \"optional\": true} for optional attendees."
},
"recurrence": {
"type": "array",
"items": {
"type": "string"
},
"description": "RRULE strings per RFC 5545 (e.g., ['RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=12'])."
},
"start_time": {
"type": "string",
"description": "Event start time in ISO 8601 format, interpreted in the specified timezone."
},
"calendar_id": {
"type": "string",
"default": "primary",
"description": "Calendar ID (default: primary)."
},
"description": {
"type": "string",
"description": "Event description, with Markdown converted to supported calendar formatting."
},
"inbox_email": {
"type": "string",
"description": "Email address of the calendar inbox."
},
"conferencing": {
"type": "string",
"description": "Conference option: teams, gmeet, zoom, a direct URL, a custom link identifier, none, or the calendar default when omitted."
},
"end_timezone": {
"type": "string",
"description": "IANA timezone for end_time; paired with start_timezone when event endpoints have different timezones."
},
"transparency": {
"enum": [
"opaque",
"transparent"
],
"type": "string",
"description": "Whether the event blocks time: 'opaque' shows the user as Busy, 'transparent' shows them as Free. Omit unless the user asks — a new timed event is Busy, and an all-day event created in Google Calendar is Free."
},
"datetime_human": {
"type": "string",
"description": "Original natural-language date and time for cross-validation, including any stated day of week."
},
"start_timezone": {
"type": "string",
"description": "IANA timezone for start_time; paired with end_timezone when event endpoints have different timezones."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create calendar event",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Optional IANA timezone for interpreting start_time/end_time (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). Only needed when the user specifies a timezone different from their own. If omitted, times are interpreted in the user's local timezone.
Clear enough to supply this argument.
start_timezone
IANA timezone for start_time; paired with end_timezone when event endpoints have different timezones.
Clear enough to supply this argument.
end_timezone
IANA timezone for end_time; paired with start_timezone when event endpoints have different timezones.
Clear enough to supply this argument.
datetime_human
Original natural-language date and time for cross-validation, including any stated day of week.
Clear enough to supply this argument.
notes
Private notes for this event (markdown). These are Slashy-only notes, not synced to Google Calendar. They often contain meeting prep notes. Each recurring event instance has its own notes.
Clear enough to supply this argument.
transparency
Whether the event blocks time: 'opaque' shows the user as Busy, 'transparent' shows them as Free. Omit unless the user asks — a new timed event is Busy, and an all-day event created in Google Calendar is Free.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_event",
"description": "Change an existing calendar event, including its timing, details, or RSVP where permitted.",
"inputSchema": {
"type": "object",
"required": [
"inbox_email",
"event_id"
],
"properties": {
"color": {
"enum": [
"lavender",
"sage",
"grape",
"pink",
"yellow",
"orange",
"blue",
"gray",
"indigo",
"green",
"red"
],
"type": "string",
"description": "Event color. Options: lavender (light purple), sage (light green), grape (dark purple), pink/coral, yellow, orange, blue/teal, gray, indigo (dark blue), green (dark green), red."
},
"notes": {
"type": "string",
"description": "Private notes for this event (markdown). These are Slashy-only notes, not synced to Google Calendar. They often contain meeting prep notes. Each recurring event instance has its own notes."
},
"title": {
"type": "string",
"description": "New title."
},
"end_time": {
"type": "string",
"description": "New event end time in ISO 8601 format, interpreted in the specified timezone."
},
"event_id": {
"type": "string",
"description": "Exact identifier of the existing event being changed."
},
"location": {
"type": "string",
"description": "New location."
},
"timezone": {
"type": "string",
"description": "Optional IANA timezone for interpreting start_time/end_time (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). Only needed when the user specifies a timezone different from their own. If omitted, times are interpreted in the user's local timezone."
},
"attendees": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string",
"description": "Email address (required attendee)"
},
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string"
},
"optional": {
"type": "boolean"
}
}
}
]
},
"description": "Complete replacement attendee list; each entry is an email address or an object with email and optional fields."
},
"recurrence": {
"type": "array",
"items": {
"type": "string"
},
"description": "Custom RRULE strings."
},
"start_time": {
"type": "string",
"description": "New event start time in ISO 8601 format, interpreted in the specified timezone."
},
"calendar_id": {
"type": "string",
"default": "primary",
"description": "Calendar ID (default: primary)."
},
"description": {
"type": "string",
"description": "New event description, with Markdown converted to supported calendar formatting."
},
"inbox_email": {
"type": "string",
"description": "Address of the connected calendar inbox containing the event."
},
"rsvp_status": {
"enum": [
"accepted",
"declined",
"tentative"
],
"type": "string",
"description": "RSVP status for the event: accepted, declined, or tentative."
},
"conferencing": {
"type": "string",
"description": "Conference option: teams, gmeet, zoom, a direct URL, a custom link identifier, or none to remove conferencing where supported."
},
"end_timezone": {
"type": "string",
"description": "IANA timezone for end_time; paired with start_timezone when event endpoints have different timezones."
},
"transparency": {
"enum": [
"opaque",
"transparent"
],
"type": "string",
"description": "Whether the event blocks time: 'opaque' shows the user as Busy, 'transparent' shows them as Free. Omit unless the user asks — a new timed event is Busy, and an all-day event created in Google Calendar is Free."
},
"update_scope": {
"enum": [
"this",
"all",
"following"
],
"type": "string",
"default": "this",
"description": "For recurring events: update this instance, all instances, or this and following."
},
"add_attendees": {
"type": "array",
"items": {
"oneOf": [
{
"type": "string",
"description": "Email address (required attendee)"
},
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string"
},
"optional": {
"type": "boolean"
}
}
}
]
},
"description": "Attendees added to the event; each entry is an email address or an object with email and optional fields."
},
"datetime_human": {
"type": "string",
"description": "Original natural-language date and time for cross-validation, including any stated day of week."
},
"start_timezone": {
"type": "string",
"description": "IANA timezone for start_time; paired with end_timezone when event endpoints have different timezones."
},
"remove_attendees": {
"type": "array",
"items": {
"type": "string"
},
"description": "Remove these attendees."
},
"remove_recurrence": {
"type": "boolean",
"description": "Remove recurrence (convert to single event)."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update calendar event",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
List the user's checklist tasks across included Slashy, Google Tasks, Todoist, ClickUp, and Clio lists, or read one task by ID. Excludes reminders and email follow-up flags.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
task_id
Optional exact task ID for one full task; do not combine with filters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Defaults to open.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
inbox_email
Optional owned inbox to filter email-linked tasks.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
thread_id
Optional exact thread ID; requires inbox_email.
Explain the meaning of this value, not just its name.
limit
Page size; default 25.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
next_cursor from the previous page.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Create or update a checklist task in its configured or selected source. Updates can complete or reopen a task. A create requires idempotency_key; reuse it on retries. The result reports local save and provider sync separately.
The description explains the capability, when to use it, and what to expect.
Inputs77/100
11 of 13 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
operation
Not provided
Missing description. Explain what this value means and how to supply it.
task_id
Exact existing task ID for update; omit on create.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
Required on create unless an email thread supplies its subject; blank titles are invalid.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notes
Not provided
Missing description. Explain what this value means and how to supply it.
due_date
YYYY-MM-DD in the user's local calendar; no time of day.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
priority
Stored in Slashy; mirrored to Todoist and ClickUp (ClickUp urgent reads as high). Google Tasks has no priority.
Clear enough to supply this argument.
status
On update, completed marks done and open reopens. Defaults to open on create.
Clear enough to supply this argument.
clear_fields
Fields to clear on update; cannot also supply a value for the same field.
Clear enough to supply this argument.
inbox_email
Create only: owned inbox of the email thread. Include with thread_id.
Clear enough to supply this argument.
thread_id
Create only: exact email thread ID; include its owned inbox address.
Clear enough to supply this argument.
list_id
Create only: exact list ID from the connected task source, such as clio:731 for a Clio matter.
Clear enough to supply this argument.
expected_destination
Optional safety check when the user names a provider (Google Tasks, Todoist, ClickUp, Clio, Notion, or Slashy). Never selects or switches destination.
Clear enough to supply this argument.
idempotency_key
Required for create: a stable client-generated key for this task. Reuse it when retrying the same create request.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "save_task",
"description": "Create or update a checklist task in its configured or selected source. Updates can complete or reopen a task. A create requires idempotency_key; reuse it on retries. The result reports local save and provider sync separately.",
"inputSchema": {
"type": "object",
"required": [
"operation"
],
"properties": {
"notes": {
"type": "string",
"maxLength": 8192
},
"title": {
"type": "string",
"maxLength": 1024,
"description": "Required on create unless an email thread supplies its subject; blank titles are invalid."
},
"status": {
"enum": [
"open",
"completed"
],
"type": "string",
"description": "On update, completed marks done and open reopens. Defaults to open on create."
},
"list_id": {
"type": "string",
"maxLength": 600,
"description": "Create only: exact list ID from the connected task source, such as clio:731 for a Clio matter."
},
"task_id": {
"type": "string",
"format": "uuid",
"description": "Exact existing task ID for update; omit on create."
},
"due_date": {
"type": "string",
"format": "date",
"description": "YYYY-MM-DD in the user's local calendar; no time of day."
},
"priority": {
"enum": [
"high",
"medium",
"low"
],
"type": "string",
"description": "Stored in Slashy; mirrored to Todoist and ClickUp (ClickUp urgent reads as high). Google Tasks has no priority."
},
"operation": {
"enum": [
"create",
"update"
],
"type": "string"
},
"thread_id": {
"type": "string",
"maxLength": 512,
"description": "Create only: exact email thread ID; include its owned inbox address."
},
"inbox_email": {
"type": "string",
"description": "Create only: owned inbox of the email thread. Include with thread_id."
},
"clear_fields": {
"type": "array",
"items": {
"enum": [
"notes",
"due_date",
"priority"
],
"type": "string"
},
"description": "Fields to clear on update; cannot also supply a value for the same field."
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Required for create: a stable client-generated key for this task. Reuse it when retrying the same create request."
},
"expected_destination": {
"enum": [
"slashy",
"google_tasks",
"todoist",
"clickup",
"clio",
"notion"
],
"type": "string",
"description": "Optional safety check when the user names a provider (Google Tasks, Todoist, ClickUp, Clio, Notion, or Slashy). Never selects or switches destination."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Save task",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "web_search",
"description": "Search the public web for current information and return sourced results.",
"inputSchema": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "The search query. Be specific and include relevant keywords for better results."
},
"search_after_date": {
"type": "string",
"description": "Optional: Only return content published after this date. Format: MM/DD/YYYY (e.g., '01/15/2025') or relative: 'yesterday', 'last_week', 'last_month'."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search the web",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description73/100
Look up a contact's professional background using cached data or enrichment providers. A refreshed profile may be saved in Slashy.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs91/100
Remove repeated schema validation from descriptions; focus on meaning and usage context.
email
Email address to research. Provide email, name, or linkedin_url.
Clear enough to supply this argument.
name
Full name of the person (e.g., 'Priscilla Russo'). Can be used alone (name-only lookup against your accessible network), or alongside email to improve enrichment quality.
Clear enough to supply this argument.
linkedin_url
LinkedIn profile URL to enrich directly (e.g., 'https://linkedin.com/in/username'). When provided, bypasses email-based LinkedIn discovery and scrapes the profile directly. Provide email, name, or linkedin_url.
Clear enough to supply this argument.
team_id
Choose a team for name-only research if you belong to multiple teams.
Clear enough to supply this argument.
previous_company
Optional former employer. A move is reported only with past-job and current-employer evidence; additional email addresses are unverified candidates.
Clear enough to supply this argument.
company
The person's current company, with name. When no profile is found, the tool searches the web for their LinkedIn and keeps it only if name and company match.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "research_contact",
"description": "Look up a contact's professional background using cached data or enrichment providers. A refreshed profile may be saved in Slashy.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"name": {
"type": "string",
"description": "Full name of the person (e.g., 'Priscilla Russo'). Can be used alone (name-only lookup against your accessible network), or alongside email to improve enrichment quality."
},
"email": {
"type": "string",
"description": "Email address to research. Provide email, name, or linkedin_url."
},
"company": {
"type": "string",
"maxLength": 200,
"description": "The person's current company, with name. When no profile is found, the tool searches the web for their LinkedIn and keeps it only if name and company match."
},
"team_id": {
"type": "string",
"format": "uuid",
"description": "Choose a team for name-only research if you belong to multiple teams."
},
"linkedin_url": {
"type": "string",
"description": "LinkedIn profile URL to enrich directly (e.g., 'https://linkedin.com/in/username'). When provided, bypasses email-based LinkedIn discovery and scrapes the profile directly. Provide email, name, or linkedin_url."
},
"previous_company": {
"type": "string",
"maxLength": 200,
"description": "Optional former employer. A move is reported only with past-job and current-employer evidence; additional email addresses are unverified candidates."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Research contact",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Optional: Specific focus areas or questions for the prep. Examples: 'focus on their funding history', 'what did we discuss last time?', 'I want to pitch them on our new product'
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "prep_meeting",
"description": "Prepare a meeting brief from a calendar event and available attendee context.",
"inputSchema": {
"type": "object",
"required": [
"event_id",
"inbox_email"
],
"properties": {
"event_id": {
"type": "string",
"description": "Identifier of the calendar event to prepare."
},
"inbox_email": {
"type": "string",
"description": "Email address of the inbox/calendar (e.g., '[email protected]')"
},
"instructions": {
"type": "string",
"description": "Optional: Specific focus areas or questions for the prep. Examples: 'focus on their funding history', 'what did we discuss last time?', 'I want to pitch them on our new product'"
},
"meeting_date": {
"type": "string",
"description": "Date of the same event (YYYY-MM-DD), used to find it when event_id does not match."
},
"meeting_title": {
"type": "string",
"description": "Exact title of the same event, used to catch a wrong or truncated event_id."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Prepare meeting brief",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
Create an automation that runs an agent task when an email or tracked open matches a condition. Future runs can use connected tools; the write setting controls Slashy writes.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Explain the meaning of this value, not just its name.
condition
Natural language condition for matching emails (e.g., 'emails from cooley', 'urgent emails about contracts', 'emails to @acme.com')
Clear enough to supply this argument.
action
Automation task description, including its conditions and desired actions.
Explain the meaning of this value, not just its name.
trigger_type
Type of trigger: 'email' (any email sent/received based on condition, default) or 'open' (when tracked email is opened by recipient)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first_open_only
For open triggers only: fire only on first real open per recipient (true, default) or on every open (false). Ignores email client auto-opens.
Clear enough to supply this argument.
inbox_email
Optional: Specific inbox email address. If not provided, applies to all inboxes.
Clear enough to supply this argument.
thread_id
Optional exact email thread scope. Emails from other threads are rejected before semantic matching.
Clear enough to supply this argument.
repeating
Fire every time (true, default) or just once (false). One-time triggers auto-disable after firing.
Clear enough to supply this argument.
name
Optional: User-friendly name for the automation.
Explain the meaning of this value, not just its name.
write_enabled
Whether the automation may perform write actions when it runs.
Clear enough to supply this argument.
goal_id
Optional associated goal identifier in goal:<uuid> format.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_email_trigger",
"description": "Create an automation that runs an agent task when an email or tracked open matches a condition. Future runs can use connected tools; the write setting controls Slashy writes.",
"inputSchema": {
"type": "object",
"required": [
"condition",
"action",
"write_enabled"
],
"properties": {
"name": {
"type": "string",
"description": "Optional: User-friendly name for the automation."
},
"action": {
"type": "string",
"description": "Automation task description, including its conditions and desired actions."
},
"goal_id": {
"type": "string",
"description": "Optional associated goal identifier in goal:<uuid> format."
},
"condition": {
"type": "string",
"description": "Natural language condition for matching emails (e.g., 'emails from cooley', 'urgent emails about contracts', 'emails to @acme.com')"
},
"repeating": {
"type": "boolean",
"description": "Fire every time (true, default) or just once (false). One-time triggers auto-disable after firing."
},
"thread_id": {
"type": "string",
"description": "Optional exact email thread scope. Emails from other threads are rejected before semantic matching."
},
"inbox_email": {
"type": "string",
"description": "Optional: Specific inbox email address. If not provided, applies to all inboxes."
},
"trigger_type": {
"enum": [
"email",
"open"
],
"type": "string",
"description": "Type of trigger: 'email' (any email sent/received based on condition, default) or 'open' (when tracked email is opened by recipient)"
},
"write_enabled": {
"type": "boolean",
"description": "Whether the automation may perform write actions when it runs."
},
"first_open_only": {
"type": "boolean",
"description": "For open triggers only: fire only on first real open per recipient (true, default) or on every open (false). Ignores email client auto-opens."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create email automation",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description69/100
Change an existing email automation's condition, future agent task, write setting, or enabled state.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs67/100
Explain the meaning of this value, not just its name.
trigger_id
Identifier of the email automation to update.
Clear enough to supply this argument.
condition
New condition text (optional)
Explain the meaning of this value, not just its name.
action
New action prompt (optional)
Explain the meaning of this value, not just its name.
enabled
Enable or disable the automation (optional)
Clear enough to supply this argument.
repeating
Change repeating behavior (optional)
Explain the meaning of this value, not just its name.
name
New name (optional)
Explain the meaning of this value, not just its name.
write_enabled
Enable/disable write mode (optional). True = can send emails, post to Slack channels, modify calendar, or archive. False = read-only/private user notification only. A named Slack channel post requires true.
Clear enough to supply this argument.
goal_id
Optional associated goal identifier in goal:<uuid> format.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
thread_id
Optional exact email thread scope.
Explain the meaning of this value, not just its name.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Create an automation that runs an agent task when matching calendar events change or reach the chosen time. Future runs can use connected tools; the write setting controls Slashy writes.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
condition
Natural language condition for matching events (e.g., 'investor meetings', 'external meetings', '1:1s').
Clear enough to supply this argument.
action
Automation task description, including its conditions and desired actions.
Clear enough to supply this argument.
minutes_before
Fire X minutes BEFORE event start (0-120). Mutually exclusive with other timing options.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
minutes_after
Fire X minutes AFTER event start (0-120). Mutually exclusive with other timing options.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
minutes_after_end
Fire X minutes AFTER event ends (0-120). Auto-checks Google Meet to see who attended, who didn't show, meeting duration. Best for post-meeting follow-ups and summaries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
on_event_change
Fire immediately when matching events are created, updated, or deleted. The condition can include change type words like 'new', 'cancelled', 'rescheduled' to filter by change type.
Clear enough to supply this argument.
is_meeting_check
Whether the automation uses live meeting attendance. Required with minutes_after for attendance-dependent actions.
Clear enough to supply this argument.
inbox_email
Optional: Specific inbox/calendar email. If not provided, applies to primary inbox.
Clear enough to supply this argument.
name
Optional: User-friendly name for the trigger.
Clear enough to supply this argument.
write_enabled
Whether the automation may perform write actions when it runs.
Clear enough to supply this argument.
goal_id
Optional associated goal identifier in goal:<uuid> format.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_calendar_trigger",
"description": "Create an automation that runs an agent task when matching calendar events change or reach the chosen time. Future runs can use connected tools; the write setting controls Slashy writes.",
"inputSchema": {
"type": "object",
"required": [
"condition",
"action",
"write_enabled"
],
"properties": {
"name": {
"type": "string",
"description": "Optional: User-friendly name for the trigger."
},
"action": {
"type": "string",
"description": "Automation task description, including its conditions and desired actions."
},
"goal_id": {
"type": "string",
"description": "Optional associated goal identifier in goal:<uuid> format."
},
"condition": {
"type": "string",
"description": "Natural language condition for matching events (e.g., 'investor meetings', 'external meetings', '1:1s')."
},
"inbox_email": {
"type": "string",
"description": "Optional: Specific inbox/calendar email. If not provided, applies to primary inbox."
},
"minutes_after": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Fire X minutes AFTER event start (0-120). Mutually exclusive with other timing options."
},
"write_enabled": {
"type": "boolean",
"description": "Whether the automation may perform write actions when it runs."
},
"minutes_before": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Fire X minutes BEFORE event start (0-120). Mutually exclusive with other timing options."
},
"on_event_change": {
"type": "boolean",
"description": "Fire immediately when matching events are created, updated, or deleted. The condition can include change type words like 'new', 'cancelled', 'rescheduled' to filter by change type."
},
"is_meeting_check": {
"type": "boolean",
"default": false,
"description": "Whether the automation uses live meeting attendance. Required with minutes_after for attendance-dependent actions."
},
"minutes_after_end": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Fire X minutes AFTER event ends (0-120). Auto-checks Google Meet to see who attended, who didn't show, meeting duration. Best for post-meeting follow-ups and summaries."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create calendar automation",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description70/100
Change an existing calendar automation's condition, future agent task, write setting, timing, or enabled state.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs69/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
trigger_id
UUID of the trigger to update.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
condition
New condition text.
Explain the meaning of this value, not just its name.
action
New action prompt.
Explain the meaning of this value, not just its name.
minutes_before
New timing: minutes before event start (0-120, clears other timing options).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
minutes_after
New timing: minutes after event start (0-120, clears other timing options).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
minutes_after_end
New timing: minutes after event end (0-120, clears other timing options).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
on_event_change
Fire on event create/update/delete (clears other timing options).
Clear enough to supply this argument.
is_meeting_check
Whether the automation uses live meeting attendance. Required with minutes_after for attendance-dependent actions.
Resolve the mismatch between this description and its schema constraints.
enabled
Enable or disable the trigger.
Clear enough to supply this argument.
name
New name (empty string to clear).
Clear enough to supply this argument.
write_enabled
Enable/disable write mode (optional). True = can send emails, post to Slack channels, modify calendar, or archive. False = read-only/private user notification only. A named Slack channel post requires true.
Clear enough to supply this argument.
goal_id
Optional associated goal identifier in goal:<uuid> format.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
Create or update a one-time or recurring reminder. When it fires, Slashy's agent follows the supplied reminder instructions and may use its native tools within the reminder's write setting.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reminder_text
Reminder action text; required when creating a reminder and optional when updating one.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
remind_at
One-time reminder schedule as natural language or an ISO 8601 timestamp; mutually exclusive with schedule_expression.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schedule_expression
Recurring schedule in AWS cron or rate format; mutually exclusive with remind_at.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tz
Optional IANA timezone (e.g., 'America/Los_Angeles', 'Asia/Tokyo'). Defaults to user's local time if not specified. For remind_at: only used when the time string has no timezone info. For schedule_expression: used to interpret CRON times (handles DST correctly).
Clear enough to supply this argument.
start_date
For RECURRING reminders: When to START the schedule. Natural language ('January 2nd', 'next Monday') or ISO 8601 ('2025-01-02'). Schedule won't fire until this date.
Clear enough to supply this argument.
end_date
Inclusive last date of a recurring reminder schedule.
Explain what happens when this optional value is omitted.
name
Short display name shown in the automations list.
Clear enough to supply this argument.
reminder_id
Identifier of an existing reminder to update; omitted values create a new reminder.
Clear enough to supply this argument.
thread_id
Optional linked email conversation identifier.
Explain the meaning of this value, not just its name.
write_enabled
Whether the reminder may perform write actions when it runs.
Clear enough to supply this argument.
goal_id
Optional associated goal identifier in goal:<uuid> format.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "set_reminder",
"description": "Create or update a one-time or recurring reminder. When it fires, Slashy's agent follows the supplied reminder instructions and may use its native tools within the reminder's write setting.",
"inputSchema": {
"type": "object",
"required": [
"name",
"write_enabled"
],
"properties": {
"tz": {
"type": "string",
"description": "Optional IANA timezone (e.g., 'America/Los_Angeles', 'Asia/Tokyo'). Defaults to user's local time if not specified. For remind_at: only used when the time string has no timezone info. For schedule_expression: used to interpret CRON times (handles DST correctly)."
},
"name": {
"type": "string",
"description": "Short display name shown in the automations list."
},
"goal_id": {
"type": "string",
"description": "Optional associated goal identifier in goal:<uuid> format."
},
"end_date": {
"type": "string",
"description": "Inclusive last date of a recurring reminder schedule."
},
"remind_at": {
"type": "string",
"description": "One-time reminder schedule as natural language or an ISO 8601 timestamp; mutually exclusive with schedule_expression."
},
"thread_id": {
"type": "string",
"description": "Optional linked email conversation identifier."
},
"start_date": {
"type": "string",
"description": "For RECURRING reminders: When to START the schedule. Natural language ('January 2nd', 'next Monday') or ISO 8601 ('2025-01-02'). Schedule won't fire until this date."
},
"reminder_id": {
"type": "string",
"description": "Identifier of an existing reminder to update; omitted values create a new reminder."
},
"reminder_text": {
"type": "string",
"description": "Reminder action text; required when creating a reminder and optional when updating one."
},
"write_enabled": {
"type": "boolean",
"description": "Whether the reminder may perform write actions when it runs."
},
"schedule_expression": {
"type": "string",
"description": "Recurring schedule in AWS cron or rate format; mutually exclusive with remind_at."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Set reminder",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
List the user's email, calendar, and recurring reminder automations, including their stored conditions and actions.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
query
Optional words to look for in names, conditions and actions (e.g. 'scheduling'). Only automations sharing a word with it are listed, best match first; if none does, everything is listed. Omit to list everything.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_automations",
"description": "List the user's email, calendar, and recurring reminder automations, including their stored conditions and actions.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"query": {
"type": "string",
"description": "Optional words to look for in names, conditions and actions (e.g. 'scheduling'). Only automations sharing a word with it are listed, best match first; if none does, everything is listed. Omit to list everything."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List all automations",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description64/100
Search the user's meeting notes by text, participant, date, or provider.
Describe the concrete operation and its scope instead of restating the tool name.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Free-text search across meeting titles, summaries, full transcripts, and participant names. Searches the actual words spoken, so topic queries like 'group buy deposit refundability' match content discussed in the call.
Clear enough to supply this argument.
participant
Filter by participant name, email, or domain (e.g., 'daniel', '[email protected]', 'sierra.com').
Clear enough to supply this argument.
start_date
Start date filter (ISO format YYYY-MM-DD), inclusive. Read in the user's timezone.
Clear enough to supply this argument.
end_date
End date filter (ISO format YYYY-MM-DD), inclusive of the WHOLE day named, so end_date=today covers a meeting that finished minutes ago. Read in the user's timezone.
Clear enough to supply this argument.
provider
Optional: filter by meeting notes provider.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sort
'relevance' (default) ranks by match quality — use for topic questions. 'recent' orders strictly by meeting date, newest first — use for ANY recency or enumeration question: 'my last meeting note', 'the latest notes', 'what notes do I have', 'my last call with Jackie' (pair with participant). With sort='recent' you may omit query entirely; a query becomes a hint only and never filters anything out, so the newest note is always in the result.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search_meeting_notes",
"description": "Search the user's meeting notes by text, participant, date, or provider.",
"inputSchema": {
"type": "object",
"required": [],
"properties": {
"sort": {
"enum": [
"relevance",
"recent"
],
"type": "string",
"default": "relevance",
"description": "'relevance' (default) ranks by match quality — use for topic questions. 'recent' orders strictly by meeting date, newest first — use for ANY recency or enumeration question: 'my last meeting note', 'the latest notes', 'what notes do I have', 'my last call with Jackie' (pair with participant). With sort='recent' you may omit query entirely; a query becomes a hint only and never filters anything out, so the newest note is always in the result."
},
"query": {
"type": "string",
"description": "Free-text search across meeting titles, summaries, full transcripts, and participant names. Searches the actual words spoken, so topic queries like 'group buy deposit refundability' match content discussed in the call."
},
"end_date": {
"type": "string",
"description": "End date filter (ISO format YYYY-MM-DD), inclusive of the WHOLE day named, so end_date=today covers a meeting that finished minutes ago. Read in the user's timezone."
},
"provider": {
"enum": [
"granola",
"fathom",
"otter",
"circleback",
"fireflies",
"attention",
"dayai"
],
"type": "string",
"description": "Optional: filter by meeting notes provider."
},
"start_date": {
"type": "string",
"description": "Start date filter (ISO format YYYY-MM-DD), inclusive. Read in the user's timezone."
},
"participant": {
"type": "string",
"description": "Filter by participant name, email, or domain (e.g., 'daniel', '[email protected]', 'sierra.com')."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search meeting notes",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Read the summary or transcript of one meeting note owned by the user.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
note_id
Exact note identifier returned by a meeting-note search result.
Clear enough to supply this argument.
section
'auto' (default) returns the summary when there is one, otherwise the word-for-word transcript. Use 'transcript' when you need what was actually SAID rather than the recap.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Character offset to start from. Use content.next_offset from the previous call.
Clear enough to supply this argument.
max_chars
Max characters to return (1000-12000, default 12000).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "read_meeting_note",
"description": "Read the summary or transcript of one meeting note owned by the user.",
"inputSchema": {
"type": "object",
"required": [
"note_id"
],
"properties": {
"offset": {
"type": "integer",
"default": 0,
"description": "Character offset to start from. Use content.next_offset from the previous call."
},
"note_id": {
"type": "string",
"description": "Exact note identifier returned by a meeting-note search result."
},
"section": {
"enum": [
"auto",
"summary",
"transcript"
],
"type": "string",
"default": "auto",
"description": "'auto' (default) returns the summary when there is one, otherwise the word-for-word transcript. Use 'transcript' when you need what was actually SAID rather than the recap."
},
"max_chars": {
"type": "integer",
"default": 12000,
"description": "Max characters to return (1000-12000, default 12000)."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read meeting note",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Run a self-contained task with the user's Slashy agent and return its result. The agent may use native Slashy tools, including actions that change email or calendar data when the task authorizes them.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
prompt
The complete task and constraints for the Slashy agent.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
conversation_id
Existing delegated conversation identifier; omitted values start a new conversation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "delegate_to_slashy",
"description": "Run a self-contained task with the user's Slashy agent and return its result. The agent may use native Slashy tools, including actions that change email or calendar data when the task authorizes them.",
"inputSchema": {
"type": "object",
"required": [
"prompt"
],
"properties": {
"prompt": {
"type": "string",
"maxLength": 20000,
"minLength": 1,
"description": "The complete task and constraints for the Slashy agent."
},
"conversation_id": {
"type": "string",
"format": "uuid",
"description": "Existing delegated conversation identifier; omitted values start a new conversation."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delegate to Slashy",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Slashy setup, tools, quality score, publishing readiness, and alternatives.
How do I add Slashy to Claude, ChatGPT, or Cursor?
Add Slashy to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.slashy.com/mcp.
Is Slashy MCP ready for ChatGPT and Claude?
As of November 12, 2026, Slashy scores 90/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Slashy's MCP tool documentation?
As of November 12, 2026, Slashy scores 76/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 52 of 52 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Slashy?
As of November 12, 2026, alternatives to Slashy in communication on the Manufact MCP leaderboard include Granola, Cooper Email, Dial, Primitive Email, and Salvy.
How can Slashy improve its MCP documentation?
search_network is the lowest-scoring reviewed tool at 56/100. 1 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.