Flowra SDK

MCP serverEverything else

Hosted AI agents and workflows with app OAuth, human approval gates, and a run ledger.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use Flowra SDK

Install Flowra SDK

The server’s own address, for the clients that take one directly. Or connect ahel onceand every client you use reads it from one address, with the account kept on ahel rather than in each client’s config.

  • Claude Code

    claude mcp add --transport http flowra-sdk 'https://mcp.flowra.dev/mcp'

    Run it once in your project, then open /mcp to approve any sign-in the server asks for.

  • Claude Desktop

    https://mcp.flowra.dev/mcp

    Add a custom connector in Settings, paste this address, and approve the sign-in.

  • Cursor

    cursor://anysphere.cursor-deeplink/mcp/install?name=flowra-sdk&config=eyJ1cmwiOiJodHRwczovL21jcC5mbG93cmEuZGV2L21jcCJ9

    Open the link and Cursor adds the server at that address.

  • ChatGPT

    https://mcp.flowra.dev/mcp

    In Settings, enable Developer mode, create an MCP app, and paste this address. Your plan and workspace must allow custom apps.

  • Codex

    codex mcp add flowra-sdk --url 'https://mcp.flowra.dev/mcp'

    Run it once, then sign in with codex mcp login flowra-sdk if the server asks for an account.

From the project's README

As published by flowradev/sdk in README.md.

The all-in-one platform for AI agents, locked workflows, and 1,000+ app integrations.

Official TypeScript, Python, and CLI SDK. Call hosted AI agents and locked workflows from your backend — Gmail, Slack, GitHub, Notion, Telegram, WhatsApp, Calendar, Linear, and 1,000+ apps, with OAuth, human approval, and a ledger of every tool call.

Product · Docs · SDK guide · MIT

This repo is for your server. In Cursor / Claude / OpenClaw, install the agent skill and add https://mcp.flowra.dev/mcp with no headers (OAuth). Details: MCP.

Get a project API key: Dashboard → Project settings → API Keys.

import { Flowra } from '@flowra/sdk';

const flowra = new Flowra({ apiKey: process.env.FLOWRA_API_KEY! });
import os
from flowra import Flowra

flowra = Flowra(api_key=os.environ["FLOWRA_API_KEY"])

Python is the same API in snake_case (create_link, as_user, ingest_url).


What is Flowra?

Flowra is an all-in-one AI agent and workflow platform. You describe a job; it runs against connected apps — with OAuth, a human gate on send/delete/pay, and a ledger of every tool call. This repository is the official SDK for calling that platform from TypeScript, Python, or a terminal.

Use Flowra when the work needs a real Gmail or Slack account, a schedule, human approval, multiple end users, or an audit trail. Do not keep OAuth and cron on a laptop.

You needUse
Same steps every run (cron recap, triage, alerts)Workflow — a locked graph
Next tool depends on the messageAgent — open path, hosted
One action from your backendSDK tools.execute
One action from a terminal agentCLI discover → connect → execute
Cursor / Claude / OpenClawSkill + MCP

What you can do

Send Gmail or Slack from your app

Don't invent slugs — take them from tools.list (often GMAIL_SEND_EMAIL, SLACK_SEND_MESSAGE).

const tools = await flowra.tools.list({ q: 'gmail send email' });
const slug = tools.data[0].slug; // e.g. GMAIL_SEND_EMAIL

await flowra.tools.execute(slug, {
  arguments: {
    recipient_email: 'you@example.com',
    subject: 'Invoice paid',
    body: 'Thanks — you are all set.',
  },
});

Connect an app (OAuth)

If the user isn't connected yet, you get a URL. Open it, they approve, you continue.

const configs = await flowra.authConfigs.list({ q: 'gmail' });
const link = await flowra.connections.createLink({
  authConfigId: configs.data[0].id,
});

if (link.redirectUrl) {
  // send the user here, then retry
  console.log(link.redirectUrl);
}

Ship your own tool — it lands in the cloud

Gmail is already in the catalog. Your billing API is not. Create a toolkit + tool on this project; Flowra hosts it. It does not join the public catalog, but discovery on this project will find it: MCP FLOWRA_DISCOVER_TOOLS, flowra discover "…", or tools.list.

await flowra.toolkits.create({
  slug: 'httpbin',
  name: 'HTTP Bin',
  description: 'Probe REST API',
  baseUrl: 'https://httpbin.org',
  noAuth: true,
});

await flowra.tools.create({
  toolkitSlug: 'httpbin',
  slug: 'HTTPBIN_GET_JSON',
  name: 'Get JSON',
  description: 'GET /json from httpbin',
  noAuth: true,
  inputParameters: { type: 'object', properties: {} },
  outputParameters: { type: 'object' },
  script: {
    language: 'javascript',
    source: `export default async function ({ input }) {
  const res = await fetch("https://httpbin.org/json");
  return { ok: true, data: await res.json(), input };
}`,
  },
});

Next discover for this project returns HTTPBIN_GET_JSON. Then execute it like any catalog tool:

await flowra.tools.execute('HTTPBIN_GET_JSON', { arguments: {} });
flowra discover "get json from httpbin"
flowra execute HTTPBIN_GET_JSON -d '{}'

Slug: UPPER_SNAKE with the toolkit prefix (httpbinHTTPBIN_GET_JSON). Only register when DISCOVER has no app for that job.

Run a locked workflow

A workflow is a graph you already designed (cron recap, triage, alerts). Your backend just triggers it.

const run = await flowra.workflows.run('WORKFLOW_ID', {
  input: { channel: '#ops' },
  mode: 'production',
});

const status = await flowra.workflows.status(run.threadId);

Pause for a human, then resume

