# FlowCastle (remote · api.flowcastle.ai)

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

- Trust score: 68/100 (medium)
- Change this week: +9
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

> **Recent critical change**: Authorization (2026-07-29). See the changelog below before you install this server.

## Components

- remote · `api.flowcastle.ai`: 68/100 (this document), [markdown](https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp.md), [page](https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp)

## Channel facts

- Endpoint: `https://api.flowcastle.ai/api/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (apply_actions).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 67/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4284 tokens (~204/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http ai-flowcastle-flowcastle https://api.flowcastle.ai/api/mcp
```

### Codex

```toml
[mcp_servers.ai-flowcastle-flowcastle]
url = "https://api.flowcastle.ai/api/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-flowcastle-flowcastle": {
      "type": "remote",
      "url": "https://api.flowcastle.ai/api/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-flowcastle-flowcastle --url https://api.flowcastle.ai/api/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-flowcastle-flowcastle:
    url: "https://api.flowcastle.ai/api/mcp"
```

### Other

```json
{
  "mcpServers": {
    "ai-flowcastle-flowcastle": {
      "type": "http",
      "url": "https://api.flowcastle.ai/api/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 66, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 65, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 65, +5)

- [critical regression] Authorization: unverified → fail
- [security] Tool “apply_actions” rewrote its description, which is the text the model reads
- [security] Tool “create_application” rewrote its description, which is the text the model reads
- [security] Tool “get_action_schema” rewrote its description, which is the text the model reads
- [security] Tool “get_application_context” rewrote its description, which is the text the model reads
- [security] Tool “get_block_details” rewrote its description, which is the text the model reads
- [security] Tool “get_broadcast_analytics” rewrote its description, which is the text the model reads
- [security] Tool “get_broadcast_details” rewrote its description, which is the text the model reads
- [security] Tool “get_design_guidelines” rewrote its description, which is the text the model reads
- [security] Tool “get_flow_context” rewrote its description, which is the text the model reads
- [security] Tool “get_flow_example” rewrote its description, which is the text the model reads
- [security] Tool “get_module_catalog” rewrote its description, which is the text the model reads
- [security] Tool “get_module_details” rewrote its description, which is the text the model reads
- [security] Tool “get_variable_context” rewrote its description, which is the text the model reads
- [security] Tool “get_workspace_summary” rewrote its description, which is the text the model reads
- [security] Tool “install_module” rewrote its description, which is the text the model reads
- [security] Tool “list_applications” rewrote its description, which is the text the model reads
- [security] Tool “list_broadcasts” rewrote its description, which is the text the model reads
- [security] Tool “search_flow_examples” 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] Tool “update_application” rewrote its description, which is the text the model reads
- [security] Tool “validate_actions” rewrote its description, which is the text the model reads
- [security] Tool “apply_actions” is now declared destructive
- [functional regression] Schema quality: pass → fail
- [functional improvement] Tool coverage: 0% → 100%
- [functional] Schema quality: good → excellent
- [cosmetic] “apply_actions” reworded the description of “actions”
- [cosmetic] “apply_actions” reworded the description of “applicationId”
- [cosmetic] “apply_actions” reworded the description of “conversationId”
- [cosmetic] “apply_actions” reworded the description of “flowId”
- [cosmetic] “create_application” reworded the description of “name”
- [cosmetic] “create_application” reworded the description of “preferredLanguage”
- [cosmetic] “create_application” reworded the description of “skipDefaultFlows”
- [cosmetic] “get_application_context” reworded the description of “applicationId”
- [cosmetic] “get_block_details” reworded the description of “applicationId”
- [cosmetic] “get_block_details” reworded the description of “blockId”
- [cosmetic] “get_block_details” reworded the description of “flowId”
- [cosmetic] “get_broadcast_analytics” reworded the description of “applicationId”
- [cosmetic] “get_broadcast_analytics” reworded the description of “broadcastId”
- [cosmetic] “get_broadcast_analytics” reworded the description of “endDate”
- [cosmetic] “get_broadcast_analytics” reworded the description of “startDate”
- [cosmetic] “get_broadcast_details” reworded the description of “applicationId”
- [cosmetic] “get_broadcast_details” reworded the description of “broadcastId”
- [cosmetic] “get_flow_context” reworded the description of “applicationId”
- [cosmetic] “get_flow_context” reworded the description of “flowId”
- [cosmetic] “get_flow_example” reworded the description of “id”
- [cosmetic] “get_flow_example” reworded the description of “includeSchemaExample”
- [cosmetic] “get_module_catalog” reworded the description of “applicationId”
- [cosmetic] “get_module_details” reworded the description of “applicationId”
- [cosmetic] “get_module_details” reworded the description of “moduleKey”
- [cosmetic] “get_module_details” reworded the description of “moduleVersion”
- [cosmetic] “get_variable_context” reworded the description of “applicationId”
- [cosmetic] “get_variable_context” reworded the description of “includeValues”
- [cosmetic] “get_variable_context” reworded the description of “limit”
- [cosmetic] “get_variable_context” reworded the description of “query”
- [cosmetic] “get_variable_context” reworded the description of “scope”
- [cosmetic] “get_workspace_summary” reworded the description of “applicationId”
- [cosmetic] “get_workspace_summary” reworded the description of “flowId”
- [cosmetic] “install_module” reworded the description of “applicationId”
- [cosmetic] “install_module” reworded the description of “moduleKey”
- [cosmetic] “install_module” reworded the description of “moduleVersion”
- [cosmetic] “list_broadcasts” reworded the description of “applicationId”
- [cosmetic] “list_broadcasts” reworded the description of “botId”
- [cosmetic] “list_broadcasts” reworded the description of “isRecurring”
- [cosmetic] “list_broadcasts” reworded the description of “limit”
- [cosmetic] “list_broadcasts” reworded the description of “page”
- [cosmetic] “list_broadcasts” reworded the description of “status”
- [cosmetic] “search_flow_examples” reworded the description of “limit”
- [cosmetic] “search_flow_examples” reworded the description of “query”
- [cosmetic] “search_flow_examples” reworded the description of “tags”
- [cosmetic] “send_message” reworded the description of “applicationId”
- [cosmetic] “send_message” reworded the description of “botId”
- [cosmetic] “send_message” reworded the description of “contactId”
- [cosmetic] “send_message” reworded the description of “platformId”
- [cosmetic] “send_message” reworded the description of “text”
- [cosmetic] “update_application” reworded the description of “applicationId”
- [cosmetic] “update_application” reworded the description of “defaultLanguage”
- [cosmetic] “update_application” reworded the description of “incomingMessageBehavior”
- [cosmetic] “update_application” reworded the description of “incomingMessageFlowId”
- [cosmetic] “update_application” reworded the description of “isActive”
- [cosmetic] “validate_actions” reworded the description of “actions”
- [cosmetic] “validate_actions” reworded the description of “applicationId”
- [cosmetic] “validate_actions” reworded the description of “conversationId”
- [cosmetic] “validate_actions” reworded the description of “flowId”
- [cosmetic] “update_application” reworded the description of “name”

### 2026-07-28 (score 60, +1)

- [functional regression] Schema quality: 57 → 65
- [functional] New tool “send_message”

### 2026-07-27 (score 59, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 59)

First indexed and scored.

## MCP tools (21)

### `list_applications` (~90 tokens)

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` (~177 tokens)

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.

