SuprSend MCP Server
SuprSend CLI
SuprSend CLI — это инструмент командной строки для взаимодействия с API SuprSend, написанный на Go.
Установка
npm / npx
Запуск без установки:
npx suprsend --helpИли установите глобально:
npm i -g suprsend
suprsend --helpРаботает на macOS, Linux и Windows (x64 и arm64). Требуется Node.js ≥ 18 (для npx).
Homebrew
Вы можете установить SuprSend CLI с помощью Homebrew:
brew tap suprsend/tap
brew install --cask suprsendБинарные релизы
Предварительно скомпилированные бинарные файлы для различных платформ доступны на странице релизов.
Сборка из исходного кода
Чтобы собрать SuprSend CLI из исходного кода, выполните следующие действия:
Убедитесь, что в вашей системе установлен Go (версии 1.20 или новее).
Клонируйте репозиторий:
git clone https://github.com/suprsend/cli.git
cd cli/cmd/suprsendСоберите бинарный файл:
go build -o suprsendБинарный файл будет создан в текущей директории. Вы можете переместить его в папку, указанную в вашем PATH, для удобного доступа:
sudo mv suprsend /usr/local/bin/Теперь вы можете использовать команду suprsend из любого места в вашем терминале.
Related MCP server: OneSignal MCP Server
Использование
После установки вы можете использовать CLI, выполнив команду suprsend. Например:
suprsend --helpДокументация
Пожалуйста, обратитесь к документации здесь ИЛИ, если вы хотите получить доступ к документации, сгенерированной cobra, она находится здесь
Участие в разработке
Мы приветствуем ваш вклад! Пожалуйста, не стесняйтесь отправлять Pull Request.
Локальная генерация артефактов сборки
make build компилирует встроенный бинарный файл type-morph Deno (требуется Deno), затем генерирует документацию CLI в docs/ и навыки ИИ в skills/.
make buildCI-проверка в PR для ветки main подтверждает, что docs/ и skills/ актуальны. Запустите make build и закоммитьте результат перед открытием PR.
Удаление локальных артефактов сборки
make cleanЛицензия
Этот проект лицензирован по лицензии MIT — подробности см. в файле LICENSE.
Available Tools
22 toolsadd_suprsend_object_subscriptionsADestructive
Subscribe one or more users or other objects TO this object. The recipient list can mix users and objects in a single call.
Recipients: users by distinct_id, objects by object_type + id. Each entry's shape follows the SuprSend recipient format. Optional properties attach metadata to each subscription (role, joined_at, etc.).
When NOT to use:
To remove subscribers — there is no remove tool; use the SuprSend API directly.
For mailing-list / segment membership — those are managed via the Lists API.
For preference changes on existing subscribers — use the per-user / per-object preference tools.
Side effects: each successful subscription is a separate row. Calling this twice with the same recipient creates duplicate-looking entries; check existing state with get_suprsend_object_subscriptions first if duplicates would be a problem.
Returns: the created subscription records on success.
| Name | Required | Description | Default |
|---|---|---|---|
| object_id | Yes | The object_id of the object's subscriptions to get. | |
| workspace | No | Suprsend workspace to get the object from. | |
| properties | No | Properties of an user/object | |
| recipients | Yes | Users & Objects who are subscribing to an object | |
| object_type | Yes | The type of object you want to get. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects (duplicate entries on repeated calls), suggests checking existing state, and notes return value. Annotations already indicate destructive=true and non-idempotent, and description adds useful context beyond annotations.
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?
Concise, front-loaded with purpose, then recipients, usage restrictions, and side effects. Every sentence contributes meaningfully.
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?
Despite no output schema, the description states return value. Covers usage, side effects, and parameter details thoroughly for a moderately complex 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?
With 100% schema coverage, the description still adds value by explaining recipient format (distinct_id vs object_type+id), optional metadata via properties, and references SuprSend recipient format.
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 clearly states the tool subscribes users/objects to an object, specifying verb and resource. It differentiates from sibling tools like get_suprsend_object_subscriptions and lists when not to use.
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 provides when-not-to-use scenarios and alternative tools (SuprSend API, Lists API, preference tools), giving clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_suprsend_documentationARead-onlyDestructiveIdempotent
Fetch the full content of a SuprSend documentation page when a snippet from search_suprsend_documentation is insufficient.
When to use: after search_suprsend_documentation, when the snippet excerpt doesn't fully answer and you need surrounding context, code examples, or full reference material.
When NOT to use: to discover documentation — search first; don't construct uris yourself.
Returns: the page contents as markdown.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | The uri of the documentation to fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds return format context (markdown), but annotations include destructiveHint=true which contradicts the fetch operation. The description does not address this inconsistency, reducing transparency.
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?
Very concise with three clear sections (what, when to use, what not to do, return). Every sentence is valuable.
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 simplicity (one parameter, no output schema), the description fully covers usage context, return format, and alternatives.
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%, and the description adds guidance not to construct URIs, providing extra meaning beyond the schema description.
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 clearly states it fetches the full content of a SuprSend documentation page, distinguishing it from the sibling search tool by mentioning when snippets are insufficient.
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 says when to use (after search) and when not to (discovery, avoid constructing URIs), providing clear guidance for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_objectARead-onlyDestructiveIdempotent
Get a SuprSend object's full state by object_type + object_id. Objects are non-user entities — organizations, projects, vehicles, devices — namespaced by object_type.
When to use: the user references an object by id and you need its stored properties or channel identifiers.
When NOT to use:
For users — use get_suprsend_user.
For preferences only — use get_suprsend_object_preferences.
For followers / members — use get_suprsend_object_subscriptions.
Returns: YAML mirroring get_suprsend_user's shape — object_type, object_id, properties (custom fields), created_at, updated_at, and a channels array (each entry has channel value, status, perma_status).
| Name | Required | Description | Default |
|---|---|---|---|
| object_id | Yes | The object_id of the object to get. | |
| workspace | No | Suprsend workspace to get the object from | |
| object_type | Yes | The type of object you want to get. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states this is a 'Get' operation, which implies read-only behavior. However, the annotations include both readOnlyHint: true and destructiveHint: true, which are contradictory. The description does not address or clarify this contradiction, failing to inform the agent of potential destructive effects. According to the scoring rule, a contradiction between description and annotations results in 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?
The description is well-structured with clear sections (purpose, when to use, when not to use, returns). It is informative without being overly verbose. Minor improvement could be trimming the list of sibling tools in the 'when not to use' section, but overall it is concise and front-loaded.
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 description covers purpose, parameter usage, return structure (YAML shape with fields like object_type, properties, channels), and sibling differentiation. No output schema exists, but the description compensates by detailing the return format. Given the tool's moderate complexity (3 params, no enums, no nested objects), the description is largely 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%, meaning the schema already describes all parameters. The description does not add significant meaning beyond the schema; it mentions the parameters in context but does not elaborate on their semantics or constraints. 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 clearly states the tool's purpose: 'Get a SuprSend object's full state by object_type + object_id.' It explicitly defines what objects are (non-user entities) and provides concrete examples like organizations, projects, vehicles, devices. It also distinguishes this tool from siblings by listing when NOT to use it and specifying alternatives.
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 provides explicit when-to-use and when-not-to-use guidance. It states: 'When to use: the user references an object by id and you need its stored properties or channel identifiers.' For when NOT to use, it lists three specific scenarios with corresponding sibling tool names (get_suprsend_user, get_suprsend_object_preferences, get_suprsend_object_subscriptions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_object_preferencesARead-onlyDestructiveIdempotent
Read an object's category-level notification preferences and (optionally) per-channel overrides.
When to use:
Before update_suprsend_category_preference_object, to read current state.
Before sending to an object, to check delivery permission.
When NOT to use:
For the object's identity or channels — use get_suprsend_object.
For users — use get_suprsend_user_preferences.
Returns: the object's preference tree. Pass category to scope to one preference; omit for the full tree. Set channel_preferences=true to include per-channel overrides.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | The category_slug of the object to get preferences from, if not provided, it will get all the preferences for the object. | |
| object_id | Yes | The object_id of the object to get preferences from. | |
| workspace | No | SuprSend workspace to get the user from. | |
| object_type | Yes | The object_type of the object to get preferences from. | |
| channel_preferences | No | set this to true to get all the channel preferences for the object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'Read', indicating a read-only operation, but the annotations include destructiveHint: true, contradicting the description. Per the rubric, a contradiction between description and annotations results in a score of 1. The description itself is transparent about reading preferences, but the mismatch with annotations undermines trust.
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?
The description is concise at about 6 sentences, organized into a clear statement of purpose, when to use/not use, and return behavior. Every sentence adds meaningful information without 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?
Given the presence of readOnlyHint and idempotentHint annotations, and the description covering purpose, usage, and parameter semantics, it is largely complete. The only minor gap is the conflicting destructiveHint, but that is an annotation issue, not a description completeness issue. It could mention that no changes are made, but the readOnlyHint already covers that.
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 baseline is 3. The description adds value by explaining how to use optional parameters: 'Pass category to scope to one preference; omit for the full tree. Set channel_preferences=true to include per-channel overrides.' This goes beyond the schema's basic descriptions.
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 clearly states the tool reads an object's category-level notification preferences and optionally per-channel overrides. It uses a specific verb ('Read') and resource ('object's category-level notification preferences'), effectively distinguishing it from sibling tools like get_suprsend_object (identity/channels) and get_suprsend_user_preferences (user preferences).
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?
Explicit when-to-use scenarios are provided: before update_suprsend_category_preference_object and before sending to an object to check delivery permission. When-not-to-use is also clearly stated, naming alternative tools for other cases (get_suprsend_object for identity/channels, get_suprsend_user_preferences for users).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_object_subscriptionsARead-onlyDestructiveIdempotent
List users / objects subscribed TO this object (its followers / members). Subscriptions are stored on the followed object.
When to use: the user asks "who follows project X?", "who's a member of organization Y?", or you need to enumerate an object's inbound subscribers.
When NOT to use:
For the inverse direction (what a user follows) — use get_suprsend_user_objects_subscriptions.
For mailing-list members — use get_suprsend_user_list_subscriptions on each user.
Returns: a paginated list of subscriber {type, id} entries. Set channel_preferences=true to also include each subscriber's channel preferences for this object. Default limit is 20.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of subscriptions to get for an object. | |
| object_id | Yes | The object_id of the object's subscriptions to get. | |
| workspace | No | Suprsend workspace to get the object from. | |
| object_type | Yes | The type of object you want to get. | |
| channel_preferences | No | Whether to include channel preferences in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims a read-only listing operation, but the annotation destructiveHint: true contradicts this. No mention of destructive behavior in the description, creating a serious inconsistency.
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?
Concise, well-structured with clear sections; every sentence serves a purpose without unnecessary words.
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 purpose, usage, return format, and parameter behavior. Lacks pagination details beyond limit, but given annotations (ignoring contradiction) and no output schema, it is fairly 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 coverage is 100% with parameter descriptions, but the description adds value by stating the default limit of 20 and explaining the effect of channel_preferences=true, which is not in 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?
The description clearly states the tool lists subscribers/followers of an object, using a specific verb and resource. It also distinguishes from two sibling tools by explicitly stating when not to use it.
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?
Explicit 'When to use' and 'When NOT to use' sections with concrete examples and named alternative tools, providing excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_tenantARead-onlyDestructiveIdempotent
Get a tenant's settings, branding metadata, and custom properties by tenant_id. Tenants are sub-accounts of a workspace, modeling end-customers in multi-tenant SaaS deployments.
When to use: the user references a tenant by id and you need its full state.
When NOT to use:
To enumerate all tenants — use get_suprsend_tenants.
For tenant-level preference defaults — use get_tenant_default_preference.
Returns: the tenant's settings (branding URLs, contact info, custom fields).
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_id | Yes | The tenant_id of the tenant to get. | |
| workspace | No | SuprSend workspace to get the tenant from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description describes a read-only get operation, but annotations include destructiveHint=true, which contradicts the non-destructive nature implied. The description does not address this contradiction or explain any potential side 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?
Concise with clear sections: purpose, usage guidelines, returns. Only 4 sentences, no fluff, and front-loaded with the core functionality.
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 purpose, usage context, and return values adequately for a simple get tool with full schema coverage. However, lack of clarification on the destructiveHint contradiction leaves a gap in behavioral understanding.
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 baseline is 3. The description adds no extra meaning beyond the schema; it only mentions 'by tenant_id' which aligns with the required parameter, but no additional details on format or behavior.
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 clearly states 'Get a tenant's settings, branding metadata, and custom properties by tenant_id', specifying the verb and resource, and distinguishes from siblings like get_suprsend_tenants and get_tenant_default_preference by mentioning the identifier.
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 includes 'When to use' and 'When NOT to use' sections, naming alternatives (get_suprsend_tenants for enumeration, get_tenant_default_preference for defaults), providing clear context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_tenantsARead-onlyDestructiveIdempotent
List all tenants in the workspace. Use to discover tenant_ids before calling get_suprsend_tenant or upsert_suprsend_tenant.
Returns: up to limit tenants (default 100) with their id and properties.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of tenants to get. Default is 100. | |
| workspace | No | SuprSend workspace to get the tenants from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'List all tenants' indicating a read-only operation, but the annotations include destructiveHint: true, which contradicts the tool's behavior. Annotations also include readOnlyHint: true and idempotentHint: true, adding to the inconsistency.
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?
The description is three sentences long, each serving a purpose: stating purpose, providing usage context, and describing return. It is front-loaded and contains no wasted words.
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 description explains the return format ('id and properties') despite lacking an output schema. It does not cover pagination or workspace specificity, but for a simple list tool this is adequate. The contradiction in destructiveHint reduces completeness.
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% with both parameters having descriptions. The description repeats 'default 100' for limit, adding no new meaning beyond the schema. Baseline score 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 clearly states 'List all tenants in the workspace', providing a specific verb and resource. It distinguishes itself from siblings by mentioning its use to discover tenant_ids before calling get_suprsend_tenant or upsert_suprsend_tenant.
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 explicitly says 'Use to discover tenant_ids before calling get_suprsend_tenant or upsert_suprsend_tenant', giving clear usage context. However, it does not explicitly state when not to use this tool or mention alternatives beyond the two siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_userARead-onlyDestructiveIdempotent
Get a SuprSend user's full state by distinct_id. Users are end recipients of notifications, identified by your application's user id.
When to use: the user references a recipient by id and you need their stored properties or channel identifiers.
When NOT to use:
For non-user entities (organizations, projects, vehicles) — use get_suprsend_object.
For preferences only — use get_suprsend_user_preferences.
For mailing-list / object subscriptions — use get_suprsend_user_list_subscriptions or get_suprsend_user_objects_subscriptions.
Returns: YAML with distinct_id, properties (custom fields like name, plan, lang), created_at, updated_at, and a channels array — each entry has the channel value, status, and perma_status (e.g., bounced, blocked, soft-bounced).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | SuprSend workspace to get the user from. | |
| distinct_id | Yes | The distinct_id of the user to get. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the description mentions the operation is a GET and returns data, the annotations include destructiveHint: true, which contradicts the read-only nature implied by the description. This inconsistency makes transparency poor.
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?
The description is well-structured with distinct sections: general purpose, when to use, when not to use, and return format. It is concise without unnecessary 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?
The description compensates for the lack of an output schema by detailing the return format (YAML with distinct_id, properties, created_at, updated_at, channels). It covers purpose, usage, and output comprehensively, though the annotation contradiction reduces completeness.
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 input schema has 100% description coverage for both parameters, so the description adds no additional meaning beyond identifying the required distinct_id. 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 clearly states 'Get a SuprSend user's full state by distinct_id', specifying the verb (Get), resource (SuprSend user), and identifier. It also distinguishes the tool from siblings by listing when not to use and alternative tools.
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 provides explicit 'When to use' and 'When NOT to use' sections, with specific alternative tools (get_suprsend_object, get_suprsend_user_preferences, etc.), giving clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_user_list_subscriptionsARead-onlyDestructiveIdempotent
List the SuprSend Lists this user belongs to. Lists are workspace-level recipient groups (segments / mailing lists), distinct from object follows.
When to use: the user asks "what mailing lists is X on?" or "what segments include X?".
When NOT to use:
For object follows (X follows project Y) — use get_suprsend_user_objects_subscriptions.
For followers OF an object — use get_suprsend_object_subscriptions.
Returns: a paginated list of List metadata. Default limit is 20; raise it for larger results.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of list subscriptions to get for a user. | |
| workspace | No | SuprSend workspace to run the query from. | |
| distinct_id | Yes | The distinct_id of the user to get the list subscriptions for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description describes a read-only list operation, but annotations include destructiveHint=true, which contradict. The description does not disclose any destructive behavior, leading to a contradiction.
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?
Description is two well-structured paragraphs with clear sections (purpose, usage, returns). Every sentence adds value 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?
Description explains returns (paginated list metadata) and default limit, but lacks details on pagination mechanism or metadata structure. Adequate for a reasonably complete tool given no output 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 covers 100% of parameters with descriptions. Description adds default limit hint (20) and mentions raising for larger results, providing useful context beyond 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?
Description clearly states the tool lists SuprSend Lists a user belongs to, defines lists as workspace-level recipient groups distinct from object follows, and uses specific verb 'List' with resource 'SuprSend Lists'.
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 provides when to use (user asks about mailing lists or segments) and when not to use (object follows, followers of an object), naming specific alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_user_objects_subscriptionsARead-onlyDestructiveIdempotent
List the objects this user is subscribed TO — what the user follows.
When to use: the user asks "what does X follow?", "what projects is X in?", or you need to enumerate a user's outbound subscriptions.
When NOT to use:
For followers OF an object (inverse direction) — use get_suprsend_object_subscriptions.
For mailing-list / segment membership — use get_suprsend_user_list_subscriptions.
Returns: a paginated list of {object_type, object_id} entries. Default limit is 20.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of object subscriptions to get for a user. | |
| workspace | No | SuprSend workspace to run the query from. | |
| distinct_id | Yes | The distinct_id of the user to get the object subscriptions for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations set destructiveHint=true, but the description describes a read-only list operation with no destructive behavior. This contradiction misleads the agent. The description does add pagination details and return format, but the contradiction is a severe flaw.
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?
The description is concise with well-structured sections (purpose, when to use, when not to use, returns). Every sentence adds value, 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?
Given no output schema, the description covers return format and pagination. However, the annotation contradiction (destructiveHint=true) is not addressed, leaving ambiguity about the tool's behavior, which reduces completeness.
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% with descriptions for all 3 params. The description adds value by stating the default limit of 20, which is not in the schema, helping the agent understand pagination.
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 clearly states the tool lists objects a user subscribes to, with a specific verb 'List' and resource 'user subscriptions'. It distinguishes from sibling tools like get_suprsend_object_subscriptions and get_suprsend_user_list_subscriptions.
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?
Explicit 'When to use' and 'When NOT to use' sections with clear examples ('what does X follow?') and named alternatives for inverse and list subscriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_suprsend_user_preferencesARead-onlyDestructiveIdempotent
Read a user's category-level notification preferences and (optionally) per-channel overrides.
When to use:
Before update_suprsend_users_preferences, to read current state.
The user asks what categories a recipient is opted in/out of.
Before sending, to check delivery permission for a category or channel.
When NOT to use:
For the user's identity or channel identifiers — use get_suprsend_user.
For tenant-level defaults — use get_tenant_default_preference.
For object preferences — use get_suprsend_object_preferences.
Returns: the user's preference tree. Pass category to scope to one preference; omit for the full tree. Set channel_preferences=true to include per-channel overrides.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | The category_slug of a category to get. | |
| tenant_id | No | The tenant_id of the tenant to get the preferences for. | |
| workspace | No | SuprSend workspace to get the user from. | |
| distinct_id | Yes | The distinct_id of the user to get the preferences for. | |
| channel_preferences | No | Whether to include channel preferences in the response. Default is false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description claims a read-only operation but annotation destructiveHint=true contradicts this. Per rules, any contradiction drops score to 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?
Description is concise, well-structured with clear sections, front-loaded purpose, and no wasted words.
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 5-param tool with no output schema, description covers return type (preference tree), parameter effects, and usage context. Slightly more detail on return shape would improve completeness.
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%, but description adds context: explains scoping behavior for 'category' and default behavior for 'channel_preferences', adding value beyond field descriptions.
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?
Description clearly states it reads user's category-level notification preferences with optional per-channel overrides, and distinguishes from sibling tools in the 'When NOT to use' section.
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?
Explicit 'When to use' and 'When NOT to use' sections provide concrete scenarios and named alternatives (get_suprsend_user, get_tenant_default_preference, get_suprsend_object_preferences).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tenant_default_preferenceARead-onlyDestructiveIdempotent
Read a tenant's default category preferences — the inheritance baseline applied to new users in this tenant.
When to use:
Before update_suprsend_tenant_default_preference, to read current defaults.
To diagnose why new users have unexpected preference state.
When NOT to use:
For individual user / object preferences — use get_suprsend_user_preferences or get_suprsend_object_preferences.
Returns: the tenant's full default-preference tree.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_id | Yes | The tenant_id of the tenant to get the default preference from. | |
| workspace | No | SuprSend workspace to get the tenant from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description states 'Read' indicating a read-only operation, but annotations include destructiveHint=true, which contradicts the tool's behavior. This inconsistency undermines transparency.
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?
Description is concise with clear sections (purpose, when to use, when not to use, returns). Every sentence adds value without 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?
The description covers usage context and return type but lacks output schema details. The contradictory annotations reduce completeness. Adequate but not exceptional.
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% with both parameters described. The description adds no additional meaning beyond the schema, so baseline score of 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?
Clearly states the tool reads a tenant's default category preferences, explaining it as the inheritance baseline for new users. Differentiates from siblings by specifying that individual user/object preferences should use other tools.
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 lists when to use (before updating defaults, diagnosing user preference state) and when not to use (for individual preferences). Names specific alternative tools: get_suprsend_user_preferences and get_suprsend_object_preferences.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workflowsARead-onlyIdempotent
List notification workflows in a workspace, in either draft or live mode.
mode=live returns the currently-active version of each workflow; mode=draft returns the staged-but-not-yet-promoted version. The two can differ — workflows often have a draft change in flight.
Returns: workflow slug, name, status, category, enabled state, and tags.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Mode of workflows to list (draft, live), default: live. | live |
| limit | Yes | Limit the number of workflows to list. | |
| offset | No | Offset the number of workflows to list. | |
| workspace | Yes | SuprSend workspace to list workflows from. | staging |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, openWorld, idempotent, and non-destructive behavior. The description adds significant behavioral context: the difference between draft and live modes, the possibility of divergence, and the exact fields returned. No contradictions with annotations.
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: purpose, mode explanation, return fields. Front-loaded with the core action, no unnecessary words. 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 description covers mode behavior and return fields. Pagination (limit/offset) is documented in the schema. Annotations cover safety. Lacks mention of potential filtering or ordering, but for a straightforward list tool this is 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 coverage is 100%, so baseline is 3. The description adds value by explaining the mode parameter's impact in detail (active vs staged version, possible differences) and listing return fields, which compensates for the lack of output 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?
The description uses a specific verb ('List') and resource ('notification workflows in a workspace') and clearly distinguishes between draft and live modes. None of the sibling tools deal with listing workflows, so it stands out.
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 explains when to use each mode ('mode=live returns the currently-active version... mode=draft returns the staged-but-not-yet-promoted version'), providing clear context. However, it does not explicitly state when not to use this tool or mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_suprsend_documentationARead-onlyDestructiveIdempotent
Search SuprSend's product documentation for technical guidance — APIs, SDKs, workflows, templates, tenants, lists, vendors, and connectors.
When to use:
The user asks how a SuprSend feature works or how to integrate one.
You need to verify a behavior before calling a write tool.
You're debugging an integration error.
When NOT to use: for runtime operations on SuprSend resources (users, objects, tenants, workflows) — those have dedicated tools.
Returns: a JSON array of {uri, snippet}. Snippets are excerpts; if a snippet doesn't fully answer, follow up with fetch_suprsend_documentation on the relevant uri.
Tips: use precise technical terms ("workflow trigger conditions", not "the rule thing"); add synonyms if the first query returns nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query. The query should: - Identify the core concepts and intent - Add relevant synonyms and related terms - Structure the query to emphasize key terms - Include technical or domain-specific terminology if applicable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read-only search operation, but the annotation destructiveHint=true directly contradicts this. This is a serious inconsistency that misleads the agent about the tool's side 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?
The description is well-structured with sections (what, when to use, when not, returns, tips). Every sentence serves a purpose, and it is concise without unnecessary 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?
The description covers the return format (JSON array of {uri, snippet}) even though no output schema exists. Given the tool's simplicity (one parameter) and the presence of sibling tools for runtime operations, the description is 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?
The single parameter 'query' is fully described in the schema (100% coverage). The description adds value by providing usage tips (use precise terms, add synonyms), going 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?
The description clearly states it searches SuprSend product documentation for technical guidance, listing specific topics (APIs, SDKs, workflows, etc.). It distinguishes from sibling tools by specifying when NOT to use (runtime operations).
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 explicitly provides when-to-use scenarios (user asks how a feature works, need to verify behavior before write, debugging integration errors) and when-not-to-use (runtime operations). It also offers tips on query formulation and fallback to fetch_suprsend_documentation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_suprsend_category_preference_objectADestructiveIdempotent
Set ONE category's preference for ONE object — opted in, opted out, or cant_unsubscribe (locked) — plus per-channel opt-outs within that category.
Replaces, does not merge. This call overwrites the existing preference for the named category. Previous opt-outs within the same category are lost; pass them again in opt_out_channels if you want to keep them.
When to use: changing a single category on a single object.
When NOT to use:
For object-wide channel toggles ("block all SMS") — use update_suprsend_object_channel_preference.
For users — use update_suprsend_users_preferences.
For tenant defaults — use update_suprsend_tenant_default_preference.
Preference values: opt_in enables; opt_out disables; cant_unsubscribe locks the object from toggling this category.
Returns: updated preference state on success; structured error on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | category_slug of an category to get. | |
| object_id | Yes | The object_id of the object to get preferences from. | |
| workspace | No | SuprSend workspace to get the user from. | |
| preference | Yes | The preference to update for the object. | |
| object_type | Yes | The object_type of the object to get preferences from. | |
| opt_out_channels | No | The channels to opt out from for the object. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the call replaces (does not merge) existing preferences and that previous opt-outs within the same category are lost, which goes beyond the annotations. It also explains the meaning of preference values.
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?
The description is well-structured with sections, front-loaded purpose, and each sentence adds value. It could be slightly more concise but is appropriately sized for the tool's complexity.
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, the description mentions return values (updated state or error). It covers behavioral impact, parameter meanings, and usage context. Minor omission: does not explain the 'workspace' parameter beyond schema, but schema already does.
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% (baseline 3), and the description adds meaning by explaining preference values and opt_out_channels. However, it introduces 'cant_unsubscribe' which is not in the schema enum, causing a slight inconsistency.
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 clearly states it sets one category's preference for one object, with options for opted in, opted out, or cant_unsubscribe. It also lists sibling tools for when not to use, distinguishing its specific purpose.
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 explicitly says when to use (changing a single category on a single object) and when NOT to use, with three specific alternative tools and their use cases, providing excellent guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_suprsend_object_channel_preferenceADestructiveIdempotent
Block or allow specific delivery channels for ONE object, applied across ALL categories.
is_restricted semantics: true blocks delivery on that channel; false re-enables it. Each entry in channel_preferences is a {channel, is_restricted} pair.
When NOT to use:
For per-category control — use update_suprsend_category_preference_object.
For users — use update_suprsend_user_channel_preference.
Side effects: takes effect on the next workflow run; in-flight notifications may still send.
Returns: updated channel-preference state on success.
| Name | Required | Description | Default |
|---|---|---|---|
| object_id | Yes | The object_id of the object to update the channel preference for. | |
| workspace | No | SuprSend workspace to update the channel preference for. | |
| object_type | Yes | The object_type of the object to update the channel preference for. | |
| channel_preferences | Yes | The channel preferences to update for the users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutability (readOnlyHint=false, destructiveHint=true) and idempotency (idempotentHint=true). The description adds value by explaining side effects ('takes effect on the next workflow run; in-flight notifications may still send') and return value ('Returns: updated channel-preference state on success'). No contradiction with annotations.
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?
The description is concise and well-structured: a single sentence for the main purpose, a clear breakdown of is_restricted semantics, a separate 'When NOT to use' section, and side effects/returns. Every sentence serves a purpose 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?
Given the tool's complexity (4 parameters, no output schema, no nested objects), the description covers all necessary aspects: purpose, parameter semantics, usage guidelines, side effects, and return value. It is self-contained and sufficient for an agent to use the tool 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 coverage is 100% (all 4 parameters described). The description adds meaning beyond the schema by explaining the is_restricted semantics and the format of channel_preferences entries. However, the schema itself already provides basic descriptions, so the added value is moderate.
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 the exact action: 'Block or allow specific delivery channels for ONE object, applied across ALL categories.' It clearly identifies the resource (object), the scope (across all categories), and distinguishes from sibling tools by naming alternatives.
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 explicitly lists when NOT to use the tool and provides specific sibling tool names: 'For per-category control — use update_suprsend_category_preference_object. For users — use update_suprsend_user_channel_preference.' This gives clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_suprsend_tenant_default_preferenceADestructiveIdempotent
Set the default category preference inherited by NEW users created in this tenant. Existing users are not affected; their preferences are independent.
preference values:
opt_in — new users are opted into this category.
opt_out — new users are opted out.
cant_unsubscribe — new users are opted in AND locked from toggling.
mandatory_channels — channels users cannot disable for this category. blocked_channels — channels that cannot be enabled. visible_to_subscriber — whether end-users see this category in their preference UI.
When NOT to use:
For per-user overrides — use update_suprsend_users_preferences.
For per-object overrides — use update_suprsend_category_preference_object.
Side effects: changes apply only to users created AFTER this call. To retroactively update existing users, call update_suprsend_users_preferences per user.
Returns: the updated tenant default preference on success.
| Name | Required | Description | Default |
|---|---|---|---|
| category | Yes | category_slug of an category to update. | |
| tenant_id | Yes | The tenant_id of the tenant to update. | |
| workspace | No | SuprSend workspace to update the tenant from. | |
| preference | Yes | The preference to update for the tenant. | |
| blocked_channels | Yes | The channels to block for the category. | |
| mandatory_channels | Yes | The channels to make mandatory for the category. | |
| visible_to_subscriber | Yes | Whether the category is visible to subscribers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond annotations by explaining the side effect that changes apply only to new users, not existing ones. This clarifies the 'destructiveHint: true' annotation (changes are not destructive to existing data). It also describes the return value on success.
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?
The description is well-structured with front-loaded purpose, clear separate sections for preference values and usage guidance. It is slightly long but every sentence earns its place, providing necessary detail without 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?
Given the complexity (7 parameters, no output schema), the description covers purpose, side effects, alternatives, returns, and parameter explanations. It is fully sufficient for an agent to select and invoke this tool 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?
With 100% schema coverage, the baseline is 3. The description adds value by explaining the meaning of preference values (opt_in, opt_out, cant_unsubscribe) and the roles of mandatory_channels, blocked_channels, and visible_to_subscriber. This enriches the schema's descriptions.
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 clearly states the tool's purpose using a specific verb ('Set the default category preference inherited by NEW users') and resource ('tenant'). It distinguishes from sibling tools by emphasizing the scope (new users only) and mentions alternatives.
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 explicitly provides when NOT to use the tool ('For per-user overrides' and 'For per-object overrides') and names the exact alternative tools (update_suprsend_users_preferences, update_suprsend_category_preference_object). This gives clear guidance to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_suprsend_user_channel_preferenceADestructiveIdempotent
Block or allow specific delivery channels for ONE user, applied across ALL categories. Use this for "block all SMS to this user" or "allow only email" patterns.
is_restricted semantics: true blocks delivery on that channel; false re-enables it. Each entry in channel_preferences is a {channel, is_restricted} pair.
When NOT to use:
For per-category control — use update_suprsend_users_preferences.
For permanent invalidation (e.g., a bounced email) — that's set by SuprSend automatically as perma_status; don't try to override it here.
For objects — use update_suprsend_object_channel_preference.
Side effects: takes effect on the next workflow run; in-flight notifications already in the queue may still send.
Returns: updated channel-preference state on success.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | SuprSend workspace to update the channel preference for. | |
| distinct_id | Yes | The distinct_id of the user to update the channel preference for. | |
| channel_preferences | Yes | The channel preferences to update for the users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses side effects (takes effect on next workflow run, in-flight notifications may still send). Explains is_restricted semantics and warns against overriding perma_status. Annotations are consistent: destructiveHint=true, idempotentHint=true, etc. No contradiction.
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?
Well-structured with clear sections (purpose, semantics, when-not-to-use, side effects). Each sentence adds value, but could be slightly more concise; still excellent for thoroughness.
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 usage, parameter semantics, side effects, return value, and limitations. Given no output schema, description specifies it returns updated channel-preference state. Fully complete for this tool's complexity.
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% but description adds meaning: explains the structure of channel_preferences items and the meaning of is_restricted (true blocks, false re-enables). Adds value beyond schema definitions.
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?
Description clearly states the tool blocks or allows delivery channels for one user, applied across all categories. It distinguishes from siblings like update_suprsend_users_preferences and update_suprsend_object_channel_preference via explicit 'When NOT to use' section.
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?
Explicit when to use (block/allow per user globally) and when not to use, with specific alternative tools named (per-category control, permanent invalidation, objects). Also provides use case examples.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_suprsend_users_preferencesADestructiveIdempotent
Set ONE category's preference for ONE user — opted in, opted out, or cant_unsubscribe (locked) — plus per-channel opt-outs within that category.
Replaces, does not merge. This call overwrites the existing preference for the named category. Previous opt-outs within the same category are lost; pass them again in opt_out_channels if you want to keep them.
When to use: changing a single category for a single user.
When NOT to use:
For tenant-wide defaults — use update_suprsend_tenant_default_preference.
For cross-category channel toggles ("block all SMS") — use update_suprsend_user_channel_preference.
For the same flow on objects — use update_suprsend_category_preference_object.
Preference values: opt_in enables; opt_out disables; cant_unsubscribe locks the user from toggling this category in their preference UI.
Returns: updated preference state on success; structured error on failure (e.g., unknown category slug).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | SuprSend workspace to run the query from. | |
| categories | Yes | The categories to update the preferences for. | |
| distinct_ids | Yes | The distinct_ids of the users to update the preferences for. | |
| channel_preferences | Yes | The channel preferences to update for the users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the call 'replaces, does not merge' and 'overwrites existing preference', plus explains the meaning of each preference value and the return behavior. This adds significant context beyond the annotations, which only indicate destructiveness and idempotence.
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?
The description is well-structured with sections, bullet points, and clear separation of concerns. It is front-loaded with the core action and efficiently delivers all necessary information without 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?
Given the 4 parameters, 100% schema coverage, and annotations, the description completes the picture by explaining the replace behavior, preference values, and return value. No output schema is present, but the description adequately describes the response.
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?
While schema coverage is 100% and provides basic descriptions, the description adds important context such as the 'cant_unsubscribe' option (though not present in the schema enum) and explains the overwrite behavior for opt_out_channels. This adds value beyond the schema, justifying a score above the baseline of 3.
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 explicitly states the action ('Set ONE category's preference for ONE user'), the verb ('set'), the resource ('category preference'), and the scope (one category, one user). It also lists the possible preference values, making the purpose very 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?
The description provides a clear 'When to use' section and a 'When NOT to use' section that names three specific sibling tools and their appropriate use cases, aiding the agent in selecting the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_suprsend_objectADestructive
Modify properties or channel identifiers on a SuprSend object — a non-user entity like an organization, project, or vehicle. One call performs ONE action; for multiple changes, call this tool multiple times.
Actions:
set, set_once, unset, remove — modify a scalar property by key/value. remove permanently deletes the key.
append, increment — modify array / numeric values.
add_email / remove_email, add_sms / remove_sms, add_whatsapp / remove_whatsapp, add_androidpush / remove_androidpush, add_iospush / remove_iospush, add_slack / remove_slack, add_ms_teams / remove_ms_teams, add_webpush / remove_webpush — register or deregister a delivery channel.
Channel registration is special. For channel identifiers ALWAYS use the dedicated add_ / remove_ actions — generic set / unset will not register the channel correctly with the delivery router. Slack and MS Teams additionally require the corresponding slack_details / ms_teams_details payload alongside the action; channel id alone is not enough.
When to use: creating an object or modifying its stored state — properties, channels, identifiers.
When NOT to use:
For users — use upsert_suprsend_user instead.
For preferences — use update_suprsend_category_preference_object (per category) or update_suprsend_object_channel_preference (across categories).
For followers / members — use add_suprsend_object_subscriptions.
Side effects: remove and unset permanently delete data. add_ makes the object reachable on that channel for any future workflow run; remove_ stops delivery immediately.
object_type namespaces the object (e.g., "organization", "project") and is required.
Returns: the updated object on success; structured error with field reasons on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | The key on which the action is to be performed. only required for set, append, increment, unset actions. | |
| value | No | The value to needs to be added/removed/set/unset/appended/incremented. | |
| action | Yes | the action to perform. use action "upsert" to create a new object or update an existing object's properties. use action "remove" to remove a object's properties. use action "set" to set a object's property, don't use this when trying to add email, add sms, add whatsapp, add androidpush, add iospush, add slack, add ms_teams, add webpush use the respective actions. use action "unset" to unset a object's property, don't use this when trying to remove email, remove sms, remove whatsapp, remove androidpush, remove iospush, remove slack, remove ms_teams, remove webpush use the respective actions. use action "set_once" to set a object's property once, this will only set the property if it is not already set. use action "append" to append a value to a object's property. use action "increment" to increment a object's property. use action "add_email" to add an email to a object. use action "remove_email" to remove an email from a object. use action "add_sms" to add an SMS to a object. use action "remove_sms" to remove an SMS from a object. use action "add_whatsapp" to add a WhatsApp to a object. use action "remove_whatsapp" to remove a WhatsApp from a object. use action "add_androidpush" to add an Android push to a object. use action "remove_androidpush" to remove an Android push from a object. use action "add_iospush" to add an iOS push to a object. use action "remove_iospush" to remove an iOS push from a object. use action "add_slack" to add a Slack to a object. use action "remove_slack" to remove a Slack from a object. use action "add_ms_teams" to add a Microsoft Teams to a object. use action "remove_ms_teams" to remove a Microsoft Teams from a object. use action "add_webpush" to add a Webpush to a object. use action "remove_webpush" to remove a Webpush from a object. | |
| object_id | Yes | The object_id of the object to get. | |
| workspace | No | Suprsend workspace to get the object from. | |
| object_type | Yes | The type of object you want to get. | |
| slack_details | No | This is only applicable for add_slack and remove_slack actions. | |
| object_payload | No | Payload of the request that you want to pass for the object. | |
| webpush_details | No | This is only applicable for add_webpush and remove_webpush actions. | |
| ms_teams_details | No | This is only applicable for add_ms_teams and remove_ms_teams actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-readonly behavior. Description adds context: 'remove and unset permanently delete data', 'One call performs ONE action', and channel registration side effects. Could mention non-idempotency but annotations cover that.
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?
Well-structured with bullet points and clear sections. Front-loaded with purpose. However, it is quite long; could be more concise while retaining completeness.
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?
Comprehensive coverage: actions, side effects, when-not, return values. Handles 10 parameters, nested objects, and many actions. No output schema but description mentions success/error returns.
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% and description adds meaning: explains each action's purpose, special channel registration requirements, and required slack_details/ms_teams_details for specific actions.
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?
Description clearly states it modifies properties or channel identifiers on a SuprSend object (non-user entity). It lists specific actions and distinguishes from sibling tools like upsert_suprsend_user and update_suprsend_category_preference_object.
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 states when to use (creating/modifying object state) and when NOT to use (users, preferences, followers), with alternatives named for each exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_suprsend_tenantADestructive
Create a new tenant or update an existing tenant's properties. Tenants are sub-accounts of a workspace, used to model end-customers in multi-tenant SaaS apps.
tenant_properties is merged with existing — not replaced. Pass only the fields you want to change. Common fields include name, branding URLs, and contact info.
When NOT to use:
For preference defaults — use update_suprsend_tenant_default_preference.
For users / objects within a tenant — use upsert_suprsend_user / upsert_suprsend_object.
Returns: the updated tenant on success.
| Name | Required | Description | Default |
|---|---|---|---|
| tenant_id | Yes | The tenant_id of the tenant to upsert. | |
| workspace | No | SuprSend workspace to get the tenant from. | |
| tenant_properties | No | The properties to upsert for the tenant. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, and the description confirms mutation (create/update). It adds value beyond annotations by stating tenant_properties is merged (not replaced) and that the updated tenant is returned. No contradictions.
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?
Description is front-loaded with the main action, then provides merge behavior, usage exclusions, and return value. Every sentence is valuable and well-structured, 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?
Covers purpose, merge behavior, usage exclusions, and return value. Missing details on error cases or rate limits, but given annotations and schema richness, it is fairly complete. Output schema would help but 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 coverage is 100% with descriptions for all parameters. The description adds the merging behavior for tenant_properties, which is not in the schema. This extra detail justifies a score above baseline 3.
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 explicitly states the tool creates or updates a tenant, which is a specific verb+resource. It distinguishes from siblings by noting when not to use it (preference defaults and user/object operations).
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 explicit 'When NOT to use' section with alternative tool names (update_suprsend_tenant_default_preference, upsert_suprsend_user, upsert_suprsend_object). Also explains merging behavior for tenant_properties, guiding partial updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_suprsend_userADestructive
Modify properties or channel identifiers on a SuprSend user. One call performs ONE action; for multiple changes, call this tool multiple times.
Actions:
set, set_once, unset, remove — modify a scalar property by key/value. remove permanently deletes the key.
append, increment — modify array / numeric values.
set_preferred_language, set_timezone — locale and timezone on the user.
add_email / remove_email, add_sms / remove_sms, add_whatsapp / remove_whatsapp, add_androidpush / remove_androidpush, add_iospush / remove_iospush, add_slack / remove_slack — register or deregister a delivery channel.
Channel registration is special. For channel identifiers ALWAYS use the dedicated add_ / remove_ actions — generic set / unset will not register the channel correctly with the delivery router. Slack additionally requires the slack_details payload alongside the action.
When to use: creating a new user or modifying an existing user's stored state.
When NOT to use:
For non-user entities — use upsert_suprsend_object.
For preferences — use update_suprsend_users_preferences (per category) or update_suprsend_user_channel_preference (across categories).
For tenant settings — use upsert_suprsend_tenant.
Side effects: remove and unset permanently delete data. add_ makes the user reachable on that channel for any future workflow run; remove_ stops delivery immediately.
Returns: the updated user on success; structured error with field reasons on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | The key on which the action is to be performed. only required for set, append, increment, unset actions. | |
| value | No | The value to needs to be added/removed/set/unset/appended/incremented. | |
| action | Yes | The action to perform. use action "upsert" to create a new user or update an existing user's properties. use action "remove" to remove a user's properties. use action "set" to set a user's property, don't use this when trying to add email, add sms, add whatsapp, add androidpush, add iospush, add slack use the respective actions. use action "unset" to unset a user's property, don't use this when trying to remove email, remove sms, remove whatsapp, remove androidpush, remove iospush, remove slack use the respective actions. use action "set_once" to set a user's property once, this will only set the property if it is not already set. use action "append" to append a value to a user's property. use action "increment" to increment a user's property. use action "add_email" to add an email to a user. use action "remove_email" to remove an email from a user. use action "add_sms" to add an SMS to a user. use action "remove_sms" to remove an SMS from a user. use action "add_whatsapp" to add a WhatsApp to a user. use action "remove_whatsapp" to remove a WhatsApp from a user. use action "add_androidpush" to add an Android push to a user. use action "remove_androidpush" to remove an Android push from a user. use action "add_iospush" to add an iOS push to a user. use action "remove_iospush" to remove an iOS push from a user. use action "add_slack" to add a Slack to a user. use action "remove_slack" to remove a Slack from a user. use action "set_preferred_language" to set a user's preferred language. use action "set_timezone" to set a user's timezone. | |
| workspace | No | SuprSend workspace to get the user from. | |
| distinct_id | Yes | The distinct_id of the user to get. | |
| slack_details | No | This is only applicable for add_slack and remove_slack actions. | |
| webpush_details | No | This is only applicable for add_webpush and remove_webpush actions. | |
| ms_teams_details | No | This is only applicable for add_ms_teams and remove_ms_teams actions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=true and readOnlyHint=false. Description adds side effects: remove/unset permanently delete data, add/remove channel affects reachability. Also describes return behavior (updated user or error). No contradiction.
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?
Structured with bulleted actions and clear sections. Slightly long but every sentence adds value. Front-loads core information. No waste.
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 actions, usage guidance, side effects, return types, and references sibling tools. No output schema, but description adequately explains return on success/failure. Complete for the complexity.
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% with descriptions for all parameters. Description adds crucial context: channel actions need dedicated actions, Slack requires slack_details, webpush/webpush_details, etc. Enhances schema without repeating 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?
Description clearly states it modifies properties or channel identifiers on a SuprSend user, specifying one action per call. It distinguishes from siblings like upsert_suprsend_object, update_suprsend_users_preferences, etc., by naming them directly.
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 states when to use (creating/modifying user) and when not to (non-user entities, preferences, tenant). Also warns against using generic set/unset for channel identifiers and provides specific alternative tools.
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. Dates show when Glama detected each change.
22 tool updates
v1.0.0-beta.1- First observed
add_suprsend_object_subscriptions - First observed
fetch_suprsend_documentation - First observed
get_suprsend_object - First observed
get_suprsend_object_preferences - First observed
get_suprsend_object_subscriptions - First observed
get_suprsend_tenant - First observed
get_suprsend_tenants - First observed
get_suprsend_user - First observed
get_suprsend_user_list_subscriptions - First observed
get_suprsend_user_objects_subscriptions - First observed
get_suprsend_user_preferences - First observed
get_tenant_default_preference - First observed
list_workflows - First observed
search_suprsend_documentation - First observed
update_suprsend_category_preference_object - First observed
update_suprsend_object_channel_preference - First observed
update_suprsend_tenant_default_preference - First observed
update_suprsend_user_channel_preference - First observed
update_suprsend_users_preferences - First observed
upsert_suprsend_object - First observed
upsert_suprsend_tenant - First observed
upsert_suprsend_user
TDQS
Every tool targets a distinct resource and action. Users, objects, tenants, subscriptions, and preferences are clearly separated with descriptive names and detailed 'When to use' sections, eliminating ambiguity even between closely related tools like get_suprsend_user and get_suprsend_object.
Most tools follow a consistent verb_noun pattern with 'suprsend' prefix (e.g., get_suprsend_user, update_suprsend_users_preferences). One exception is get_tenant_default_preference which omits 'suprsend', but it's still readable and the pattern is otherwise well-maintained.
22 tools is on the higher end but appropriate for a comprehensive notification service covering users, objects, tenants, preferences, subscriptions, workflows, and documentation. Each tool serves a well-defined purpose, though some consolidation could be considered.
The tool surface covers core CRUD and lifecycle operations for users, objects, and tenants, along with preference and subscription management. Notable gaps include no tool for removing subscriptions (documentation explicitly notes this) and no delete operations for users/objects/tenants, which may require API workarounds.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Build and send email, SMS, and push straight from your AI agent.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Carbon Voice MCP serves as a bridge that connects AI assistants like ChatGPT, Claude, and Cursor to a user's Carbon Voice account, turning voice messages and conversations into a private, on-demand knowledge base. It provides 28 specialized tools for comprehensive voice messaging management, including creating and sending messages, accessing conversation history with instant transcription, running AI actions (summarization, TLDR generation, meeting notes), and managing workspace collaboration through folders, contacts, and team communications.
Send notifications, manage templates, and configure integrations with Courier.
Related MCP Servers
FlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with Novu's notification system, facilitating operations like sending notifications, managing subscribers, and organizing topics.4-- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage OneSignal push notifications, email, SMS, and user management through natural language. Supports multi-channel messaging, segmentation, templates, analytics, and iOS Live Activities with 50+ tools for complete OneSignal API coverage.1-

Courier MCP Serverofficial
AlicenseNot gradedqualityFmaintenanceEnables AI agents to interact with the Courier notification API, allowing them to send messages, manage profiles, debug deliveries, configure lists, and more through 60 tools.372MIT- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Novu's notification infrastructure, supporting event triggering, subscriber management, topic operations, and notification retrieval.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/suprsend/cli'
If you have feedback or need assistance with the MCP directory API, please join our Discord server