Sends, deletes, and payouts can wait. If the run is paused, don't start over.

const status = await flowra.workflows.status(threadId);

if (status.status === 'paused') {
  await flowra.workflows.resume(threadId, {
    resumeValue: { approved: true },
  });
}

Chat with an agent that has your tools

const thread = await flowra.chat.createThread({
  metadata: { source: 'support' },
});

await flowra.chat.stream(thread.id, {
  input: {
    messages: [
      { role: 'user', content: "Rank today's inbox and draft a Slack recap." },
    ],
  },
});

Teach it your docs

const collection = await flowra.knowledge.create({ name: 'Help center' });

await flowra.knowledge.ingestUrl(collection.id, {
  url: 'https://docs.yoursite.com/faq',
});

const hits = await flowra.knowledge.search(collection.id, {
  query: 'How do I reset my API key?',
  limit: 5,
});

Act as a customer of their product

const acme = flowra.asUser('customer_42');
await acme.connections.createLink({ authConfigId: 'AUTH_CONFIG_ID' });
await acme.tools.execute('GMAIL_SEND_EMAIL', {
  arguments: {
    recipient_email: 'ada@acme.com',
    subject: 'Welcome',
    body: 'Hi Ada',
  },
});

Default user is project_default_user. Never pass a project UUID as the username. Keep the API key out of source.

One shot from a terminal

When MCP isn't connected: discover → connect → execute. Never invent the slug.

flowra login
flowra discover "Gmail list recent inbox emails"
flowra connect gmail
flowra execute GMAIL_SEND_EMAIL -d '{"recipient_email":"you@example.com","subject":"Hi","body":"Test"}'

If connect returns redirectUrl, open it, then run connect again.


Install the TypeScript, Python, and CLI SDK

Do not pip install flowra — that PyPI name is unrelated. The Python package is flowra-sdk (import stays flowra).

TypeScript

pnpm add @flowra/sdk

Python (3.10+)

pip install flowra-sdk

CLI

pnpm add -g @flowra/cli

Agent skill (Cursor, Claude, Codex, OpenClaw, Hermes)

npx skills add flowradev/skills --skill flowra

Then add https://mcp.flowra.dev/mcp (OAuth, no headers). Directory: skills.sh/flowradev/skills/flowra.


Map of the client

You wantCall
Apps & OAuthtools toolkits connections authConfigs
Agents & cron graphsworkflows triggers chat
RAG / files / tablesknowledge files database
Code, browser, modelssandbox browser llm mcp
Creditsusage

Flowra vs canvas automation and tool-only SDKs

Flowra is an all-in-one hosted platform: agents, locked workflows, OAuth, approval, and a run ledger in one project. A canvas (n8n, Zapier, Make) is a visual graph you host or subscribe to. A tool-only SDK wires apps into an agent you still run yourself.

FlowraCanvas (n8n / Zapier / Make)Tool-only SDK
Call from your backendTypeScript, Python, CLIUsually webhooks / RESTYes
Hosted AI agentYesAdd-on or noneYou host the agent
Locked workflow + cronYesYesYou build it
Human approval that works on cronYesVariesYou build it
Ledger of every tool callYesRun historyYou build it
MCP for Cursor / Claude / CodexYesRareRare
Best forProduct backends, AI agents, approved automationsVisual ops teamsBring-your-own agent

FAQ

What is the Flowra SDK?

The Flowra SDK is the official TypeScript (@flowra/sdk) and Python (flowra-sdk) client for the Flowra API. Use it from your backend to execute tools, connect OAuth apps, run locked workflows, chat with hosted agents, and search project knowledge. The CLI (@flowra/cli) is the same API for a terminal.

Does Flowra work with Gmail, Slack, GitHub, and Notion?

Yes. Flowra ships a catalog of 1,000+ apps including Gmail, Slack, GitHub, Notion, Telegram, WhatsApp, Calendar, and Linear. Discover the exact slug with tools.list or flowra discover — never invent it. Custom REST or script tools can be registered on your project if the catalog has no app for that job.

Is Flowra an n8n, Zapier, or Make alternative?

Flowra is an alternative when you want code and MCP, not a canvas: hosted agents, locked workflows, OAuth, human approval, and a ledger. Stay on n8n, Zapier, or Make if your team already lives in a visual builder and does not need an SDK or Cursor/Claude MCP.

Flowra agent vs workflow — which should I use?

Use a workflow when the path is known and should not change (cron recap, triage, alerts). Use an agent when the next tool depends on the message. Both run on the same project, share connections, and write to the same ledger.

How do I install Flowra for Python?

Install flowra-sdk from PyPI (pip install flowra-sdk) and from flowra import Flowra. Do not pip install flowra — that package is unrelated. TypeScript is pnpm add @flowra/sdk. Python 3.10+ and Node 18+ are required.

Where do I get a Flowra API key?

Create a project at flowra.dev, then open Project settings → API Keys. Pass it as FLOWRA_API_KEY. Never commit the key. Default user is project_default_user; for end-customers of their product, use asUser / as_user with x-username.


Packages in this repo

PackageRegistryInstall
@flowra/sdknpmpnpm add @flowra/sdk
flowra-sdkPyPIpip install flowra-sdk
@flowra/clinpmpnpm add -g @flowra/cli

Docs: docs.flowra.dev · Agent skill: npx skills add flowradev/skills --skill flowra


MIT © Flowra

Advanced
Delivery
mcp MCP server → your ahel gateway (mcp.ahel.ai) → every connected AI client.
Catalog kind
mcp-server
Gateway key
io-github-flowradev-mcp
Source
github.com/flowradev/sdk
Hosted endpoint
https://mcp.flowra.dev/mcp