FL

FlowCastle

ai.flowcastle/flowcastle

Build, edit, and deploy Telegram bots on FlowCastle's hosted visual flow platform.

Yes, your AI can use this right now.Answered a live MCP handshake in 453 ms with no sign-in needed and exposes 60 tools.

Use Telegram with: ChatGPT · Claude · Cursor · Claude Code · VS Code

Is this your server? Claim the listing. Verified adds a vendor-confirmed mark on this page and matching app pages.
Claim with Verified — $49/moWant it in front of people comparing Developer Tools tools? Feature it — $149/mo

Connect it

Settings → Connectors → Add custom connector
URL: https://api.flowcastle.ai/api/mcp

60 tools, pulled live

Pulled straight from the server with tools/list on 2026-10-27.
list_applicationsread-only

List the applications this API key can access, with the caller role and the permissions it grants. Start here when using a personal API key (usr_...): every other tool needs an explicit applicationId, which this tool supplies. Read-only, takes no arguments. Returns an array of { id, name, role, permissions }; an empty array means the key is valid but belongs to no application yet.

create_application

Create a new application (workspace) owned by the caller. Requires a personal API key (usr_...) — application-scoped keys cannot create applications. Seeds default flows unless skipDefaultFlows is true. Creates persistent state and is NOT idempotent: calling it twice creates two applications. Returns the new application id, which you then pass as applicationId to the other tools.

update_applicationcan modify

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.

import_website_knowledge

Crawl a website into a knowledge base so an AI_TOOL_ROUTER can answer from it. Creates a new base (named after the host) unless knowledgeBaseId is given. Honours robots.txt, skips junk and duplicate pages, keeps blog posts by default, and caps at maxPages. Returns at once with a job to poll via get_website_import. Prefer this over writing facts about a site you have not read.

get_website_importread-only

Status of a website import started by import_website_knowledge or an import_website_into_knowledge_base action: stage, progress, counters, warnings and the pages that were not imported. Read-only. Poll until status is DONE, DONE_WITH_ERRORS or FAILED.

list_watched_groupsread-only

List the group/channel chats a telegram_mtproto userbot monitors. Read-only. The watched list is the single source of truth for which chats the userbot processes: messages from unlisted group/channel chats are dropped (fail closed) and their contacts never materialize; DMs always pass. botId may be omitted when the application has exactly one userbot.

list_telegram_operationsread-only

Discover supported Telegram MTProto account operations, input schemas, permissions and limits. Requires manage_broadcasts. All current operations read public data; this catalog does not connect to Telegram. botId may be omitted when the application has exactly one userbot.

execute_telegram_operation

Submit one supported read operation on the connected telegram_mtproto account. Call list_telegram_operations for the input schema. Returns a requestId; poll get_telegram_operation until completed, error or timed_out. Requires manage_broadcasts. Nothing is sent, joined, marked as read, viewed or clicked. One operation per account, a 60-second deadline, shared read limits, and persistent flood coold

get_telegram_operationread-only

Read a Telegram operation status and result using its requestId and the same applicationId/botId used for submission. Requires manage_broadcasts for the owning application. Poll every two seconds. Results expire one hour after their last update. timed_out means no result arrived within 60 seconds; an offline or restarted runtime needs a new request. For throttling errors, respect error.retryAfterS

set_watched_groupscan modify

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 JOI

sync_dialog_contacts

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 d

get_workspace_summaryread-only

Return a compact application, flow, sequence, operation, and bot summary — the cheapest way to orient in a workspace. Read-only, no side effects. Deliberately omits variables and full flow graphs: use get_variable_context for variables, get_flow_context for a flow's topology, and get_application_context when you need flows, bots, and variables together.

get_variable_contextread-only

Search variable definitions by scope and keyword, or read one variable by id. Read-only. Returns { variables, total, returned, truncated } — compare returned against total to detect a cut-off result set and re-call with a higher limit. Values are withheld unless includeValues is true; in a list each value is cut to a 500-character preview, while variableId + includeValues returns that one value in

get_application_contextread-only

Return the full application-level automation context in one read-only call: every flow (with folders), connected bots, variables, sequences, and operations. This is the broad orientation call — prefer get_workspace_summary when you only need names and counts, since this response grows with workspace size. Operation graphs are hidden flows and appear only in the operations list, never in flows. app

