# Tools · Community and structure

> MCP tools for the community's structure: the connection's context, sections and spaces, opening a link copied from the app, creating, editing, reordering and deleting sections and spaces, who sees each one, moving a space to another section, the community settings (including the language), the e-mail for sale notices and the API keys.

The starting point of every conversation and the shape of the community: which community and role the assistant is in, which sections and spaces exist, and creating, reordering, adjusting or deleting that structure, including who sees each space. This is also where the assistant understands a link you paste into the conversation, and where it views and changes the community settings (name, colors, logo, SEO, language and entry rules) and the e-mail that receives sale notices.

Each tool carries a badge: <span class="tool-kind tool-kind-read">Read-only</span> changes nothing, <span class="tool-kind tool-kind-write">Changes</span> creates or changes something right away, and <span class="tool-kind tool-kind-confirm">Asks to confirm</span> only acts after your yes to a summary. See [Money and confirmation](/mcp/dinheiro-e-confirmacao).

## In short

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| [`get_community_context`](#get-community-context) | Community, role, sections and spaces with ids: the starting point | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`get_connection_diagnostics`](#get-connection-diagnostics) | Whether the assistant's tool list is up to date | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`list_spaces`](#list-spaces) | Sections and spaces, filterable by module | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`list_space_updates`](#list-space-updates) | What is new in your spaces since your last visit | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`open_link`](#open-link) | Says what a link copied from the app (or an id) is | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`create_section`](#create-section) | Creates a menu section | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`create_space`](#create-space) | Creates a space in a section | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`update_space`](#update-space) | Changes a space's name, description, icon or visibility, or moves it to another section | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`update_section`](#update-section) | Changes a section's name, description or icon, what whoever has no access sees, or makes it the home section | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`reorder_sections`](#reorder-sections) | Puts the menu sections in a new order | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`reorder_spaces`](#reorder-spaces) | Puts a section's spaces in a new order | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`get_space_access`](#get-space-access) | Who gets into a space or a section: groups, products, plans and badges | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`update_space_access`](#update-space-access) | Who sees a space or a section, and who posts in the space | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`delete_section`](#delete-section) | Deletes an empty section | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`delete_space`](#delete-space) | Deletes a space | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`get_community_settings`](#get-community-settings) | The community's settings: name, colors, images, SEO, language, entry | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`update_community_settings`](#update-community-settings) | Changes name, logo, favicon, SEO, language and entry rules (the colors belong to the theme) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`update_community_appearance`](#update-community-appearance) | Changes the logo for dark backgrounds (the mode and the menu belong to the theme) | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`get_notification_settings`](#get-notification-settings) | The e-mail that receives sale notices and the recovery e-mail | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`update_notification_settings`](#update-notification-settings) | Changes the sale notices e-mail and turns the recovery e-mail on or off | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`get_email_stats`](#get-email-stats) | The delivery numbers of the community's e-mails | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`list_integrations`](#list-integrations) | Your API keys (owner and admin: the whole community's, the webhooks and the ready-made integrations), without secrets | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`get_email_notice_recipient_count`](#get-email-notice-recipient-count) | How many people will get the e-mail notice of a publication | Moderator or finance | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`get_email_provider`](#get-email-provider) | Whether e-mails leave through the community's Resend account, the status and the sender | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`update_email_provider`](#update-email-provider) | Changes the sender of the Resend account | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`verify_email_provider`](#verify-email-provider) | Sends the Resend account's verification e-mail | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`disconnect_email_provider`](#disconnect-email-provider) | Disconnects the Resend account; everything leaves through Memberfy again | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| [`list_video_keys`](#list-video-keys) | The Bunny and Cloudflare signing keys, without the value | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| [`update_video_key`](#update-video-key) | Saves or replaces a video provider's signing key | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`verify_video_key`](#verify-video-key) | Checks the key with one of the provider's videos | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| [`delete_video_key`](#delete-video-key) | Deletes a video provider's signing key | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

## `get_community_context`

<span class="tool-kind tool-kind-read">Read-only</span>

**Community context.** The starting point: says which community the connection is in, with which role, and lists the sections and spaces with their ids. *Minimum role: any.*

Parameters: none.

**Returns:** the community (id, name, address), you (role and name), the connection's scopes (`read`, `write`), the sections (id, title, whether it's the home section, visibility) with each section's spaces (id, title, module, visibility; the padlock as in [`list_spaces`](#list-spaces)), the order in which things need to be created, the icons available for spaces (`available_icons`, with what each one is for) and `member_entry`: whether Memberfy has suspended joining and sales for the community (for the team, also the reason and the date). See [Suspension of joining and sales](/membros/politica-de-convites#suspension-of-joining-and-sales).

**Ask like this:** *"Which community are you connected to, and with what role?"* · *"What spaces does the community have?"*

**Notes:** assistants usually call this tool on their own at the start of each conversation. The creation order it returns is the same as in [Creation order](/api/ordem-de-criacao).

## `list_spaces`

<span class="tool-kind tool-kind-read">Read-only</span>