Input parameters:

- `name` (string): Display name for the new application. Defaults to a localized "My First Application" when omitted or blank.
- `preferredLanguage` (string): Language for the seeded default flows and the default name. Only "en", "ru", and "es" are supported — any other value silently falls back to "en".
- `skipDefaultFlows` (boolean): Set true to create an empty application with no seeded starter flows. Defaults to false.

### `update_application` (~269 tokens)

Update application-level settings (name, active state, default language, 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.

Input parameters:

- `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): Default language for new flows. Only "en", "ru", and "es" are supported; any other value falls back to "en".
- `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.
- `incomingMessageFlowId` (string): Flow to run for unmatched inbound messages. Required in practice 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.

### `get_workspace_summary` (~166 tokens)

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.

Input parameters:

- `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…
- `flowId` (string): Narrow the summary to one flow. Omit to summarize every flow in the application.

### `get_variable_context` (~272 tokens)

Search variable definitions by scope and keyword. 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; variables marked secret stay redacted either way. Use the returned ids in `{{var|<id>}}` references.

Input parameters:

- `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…
- `includeValues` (boolean): Set true to include stored values, each previewed to 500 characters. Defaults to false — leave it off unless you need the data, since values may hold personal data. Secret variables remain redacted r…
- `limit` (number): Maximum variables to return. Defaults to 30; values above 50 are clamped to 50.
- `query` (string): Case-insensitive substring filter matched against the variable name, full path, description, type, and scope. Omit to list without filtering.
- `scope` (string): Restrict to one variable scope. Defaults to "all".

### `get_application_context` (~142 tokens)

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.

Input parameters:

- `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…

### `get_module_catalog` (~152 tokens)

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 come from get_module_details.

Input parameters:

- `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…

### `get_module_details` (~228 tokens)

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 unknown moduleKey does not raise — the response carries an `error` string plus `availableModules` listing valid keys and versions.

Input parameters:

- `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…
- `moduleKey` (string, required): Required. The module's stable key exactly as returned by get_module_catalog (not its display name).
- `moduleVersion` (string): Pin a specific version. Omit to resolve the installed version when the module is installed, falling back to the marketplace entry for that key.

### `install_module` (~218 tokens)

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 fills in missing template actions rather than duplicating them. Modules with manual setup fields still need an operator to enter credentials in the dashboard before their actions will run.

Input parameters:

- `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…
- `moduleKey` (string, required): Required. The module's stable key from get_module_catalog.
- `moduleVersion` (string, required): Required — the exact version string to install, as listed by get_module_catalog. There is no implicit "latest"; pick a concrete version.

### `get_flow_context` (~158 tokens)

Return one flow's graph topology: its blocks, how they link, and a short summary per block. Read-only. Deliberately omits block data and action configs to stay cheap — once you know which block matters, call get_block_details for its full contents. This is the normal first step before editing an existing flow.

Input parameters:

- `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…
- `flowId` (string, required): Required. Flow id, as returned by get_workspace_summary or get_application_context.

### `get_block_details` (~191 tokens)

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, since update_block replaces the fields you send.

Input parameters:

- `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…
- `blockId` (string, required): Required. Block id, as listed by get_flow_context for that flow.
- `flowId` (string, required): Required. Id of the flow that owns the block.

### `get_action_schema` (~105 tokens)

Return the action-authoring contract: every supported action kind with its required fields, the placeholder ids for referencing entities created earlier in the same batch, the `{{var|...}}` / `{{sysvar|...}}` / `{{out|...}}` reference syntax, and the creatable block types. Read-only, takes no arguments, and needs no API key. Read this before drafting any apply_actions batch — it is the schema those actions are validated against.

### `get_design_guidelines` (~93 tokens)

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, takes no arguments, and needs no API key. Read this before any structural edit (new blocks, new branches, new flows) — a batch can pass validate_actions and still be badly structured, and these rules are what catch that.

### `search_flow_examples` (~173 tokens)

Search the library of reusable flow examples covering common business cases (lead capture, onboarding, payments, reminders). Read-only, needs no API key. Returns compact matches — id, title, summary, tags — 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.

Input parameters:

- `limit` (number): Maximum examples to return, between 1 and 8. 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): Array of tag strings to filter by, e.g. ["payments","onboarding"]. Combined with query when both are given.