get_module_catalogread-only

Return a compact index of both installed and available marketplace modules, with each module's key, versions, description, actions, and triggers. Read-only. Start here when you need a capability the core action kinds do not cover; then call get_module_details for the exact input fields of one module, and install_module to add it. Returns a summary only — action input fields and setup requirements

get_module_detailsread-only

Return everything needed to use one module: action input fields and their types, trigger configuration, manual setup fields (credentials an operator must fill in the dashboard), and references to already-installed actions. Read-only. Call get_module_catalog first to obtain moduleKey, and call this again after install_module to read the installed action references you need when drafting actions. An

install_module

Install an exact marketplace module version into an application and create any missing installed-template actions. Requires the manage_automation permission. Call get_module_catalog first to select the module and version, then get_module_details after installation to inspect setup requirements and installed action references. Safe to re-run: installing a version that is already installed only fill

search_flowsread-only

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,

get_flow_contextread-only

Return one flow's graph topology: its blocks in reading order from the start block, a short summary per block, and where each block and each menu button leads (links[].to, menu.buttons[].to). Read-only. Deliberately omits block data, action configs and the ids of buttons, actions, links and condition rules to stay cheap, and returns message text and condition operands only as cut *Preview fields (

get_block_detailsread-only

Return the complete contents of one block: block data, action configs, HTTP request bodies, custom-code files, triggers, menu payloads, and media paths. Read-only. This is the heaviest read in the API — call get_flow_context first to find the block you need rather than walking a flow block by block. Always read a block before updating it: update_block keeps every setting you leave out and replaces

get_action_schemaread-only

Read-only, needs no API key. The action-authoring contract apply_actions batches are validated against. With NO arguments, returns an INDEX of block types, actions, action kinds and topics with descriptions and sizes. Then request only what this bot uses. Detail responses include essential rules and basic shapes; follow `seeWhen` before using specialized features: templateExpressions for computed

get_design_guidelinesread-only

Return the flow-design rules that validation does NOT enforce: when to split a branch into its own flow, how navigation and menus must be wired, and worked examples. Read-only, needs no API key. Called with NO arguments it returns a compact INDEX: the short rules every batch needs, in full, plus every other section and example with one line saying when you need it. Call it a second time naming onl

get_funnel_analyticsread-only

Return the measured conversion funnels of the workspace's ENTRY flows over the last 30 days, busiest first: how many new contacts entered, which blocks they reached, the share who stop at each block, which buttons lead nowhere (pressed then silence), and how many recorded a goal. `dropoff` names the stage with the worst stop RATE and is null when no stage is bad enough to act on — a large `stopped

get_flow_analyticsread-only

Measure how NAMED flows are actually used over the last 30 days: how many contacts entered each one, where inside it they stop (per block, with the stop RATE), how many were answered by a human agent afterwards, and how many hit an error. Unlike get_funnel_analytics this works for ANY flow — including one reached from a menu button, a sequence, or an operator handoff, which the funnel cannot see a

get_survey_resultsread-only

Read what customers ANSWERED in this workspace's surveys. A survey is any flow marked isSurvey: its choice questions record which option each contact tapped, and its free-text questions store the reply the contact typed. Called with NO flowId it lists every survey flow with how many people it reached, how many answered, the response rate and how many wrote a free-text answer. Called with a flowId

search_flow_examplesread-only

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 mat

get_flow_exampleread-only

Return one reusable flow example by id, optionally with a complete action batch you can adapt and pass to apply_actions. Read-only, needs no API key. Call search_flow_examples first to find the id.

validate_actionsread-only

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 d

apply_actionscan modify

