FlowCastle
REMOTE · API.FLOWCASTLE.AI
Build, edit, and deploy Telegram bots on FlowCastle's hosted visual flow platform.
Available components
Last scanned (55 minutes ago)
Scores higher than 76% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Workflow Automation
Recent critical change
Authorization (29 Jul 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security63
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (update_application). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability63
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 20691 tokens (~323/item across 64 items; 64 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 5 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 64 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 0
- Stability: 0.97 → pass security
- 4 Nov 26 0
- New tool “delete_task”, which the server declares destructive security
- New tool “update_task”, which the server declares destructive security
- Tool “create_follow_up_task” rewrote its description, which is the text the model reads security
- Stability: pass → 0.97 functional
- New tool “create_task” functional
- New tool “list_tasks” functional
- 29 Oct 26 0
- Tool “create_follow_up_task” rewrote its description, which is the text the model reads security
- Tool “get_flow_analytics” rewrote its description, which is the text the model reads security
- Tool “get_funnel_analytics” rewrote its description, which is the text the model reads security
- Tool “query_flow_logs” rewrote its description, which is the text the model reads security
- 27 Oct 26 0
- Tool “apply_actions” rewrote its description, which is the text the model reads security
- 25 Oct 26 0
- Tool “query_flow_logs” rewrote its description, which is the text the model reads security
- Tool “deploy_application” is now declared destructive security
- Tool “retry_tribute_delivery” is now declared destructive security
- Tool “save_tribute_product” is now declared destructive security
- Tool “send_flow_to_contacts” is now declared destructive security
- Tool “send_message” is now declared destructive security
- Tool “set_watched_groups” is now declared destructive security
- Tool “update_application” is now declared destructive security
- Tool “update_contact” is now declared destructive security
- Tool “update_follow_up_task” is now declared destructive security
- Tool “update_pulse_item” is now declared destructive security
- Tool “update_tribute_connection” is now declared destructive security
- “query_flow_logs” reworded the description of “level” cosmetic
- 22 Oct 26 0
- New tool “restore_release”, which the server declares destructive security
- Tool “deploy_application” rewrote its description, which is the text the model reads security
- Tool “send_message” rewrote its description, which is the text the model reads security
- New tool “list_releases” functional
- “send_message” added an optional parameter “parseMode” cosmetic
- “send_message” reworded the description of “text” cosmetic
- 20 Oct 26 0
- Tool “query_flow_logs” rewrote its description, which is the text the model reads security
- 19 Oct 26 0
- Tool “get_module_details” rewrote its description, which is the text the model reads security
- Tool “run_flow_autotest” rewrote its description, which is the text the model reads security
- “get_flow_example” added an optional parameter “locale” cosmetic
- “get_module_details” added an optional parameter “actions” cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://api.flowcastle.ai/api/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_256_GCM_SHA384 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.flowcastle.ai | CN=YR2,O=Let's Encrypt,C=US | 13 Oct 2026 | 11 Jan 2027 | RSA 2048 | SHA256-RSA | 6a73e1f9e226804d63f0582d211bd140515 |
| SANs: api.flowcastle.ai, flowcastle.ai, www.flowcastle.ai | ||||||
| CN=YR2,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | 4ebd24947e24d394802d84a52fd5b319 |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.flowcastle.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 1814, 3799 | 8, 8 | Verified |
| flowcastle.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15724800; includeSubDomains |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.flowcastle.ai/api/mcp | Verified | 200 | |
| http (plaintext) | http://api.flowcastle.ai/api/mcp | HTTPS enforced | 308 | https://api.flowcastle.ai/api/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
save_tribute_product ~365
Set up a product of the connected Tribute account for sale in this application, or change one already set up (one saved product per Tribute product, so calling it again updates). Requires manage_automation. Returns the saved product; its id is the productBindingId of a Payment block with provider TRIBUTE. A purchase always runs the Paid branch of that block; adding a number to a contact variable is optional. Once the product is published, what it adds is fixed (TRIBUTE_IMMUTABLE_BENEFIT): to change it the owner creates a new product in Tribute. Messages stay editable.
| Name | Type | Req | Description |
|---|---|---|---|
| addsToVariable | – | – | Optional balance top-up (credits, days, lessons). Omit to keep what is saved (nothing for a new product). null removes it. When set, the Paid branch must not add the same number again. |
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| messages | array | – | The owner's own messages to the buyer, per language. Omit to keep the saved ones; an array REPLACES all of them, and [] goes back to the built-in texts, which reach each buyer in their own language.… |
| productId | string | yes | Required. The Tribute product id: products[].productId from list_tribute_account_products. It must be an approved digital product. |
No output schema declared.
No examples provided.
search_flow_examples ~220
Search the library of reusable flow examples covering common business cases (lead capture, onboarding, payments, reminders). Read-only, needs no API key. Returns summaries to choose by — id, title, summary, useWhen, tags, requiredModules, hasSchemaExample — with no flow body; pass an id to get_flow_example for the full example. Calling it with no arguments returns the top examples, and a query matching nothing returns an empty list rather than an error.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | number | – | Maximum examples to return, between 1 and 8. Defaults to 3. Values outside that range are rejected. |
| query | string | – | Free-text keyword matched against example titles, summaries, and tags. Omit to browse without filtering. |
| tags | array | – | Filter: only examples carrying at least ONE of these tags are returned, e.g. ["payments","onboarding"]. With a query, the query ranks within that set (both must match). When no example carries any of… |
No output schema declared.
No examples provided.
search_flows ~458
Find every flow and block whose contents contain a keyword. Read-only. Searches message text and its translations, button labels and URLs, action names and configs, action input/output field paths and values, condition operands, trigger commands and payloads, custom-code files, and flow names and descriptions. A keyword matching a VARIABLE NAME also returns the blocks that reference that variable, which plain text search cannot do because blocks store variable ids, not names. `truncated` is true whenever a limit dropped something, and `cappedBy` names which: FLOW_LIMIT (more flows matched than `limit`), ROW_LIMIT (the 1000-match ceiling was hit; lower-ranked matches were not read), MATCHED_VARIABLES (the keyword matched more than 25 variable names — only the 25 closest, shortest name first, are resolved to the blocks that reference them, so blocks reading the others are MISSING), MATCHES_PER_FLOW (a flow lists at most 12 matches; its matchCount is the real number), MATCHES_PER_BLOCK (a block lists at most 3). A truncated answer is not proof that nothing else matches: narrow the keyword, or search the full variable name, before you rename or remove something on the strength of it. Use this instead of walking flows with get_flow_context when you know what the content says but not where it lives. Broadcast-backed flows and operation graphs are excluded — use list_broadcasts and the operations tools for those.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| limit | number | – | Maximum flows to return. Defaults to 30; values above 100 are clamped to 100. Check `truncated` and `cappedBy`: this is only one of the limits that can cut the answer. |
| query | string | yes | Required. Case-insensitive substring, at least 2 characters. Matched against text, not tokenised — search a distinctive phrase or a variable name rather than a single common word. |
No output schema declared.
No examples provided.
send_flow_to_contacts ~612
Run an EXISTING interactive flow for each listed contact right now, outside any trigger — as if each of them had just triggered it. Use it when the WHOLE message is the flow — its first block's text, media and buttons are what the recipient sees. To send your own custom text with buttons that run a flow on tap, prefer send_message with `buttons: [{ text, flowId }]`; it needs no wrapper flow. The flow starts at its start block for every recipient, and any `{{var|name}}` inside it resolves against that recipient's own variable context. No deploy is needed — the runtime compiles the flow on demand — but the flow must already be applied (use the ids apply_actions returned). Contacts are targeted by contactId only (from list_contacts), 1 to 50 per call. Duplicates are collapsed. Each contact is dispatched independently: one bad id fails its own row in `results` and the others still go out, so read `sent`/`failed`, not just the absence of an error. An unsubscribed contact, or a contact whose bot is not active, is refused — the same rule send_message applies. Nothing is queued for it; its row has `ok: false`, the reason in `error`, and `refused` set to `contact_unsubscribed` or `bot_inactive`. A sleeping bot is not refused: it is woken first. BROADCAST and OPERATION flows are rejected — a broadcast flow runs in an audience scope (send it with its broadcast) and an operation runs in system context (use run_operation). For a large audience this is the WRONG tool: create a broadcast whose flow filter selects the audience, and launch that once. Requires the send_flow_to_contact permission. NOT idempotent and not reversible — every call reaches real people again and a sent message cannot be recalled. Confirm the flow and the exact recipient list with the user before calling, and never retry a timed-out call blindly.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| contactIds | array | yes | Required. Between 1 and 50 FlowCastle contact ids (from list_contacts) — NOT platform ids. Each one receives its own run of the flow. |
| flowId | string | yes | Required. Id of the already-applied INTERACTIVE flow to run. Broadcast and operation flows are rejected. |
| params | array | – | Optional. Literal values for the flow's declared input params (see `inputParams` in get_flow_context), keyed by param id. They are run-scoped — the flow reads them as {{param|<paramId>}} — and a requ… |
No output schema declared.
No examples provided.
send_message ~1,168
Send a message to ONE contact right now, outside any flow. For reaching many contacts use a broadcast instead. Target the contact with contactId (globally unique — preferred), or with platformId (the platform-side id, e.g. the Telegram user id). platformId is NOT globally unique: it is unique only per bot, so the same Telegram user talking to two of your bots is two contacts sharing one platformId. Pass botId alongside it whenever the application has more than one bot; without botId the call succeeds only if exactly one contact in the application matches, and otherwise fails listing the candidate bots. `{{var|name}}` placeholders in the text resolve against that contact's variable context. Requires the manage_broadcasts permission. Formatting: plain text by default, so tags arrive exactly as written. Pass parseMode "HTML" to send Telegram HTML (<b>, <i>, <u>, <s>, <code>, <pre>, <a href="…">, <tg-spoiler>, <blockquote>; escape a literal <, > or & as < > &); the flow tokens [[b]]…[[/b]], [[i]], [[u]] and [[a|url]]…[[/a]] work too. Values filled in from what people typed are escaped, so they show as text and never add formatting. HTML that Telegram cannot parse is sent once more as plain text with the tags removed. Telegram bots and web chat only (web chat: not with media); refused for Instagram, mail, Telegram user accounts and SDK bots. Markdown is never rendered. Media: pass up to 10 attachments as publicly reachable http(s) URLs; the text becomes the caption (max 1024 characters) and may be empty. Several attachments send as one album. The kind is inferred from the URL's file extension — override with type when the URL has none. Not supported for SDK bots or for Telegram user-account bots (telegram_mtproto, text only) — the call is rejected and nothing is sent. Buttons: up to 8, each carrying EXACTLY ONE destination — a `url` (http(s) or tg://) the recipient opens, or a `flowId`, an already-applied INTERACTIVE flow that runs for that recipient when they…
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| botId | string | – | Bot to send from. Required in practice when targeting by platformId in a multi-bot application; without it the call succeeds only if exactly one contact matches, and otherwise fails listing the candi… |
| buttons | array | – | Up to 8 buttons, rendered one per row under the message. Each needs exactly one of url or flowId; the two kinds may be mixed. Rejected together with media. |
| contactId | string | – | Preferred way to target the recipient: the globally unique FlowCastle contact id. Supply either this or platformId. |
| media | array | – | Up to 10 attachments. Several items send as one album with `text` as the shared caption. |
| parseMode | string | – | Set to "HTML" to send the text (or caption) as Telegram HTML. Omit for plain text. |
| platformId | string | – | Platform-side user id (e.g. the Telegram user id). NOT globally unique — unique only per bot — so pass botId alongside it when the application has more than one bot. |
| text | string | – | Message body. Required unless media is passed; with media it becomes the caption (max 1024 characters) and may be omitted. `{{var|name}}` placeholders resolve against the recipient's variable context… |
No output schema declared.
No examples provided.
set_watched_groups ~280
Replace a telegram_mtproto userbot's watched-groups list — the chats it monitors. Requires the manage_settings permission. SET semantics: send the COMPLETE desired list every time (call list_watched_groups first and include existing entries you want to keep — omitting one removes it). Each entry needs a chatId (e.g. "-100…") or a public username/t.me link, and it must be a chat the account has JOINED: only joined chats can be watched. Watching a public chat without joining it is not available — an entry for a chat the account is not in is saved but never produces a message, so join the chat with the account first. The running userbot picks the change up within a few minutes, no restart. An empty list means "watch every joined chat" — NOT "watch nothing".
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| botId | string | – | The telegram_mtproto bot. Omit when the application has exactly one userbot. |
| groups | array | yes | The complete replacement list. Empty array = watch every joined chat. |
No output schema declared.
No examples provided.
sync_dialog_contacts ~335
Import a telegram_mtproto userbot's existing chats as contacts — DM partners, groups, and channels — so everything the account already talks to becomes a contact send_message can target without waiting for each chat to message first. Importing does not allow sending: send_message to these contacts is rejected until the account's owner turns on "Sending from this account" in the dashboard (OFF by default, no tool changes it), and then it sends text only — no media, no buttons. Requires the manage_broadcasts permission. Reads the account's dialog list live (the userbot must be connected; large accounts can take up to a minute) and creates missing contacts; existing contacts are untouched, so the call is idempotent. Pass kinds to narrow the import (e.g. ["group","channel"] to leave personal DMs out). Does NOT change the watched-groups list. botId may be omitted when the application has exactly one userbot.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| botId | string | – | The telegram_mtproto bot. Omit when the application has exactly one userbot. |
| kinds | array | – | Dialog kinds to import. Defaults to all three ("user" = the account's direct-message partners). |
| limit | integer | – | How many most-recent dialogs to read from the account. Defaults to 1000. |
No output schema declared.
No examples provided.
update_application ~511
Update application-level settings (name, active state, default language, language for everyone else, incoming-message behavior). Requires the manage_settings permission in that application. Only the fields you pass are changed; omitted fields keep their current value, so the call is idempotent. Returns the updated application.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| defaultLanguage | string | – | New default language. It is the SOURCE language of the application's content: every block text is taken to be written in it, and translations are made from it. Any ISO 639 base language tag is accept… |
| fallbackLanguage | string | – | Language for everyone else: the content language a contact gets when their own language is not one of the bot's languages (or unknown). Must be the default language or an enabled language; "" resets… |
| incomingMessageBehavior | string | – | What happens to an inbound message that matches no trigger: LIVE_CHAT routes it to a human operator, EXECUTE_FLOW runs the flow named by incomingMessageFlowId. Side effect of EXECUTE_FLOW: the platfo… |
| incomingMessageFlowId | string | – | Flow of this application to run for unmatched inbound messages. Required when incomingMessageBehavior is EXECUTE_FLOW. |
| isActive | boolean | – | Set false to deactivate the application — its bots stop responding. Omit to leave unchanged. |
| name | string | – | New display name. Omit to leave unchanged. |
No output schema declared.
No examples provided.
update_contact ~417
Update a contact's profile fields and/or contact-variable values. Requires the manage_broadcasts permission. Only the fields you pass are changed — omitted fields keep their current value — so the call is idempotent. The variables map takes variable NAMES (or full folder paths when a name is ambiguous), not ids; an unknown name fails with 422 before anything is written. Variable writes propagate to the live bot immediately (the runtime's cached values are invalidated). Setting status to "unsubscribed" stops broadcasts, sequences and direct sends for the contact. Setting it back to "subscribed" works only when a person on the team unsubscribed them; a contact who blocked the bot or used an unsubscribe link is refused with 409 and comes back only by writing to the bot again.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| contactId | string | yes | Required. Contact id, as returned by list_contacts. |
| string | – | New email. Omit to leave unchanged; empty string clears it. | |
| firstName | string | – | New first name. Omit to leave unchanged; empty string clears it. |
| lastName | string | – | New last name. Omit to leave unchanged; empty string clears it. |
| phone | string | – | New phone. Omit to leave unchanged; empty string clears it. |
| status | string | – | New subscription status ("subscribed" or "unsubscribed"). Omit to leave unchanged. |
| username | string | – | New platform username. Omit to leave unchanged; empty string clears it. |
| variables | object | – | Contact variable values to set, as { "variableName": "value" }. Keys are variable NAMES or full folder paths (not ids). Only the listed variables change. |
No output schema declared.
No examples provided.
update_follow_up_task ~269
Close, reopen, snooze, or reschedule one follow-up task. Completing it records that a person handled the reminder — it does not message the contact. Snoozing moves the due time too, so the task reappears when the snooze ends.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | complete: close it. reopen: reopen a completed one. snooze: push it out to a time. reschedule: change dueAt and/or reasonText. |
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| dueAt | string | – | New due time for `reschedule`. ISO 8601, in the future. |
| reason | string | – | Optional completion reason stored with a `complete`. Defaults to "completed_by_user". |
| reasonText | string | – | New reason line for `reschedule`. |
| snoozeUntil | string | – | Required for `snooze`. ISO 8601 timestamp in the future. |
| taskId | string | yes | Required. Follow-up task id, as returned by list_follow_up_tasks. |
No output schema declared.
No examples provided.
update_pulse_item ~563
Change one Pulse item's state. Every action changes the queue for the WHOLE workspace — an item belongs to the workspace, not to whoever called the tool, so dismissing a recommendation hides it from every member and records who decided that. `acknowledge` closes an attention item as seen, with no reason and no note — it is the only hand-close an `automatic` item accepts. `resolve` closes with a resolutionCode and is refused for an `automatic` item. Both need the permission for the item's source (manage_broadcasts for a broadcast, manage_automation for a flow, sequence or operation), and a critical item that is not `manual` by policy can be closed only by an owner or admin (a workspace key counts as owner); `resolve` on such an item also needs a note. Closing a card does not fix its cause, and it hides the problem: an item closed by hand is NOT raised again for 14 days, even while its detector still observes the condition. Only an anomaly the platform closed itself (resolutionCode `source_condition_cleared`) reopens at once when the condition returns. A dismissed recommendation returns by itself after the same cooldown. Does not apply a recommendation's proposed change — that is a dashboard action.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | acknowledge: close an attention item as seen (the only hand-close an `automatic` item accepts). resolve: close it with a reason (refused for an `automatic` item). dismiss/restore: hide or unhide a re… |
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| itemId | string | yes | Required. Pulse item id, as returned by list_pulse_items. |
| note | string | – | Free-text note stored with a `resolve`. Required when resolving a critical item that is not `manual` by policy. Ignored by `acknowledge`, which stores no note. |
| reason | string | – | Optional reason recorded with a `dismiss`, so a teammate can see why it was waved off. |
| resolutionCode | string | – | Required for `resolve`. reviewed = looked at it, no_action_needed = not a real problem, fixed_elsewhere = handled outside the platform. |
| snoozeUntil | string | – | Required for `snooze`. ISO 8601 timestamp in the future, e.g. "2026-09-15T09:00:00Z". |
No output schema declared.
No examples provided.
update_task ~517
Change one CRM task: its fields, its status, or which contacts it is linked to, in one call. Tasks live in CRM → Tasks. A task may stand alone or be linked to contacts. While leads are on for the workspace, linking parks the contact's open lead until the task is done (parkLeads, default true), and marking the task done brings the linked leads back to Waiting on us so someone tells them the result (Won and Lost leads are left alone unless named in returnContactIds). Deleting a task, or unlinking a contact, brings a lead parked on it back to Waiting on us. A task is internal work for the team: nothing is sent to anyone. Setting status "done" is what brings the linked leads back; it does not message anyone.
| Name | Type | Req | Description |
|---|---|---|---|
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| doneNote | string | – | With status "done": a note added to the history of the leads that come back, e.g. what was found. |
| dueAt | string|null | – | New due date, ISO 8601; null clears it. |
| link | string|null | – | New link; null clears it. |
| linkContactIds | array | – | Contacts to link, as returned by list_contacts. Already linked ones are skipped. |
| notes | string|null | – | New notes in Markdown; null clears them. |
| ownerUserId | string|null | – | New owner (a workspace member); null for nobody. |
| parkLeads | boolean | – | With linkContactIds: park the newly linked contacts' open leads until the task is done. Defaults to true. |
| returnContactIds | array | – | With status "done": which linked contacts come back to Waiting on us. Omit for every linked lead that is not Won or Lost. Leads parked on the task that are not named are Resolved. |
| status | string | – | todo, in_progress or done. Moving a done task back reopens it and changes no lead. |
| taskId | string | yes | Required. Task id, as returned by list_tasks or create_task. |
| title | string | – | New title. |
| unlinkContactIds | array | – | Contacts to unlink. A lead parked on this task comes back to Waiting on us. |
No output schema declared.
No examples provided.
update_tribute_connection ~320
Connect a Tribute account to the application or change the connection. Requires manage_settings. Pass at least one field; they are applied in the order apiKey, notificationsConfirmed, paused. Returns the same view as get_tribute_setup. The API key is stored encrypted and no tool returns it. Three things happen in the owner's Tribute account and no tool can do them: creating the API key, creating a digital product and getting it approved by Tribute, and saving the notification link in Tribute (Dashboard → Settings → API Keys → Webhook URL).
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | – | The owner's Tribute API key, exactly as they gave it. It is checked against Tribute before it is saved. Connects the account, or replaces the key of a connected one (the old key keeps verifying notif… |
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| notificationsConfirmed | boolean | – | Records that the owner saved connection.notificationUrl in Tribute. Set it only after the owner says so: nothing checks it, and a wrong "yes" means purchases are paid but never delivered. |
| paused | boolean | – | true stops offering new checkouts; purchases and refunds already made are still processed. false resumes sales. |
No output schema declared.
No examples provided.
validate_actions ~274
Dry-run validation of a proposed batch of flow-builder actions. Mutates nothing and is safe to repeat. OPTIONAL: apply_actions runs this exact validation itself and applies nothing when invalid, so calling validate_actions first is redundant — use it only to check a draft you do not intend to apply yet. Returns the same errors and warnings apply_actions would report. Note that passing validation does not mean the design is sound; structural rules live in get_design_guidelines.
| Name | Type | Req | Description |
|---|---|---|---|
| actions | array | yes | Ordered batch of at least one action, applied in array order. An invalid batch is rejected up front and applies nothing, but execution itself is NOT atomic: if an action fails mid-batch, execution st… |
| applicationId | string | – | Application (workspace) id. Optional: an application-scoped key (app_...) defaults to its own application, but a personal key (usr_...) has no default and omitting it fails with MCP_APPLICATION_REQUI… |
| conversationId | string | – | Optional id used to group the resulting audit records under one editing session. |
| flowId | string | – | Default flow id for actions in the batch that do not carry their own. Optional when every action targets an explicit flow. |
No output schema declared.
No examples provided.
How do I install the FlowCastle MCP server?
FlowCastle is a hosted endpoint at https://api.flowcastle.ai/api/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.flowcastle.ai
claude mcp add --transport http ai-flowcastle-flowcastle 'https://api.flowcastle.ai/api/mcp'
What is the FlowCastle MCP server?
FlowCastle is an MCP server listed in the public MCP registry as ai.flowcastle/flowcastle. Build, edit, and deploy Telegram bots on FlowCastle's hosted visual flow platform. This page covers its hosted endpoint (https://api.flowcastle.ai/api/mcp).
Is the FlowCastle MCP server safe to use?
FlowCastle scores 78 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the FlowCastle MCP server expose?
FlowCastle exposes 64 tools: list_applications, create_application, update_application, import_website_knowledge, get_website_import, and 59 more. Their descriptions and schemas cost roughly 20,691 tokens of context every time the server is loaded.
Does the FlowCastle MCP server require authentication?
No. We connected to FlowCastle without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the FlowCastle MCP server still maintained?
FlowCastle is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.