### `get_flow_example` (~105 tokens)

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.

Input parameters:

- `id` (string, required): Required. Example id exactly as returned by search_flow_examples.
- `includeSchemaExample` (boolean): Set true to include the full action-batch example — much larger, but it is the part you adapt for apply_actions. Defaults to false.

### `validate_actions` (~274 tokens)

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.

Input parameters:

- `actions` (array, required): 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.

### `apply_actions` (~443 tokens)

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. DESTRUCTIVE: the batch may include delete_block, delete_link, delete_flow, and delete_variable. Confirm with the user before applying deletions. IRREVERSIBLE SIDE EFFECTS: run_operation starts a real operation run, which may send broadcasts to real contacts and write application variables. It cannot be undone or recalled, is not idempotent, and is available only through this tool — confirm with the user before applying a batch containing one, and never blindly retry a timed-out call that did. Validation always runs first and an invalid batch applies nothing. Execution is NOT atomic, however: if an action fails mid-batch, the actions before it stay applied and execution stops — re-read state with get_flow_context before retrying rather than blindly resending the batch. Not idempotent — resending a batch of create_* actions creates duplicates. Read get_action_schema for the action contract and get_design_guidelines before any structural edit. Returns { success, changes, errors, warnings, actionId } plus an idRemap mapping placeholder ids to the real ids that were created.