**List sections and spaces.** The sections and spaces, with id, module and visibility, filterable by module. *Minimum role: any; each person sees what they can see.* Each space carries `layout`, the display (`null` is the module's default).

| Parameter | Type | Required | Description |
|---|---|---|---|
| `module` | text | No | `feed`, `content`, `courses`, `events`, `storefront`, `gallery`… Returns only the sections that have spaces of that module |

**Returns:** the sections with their spaces, as in `get_community_context`. A Courses space carries its mode (`single` or `multi`). A Feed space carries its `feed_scope` (`space` or `section`) and `feed_widgets`, with the default filled in.

With [For those without access](/conceitos/visibilidade-e-acesso#for-those-without-access), a section or space the person can't open, but sees with a padlock, comes with `locked: true` and `lock_reason` (`signIn`, `plan`, `product`, `subscription` or `group`, never the group's name). The team also sees `locked_display` (what whoever has no access sees) and `admin_only` (`true`: only the team gets in). The assistant never picks a padlocked space to post or act in; when it opens one, it gives the reason and offers the way in: the Store (`list_spaces` with `module: storefront`) for a purchase, or the plans (`quote_plan_change`) for a subscription. In an area closed by group (or with nothing on sale), the refusal carries `can_contact_team`; when `true`, the assistant offers [`contact_team`](/mcp/ferramentas-membros#messages), which opens the conversation with the team, and then `send_chat_message` with the request (see [recipe 97](/mcp/receitas#97-ask-for-access-to-a-padlocked-area)). When the way in is a plan and the area names no specific plan, the refusal says *"Any paid plan opens it: see the community plans."*

In an area closed by a badge, the refusal carries the `earnBadge` action, `badges` (public ones only, with the description of how to earn them) and `has_hidden_badge`; the assistant says *"Earning the badge Mentor opens it"* or, when the badge is private, *"Earning a badge opens it: ask the community team how."*

In an area closed by a level, the refusal carries the `earnPoints` action, `level` and, for a member, `progress` (the points, `points_to_go` and what is missing this week); the assistant says the level, the points to go and the week's missing activity, and suggests [`get_level_progress`](/mcp/ferramentas-conteudo#get-level-progress). A visitor gets only the level.

**Ask like this:** *"Which one is the courses space?"* · *"List the event spaces."*

## `list_space_updates`

<span class="tool-kind tool-kind-read">Read-only</span>

**List what is new in my spaces.** For each Feed, Content and Events space you open, how many new items arrived since your last visit to it (other people's posts in Feed and Content, published events in Events), with the sum per section and the total. They are the same numbers as the [menu badges](/configuracoes/menu-lateral#news-badges). *Minimum role: any.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `include_zero` | yes or no | No | `true` also lists the spaces with nothing new (count 0) |

**Returns:** the spaces with news, most first, each with `space_id`, `title`, `section_id`, `section_title`, `module`, `count` and `last_visit_at` (`null`: never opened); the sums per section and the total. A space you cannot open never appears.

**Ask like this:** *"What is new in my spaces?"* → `list_space_updates {}` · *"And the ones that are up to date?"* → `list_space_updates {"include_zero": true}`

**Notes:** the visit is recorded when you open the space in the app; reading through the assistant **does not reset** the counter. To read the news, the assistant uses `list_posts` (Feed and Content) or `list_events` (Events) with the `space_id`.

## `open_link`

<span class="tool-kind tool-kind-read">Read-only</span>

**Open an app link.** Takes a link from your community (or a bare id or slug) and says what it is, with its id, title, space and a summary. *Minimum role: any.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `link` | text | Yes | The app address, a path such as `/aprender/cursos/excel`, an id or a slug |

It understands the app's addresses: space (`/section/space`), post, event, course, certificate (from inside the space or from the public verification page), call for papers and proposal (`?proposal=`), plan (`/pricing/…`) and subscription (`/billing?subscription=…`), including the old addresses the app redirects.

**Ask like this:** *"What is this link? https://yourcommunity.com/aprender/cursos/excel-do-zero"*

When you open an event link, the result says whether it issues a certificate (with the setting for owners and admins, and the state of their own certificate for whoever confirmed attendance).

**Notes:** it only works with links from the connected community. A link from another community comes back as *"That link belongs to another community"*, even if you manage both: connect the other one separately.

## `create_section`

<span class="tool-kind tool-kind-write">Changes</span>

**Create section.** Creates a menu section, such as *Learn* or *Community*. Spaces live inside sections. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `title` | text, up to 255 | Yes | The name in the menu |
| `description` | plain text | No | No formatting: Markdown marks are stripped |
| `visibility` | `public`, `members`, `plan`, `private` | No | Who sees the section. See [Visibility and access](/conceitos/visibilidade-e-acesso) |
| `locked_display` | `hide`, `section`, `section_and_spaces` | No | What whoever has no access sees: nothing, only the section line with a padlock, or the section and its spaces with a padlock (the default). See [For those without access](/conceitos/visibilidade-e-acesso#for-those-without-access) |

**Returns:** the new section, with the id `create_space` needs.

**Ask like this:** *"Create a section called Learn, visible to members only."*

## `create_space`

<span class="tool-kind tool-kind-write">Changes</span>

**Create space.** Creates a space in a section, with the module that defines what it is. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section_id` | id | Yes | From `get_community_context` or `create_section` |
| `title` | text, up to 255 | Yes | |
| `module` | `feed`, `content`, `courses`, `events`, `storefront`, `gallery`, `ranking`, `url`, `certificates`, `call4papers`, `surveys`, `forms`, `recognition`, `feedbacks`, `developmentPlan`, `timeTracking`, `networking` | Yes | Feed, Content, Courses, Events, Store, Gallery, Engagement, Link, Certificates, Call for papers, Surveys or Forms (`forms`; afterwards, [`create_form`](/mcp/ferramentas-membros#forms)). `timeTracking` is Time Tracking: afterwards, link the establishment with [`set_time_tracking_space_establishment`](/mcp/ferramentas-membros#time-tracking). See [Modules](/conceitos/modulos) |
| `external_url` | web address | No | Only for the `url` module: the address the space opens |
| `icon` | one of the icons in the list | No | The space's icon. See [Icons](#icons). Without it, Memberfy picks one from the title and the module |
| `description` | plain text | No | No formatting: Markdown marks are stripped |
| `visibility` | `public`, `members`, `plan`, `private` | No | |
| `locked_display` | `inherit`, `hide`, `show` | No | What whoever has no access sees: same as the section (the default), nothing, or the space with a padlock |
| `feed_scope` | `space`, `section` | No | `feed` module only: `space` shows only this space's posts, `section` brings together every space in the section. Without it, the section's only Feed starts as `section` and the next ones as `space`. See [What this feed shows](/espacos/feed#what-this-feed-shows) |
| `feed_widgets` | `events`, `trending`, `new_members`, `leaderboard` (yes or no) | No | `feed` module only: the [side column](/espacos/feed#side-column) widgets. Without it, events and trending on, the other two off. |
| `networking` | object: `preset` (`COMMUNITY_MENTORING`, `COMPANY_MENTORING`, `BUSINESS`, `EVENT`, `CUSTOM`) and the program options | No | Only in the `networking` module: the model fills in every option, and any options sent along apply on top. See [Tools · Networking](/mcp/ferramentas-networking). |
| `mode` | `single`, `multi` | No | In the `courses`, `surveys` and `forms` modules: `multi` (a list, the default) or `single` (A single course, One survey or One form: the space opens straight into the item and refuses a second one) |
| `course` | object: `title`, `level`, `description` | No | Only in the `courses` module, in `single`: creates the course, as a draft, together with the space. On its own, it already implies `single` |
| `layout` | text or `null` | No | The space's [display](/conceitos/espacos#display), among those the module offers (`layouts` in `list_space_modules`); `null` goes back to the module's default. `showcase` (Showcase) is Courses only: in another module, the request is refused with the way to `list_space_modules` |

**Returns:** the created space, with its id and icon (and the course, if `course` was sent).

**Ask like this:** *"Create a Feed space called Announcements in the Community section, with the megaphone icon."*

*"Create a Courses space as a showcase"* → `create_space {"section_id":"…","title":"Courses","module":"courses","layout":"showcase"}`; the assistant then suggests the poster cover on the courses (`cover_format: "POSTER"`).

**Notes:** for a complete course or event, `create_course` and `create_event` create the space along with it. In a Call for papers space, the suggested next step is opening the first call ([`create_call_for_papers`](/mcp/ferramentas-chamada#create-call-for-papers)); in a Surveys space, creating the survey ([`create_survey`](/mcp/ferramentas-membros#surveys)) with the `space_id`. Spaces have no cover image.

## `update_space`

<span class="tool-kind tool-kind-write">Changes</span>

**Edit space.** Changes the name, description, icon or visibility of an existing space, or moves it to another section. Only what is sent changes. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `space_id` | id | Yes | From `list_spaces` |
| `title` | text, up to 255 | No | |
| `description` | plain text | No | No formatting: Markdown marks are stripped |
| `icon` | one of the icons in the list | No | The space's icon. See [Icons](#icons). Without it, Memberfy picks one from the title and the module |
| `visibility` | `public`, `members`, `plan`, `private` | No | For a private space with groups, products or plans, use [`update_space_access`](#update-space-access) |
| `locked_display` | `inherit`, `hide`, `show` | No | What whoever has no access sees: same as the section, nothing, or the space with a padlock |
| `section_id` | id | No | Moves the space to this section |
| `mode` | `single`, `multi` | No | Only in a Courses or Surveys space: switches the mode. For `single`, the space can have at most one course or one survey (drafts, archived and closed ones count); with more, the switch is refused and nothing is deleted |
| `feed_scope` | `space`, `section` | No | Feed spaces only: `space` shows only this space's posts, `section` brings together every space in the section. Changes no other setting of the space |
| `feed_widgets` | `events`, `trending`, `new_members`, `leaderboard` (yes or no), or `null` | No | Feed spaces only, owner and admin: turns the [side column](/espacos/feed#side-column) widgets on or off; only the keys sent change, and `null` goes back to the default (events and trending on). On another module the API refuses. |
| `layout` | text or `null` | No | The space's [display](/conceitos/espacos#display), among those the module offers (`layouts` in `list_space_modules`); `null` goes back to the module's default. `showcase` (Showcase) is Courses only: in another module, the request is refused with the way to `list_space_modules` |

**Returns:** the updated space.

**Ask like this:** *"Swap the icon of the Jobs space for a briefcase."* · *"Give each space in the Learn section a different icon, matching its theme."*

## `update_section`

<span class="tool-kind tool-kind-write">Changes</span>

**Edit section.** Renames a menu section, changes its description or icon, or makes it the home section. Only what is sent changes. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section` | id, address or name | Yes | From `get_community_context` |
| `title` | text, up to 255 | No | |
| `description` | plain text | No | No formatting: Markdown marks are stripped |
| `icon` | text | No | |
| `is_home` | yes or no | No | The section that opens first |
| `locked_display` | `hide`, `section`, `section_and_spaces` | No | What whoever has no access sees: nothing, only the section line with a padlock, or the section and its spaces with a padlock |
| `badge_ids` | list of ids or names | No | Private section: the badges that unlock the section (from `list_badges`). Absent keeps the ones that already unlock it; `[]` removes them all |
| `min_level` | number or id | No | The minimum level (1 is the first, or the id from `get_ranking_levels`): whoever is at it or above gets in. `null` removes; absent keeps |

**Ask like this:** *"Rename the Learn section to Courses and make it the home section."* · *"Show the Club section with a padlock to whoever doesn't subscribe."* (calls `update_section` with `locked_display: section_and_spaces`)

**Notes:** who sees the section changes with [`update_space_access`](#update-space-access). `locked_display` has no effect on a public section or on a team-only one (Private with nobody on the list), which never shows with a padlock.

## `reorder_sections`

<span class="tool-kind tool-kind-write">Changes</span>

**Reorder sections.** Puts the menu sections in a new order, top to bottom. The ones left out keep their order, after these. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section_ids` | list of ids | Yes | From `get_community_context`, in the new order |

**Ask like this:** *"Put the Events section right after Community."*

## `reorder_spaces`

<span class="tool-kind tool-kind-write">Changes</span>

**Reorder spaces.** Puts a section's spaces in a new order. The ones left out keep their order, after these. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section` | id, address or name | Yes | The section |
| `space_ids` | list of ids | Yes | From `list_spaces`, in the new order |

**Ask like this:** *"In the Learn section, put the Excel from Scratch space first."*

**Notes:** to move a space to another section, use [`update_space`](#update-space) with `section_id`.

## `get_space_access`

<span class="tool-kind tool-kind-read">Read-only</span>

**See who gets in.** The **Who gets in** of a space or a section: the visibility and, when private, the groups, products, plans and badges (any one is enough). For a space, also what its section requires on top (`required_by_section`) and the products that open it from the products screen (`access_from_products`); `admin_only: true` when only the team gets in. *Minimum role: team (owner, admin, moderator and finance).* Also the minimum level (`min_level`: `id`, `level`, `name`, `min_points`), when there is one.

| Parameter | Type | Required | Description |
|---|---|---|---|
| `space` or `section` | id, link, slug or name | One of the two | The space or the section |

**Ask like this:** *"Who gets into the Veterans' Room?"*

**Notes:** to change it, use [`update_space_access`](#update-space-access).

## `update_space_access`

<span class="tool-kind tool-kind-write">Changes</span>

**Change who sees a space.** Sets who sees a space or a whole section and, in a space, who can post. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `space` or `section` | id, link, address or name | One of the two | The space or the section |
| `visibility` | `public`, `members`, `plan`, `private` | No | Public, members, any active subscription, or private |
| `group_ids` | list of ids | No | When private: the groups that get in (from `list_groups`) |
| `product_ids` | list of ids | No | When private: the products whose purchase unlocks it (from `list_products`) |
| `plan_ids` | list of ids | No | When private: the plans whose subscription unlocks it (from `list_plans`) |
| `badge_ids` | list of ids or names | No | When private: the badges that unlock it (from `list_badges`; private ones count). Absent keeps the ones that already unlock it; `[]` removes them all |
| `min_level` | number or id | No | The minimum level (1 is the first, or the id from `get_ranking_levels`): whoever is at it or above gets in. `null` removes; absent keeps |
| `can_create` | `anyone`, `staff`, `admins` | No | Space only: **Anyone**, **Staff** or **Admins** can post |

**Returns:** the updated space or section.

**Ask like this:** *"Make the Excel from Scratch space visible only to people who bought the course product or subscribe to the Student plan."*

**Notes:** the groups, products and plans you send replace the ones that were there; any one of them is enough for a person to get in. A space is never more open than its section. It changes who sees what right away: ask the assistant to show you what will change first, if you want to check. See [Visibility and access](/conceitos/visibilidade-e-acesso).

**Notes:** each list sent (`group_ids`, `product_ids`, `plan_ids`, `badge_ids`) replaces only that list; the ones left out stay as they are. To check first, [`get_space_access`](#get-space-access).

## `delete_section`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Delete section.** Deletes a menu section. The section must be empty: if it still has spaces, the deletion is refused; delete them first with [`delete_space`](#delete-space). *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `section` | id, address or name | Yes | |

**Returns:** on the first call, the section, the spaces still in it (they must be deleted first) and the confirmation code.

## `delete_space`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Delete space.** Deletes a space, and what it holds, from the menu. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `space` | id, link, address or name | Yes | |

**Returns:** on the first call, the space, the module and the section, and the confirmation code.

## `get_community_settings`

<span class="tool-kind tool-kind-read">Read-only</span>

**View community settings.** The community's settings as they are. *Minimum role: admin.*

Parameters: none.

**Returns:** the name, the description, the colors (primary and secondary in hex, and the full scale), the logo, the favicon, the sharing image, the SEO, the entry rules (open sign-up, sign-up model, visitors), moderation and engagement. Nothing secret, such as integrations or DNS. From Google Analytics come the ID and, for the API secret, only whether it is set and its last 4 characters.

**Ask like this:** *"What are the community's colors and SEO right now?"*

**Minimum age:** also returns `minimum_age` (16 when the community has not set another) and `serves_minors`. See [Minimum age](/membros/cadastro-e-entrada#minimum-age).

**AI assistant access:** `get_community_settings` also returns `assistant_access` (`members`, `staff`, `admins`), and the moderator and finance can read it too. Writing the three switches (`assistant_members`, `assistant_staff`, `assistant_admins`) is for the **owner** only; the reply says who lost access, and the owner never locks themselves out. See [General settings](/configuracoes/configuracoes-gerais#ai-assistant).

For a Courses space, the summary says how many courses will be deleted with it, for example: *"Warning: this is a Courses space. Deleting it also deletes its 1 course. Enrollments and certificates already issued stay as they are, and no new certificates will be issued from those courses."* (plural: *"Warning: this is a Courses space. Deleting it also deletes its N courses. Enrollments and certificates already issued stay as they are, and no new certificates will be issued from those courses."*). Certificates already issued stay valid.

For the owner, shows the storage and monthly upload usage against the limits, with the warning (read-only; the platform sets the limits).

## `update_community_settings`

<span class="tool-kind tool-kind-write">Changes</span>

**Change community settings.** Changes the settings; only what is sent changes. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `name`, `description` | text | No | The community's name and description |
| `seo_title`, `seo_description` | text | No | See [Images and SEO](/configuracoes/imagens-e-seo) |
| `google_site_verification`, `bing_site_verification` | text or `null` | No | The Google Search Console and Bing Webmaster Tools verification code: the code or the whole `<meta>` tag (only the code is kept); `null` or empty removes it. See [Verify the community on Google and Bing](/configuracoes/buscadores-e-ias#verify-the-community-on-google-and-bing) |
| `signup_mode` | `open`, `approval`, `closed` | No | **Who can join**: **Open**, **With approval** (sign-ups become requests, see [`list_signup_requests`](/mcp/ferramentas-membros#list-signup-requests)) or **Closed**. Don't send it together with `signup_open`. When leaving `approval`, the answer says how many requests stay in the queue (`pending_signup_requests`) |
| `signup_open` | yes or no | No | Anyone can sign up (with `signup_mode` available, prefer it) |
| `signup_model` | `FREE`, `PAID` | No | |
| `guest_access` | yes or no | No | Visitors see what is public |
| `content_moderation` | yes or no | No | |
| `global_ranking` | yes or no | No | |
| `language` | `pt-BR`, `pt-PT`, `en-US`, `es-ES`, `es-MX`, `es-AR`, `it-IT`, `de-DE`, `de-AT`, `de-CH` | No | The community's language: the one used for e-mails and for anyone who hasn't picked a language yet. See [Languages](/configuracoes/idiomas) |
| `assistant_members` | true/false | No | Owner only. Lets members use the AI assistant |
| `assistant_staff` | true/false | No | Owner only. Lets in moderators, finance and admins |
| `assistant_admins` | true/false | No | Owner only. Lets in only the admins (use with `assistant_staff` off to restrict further) |
| `member_api_keys` | true/false | No | Owner only. Members may create personal API keys (the team always may); off, members' keys stop at once, without being deleted, and come back when it's turned on again |
| `minimum_age` | number from 16 to 99, or `null` | No | Owner only. The [minimum age](/membros/cadastro-e-entrada#minimum-age) to have an account; `null` or 16 go back to the platform's 16 |
| `serves_minors` | true/false | No | Owner only. **This community serves minors** |
| `linkedin_id` | number | No | The community's LinkedIn page ID, for certificates |
| `ga_api_secret` | text, 8 to 100 (letters, digits, `_` and `-`) | No | The GA4 Measurement Protocol API secret; `null` clears it. With it, Memberfy sends your GA4 the purchases and refunds. It never comes back: the summary shows only the last 4 characters and the call log hides it. See [Google Analytics](/configuracoes/google-analytics) |
| `logo_url` or `logo_base64` | link or file | No | The logo |
| `favicon_url` or `favicon_base64` | link or file | No | The favicon |
| `share_image_url` or `share_image_base64` | link or file | No | The image shown when someone shares the link |

**Returns:** the applied settings, with the **before → after** of each field.

**Ask like this:** *"Change the primary color to #4F46E5 and use this logo: https://…"*

**Notes:** all of this shows to the whole community as soon as the call runs; to undo it, ask again with the old value, which is in the **before → after**. Domain and integrations can't be changed here. See [General settings](/configuracoes/configuracoes-gerais).

**Member pages**. `public_member_pages` (`true` or `false`, off by default) turns on member pages that open without signing in, for people who set their Header to Public. `member_page_ceilings` is the most open level allowed per section: `header` and `about` `PUBLIC` or `MEMBERS`; `location`, `experience` and `activity` `PUBLIC`, `MEMBERS` or `PRIVATE`; `fields` `MEMBERS` or `PRIVATE`. Only the sections sent change; `null` goes back to the default. Owner and admin; `get_community_settings` shows both. See [Your profile](/membros/seu-perfil#for-the-team-member-pages).

**Drops in comments.** `drops_in_comments` (`true` or `false`, off by default; owner and admin) turns on Drops in post and short-post comments, like the app's **Allow Drops in comments** switch. See [Drops](/espacos/drops).

## `update_community_appearance`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Change the logo for dark backgrounds.** Uploads, replaces or removes the **Logo for dark backgrounds**, always with confirmation, showing the **before → after**. The mode and the menu belong to the theme: see [Themes](#themes). *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `dark_logo_url` or `dark_logo_base64` | link or file | No | The **Logo for dark backgrounds**; ideally a PNG with a transparent background. It does not replace the regular logo |
| `remove_dark_logo` | yes or no | No | Removes the logo for dark backgrounds |

**Ask like this:** *"Use this logo for dark backgrounds: https://…"*: the first call returns the summary (before → after) and the `confirmation_token`; the change only applies after your yes.

**Notes:** `get_community_settings` shows the theme in `appearance` (`mode`, `effective_mode`, `dark_logo_url`, `dark_mode_allowed` and `sidebar_default`, read from the active theme). Only Memberfy enables the dark theme, never the assistant. See [Dark mode](/configuracoes/modo-escuro).

## `get_notification_settings`

<span class="tool-kind tool-kind-read">Read-only</span>

**See sale notices.** Where the community's notices go: the e-mail that receives a notice for every sale., and whether the abandoned-cart recovery e-mail is on (`abandonedCartEmailEnabled`). *Minimum role: admin.*

Parameters: none.

**Ask like this:** *"Who gets the notice when a sale comes in?"*

## `update_notification_settings`

<span class="tool-kind tool-kind-write">Changes</span>

**Change sale notices.** Sets the e-mail that receives a notice for every sale and turns the abandoned carts' [recovery e-mail](/pagamentos/carrinhos-abandonados#the-recovery-e-mail) on or off. It only changes what you ask for: the other field stays as it is. Runs on the first call, without confirmation. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `sales_notification_email` | e-mail | No | Empty (`""`) turns the notices off |
| `abandoned_cart_email_enabled` | yes or no | No | Turns the recovery e-mail on or off |

One of the two is required.

**Ask like this:** *"Send the sale notices to finance\@memberfy.net."* · *"Turn on the recovery e-mail for abandoned carts."*

See [Sales notices](/notificacoes/avisos-de-venda) and [Abandoned carts](/pagamentos/carrinhos-abandonados).

## Icons

Spaces use the same icons as the dashboard picker. The assistant gets the list with what each one is for (in `get_community_context`, field `available_icons`, and in the tool descriptions) and is told to pick by theme, without always repeating the same one. If it doesn't pick, Memberfy picks from the title (*Live schedule* gets `calendar`, *Jobs* gets `briefcase`) or, with no clue in the title, from the module (Courses gets `book-open`, Gallery gets `image`).

Some examples: `calendar` (events, schedule), `book-open` (courses, lessons), `graduation-cap` (training, mentoring), `megaphone` (announcements), `message-square` (forum, questions), `briefcase` (career, jobs), `image` (gallery, photos), `trophy` (engagement, challenges), `shopping-bag` (store), `crown` (premium, VIP), `lock` (private).

## `get_connection_diagnostics`

<span class="tool-kind tool-kind-read">Read-only</span>

**Connection diagnostics.** Tells whether the tool list the assistant is using is up to date. *Minimum role: admin (owner or admin).*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `connection_id` | id | No | Without it, this conversation's connection |

**Returns:** the assistant, who authorized it and when, the server version and the list the connection would get now (the list's code and how many tools), what it received last time, the last call and the last attempt to use a tool it doesn't have, and `listUpToDate`. When `listUpToDate` is false, the assistant has the old list: open a new conversation or reconnect the connector.

**Ask like this:** *"One of your calls failed. Is your Memberfy tool list up to date?"*

## `get_email_stats`

<span class="tool-kind tool-kind-read">Read-only</span>

**Community e-mails.** The delivery numbers of the e-mails the community sent (invites, certificates, notices…). *Minimum role: admin.*

Parameters: none.

**Returns:** total, sent, failed, pending, delivered, opened, clicked, bounced and complaints, with the rates.

**Ask like this:** *"Did the invites arrive?"*

## `get_email_notice_recipient_count`

<span class="tool-kind tool-kind-read">Read-only</span>

**How many will get it.** The "N people" of the **Notify by e-mail** box: how many people will get the new content notice of a publication, already without those who turned the category off and without you. Nobody sees a person's preference. *Minimum role: moderator or finance.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `type` | `event`, `course`, `call_for_papers`, `survey`, `post`, `download`, `product` | Yes | The item type |
| `item_id` | id | No | The item, when it already exists |
| `space_id` | id | No | The space, to count before the item exists |
| `visibility` | `public`, `members`, `plan`, `private` | No | Visibility, to count an event or post before it exists |

**Returns:** `recipient_count` and, for an item that already sent its notice, `already_notified`. See [New content notices by e-mail](/notificacoes/avisos-de-novidade).

**Ask like this:** *"If I publish this event now, how many people get the e-mail?"*

## `list_integrations`

<span class="tool-kind tool-kind-read">Read-only</span>

**Integrations.** What is connected to the community from outside: the personal [API keys](/configuracoes/integracoes-e-apis) that a CRM, n8n or a script use to call the API and, for owner and admin, the community's [webhooks](/configuracoes/integracoes-e-apis#webhooks) and [ready-made integrations](/integracoes/integracoes-prontas). It only lists: creating, renaming, changing IPs and revoking a key; creating, editing, testing, resending, disabling and deleting a webhook; and turning on, testing, disabling and removing an app, happen on screen only; no secret or credential ever comes back. *Minimum role: any (the whole community's keys, the webhooks and the apps: owner or admin).*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `scope` | `mine`, `community` | No | `mine` (default): your keys. `community`: everyone's, only for owner and admin; other roles get a refusal |
| `member_id` | member id | No | With `scope: community`: only that person's keys |
| `status` | `active`, `revoked`, `expired`, `stopped` | No | Only the keys in that status (`stopped`: the owner left the community) |
| `type` | `api_keys`, `webhooks`, `apps` | No | A single type. Without it, everything your role sees. `webhooks` and `apps` are for owner and admin only; other roles get a refusal |

**Returns:** each key with its name, the key start (`mfk_7Hq2Lx9a…`), the scopes (module and level, with the screen's names in your language: *Bookings · read*), the status, the owner, the allowed IPs, the last use, the last refused IP, the expiration and, if revoked, when and by whom. For owner and admin, in any `scope`, the webhooks come too: the URL masked in the middle (never the full one or the secret), the description, the events, the status (`ACTIVE`, `DISABLED`, `DISABLED_FAILING`: disabled after failures), whether it uses fixed IPs, the last successful delivery, the failures in a row, the last delivery and, when it's failing, the latest failed deliveries (without the body), plus the community's webhook limit. And the apps (Discord, Slack, Telegram, RD Station, HubSpot) that were ever turned on, on or off: the name, the status (`ACTIVE`, `DISABLED`, `DISABLED_FAILING`), the events, the last successful delivery, the failures in a row, when it was turned on and changed and, when it's failing, the latest failed deliveries (without the body). **The app's settings never come back**, not even masked; the Zapier, Make and n8n shortcuts show up as webhooks. If the integrations service doesn't answer, the keys still come, with a notice. On the community list, it suggests [`list_activity_logs`](/mcp/ferramentas-membros#list-activity-logs) with `source: apiKeys` to see what the keys did; [`list_logs`](/mcp/ferramentas-membros#list-logs) with `type: apiKeys` reads the same in the Logs.

**Ask like this:** *"Which API keys do I have?"* · *"Is any webhook failing? Why?"* · *"Is HubSpot on? Did it fail?"* · *"Which community keys are active, and whose are they?"*

## E-mail campaigns

Draft, audience, test and send of an [e-mail campaign](/notificacoes/campanhas-de-email). The tools live on this page, under **Community and structure**.

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `list_campaigns` | Lists the campaigns, with the last send and the numbers; `status` and the send period `sent_from`/`sent_to` | Team (owner, admin, moderator, finance) | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_campaign` | One campaign: subject, blocks, audience, status and the 10 latest sends, with totals for delivered, opens, clicks, bounces and complaints | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_campaign` | Creates a draft (text, button and image blocks; audience); sends nothing | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_campaign` | Edits a draft; blocks and audience replace the whole value | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `preview_campaign_audience` | Who would receive it: how many in the selection, how many the exclusion removed, how many are left out and why, and a sample with masked e-mails | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `send_campaign_test` | Sends the campaign only to your own e-mail, with [Test] in the subject; does not use the quota (up to 10 per hour) | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `send_campaign` | Sends now to the whole audience, with confirmation and `consent` | Owner or admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_campaign_quota` | How many sends the community used and still has today, this week and this month, and when it resets; `recipients.viaOwnProvider` counts what left through the community's [Resend account](#get-email-provider) | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `delete_campaign` | Deletes a draft (a sent campaign stays in the history) | Team | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `list_campaign_opt_outs` | Who unsubscribed, with masked e-mail, scope, date and source | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_campaign_variables` | The per-recipient campaign variables (`{{nome}}`, `{{lider}}`…), with name, description and example | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_campaign_from_content` | Creates a campaign draft from a published post (`content_id`), with the audience of people who can access it; sends nothing | Team | <span class="tool-kind tool-kind-write">Changes</span> |

**From a post**. `create_campaign_from_content` (`content_id`, from `list_posts`) does what **Create email** does in the app: it creates the draft with the title, the subtitle, the cover, the whole text and the buttons, and the post's `item_access` audience. It asks for no confirmation, because nothing goes out. `create_campaign`, `update_campaign` and `preview_campaign_audience` accept `item_access: { type: "content", id }` in the audience, exclusive like `all` (`exclude` applies), recalculated on every send; the preview and the `send_campaign` and `schedule_campaign` confirmations show the post title and how many people receive it (*"people with access to {title}: N people"*) and, if the post went offline (deleted or no longer public) after the draft, warn that nobody will receive the campaign. A post that is a draft, private, pending or rejected in moderation comes back as text, with a step to `list_posts`. `get_campaign` carries `sourceItem`, the source post. Workflows do not accept `item_access`. See [Send a post by e-mail](/notificacoes/campanhas-de-email#send-a-post-by-e-mail).

**Sending.** `send_campaign` is a bulk send that cannot be undone and uses one send of the quota. It requires `consent: true` (the person confirms the recipients are community members who accept announcements). The first call returns only the summary (subject, audience total, how many are left out, quota left) and a `confirmation_token`; the assistant shows the summary and only repeats the call with the code after an explicit yes. See [Money and confirmation](/mcp/dinheiro-e-confirmacao).

**Excluding from the audience.** `create_campaign`, `update_campaign` and `preview_campaign_audience` accept, in the audience, `exclude: { group_ids, tags, member_ids }`: anyone matching an exclusion is out, even if they are in an included group or tag. On its own the exclusion picks nobody. The preview and the confirmation of `send_campaign` and `schedule_campaign` carry the summary sentence (`audience_summary`): *"1,240 people in the selection, 312 excluded by the rule, 9 unsubscribed, bounced or complained: 919 will receive it."* The audience and the exclusion also accept `fields`, the [custom field](/membros/campos-customizados) conditions: each with `field` (id or key), `operator` (`one_of`, `contains_any`, `contains_all`, `is_true`, `is_false`) and `values`, up to 10 conditions in total, including and excluding together. A `422` points to `list_member_fields`, with the fields and options. Warnings about a field that changed show in `note` on `get_campaign` and in the preview, and the `send_campaign` and `schedule_campaign` confirmation repeats them (`field_warnings`).

**Sent in a period.** `list_campaigns` takes `sent_from` and `sent_to` (YYYY-MM-DD, whole days in the community time zone, both included; one side alone leaves the other open): it keeps the campaigns, manual and automatic, with a send that started in the period, the same rule as `get_campaign_stats`. *"Which campaigns went out last week?"*

**Refusals that come back as text.** An empty subject or content, an empty audience or one over 20,000 people (`422`), and an exhausted quota (`429`, saying the limit and when it frees up).

**Ask like this:** *"Create a campaign for the March cohort group with the opening-class notice, show who receives it and send me a test."*

Another 14 tools complete campaigns through the assistant:

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `schedule_campaign` | Schedules the send (once, every day or weekdays), with summary, quota and `consent` | Owner or admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `pause_campaign` | Pauses a scheduled or sending campaign | Owner or admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `resume_campaign` | Resumes a paused campaign | Owner or admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `cancel_campaign` | Cancels the campaign (what already went out stays sent) | Owner or admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `list_campaign_runs` | A campaign's sends, with the numbers | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `campaign_report` | The sum of all sends: delivered, opens, clicks, bounces and complaints | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `preview_campaign` | The e-mail as it would go out now, without sending or using quota | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_automatic_campaigns` | The automatic e-mails and whether they are on | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_automatic_campaign` | Turns an automatic on or off and adjusts it; always confirms, and requires `consent` when turning on | Owner or admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `upload_campaign_image` | Uploads an image for a block, by link or file | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_campaign_image` | Deletes an uploaded image (confirms) | Team | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_campaign_stats` | The numbers of every campaign over a period (default: 30 days), compared with the previous period, with each metric's sentence | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_campaign_block_items` | The products, events or courses a block accepts (only what everyone sees), with search and pages | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `duplicate_campaign` | Creates a *Copy of…* draft with the original's subject, blocks and audience; sends nothing (automatics are not duplicated) | Team | <span class="tool-kind tool-kind-write">Changes</span> |

`create_campaign` and `update_campaign` also accept the blocks `latestPosts`, `upcomingEvents`, `newCourses`, `newClassifieds`, `course`, `event` and `product`. The last three take 1 to 6 items (`course_ids`, `event_ids`, `product_ids`), which go out in a grid of 2 per row; the ids come from `list_campaign_block_items`, and an item not everyone sees comes back with the block's sentence and a hint.

**Variables.** The subject, the preview text and the text and button blocks take [per-recipient variables](/notificacoes/campanhas-de-email#per-recipient-variables): `{{nome}}`, `{{lider}}`, `{{pontos}}`… (or the English aliases `{{first_name}}`, `{{leader}}`, `{{points}}`) and a fallback after `\|`, like `{{leader\|our team}}`. `list_campaign_variables` gives the list, including the [custom fields](/membros/campos-customizados) (`{{field_company}}`, in the `customFields` group). A variable that does not exist is refused with a sentence naming the field and the name (*subject: "xyz"*), and the suggested next step is `list_campaign_variables`. `preview_campaign` and `send_campaign_test` fill them with the data of whoever asks. Avoid `{{tags}}` if the community uses internal tags: each person reads their own.

## E-mail library and default e-mails

| Tool | What it does | Minimum role | Kind |
|---|---|---|---|
| `list_emails` | The library's e-mails, with their languages and where they are used | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_email` | An e-mail, with its versions per language | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_email` | Creates an e-mail in the library | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_email` | Renames the e-mail or changes the main language | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_email_version` | Saves the version of a language | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_email_version` | Deletes the version of a language | Team | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_email_usages` | Where the e-mail is used | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `duplicate_email` | Copies the e-mail with all its versions | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_email` | Deletes the e-mail; shows first where it is used | Team | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `preview_email` | Shows how the e-mail arrives, with your details | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `send_email_test` | Sends a test only to you | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_default_emails` | The default e-mails, with their state and customized languages | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_default_email` | A default e-mail, with its fixed blocks and allowed variables | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_default_email_version` | The community's version in a language | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_default_email_version` | Saves the community's version in a language | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_default_email` | Turns the community's version on or off | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `restore_default_email` | Restores the default in a language, with no way back | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `preview_default_email` | Shows how the default e-mail arrives | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `send_default_email_test` | Sends a test of the default e-mail only to you | Admin | <span class="tool-kind tool-kind-write">Changes</span> |

`create_campaign` and `update_campaign` take `email_id` (so `subject` is not needed); direct content still works. The fixed blocks come and go as `{ type: system_slot, slot }`, and a version without them is refused with the blocks that are missing. The test never goes to another address.

**Ask like this:** *"Change the Portuguese sign-up welcome to a shorter text"*, *"Where is the November news e-mail used?"*

## Workflows

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `list_workflow_triggers` | The triggers, with the filters and the ones that act on an item | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_workflows` | The workflows, with the state and the runs | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_workflow` | One workflow, with the design | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `simulate_workflow` | Walks the workflow with one person, without sending anything; with `send_emails_to_me`, sends the simulation's e-mails only to you (*[Test]* in the subject, up to 10 per simulation and 10 such simulations an hour) | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_workflow_estimate` | How many people fired the trigger in 1, 7 and 30 days (or today, on a date trigger) | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_workflow_runs` | A workflow's runs | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_workflow_run` | One run, with the steps | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_member_workflow_history` | The workflows a person went through | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_workflow_templates` | The 9 templates | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_workflow_senders` | Who on the team agreed to sign messages | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_my_workflow_sender_consent` | Agrees or stops agreeing to sign workflow messages (only your own) | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_my_pending_sender_approvals` | Your pending approvals of texts in your name | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `approve_sender_approval` | Approves a version's texts in your name | Team | <span class="tool-kind tool-kind-write">Changes</span> |
| `revoke_sender_approval` | Revokes an approval of yours | Team | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `create_workflow` | Creates a draft workflow (trigger, filter, entry, frequency, design) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `create_workflow_from_template` | Creates a draft from a template, without sending anything | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_workflow` | Edits the workflow; if it is on, saves a new version | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_workflow` | Deletes a workflow that is off; the history stays | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `send_workflow_test` | Sends a step's e-mail only to you | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `activate_workflow` | Turns it on; first shows the trigger, the e-mails and the estimate (a date trigger asks for `consent`) | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `pause_workflow` | Pauses: nobody new enters and each person stops where they are | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `resume_workflow` | Resumes; first shows the summary | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `cancel_workflow_run` | Ends one person's run | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

The design goes to the API as it is: waits, conditions, library e-mails, message, comment, reaction, tag, group, Slack and While, with the app's limits; `layout` keeps the canvas positions. When the community's sending is [suspended](/notificacoes/reputacao-de-envio), turning on and resuming answer with the end date and the reason.

| Tool | What it does | Minimum role | Kind |
|---|---|---|---|
| `run_workflow` | Starts the workflow for chosen people or an audience (**Manual** trigger); the first call only counts who enters and asks for your confirmation | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `stop_workflow` | Stops the workflow: no one new enters and the runs under way are canceled; first shows how many | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_workflow_summary` | The 7- and 30-day success rate, the skipped steps, the error logs, who is waiting for quota and the latest errors | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_workflow_variables` | The variables that reach a block, grouped by the block they come from (also for a design not saved yet) | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `preview_workflow_text` | A text with the variables filled with sample data, as it goes out in the DM, the e-mail or Slack | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_workflow_settings` | On whose behalf workflows send DMs, comment and react | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_workflow_settings` | Switches to **The whole team** or **Owner only**; first shows the change | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_workflow_webhook` | The status of a **Webhook received** trigger's address, never the token | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_workflow_webhook` | Creates the address; the token and the secret are shown once | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `rotate_workflow_webhook` | Rotates the token and the secret | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `revoke_workflow_webhook` | Revokes the address | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `list_workflow_webhook_deliveries` | The calls received, with the result of each one | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_workflow_guide` | The workflow guide, one section at a time (overview, triggers, blocks, rules, variables, lifecycle, recipes, cautions), in the connection's language | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `suggest_workflow` | Turns a rule in words, or a recipe, into a draft design, with the questions to confirm and the calls; saves nothing | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `delete_workflow_run` | Deletes a finished run from the history; it still counts toward how many times the person enters | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `clear_workflow_runs` | Deletes a workflow's finished runs from the history, all of them or up to a date; shows how many first | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `list_env` | The keys in **Variables and keys**: name, end of the value, allowed hosts and last use, never the value | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `set_env` | Creates or replaces a key, with the allowed hosts (optional: empty means any address); the value never comes back in a response | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `delete_env` | Deletes a key: the value is erased and the blocks that use it go down the error path | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_ai_limits` | The [AI limits](/notificacoes/workflows#ai-limits): the token ceilings per call, per run and per day, whether they are the defaults and how much was used today | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_ai_limits` | Changes the ceilings (those left out stay as they are); per call up to per run, and per run up to per day | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `get_signing_secret` | The **Call webhook** signing secret: whether it exists, its ending and when it was created, never the value | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_signing_secret` | Generates the signing secret, shown only in this answer; with `rotate: true` it replaces the current one and asks to confirm | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_signing_secret` | Deletes the secret: calls stop being signed | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

- **One trigger per workflow.** `create_workflow` and `update_workflow` take a single trigger block, the **End: success** and **End: error** blocks (`endSuccess`, `endError`), the actions' error exit, the **Write to log** block (`log`), each block's name, dotted variables (`{{course.name}}`) and the condition's **Variable** rule, with operators by type. A refused design comes back with `graph_errors` (the block, the code and the message), such as `singleTriggerOnly`, `pathWithoutEnd` and `variableUnavailable`.
- The `manual`, `schedule`, `webhook.received`, `member.returned` and `message.received` (DM received) triggers, and each module's lifecycle. `list_workflow_triggers` says, for each trigger, how many times it happens (`occurs`) and its variables.
- `simulate_workflow` shows the filled-in texts and the expected end; `get_workflow_run` shows the steps that failed or are waiting for quota (`FAILED`, `DEFERRED`); `list_workflows` brings the period, how many are on and the plan's maximum (turning on beyond it is refused before the confirmation); `activate_workflow` takes `include_existing` on the *Someone has not signed in for N days* trigger; `list_workflow_templates` brings each template's steps; `list_logs` takes the `workflows` source, with the workflow and the level.
- **On whose behalf:** the individual consent and the text approvals (`update_my_workflow_sender_consent`, `list_my_pending_sender_approvals`, `approve_sender_approval`, `revoke_sender_approval`) are no longer used; the signer follows the community's setting, and a step on behalf of someone not allowed is skipped (`senderNotAllowed`).

- **The automation guide.** For the team, the assistant knows that a need that repeats, depends on a condition or on an event is solved with a workflow: it reads the guide (`get_workflow_guide`, also as the `memberfy://guides/workflows` resource), with 61 ready-made recipes (community, badges, courses, events, sales, HR, coworking, CRM by webhook, scheduled and manual), and builds the draft with `suggest_workflow`. The **Automate a rule with a workflow** recipe does the whole path: guide, draft, e-mails, simulation, test, estimate and turning it on with confirmation.
- **Next steps.** After sending or scheduling a campaign, issuing a certificate, inviting or importing members and opening a review cycle, the `next_steps` suggest `suggest_workflow` with the matching recipe.
- **New blocks:** `http` (**Call webhook**: method, address, headers, body, a maximum time of 2 to 15 seconds, `{{env.NAME}}` only in the headers and the body and only for the allowed hosts, `{{steps.<block>.status|duration|size|body.<field>}}`), `platformAction` (the platform actions, with each one's minimum role, from `list_workflow_triggers`), `runWorkflow` and the `workflow.called` trigger (with the values returned by **End: success**).
- **Which role the steps act with:** that of whoever saves, turns on, resumes or runs the workflow; an action above that role comes back in `graph_errors` (`actionAboveRole`).
- **AI blocks and new actions.** The `ai` block (**Claude** and **ChatGPT**, with the community's own API key in `keyEnv`; the models and limits come from `list_workflow_triggers`, in `ai_providers` and `ai_node`) and the actions `content.post.create`, `certificate.issue`, `recognition.give`, `chat.block`, `oneOnOne.schedule` and `developmentPlan.action.add`. The admin acts like the owner; an `ownerOnly` action would show as `owner`, and none is today. New recipes: *Feed post for a graduate*, *Certificate on check-in*, *Recognition for a passed quiz*, *Block the chat of a tagged account*, *Recurring 1:1 for who joins a team*, *Development plan action after a review* and, with a key in the vault, *Welcome DM written by AI*, *Support ticket triage with AI* and *Form answer summary with AI*.

- **SMS and WhatsApp.** The `sendSms` and `sendWhatsapp` blocks (`text` up to 300 characters, with variables; the community's name and, on SMS, the opt-out link are added when sending). `list_workflow_triggers` has `sms_node` and `whatsapp_node`: the limit, the 24-hour rule and the out-of-window template, the skip reasons (through "ok"), the wait reasons (quiet hours, daily cap, monthly quota) and the error ones. New recipes: *Welcome by SMS*, *Event registration confirmed by SMS*, *Event rescheduled by SMS*, *Payment overdue by SMS*, *1:1 tomorrow by SMS*, *Event registration confirmed by WhatsApp*, *Payment overdue by WhatsApp* and *Waitlist seat by WhatsApp* (whoever cannot get WhatsApp gets the e-mail).

See [Workflows](/notificacoes/workflows) and [Incoming webhook](/integracoes/webhook-de-entrada).

**Ask like this:** *"I want whoever buys the course to get 7 days of access to the mentoring: build the workflow"*, *"Keep our CRM token in the vault, only for api.hubspot.com"*, *"Delete the test runs up to yesterday from the history"*, *"Create the welcome series from the template"*, *"How many people would enter the win-back workflow today?"*, *"Simulate the welcome workflow with Maria."*

## Sending reputation

When the community's sending is [suspended](/notificacoes/reputacao-de-envio), the tools that send (sends, automatic e-mails, turning on or resuming workflows) answer with the end date and the reason. `get_community_context` brings the sending reputation to the team (the alert, only to the owner and the admin), with the tips. For the SuperAdmin, in the Memberfy community:

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `list_sending_reputation` | The communities on alert or suspended | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_community_sending_reputation` | A community's sending reputation, with its suspensions | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `lift_community_sending_suspension` | Releases a community's sending, with the reason | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_community_sending_reputation_settings` | Changes a community's limits | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |

## Plan and extensions

11 tools for what the Memberfy plan includes. See [Plan and extensions](/configuracoes/plano).

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `list_entitlement_catalog` | The catalog of plan variables: included members, extra members, the mark and the Planning & HR and Coworking extensions | Any | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_plan_entitlements` | What the community's plan includes, where each value comes from (never the reason for an exception), member usage and locked extensions | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_space_modules` | The space modules by **Add Space** tab, with `locked` when the extension is not in the plan | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_entitlement_values` | What a Memberfy plan or add-on includes | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_entitlement_values` | Changes what a plan or add-on includes; applies to every community on it | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `get_entitlement_defaults` | The default for communities without a plan | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_entitlement_defaults` | Changes the default for communities without a plan | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_entitlement_overrides` | A community's exceptions, with value, reason and validity | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_entitlement_override` | Creates an exception (one per variable), with an internal reason and validity | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_entitlement_override` | Changes an exception's value, reason or validity | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `delete_entitlement_override` | Ends an exception now; the record is kept | SuperAdmin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

The SuperAdmin tools only work when connected to the Memberfy community. When the extension is not in the plan, `create_space`, `update_space` and `update_space_access` return `MODULE_LOCKED`, and the assistant explains that the extension has to be added. Spaces that already existed stay, for the owner, admin and moderator only.

## Memberfy directory

4 tools for the [Memberfy directory](/configuracoes/diretorio-da-memberfy) (hub.memberfy.net). None asks for confirmation: they move no money, send no e-mail and delete nothing, and a removal is undone by putting the community back.

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `get_hub_listing` | How the community shows in the directory: listed, category, cover, member count, a removal by Memberfy (date and reason) and the categories | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_hub_listing` | Turns the listing on or off and changes the category, cover (an `https` link) and member count; only what is sent changes | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `get_community_hub_listing` | One community's state in the directory: whether the owner left it listed, the category and whether Memberfy took it out (date and reason) | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_community_hub_listing` | Takes a community out of the directory, with a required reason of 10 to 2,000 characters that the owner sees in Settings, or puts it back; the owner's option does not change | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |

**Ask like this:**

- *"List my community under Technology with this cover"* (`update_hub_listing`);
- *"Is my community in the directory?"* (`get_hub_listing`; if Memberfy took it out, the assistant gives the reason and date);
- for the SuperAdmin: *"Take community X out of the directory with this reason"* (`update_community_hub_listing`).

The two SuperAdmin tools only work connected to the Memberfy community, and every removal or return goes to the community's history.

## Themes

9 tools for the community's [theme](/configuracoes/cores): mode, colors, fonts, corners, density and the navigation (the menu's starting state, the top bar and the hidden native elements). All of them are for the owner and the admin. Activating, restoring and deleting ask to confirm (the first call returns the summary and the `confirmation_token`); creating only asks when it also activates the theme.

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `list_theme_presets` | The ready-made themes (Light, Dark, Premium dark, Ocean, Forest, Editorial), with the preview and whether they are available (the dark ones depend on the dark theme being enabled) | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `list_community_themes` | The community's saved themes (up to 10), with the active one marked | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_community_theme` | One theme with all its values; without `theme_id`, the active one | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `create_community_theme` | Saves a theme from a ready-made one (`preset_key`) or a saved one (`source_theme_id`), with changes in `values`; `origin: "image"` keeps the proposal from `suggest_community_theme_from_logo`; `activate: true` also activates it (asks to confirm) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `update_community_theme` | Changes a theme's name or values; without `theme_id`, the active one, and the community changes right away: it is the way to change colors, mode, fonts, corners, density or the menu | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `activate_community_theme` | Switches the theme for the whole community, showing the before → after | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `restore_community_theme` | Takes the theme back to its original values; the name stays | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `delete_community_theme` | Deletes a saved theme (the active one can't be deleted) | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `suggest_community_theme_from_logo` | Proposes a theme with the colors of the community's logo, with guaranteed contrast, **without saving**. Uses 1 AI use from the plan | Admin | <span class="tool-kind tool-kind-write">Changes</span> |

Removed from other tools: `primary_color`, `secondary_color`, `reset_colors` and `mobile_bar_color` from [`update_community_settings`](#update-community-settings); `mode` and `sidebar_default` from [`update_community_appearance`](#update-community-appearance), which keeps the logo for dark backgrounds.

**Ask like this:**

- *"Which themes does the community have and which one is active?"* (`list_community_themes`);
- *"Create a Christmas theme based on Forest, with the red #B91C1C as the primary color"* (`create_community_theme`);
- *"Change the heading font to Manrope"* (`update_community_theme`, on the active theme);
- *"Activate the Christmas theme"* (`activate_community_theme`, after your yes);
- *"Put the navigation on top and hide the language selector"* (`update_community_theme`, with `navigation.layout: "top"` and `navigation.hidden_native: ["language_selector"]`). `hidden_native` is the whole list (`[]` shows everything), only with `people`, `leaderboard`, `organized_events`, `language_selector`, `report_problem` and `presence`; the bell, billing notices, My Account, Settings and Administration can never be hidden;
- *"Suggest a theme with our logo's colors"* (`suggest_community_theme_from_logo`; to keep it, `create_community_theme` with `origin: "image"`).

**Notes:** through the assistant, the proposal comes only from the community's logo; any other image is uploaded in the app (**Generate from an image**). Without a logo, or with a logo that can't be read as an image, `422`; AI quota used up, `429`. A dark or automatic theme without the dark theme enabled: refused.

## Custom domain

8 tools for the community's [custom domain](/configuracoes/dominio-proprio). Only removing asks to confirm: adding or changing keeps the old domain up until the new one becomes active, so it runs on the first call.

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `get_custom_domain` | The Memberfy address, the primary address, the active domain and the one being set up, with the DNS record to create, the step and the error with what to do | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `set_custom_domain` | Adds the domain or changes the current one, without downtime, and returns the DNS record to create | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `check_custom_domain` | The **Check now**: checks DNS, certificate and address right away; a failed request starts over, with another 7 days | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `remove_custom_domain` | Removes the domain (the community stays at the Memberfy address) or only gives up the one being set up | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `get_community_custom_domain` | The same as `get_custom_domain`, for one community (`community_id`) | SuperAdmin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `set_community_custom_domain` | Adds or changes a community's domain; only this tool moves on a domain another community has already used | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `check_community_custom_domain` | Checks a community's domain now | SuperAdmin | <span class="tool-kind tool-kind-write">Changes</span> |
| `remove_community_custom_domain` | Removes a community's domain, or gives up the request | SuperAdmin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

After adding, the assistant shows the record to create (type, name and target) and suggests checking again in a few minutes; the automatic checks keep going on their own, and the owner gets the email when the domain becomes active. Each step's error message comes translated, so the assistant shows it as it is. The SuperAdmin tools only work connected to the Memberfy community.

**Ask like this:**

- *"Put the community at community.papodesysadmin.org. What record do I create in DNS?"* (`set_custom_domain`);
- *"Is my domain active yet?"* (`get_custom_domain` or `check_custom_domain`);
- *"Change the domain to members.papodesysadmin.org without taking the current one down"* (`set_custom_domain`);
- *"Give up the domain that's being set up"* (`remove_custom_domain`, with `scope: pending`, after your yes).

See [recipe 95](/mcp/receitas#95-put-the-community-on-your-custom-domain).

## SMS and WhatsApp

8 tools for the [SMS and WhatsApp notices](/notificacoes/avisos-por-sms-e-whatsapp) channels. Turning a channel on needs the daily cap (`daily_cap`, from 1 to 50,000). Sending works for every country except those in `blocked_countries` (today, SMS to the United States). WhatsApp is on the Business and Scale plans (`upgrade_required` says when it's missing) and only goes out in approved templates, never as free text. The tests send a real message to **your** verified phone, so they ask for confirmation: the summary shows the masked phone, the consent and today's usage.

| Tool | What it does | Minimum role | Type |
|---|---|---|---|
| `get_sms_settings` | The SMS channel: on or off, the daily cap, the plan's quota and today's and this month's usage, in messages and parts; never a price | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_sms_settings` | Turns SMS on or off and changes the daily cap and the per-person limit (`person_daily_cap`, 1 to 20, 5 by default: workflow messages per person per day, in each channel) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `send_sms_test` | A test SMS to your phone, under every rule; says whether it was queued, when it goes out or why it was skipped | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |
| `count_sms_segments` | The parts and encoding of a text, alone and as sent (with *[Community]* in front and the opt-out link); sends nothing | Team | <span class="tool-kind tool-kind-read">Read-only</span> |
| `get_whatsapp_settings` | The WhatsApp channel: on or off, the daily cap, the plan's quota and usage, the platform messages (`moments`, with each one's default), `blocked_countries`, `person_daily_cap` and `upgrade_required` | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `update_whatsapp_settings` | Turns WhatsApp on or off, changes the daily cap and turns each platform message on or off for the community (`moments: { key: true/false }`) | Admin | <span class="tool-kind tool-kind-write">Changes</span> |
| `list_whatsapp_templates` | Memberfy's WhatsApp templates, with each one's status, type (service or marketing) and fields (**Community notice** carries a text of your own) | Admin | <span class="tool-kind tool-kind-read">Read-only</span> |
| `send_whatsapp_test` | A test WhatsApp to your phone, in an approved template, under every rule | Admin | <span class="tool-kind tool-kind-confirm">Asks to confirm</span> |

The `next_steps` lead from the settings to the test, from a skipped test to what is missing (phone, code, consent) and from the code to turning the notices on.

**Ask like this:**

- *"Turn on the community's SMS with a cap of 500 a day and send me a test."* (`update_sms_settings`, then `send_sms_test` after your yes);
- *"How much WhatsApp have we used this month?"* (`get_whatsapp_settings`);
- *"Does this text fit in one SMS?"* (`count_sms_segments`);
- *"Is the WhatsApp notice template approved yet?"* (`list_whatsapp_templates`);
- *"Don't send the new-content WhatsApp in this community."* (`update_whatsapp_settings` with `moments`);
- *"Allow at most 3 workflow messages per person per day."* (`update_sms_settings` with `person_daily_cap`).

## Sending through your Resend account

4 tools for [sending through your Resend account](/notificacoes/envio-pela-sua-conta-resend), on the Business plan or above. Connecting, the API key and the webhook secret stay in the app: no tool takes the key, and no answer shows more than its last 4 characters. Only disconnecting asks to confirm.

## `get_email_provider`

<span class="tool-kind tool-kind-read">Read-only</span>

**See sending through the Resend account.** Whether the community sends its e-mails through its own Resend account: configured or not, whether the plan allows it (`plan_allowed`), the status (`pending`: waiting for the verification; `active`: e-mails leave through it; `error`: the key was refused and everything falls back to Memberfy; `paused_by_plan`: the plan no longer allows it), the sender (`from_email`, `from_name`, `reply_to`), the last 4 characters of the key and of the webhook secret, the last error and when it was verified. Logins, security and team notices always leave through Memberfy. *Minimum role: admin.*

Parameters: none.

**Ask like this:** *"Are the community's e-mails already going out through our Resend account?"*

## `update_email_provider`

<span class="tool-kind tool-kind-write">Changes</span>

**Change the sender.** Changes the sender of a connection that already exists. A new `from_email` starts the check over (status `pending`): then run [`verify_email_provider`](#verify-email-provider). Without a connection, the assistant points to the app. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `from_email` | e-mail | No | An address of the domain verified in Resend; a free mailbox or a Memberfy address is refused |
| `from_name` | text, up to 120 characters | No | The sender name |
| `reply_to` | e-mail | No | Where replies go; `null` clears it |

**Ask like this:** *"Change the sender name to Papo de Sysadmin and send replies to maria\@memberfy.net."*

## `verify_email_provider`

<span class="tool-kind tool-kind-write">Changes</span>

**Verify the Resend account.** Sends the verification e-mail: a test from the sender, through the community's key, to your address. A refusal (key, unverified domain, limit) comes back in the API's words and the connection stays pending; an accepted test turns the connection active once Resend reports it delivered, in seconds to minutes (check with [`get_email_provider`](#get-email-provider)). *Minimum role: admin.*

Parameters: none.

**Ask like this:** *"Verify our Resend account."*

## `disconnect_email_provider`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Disconnect the Resend account.** Wipes the key and the webhook secret at once, and every e-mail, including what is being sent, leaves through Memberfy again. Connecting again needs the key and the secret typed in the app. Asks to confirm. *Minimum role: admin.*

Parameters: none.

**Ask like this:** *"Disconnect the community's Resend account."*

## Video signing keys

4 tools for the Bunny Stream and Cloudflare Stream signing keys: with the key saved, lessons and posts with videos from those providers play signed (see [Courses](/espacos/cursos#hosted-video-and-file)). The key only goes in, never comes back (only the last 4 characters) and is kept out of the assistant's log. Only deleting asks to confirm.

## `list_video_keys`

<span class="tool-kind tool-kind-read">Read-only</span>

**See the video keys.** Per provider (`bunny`, `cloudflare`): whether there is a key, the mask and the last 4 characters, the status (`unverified`, `valid` or `invalid`, when its players show *"video unavailable"*) and when it was checked, never the value; and `signed_ttl_seconds`, how long a player's signed link lasts. *Minimum role: admin.*

Parameters: none.

**Ask like this:** *"Is the Bunny key valid?"*

## `update_video_key`

<span class="tool-kind tool-kind-write">Changes</span>

**Save a video key.** Saves or replaces a provider's signing key. A wrong combination (a field of the other provider) is refused before any call, and a malformed key comes back in the API's words. The key starts `unverified`: then run [`verify_video_key`](#verify-video-key) with a link to one of the provider's videos. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `provider` | `bunny` or `cloudflare` | Yes |  |
| `token_key` | text | No | Bunny only: the library's embed token authentication key |
| `key_id` | text | No | Cloudflare only: the signing key id |
| `private_key` | text | No | Cloudflare only: the signing key (PEM, base64, text or JWK) |

**Ask like this:** *"Save the Bunny token key of our library."*

**Notes:** the key never comes back in an answer and is kept out of the assistant's audit log.

## `verify_video_key`

<span class="tool-kind tool-kind-write">Changes</span>

**Check a video key.** Signs the link of a video of the same provider and asks the provider once: accepted, the key turns `valid`; refused, `invalid` (its players show *"video unavailable"* until a good key is saved). An unknown video or a link of another provider is refused; with no answer from the provider, the status stays. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `provider` | `bunny` or `cloudflare` | Yes |  |
| `video_url` | link | Yes | A video of that provider |

**Ask like this:** *"Check the Cloudflare key with this video."*

## `delete_video_key`

<span class="tool-kind tool-kind-confirm">Asks to confirm</span>

**Delete a video key.** Wipes the key at once, and that provider's videos go out unsigned again (and stop playing if the library requires a token). Asks to confirm, with the key's mask. *Minimum role: admin.*

| Parameter | Type | Required | Description |
|---|---|---|---|
| `provider` | `bunny` or `cloudflare` | Yes |  |

**Ask like this:** *"Delete the Bunny key."*

## Related

- [Tools](/mcp/ferramentas)
- [Recipes](/mcp/receitas)
- [Money and confirmation](/mcp/dinheiro-e-confirmacao)
