<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Composio</title>
    <description>The latest articles on Forem by Composio (@composiodev).</description>
    <link>https://forem.com/composiodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F9157%2Fdf89ab52-2d48-474b-a971-087232b09f19.png</url>
      <title>Forem: Composio</title>
      <link>https://forem.com/composiodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/composiodev"/>
    <language>en</language>
    <item>
      <title>How to Automate Your Slack Workspace with OpenClaw and Composio 🚀</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Thu, 16 Apr 2026 15:19:55 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-automate-your-slack-workspace-with-openclaw-and-composio-3lhc</link>
      <guid>https://forem.com/composiodev/how-to-automate-your-slack-workspace-with-openclaw-and-composio-3lhc</guid>
      <description>&lt;p&gt;Your team already lives in Slack. Code reviews, project updates and what not, it all happens there.&lt;/p&gt;

&lt;p&gt;But the moment you need to file a GitHub issue, check a Linear ticket, or send a follow-up email, you leave Slack, do the thing, and come back. That context switch adds up.&lt;/p&gt;

&lt;p&gt;What if your Slack workspace had an assistant that could do all of that for you, right in the thread. That too an isolated OpenClaw instance per user with admin control? 🤯&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34fzwp4wnc4g66m15gp2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F34fzwp4wnc4g66m15gp2.gif" alt="shocked gif" width="480" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, you'll learn how to automate an entire Slack team workspace that connects to your tools, takes actions, without you ever leaving Slack.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Covered
&lt;/h2&gt;

&lt;p&gt;To quickly summarize what we’ll cover in this blog post, here’s what we’ll go through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The idea behind building a Slack bot around OpenClaw.&lt;/li&gt;
&lt;li&gt;How Composio lets each user connect their own tools.&lt;/li&gt;
&lt;li&gt;How OpenClaw powers replies and tool usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are a few things you'll understand, but there's so many others you'll learn along the way.&lt;/p&gt;

&lt;p&gt;So, if you want to build a Slack-first (though not limited to) AI with personal tool access for each user, this will give you a solid starting point.&lt;/p&gt;




&lt;h2&gt;
  
  
  What we're building
&lt;/h2&gt;

&lt;p&gt;We're building a Slack bot that brings OpenClaw into Slack.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 Not necessarily only for Slack, you can use pretty much the same setup for something like Discord with their SDK or your custom app. The idea remains the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Overall the idea is to use OpenClaw and give every user in a workspace their own single instance of it which powers the AI assistant.&lt;/p&gt;

&lt;p&gt;That way, things are isolated per user and the admin can control/limit the toolkits (GitHub, Linear, etc.) the users get access to.&lt;/p&gt;

&lt;p&gt;Each user can connect their own tools with Composio, so the bot can chat, and take actions using the tools they’ve authorized.&lt;/p&gt;

&lt;p&gt;Here's a quick architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszdytuuqr202h16l1vvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszdytuuqr202h16l1vvs.png" alt="bot architecture" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Slack and how to create a Slack App?
&lt;/h2&gt;

&lt;p&gt;No big reason to choose Slack, only because it supports slash commands, and it's mostly where people already work.&lt;/p&gt;

&lt;p&gt;For this, we first need to have a Slack app, if you don't already have one, follow the &lt;a href="https://docs.slack.dev/quickstart/" rel="noopener noreferrer"&gt;quickstart guide&lt;/a&gt; to create one.&lt;/p&gt;

&lt;p&gt;Once your app is created, enable Socket Mode so the bot can receive events without exposing a public webhook URL.&lt;/p&gt;

&lt;p&gt;Then add at least these &lt;strong&gt;Bot Token Scopes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app_mentions:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chat:write&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commands&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;im:history&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;im:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;users:read&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Subscribe to these &lt;strong&gt;Bot Events&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;app_mention&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;message.im&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And create these &lt;strong&gt;Slash commands&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/connect&lt;/code&gt;: Use it something like &lt;code&gt;/connect &amp;lt;toolkit&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/connections&lt;/code&gt;: User lists active connections&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/help&lt;/code&gt;: Shows usage summary&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/assign&lt;/code&gt;: Admin assigns an OpenClaw instance to a user&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/add-mcp-config&lt;/code&gt;: Admin registers an MCP Config from platform.composio.dev&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/add-auth-config&lt;/code&gt;: Admin links a toolkit to its Composio auth config&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/list-mcp-configs&lt;/code&gt;: Admin lists all registered MCP Configs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally copy these values to your &lt;code&gt;.env&lt;/code&gt; file, which you can find in the app settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SLACK_BOT_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xoxb-...
&lt;span class="nv"&gt;SLACK_APP_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xapp-...
&lt;span class="nv"&gt;SLACK_SIGNING_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Your &lt;code&gt;SLACK_BOT_TOKEN&lt;/code&gt; is the bot token itself, &lt;code&gt;SLACK_APP_TOKEN&lt;/code&gt; is the Socket Mode app level token and &lt;code&gt;SLACK_SIGNING_SECRET&lt;/code&gt; is used by Slack to verify requests.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Set Up the Project
&lt;/h2&gt;

&lt;p&gt;It's fairly simple to get this project up and running. Follow these steps:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/shricodev/saas-openclaw-slackbot.git
&lt;span class="nb"&gt;cd &lt;/span&gt;saas-openclaw-slackbot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Next, you install the dependencies:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then set up the environment variables and run the development server:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Slack&lt;/span&gt;
&lt;span class="nv"&gt;SLACK_BOT_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xoxb-...
&lt;span class="nv"&gt;SLACK_APP_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xapp-...
&lt;span class="nv"&gt;SLACK_SIGNING_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...

&lt;span class="c"&gt;# Database&lt;/span&gt;
&lt;span class="nv"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...

&lt;span class="c"&gt;# Composio api key (ak...) from https://platform.composio.dev&lt;/span&gt;
&lt;span class="nv"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ak_..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To get the Composio API key:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in at &lt;a href="https://platform.composio.dev/" rel="noopener noreferrer"&gt;platform.composio.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy your API key (&lt;code&gt;ak_..&lt;/code&gt;) from the Composio dashboard settings, then set it:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjacffrcue8r6sct5ddev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjacffrcue8r6sct5ddev.png" alt="composio api key" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Configure Composio Dedicated MCP Server
&lt;/h2&gt;

&lt;p&gt;In this section, we'll go through the process of creating a dedicated MCP server in Composio for each user.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, head over to &lt;a href="https://platform.composio.dev" rel="noopener noreferrer"&gt;platform.composio.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Under the MCP Configs tab, create a &lt;strong&gt;Dedicated MCP Server&lt;/strong&gt;. This lets you create MCP servers with specific apps and tools, which is exactly what we want.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7qlbr4p0vmmtyxkdf3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7qlbr4p0vmmtyxkdf3t.png" alt="composio dedicated MCP server creation" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select all the toolkits you plan to assign for the user and create the MCP server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo218r8j44g593yqlrvkk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo218r8j44g593yqlrvkk.png" alt="composio toolkits" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For the External User ID, use the user's Slack user ID. To get someone's Slack user ID, head over to their profile, click the three dots, and select &lt;strong&gt;Copy Member ID&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25u16lvsh5h94z9d4em2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F25u16lvsh5h94z9d4em2.png" alt="slack user id" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use that as the External User ID.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs98p5tahcxw9ikfogngu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs98p5tahcxw9ikfogngu.png" alt="external user id naming composio" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep note of the &lt;strong&gt;MCP config name&lt;/strong&gt; and &lt;strong&gt;MCP config ID&lt;/strong&gt;. You will need both when configuring the bot in Slack.&lt;/p&gt;

&lt;p&gt;Upon successful creation, you'll find the URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5kwmuvboz09uitypcw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv5kwmuvboz09uitypcw3.png" alt="composio dedicated mcp server url" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can copy this URL directly and add it to the OpenClaw config, which we’ll cover later in the Configure OpenClaw with Composio section. Alternatively, the bot can fetch it for you after you run the &lt;code&gt;/assign&lt;/code&gt; slash command, which we’ll configure later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You will also need the auth config ID tied to the tools you selected. In the MCP server, head over to the &lt;strong&gt;Manage Config&lt;/strong&gt; tab and click &lt;strong&gt;Manage Auth Config&lt;/strong&gt;. The auth config ID is listed on that page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmo9o16fcq5tmfezu9ua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmo9o16fcq5tmfezu9ua.png" alt="composio auth config" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keep note of this as well. You will need it when running &lt;code&gt;/add-auth-config&lt;/code&gt; in Slack.&lt;/p&gt;


&lt;h2&gt;
  
  
  Core Components in the Application
&lt;/h2&gt;

&lt;p&gt;We're not going to code everything from scratch as that'd be too long and impractical. Let's go over some of the core components in the project.&lt;/p&gt;

&lt;p&gt;Before we start with the project core components, here's the project tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://slack.dev/bolt-js/" rel="noopener noreferrer"&gt;Slack Bolt&lt;/a&gt;&lt;/strong&gt; - Official Slack bot framework. We use it with Socket Mode, which connects to Slack over a WebSocket without needing a public HTTP endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://openclaw.ai/" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;&lt;/strong&gt; - The agent layer. Exposes an OpenAI-compatible API but acts as a full agentic gateway that plans, calls tools, and reasons over results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt;&lt;/strong&gt; - The core of the project. Manages OAuth connections to external apps like GitHub, Linear, and Gmail, and exposes them to the agent via MCP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; - Obvious choice over JavaScript as we get type safe code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL + Prisma&lt;/strong&gt; - Handles user records, connection status, and per-thread conversation history.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Bootstrapping the Bot
&lt;/h3&gt;

&lt;p&gt;This is where everything starts. We initialize the Slack Bolt app with Socket Mode, register all handlers, and start the server.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 app.ts&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SLACK_BOT_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;appToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SLACK_APP_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;signingSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SLACK_SIGNING_SECRET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;socketMode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;registerMessageHandlers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;registerCommandHandlers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Bot is running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (socket mode)`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead of exposing a public HTTP endpoint for Slack to POST events to, Socket Mode opens a WebSocket connection. This means you can run the bot anywhere could be your local machine, a private server without a public URL.&lt;/p&gt;

&lt;p&gt;If you've worked with bots before, this should be pretty straight-forward to understand. 👀&lt;/p&gt;
&lt;h3&gt;
  
  
  Handling User Messages
&lt;/h3&gt;

&lt;p&gt;This is the brain of the bot. It handles both direct messages and &lt;code&gt;@mentions&lt;/code&gt; in channels.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 message.handler.ts&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleUserMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;threadTs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;threadTs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getThreadHistory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;threadTs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;priorHistory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;thinkingMsg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;postMessage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;thread_ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;threadTs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_Thinking..._&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;openclawConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gatewayUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;openclawConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;priorHistory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;sessionKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;threadTs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;channelId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;thinkingMsg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There's a few things you might notice right up:&lt;/p&gt;

&lt;p&gt;First, we store the user's message to the database before sending it to OpenClaw. But why? This way if the request fails, the history isn't broken. Similar to storing chat history in localhost when creating web chat applications.&lt;/p&gt;

&lt;p&gt;I do not know if there’s a better way to handle this, but right now we just show a &lt;code&gt;Thinking...&lt;/code&gt; message while the AI is generating the full response, and then replace it once the final output is ready.&lt;/p&gt;

&lt;p&gt;A little hacky, maybe, but it gets the job done. There are probably better ways to handle this, like streaming the response, but for now the old-school approach works. 😋&lt;/p&gt;
&lt;h3&gt;
  
  
  Slash Commands
&lt;/h3&gt;

&lt;p&gt;The bot exposes seven slash commands split into two groups: user-facing (&lt;code&gt;/connect&lt;/code&gt;, &lt;code&gt;/connections&lt;/code&gt;, &lt;code&gt;/help&lt;/code&gt;) and admin-only (&lt;code&gt;/assign&lt;/code&gt;, &lt;code&gt;/add-mcp-config&lt;/code&gt;, &lt;code&gt;/add-auth-config&lt;/code&gt;, &lt;code&gt;/list-mcp-configs&lt;/code&gt;).&lt;/p&gt;
&lt;h4&gt;
  
  
  /connect
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;/connect &amp;lt;toolkit&amp;gt;&lt;/code&gt; starts an OAuth flow for a tool like GitHub or Gmail. But unlike the previous version where any user could connect any toolkit, now the bot checks three things before starting a connection:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does this user have an MCP Config assigned?&lt;/li&gt;
&lt;li&gt;Is the requested toolkit in that config?&lt;/li&gt;
&lt;li&gt;Is there an auth config registered for this toolkit?
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 command.handler.ts&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/connect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;respond&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolkitSlug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getComposioApiKey&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;assignment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpConfigAssignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;slackUserId_slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;team_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mcpConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;assignment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You have not been assigned an MCP Config. Ask your admin to run `/assign`.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;assignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolkitSlugs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This toolkit is not available in your assigned config. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Your admin controls which toolkits you can access.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toolkitAuth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpToolkitAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;slackTeamId_toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;team_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// check if already connected&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;connectedToolkits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getConnectedToolkits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;connectedToolkits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`You're already connected to *&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;*.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redirectUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;initiateConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;toolkitAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authConfigId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Click here to connect *&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;*: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;redirectUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The response is only visible to the user who ran the command. That's intentional as OAuth URLs are personal and shouldn't be visible to the whole channel.&lt;/p&gt;
&lt;h4&gt;
  
  
  /assign
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;/assign&lt;/code&gt; is admin-only and lets admins assign a specific OpenClaw gateway to a user. It opens a Slack modal to collect the gateway URL, token and MCP config server ID.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 command.service.ts&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/assign&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userInfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user_id&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAdmin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;is_admin&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;userInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;is_owner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isAdmin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;respond&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;response_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ephemeral&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Only workspace admins can assign OpenClaw instances.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;trigger_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;command&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trigger_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;assignInstanceModal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// includes gateway URL, token, and MCP Config ID fields&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The user's MCP URL looks something like this: &lt;code&gt;https://backend.composio.dev/v3/mcp/aaa-111/mcp?user_id=&amp;lt;slack_user_id&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's the key because it's what connects the user's OpenClaw instance to the toolkits the admin selected for them.&lt;/p&gt;
&lt;h4&gt;
  
  
  /add-mcp-config and /add-auth-config
&lt;/h4&gt;

&lt;p&gt;These two admin commands register the Composio resources in the bot's database. Both open modals.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/add-mcp-config&lt;/code&gt; registers an MCP Config by name and server ID:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// On modal submit:&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;teamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;composioServerId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// the UUID from the MCP URL&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// e.g. "Engineering"&lt;/span&gt;
    &lt;span class="nx"&gt;toolkitSlugs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// e.g. ["github", "linear"]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;/add-auth-config&lt;/code&gt; links a toolkit slug to its Composio auth config ID. This is what &lt;code&gt;/connect&lt;/code&gt; uses to know which auth config to pass when initiating a connection:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// On modal submit:&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mcpToolkitAuth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upsert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;slackTeamId_toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;teamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolkitSlug&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;teamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolkitSlug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;authConfigId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;authConfigId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  /list-mcp-configs
&lt;/h4&gt;

&lt;p&gt;A simple admin command that lists all registered MCP Configs for the workspace:&lt;/p&gt;

&lt;p&gt;"Engineering" - server:  - toolkits: github, linear&lt;br&gt;
"Sales" - server:  - toolkits: gmail, notion&lt;/p&gt;
&lt;h3&gt;
  
  
  Sending Requests to OpenClaw
&lt;/h3&gt;

&lt;p&gt;Up until this point we were working on the Slack side and a bit of Composio setup, but how do we actually send these messages to OpenClaw?&lt;/p&gt;

&lt;p&gt;OpenClaw exposes an OpenAI-compatible &lt;code&gt;/v1/chat/completions&lt;/code&gt; endpoint. Our service code wraps that with a proper system prompt, conversation history, and error handling. Nothing super unknown to most of you.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 openclaw.service.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;gatewayUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;sessionKey&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OpenClawResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You are a helpful assistant in a Slack workspace. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;You have access to the user's connected tools (GitHub, Linear, Gmail, etc.) through Composio. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The user's tools are already connected. Do not ask them to connect or authenticate. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Use the available Composio tools directly to answer questions. &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Be concise. Format responses for Slack (use mrkdwn syntax).&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChatMessage&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;assistant&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userMessage&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sendToOpenClaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;gatewayUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sessionKey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We also wrap the raw fetch in a custom &lt;code&gt;OpenClawError&lt;/code&gt; class with error codes for timeouts, auth failures, and gateway errors. Preferred thing you do in a real-world codebase.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Prefer something built-in like &lt;code&gt;fetch&lt;/code&gt; over third-party tool like &lt;code&gt;axios&lt;/code&gt;. Especially now after the recent compromise of &lt;code&gt;axios&lt;/code&gt; which is used by hundreds and thousands of applications.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Connecting tools with Composio
&lt;/h3&gt;

&lt;p&gt;You might be familiar working with Composio over the SDK &lt;code&gt;@composio/core&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But with Composio, you can also directly talk to it's REST API. We now talk to the Composio REST API on &lt;code&gt;backend.composio.dev&lt;/code&gt; using an API key from &lt;code&gt;platform.composio.dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There are only three functions in the service, and each one does exactly what the name suggests 🤌&lt;/p&gt;
&lt;h4&gt;
  
  
  Check what a user has connected:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 composio.service.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getConnectedToolkits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;COMPOSIO_API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/connected_accounts?user_id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ACTIVE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Initiate a new connection:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 composio.service.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;initiateConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;authConfigId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;COMPOSIO_API_BASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/connected_accounts`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;auth_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;authConfigId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;slackUserId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;redirect_url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Build the per-user MCP URL:
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 composio.service.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getMcpUrl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;composioServerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`https://backend.composio.dev/v3/mcp/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;composioServerId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcp?user_id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This last one is the most important. There's no API call, it's pure URL construction. But this URL is what ties everything together: the &lt;code&gt;composioServerId&lt;/code&gt; controls which toolkits are available, and&lt;br&gt;
the &lt;code&gt;user_id&lt;/code&gt; scopes which credentials are used. When &lt;code&gt;/assign&lt;/code&gt; runs, it computes this URL and shows it to the admin so they can configure it in the user's OpenClaw instance.&lt;/p&gt;
&lt;h3&gt;
  
  
  Persisting Users and Conversation
&lt;/h3&gt;