Input parameters:

- `actions` (array, required): 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.

### `send_message` (~449 tokens)

Send a plain-text 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. Delivery is asynchronous: a successful response means the bot accepted the send, not that the platform delivered it. Unsubscribed contacts are rejected. NOT idempotent and not reversible — each call sends another message to a real person, and a sent message cannot be recalled. Confirm the recipient and text with the user before calling, and never retry a timed-out call blindly.

Input parameters:

- `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…
- `contactId` (string): Preferred way to target the recipient: the globally unique FlowCastle contact id. Supply either this or platformId.
- `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, required): Required. Plain-text message body, must be non-empty. `{{var|name}}` placeholders resolve against the recipient's variable context.

### `list_broadcasts` (~217 tokens)

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. Use get_broadcast_details for one broadcast's full breakdown.

Input parameters:

- `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): Only broadcasts belonging to this bot. Omit for all bots in the application.
- `isRecurring` (boolean): True for recurring broadcasts only, false for one-off only. Omit for both.
- `limit` (number): Broadcasts per page, between 1 and 100.
- `page` (number): 1-based page number. Defaults to 1.
- `status` (string): Only broadcasts in this lifecycle state. Omit for all states.

### `get_broadcast_details` (~143 tokens)

Return full details for a single broadcast: status, schedule, recurrence rule, linked flow, and delivery breakdown by status. Read-only. Call list_broadcasts first to find the broadcastId. For per-message-block engagement stats use get_broadcast_analytics instead.

Input parameters:

- `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…
- `broadcastId` (string, required): Required. Broadcast id, as returned by list_broadcasts.

### `get_broadcast_analytics` (~219 tokens)

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.

Input parameters:

- `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…
- `broadcastId` (string, required): Required. Broadcast id, as returned by list_broadcasts.
- `endDate` (string): End of the reporting window, same format as startDate. Defaults to now.
- `startDate` (string): Start of the reporting window, as a date string parsable by Date (ISO 8601 such as "2026-07-01" or "2026-07-01T00:00:00Z" is safest). Defaults to the broadcast's creation time.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 67
- 2026-08-01: 67
- 2026-07-31: 66
- 2026-07-30: 65
- 2026-07-29: 65
- 2026-07-28: 60
- 2026-07-27: 59
- 2026-07-26: 59

## Links

- Remote endpoint: https://api.flowcastle.ai/api/mcp
- Authorisation metadata: https://api.flowcastle.ai/.well-known/oauth-protected-resource/api/mcp
- Repository: https://github.com/FlowCastle/telegram-bot-templates
- Website: https://flowcastle.ai/
- Changelog RSS feed: https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/ai-flowcastle-flowcastle/api-mcp