Validate and apply a batch of flow-builder actions — the single write path for editing flows, blocks, variables, broadcasts, sequences, and folders. Call this directly; a separate validate_actions call beforehand is unnecessary. Broadcasts have no dedicated tool and are managed here: create_broadcast makes a DRAFT (it owns its flow via data.flowId — add the message blocks in the same batch, no sep

deploy_applicationcan modify

Publish the workspace to its bots — the API equivalent of the dashboard's Deploy button. This is the step that makes edits live. apply_actions writes to the DRAFT graph. Until this runs the connected bots keep serving the previously published version, so a change that looks applied has no effect for real users. Deploy after a batch of edits (and after run_flow_autotest passes), not after every sin

run_flow_autotestread-only

Runs deterministic behavioural tests against flows that are ALREADY applied (compiles them to an AST and simulates a user). Call after apply_actions to verify a build; read `summary` and the failed checks, patch with apply_actions, re-run. Mutates nothing. The smoke layer runs on its own with no input: it walks every entry, taps every button, answers every input step, and reports crashes, dead but

send_messagecan modify

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

send_flow_to_contactscan modify

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 f

read_messagesread-only

Read the message transcript: what users sent the bot and what the bot sent back, newest first. Source is the runtime's own message ledger, written by the bot as it handled each turn — inbound messages are recorded before any routing decision, so messages that matched no trigger are here too. Filter by contactId for one conversation, botId for one channel, direction for one side, actor_type for who

list_contactsread-only

List and search contacts in the application, paginated, newest first. Read-only. Filters combine as AND; search matches name, username, email, phone, and platformId; `tags` / `tagIds` keep only contacts carrying at least one of those tags (UTM attribution tags are named "utm: <slug>" — discover them with list_contact_tags). `total` is the full match count, so `limit: 1` counts an audience cheaply.

list_bot_chatsread-only

List the groups and channels the application's bots were added to, newest first: title, kind, the numeric chatId a flow uses to address the chat, when the bot was added, and the bot's status and rights there (is it an administrator, can it invite or remove members). Read-only. A chat appears once the bot is added to it; when the owner's chat is missing, the bot is not in it yet. Use this instead o

list_contact_tagsread-only

List the contact tags in use in the application (or one bot) with how many contacts carry each, most-used first. Read-only. This is the attribution view: UTM tags ("utm: <slug>", set by ?start=utm--<slug> deep links, one per ad or campaign) show how many contacts each source brought in; other tags are manual or flow-assigned segments. Only tags attached to at least one contact in scope appear. Pas

get_contactread-only

Return one contact's full profile plus every contact-variable value stored for them. Read-only. Values may hold personal data; variables of type SECRET are always redacted. Call list_contacts first to find the contactId.

get_contact_activityread-only

Return one contact's engagement history: goals they achieved and buttons they clicked, newest first, plus all-time goal totals. Read-only. This is the per-contact companion to get_broadcast_analytics (which is aggregate). Clicks are inline/menu button presses inside the bot — typed replies, commands and website visits never appear. Goals and clicks are capped separately by `limit`; goalsTruncated/

list_event_contactsread-only

The reverse lookup: which contacts triggered one analytics event — achieved a goal (kind GOAL + goalKey), clicked a button (BUTTON_CLICK + blockId, optionally buttonId/buttonIndex), were sent a block (BLOCK_SENT + blockId), or received a broadcast (BROADCAST_DELIVERED + broadcastId). Read-only, paginated, ordered by each contact's most recent matching event. Runs as SQL over the event tables, so i

create_contact

Create a contact manually — for imports or externally-sourced audiences; contacts who message a bot are created automatically. Requires the manage_broadcasts permission. platformId must be unique within the bot (duplicate fails with 409); botId may be omitted only when the application has exactly one bot. The variables map takes variable NAMES (or full folder paths when a name is ambiguous) — not

update_contactcan modify

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 t

list_broadcastsread-only

List broadcasts in the application with status, schedule, and delivery counts. Read-only. Filters combine as AND. Note that delivery counts report messages attempted, not confirmed deliveries. recipientCount is the number of delivery rows once the broadcast has started sending. Before that it is a live count of the audience only when the audience has no filter. null means NOT COMPUTED, never zero:

get_broadcast_detailsread-only

Return full details for a single broadcast: status, schedule, recurrence rule, linked flow, and delivery breakdown by status. recipientCount is the number of delivery rows once the broadcast has started sending. Before that it is a live count of the audience only when the audience has no filter. null means NOT COMPUTED, never zero: a filtered audience is evaluated when the broadcast sends, and get

get_broadcast_analyticsread-only

Return engagement analytics for a broadcast: delivery breakdown by status plus per-message-block sent and clicked counts for its flow, over an optional date window. Read-only. Sent counts reflect messages attempted, not confirmed deliveries.

list_releasesread-only

List the application's releases, newest first. A release is a frozen copy of everything the editor held when it was published (flows, steps, menus, actions, variables), stored with the rows' own ids. Each entry has its number, when and how it was made (DASHBOARD, MCP, AI_REPUBLISH, BOT_CREATE, or RESTORE_SAFETY: the editor saved right before a restore), an optional note, flow and step counts, and

restore_releasecan modify

Put an earlier release back into the editor: every flow, step, menu, action and variable returns exactly as it was, under the same ids, so running conversations, scheduled steps and buttons users already received keep working. Nothing is lost: the current editor state is saved first as a RESTORE_SAFETY release, or, when it already equals a recent release, that release is reused (either way returne

list_pulse_itemsread-only

List Pulse items — the workspace attention queue. Two kinds: `attention` is an observed problem a detector found (failing flows, a failed broadcast, an unsubscribe spike), `recommendation` is a proposed improvement. Read-only. Defaults to open items, ordered by severity then due time, the same order as the dashboard. Each item carries the measured evidence behind it; the conversations and log rows

get_pulse_itemread-only

Return one Pulse item in full: the measured evidence, the ids of the conversations and execution-log rows behind it, and the change Apply would build if the item carries one. Read-only. Call list_pulse_items first to get the itemId. Note `resolutionPolicy`: an `automatic` item closes itself when its condition clears; update_pulse_item cannot `resolve` it, only `acknowledge` it (close it as seen).

update_pulse_itemcan modify

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 re

list_follow_up_tasksread-only

List follow-up tasks — reminders for a person to get back to a contact. Read-only, ordered by due time so overdue work comes first. A follow-up sends nothing by itself. Scopes: `mine` is the open work assigned to the key's owner and needs a personal key; `unassigned` is unowned open work; `team` is all open work; `completed` is closed history. `unassigned`, `team` and `completed` reach past the ca

create_follow_up_task

Create a follow-up reminder for a person to get back to a contact. Creates persistent state and is NOT idempotent: calling it twice creates two reminders. Nothing is sent when it comes due — it is a to-do, not an automation; use send_message or a broadcast to actually message someone. It stays open until someone completes it: a reply from the contact does not close a reminder created here (only th

update_follow_up_taskcan modify

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.

query_flow_logsread-only

Read the bot execution log (flow_execution_log) — the record of what the runtime actually did, and the only place that separates "the action ran" from "the action produced output". Read-only; requires the view_logs permission. Two modes: without groupBy it returns the newest matching rows, with groupBy it returns a grouped rollup ("what is failing right now") — group by `error` for distinct failur

get_tribute_setupread-only

Read the Tribute one-time payment setup of an application: whether a Tribute account is connected, the notification link and whether the owner confirmed it, the products set up here, the number contact variables a purchase can add to, and nextSteps (what is still missing, in order; empty means ready to sell). Read-only; requires manage_automation. Start here for anything about Tribute. Three thing

list_tribute_account_productsread-only

List the digital products in the owner's connected Tribute account, read live from Tribute, 100 per page, newest first. Read-only; requires manage_automation. Each product says whether it can be set up (only an approved digital product can) and whether it already is. Fails with TRIBUTE_NOT_CONNECTED when no account is connected and TRIBUTE_UNAVAILABLE when Tribute does not answer. Products are cre

save_tribute_productcan modify

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 i

update_tribute_connectioncan modify

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

list_tribute_purchasesread-only

List the Tribute payments the application received, newest first, 50 per call. Read-only; requires read_payments. Each row has the payment state, the delivery state and, when delivery needs a person, the reason. An empty list means no payment notification has arrived (or no account is connected).

retry_tribute_deliverycan modify

Queue one Tribute payment for delivery again, for a payment that was paid but not delivered. Requires recover_payments. It queues, it does not deliver in the call: read list_tribute_purchases afterwards. Refused with TRIBUTE_REVIEW_REQUIRED for a payment that has a reviewReason.

Alternatives in Developer Tools

Compare →
Try “Notion”, “Stripe”, “create invoice”, “browser”