&lt;p&gt;Every Slack user that messages the bot gets a record in our database keyed on (slackUserId, slackTeamId) pair. This is a safety net, as the same Slack user ID could theoretically exist across different workspaces.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 slack-user.service.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;resolveSlackUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;existing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slackUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slackUserId_slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;slackTeamId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;existing&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slackUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;composioEntityId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`slack_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Conversation history is stored per-thread using Slack's &lt;code&gt;thread_ts&lt;/code&gt; (the timestamp of the first message in a thread) as the thread id. When the bot receives a message, it fetches the full thread history and passes it to OpenClaw, giving it the memory for the duration of that thread.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configuration Setup
&lt;/h2&gt;

&lt;p&gt;The bot requires per-user OpenClaw instances assigned by an admin. If a user hasn't been assigned an instance, they can't use any features. &lt;code&gt;/connect&lt;/code&gt;, &lt;code&gt;/connections&lt;/code&gt; and chat all require an assignment first.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why not use shared instance?
&lt;/h3&gt;

&lt;p&gt;By shared instance, I mean all the users share the same OpenClaw instance. So why not use it that way? That's how server is supposed to work?&lt;/p&gt;

&lt;p&gt;There's a few reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;By default, OpenClaw is not designed to support multiple users connecting to the same gateway concurrently. In practice, which is likely to be the case for our use case.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is already the main reason.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Also, in general, letting multiple users use the same instance with multiple connected accounts is not safe. A prompt injection by one user &lt;strong&gt;could&lt;/strong&gt; access or destroy another user's data.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if there's safety measure (which I'm not aware of). Things could always go wrong. So better safe than sorry.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 👇 lib/config.ts&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getUserOpenClawConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OpenClawConfig&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slackUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slackUserId_slackTeamId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;slackUserId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;slackTeamId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;openclawGatewayUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;openclawGatewayUrl&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;gatewayUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;openclawGatewayUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gatewayToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No OpenClaw instance assigned. Ask your admin to run /assign.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;No assignment, no access. The admin runs &lt;code&gt;/assign&lt;/code&gt; for each user, providing their OpenClaw gateway URL, token, and MCP Config. Until that happens, the bot won't respond to that user.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configure OpenClaw with Composio
&lt;/h2&gt;

&lt;p&gt;Great, now the code part is done. There's one thing that's still left.&lt;/p&gt;

&lt;p&gt;Now, the actual reason to build the bot i.e. to get tools access is not configured &lt;strong&gt;within OpenClaw&lt;/strong&gt; which we do with Composio. It's the most easiest.&lt;/p&gt;

&lt;p&gt;There's multiple ways to configure OpenClaw with Composio. There's standard ways you can find &lt;a href="https://composio.dev/claw" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But, we won't follow the standard way, as by default it uses consumer key, which is a way it's designed by default.&lt;/p&gt;

&lt;p&gt;But we won't work with consumer key, we directly work with the MCP URL.&lt;/p&gt;

&lt;p&gt;Go ahead and modify the OpenClaw config file which lives in the &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; with the following:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;rest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;config...&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"...rest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"telegram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;put&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;URL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;receive&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;after&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/assign&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;user.&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"mcpUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;This sets up &lt;strong&gt;one instance for one user&lt;/strong&gt;. But how do you about configuring multiple instances for multiple users?&lt;/p&gt;
&lt;h3&gt;
  
  
  How do you run it for multiple users?
&lt;/h3&gt;

&lt;p&gt;This only configures one user in the entire workspace. But what about the rest?&lt;/p&gt;

&lt;p&gt;There are a few ways:&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Separate machine or VMs:
&lt;/h4&gt;

&lt;p&gt;Each user's OpenClaw runs on a different machine. Each has its own ~/.openclaw/openclaw.json with its own MCP URL. This is the cleanest but most expensive.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Use named OpenClaw profiles:
&lt;/h4&gt;

&lt;p&gt;OpenClaw ships with a &lt;code&gt;--profile&lt;/code&gt; flag out of the box:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nt"&gt;--profile&lt;/span&gt; &amp;lt;name&amp;gt;     Use a named profile &lt;span class="o"&gt;(&lt;/span&gt;isolates OPENCLAW_STATE_DIR/OPENCLAW_CONFIG_PATH under ~/.openclaw-&amp;lt;name&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can use a different profile per user. If you name each profile after the user, you get an isolated config for each one on the same machine. Most efficient.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw &lt;span class="nt"&gt;--profile&lt;/span&gt; bob
openclaw &lt;span class="nt"&gt;--profile&lt;/span&gt; shrijal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Separate OS users on one machine:
&lt;/h4&gt;

&lt;p&gt;Somewhat impractical. You'd run one OpenClaw instance per OS user, which means creating a separate system account for each person. Possible, but not a great approach.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There could be hundreds of other ways to do it. These are just the ones I could think of. Do your own research, and you’ll probably find others.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Slack Workflow
&lt;/h2&gt;

&lt;p&gt;Run these commands in order as an admin before any user can start chatting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register your MCP Configs (one per config you created on platform.composio.dev):
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/add-mcp-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Register auth configs (one per toolkit):
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/add-auth-config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Assign each user their OpenClaw instance and MCP Config:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/assign
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This gives you the user's scoped MCP URL. Configure it in their OpenClaw instance.&lt;/p&gt;

&lt;p&gt;Once assigned, users run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/connect &amp;lt;toolkit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. After connecting, they can DM the bot or &lt;code&gt;@mention&lt;/code&gt; it in a channel.&lt;/p&gt;


&lt;h2&gt;
  
  
  Bot in Action
&lt;/h2&gt;

&lt;p&gt;Here's a quick demo of the bot in action:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CbXwWr4h5LM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So yeah, that's the whole idea.&lt;/p&gt;

&lt;p&gt;A Slack bot on top of OpenClaw, with Composio handling user tool connections, ends up being a really solid setup.&lt;/p&gt;

&lt;p&gt;At this point, you’ve got a good idea of how this bot works with Slack, OpenClaw, and Composio.&lt;/p&gt;

&lt;p&gt;We covered the main flow, how users connect their tools, how everything comes together inside Slack, and why assigning one OpenClaw instance per user helps keep things isolated.&lt;/p&gt;

&lt;p&gt;It keeps the setup clean and gives you a bot that’s actually useful.&lt;/p&gt;

&lt;p&gt;That's all for this one.&lt;/p&gt;

&lt;p&gt;You can find the entire source code here: &lt;a href="https://github.com/shricodev/saas-openclaw-slackbot" rel="noopener noreferrer"&gt;shricodev/saas-openclaw-slackbot&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;Full Stack SDE • Open-Source Contributor • Collaborator @Oppia • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building a Financial Agent That Actually Works: Composio MCP + Hermes</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Thu, 16 Apr 2026 04:30:09 +0000</pubDate>
      <link>https://forem.com/composiodev/building-a-financial-agent-that-actually-works-composio-mcp-hermes-93k</link>
      <guid>https://forem.com/composiodev/building-a-financial-agent-that-actually-works-composio-mcp-hermes-93k</guid>
      <description>&lt;p&gt;I recently explored Hermes Agent to see how far I could push autonomous workflows in a real-world use case. &lt;/p&gt;

&lt;p&gt;Instead of just experimenting, &lt;br&gt;
I wanted something practical, so I decided to build a financial analyst agent that could fetch, process, reason over financial data and suggest me stocks in this era of war.&lt;/p&gt;

&lt;p&gt;This blog post walks through exactly how we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Securely Set up Hermes Agent&lt;/li&gt;
&lt;li&gt;Integrated Composio MCP for tool access (Google Sheet, Google Doc, Exa)&lt;/li&gt;
&lt;li&gt;Built a functional financial analyst agent that captures the market trends &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along the way, I’ll also share what broke, what worked, and what I’d do differently.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Hermes Agent
&lt;/h2&gt;

&lt;p&gt;Hermes Agent an open source AI agent that can learn and evolve as you interact in real-time , something that open-claw lacked.&lt;/p&gt;

&lt;p&gt;It does so by using a persistent cross-session memory and closed learning loop (write docs → save tools → update memory) that converts completed task into reusable skills. This allows it become more efficient over time.&lt;/p&gt;

&lt;p&gt;The agent has following key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;S*&lt;em&gt;elf Improving Loop&lt;/em&gt;* : Unlike standard chatbot wrappers, Hermes agent refines its own skills from completed task&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Persistent Memory&lt;/strong&gt;: Maintains a persistent model of the user and past interactions across sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autonomous Agent tools&lt;/strong&gt;: Agent offers over 40+ built in tools, support sub agent delegation and code execution&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multi-Platform Integration&lt;/strong&gt;: Works from anywhere , from terminal to plethora of social media service (though little buggy)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Agnostic&lt;/strong&gt;: Supports multiple LLM providers and LLMS including open source and closed source models.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as a programmable agent that can reason + act + self improve , not just respond.&lt;/p&gt;

&lt;p&gt;This means its a perfect candidate for a financial analyst agent.&lt;/p&gt;


&lt;h2&gt;
  
  
  Securely Setup Hermes Agent
&lt;/h2&gt;

&lt;p&gt;Prerequisites:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker - Install docker desktop&lt;/li&gt;
&lt;li&gt;Optional- WSL2 for Windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First install herms in docker, open terminal and run one by one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk7ibp2iev9ca6z9ca0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk7ibp2iev9ca6z9ca0y.png" alt="Install Hermes" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next configure the Hermes Agent, here is the setting I choose, feel free to choose your preferred:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provider : OpenAI Codex. Make sure to authenticate&lt;/li&gt;
&lt;li&gt;Model : GPT 5.4 / GPT 5.4 mini ( for faster inference)&lt;/li&gt;
&lt;li&gt;TTS: Keep Current&lt;/li&gt;
&lt;li&gt;Terminal Backend: Docker (make sure either docker is installed / docker desktop running)&lt;/li&gt;
&lt;li&gt;Docker image : default&lt;/li&gt;
&lt;li&gt;Max Iterations : Default. Set this to higher for complex task (cost more token)&lt;/li&gt;
&lt;li&gt;Context Compression Threshold: Default. Higher threshold compresses later and lower does it faster&lt;/li&gt;
&lt;li&gt;Messaging Platform (optional) : Choose Telegram and follow the instructions. Rest same , but I kept only telegram.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If done all this you will be greeted with following screen&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam7qrjehbve94vke6qa8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fam7qrjehbve94vke6qa8.png" alt="Hermes Start" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now time to add Composio MCP!&lt;/p&gt;




&lt;p&gt;Hermes by default provide ~40 tools, which is ok for daily tasks.&lt;/p&gt;

&lt;p&gt;But it starts feels pretty limited when you start building complex agentic workflows where you need to connect multiple third party SaaS apps (Google Doc, Sheets, Web seach tools, etc) with prod grade security and calling them at need.&lt;/p&gt;

&lt;p&gt;Composio is the tooling layer that sits between Hermes Agent and third party applications and let you connect to 1000+ tools with secure auth and intelligent tool calling.&lt;/p&gt;

&lt;p&gt;Installing Composio MCP is quite straightforward. Follow these steps:&lt;/p&gt;

&lt;p&gt;Head to the &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;https://dashboard.composio.dev/&lt;/a&gt; &amp;amp; login. You will be greeted with this dashboard&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywbqrbfexlke4as2tg2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywbqrbfexlke4as2tg2y.png" alt="Composio Home" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Head to the Install &amp;amp; copy the MCP Url and X-CONSUMER-API-KEY value&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ee8jcwgrwegwyzoq68n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ee8jcwgrwegwyzoq68n.png" alt="Composio Install" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done head to the terminal and type :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano ~/.hermes/config.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and at the end add these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mcp_servers:
  composio:
    url: &lt;span class="s2"&gt;"https://connect.composio.dev/mcp"&lt;/span&gt;
    headers:
      x-consumer-api-key: &lt;span class="s2"&gt;"YOUR_COMPOSIO_API_KEY"&lt;/span&gt;
    connect_timeout: 60
    &lt;span class="nb"&gt;timeout&lt;/span&gt;: 180
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your own api key you copied &amp;amp; save the file&lt;/p&gt;

&lt;p&gt;Now, head back to Hermes Agent and restart it using &lt;code&gt;hermes&lt;/code&gt;, and it will detect the mcp.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yqf2qa96lx5r8jr6sav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yqf2qa96lx5r8jr6sav.png" alt="MCP" width="800" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can use Hermes Agent with MCP like any other agent, even though code runs in the sandbox:).&lt;/p&gt;

&lt;p&gt;Alright now that we have agent &amp;amp; mcp in place, let’s try to see how it performs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Add MCP using Composio CLI (Optional)
&lt;/h2&gt;

&lt;p&gt;Composio also has a CLI, which let’s any agent to communicate with all the tools through commands. The CLI allows composability of workflows. The agent can chain tools and accomplish complex tasks with relatively lesser tokens than MCPs.&lt;/p&gt;

&lt;p&gt;Using it is straight forward. Open your Hermes agent and paste the prompt mentioned on &lt;a href="https://composio.dev/cli" rel="noopener noreferrer"&gt;https://composio.dev/cli&lt;/a&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;INSTALL (run in user's terminal)
  curl -fsSL https://composio.dev/install | bash

You have access to 1000+ app integrations through these commands.
search → find tools. execute → run them. link → connect accounts.
proxy → raw API access. run → inline scripts.

Bias toward action: run &lt;span class="sb"&gt;`composio search &amp;lt;task&amp;gt;`&lt;/span&gt;, then &lt;span class="sb"&gt;`composio execute &amp;lt;slug&amp;gt;`&lt;/span&gt;.
Input validation, auth checks, and error messages are built in — just try it.

USAGE
  composio &lt;span class="nt"&gt;&amp;lt;command&amp;gt;&lt;/span&gt; [options]

CORE COMMANDS
  search
    Find tools. Use this first — describe what you need in natural language.
    Usage: composio search &lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt; [--toolkits text] [--limit integer]
      &lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt;             Semantic use-case query (e.g. "send emails")
      --toolkits          Filter by toolkit slugs, comma-separated
      --limit             Number of results per page (1-1000)

  execute
    Run a tool. Handles input validation and auth checks automatically.
    If auth is missing, the error tells you what to run. Use aggressively.
    Usage: composio execute &lt;span class="nt"&gt;&amp;lt;slug&amp;gt;&lt;/span&gt; [-d, --data text] [--dry-run] [--get-schema]
      &lt;span class="nt"&gt;&amp;lt;slug&amp;gt;&lt;/span&gt;              Tool slug (e.g. "GITHUB_CREATE_ISSUE")
      -d, --data          JSON or JS-style object arguments, e.g. -d '{ repo: "foo" }', @file, or - for stdin
      --dry-run           Validate and preview the tool call without executing it
      --get-schema        Fetch and print the raw tool schema

  link
    Connect an account. Only needed when execute tells you to — don't preemptively link.
    Usage: composio link [&lt;span class="nt"&gt;&amp;lt;toolkit&amp;gt;&lt;/span&gt;] [--no-browser]
      &lt;span class="nt"&gt;&amp;lt;toolkit&amp;gt;&lt;/span&gt;           Toolkit slug to link (e.g. "github", "gmail")

  run
    Run inline TS/JS code with shimmed CLI commands; injected execute(), search(), proxy(), subAgent(), and z (zod).
    Usage: composio run &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt; [-- ...args] | run [-f, --file text] [-- ...args] [--dry-run]
      &lt;span class="nt"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;              Inline Bun ESNext code to evaluate
      -f, --file          Run a TS/JS file instead of inline code
      --dry-run           Preview execute() calls without running remote actions

  proxy
    curl-like access to any toolkit API through Composio using your linked account.
    Usage: composio proxy &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt; --toolkit text [-X method] [-H header]... [-d data]
      &lt;span class="nt"&gt;&amp;lt;url&amp;gt;&lt;/span&gt;               Full API endpoint URL
      --toolkit           Toolkit slug whose connected account should be used
      -X, --method        HTTP method (GET, POST, PUT, DELETE, PATCH)
      -H, --header        Header in "Name: value" format. Repeat for multiple.
      -d, --data          Request body as raw text, JSON, @file, or - for stdin

  artifacts
    Inspect the cwd-scoped session artifact directory and history.
    Usage: composio artifacts cwd
      cwd                 Print the current session artifact directory path

  Workflow: search → execute. If execute fails with an auth error, run link, then retry.

TOOLS
  tools info &lt;span class="nt"&gt;&amp;lt;slug&amp;gt;&lt;/span&gt;     Print tool summary and cache its schema
  tools list &lt;span class="nt"&gt;&amp;lt;toolkit&amp;gt;&lt;/span&gt;  List tools available in a toolkit
  artifacts cwd         Print the cwd-scoped session artifact directory

EXAMPLES
  # 1. User asks you to "create a GitHub issue"
  composio search "create github issue"
  # → returns GITHUB_CREATE_ISSUE

  # 2. Execute it (will error if not linked — that's fine)
  composio execute GITHUB_CREATE_ISSUE -d '{ repo: "owner/repo", title: "Bug" }'
  # → if auth missing: "Run &lt;span class="sb"&gt;`composio link github`&lt;/span&gt; first"

  # 3. Link only when told to
  composio link github

  # 4. Raw API access when no tool exists
  composio proxy https://gmail.googleapis.com/gmail/v1/users/me/profile --toolkit gmail

  # 5. Run a script with injected helpers
  composio run 'const me = await execute("GITHUB_GET_THE_AUTHENTICATED_USER"); console.log(me)'

DEVELOPER COMMANDS
  dev       Developer workflows: init, playground execution, triggers, and logs.
  generate  Generate type stubs for toolkits, tools, and triggers (TypeScript | Python).
  manage    Manage orgs, toolkits, connected accounts, triggers, auth configs, and projects.

ACCOUNT
  login    Log in to Composio
  logout   Log out from Composio
  whoami   Show current account info
  version  Display CLI version
  upgrade  Upgrade CLI to the latest version

FLAGS
  -h, --help     Show help for command
  --version      Show composio version

LEARN MORE
  Use &lt;span class="sb"&gt;`composio &amp;lt;command&amp;gt; --help`&lt;/span&gt; for more information about a command.
  Documentation: https://docs.composio.dev

GETTING STARTED
  When your user asks you to do something with an external app:
&lt;span class="p"&gt;  1.&lt;/span&gt; composio search "&lt;span class="nt"&gt;&amp;lt;what&lt;/span&gt; &lt;span class="na"&gt;they&lt;/span&gt; &lt;span class="na"&gt;want&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;"
&lt;span class="p"&gt;  2.&lt;/span&gt; composio execute &lt;span class="nt"&gt;&amp;lt;slug&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt; &lt;span class="na"&gt;search&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; -d '&lt;span class="nt"&gt;&amp;lt;params&amp;gt;&lt;/span&gt;'
&lt;span class="p"&gt;  3.&lt;/span&gt; If auth error → composio link &lt;span class="nt"&gt;&amp;lt;toolkit&amp;gt;&lt;/span&gt;, then retry step 2.

  Do not assume we lack coverage. Search first — we likely support it.
  Do not preemptively link accounts or ask your user what to connect.
  Just try. Auth and validation errors are self-descriptive.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This set’s agent to use Composio cli and do all the task, rather than using direct mcp - infact this approach much simpler as no dependency is required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Far36vjedj9ca8o0g2w0l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Far36vjedj9ca8o0g2w0l.png" alt="Composio CLI with Hermes Usage" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alright now that we have agent &amp;amp; mcp in place, time to build the financial agent&lt;/p&gt;




&lt;h2&gt;
  
  
  Building A Financial Analyst Agent
&lt;/h2&gt;

&lt;p&gt;Head to the Hermes Agent, if not active - enable it using Hermes , ensure the MCP section have Composio and all other relevant MCP’s showing up (Gmail, Google Sheet, Google Docs , Exa Search). This is essential.&lt;/p&gt;

&lt;p&gt;Now in the prompt box, paste the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are my personal Indian stock market financial analyst. Start by asking me exactly 5 screening questions one at a time to assess my risk appetite (cover: risk tolerance, investment horizon, capital range, sectors of interest, and reaction to loss). Once done, analyze my answers and begin your analyst workflow:

**Setup:** Attempt to use Google Docs, Google Sheets, and Gmail via your Composio tools. If any are not connected, Composio will automatically generate a sign-in link — share it with me, wait for me to authenticate, then resume once all connections are active.

**Every 5 minutes, run this loop:**

1. **Data Gathering:** Pull live Indian stock market data from multiple sources in parallel:
   - **Exa Search Tool:** Use composio Exa tool to search for latest Indian stock market news, analyst reports, earnings updates, sector trends, and breaking financial events. Query terms like "NSE BSE India stocks today", "Indian market sentiment", "Nifty Sensex analysis", top sector movements, and any stock-specific news relevant to my risk profile.
   - **Free Financial APIs &amp;amp; Web Sources:** NSE India API, BSE India, Yahoo Finance India, Moneycontrol, Tickertape, Economic Times Markets, and any other authoritative free real-time Indian market feeds available to you.
   - Cross-reference and reconcile data from both sources for accuracy before analysis.

2. Analyze all gathered data against my risk profile.

3. **Google Doc:** Search for an existing doc named "Hermes Financial Report - India". If found, append a new report section separated by `---`. If not, create it. Each report must be clean, well-structured with proper headings, and include: timestamp, market summary, macro indicators, top picks with clear reasoning, what to avoid and why, and a decisive final recommendation paragraph. Use proper spacing, bold headers, and bullet points for readability.

4. **Google Sheet:** Search for an existing sheet named "Hermes Stock Tracker - India". If found, append new rows. If not, create it. Format the sheet with bold column headers, frozen top row, and color-coded sentiment (Bullish = green, Bearish = red, Neutral = yellow where possible). Columns: Stock Name | Ticker | Exchange (NSE/BSE) | Sector | Market Sentiment (Bullish/Bearish/Neutral) | My Prediction (Yes/No) | Confidence % | Min Investment (INR) | Last Updated.

5. **Hourly Email via Gmail:** After every report cycle, send me a well-formatted email with:
   - **Subject:** 📊 Hermes Market Report — [Date &amp;amp; Time IST]
   - **Body:** A brief 3–5 line market summary, top 3 stock picks with one-line reasoning each, one key risk to watch, and direct clickable links to the updated Google Doc and Google Sheet.
   - Keep the email clean, scannable, and professional — use spacing, bold labels, and short paragraphs.

**Urgent Signal Alert (send immediately, outside the hourly loop):** If at any point you detect a strong buy or sell signal (significant price movement, breaking news from Exa or any financial source, sentiment shift, or macro event affecting Indian markets), instantly send a separate alert email with:
   - **Subject:** 🚨 URGENT: [BUY/SELL] Signal — [Stock Name] — [Time IST]
   - **Body:** Stock name, ticker, exchange, signal type (Buy/Sell), reason in 2–3 crisp lines, recommended action, and link to the Google Doc &amp;amp; Google Sheet for full context.

Never stop the loop unless I say stop. Be decisive, data-driven, and always flag urgency clearly.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this prompt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You get asked 5 questions, and it builds a personal risk profile tailored to your investment style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every hour, it automatically scans NSE, BSE, Exa, Yahoo Finance, Moneycontrol and more for live Indian market data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It writes a detailed investment report (what to buy, what to avoid, why) into a Google Doc - appending fresh analysis every cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It maintains a live Google Sheet tracking top Indian stocks with sentiment, prediction, confidence, and minimum investment amount.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It emails you a clean market summary every hour, and fires an instant alert the moment it spots an urgent buy or sell signal.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: For demo i set the 1 hour duration to 5 minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now wait for execution to finish and cron job to be created. This is what my flow looked like:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/7nteuv1QA5c"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Agent by default didn’t had access to Gmail, Sheet, Docs &amp;amp; EXA, and manually adding them was a pain (if say 20+ tools) and it bloats the context window as well.&lt;/p&gt;

&lt;p&gt;Composio solves the issue. You add it once, and it takes care of: - OAuth (one time link- did beforehand), &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;calling right tool at runtime when needed, &lt;/li&gt;
&lt;li&gt;performing all the actions in sandbox and &lt;/li&gt;
&lt;li&gt;deliver the result, 
while Hermes Agent handled the orchestration and reasoning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note : If you haven’t connected any tool, while running agent, agent will ask you to connect, authenticate. Also for EXA - use a api key.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>productivity</category>
      <category>hermes</category>
    </item>
    <item>
      <title>Top 10 Agent Skills Every Developer Should Install 🦾🛠️</title>
      <dc:creator>Aakash R</dc:creator>
      <pubDate>Tue, 14 Apr 2026 08:04:56 +0000</pubDate>
      <link>https://forem.com/composiodev/top-10-agent-skills-every-developer-should-install-1k51</link>
      <guid>https://forem.com/composiodev/top-10-agent-skills-every-developer-should-install-1k51</guid>
      <description>&lt;p&gt;AI agents are easy to demo, but getting them to work in real use is a different challenge.&lt;/p&gt;

&lt;p&gt;Many setups can give good answers. Very few can finish a task, deal with errors, and keep track of what is going on across steps. To build that kind of agent, you need the right skills, such as using tools, managing memory, handling data, deploying your setup, and shaping how people use it.&lt;/p&gt;

&lt;p&gt;This article covers the &lt;strong&gt;top 10 skills you need&lt;/strong&gt; to build AI agents that actually work outside demos. Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Tool Integration with Composio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; helps your agent connect to external tools and APIs without dealing with complex setup. You can plug your agent into &lt;strong&gt;1000+ tools&lt;/strong&gt; like Gmail, Slack, GitHub, and more, and start executing real actions quickly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluubhwwlfltvh0uxb0pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fluubhwwlfltvh0uxb0pm.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ComposioHQ/skills" rel="noopener noreferrer"&gt;Composio’s skill&lt;/a&gt; pack is built from real production use. It handles things that most agents get wrong, such as tool routing, session handling, authentication, and real-time events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tool Routing:&lt;/strong&gt; Picking the right tool at the right time with proper session control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication Flows:&lt;/strong&gt; OAuth, API keys, auto vs manual auth, and connection handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Management:&lt;/strong&gt; Keeping user data isolated across multi-user setups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook And Trigger Handling:&lt;/strong&gt; Creating triggers, verifying requests, and managing lifecycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Framework Integration:&lt;/strong&gt; Working with LangChain, OpenAI Agents SDK, CrewAI, and Claude&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without this skill, agents often mix up user sessions, break authentication, or call tools out of order. These issues may not show up in testing, but they cause serious failures in real use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add composiohq/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the layer that turns your agent from a chatbot into a system that can actually get work done.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Frontend And Deployment Skills with &lt;a href="https://github.com/vercel-labs/agent-skills" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/vercel-labs/agent-skills" rel="noopener noreferrer"&gt;Vercel’s agent skills&lt;/a&gt; focus on building and deploying fast web apps using React and Next.js. It covers performance, UX, accessibility, and deployment best practices. This is a core skill set for any agent working on frontend or full-stack projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu08a1g2mn7stb6893rm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu08a1g2mn7stb6893rm1.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React And Next.js Performance:&lt;/strong&gt; 40+ rules across multiple areas, from fixing render waterfalls to better caching patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle Optimization:&lt;/strong&gt; Reducing bundle size, using dynamic imports, and avoiding unnecessary client components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server and Client Boundary:&lt;/strong&gt; Sending only required data across components and avoiding over-serialization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frontend is where most agent-generated code breaks first. Code may work locally but fail in real-world use due to slow load times, poor structure, or bad UX. Without this skill, agents create apps that feel slow and unstable at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add vercel-labs/agent-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Memory And Retrieval Skills with Weaviate
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/weaviate/agent-skills" rel="noopener noreferrer"&gt;The Weaviate agent skill pack&lt;/a&gt; connects your agent to Weaviate’s infrastructure and fixes a common issue where agents guess outdated syntax or misuse search settings. It helps your agent build reliable semantic search and retrieval systems without errors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbnsqnexc63xubbz6kn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqbnsqnexc63xubbz6kn3.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cluster Management:&lt;/strong&gt; Inspecting schemas, creating collections, and managing metadata&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Lifecycle:&lt;/strong&gt; Importing and structuring CSV, JSON, and JSONL data with clean pipelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Search:&lt;/strong&gt; Choosing between keyword, semantic, and hybrid search with correct tuning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Search:&lt;/strong&gt; Using natural language queries with built-in search and citation support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Retrieval:&lt;/strong&gt; Working with multivector embeddings and combining BM25 with vector search&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;End-to-End Cookbooks:&lt;/strong&gt; Building full RAG pipelines, chat systems, and deployable services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Without this skill, agents often use outdated syntax, break search queries, or miss key setup steps. With it, an agent can set up a working search system, load data, and build a usable retrieval pipeline in minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add weaviate/agent-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Model And ML Workflow Skills with Hugging Face
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/huggingface/skills" rel="noopener noreferrer"&gt;Hugging Face agent&lt;/a&gt; skill pack connects your agent to the full Hugging Face ecosystem. It supports tools like Claude Code, Codex, Gemini CLI, and Cursor, and covers the complete ML workflow from datasets to training to deployment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3epkvnf4q34rq85sf0zw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3epkvnf4q34rq85sf0zw.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HF CLI: Managing models, datasets, repositories, and authentication using tokens&lt;/li&gt;
&lt;li&gt;Dataset Workflows: Fetching data, filtering, searching, and downloading structured datasets&lt;/li&gt;
&lt;li&gt;Model Training: Fine-tuning with SFT, DPO, GRPO, reward models, and handling deployment formats like GGUF&lt;/li&gt;
&lt;li&gt;Gradio UIs: Building demos, chat interfaces, and interactive web apps&lt;/li&gt;
&lt;li&gt;HF Jobs: Running GPU workloads, batch jobs, and tracking experiments&lt;/li&gt;
&lt;li&gt;Transformers.js: Running models directly in the browser&lt;/li&gt;
&lt;li&gt;Paper Publishing: Managing and linking research papers with models and datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ML workflows include many connected steps where small mistakes can break results. Issues like wrong configs, poor batching, or missed auth steps can affect training and output quality. This skill helps agents follow correct patterns and produce reliable results across the workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add huggingface/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Web Data And Automation Skills with Olostep
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/olostep/olostep-mcp-server" rel="noopener noreferrer"&gt;Olostep&lt;/a&gt; is a web scraping, crawling, and search API built for AI workflows. The Olostep setup works through MCP, so you can plug it into any MCP-compatible agent and grant it access to real-time web data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrspaevqq724hqszhbua.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsrspaevqq724hqszhbua.png" alt=" " width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single URL Scraping: Extracting content from any page in Markdown, HTML, JSON, or plain text with JavaScript support&lt;/li&gt;
&lt;li&gt;Batch Extraction: Processing up to 100,000 URLs in parallel with structured outputs&lt;/li&gt;
&lt;li&gt;Site Crawling: Moving across pages to collect data from full websites&lt;/li&gt;
&lt;li&gt;Structured Parsers: Using ready-made extractors for sources like Amazon, Google Search, and Maps&lt;/li&gt;
&lt;li&gt;Natural Language Extraction: Asking for data in plain English and getting structured results&lt;/li&gt;
&lt;li&gt;Web Agents: Automating steps like form filling, clicking, and navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Web data is messy, inconsistent, and often blocked. Agents that try to scrape on their own spend time on retries, broken parsing, and access issues. Olostep handles these problems and returns clean, usable data in a single step.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Infrastructure And Edge Skills with Cloudflare
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/cloudflare/skills" rel="noopener noreferrer"&gt;Cloudflare agent skill&lt;/a&gt; &lt;strong&gt;pack&lt;/strong&gt; covers a full platform for building, deploying, and running applications at the edge. It includes compute, storage, AI tools, networking, and security, all in one place. Skills load based on what your agent is working on, so there is no manual setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3uqby9fycj4dzrc05qii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3uqby9fycj4dzrc05qii.png" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Workers And Pages: Deploying serverless functions and static sites with proper configs, routes, and secrets&lt;/li&gt;
&lt;li&gt;Storage: Using KV, D1, and R2 based on the type of data and access pattern&lt;/li&gt;
&lt;li&gt;Durable Objects: Managing stateful logic, coordination, and real-time features with WebSockets and storage&lt;/li&gt;
&lt;li&gt;AI On The Edge: Running inference, vector search, and building stateful agents with built-in tools&lt;/li&gt;
&lt;li&gt;MCP Server Creation: Creating remote MCP servers with tool access and OAuth support&lt;/li&gt;
&lt;li&gt;Performance: Improving load times, caching responses, and fixing render-blocking issues&lt;/li&gt;
&lt;li&gt;Security: Setting up WAF, handling DDoS protection, and applying Zero Trust patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloudflare has many moving parts and strict runtime rules. Agents often use unsupported APIs, misconfigure storage, or deploy incorrectly. This skill helps the agent follow correct patterns and build systems that run reliably at the edge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add cloudflare/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Monitoring And Debugging Skills with Sentry
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/getsentry/skills" rel="noopener noreferrer"&gt;Sentry agent skill&lt;/a&gt; pack is based on real patterns used by the Sentry engineering team. It is not basic documentation. It reflects how production systems are monitored, debugged, and maintained at scale.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc39q533e607cc71fgvlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc39q533e607cc71fgvlq.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AGENTS.md Generation: Creating and updating agent docs that match real project structure&lt;/li&gt;
&lt;li&gt;Claude Settings Auditing: Checking configs early to catch issues before they reach production&lt;/li&gt;
&lt;li&gt;Sentry SDK Integration: Setting up error tracking, DSNs, source maps, and capturing useful context&lt;/li&gt;
&lt;li&gt;Error Triage Patterns: Managing issues, grouping errors, setting alerts, and tracking releases&lt;/li&gt;
&lt;li&gt;Observability For Agents: Making workflows traceable and easy to debug with distributed tracing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agents that ship code without monitoring create failures that are hard to detect and fix. This skill ensures your agent sets up tracking from the start, so errors are visible and easier to debug in real use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add getsentry/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Backend And Database Skills with Supabase
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/supabase/supabase/tree/master/.agents/skills/vitest" rel="noopener noreferrer"&gt;Supabase agent skill pack&lt;/a&gt; teaches your agent how to work with a full backend platform built on Postgres. It covers database, auth, storage, real-time features, and serverless functions. It is widely used in modern full-stack apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6moezllah8vk7kqed1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6moezllah8vk7kqed1j.png" alt=" " width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postgres Best Practices: Writing efficient queries, using indexes, and avoiding slow patterns&lt;/li&gt;
&lt;li&gt;Row Level Security: Defining access rules correctly to protect user data&lt;/li&gt;
&lt;li&gt;Auth Patterns: Managing sessions, JWTs, OAuth, and protected routes&lt;/li&gt;
&lt;li&gt;Storage: Handling file uploads, access control, and signed URLs&lt;/li&gt;
&lt;li&gt;Edge Functions: Deploying serverless logic with proper configs and secrets&lt;/li&gt;
&lt;li&gt;Realtime: Subscribing to changes, tracking presence, and managing connections&lt;/li&gt;
&lt;li&gt;Client Libraries: Using Supabase SDKs with proper typing and error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supabase is used in many production apps, but small mistakes can cause serious issues. Poor queries can slow systems down, and incorrect access rules can expose data. This skill helps your agent follow correct patterns for both performance and security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add supabase/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Payments And Billing Skills with Stripe
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/stripe/ai" rel="noopener noreferrer"&gt;Stripe agent skill&lt;/a&gt; pack teaches your agent how to build secure payment flows, manage subscriptions, and handle billing systems correctly. It covers the full lifecycle of payments and helps avoid costly mistakes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuhs3xpwpyiwfyo8c2vf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuhs3xpwpyiwfyo8c2vf.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payment Intents:&lt;/strong&gt; Creating and confirming payments, handling authentication flows, and avoiding duplicate charges&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscriptions And Billing:&lt;/strong&gt; Managing recurring payments, plan changes, trials, and cancellations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook Handling:&lt;/strong&gt; Verifying signatures, handling retries, and processing events in the correct order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connect And Payouts:&lt;/strong&gt; Routing payments in marketplace setups and handling transfers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fraud Detection:&lt;/strong&gt; Using risk signals and rules to prevent fraud without blocking valid users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test Mode Patterns:&lt;/strong&gt; Simulating real payment scenarios and testing failure cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error Handling:&lt;/strong&gt; Managing declines, network issues, and retries without breaking the flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Payments are a critical part of any product. Small mistakes can lead to failed transactions, duplicate charges, or broken billing flows. This skill helps your agent follow safe and reliable patterns from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add stripe/agent-toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Video And Media Generation Skills with Remotion
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/remotion-dev/remotion" rel="noopener noreferrer"&gt;Remotion agent skill&lt;/a&gt; pack teaches your agent how to create videos using code. It uses React to build, structure, and render videos, which opens up a new type of output that most agents cannot handle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hcra9vojsarha668e8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4hcra9vojsarha668e8i.png" alt=" " width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the agent learns:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composition Model: Structuring videos using React components, sequences, and layouts&lt;/li&gt;
&lt;li&gt;Timeline API: Controlling animation with frame-based logic and timing functions&lt;/li&gt;
&lt;li&gt;Rendering Pipeline: Generating videos in formats like MP4, WebM, and GIF using the CLI&lt;/li&gt;
&lt;li&gt;Audio And Video Assets: Adding and syncing audio, clips, and visual elements&lt;/li&gt;
&lt;li&gt;Dynamic Content: Creating videos that change based on data or inputs&lt;/li&gt;
&lt;li&gt;Walkthrough Generation: Producing product demos and app walkthrough videos from UI flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Video creation has mostly been manual and tool-heavy. This skill allows your agent to generate videos directly from code, enabling automation of content such as demos, reports, and visual stories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add remotion-dev/remotion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The agent skills ecosystem is moving fast. Fine-tuning changes how an AI behaves and is costly to maintain. Agent skills are simple instruction files. You can update, swap, or share them at any time without changing the model.&lt;/p&gt;

&lt;p&gt;Each skill pack in this list carries real engineering knowledge. It includes production patterns, lessons from real systems, and platform-specific practices, all in a form an agent can use right away.&lt;/p&gt;

&lt;p&gt;Install the ones that match your stack. Your agents will spend less time making errors and more time getting work done.&lt;/p&gt;

</description>
      <category>agentskills</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>Top 10 CLI Tools to Level-Up Claude Code</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Mon, 06 Apr 2026 12:51:40 +0000</pubDate>
      <link>https://forem.com/composiodev/top-10-cli-tools-to-level-up-claude-code-1kf9</link>
      <guid>https://forem.com/composiodev/top-10-cli-tools-to-level-up-claude-code-1kf9</guid>
      <description>&lt;p&gt;I've been using Claude Code more than any other AI agents recently.&lt;/p&gt;

&lt;p&gt;And when it's the tool you use the most, it just makes sense to make that workflow as productive as possible.&lt;/p&gt;

&lt;p&gt;A lot of the experience comes down to the small tools around it. The ones that help you search, navigate, review diffs, watch system usage, or just keep your workflow clean.&lt;/p&gt;

&lt;p&gt;So this post is a simple list of the CLI tools I think pair really nicely with Claude Code.&lt;/p&gt;

&lt;p&gt;There's an awesome repo with a curated collection of CLI tools for coding agents: &lt;a href="https://github.com/ComposioHQ/awesome-agent-clis" rel="noopener noreferrer"&gt;awesome-agent-clis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqdpesfbdf4xrlpgg33w.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqdpesfbdf4xrlpgg33w.gif" alt="swag gif" width="500" height="284"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What does "tools for Claude Code" actually mean?
&lt;/h2&gt;

&lt;p&gt;Claude Code is already powerful on its own.&lt;/p&gt;

&lt;p&gt;But it gets even better when you pair it with the right terminal tools, especially since you’re already working in the terminal.&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;not talking&lt;/strong&gt; about tools built specifically for Claude Code.&lt;/p&gt;

&lt;p&gt;I mean the CLI tools that make the overall workflow smoother, faster, and easier to manage while Claude is working in your repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;GitHub CLI&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ GitHub’s official CLI for working from the terminal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2e1eahx78q1aaboalu6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2e1eahx78q1aaboalu6.png" alt="GitHub cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;GitHub CLI is basically running GitHub from your terminal. You can create repos, check issues, review PRs, manage branches, and handle a bunch of GitHub workflow stuff without leaving your shell.&lt;/p&gt;

&lt;p&gt;It can be as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh repo create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;for creating a new repository through an interactive prompt, which is one I use the most. And there are tons of other commands you can use.&lt;/p&gt;

&lt;p&gt;Find all the others in the help window.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;This one probably will not be for everyone.&lt;/p&gt;

&lt;p&gt;A lot of people do not want to give Claude access to their GitHub repos, and that is totally fair. But if you are comfortable with it, I honestly think it is one of the best tools to pair with Claude Code.&lt;/p&gt;

&lt;p&gt;Or even if you do not want Claude directly using it, GitHub CLI is still great to have beside Claude Code since you can just run the commands yourself and keep moving without leaving the terminal.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. &lt;a href="https://composio.dev" rel="noopener noreferrer"&gt;Composio&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ An MCP server that connects Claude Code to hundreds of external apps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlarqn9v88xzclo19eid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlarqn9v88xzclo19eid.png" alt="composio cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;Composio is an MCP server you can add to Claude Code so it can work with 500+ apps.&lt;/p&gt;

&lt;p&gt;You can find the guide on how to connect Composio with Claude Code here: &lt;a href="https://composio.dev/toolkits/composio/framework/claude-code" rel="noopener noreferrer"&gt;Composio Universal CLI&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;The main way I use Composio with Claude Code is for email.&lt;/p&gt;

&lt;p&gt;Say I am working on something and need to send a mail to someone.&lt;/p&gt;

&lt;p&gt;Without this, I would usually have to stop, open my mail client, write the message, double check it, and send it myself.&lt;/p&gt;

&lt;p&gt;With Composio set up inside Claude Code, I can just ask Claude to draft the email, or give it the content and the recipient, and it can handle the rest for me.&lt;/p&gt;

&lt;p&gt;And maybe most importantly, no more spelling mistakes in your emails. 😃&lt;/p&gt;

&lt;p&gt;That is the workflow I use the most.&lt;/p&gt;

&lt;p&gt;Since you have 500+ app access, you can already imagine how many other things you could automate from there.&lt;/p&gt;

&lt;p&gt;They recently added CLI support as well, which you can install here: &lt;a href="https://composio.dev/cli" rel="noopener noreferrer"&gt;Composio CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For development, Composio provides a playground with test users, execution logs, and real-time trigger streaming so you can iterate on agent behaviour locally before going to production.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. &lt;a href="https://github.com/burntsushi/ripgrep" rel="noopener noreferrer"&gt;ripgrep&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ The fastest way to search through a codebase from the terminal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx24j0f5r4gi5tiwpdz3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx24j0f5r4gi5tiwpdz3m.png" alt="ripgrep cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;It is a ridiculously fast search tool for the terminal.&lt;/p&gt;

&lt;p&gt;It lets you search through files, code, and folders almost instantly.&lt;/p&gt;

&lt;p&gt;If you have ever used &lt;code&gt;grep&lt;/code&gt;, which I assume you have, it's a complete and faster replacement for that in real world repos.&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rg &lt;span class="s2"&gt;"useEffect"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That will search for &lt;code&gt;useEffect&lt;/code&gt; across your entire project and show you where it appears.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;This is one of the first tools I'd install.&lt;/p&gt;

&lt;p&gt;When working on a real world repo, you are constantly searching for things. Function names, config, and whatnot.&lt;/p&gt;

&lt;p&gt;ripgrep basically makes that fast.&lt;/p&gt;

&lt;p&gt;Even Claude Code defaults to using this tool when searching for things in its workflow. Overall, it is just super handy to have a quick way to move around the repo yourself without digging around manually.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. &lt;a href="https://github.com/tmux/tmux" rel="noopener noreferrer"&gt;tmux&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A better way to manage terminal sessions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;tmux lets you run multiple terminal sessions inside one terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd69oiqggj0gavhw01fve.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd69oiqggj0gavhw01fve.webp" alt="tmux workflow" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can split panes, open multiple windows, switch between them quickly, and keep everything organized without opening a bunch of separate &lt;strong&gt;terminal tabs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It might feel a little unnecessary at first. But once you get used to it, there is no way back.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;For me, tmux is one of the most useful tools to pair with Claude Code, and it is actually what is running in my terminal right now as I work on this blog inside Neovim. 👀&lt;/p&gt;

&lt;p&gt;I usually have Claude in a pane, with Neovim or a server running in one window, Lazygit in another, and then some extra panes for running commands.&lt;/p&gt;

&lt;p&gt;If you use Neovim, it gets even better. You can have Claude open in one split and Neovim in another. As Claude makes changes, if you need to edit something, Neovim is right there. And for diffs or Git work, Lazygit is sitting in another window.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyc3uxa400tcfr35714m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyc3uxa400tcfr35714m.png" alt="tmux workflow with claude code and lazygit" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How cool is that?&lt;/p&gt;

&lt;p&gt;You are not constantly jumping between tabs or losing track of what is running where.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. &lt;a href="https://github.com/FFmpeg/FFmpeg" rel="noopener noreferrer"&gt;FFmpeg&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ The go-to CLI tool for handling just about any media file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi9ut1s6ljrfojjzlr9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxi9ut1s6ljrfojjzlr9r.png" alt="ffmpeg cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;Honestly, this is one of the best tools I have added to my workflow recently.&lt;/p&gt;

&lt;p&gt;FFmpeg is a command line tool for working with media files. You can use it to convert images from one format to another, like PNG to JPG, convert video formats, compress files, trim audio, and do all sorts of file processing.&lt;/p&gt;

&lt;p&gt;It supports basically every format you can think of.&lt;/p&gt;

&lt;p&gt;As developers, we end up doing this kind of stuff all the time. And having one tool that handles all of it from the terminal is just super handy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;FUN FACT:&lt;/strong&gt; Almost all the online media tools that you use on the internet, like online video compressors and similar stuff, are powered by FFmpeg under the hood.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you have it in your terminal, you really don't need to ever visit such sites.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;The only catch is that FFmpeg commands are a little complex.&lt;/p&gt;

&lt;p&gt;Even for a simple task, the syntax is just a little too much to understand.&lt;/p&gt;

&lt;p&gt;Here's a quick command to crop a video file:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffmpeg &lt;span class="nt"&gt;-i&lt;/span&gt; input.mp4 &lt;span class="nt"&gt;-vf&lt;/span&gt; &lt;span class="s2"&gt;"crop=1280:720:0:0"&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;:a copy output.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is exactly where Claude Code becomes useful.&lt;/p&gt;

&lt;p&gt;You can just describe what you want in plain English, and let Claude generate the right FFmpeg command for you.&lt;/p&gt;


&lt;h2&gt;
  
  
  6. &lt;a href="https://github.com/jesseduffield/lazygit" rel="noopener noreferrer"&gt;Lazygit&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A simple TUI for Git&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hlcu02qahtbawpce5ay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hlcu02qahtbawpce5ay.png" alt="lazygit cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;Lazygit is a terminal UI for Git.&lt;/p&gt;

&lt;p&gt;It gives you a much nicer way to handle things like commits, branches, stashing, rebasing, and reviewing changes without typing every Git command manually.&lt;/p&gt;

&lt;p&gt;You still stay in the terminal.&lt;/p&gt;

&lt;p&gt;It just makes the whole Git workflow super easy, and you do not need to remember and type out any commands. Just knowing the concepts is enough.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;This is one I always have open beside Claude Code.&lt;/p&gt;

&lt;p&gt;When Claude makes a lot of changes in a bunch of files, Lazygit makes it easier to review everything, stage only what you want, and manage the overall Git workflow.&lt;/p&gt;

&lt;p&gt;I usually keep Lazygit open in every session inside tmux, in its own window, so I can quickly jump there and handle Git stuff whenever I need to.&lt;/p&gt;

&lt;p&gt;I will talk about tmux a bit later in the list, but this combo works really well.&lt;/p&gt;


&lt;h2&gt;
  
  
  7. &lt;a href="https://github.com/aristocratos/btop" rel="noopener noreferrer"&gt;btop&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ A much better way to monitor your system&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggie92tumu7etywbvlrx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggie92tumu7etywbvlrx.png" alt="btop cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;btop is a system monitor for the terminal.&lt;/p&gt;

&lt;p&gt;It gives you a clean view of CPU, memory, disk, network, and running processes, all in one place.&lt;/p&gt;

&lt;p&gt;There is also htop, which a lot of people already know and use. But personally, I prefer btop.&lt;/p&gt;

&lt;p&gt;It just feels a bit more user friendly, and overall nicer and easier to filter down processes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;When you are doing a lot inside the terminal, especially with bigger repos, it is really useful to keep an eye on system usage.&lt;/p&gt;

&lt;p&gt;That might be Claude, any processes it launches with your permission, local servers, or anything else running in the background.&lt;/p&gt;

&lt;p&gt;btop gives you a quick way to see what is eating memory, what is using CPU, and whether your machine is starting to struggle, especially when you're using local models.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. &lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ The backbone of fuzzy finding in the terminal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqev3t1z88tdq2vt87u8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqev3t1z88tdq2vt87u8e.png" alt="fzf cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;I have probably been using this tool longer than any other in this list.&lt;/p&gt;

&lt;p&gt;fzf is a command line fuzzy finder.&lt;/p&gt;

&lt;p&gt;It lets you search and pick things interactively from the terminal.&lt;/p&gt;

&lt;p&gt;That could be files, directories, Git branches, command history, processes, or really anything you can pipe into it.&lt;/p&gt;

&lt;p&gt;If you haven't heard about this tool or have never used it, you are doing something wrong 😏.&lt;/p&gt;

&lt;p&gt;A simple example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f | fzf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This gives you a fuzzy searchable list of files in the current directory.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;This is one of those tools that just makes terminal workflows feel faster.&lt;/p&gt;

&lt;p&gt;Whether I am jumping between files, searching through something, or picking from a long list of options, fzf is usually involved somewhere. I have so many scripts built around fzf.&lt;/p&gt;

&lt;p&gt;And when you are already spending a lot of time in the terminal with Claude Code, that kind of speed matters.&lt;/p&gt;

&lt;p&gt;It is not really a Claude specific tool. It is one of the foundations that make working in the terminal and overall moving between things a lot better.&lt;/p&gt;


&lt;h2&gt;
  
  
  9. (Optional) &lt;a href="https://github.com/AlexsJones/llmfit" rel="noopener noreferrer"&gt;LLMFit&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Handy if you are experimenting with local or custom models alongside Claude Code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9agawf7zphwgqvrnqcbp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9agawf7zphwgqvrnqcbp.png" alt="llmfit cover" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What it is?
&lt;/h3&gt;

&lt;p&gt;LLMFit is a CLI tool that scans your system hardware and tells you which local AI models you can run smoothly on your system.&lt;/p&gt;

&lt;p&gt;If you are planning to run a local model, it is a nice way to avoid downloading something that your system will struggle with. Its whole purpose is to help match models to the machine you have.&lt;/p&gt;

&lt;p&gt;Installing is as simple as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;llmfit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, to scan your hardware against models, run this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;llmfit scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;and it will list out all the models with their metadata and performance scores based on your hardware.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why use it with Claude Code?
&lt;/h3&gt;

&lt;p&gt;This one is definitely more niche.&lt;/p&gt;

&lt;p&gt;But if you are running Claude Code with a local or custom model setup, it can help you figure out what will run well on your machine before you waste time downloading the wrong model.&lt;/p&gt;

&lt;p&gt;It is not something everyone will need, but for people who prefer the Claude Code agent and want to test newer local or custom models from other providers, this is an option as well.&lt;/p&gt;

&lt;p&gt;You can find many guides on doing that. One that I referenced while trying it out is by &lt;a href="https://medium.com/@luongnv89/run-claude-code-on-local-cloud-models-in-5-minutes-ollama-openrouter-llama-cpp-6dfeaee03cda" rel="noopener noreferrer"&gt;Luong NGUYEN&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  A few more nice ones
&lt;/h2&gt;

&lt;p&gt;There are also a few other terminal tools I use a lot that I did not want to give a full section to, but they are still very much part of the overall workflow.&lt;/p&gt;

&lt;p&gt;Things like &lt;strong&gt;fd&lt;/strong&gt;, &lt;strong&gt;zoxide&lt;/strong&gt;, &lt;strong&gt;eza&lt;/strong&gt;, &lt;strong&gt;yazi&lt;/strong&gt;, and &lt;strong&gt;bat&lt;/strong&gt; all make the terminal feel nicer to work in.&lt;/p&gt;

&lt;p&gt;Some help you move around directories faster. Some make listing files, previewing content, or moving around in the filesystem way better than the default.&lt;/p&gt;

&lt;p&gt;I leave it up to you to research these tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F860iemg7j7gkx4mp7ehw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F860iemg7j7gkx4mp7ehw.gif" alt="steve smith playing with magnifying glass" width="490" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of these are Claude Code specific.&lt;/p&gt;


&lt;h2&gt;
  
  
  Ones I'd install first
&lt;/h2&gt;

&lt;p&gt;If I had to set this up again from scratch, I’d probably start with &lt;strong&gt;ripgrep&lt;/strong&gt;, &lt;strong&gt;GitHub CLI&lt;/strong&gt;, &lt;strong&gt;tmux&lt;/strong&gt;, and &lt;strong&gt;Lazygit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That already covers a lot of the core workflow around Claude Code.&lt;/p&gt;

&lt;p&gt;And separately, I’d also set up &lt;strong&gt;Composio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s a bit different from the rest here. It’s not exactly just another CLI tool, but more of an MCP server. Really useful if you want to automate parts of your workflow and connect Claude to external tools in a cleaner way.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;You definitely do not need every tool in this list.&lt;/p&gt;

&lt;p&gt;But a few of them can make working with Claude Code a lot smoother, especially once you start using it more seriously.&lt;/p&gt;

&lt;p&gt;At the end of the day, it’s really just about making the workflow around Claude feel cleaner and easier to manage.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;Full Stack SDE • Open-Source Contributor • Collaborator @Oppia • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Top OpenClaw Integrations to Connect Your Workflow in 2026</title>
      <dc:creator>Aakash R</dc:creator>
      <pubDate>Mon, 06 Apr 2026 06:48:20 +0000</pubDate>
      <link>https://forem.com/composiodev/top-openclaw-integrations-to-connect-your-workflow-in-2026-1l5h</link>
      <guid>https://forem.com/composiodev/top-openclaw-integrations-to-connect-your-workflow-in-2026-1l5h</guid>
      <description>&lt;p&gt;If you are using OpenClaw, you likely work with multiple tools, and switching between them can quickly disrupt the flow of work. Emails, conversations, code, files, and customer data often stay spread across different platforms, so work can start to feel a bit disconnected.&lt;/p&gt;

&lt;p&gt;OpenClaw integrations bring these tools into a more connected flow. An update in one app can carry over to another, and information stays in sync as work moves forward. This cuts down repeated steps and keeps things moving without constant back-and-forth.&lt;/p&gt;

&lt;p&gt;Let us look at some of the most useful OpenClaw integrations across key categories and how they fit into your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hjb5vdwnxj1yqyzf8sh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hjb5vdwnxj1yqyzf8sh.jpg" alt=" " width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenClaw + Composio Integration
&lt;/h2&gt;

&lt;p&gt;Before getting into specific integrations, it helps to understand how OpenClaw connects with all these tools.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; acts as the integration layer behind OpenClaw and supports 1000+ tools across communication, development, productivity, and more. Access to this large set of apps comes through a single system, so everything feels more connected from the start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedrx8npgtfaujbp9sxhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedrx8npgtfaujbp9sxhz.png" alt=" " width="800" height="333"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://composio.dev/toolkits/outlook/framework/openclaw" rel="noopener noreferrer"&gt;OpenClaw integrates with Composio&lt;/a&gt; to manage these connections in a consistent way, which keeps each integration structured similarly. Different setups or patterns across tools are reduced, so working across them feels more straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Connect OpenClaw with Composio
&lt;/h2&gt;

&lt;p&gt;Getting OpenClaw connected with Composio takes a few simple steps. Once set up, integrations start working through a single flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Install the Composio plugin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Install the Composio plugin inside OpenClaw to begin the setup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @composio/openclaw-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Get your Composio API key&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Log in to the &lt;a href="https://dashboard.composio.dev/login" rel="noopener noreferrer"&gt;Composio dashboard&lt;/a&gt; and copy your API key. This key links your OpenClaw setup to your Composio account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeqtf2phbc47mdc35npz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxeqtf2phbc47mdc35npz.png" alt=" " width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Add the API key to OpenClaw&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Set the API key in your OpenClaw configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.composio.config.consumerKey &lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Restart OpenClaw&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Restart the OpenClaw gateway to apply the changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Authenticate your tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you start using tools, OpenClaw prompts authentication through Composio. Connect the apps you need, and they become available in your workflows.&lt;/p&gt;

&lt;p&gt;After completing these steps, OpenClaw can access and trigger actions across all connected tools through Composio, setting up the foundation for your integrations.&lt;/p&gt;

&lt;p&gt;Next, we will look at some of the most useful OpenClaw integrations across key categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  📧 Email and Communication
&lt;/h2&gt;

&lt;p&gt;Communication tools are where most work naturally starts and continues through the day. Conversations, emails, and quick updates keep things moving, but they can also get scattered across different apps.&lt;/p&gt;

&lt;p&gt;Connecting these tools with OpenClaw keeps everything closer to your workflow. Updates can move along with the work, and conversations stay tied to the actions they relate to, which keeps things clearer as tasks progress.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/gmail/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;1. Gmail&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Emails often mark the start of a task or follow-up. Connect Gmail to your workflow, and incoming messages can turn into tasks, updates, or next steps. Important threads stay linked to ongoing activities and keep everything visible and organized.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feb09d1rsviuq9x3ab0qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feb09d1rsviuq9x3ab0qo.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/slack/framework/openclaw" rel="noopener noreferrer"&gt;2. Slack&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Many business decisions are made in Slack. When connected to OpenClaw using Composio, the messages can directly trigger actions across your workflow. Discussions in channels can update tasks, notify team members, or move work forward as conversations progress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotpps6zv4he2fsedfbta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotpps6zv4he2fsedfbta.png" alt=" " width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/outlook/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;3. Microsoft Outlook&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Outlook is a big part of daily communication for many teams, especially for ongoing conversations and follow-ups. Emails can tie into tasks and updates, which keep important interactions easy to follow as work moves ahead. OpenClaw keeps these updates aligned across your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjnl36x5znfdtz35gtzu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjnl36x5znfdtz35gtzu.png" alt=" " width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/microsoft_teams/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;4. Microsoft Teams&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Teams is often where collaboration happens across chats and meetings. When linked with OpenClaw, updates and actions appear alongside conversations, keeping discussions and task progress closely connected.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kv3kqf4haqm3pk9asq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kv3kqf4haqm3pk9asq3.png" alt=" " width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Dev Tools
&lt;/h2&gt;

&lt;p&gt;Development work moves across code, issues, and collaboration. Keeping these tools aligned with OpenClaw keeps progress visible and reduces the need to manually track updates across platforms.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/github/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;1. GitHub&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;OpenClaw brings GitHub activity into your workflow, where code changes, pull requests, and issues stay visible as work moves forward. Teams often switch between repositories and task trackers to stay updated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn8tb8bve8i6a6msuqmb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkn8tb8bve8i6a6msuqmb.png" alt=" " width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository activity can be directly tied to tasks and progress, and development updates remain clear as changes occur.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/gitlab/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;2. GitLab&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;GitLab brings together code, pipelines, and collaboration in one space. OpenClaw brings build activity, commits, and issue updates into your workflow, and these updates shape how progress is tracked. These updates continue into your workflow through pipeline activity and code changes, and progress becomes easier to follow as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dxzlpxqdbnt982tlze5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9dxzlpxqdbnt982tlze5.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/bitbucket/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;3. Bitbucket&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Bitbucket supports teams working across repositories and code reviews, where feedback and changes happen continuously. Tracking these alongside tasks can get scattered. Pull requests and repository updates can remain tied to your workflow to keep code changes and reviews visible as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktrnnjm4wstlglkzkqxn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fktrnnjm4wstlglkzkqxn.png" alt=" " width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/jira/framework/openclaw" rel="noopener noreferrer"&gt;4. Jira&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Jira is widely used for managing issues, sprints, and development tasks. Progress depends on how clearly updates across tickets are tracked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwfjcdsa665mfs08ivno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwfjcdsa665mfs08ivno.png" alt=" " width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Changes in ticket status and task updates can reflect across your workflow, and this helps maintain clear and aligned progress across tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 Media
&lt;/h2&gt;

&lt;p&gt;Media and file management often sit across storage platforms, asset libraries, and content channels. Files move through different stages, such as creation, review, and publishing, and tracking these changes across tools can take extra effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/tiktok/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;1. TikTok&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;TikTok is used for creating and sharing short-form video content. Content updates, uploads, and engagement often tie closely to campaigns and timelines. OpenClaw connects video activity with your workflow, and updates around content and publishing stay aligned with ongoing tasks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcca6ocjyicetkjhtwqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzcca6ocjyicetkjhtwqr.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/instagram/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;2. Instagram&lt;/strong&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Instagram plays a key role in visual content and social engagement. Posts, reels, and updates often connect with marketing and content planning. Content activity can reflect across your workflow, and updates around publishing and engagement stay aligned with your plans.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3exlrvxil9q6t01tpaq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3exlrvxil9q6t01tpaq.png" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/twitter/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;3. X (Twitter)&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;X is widely used for real-time updates and audience engagement. Posts, replies, and interactions often connect with campaigns and communication strategies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6v2tpiomqmxmzfslp1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6v2tpiomqmxmzfslp1z.png" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Activity on X can tie into your workflow, and updates stay aligned with ongoing content and outreach efforts.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/youtube/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;4. YouTube&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;YouTube is used to host and manage video content. Uploads, edits, and performance tracking all play a role in content workflows. Video activity can span your workflow and provide better visibility into publishing timelines and how content performs within your overall process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6n826nnjqfyhbgx5ojz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx6n826nnjqfyhbgx5ojz.png" alt=" " width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Productivity
&lt;/h2&gt;

&lt;p&gt;Productivity tools sit at the center of planning, tracking, and organizing work. Tasks, notes, and schedules often live in separate apps, and aligning them can take extra effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/notion/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;1. Notion&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Notion is widely used for notes, documentation, and planning. Teams rely on it to organize ideas, track tasks, and manage internal knowledge. OpenClaw brings updates from Notion into your workflow, so changes in pages, tasks, or databases stay visible alongside ongoing work. This gives better clarity on how plans connect to execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpo5uf0wod0pqjohm4yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpo5uf0wod0pqjohm4yg.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/trello/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;2. Trello&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Trello organizes work through boards, lists, and cards. Tasks move across stages, and tracking these changes across tools can become fragmented. Card updates and task movements can reflect in your workflow, and progress across boards stays aligned with other activities and updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2xaeujgj7n69mfa8zal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh2xaeujgj7n69mfa8zal.png" alt=" " width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/asana/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;3. Asana&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Asana helps teams manage tasks, deadlines, and project timelines. Work often spans multiple teams and requires clear visibility into progress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feva55lxidc5i4yl9wykt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feva55lxidc5i4yl9wykt.png" alt=" " width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Task updates, status changes, and assignments can connect to your workflow, and progress across projects becomes easier to follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/googlecalendar/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;4. Google Calendar&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Google Calendar manages schedules, meetings, and reminders. Events often tie directly to tasks, deadlines, and team coordination. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hjejnwxe8qlq94zqe2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3hjejnwxe8qlq94zqe2r.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calendar events and updates can reflect in your workflow, and schedules stay aligned with tasks across teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  💼 Sales and CRM
&lt;/h2&gt;

&lt;p&gt;Sales and CRM tools manage leads, customer interactions, and deal progress. Data often moves across multiple stages, and tracking updates across tools can take extra effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/salesforce/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;1. Salesforce&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Salesforce is widely used to manage leads, accounts, and sales pipelines. Teams rely on it to track interactions and move deals through different stages. OpenClaw brings updates from Salesforce into your workflow, and changes in leads, deal stages, or customer data stay visible alongside related tasks and activities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmuqb996zlscwy2jf9kw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmuqb996zlscwy2jf9kw.png" alt=" " width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/hubspot/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;2. HubSpot&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;HubSpot supports marketing, sales, and customer engagement on a single platform. Campaigns, leads, and interactions often closely connect to ongoing work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgeviyqqojoskfrt40gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgeviyqqojoskfrt40gv.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Updates across contacts, deals, and campaigns can reflect in your workflow, and activity across teams stays aligned as progress develops.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/pipedrive/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;3. Pipedrive&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Pipedrive focuses on managing deals and tracking sales pipelines. Each stage of a deal requires visibility and timely updates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmymmgv381nq8e2dl26h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmymmgv381nq8e2dl26h.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deal updates and activity can connect to your workflow, and progress across the pipeline becomes easier to track and follow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://composio.dev/toolkits/zoho_bigin/framework/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;4. Zoho Bigin&lt;/strong&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Zoho Bigin manages customer data, interactions, and sales processes across teams. Information often needs to stay aligned across multiple touchpoints.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxla46ogn92n06apzcmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxla46ogn92n06apzcmi.png" alt=" " width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Updates to leads, contacts, and deals can reflect in your workflow, and customer data remains aligned with ongoing tasks and activities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Work rarely stays in one tool, and information continues to move across platforms as tasks progress. OpenClaw integrations through Composio connect these tools, so updates and actions stay aligned across systems. This reduces repeated effort and adds more structure to workflows. &lt;/p&gt;

&lt;p&gt;Across communication, development, media, productivity, and sales, integrations improve visibility and coordination. The result is a simpler way to manage work, with tools working together in a connected flow.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>Best Agents SDK in 2026</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Fri, 03 Apr 2026 14:59:51 +0000</pubDate>
      <link>https://forem.com/composiodev/best-agents-sdk-in-2026-7gg</link>
      <guid>https://forem.com/composiodev/best-agents-sdk-in-2026-7gg</guid>
      <description>&lt;p&gt;AI agents are no longer experimental. They are being shipped in production systems right now, and the SDKs powering them have matured dramatically.&lt;/p&gt;

&lt;p&gt;If you're building with AI in 2026, understanding the tools available to you is no longer optional.&lt;/p&gt;

&lt;p&gt;OpenAI, Claude, and Google are providing their SDKs to build these agents in minimal code for production. With their own quirks, they can make it harder for businesses and developers alike.&lt;/p&gt;

&lt;p&gt;I just did a comparison between the top most used frameworks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Agent SDK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAI Agents SDK&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google ADK&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All source code at the end!&lt;/p&gt;

&lt;p&gt;Let’s begin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Comparison?
&lt;/h2&gt;

&lt;p&gt;First thing’s first, why this comparison, while many others already existed, here is the deal:&lt;/p&gt;

&lt;p&gt;I’ve been building agents across these SDKs, and the reality is they all promise “minimal code” but behave very differently once you go beyond demos.&lt;/p&gt;

&lt;p&gt;So I compared them the only way that matters: by actually building with them.&lt;/p&gt;

&lt;p&gt;I looked at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how quickly I could get something working,&lt;/li&gt;
&lt;li&gt;how much control I had when things got complex, and&lt;/li&gt;
&lt;li&gt;how they handled real-world workflows like multi-agent coordination, tool usage, and state management.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are all my findings.&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenAI Agents SDK
&lt;/h2&gt;

&lt;p&gt;The OpenAI Agents SDK is an open-source framework and a significant upgrade over Swarm. It is designed to simplify orchestrating &lt;strong&gt;multi-agent workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;Python &amp;amp; TS-first&lt;/strong&gt;. Developers use built-in language features to orchestrate and chain agents rather than learning new abstractions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Primitives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents&lt;/strong&gt;: LLMs with instructions, tools, guardrails, and handoffs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handoffs&lt;/strong&gt;: Delegating tasks to other agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: Functions, MCP, and hosted tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails&lt;/strong&gt;: Safety checks for input/output validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions&lt;/strong&gt;: Automatic conversation history management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tracing&lt;/strong&gt;: Built-in visualization for debugging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Use It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Language Support&lt;/strong&gt;: Provider-agnostic. Supports OpenAI APIs and 100+ other LLMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realtime &amp;amp; TTS Voice&lt;/strong&gt;: Build voice agents with interruption detection and context management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability&lt;/strong&gt;: Robust tracing exports to &lt;code&gt;Logfire&lt;/code&gt;, &lt;code&gt;AgentOps&lt;/code&gt;, or &lt;code&gt;OpenTelemetry&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced Connectivity&lt;/strong&gt;: Supports WebSocket transport for Responses API and SIP protocol connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.x Ready&lt;/strong&gt;: Updated reasoning effort and cleaner handoff history for downstream context.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ease of Getting Started
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal setup&lt;/strong&gt;: Requires just a few lines of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick install&lt;/strong&gt;: &lt;code&gt;pip install openai-agents&lt;/code&gt;. Runs in under 10 lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Suited for&lt;/strong&gt;: Teams wanting rapid prototyping and simple agent coordination.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python-first&lt;/strong&gt;: Express complex relationships with a small set of primitives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: Zod-powered validation for TypeScript/JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Tooling&lt;/strong&gt;: Agent Builder provides a drag-and-drop canvas for composing logic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;I used OpenA Agents SDK to build me a job search agent, that fetches me jobs based on the user persona it created by asking me relevant questions.&lt;/p&gt;

&lt;p&gt;By default, openai agents is unable to use exa search, google sheets, this is where composio handle’s that, not only that, but you can also connect it to over 850+ tools and integrations.&lt;/p&gt;

&lt;p&gt;This is the code that handled all the heavy lifting&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# imports 
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Composio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;composio_openai_agents&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAIAgentsProvider&lt;/span&gt;

&lt;span class="c1"&gt;# Initialize Composio
&lt;/span&gt;&lt;span class="n"&gt;composio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Composio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;OpenAIAgentsProvider&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Create Tool Router session (connection tools + wait so OAuth can finish before continuing)
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolkits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GITHUB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exa&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;googlesheets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;browser_tool&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;manage_connections&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wait_for_connections&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mcp_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;

&lt;span class="c1"&gt;# add tool_configs
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assistant&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;HostedMCPTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;tool_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server_label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tool_router&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server_url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mcp_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;require_approval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;never&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One thing that stand out was, not only agent created a right persona based on screening question, but also fetched me list of relevant job description along with my skills relevancy, without explicitly told to do so.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/X9IGm9lkSUE"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude Agent SDK
&lt;/h2&gt;

&lt;p&gt;The Claude Agent SDK is Anthropic's open-source framework for building agents that interact with a &lt;strong&gt;real computer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It evolved from Claude Code. The core principle is simple: &lt;strong&gt;give your agent a computer.&lt;/strong&gt; It uses a shell, a file system, and the web just like a human.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Primitives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bash tool&lt;/strong&gt;: Executes shell commands directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read / Write / Edit&lt;/strong&gt;: Native file system access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glob &amp;amp; Search&lt;/strong&gt;: File discovery across project directories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subagents&lt;/strong&gt;: Spawn parallel or nested agents for subtasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt;: Standardized integrations (Slack, GitHub, Google Drive).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission modes&lt;/strong&gt;: Fine-grained control via &lt;code&gt;allowed_tools&lt;/code&gt; and &lt;code&gt;permission_mode&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Use It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native OS Access&lt;/strong&gt;: The only SDK where agents directly control a computer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Process Tools&lt;/strong&gt;: Custom tools run inside your Python app. No separate process needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Cloud&lt;/strong&gt;: Supports AWS Bedrock, Google Vertex AI, and Microsoft Azure AI Foundry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Xcode 26 Integration&lt;/strong&gt;: Full Claude Code power inside the IDE, including capturing Xcode Previews.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ease of Getting Started
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal entry point&lt;/strong&gt;: Built-in tools mean no manual plumbing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick install&lt;/strong&gt;: &lt;code&gt;pip install claude-agent-sdk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Developers needing deep OS access or agentic coding workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Production Readiness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Battle-proven&lt;/strong&gt;: Powers Anthropic’s internal research and video creation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context Compaction&lt;/strong&gt;: Automatic management for long-running tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Controls&lt;/strong&gt;: &lt;code&gt;max_budget_usd&lt;/code&gt; parameter caps spend per session.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;I used Claude Agent’s SDK to build an open-source contributor, which takes a repo name, fetches a good issue listed, reads the contribution file, fork’s the repo, create the code fix that matches orignal repo style, push the code to forked repo and raises a PR.&lt;/p&gt;

&lt;p&gt;By default, calude agents is unable to use github, this is where composio handle’s that, not only that, but you can also connect it to over 850+ tools and integrations.&lt;/p&gt;

&lt;p&gt;This is the code that handled all the heavy lifting&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# imports
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Composio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;claude_agent_sdk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ClaudeSDKClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClaudeAgentOptions&lt;/span&gt;

&lt;span class="c1"&gt;# fetch all composio toolkits name
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_toolkits&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OSS_COMPOSIO_TOOLKITS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DEFAULT_TOOLKITS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# create a async chat, connect to composio, fetch user id, define toolkits and mcp server url + configs.
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chat_with_oss_stack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_API_KEY is not set&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;composio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Composio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_USER_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USER_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Set COMPOSIO_USER_ID (or USER_ID) in the environment or .env — Composio needs a stable user id string.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;kits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_toolkits&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;mcp_server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;toolkits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;kits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcp_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Session URL not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ClaudeAgentOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;permission_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bypassPermissions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;composio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;system_prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OSS_SYSTEM_PROMPT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_turns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OSS_MAX_TURNS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;40&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I asked it to operate on “gemini-cli” repository, and it create a pr for me.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/G-3V20m8L-w"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Google Agent Development Kit (ADK)
&lt;/h2&gt;

&lt;p&gt;Google's ADK is a code-first framework. It applies engineering principles like &lt;strong&gt;versioning, testing, and modularity&lt;/strong&gt; to AI.&lt;/p&gt;

&lt;p&gt;While optimized for Gemini, it is model-agnostic and built for compatibility with third-party tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Primitives
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM Agents&lt;/strong&gt;: Use LLMs as the reasoning core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential/Parallel/Loop Agents&lt;/strong&gt;: Predictable pipeline execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph-based workflows&lt;/strong&gt;: (ADK 2.0 Alpha) Conditional, branching pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent2Agent (A2A)&lt;/strong&gt;: Secure protocol for agent-to-agent delegation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ADK Web UI&lt;/strong&gt;: Browser-based interface for inspecting traces and artifacts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why Use It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Widest Language Support&lt;/strong&gt;: Python, TypeScript, Java, and &lt;strong&gt;Go&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex Orchestration&lt;/strong&gt;: Graph-based logic for branching and retry paths.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Interoperability&lt;/strong&gt;: A2A allows delegation without exposing internal memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vertex AI Integration&lt;/strong&gt;: Deploy directly to Google Cloud’s managed enterprise runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ease of Getting Started
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Under 100 lines&lt;/strong&gt;: Build production agents with bidirectional audio/video.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent Starter Pack&lt;/strong&gt;: Accelerated deployment path for Google Cloud services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for&lt;/strong&gt;: Enterprise-grade systems requiring tight Google ecosystem integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Developer Experience
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Advanced State Management&lt;/strong&gt;: Restores state from failure and allows context "rewinding."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise Governance&lt;/strong&gt;: Integration with Cloud API Registry to curate approved tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-built Connectors&lt;/strong&gt;: 100+ connectors via Composio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;

&lt;p&gt;For demos these are cool, heard people say, can be used in production, but it failed most of tool calls, racked me up a bill of 5$ due to repeated tool call (was stuck in thinking loop). Also the rate limit on free tier is real pain.&lt;/p&gt;

&lt;p&gt;Yes, its developer friendly, but really lacks a lot in terms of performance and newbies can easily stuck with &lt;code&gt;adk web&lt;/code&gt;  or &lt;code&gt;adk cli&lt;/code&gt;  as it requires a specific folder structure.&lt;/p&gt;

&lt;p&gt;However for simpler task it did quite well. Built an email agent that maps promotional education mails (like coursera, deeplearning) to well optimised developer roadmap, which beginner devs can use  to learn in a structured manner.  &lt;/p&gt;

&lt;p&gt;Suprisingly code to use composio tools here is quite simple and easy to use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# imports
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Composio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;composio_google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GoogleProvider&lt;/span&gt;

&lt;span class="c1"&gt;# load envs
&lt;/span&gt;&lt;span class="n"&gt;COMPOSIO_API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;COMPOSIO_USER_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_USER_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# create composio client
&lt;/span&gt;&lt;span class="n"&gt;composio_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Composio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;GoogleProvider&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# create a client session with tools
&lt;/span&gt;&lt;span class="n"&gt;composio_session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composio_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;COMPOSIO_USER_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolkits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gmail&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# store sessiom url
&lt;/span&gt;&lt;span class="n"&gt;COMPOSIO_MCP_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composio_session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;

&lt;span class="c1"&gt;# add composio mcp server connection
&lt;/span&gt;&lt;span class="n"&gt;composio_toolset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;McpToolset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;connection_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;StreamableHTTPConnectionParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;COMPOSIO_MCP_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;COMPOSIO_API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;30.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sse_read_timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;600.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# include it in the agents
&lt;/span&gt;&lt;span class="n"&gt;root_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-2.5-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;composio_agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;An agent that uses Composio tools to perform actions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a helpful assistant connected to Composio. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You have the following tools available: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_SEARCH_TOOLS, COMPOSIO_MULTI_EXECUTE_TOOL, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;COMPOSIO_MANAGE_CONNECTIONS, COMPOSIO_REMOTE_BASH_TOOL, COMPOSIO_REMOTE_WORKBENCH. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Use these tools to help users with GMAIL operations.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;  
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;composio_toolset&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vGYQy3wp42A"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;OpenAI Agents SDK&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Claude Agent SDK&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Google ADK&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary Language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python, TypeScript&lt;/td&gt;
&lt;td&gt;Python, TypeScript&lt;/td&gt;
&lt;td&gt;Python, TS, Java, Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model Agnostic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (100+ LLMs)&lt;/td&gt;
&lt;td&gt;⚠️ (Claude-first)&lt;/td&gt;
&lt;td&gt;✅ (Gemini-optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Handoffs&lt;/td&gt;
&lt;td&gt;✅ Subagents&lt;/td&gt;
&lt;td&gt;✅ Graph (2.0 Alpha)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No native control&lt;/td&gt;
&lt;td&gt;✅ Native Bash/File&lt;/td&gt;
&lt;td&gt;❌ No native control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voice/Realtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;td&gt;⚠️ Via API&lt;/td&gt;
&lt;td&gt;⚠️ Via API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Voice &amp;amp; LLM diversity&lt;/td&gt;
&lt;td&gt;OS/File automation&lt;/td&gt;
&lt;td&gt;Enterprise/Google Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which One to Choose?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Agents SDK&lt;/strong&gt;: Choose if you want a lightweight framework with strong voice support and the ability to swap LLMs freely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Agent SDK&lt;/strong&gt;: Choose if your agents need deep OS access (developer assistants) or follows a "give the agent a computer" paradigm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt;: Choose if you are building enterprise-grade systems on Google Cloud or need multi-language support (Python/Java/Go). Requires lot of manual plumbing and security.&lt;/li&gt;
&lt;li&gt;For better&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;OpenAI, Claude, and Gemini are all key players. However, the real competitive edge isn't knowing &lt;em&gt;that&lt;/em&gt; these SDKs exist. It's the &lt;strong&gt;hands-on mastery&lt;/strong&gt; of architectural decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to use a handoff versus a subagent.&lt;/li&gt;
&lt;li&gt;How to design tools that don't bloat the context window.&lt;/li&gt;
&lt;li&gt;When to insert a human checkpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frameworks evolve quickly. The deeper intuition for architecting reliable systems only comes through repeated experimentation.&lt;/p&gt;

&lt;p&gt;All agents source code can be seen at &lt;a href="https://github.com/DevloperHS/agents-sdk-tests" rel="noopener noreferrer"&gt;https://github.com/DevloperHS/agents-sdk-tests&lt;/a&gt;. Feel free to fork and raise pr’s :)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Building.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>programming</category>
      <category>automation</category>
    </item>
    <item>
      <title>🚀 How to run a fully-autonomous company with OpenClaw 🦞</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Thu, 02 Apr 2026 14:39:22 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-run-a-fully-autonomous-company-with-openclaw-ma5</link>
      <guid>https://forem.com/composiodev/how-to-run-a-fully-autonomous-company-with-openclaw-ma5</guid>
      <description>&lt;p&gt;Imagine owning a company with just one human employee, and that too is yourself. The rest? All OpenClaw agents!&lt;/p&gt;

&lt;p&gt;Before OpenClaw, that would have sounded completely silly, but with it, it's possible, &lt;strong&gt;really possible!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can automate your entire company or simulate a fully functioning one with just OpenClaw and your VPS, Mac Mini, or local system for testing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fety6wnq6m91tsqhv27gi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fety6wnq6m91tsqhv27gi.jpg" alt="obama meme" width="640" height="391"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you'll learn how to run an entire company using just yourself and a bunch of &lt;strong&gt;OpenClaw agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you will learn: ✨&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What OpenClaw is and how it works&lt;/li&gt;
&lt;li&gt;Why storing API keys locally is a bad idea&lt;/li&gt;
&lt;li&gt;Setting up &lt;strong&gt;Composio&lt;/strong&gt; for secure OAuth-based integrations&lt;/li&gt;
&lt;li&gt;Connecting your first app and getting agents up and running 🚀&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready to become a one-person company? 👀&lt;/p&gt;




&lt;h2&gt;
  
  
  What's OpenClaw?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcqljwq3cff8femj5e1s0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcqljwq3cff8femj5e1s0.png" alt="OpenClaw Banner" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 I assume you already know what OpenClaw is. If not, why are you even here? Just kidding... The blog itself is completely beginner friendly. If you already have an idea of what OpenClaw is, just skip this section.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OpenClaw is a personal AI assistant you run on your own machine or a server you own. It is the thing that actually sits between your model provider (OpenAI, Anthropic, Kimi, etc.) and the stuff you want done, such as messaging, tools, files, and integrations, and this idea is what actually makes the one-person company possible.&lt;/p&gt;

&lt;p&gt;Take this as a mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your LLM is the brain (thinks)&lt;/li&gt;
&lt;li&gt;OpenClaw is the body (it can do things)&lt;/li&gt;
&lt;li&gt;The Gateway is the receptionist (routes messages in and results out)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It provides the model with a runtime that can call tools, maintain state, and appear where you already chat (WhatsApp, Telegram, Slack, Discord, etc.). Now, that's just the gist. There's much more to understand. I assume you've already worked with it, so I'm not going any deeper than this in the intro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosrayie6pppe2qbj6kan.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fosrayie6pppe2qbj6kan.jpg" alt="OpenClaw architecture" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For installation, visit the OpenClaw &lt;a href="https://docs.openclaw.ai/install" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;, and based on your distro and installation choice, install it on your machine.&lt;/p&gt;

&lt;p&gt;If you just want it running quickly, do the normal installation. If you're even slightly paranoid (which you should be 😮‍💨), use Docker.&lt;/p&gt;

&lt;p&gt;Also, make sure you set up a channel for easier chatting from your phone (preferably Telegram).&lt;/p&gt;

&lt;p&gt;For help setting up a channel, ask OpenClaw itself. It knows itself better than anyone else on the internet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 If you face issues like &lt;code&gt;OpenClaw: access not configured&lt;/code&gt; when talking with the bot, make sure you run this command:&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw pairing approve &amp;lt;telegram/whatsapp/...&amp;gt; &amp;lt;pairing_code&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Just like that, now you have an agent listening on your channel. Message anything, and you should get a reply back.&lt;/p&gt;

&lt;p&gt;From here onwards, I assume you already have OpenClaw running. To make sure everything is working, run this command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If not, try running &lt;code&gt;openclaw doctor&lt;/code&gt;, which helps debug your gateway or channel issues.&lt;/p&gt;


&lt;h2&gt;
  
  
  Run a whole company?
&lt;/h2&gt;

&lt;p&gt;Yeah, in theory, you can actually automate or run an entire company. Can't guarantee the company will stand long, but with OpenClaw, it's now possible.&lt;/p&gt;

&lt;p&gt;The only human in the process is going to be yourself. All your employees will be &lt;strong&gt;OpenClaw Agents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3j5c227mzou0xz0n0j38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3j5c227mzou0xz0n0j38.png" alt="Openclaw running an entire company architecture" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, most day-to-day operations of running a company, such as sales, team meetings, and customer care, can be managed with OpenClaw Agents. And there are many more than just the ones in the image, of course. This is just a quick sketch to give you an idea.&lt;/p&gt;


&lt;h2&gt;
  
  
  Problem with "Just OpenClaw"
&lt;/h2&gt;

&lt;p&gt;By default, OpenClaw works with API keys, and it stores them in a plain text file in the &lt;code&gt;~/.openclaw/&lt;/code&gt; directory for all the services you use, such as Google, Gmail, and so on. This is not a very good practice if you're running this on your local machine. If using something like a VPS or the hyped &lt;strong&gt;Mac Mini&lt;/strong&gt;, it's fine, but still, storing credentials in a local plain text file is never a good idea.&lt;/p&gt;

&lt;p&gt;Especially if you're using smaller models, they are even more prone to prompt injections, and since OpenClaw has whole system access, it might wipe out your entire system without you doing anything.&lt;/p&gt;

&lt;p&gt;What's actually gone wrong in the wild (already):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Malicious skills on ClawHub:&lt;/strong&gt; researchers found hundreds to thousands of skills that were straight-up malware or had critical issues, including credential theft and prompt injection patterns.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection turning into installs:&lt;/strong&gt; there's been at least one high-profile incident where a prompt injection was used to push OpenClaw onto machines via an agent workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo215wy0xag7t8z86ogzv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo215wy0xag7t8z86ogzv.jpg" alt="OpenClaw compromised" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the above reasons, I recommend that you use some hosted service which in my case, &lt;strong&gt;Composio.&lt;/strong&gt; It lets you authenticate using OAuth, which is the most secure option over pasting keys locally.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connecting your first app
&lt;/h2&gt;

&lt;p&gt;Now, it's time to create agents, but first, we need to set up or connect our first app from Composio.&lt;/p&gt;

&lt;p&gt;The agents will mostly revolve around working with those applications from Composio.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Install Composio Plugin
&lt;/h3&gt;

&lt;p&gt;Composio's OpenClaw plugin connects OpenClaw to Composio's MCP endpoint and exposes third-party tools (GitHub, Gmail, Slack, Notion, etc.) through that layer.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @composio/openclaw-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. Composio Plugin Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Log in at &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Choose OpenClaw as the client.&lt;/li&gt;
&lt;li&gt;Copy your consumer key (&lt;code&gt;ck_...&lt;/code&gt;) from the Composio dashboard settings, then set it:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F982ctfxsvbsd8d1dsmmk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F982ctfxsvbsd8d1dsmmk.jpg" alt="Composio OpenClaw setup instructions" width="800" height="213"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.composio.config.consumerKey &lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, it's a good idea to restart the gateway:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. Verify the plugin loaded
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins list
openclaw logs &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You're looking for something like "Composio loaded" and a "tools registered" message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce73szhae07paumt96ae.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce73szhae07paumt96ae.jpg" alt="OpenClaw successfully loads Composio" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the plugin is &lt;strong&gt;"loaded"&lt;/strong&gt;, it means you can now successfully access Composio.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;p&gt;The plugin connects to Composio's MCP server at &lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt; and registers all available tools directly into the OpenClaw agent. Tools are called by name — no extra search or execute steps needed.&lt;/p&gt;

&lt;p&gt;If a tool returns an auth error, the agent will prompt you to connect that toolkit at &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's how the configuration looks:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"consumerKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can configure the following options directly from the config file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;enabled&lt;/code&gt;: enable or disable the plugin&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consumerKey&lt;/code&gt;: your Composio consumer key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mcpUrl&lt;/code&gt;: the MCP server URL. By default, it's &lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Previously, you had to configure API keys per integration, but with Composio you don't have to worry about any of that. Just make sure &lt;strong&gt;not to leak&lt;/strong&gt; the consumer key that we generated.&lt;/p&gt;

&lt;p&gt;And it's that simple. Everything works out of the box just as you would use any other OpenClaw plugin!&lt;/p&gt;

&lt;p&gt;Now, to test if it works, head over to the Control UI chat and send a message, something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List the Composio tools you have available."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryuiqg0zcs7udhjqn44a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fryuiqg0zcs7udhjqn44a.png" alt="OpenClaw listing composio tools" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it asks you to connect the tools, head over to &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt; and connect each of the tools you require. It's as simple as clicking &lt;strong&gt;Connect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecgu1xvvw1qzz27q5ymt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecgu1xvvw1qzz27q5ymt.jpg" alt="Adding integrations in Composio" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the integrations you use are OAuth-hosted, and only the tools you connect will be available to OpenClaw. Nothing more than that.&lt;/p&gt;


&lt;h2&gt;
  
  
  Setting up a Multi-Agent Team
&lt;/h2&gt;

&lt;p&gt;The idea is pretty clear. Since one single agent wouldn't be enough to handle all sorts of company requirements due to &lt;strong&gt;context window limitations&lt;/strong&gt;, you could have multiple sub-agents for multiple task types.&lt;/p&gt;

&lt;p&gt;Say, one agent AgentA handles marketing, AgentB handles business analysis, AgentC handles something else.&lt;/p&gt;

&lt;p&gt;Each agent has a distinct role, personality, and model optimized for its use case — say, for business analysis, you'd want a more research-oriented model like GPT-5.2.&lt;/p&gt;

&lt;p&gt;And how do you create them? It's simple, just chat with OpenClaw itself, either in the chat window or your configured channel.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please create a new agent called **Shri**. This agent should be capable of handling tasks such as reading and composing emails, and scheduling Google Meet sessions.

For the model, use **Claude Sonnet 4.6** (`claude-sonnet-4-6`).

Please ensure that the existing main agent remains untouched and unchanged.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5r5jl6vv59m9a9tv8tb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5r5jl6vv59m9a9tv8tb.jpg" alt="Prompt in OpenClaw" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it will create a new agent, which you can view in the &lt;code&gt;Agents&lt;/code&gt; tab in the OpenClaw dashboard or by running &lt;code&gt;/agents&lt;/code&gt; in the OpenClaw TUI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbr7ukxn72n1y7fyejgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvbr7ukxn72n1y7fyejgu.png" alt="OpenClaw agents" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, do it for all your different work types. Create a separate agent for each type of work.&lt;/p&gt;

&lt;p&gt;The main agent can then delegate work to those specialized agents, each handling one specific task type, which improves response quality because one agent is handling one type of work instead of everything at once.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;TIP:&lt;/strong&gt; This also helps you reduce model usage costs, as you can assign more reasoning-heavy models to complex tasks and smaller, cheaper models to simpler ones.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  What's Missing?
&lt;/h2&gt;

&lt;p&gt;Everything seems good, but there's one thing missing... &lt;strong&gt;autonomy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You still have to message OpenClaw manually to get things done, which isn't ideal when you're planning on using it as an AI employee.&lt;/p&gt;

&lt;p&gt;There are two ways to achieve this:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. If you're a little technical
&lt;/h3&gt;

&lt;p&gt;You must be familiar with cron jobs and their syntax. If so, this is a way to do it directly from the CLI outside of OpenClaw.&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw cron add &lt;span class="nt"&gt;--schedule&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;cron_syntax&amp;gt;"&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;prompt&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Say you want it running every single day at 8 AM:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw cron add &lt;span class="nt"&gt;--schedule&lt;/span&gt; &lt;span class="s2"&gt;"0 9 * * *"&lt;/span&gt; &lt;span class="nt"&gt;--message&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;prompt&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  2. If you're not technical
&lt;/h3&gt;

&lt;p&gt;Similar to how we used a prompt to create a new agent, all you need to do is write a prompt:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Every morning at 9 AM, send me the top news of the day. Also scan my Google Calendar for the day, identify each attendee and their company. Send me two different messages on Telegram: one with the news summary and one with the meeting details.

Use the relevant Agent you have for each purpose.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;💁 There's also a similar concept called Heartbeat, which is another approach for scheduling tasks in OpenClaw. You can check it out here: &lt;a href="https://docs.openclaw.ai/gateway/heartbeat" rel="noopener noreferrer"&gt;OpenClaw Heartbeat&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Workflow Demo
&lt;/h2&gt;

&lt;p&gt;Okay, time for a demo.&lt;/p&gt;

&lt;p&gt;Showing an entire workflow demo of running a company would be too much work, so for this demo, I will show you one part of the workflow: checking the calendar and messaging a summary with attendees every day at a set time.&lt;/p&gt;

&lt;p&gt;You could have it run every X hours or every single day at a fixed time. After each interval, the model will do as said above (Obviously, the idea is too naive, but it's just for this demo.) The possibilities are endless.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep this in mind: “anything that you can do manually on the internet, you can automate with OpenClaw.” So, you get the idea.&lt;/p&gt;

&lt;p&gt;💁 &lt;strong&gt;NOTE:&lt;/strong&gt; If you're serious about this idea, it's better to run this on a VPS or a Mac Mini, because you mostly don't have your personal PC running 24/7.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's the demo:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/3WZ5PkqyCyc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;So far, you've learned how to run a fully functioning company with just yourself and a bunch of &lt;strong&gt;OpenClaw agents&lt;/strong&gt;, using &lt;strong&gt;Composio&lt;/strong&gt; as the secure integration layer between OpenClaw and all your third-party apps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be sure to give a star to &lt;a href="https://github.com/ComposioHQ/composio" rel="noopener noreferrer"&gt;&lt;strong&gt;Composio&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://github.com/openclaw/openclaw" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/a&gt; on their GitHub repositories.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you found this article helpful, drop a like and share your thoughts in the comments below. 👇&lt;/p&gt;

&lt;p&gt;Happy automating! 🥳&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;Full Stack SDE • Open-Source Contributor • Collaborator @Oppia • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>productivity</category>
      <category>openclaw</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Top 10 OpenClaw Plugins to Supercharge Your OpenClaw Workflows</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Wed, 18 Mar 2026 05:03:35 +0000</pubDate>
      <link>https://forem.com/composiodev/top-10-openclaw-plugins-to-supercharge-your-openclaw-workflows-4fpc</link>
      <guid>https://forem.com/composiodev/top-10-openclaw-plugins-to-supercharge-your-openclaw-workflows-4fpc</guid>
      <description>&lt;h2&gt;
  
  
  The Rise of OpenClaw Plugins
&lt;/h2&gt;

&lt;p&gt;If you've worked with OpenClaw, you already know Skills, the task-level instructions that let your agent send emails, query APIs, or pull live data. &lt;/p&gt;

&lt;p&gt;But plugins operate at a deeper layer. They hook into the agent's lifecycle, reshape how it reasons, authenticates, and interacts with the outside world.&lt;/p&gt;

&lt;p&gt;Though OpenClaw currently has a very limited set of official plugins, many independent devs have built some really cool plugins. &lt;/p&gt;

&lt;p&gt;And it seems OpenClaw plugins are going to get a huge push from OpenClaw.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aom1p2kwz94hz9b19rc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3aom1p2kwz94hz9b19rc.png" alt="X Post" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Top OpenClaw Plugins
&lt;/h2&gt;

&lt;p&gt;As an OpenClaw enthusiast, I collated some of the actually useful plugins for OpenClaw.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Composio - Connect OpenClaw with 850+ on-demand SaaS Apps&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;memU (Memory Framework) - Hierarchical Knowledge Graph That Makes Your Agent Proactive&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SecureClaw - OWASP-Aligned Security Auditing and Runtime Hardening&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lobster - Typed Workflow Pipelines with Approval Gates for Reliable Automation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory LanceDB - Vector-Backed Long-Term Memory with Auto-Recall and Auto-Capture&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MemOS Cloud - Cloud-Hosted Cross-Agent Memory with Async Recall and Isolation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenClaw Foundry - Self-Writing Meta-Extension That Learns and Builds Its Own Tools&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Better Gateway - Auto-Reconnect, Embedded IDE, and Browser Terminal for Stable Ops&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Voice Call - Outbound Phone Calls and Multi-Turn Voice Conversations via Twilio&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Composio
&lt;/h2&gt;

&lt;p&gt;Connect OpenClaw with 850+ on-demand SaaS Apps&lt;/p&gt;

&lt;p&gt;nstead of installing individual skills for every app (Gmail, GitHub, Outlook, Notion), this single plugin connects to Composio’s managed MCP server and handles all OAuth and authentication logic automatically.&lt;/p&gt;

&lt;p&gt;This plugin is the official bridge that allows your OpenClaw agent to discover and call any SaaS tools dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-requisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Log in at dashboard.composio.dev&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose your preferred client (choose OpenClaw)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy your consumer key (ck_...)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbcbnrtu3fr9swo67c6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbcbnrtu3fr9swo67c6u.png" alt="Install the Composio plugin" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set OpenClaw Config&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then, allow Composio tools in your agent's tool list. This works with any tool profile (coding, minimal, messaging, etc.). Without this step, Composio tools will only be available on the full tool profile:&lt;/p&gt;

&lt;p&gt;After setting your key and allowing the tools, restart the gateway:&lt;/p&gt;

&lt;p&gt;Result (in ~/openclaw/openclaw.json file):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn47kl6xmm8vh989rolm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn47kl6xmm8vh989rolm.png" alt="Change the json file" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ComposioHQ/openclaw-composio-plugin" rel="noopener noreferrer"&gt;https://github.com/ComposioHQ/openclaw-composio-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@composio/openclaw-plugin" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@composio/openclaw-plugin&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. memU (Memory Framework)
&lt;/h2&gt;

&lt;p&gt;Hierarchical Knowledge Graph That Makes Your Agent Proactive&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubbhmmotwcaeyw5scvkr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubbhmmotwcaeyw5scvkr.png" alt="MemU" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A proactive long-term memory plugin that replaces standard flat-file memory.&lt;/p&gt;

&lt;p&gt;It builds a hierarchical knowledge graph of your preferences and projects, allowing the agent to anticipate needs rather than just reacting to prompts.&lt;/p&gt;

&lt;p&gt;Simple examples include: "You have a meeting in 10 minutes; should I pull the latest briefing?"&lt;/p&gt;

&lt;p&gt;If you want to add a robust memory layer for the agent to handle missing context, go for it.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/duxiaoxiong/memu-engine-for-OpenClaw" rel="noopener noreferrer"&gt;https://github.com/duxiaoxiong/memu-engine-for-OpenClaw&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @memu/memu-engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. SecureClaw
&lt;/h2&gt;

&lt;p&gt;OWASP-Aligned Security Auditing and Runtime Hardening&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w1qk2nlghcyabi18l63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6w1qk2nlghcyabi18l63.png" alt="SecureClaw Github" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The industry-standard security plugin.&lt;/p&gt;

&lt;p&gt;It hardens the agent's runtime by mapping actions to the OWASP Top 10 for Agents. It provides real-time auditing and prevents prompt injection attacks from reaching your system shell.&lt;/p&gt;

&lt;p&gt;If you are concerned about OpenClaw security while running on vm’s or locals (not recommended), this plugin can give you a sigh of relief.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/adversa-ai/secureclaw" rel="noopener noreferrer"&gt;https://github.com/adversa-ai/secureclaw&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Lobster
&lt;/h2&gt;

&lt;p&gt;Typed Workflow Pipelines with Approval Gates for Reliable Automation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvb3299xtdjpzbsge5mdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvb3299xtdjpzbsge5mdk.png" alt="Lobster" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A powerful scripting plugin that turns complex multi-step skills into repeatable, typed pipelines.&lt;/p&gt;

&lt;p&gt;This means, instead of the agent "guessing" the next step, Lobster ensures high-reliability execution for production-grade automations.&lt;/p&gt;

&lt;p&gt;It does it through typed JSON-first pipelines, jobs, and approval gates &amp;amp; let OpenClaw call the workflows in one step.&lt;/p&gt;

&lt;p&gt;If you like to automate tasks using your skills, this will make your job easier than ever.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/openclaw/lobster" rel="noopener noreferrer"&gt;https://github.com/openclaw/lobster&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lobster is a bundled tool — enable it in your configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Memory LanceDB
&lt;/h2&gt;

&lt;p&gt;Vector-Backed Long-Term Memory with Auto-Recall and Auto-Capture&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6edij32fmdv6w0w4si5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6edij32fmdv6w0w4si5.png" alt="Memory Lance DB" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The default memory-core plugin stores memory as flat Markdown files. memory-lancedb replaces it with a proper vector-backed long-term memory store using LanceDB.&lt;/p&gt;

&lt;p&gt;Set plugins.slots.memory = "memory-lancedb" and your agent gets auto-recall (relevant memories injected before every turn) and auto-capture (important facts stored after every turn) — without you having to manually write to MEMORY.md.&lt;/p&gt;

&lt;p&gt;It supports multiple embedding providers (OpenAI, Gemini, Ollama), includes prompt-injection detection for captured memories, and provides a CLI for searching and managing stored memories.&lt;/p&gt;

&lt;p&gt;If your agent keeps "forgetting" things between sessions or after context compaction, this is the first plugin you should install.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/noncelogic/openclaw-memory-lancedb" rel="noopener noreferrer"&gt;https://github.com/noncelogic/openclaw-memory-lancedb&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. MemOS Cloud
&lt;/h2&gt;

&lt;p&gt;Cloud-Hosted Cross-Agent Memory with Async Recall and Isolation&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqs2rt5f9sxq878i4l6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhqs2rt5f9sxq878i4l6c.png" alt="MemOS Cloud" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MemOS Cloud is a lifecycle plugin that recalls relevant memories from the MemOS Cloud API before each agent run and saves new conversation data after each run.&lt;/p&gt;

&lt;p&gt;It works asynchronously, supports cross-agent memory isolation via agent_id, and lets you configure limits on how many memories are injected per turn.&lt;/p&gt;

&lt;p&gt;Where memory-lancedb stores everything locally, MemOS Cloud is the right choice when you need cloud-hosted memory that persists across devices, or when you're running multi-agent setups where agents need isolated but centrally managed memory.&lt;/p&gt;

&lt;p&gt;It's a great complement to LanceDB — use LanceDB for local-first setups, and MemOS Cloud when you need cloud persistence or multi-agent coordination.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/MemTensor/MemOS-Cloud-OpenClaw-Plugin" rel="noopener noreferrer"&gt;https://github.com/MemTensor/MemOS-Cloud-OpenClaw-Plugin&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. OpenClaw Foundry
&lt;/h2&gt;

&lt;p&gt;Self-Writing Meta-Extension That Learns and Builds Its Own Tools&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjil2t3rp5aj96dh5pmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjil2t3rp5aj96dh5pmi.png" alt="OpenClaw Foundry" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Foundry is a self-writing meta-extension. It observes your workflows, researches the OpenClaw docs, and writes new skills, extensions, hooks, and tools directly into your setup.&lt;/p&gt;

&lt;p&gt;The self-modification loop actually works: Foundry validates generated code in a sandbox before deploying it, records patterns from successes and failures, and can even extend its own capabilities.&lt;/p&gt;

&lt;p&gt;It includes tools like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;foundry_implement&lt;/code&gt; (end-to-end research + build),&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foundry_write_skill&lt;/code&gt;, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;foundry_write_hook&lt;/code&gt;, &lt;/li&gt;
&lt;li&gt;and &lt;code&gt;foundry_extend_self&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;making it the closest thing to an agent that builds its own tools.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/lekt9/openclaw-foundry" rel="noopener noreferrer"&gt;https://github.com/lekt9/openclaw-foundry&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Better Gateway
&lt;/h2&gt;

&lt;p&gt;Auto-Reconnect, Embedded IDE, and Browser Terminal for Stable Ops&lt;/p&gt;

&lt;p&gt;The stock OpenClaw gateway drops WebSocket connections under load. &lt;/p&gt;

&lt;p&gt;Better Gateway fixes this with automatic reconnection, configurable retry intervals, and a status indicator that shows connection health in real time.&lt;/p&gt;

&lt;p&gt;Beyond stability, it adds a Monaco-based IDE and a full xterm.js terminal directly into the gateway UI — no extra ports, no SSH tunneling needed. Everything runs on the main gateway port.&lt;/p&gt;

&lt;p&gt;It also exposes a file API for workspace read/write/list/delete operations, making it a practical all-in-one development environment for your OpenClaw setup.&lt;/p&gt;

&lt;p&gt;If you run OpenClaw on a remote server or VPS, this plugin is essential for a smooth development experience.&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/ThisIsJeron/openclaw-better-gateway" rel="noopener noreferrer"&gt;https://github.com/ThisIsJeron/openclaw-better-gateway&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Voice Call
&lt;/h2&gt;

&lt;p&gt;Outbound Phone Calls and Multi-Turn Voice Conversations via Twilio&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4x2gxvlq7oors59f6nwq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4x2gxvlq7oors59f6nwq.png" alt="Voice Call " width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have kept the best one for the last, and it's the most transformative plugin of the year.&lt;/p&gt;

&lt;p&gt;Voice Call moves OpenClaw beyond text by enabling outbound phone calls and multi-turn voice conversations via Twilio or Telnyx.&lt;/p&gt;

&lt;p&gt;It’s widely used for "reach me anywhere" notifications and for real-world tasks like booking appointments, as shown in YouTube/Twitter demo videos.&lt;/p&gt;

&lt;p&gt;Throw it leads, client, follow up, it handles all, with just a single setup. Game changer in voice call automations.&lt;/p&gt;

&lt;p&gt;So, if you are a business owner who has to call a lot of people, this plugin is for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repo: &lt;a href="https://github.com/openclaw/openclaw/tree/main/extensions/voice-call" rel="noopener noreferrer"&gt;https://github.com/openclaw/openclaw/tree/main/extensions/voice-call&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In case you want speed, you can check community one: &lt;a href="https://github.com/deepgram/deepclaw" rel="noopener noreferrer"&gt;VoiceClaw- DeepGram Plugin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And with that, we have reached the end of this short, definitive plugin list.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Plugins run silently in the background, shaping how your agent thinks and responds at a system level. It’s really a more integrated experience than just skills.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to unlock 850+ tools in OpenClaw</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Wed, 11 Mar 2026 12:48:25 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-unlock-850-tools-in-openclaw-516g</link>
      <guid>https://forem.com/composiodev/how-to-unlock-850-tools-in-openclaw-516g</guid>
      <description>&lt;h2&gt;
  
  
  OpenClaw Limitations Unlocked
&lt;/h2&gt;

&lt;p&gt;Openclaw comes with pretty limited set of tools. They are powerful but restricts a lot of functionality.&lt;/p&gt;

&lt;p&gt;What if a single one can give you access to plethora of tools that works at your command. &lt;/p&gt;

&lt;p&gt;There is a hidden benefit too - you don't have to share your credentials with open claw, making your OpenClaw workflows secure.&lt;/p&gt;

&lt;p&gt;Enter's Composio - a tool layer for OpenClaw and all ai agents that offer self-tool discovery and selection, e2e authentication and no vendor lock in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why use it?
&lt;/h2&gt;

&lt;p&gt;Composio expand's capabilities while keeping authentication secure and data under your control. &lt;/p&gt;

&lt;p&gt;So, it's just plug and play - you plug in, connect your tools, and start building things that actually matter.&lt;/p&gt;

&lt;p&gt;Now Let's look at how to connect composio with OpenClaw in this short guide.&lt;/p&gt;




&lt;h2&gt;
  
  
  3 Ways to connect opne claw
&lt;/h2&gt;

&lt;p&gt;Here are 3 ways to connect openclaw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct prompt&lt;/li&gt;
&lt;li&gt;Composio npm package&lt;/li&gt;
&lt;li&gt;MCP Porter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's look at how to set it up&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Direct Prompt
&lt;/h3&gt;

&lt;p&gt;Best part about open claw is - it can auto execute tools and setup your tools using a single prompt. &lt;/p&gt;

&lt;p&gt;You can use that to your advantage and open up the OpenClaw dashboard chat and paste the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add a new MCP server called "composio" with transport type HTTP. Use the URL https://connect.composio.dev/mcp and add the header "x-consumer-api-key: your-api-key".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure to replace your-api-key with actual composio api key. You can get that by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Visiting to &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;Composio Dashboard&lt;/a&gt; and sign up / login.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then heading to the &lt;strong&gt;Connect to OpenClaw&lt;/strong&gt; and copy the prompt.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rcx4luggqapnn5ewwdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0rcx4luggqapnn5ewwdv.png" alt="Reference Image" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If first time login and authenticate and you are done!&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Composio npm package
&lt;/h3&gt;

&lt;p&gt;Composio recently released their open claw plugin, this mean's, no config headache, simple one liner command does it all!&lt;/p&gt;

&lt;p&gt;So, head to terminal and type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @composio/openclaw-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once done, setup your api key, following the steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log in at &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;**dashboard.composio.dev&lt;/a&gt;.**&lt;/li&gt;
&lt;li&gt;Choose your preferred client (OpenClaw, Claude Code, Cursor, etc.).&lt;/li&gt;
&lt;li&gt;Copy your consumer key (&lt;code&gt;ck_...&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In terminal run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.composio.config.consumerKey &lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally restart the gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All this does is setup the open claw configuration with consumer key in the Composio MCP.&lt;/p&gt;

&lt;p&gt;Or alternatively, you can directly setup the mcp server, for more granular control.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Using MCP Porter
&lt;/h3&gt;

&lt;p&gt;MCP Porter is OpenClaw way to use mcp-server and comes inbuild. You can activate by going to: OpenClaw Dashboard -&amp;gt; Skills -&amp;gt; Search MCP -&amp;gt; MCP Porter (Install)&lt;/p&gt;

&lt;p&gt;Note: if it doesn't open, restart the OpenClaw server.&lt;/p&gt;

&lt;p&gt;Once you do that:&lt;/p&gt;

&lt;p&gt;→ Go to home folder where OpenClaw is installed: &lt;code&gt;/home/username/.openclaw/workspace/config&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;→ Open the &lt;code&gt;mcporter.json&lt;/code&gt; in any ide and paste the following &amp;amp; save:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"url_from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"x-api-key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_key"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"imports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The &lt;strong&gt;url&lt;/strong&gt; and &lt;strong&gt;api&lt;/strong&gt; key are the one from the pre-require step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or if you want a standard input output (stdio) server setup you can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; composio-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"composio-mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"--api-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api_key"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mcporter call &lt;span class="nt"&gt;--stdio&lt;/span&gt; &lt;span class="s2"&gt;"npx @composio/mcp@latest setup https://backend.composio.dev/tool_router/&amp;lt;api-key&amp;gt;/mcp"&lt;/span&gt; &amp;lt;tool_name&amp;gt; &amp;lt;arg1&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;value1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to make sure agent pick up the composio mcp servers perfectly you need to setup the skills file!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add https://github.com/composiohq/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; composio &lt;span class="nt"&gt;--yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you are all setup to experience OpenClaw seamlessly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡Fact: Though you can do all the steps in section through prompt in OpenClaw Dashboard (section 1), but it causes security concerns as as it stores logs that are accessible to other, if they have your agent id!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Tools like open-claw seem amazing at first glance but can easily become a nightmare if not handled right - especially around security. &lt;/p&gt;

&lt;p&gt;The moment you hand broad permissions or API keys to an agent; you've opened a door you might forget, but it is even there. It doesn't know what's sensitive, it just acts. &lt;/p&gt;

&lt;p&gt;That’s where tool like &lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; sidesteps this quietly by handling scoped access and managed credentials under the hood, so the agent does its job without holding the master keys to everything.&lt;/p&gt;

&lt;p&gt;What other approach you find safeguards your privacy and sensitive data, do share in comments!&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>opensource</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to set up Secure OpenClaw and power it with 850+ SaaS Apps 🦞🔒</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Thu, 05 Mar 2026 13:26:54 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-set-up-secure-openclaw-and-power-it-with-850-saas-apps-5d5j</link>
      <guid>https://forem.com/composiodev/how-to-set-up-secure-openclaw-and-power-it-with-850-saas-apps-5d5j</guid>
      <description>&lt;p&gt;OpenClaw has been showing up in my feed way too much, so I finally sat down and tested it properly, and yeah, it comes with a few real problems.&lt;/p&gt;

&lt;p&gt;In this post, I’ll cover what OpenClaw is, how to set it up, where the security risks really come from, and how to use &lt;strong&gt;safer remote integrations&lt;/strong&gt; so you can make it a bit more secure and save yourself some stress.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zoa277kk0pcvkygsv18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zoa277kk0pcvkygsv18.png" alt="OpenClaw banter on the internet" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you just want the takeaway, here’s the deal with OpenClaw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenClaw is a local agent gateway.&lt;/strong&gt; It is the layer that connects your LLM (OpenAI, Anthropic, etc.) to real tools and local execution.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The “special sauce” is the package.&lt;/strong&gt; People like it because it ships as a usable bundle: built-in skills, a simple “agent brain” file (&lt;code&gt;SOUL.md&lt;/code&gt;), and easy chat support like messenger integrations.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Security is the big problem.&lt;/strong&gt; By design, it can touch files, run commands, and pull third-party skills. The least-bad way to use it is with &lt;strong&gt;remote, sandboxed integrations&lt;/strong&gt; (which I’ve shown how to set up).&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Also, watch your token bill.&lt;/strong&gt; It can be very inefficient and chew through credits fast, especially if you’re using hosted models instead of a local LLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, you'll learn everything you need to understand and start with OpenClaw (and make it slightly better with secure integrations).&lt;/p&gt;




&lt;h2&gt;
  
  
  What's OpenClaw?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfs0cgc950ax7jj589gh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmfs0cgc950ax7jj589gh.png" alt="OpenClaw GitHub banner" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OpenClaw is a personal AI assistant you run on your own machine (or a server you own). It is not a new model. It is the thing that actually sits between your model provider (OpenAI, Anthropic, Kimi, etc.) and the stuff you want done, such as messaging, tools, files, and integrations.&lt;/p&gt;

&lt;p&gt;Take this as a mental model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your LLM is the brain (thinks)&lt;/li&gt;
&lt;li&gt;OpenClaw is the body (it can do things)&lt;/li&gt;
&lt;li&gt;The Gateway is the receptionist (routes messages in and results out)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when people say “OpenClaw turns an LLM into an agent,” what they really mean is: it gives the model a runtime that can call tools, keep state, and show up where you already chat (WhatsApp, Telegram, Slack, Discord, etc.).&lt;/p&gt;

&lt;p&gt;Now, that's just the gist. There's a lot more to understand. I assume you've already worked with it, so I'm not going any deeper than this in the intro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febm07htbjdxc0m1aqlnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febm07htbjdxc0m1aqlnm.png" alt="OpenClaw anatomy" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What's Special than something like Manus? 🤔
&lt;/h3&gt;

&lt;p&gt;Manus is essentially "agent as a product," but you're limited to their UI, tools, rules, and cloud.&lt;/p&gt;

&lt;p&gt;OpenClaw is more like “agent as a kit.” It’s meant to be installed, set up, and shaped around your &lt;strong&gt;own workflow&lt;/strong&gt;. You decide what models it uses, what tools it can touch, what data it can access, and where it runs.&lt;/p&gt;

&lt;p&gt;That's the biggest difference.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💁 "Manus is for convenience, and OpenClaw is for control."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wow, that was a nice line I came up with on the fly. 😂&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenClaw Installation
&lt;/h2&gt;

&lt;p&gt;You’ve got two clean ways to install OpenClaw. If you just want it running quickly, do the normal installation. If you’re even slightly paranoid (which you should be 😮‍💨), do Docker.&lt;/p&gt;

&lt;p&gt;The core requirement is &lt;strong&gt;Node ≥ 22&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Normal install (recommended for most people)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prereqs:&lt;/strong&gt; Node 22+ and an API key (OpenAI, Anthropic, OpenRouter, whatever you’re using).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install OpenClaw:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run onboarding (this sets up provider auth + gateway settings and can install the background service):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw onboard &lt;span class="nt"&gt;--install-daemon&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check the gateway status (if you installed the service, it should already be running):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Optional:&lt;/strong&gt; Open the Control UI:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Docker (more isolated and secure)
&lt;/h3&gt;

&lt;p&gt;Docker is great when you want a throwaway environment or isolation from your host, but it introduces an important rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Containers only see plugins and config if they share the same OpenClaw state directory/volume. So, it comes with a little complexity.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone and start the Docker stack:
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/openclaw/openclaw
&lt;span class="nb"&gt;cd &lt;/span&gt;openclaw
./docker-setup.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 To know more about how/what it does, visit the &lt;a href="https://docs.openclaw.ai/install/docker#quick-start-recommended" rel="noopener noreferrer"&gt;OpenClaw Docker Quickstart&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Control UI gotchas
&lt;/h2&gt;

&lt;p&gt;If you open the Control UI, and it shows something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;unauthorized: gateway token missing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's normal. The UI needs a gateway token to connect.&lt;/p&gt;

&lt;p&gt;Get your token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.openclaw/openclaw.json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.gateway.auth.token'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure &lt;code&gt;jq&lt;/code&gt; is installed on your machine. Or, you can manually get the token from the config file &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste it in the UI (Overview → Gateway Access → Gateway Token)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhiyeoiocmm7wwvkm22z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhiyeoiocmm7wwvkm22z.png" alt="OpenClaw control UI" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a URL that includes it, for example via:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw dashboard &lt;span class="nt"&gt;--no-open&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbfknrusautve6n1wu3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbfknrusautve6n1wu3e.png" alt="OpenClaw URL with a token" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenClaw is bad for Security
&lt;/h2&gt;

&lt;p&gt;OpenClaw’s whole selling point is also the problem: it can read/write files, run shell commands, and load third party “skills.” That is basically “download random code from the internet and run it with your permissions,” except now an LLM is the one executing.&lt;/p&gt;

&lt;p&gt;What’s actually gone wrong in the wild (already):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Malicious skills on ClawHub:&lt;/strong&gt; researchers found hundreds to thousands of skills that were straight up malware or had critical issues, including credential theft and prompt injection patterns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection turning into installs:&lt;/strong&gt; there’s been at least one high profile incident where a prompt injection was used to push OpenClaw onto machines via an agent workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exfiltrate API keys and tokens&lt;/strong&gt;: When your agent has full control of the computer, and when compromised, it can easily exfiltrate the API keys and tokens to attackers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt4rsqu3wykpix72papj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt4rsqu3wykpix72papj.png" alt="OpenClaw security flaws blog post discussion" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re still going to run it, do the bare minimum to not get cooked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't trust skills you don't know. If you didn’t read it, don’t install it.&lt;/li&gt;
&lt;li&gt;Prefer OAuth-hosted integrations over pasting keys locally.&lt;/li&gt;
&lt;li&gt;Run it sandboxed (Docker) and keep it away from your real home directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to read more on OpenClaw’s security posture, we have a nice piece on it: &lt;a href="https://composio.dev/blog/openclaw-security-and-vulnerabilities" rel="noopener noreferrer"&gt;OpenClaw is a Security Nightmare Dressed Up as a Daydream&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting up safe Integrations
&lt;/h2&gt;

&lt;p&gt;So enough of that. Let's look into how you can make it a bit more secure.&lt;/p&gt;

&lt;p&gt;I assume you already have OpenClaw installed and have already done the initial setup onboarding. We’ll use Composio plugin, which gives us access to 850+ SaaS apps like Gmail, Outlook, Canva, YouTube, Twitter and more without you needing to manage OAuth tokens and integrations.&lt;/p&gt;

&lt;p&gt;Contrary to OpenClaw’s native integrations, the credentials do not stay in your system and neither a compromised Claw can access them. The credentials are securely hosted and managed by Composio.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Composio Plugin
&lt;/h3&gt;

&lt;p&gt;Composio’s OpenClaw plugin connects OpenClaw to Composio’s MCP endpoint and exposes third-party tools (GitHub, Gmail, Slack, Notion, etc.) through that layer without you needing to handle auth hassles.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins &lt;span class="nb"&gt;install&lt;/span&gt; @composio/openclaw-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Composio Plugin Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Log in at &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Choose OpenClaw as the client.&lt;/li&gt;
&lt;li&gt;Copy your consumer key (&lt;code&gt;ck_...&lt;/code&gt;) from the Composio dashboard settings, then set it:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq7iwaghb2x4qh7r45nz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq7iwaghb2x4qh7r45nz.png" alt="Composio Consumer Key generation" width="800" height="213"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;plugins.entries.composio.config.consumerKey &lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Verify the plugin loaded
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw plugins list
openclaw logs &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're looking for something like "Composio loaded" and a "tools registered" message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpsvm2sy8geqomwkr1ri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdpsvm2sy8geqomwkr1ri.png" alt="OpenClaw loading Composio plugins" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the plugin is &lt;strong&gt;"loaded"&lt;/strong&gt;, it means that you can now successfully access Composio.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;p&gt;The plugin connects to Composio's MCP server at &lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt; and registers all available tools directly into the OpenClaw agent. Tools are called by name. No extra search or execute steps needed.&lt;/p&gt;

&lt;p&gt;If a tool returns an auth error, the agent will prompt you to connect that toolkit at &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's how the configuration looks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"composio"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"consumerKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ck_your_key_here"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can configure the following options directly from the config file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;enabled&lt;/code&gt;: enable or disable the plugin&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;consumerKey&lt;/code&gt;: your Composio consumer key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mcpUrl&lt;/code&gt;: the MCP server URL. By default, it's &lt;code&gt;https://connect.composio.dev/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Previously, you had to configure API keys per integration, but with Composio you don't have to care about any of that. Just make sure &lt;strong&gt;not to leak&lt;/strong&gt; the consumer key that we generated.&lt;/p&gt;

&lt;p&gt;And it's that simple. Everything works out of the box as you would use any other OpenClaw plugins!&lt;/p&gt;

&lt;p&gt;Now, to test if it works, head over to the Control UI chat and send a message, something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“List the Composio tools you have available. Only print the result here”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgllla2gksya8b9btu9pq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgllla2gksya8b9btu9pq.png" alt="OpenClaw chat session" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it asks you to connect the tools, head over to &lt;a href="https://dashboard.composio.dev/" rel="noopener noreferrer"&gt;dashboard.composio.dev&lt;/a&gt; and connect each of the tools you require. It's as simple as clicking &lt;strong&gt;Connect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw7pva65r9ghx9vngi1g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkw7pva65r9ghx9vngi1g.png" alt="Composio Integrations" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the integrations you use are OAuth hosted, and only the tools you connect will be available to OpenClaw. Nothing more than that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrap Up!
&lt;/h2&gt;

&lt;p&gt;OpenClaw is really useful for some people (not everyone), but it’s also risky. It can touch your files, run commands, and pull in third party skills, which can &lt;strong&gt;include malware&lt;/strong&gt;, like we discussed. It’s a local agent gateway with everything: your filesystem, your shell, and whatever credentials you put into it. That power is the whole point, and it’s also the danger.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnhhnc4jpxr7gwxosedq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnhhnc4jpxr7gwxosedq.gif" alt="With great power comes great responsibility GIF" width="480" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So if you’re going to use it, seriously consider &lt;strong&gt;OAuth-hosted safe integrations&lt;/strong&gt; instead of pasting API keys everywhere. It’s an easy way to reduce the chance of a disaster.&lt;/p&gt;

&lt;p&gt;And, if you're looking for some secure alternatives, find it here: &lt;a href="https://composio.dev/blog/openclaw-alternatives" rel="noopener noreferrer"&gt;Top 5 Secure OpenClaw Alternatives&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it for this post. Hope it helped, and I’ll see you next time. ✌️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Top 10 OpenClaw Skills to Take Your Productivity Up a Notch!</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Thu, 05 Mar 2026 12:43:15 +0000</pubDate>
      <link>https://forem.com/composiodev/top-10-openclaw-skills-to-take-your-productivity-up-a-notch-kg</link>
      <guid>https://forem.com/composiodev/top-10-openclaw-skills-to-take-your-productivity-up-a-notch-kg</guid>
      <description>&lt;p&gt;OpenClaw is growing fast and if you've used it for anything beyond general tasks, you've probably noticed the gap. &lt;/p&gt;

&lt;p&gt;It handles most things, but specialized work like research, UI/UX design, writing, or reverse engineering? The output quality just isn't there. &lt;/p&gt;

&lt;p&gt;That's the problem SKILLS solves!&lt;/p&gt;

&lt;p&gt;It's a single file that plugs into OpenClaw and gives it deep, domain-specific context - purpose-built instructions for doing one thing exceptionally well. Better context in, better output out.&lt;/p&gt;

&lt;p&gt;The catch? OpenClaw's own ClawdHub has hundreds of these skills, and roughly 80% are garbage or outright malicious. Finding the good ones takes time. &lt;/p&gt;

&lt;p&gt;Last week I did that work and here's what's actually worth using.&lt;/p&gt;




&lt;h3&gt;
  
  
  TL DR;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenClaw skils are single-file plugins that give OpenClaw deep, domain-specific context to go from generic output to expert-level results.&lt;/li&gt;
&lt;li&gt;80% of ClawHub skills are garbage or malicious, so vet carefully; the ones listed here are already filtered for quality (even though some show malignant, most are vetted by security teams).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composio&lt;/strong&gt; - One integration that unlocks 860+ external tools (GitHub, Slack, Gmail, etc.) so you can build full AI agents without touching auth pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reverse Engineering&lt;/strong&gt; - Turns OpenClaw into a network analyst that captures traffic, decodes binary protocols, and spits out clean parsers and docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend Design&lt;/strong&gt; - Forces OpenClaw past generic purple-gradient output into bold, production-grade UI with real aesthetic intent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Improving Agent&lt;/strong&gt; - Logs errors, learnings, and preferences into memory so OpenClaw gets smarter and more personalized over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eleven Labs Agent&lt;/strong&gt; - Gives OpenClaw a real voice and a failsafe: if email or text fails, it literally calls someone instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N8N Workflow&lt;/strong&gt; - Chat-driven control over your local N8N instance - trigger complex automations without subscriptions or a dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exa Search&lt;/strong&gt; - Replaces generic browsing with a developer-focused index pulling from actual docs, GitHub repos, and coding forums.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; - Plain English commands that translate directly into Vercel CLI actions - deploy, rollback, debug, no terminal needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI Whisper&lt;/strong&gt; - Runs Whisper locally so you get fast, accurate transcriptions without your audio ever hitting a third-party server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Home Assistant&lt;/strong&gt; - Natural language control over your entire smart home, fully local, zero cloud dependency.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;How To Install Skills in Openclaw?&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Install Skills in Openclaw?
&lt;/h2&gt;

&lt;p&gt;Before moving forward we need to load skills in openclaw, and here is how to do it in 2 way’s.&lt;/p&gt;

&lt;h3&gt;
  
  
  ClawdHub
&lt;/h3&gt;

&lt;p&gt;Clawdhub is central repository offered by open claw community, to load skills. Follow these steps to get up and running. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://clawhub.ai/" rel="noopener noreferrer"&gt;ClawHub&lt;/a&gt; and head to skills section.&lt;/li&gt;
&lt;li&gt;Select the skills you want by filtering as per needs / directly searching for them and open its page.&lt;/li&gt;
&lt;li&gt;Navigate down and copy the command given after verifying Security Scan says Benign for Openclaw (vvi)&lt;/li&gt;
&lt;li&gt;Head to the terminal where open claw is installed and paste it. For me its docker and its the same skill I will install!
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;installs&lt;/span&gt; &lt;span class="n"&gt;clawhub&lt;/span&gt;
&lt;span class="n"&gt;npx&lt;/span&gt; &lt;span class="n"&gt;clawhub@latest&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;sonoscli&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;
&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//github.com/peterskoett/self-improving-agent.git ~/.openclaw/workspace/skills/self-improving-agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Caution&lt;/strong&gt;: Never install the calwdhub skills directly with clawdhub directly, without visiting the clawdhub website and verifying security&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can ensure it is active, by going to calwdbot dashboard and checking skills section!&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills.sh
&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://Skills.sh" rel="noopener noreferrer"&gt;Skills.sh&lt;/a&gt; is a website, recently released by vercel to curate highly vetted skills. Here is how to install skills using it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Head over to &lt;a href="http://skills.sh" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt; (by vercel) and find the skill needed.&lt;/li&gt;
&lt;li&gt;Open the page and install the same skill using npm: &lt;code&gt;npx skills add &amp;lt;owner/repo&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Let’s go with same skills as above.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;openclaw&lt;/span&gt;
&lt;span class="n"&gt;npx&lt;/span&gt; &lt;span class="n"&gt;skills&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//github.com/charon-fan/agent-playbook --skill self-improving-agent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Select openclaw from the list

&lt;ul&gt;
&lt;li&gt;Press &lt;code&gt;space&lt;/code&gt; to select and &lt;code&gt;enter&lt;/code&gt; to finalize.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once done, verify by revisiting the dashboard’s skills section:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="" class="article-body-image-wrapper"&gt;&lt;img alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this understanding, we are ready to explore all the plugins I found out to be good. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Spoiler: you already installed 1 of them!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Top 10 Skills to use with OpenClaw&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Composio
&lt;/h3&gt;

&lt;p&gt;This one personally I use the most and it genuinely delivers. &lt;/p&gt;

&lt;p&gt;It gives OpenClaw access to 860+ external tools through a single integration framework, meaning you can build AI agents that talk to GitHub, Slack, Gmail, and hundreds of other services without writing a single custom authentication pipeline. &lt;/p&gt;

&lt;p&gt;Whether you're building autonomous agents or traditional apps, this skill handles all the heavy lifting.&lt;/p&gt;

&lt;p&gt;To install this skill, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in terminal navigate to &lt;code&gt;/home/&amp;lt;username&amp;gt;/.openclaw/skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;and run &lt;code&gt;npx skills add composiohq/skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;select Openclaw, rest keep default.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once done you will see composio folder under skills section.&lt;/p&gt;

&lt;p&gt;This is also a good example of how open claw keep their skills and what happens under the hood when you use clawdhub to install skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building interactive, chat-based AI agents that securely access external services like Gmail or Slack via isolated MCP sessions.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Create an agent that monitors my Gmail and summarizes unread emails every morning."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Developing multi-tenant SaaS applications that require programmatic execution of external tools and manual authentication management.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;prompt: "Set up a direct execution flow for managing GitHub repos across multiple user accounts."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Setting up event-driven automation workflows that listen for real-time triggers and process verified incoming webhooks.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Create a workflow that triggers whenever a new Stripe payment is received."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Self-Improving Agent&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Clawdbot already has some self-improvement capability, this skill takes it to the next level.&lt;/p&gt;

&lt;p&gt;It dynamically tracks interactions, logging errors, active learnings, and feature requests into a dedicated memory folder.&lt;/p&gt;

&lt;p&gt;This gives the bot a structured layer of intelligence that makes it more accurate over time, not just responsive.&lt;/p&gt;

&lt;p&gt;Can be dowloaded from clawdhub at &lt;a href="https://clawhub.ai/pskoett/self-improving-agent" rel="noopener noreferrer"&gt;Self-Improving-Agent - ClawHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuously logging errors to prevent the bot from repeating past mistakes

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Remember this error and avoid it next time."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Storing user preferences and learnings for a tailored experience over time

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Remember I prefer concise responses"&lt;/em&gt; or &lt;em&gt;"Log this as a learning."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Reverse Engineering
&lt;/h3&gt;

&lt;p&gt;Ever wanted to reverse engineer a tool, app, or web service to understand exactly how it communicates under the hood - this skill is built for that. &lt;/p&gt;

&lt;p&gt;It turns OpenClaw into an elite network analyst, capable of capturing raw traffic, dissecting unknown protocols, and translating binary data into clean documentation and custom parsers. &lt;/p&gt;

&lt;p&gt;Whether it's security research, debugging, or system interoperability, this skill gives you full visibility into any network communication.&lt;/p&gt;

&lt;p&gt;Use with caution &amp;amp; you can install it at: &lt;a href="https://skills.sh/wshobson/agents/protocol-reverse-engineering" rel="noopener noreferrer"&gt;Reverse Engineering&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capturing and analyzing raw network traffic to uncover vulnerabilities or undocumented features in proprietary communication protocols.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Capture and analyze traffic from this app and identify any undocumented endpoints."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Developing custom Wireshark dissectors (Lua) and Python parsers to map out complex binary structures and fixed headers.

&lt;ul&gt;
&lt;li&gt;prompt: “&lt;em&gt;Write a Wireshark Lua dissector for this binary protocol sample."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Performing entropy analysis and TLS fingerprinting (JA3/JA3S) to identify encryption methods and extract hidden metadata.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;prompt: "Run entropy analysis on this packet capture and identify the encryption layer."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;But use cases are infinite, for e.g my friend reverse engineered entire product to build it better.&lt;/p&gt;




&lt;p&gt;OpenClaw can build frontend apps out of the box, but the output is generic at best - the usual Inter font, purple gradients, and safe layouts.&lt;/p&gt;

&lt;p&gt;If you're a frontend developer or UI/UX designer, this skill is non-negotiable. &lt;/p&gt;

&lt;p&gt;It forces OpenClaw into a master-level design mindset, demanding bold aesthetic direction, intentional typography, and production-grade interfaces before a single line of code is written.&lt;/p&gt;

&lt;p&gt;You can install this skill at: &lt;a href="https://skills.sh/anthropics/skills/frontend-design" rel="noopener noreferrer"&gt;frontend-design by anthropics/skills&lt;/a&gt; (yup its by anthropic!)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rapidly prototyping highly distinctive landing pages that immediately stand out from competitor templates.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Build me a landing page with a brutalist aesthetic for a SaaS product."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Translating abstract brand vibes into fully functional, production-ready frontend code

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;prompt: "Design a site that feels like an editorial fashion magazine, dark and high contrast."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Breaking out of cookie-cutter design ruts by forcing unexpected layout choices and non-standard typography pairings

&lt;ul&gt;
&lt;li&gt;prompt:  &lt;em&gt;"Redesign this hero section, avoid any standard layouts or default fonts."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;and more!&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Eleven Labs Agent
&lt;/h3&gt;

&lt;p&gt;If you are into voice-ai and tooling / your job requires ai calling services, this skill is a game changer.&lt;/p&gt;

&lt;p&gt;It integrates directly with the 11Labs CLI, giving OpenClaw an actual voice and bridging the gap between text-based AI operations and real-world audio interactions.&lt;/p&gt;

&lt;p&gt;Most interesting is fail safe mechanism: if clawbot failed to send text message or email fails, the bot automatically pivots to making a real phone call instead.&lt;/p&gt;

&lt;p&gt;You can install the skills from at &lt;a href="https://clawhub.ai/PennyroyalTea/elevenlabs-agents" rel="noopener noreferrer"&gt;ElevenLabs Agents - ClawHub&lt;/a&gt; . Make sure you have your Eleven Lab’s API Key&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acting as a fallback to physically call people or businesses if text-based emails or messages fail to send

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"If the email fails, call them instead."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Automating voice-based tasks like making reservations or handling customer service inquiries on your behalf.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Call and book a table for 2 at 7pm"&lt;/em&gt; or &lt;em&gt;"Call support and follow up on my order."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Generating voiced summaries or updates for hands-free productivity

&lt;ul&gt;
&lt;li&gt;prompt:  &lt;em&gt;"Read out my task list for today"&lt;/em&gt; or &lt;em&gt;"Give me a voice update on pending emails.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. N8N Workflow
&lt;/h3&gt;

&lt;p&gt;You've probably used N8N - and if so, you already know that running enterprise-level automations burns cash fast. &lt;/p&gt;

&lt;p&gt;This skill connects OpenClaw directly to your N8N instance, letting you spin up, manage, and trigger complex multi-step workflows using cron jobs &amp;amp; plain chat  &lt;/p&gt;

&lt;p&gt;This means no expensive subscriptions, no manual dashboard, just automation on demand &amp;amp; best part - entire process runs on local version, so data remins private.&lt;/p&gt;

&lt;p&gt;You can install it at: &lt;a href="https://clawhub.ai/KOwl64/n8n-workflow-automation" rel="noopener noreferrer"&gt;n8n workflow automation - ClawHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Triggering an automated sequence to create and post LinkedIn updates the moment a new podcast goes live.

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;prompt: "When a new podcast episode drops, draft and post a LinkedIn update automatically."&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Setting up complex, multi-app workflows entirely through conversational commands

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Create a workflow that saves every Gmail attachment to Dropbox and notifies me on Slack."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Automating repetitive data tasks like scraping, formatting, and sending weekly reports

&lt;ul&gt;
&lt;li&gt;prompt:&lt;em&gt;"Every Monday at 9am, pull last week's analytics and email me a summary."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;6. Exa Search&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;OpenClaw supports browsing, but for technical work, general search just doesn't cut it as it surfaces SEO blogs over actual documentation. &lt;/p&gt;

&lt;p&gt;Exa fixes that by connecting OpenClaw directly to a search index built for developers, pulling from GitHub repos, technical docs, and coding forums instead. &lt;/p&gt;

&lt;p&gt;If you write code regularly, this is the skill that cuts hallucinations and gets you accurate answers fast.&lt;/p&gt;

&lt;p&gt;You can install the skill at: &lt;a href="https://clawhub.ai/fardeenxyz/exa" rel="noopener noreferrer"&gt;Exa - ClawHub&lt;/a&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You require an EXA_API_KEY while setup&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pulling the most up-to-date coding documentation and API references for web development.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Find the latest React 19 docs on server components."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Searching the web specifically for highly technical programming solutions and developer resources.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Search Exa for the best open-source alternatives to Stripe's API."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Finding real-world code examples and GitHub repos for a specific implementation.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Find me a GitHub repo that implements JWT authentication in Node.js."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. Vercel
&lt;/h3&gt;

&lt;p&gt;If deploying sites to Vercel is second nature to you, this skill just makes it faster and automated. &lt;/p&gt;

&lt;p&gt;It connects OpenClaw directly to the Vercel CLI, translating plain conversational commands into the exact terminal scripts needed to deploy, manage, and update your projects. &lt;/p&gt;

&lt;p&gt;No manual terminal work required anymore&lt;/p&gt;

&lt;p&gt;You can install this skill at: &lt;a href="https://clawhub.ai/TheSethRose/vercel" rel="noopener noreferrer"&gt;Vercel Platform - ClawHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploying new websites, applications, and web projects using simple natural language prompts.

&lt;ul&gt;
&lt;li&gt;prompt*: "Deploy this project to Vercel."*&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Managing cloud hosting environments and triggering project builds without typing complex terminal commands.

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Trigger a new build for my production environment"&lt;/em&gt; or &lt;em&gt;"Roll back to the last stable deployment."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Checking deployment status and debugging failed builds on the fly

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Why did my last deployment fail?"&lt;/em&gt; or &lt;em&gt;"Show me the build logs for my latest push."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;8. OpenAI Whisper&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you're a developer and content creator, you already know how valuable accurate transcriptions are, and uploading sensitive audio to third-party services isn't always an option. &lt;/p&gt;

&lt;p&gt;This skill runs OpenAI's Whisper model locally on your machine, giving you fast, accurate transcriptions without your audio ever leaving your system.&lt;/p&gt;

&lt;p&gt;This means anyone can turn spoken word into text regularly. It requires an OpenAI API key and relies on a local installation.&lt;/p&gt;

&lt;p&gt;You can install this skill at: &lt;a href="https://clawhub.ai/steipete/openai-whisper" rel="noopener noreferrer"&gt;Openai Whisper - ClawHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transcribing audio and video files completely offline for maximum privacy

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Transcribe this audio file locally."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Quickly converting meeting recordings or voice notes into highly accurate text documents

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Convert this meeting recording to text"&lt;/em&gt; or &lt;em&gt;"Transcribe my voice note and clean it up."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Generating subtitles or captions for video content without a paid tool

&lt;ul&gt;
&lt;li&gt;prompt: just say &lt;em&gt;"Transcribe this video and format the output as subtitles."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  9. Home Assistant &amp;amp; Extras
&lt;/h3&gt;

&lt;p&gt;Personally, I haven’t used it, but few of my friends say its game changing in home automation.&lt;/p&gt;

&lt;p&gt;It connects OpenClaw directly to a local Home Assistant setup, letting you control your entire home through fluid natural language.&lt;/p&gt;

&lt;p&gt;This means no rigid routines, no cloud dependency, no data leaving your network. &lt;/p&gt;

&lt;p&gt;You can install it at: &lt;a href="https://clawhub.ai/iAhmadZain/home-assistant" rel="noopener noreferrer"&gt;Home Assistant - ClawHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controlling smart lights, locks, and appliances locally via natural language commands

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Turn off all the lights in the living room"&lt;/em&gt; or &lt;em&gt;"Lock the front door."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Creating dynamic, AI-driven home automation routines without complex coding

&lt;ul&gt;
&lt;li&gt;prompt:  &lt;em&gt;"Every night at 10pm, dim the bedroom lights and lock all doors."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Checking and managing the status of all connected devices in one place

&lt;ul&gt;
&lt;li&gt;prompt: &lt;em&gt;"Which devices are currently on?"&lt;/em&gt; or &lt;em&gt;"Show me everything that's active in the house right now."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Isn’t this one insane? Turning a conversational ai bot into a localized, privacy-first smart home hub.&lt;/p&gt;

&lt;p&gt;This wraps up most of the skills I found useful, some extra includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model Usage:&lt;/strong&gt; Monitors and reports API token consumption and usage statistics across various AI providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp CLI:&lt;/strong&gt; Allows you to draft, approve, and send WhatsApp messages hands-free using natural language prompts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bird (Twitter/X):&lt;/strong&gt; Interacts with X (formerly Twitter) to search for keywords, check feeds, and pull social data directly into the chat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;YouTube Summarizer:&lt;/strong&gt; Extracts and summarizes YouTube video transcripts to help generate descriptions, headlines, and social copy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GA4 Analysis:&lt;/strong&gt; Connects to Google Analytics 4 to provide automated, natural language summaries of your website's traffic and performance data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GNO:&lt;/strong&gt; Acts as a local document search indexer that uses BM25 vector hybrid search to retrieve AI-generated answers from your personal files.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;OpenClaw skills are &lt;strong&gt;plugins that add tools, knowledge, and workflows&lt;/strong&gt; to enhance the capabilities of the OpenClaw AI agent. Here are some key points about OpenClaw skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installation&lt;/strong&gt;: Skills can be installed using the CLI, by editing files, or through ClawHub. You can browse and install skills with one command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Types of Skills&lt;/strong&gt;: OpenClaw skills can include tools for automating workflows, interacting with   external services, and performing specialized tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community Skills&lt;/strong&gt;: There are over 2,868 community-built skills available on ClawHub, organized by category for easier discovery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Always review a skill's SKILL.md and scripts before installing, as some skills may have security risks. For more detailed information, you can explore the OpenClaw Skills Directory.&lt;/li&gt;
&lt;li&gt;Alternative: You can use &lt;a href="http://skills.sh" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt; to find and load all the non-malignant skills, but make sure to check all the files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, installing all skills separately, calling the right tools, invoking right methods in cli are such a hassle.  &lt;/p&gt;

&lt;p&gt;Composio Skill simples that and provides you access to 860+ services without worrying about tool selection, tool calls and context rot. &lt;/p&gt;

&lt;p&gt;So, install it once and keep using Openclaw as normal with superpowers.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>automation</category>
      <category>mcp</category>
    </item>
    <item>
      <title>🖐️Top 5 secure OpenClaw Alternatives you should consider 👀</title>
      <dc:creator>Shrijal Acharya</dc:creator>
      <pubDate>Tue, 17 Feb 2026 12:59:41 +0000</pubDate>
      <link>https://forem.com/composiodev/top-5-secure-openclaw-alternatives-you-should-consider-172p</link>
      <guid>https://forem.com/composiodev/top-5-secure-openclaw-alternatives-you-should-consider-172p</guid>
      <description>&lt;p&gt;OpenClaw is everywhere right now, and I get the hype. I’ve been seeing it all over my feed lately, and it’s clearly clicking with a lot of people. 👌&lt;/p&gt;

&lt;p&gt;After using it for quite some time myself, it feels a bit too noisy, and not every tool works the same way for every person.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7j8wyae4kp66m1etga3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7j8wyae4kp66m1etga3.png" alt="OpenClaw tweets"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whenever something starts trending this hard, it’s a good excuse to look around, especially if you’re after something more minimal.&lt;/p&gt;

&lt;p&gt;And now, OpenClaw may have its 4th rename to be &lt;strong&gt;Closed&lt;/strong&gt;Claw very soon. 🤷‍♂️ You never know with OpenAI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu5w8ex4icind6gwy2ph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu5w8ex4icind6gwy2ph.png" alt="OpenClaw joining OpenAI tweet"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why OpenClaw alternatives?
&lt;/h2&gt;

&lt;p&gt;OpenClaw is super powerful, no doubt, but it comes with two big headaches, and you probably have already felt them yourself.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Setup Friction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When your agent can read files, run shell commands, and pull in third-party “skills,” you are basically giving it the keys to your machine. The skill marketplace has already turned into a real problem, with researchers finding &lt;strong&gt;hundreds of malicious skills&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are not auditing everything you install, it is easy to get yourself cooked.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F170ua87mrfkafsw3pmx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F170ua87mrfkafsw3pmx7.png" alt="OpenClaw marketplace found to have malwares"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup Friction&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The “self-host it and wire up” path is fun if you like tinkering, but it is also where most people get stuck. You end up handling gateways, background services, tokens, and permission issues (most of the time).&lt;/p&gt;

&lt;p&gt;And it's not that you're probably going to use all the features that come with the bloated app, just a few, for most people, so alternatives often could be a good choice.&lt;/p&gt;

&lt;p&gt;Below are five OpenClaw alternatives that can cover the same ground, often with a smoother and more minimal experience, depending on what you’re building.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://www.trustclaw.app/" rel="noopener noreferrer"&gt;TrustClaw&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Rebuilt from scratch on OpenClaw's idea with &lt;strong&gt;1000+ tools&lt;/strong&gt;, with a focus on security.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygoq325t5h7exrxk46y4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fygoq325t5h7exrxk46y4.png" alt="TrustClaw by Composio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TrustClaw is for those who like the idea of OpenClaw but don't want to hand over their passwords to the agent and run it locally.&lt;/p&gt;

&lt;p&gt;It's built by the &lt;strong&gt;Composio team&lt;/strong&gt;, and the pitch is basically: you get an agent that is available 24/7, capable of taking real actions across a vast number (500+) of apps, but the risky parts like credentials and code execution are handled in a more controlled way.&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes it different?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth-only auth:&lt;/strong&gt; You connect apps the normal way (OAuth), so you are not pasting API keys or passwords into config files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxed execution by default:&lt;/strong&gt; Every action runs in an isolated cloud environment that disappears when the task finishes. So you are not running “agent code” locally with your permissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed tool surface:&lt;/strong&gt; Instead of pulling random community “skills” from a public registry, TrustClaw uses Composio’s managed integrations and tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit trails + kill switch:&lt;/strong&gt; It keeps a full action log, and you can revoke access with one click if you ever need to.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is important because agent toolchains are a real security risk right now. These marketplaces, with just one random add-on, can trick you into running malware. This has already happened in the past. Ref: &lt;a href="https://www.theverge.com/news/874011/openclaw-ai-skill-clawhub-extensions-security-nightmare" rel="noopener noreferrer"&gt;OpenClaw’s AI ‘skill’ extensions are a security nightmare&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The kind of prompts it’s built for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;“Handle my customer complaints and log in Notion”&lt;/p&gt;

&lt;p&gt;It finds the right tools, fetches emails, creates drafts, and writes Notion pages (using tools such as: &lt;code&gt;GMAIL_FETCH_EMAILS&lt;/code&gt;, &lt;code&gt;GMAIL_CREATE_DRAFT&lt;/code&gt;, &lt;code&gt;NOTION_CREATE_PAGE&lt;/code&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Pull all Reddit threads mentioning [competitor] from the last 3 months, analyze sentiment...”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Summarize all Slack messages in #product-feedback from this week...”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why it’s comparatively better (for most of you)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setup in seconds&lt;/strong&gt; (vs. 30 to 60 minutes of tunnels and local setup)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypted credentials&lt;/strong&gt; managed by Composio (vs. plaintext local config)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote sandbox&lt;/strong&gt; (vs. local machine execution)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed tool surface&lt;/strong&gt; (vs. unvetted public skill registry)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action logs + one-click revocation&lt;/strong&gt; (vs. digging through config files)&lt;/li&gt;
&lt;li&gt;and no need for &lt;strong&gt;Mac Mini&lt;/strong&gt; 🤷‍♂️&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick start
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to TrustClaw and hit &lt;a href="https://www.trustclaw.app/login" rel="noopener noreferrer"&gt;Get Started&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Connect the apps you want (OAuth flow).&lt;/li&gt;
&lt;li&gt;Give it a task in plain language, or schedule one to run while you are offline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's a demo: 👇&lt;/p&gt;

&lt;p&gt;

&lt;iframe class="tweet-embed" id="tweet-2022518658048888916-653" src="https://platform.twitter.com/embed/Tweet.html?id=2022518658048888916"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2022518658048888916-653');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2022518658048888916&amp;amp;theme=dark"
  }





&lt;/p&gt;

&lt;p&gt;It's that simple, so now you have OpenClaw that runs completely in the cloud with managed permissions and the tools you require.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. &lt;a href="https://zeroclaw.org/" rel="noopener noreferrer"&gt;ZeroClaw&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Written in Rust, it runs even on $10 hardware with &amp;lt;5MB RAM.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F576jdieqv0887vp0iv2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F576jdieqv0887vp0iv2r.png" alt="ZeroClaw - OpenClaw alternative"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ZeroClaw keeps the agent stack lean. Instead of a big local setup with lots of moving parts, you get a lightweight Rust binary that starts fast and runs comfortably on cheap hardware. If you care more about speed, stability, and low resource use, this one hits the sweet spot.&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes it different?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ultra lightweight:&lt;/strong&gt; designed to keep CPU and RAM usage low.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick boot:&lt;/strong&gt; fast startup, good for bots and always-on tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modular:&lt;/strong&gt; swap models, memory, tools, and channels without rewriting everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why pick it over OpenClaw?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want something minimal and predictable.&lt;/li&gt;
&lt;li&gt;You’re running on a small VPS / Raspberry Pi / home lab.&lt;/li&gt;
&lt;li&gt;You don’t need a huge plugin marketplace, you need a tool that just runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/zeroclaw-labs/zeroclaw.git
&lt;span class="nb"&gt;cd &lt;/span&gt;zeroclaw
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;
cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--force&lt;/span&gt;

&lt;span class="c"&gt;# quick setup with openrouter&lt;/span&gt;
zeroclaw onboard &lt;span class="nt"&gt;--api-key&lt;/span&gt; sk-... &lt;span class="nt"&gt;--provider&lt;/span&gt; openrouter

&lt;span class="c"&gt;# chat&lt;/span&gt;
zeroclaw agent &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Hello, ZeroClaw!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  3. &lt;a href="https://github.com/qwibitai/nanoclaw" rel="noopener noreferrer"&gt;NanoClaw&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ OpenClaw's alternative that runs entirely in a container for security.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ddtqk8ramy5wd0zd0si.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ddtqk8ramy5wd0zd0si.png" alt="NanoClaw - OpenClaw alternative"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NanoClaw is basically the same thing but runs completely isolated inside a Docker container. The whole idea is simple: keep the codebase small, and put the risky stuff (bash, file access, tools) inside an isolated container so it can only touch what you explicitly mount.&lt;/p&gt;

&lt;p&gt;That's pretty much the idea of NanoClaw.&lt;/p&gt;
&lt;h3&gt;
  
  
  What makes it different?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Container isolation by default:&lt;/strong&gt; runs in Apple Container (macOS) or Docker (macOS/Linux), with filesystem isolation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-chat sandboxing:&lt;/strong&gt; each group/chat can have its own memory and its own mounted filesystem, separated from others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built on Anthropic’s Agents SDK:&lt;/strong&gt; it’s basically designed to work nicely with Claude’s agent tooling and Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp + scheduled jobs:&lt;/strong&gt; message it from your phone, and set recurring tasks that ping you back.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Quick start
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/gavrielc/nanoclaw.git
&lt;span class="nb"&gt;cd &lt;/span&gt;nanoclaw
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then run &lt;code&gt;/setup&lt;/code&gt;. Claude Code handles everything: dependencies, authentication, container setup, and service configuration.&lt;/p&gt;

&lt;p&gt;Here's a quick demo: 👇&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/AQ5uiLyr8bQ"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;
&lt;h2&gt;
  
  
  4. &lt;a href="https://github.com/HKUDS/nanobot" rel="noopener noreferrer"&gt;nanobot&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Ultra lightweight AI assistant built with Python.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pidyqqtzljh9u1j5fx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pidyqqtzljh9u1j5fx3.png" alt="nanobot - OpenClaw alternative"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nanobot, as the name suggests, is quite small. The core agent is about ~4,000 lines of code, and the repo even publishes a live count you can verify with their script. That is the whole vibe: small enough that you can actually read it, trust it, and change it.&lt;/p&gt;
&lt;h3&gt;
  
  
  What makes it different?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core size metric:&lt;/strong&gt; ~4,000 LOC, with a “real-time” line count shown in the README (and a script to verify).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP support (fresh):&lt;/strong&gt; added 2026-02-14, so it can plug into MCP tool servers without you reinventing the plumbing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runs where you already are:&lt;/strong&gt; built-in “gateway” mode supports a bunch of chat surfaces like Telegram, Discord, WhatsApp, Slack, Email, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;nanobot-ai

nanobot onboard
nanobot agent          &lt;span class="c"&gt;# local interactive chat&lt;/span&gt;
nanobot gateway        &lt;span class="c"&gt;# run it as a chat bot (Telegram, Discord, WhatsApp, etc)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here's a quick architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmi9wen3bpya82ck9gyz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqmi9wen3bpya82ck9gyz.png" alt="nanobot architecture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's a video to give you an idea of how it works: 👇&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/18WGbR6GYn0"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;
&lt;h2&gt;
  
  
  5. &lt;a href="https://memu.bot/" rel="noopener noreferrer"&gt;memU Bot&lt;/a&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;ℹ️ Built for 24/7 proactive agents designed for long-running use.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kh9ebx6inxnrato08td.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9kh9ebx6inxnrato08td.png" alt="memU bot - OpenClaw alternative"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;memU Bot is built for people who want an agent that keeps running and becomes more useful over time, instead of resetting to zero every time you open a new chat.&lt;/p&gt;

&lt;p&gt;The site definitely looks like it was coded by a 12-year-old 😭, but don’t let that scare you off, because the product underneath is really good.&lt;/p&gt;

&lt;p&gt;Under the hood, it’s tied to &lt;strong&gt;memU&lt;/strong&gt;, NevaMind’s memory framework for long-running proactive agents, with a focus on reducing long-run context cost by caching insights.&lt;/p&gt;
&lt;h3&gt;
  
  
  What makes it different?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always-on + proactive:&lt;/strong&gt; it’s designed to sit in the background and capture intent (not just respond to prompts).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory system that scales:&lt;/strong&gt; memU treats memory like a file system (categories, memory items, cross-links), so the agent can fetch relevant fragments instead of shoving the whole history into every request.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Quick start
&lt;/h3&gt;

&lt;p&gt;It's a bit more involved than other options.&lt;/p&gt;

&lt;p&gt;If you just want the product (memU Bot):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="http://memu.bot/" rel="noopener noreferrer"&gt;memu.bot&lt;/a&gt;, enter your email, and get the download link they send you.&lt;/li&gt;
&lt;li&gt;Install it like a normal desktop app (they provide a macOS .dmg in the tutorial flow).&lt;/li&gt;
&lt;li&gt;Start it, connect the channel you want (Telegram, etc.), and let it run so it can build memory over time.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/NevaMind-AI/memU.git
&lt;span class="nb"&gt;cd &lt;/span&gt;memU

&lt;span class="c"&gt;# Requires Python 3.13+&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# set your key (OpenAI is the default in their quick tests)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key"&lt;/span&gt;

&lt;span class="c"&gt;# quick test using in-memory storage&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;tests
python test_inmemory.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Want persistent memory backed by Postgres + pgvector?&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; memu-postgres &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;memu &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5432:5432 &lt;span class="se"&gt;\&lt;/span&gt;
  pgvector/pgvector:pg16

&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_api_key"&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;tests
python test_postgres.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;They also provide a small runnable "proactive loop" example if you want to see the behavior without going through tests:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;examples/proactive
python proactive.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;There's also a &lt;a href="https://github.com/NevaMind-AI/memU/blob/main/README.md#option-1-cloud-version" rel="noopener noreferrer"&gt;Cloud version&lt;/a&gt; which you can try out as well.&lt;/p&gt;

&lt;p&gt;It might be worth checking this out: 👇&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/M9ShNSaP8b8"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;If you know of any other useful OpenClaw alternative tools that I haven't mentioned in this article, please share them in the comments section below. 👇🏻&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That concludes this article. Thank you so much for reading! 🫡&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1127015"&gt;
    &lt;a href="/shricodev" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1127015%2F1c5e48a2-f602-4e7d-8312-3c0322d155c6.jpg" alt="shricodev image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/shricodev"&gt;Shrijal Acharya&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/shricodev"&gt;Full Stack SDE • Open-Source Contributor • Collaborator @Oppia • Mail for collaboration&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
