<?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: Developer Harsh</title>
    <description>The latest articles on Forem by Developer Harsh (@developer_harsh).</description>
    <link>https://forem.com/developer_harsh</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%2Fuser%2Fprofile_image%2F2924015%2F5bfc3142-aa86-4ba7-b393-41368fe2dc5a.jpg</url>
      <title>Forem: Developer Harsh</title>
      <link>https://forem.com/developer_harsh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/developer_harsh"/>
    <language>en</language>
    <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>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>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>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>10 top Claude Code plugins to use in 2026</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 17 Feb 2026 10:06:44 +0000</pubDate>
      <link>https://forem.com/composiodev/10-top-claude-code-plugins-to-use-in-2026-4gn6</link>
      <guid>https://forem.com/composiodev/10-top-claude-code-plugins-to-use-in-2026-4gn6</guid>
      <description>&lt;p&gt;If you're building MVPs or production-grade apps with Claude Code, plugin’s is your secret weapon.&lt;/p&gt;

&lt;p&gt;Instead of Claude guessing based on its training data, plugins give it eyes and hands to interact with live documentation, real-time databases, and your entire DevOps stack.&lt;/p&gt;

&lt;p&gt;But with over 1,000 servers in the ecosystem, choosing the right ones is a hassle. Here are the top 10 MCP plugins you can plug into Claude Code to get work done right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;Awesome Claude Plugins *&lt;/em&gt;(ComposioHQ): Curated plugin registry + tool router that turns Claude into a workflow orchestrator across many services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Claude-Mem&lt;/strong&gt;: Adds long-term memory so Claude can carry context and preferences across sessions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Superpowers&lt;/strong&gt;: Structured lifecycle planning + skills framework for brainstorming, TDD, debugging, and code review.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local-Review&lt;/strong&gt;: Parallel local diff code reviews (multiple agents) to catch issues before you commit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plannotator:&lt;/strong&gt; Makes planning mode clearer with structured, annotated plans you can review and share.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ralph Wiggum Plugin&lt;/strong&gt;: Visual testing for apps (notably Swift) by driving the Xcode simulator to check how things look.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Shipyard&lt;/strong&gt;: Superpowers-style lifecycle plus IaC validation and security auditing for more “production” workflows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dev-Browser Plugin&lt;/strong&gt;: Lightweight, faster browsing/testing alternative to Playwright-style flows with lower context overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript &amp;amp; Rust LSP Plugins&lt;/strong&gt;: Runs real type checks via LSP to surface type/lint errors inside the Claude workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent-Peer-Review&lt;/strong&gt;: Let's have Claude and Codex critique each other’s work and escalate to web search tools when needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Top 10 Plugins for Claude Code
&lt;/h2&gt;

&lt;p&gt;Here are the top plugins that enhance your Claude Code experience as a user.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Awesome Claude Plugins
&lt;/h3&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%2Ftheu15dqkh9drd76n28i.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%2Ftheu15dqkh9drd76n28i.png" alt="compisio plugins" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome Claude Plugins by ComposioHQ is a curated registry and toolkit that extends Claude Code’s native capabilities.&lt;/p&gt;

&lt;p&gt;It provides a central hub for custom slash commands, specialized agents, automated hooks, and MCP (Model Context Protocol) servers.&lt;/p&gt;

&lt;p&gt;By leveraging the Composio Tool Router, it transforms Claude from a code-writer into a workflow orchestrator capable of interacting with hundreds of external services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clone and run Claude with any connect-apps plugin (for easy setup)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/composio/awesome-claude-plugins.git
cd awesome-claude-plugins
claude --plugin-dir ./connect-apps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the setup&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/connect-apps:setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will ask for an API key. Paste your API key when asked. (Get a free key at platform.composio.dev)&lt;/p&gt;

&lt;p&gt;If you are curious about the directory structure, you can check it out in the official repo.&lt;/p&gt;

&lt;p&gt;In case you are wondering, why should you use the repository for plugins, here are the key features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports both Python (FastMCP) and Node/TypeScript (MCP SDK) implementations.&lt;/li&gt;
&lt;li&gt;Provides deep research and planning methodology for agent-centric design.&lt;/li&gt;
&lt;li&gt;Emphasizes building for workflows, not just API endpoints.&lt;/li&gt;
&lt;li&gt;Optimizes for limited context windows.&lt;/li&gt;
&lt;li&gt;Includes actionable error message design patterns.&lt;/li&gt;
&lt;li&gt;Implements systematic tool development with proper validation (Pydantic/Zod schemas).&lt;/li&gt;
&lt;li&gt;Follows the MCP Protocol specification (2025-11-25 version).&lt;/li&gt;
&lt;li&gt;Includes best practices for tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint).&lt;/li&gt;
&lt;li&gt;Provides code quality review and refinement guidance.&lt;/li&gt;
&lt;li&gt;Powered by composio tool router&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a bridge between Claude and a proprietary or niche API using the latest MCP standards.&lt;/li&gt;
&lt;li&gt;Building projects requiring multi-step actions, such as Read a Jira ticket → Debug code → Open a PR → Notify Slack.&lt;/li&gt;
&lt;li&gt;Managing context for large codebases, where minimising token burn while still providing Claude with powerful external tools is important.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A Few Must Explore’s&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mcp-builder&lt;/strong&gt;: A comprehensive skill that guides you through designing and implementing high-quality, agent-optimised MCP servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;connect-apps&lt;/strong&gt;: Instantly links Claude to 500+ SaaS applications (GitHub, Slack, Gmail, Notion) to perform real-world actions directly from the CLI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ship&lt;/strong&gt;: A robust PR automation system that handles the entire pipeline, from linting and testing to review and production deployment, with one command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at: &lt;a href="https://github.com/ComposioHQ/awesome-claude-plugins" rel="noopener noreferrer"&gt;Awesome Claude Plugins for Claude Code | Composio HQ&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Claude Mem
&lt;/h2&gt;

&lt;p&gt;Claude-Mem helps Claude remember context across sessions, reducing the need to re-explain their codebase and preferences each time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Captures and compresses Claude’s actions and injects relevant context into future sessions.&lt;/li&gt;
&lt;li&gt;Uses SQLite and Chroma for hybrid search with vector embeddings.&lt;/li&gt;
&lt;li&gt;Supports privacy by allowing you to exclude specific information from storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing large codebases where Claude needs to maintain context across multiple sessions.&lt;/li&gt;
&lt;li&gt;Reducing the time spent on re-explaining project details.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more at :  [Calude-Mem | Github (&lt;a href="https://github.com/thedotmack/claude-mem" rel="noopener noreferrer"&gt;https://github.com/thedotmack/claude-mem&lt;/a&gt;)&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Superpowers
&lt;/h2&gt;

&lt;p&gt;Superpowers combine lifecycle management with a skill framework, offering a comprehensive solution for development workflows.&lt;/p&gt;

&lt;p&gt;Infact Claude learns brainstorming, subagent development with code review, debugging, TDD, and skill authoring through Superpowers itself&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrates with Get Stuff Done (GSD) structured lifecycle and phase-based planning.&lt;/li&gt;
&lt;li&gt;Provides composable skills and Test-Driven Development (TDD) discipline.&lt;/li&gt;
&lt;li&gt;Includes Infrastructure as Code (IaC), such as validation, security auditing, and code simplification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing complex development projects with detailed planning and execution phases.&lt;/li&gt;
&lt;li&gt;Ensuring code quality and security through automated checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn more at: &lt;a href="https://claude.com/plugins/superpowers" rel="noopener noreferrer"&gt;Superpowers – Claude Plugin | Anthropic&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Local-Review
&lt;/h2&gt;

&lt;p&gt;Local-Review allows Claude to perform code reviews on uncommitted local changes, running multiple agents in parallel to provide thorough feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runs 5 agents in parallel to conduct comprehensive code reviews.&lt;/li&gt;
&lt;li&gt;Rates issues and only flags those scored 80 or above.&lt;/li&gt;
&lt;li&gt;Works on local git diffs, making it useful for immediate feedback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conducting quick and thorough code reviews before committing changes.&lt;/li&gt;
&lt;li&gt;Identifying potential issues and edge cases in your code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at : &lt;a href="https://www.claudepluginhub.com/plugins/agent-3-7-local-review-plugins-local-review" rel="noopener noreferrer"&gt;Local Review&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: Since this plugin runs 5 agents in parallel, cost might go up, so prepare to loosen your pocket&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Plannotator
&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%2Fckd4ddlrtoixzueyczli.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%2Fckd4ddlrtoixzueyczli.png" alt="Planotator Plugin" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Plannotator enhances the planning mode in Claude Code by providing a structured way to manage and annotate plans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improves the planning mode with detailed annotations.&lt;/li&gt;
&lt;li&gt;Helps organise and manage complex project plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detailed project planning and management.&lt;/li&gt;
&lt;li&gt;Organising complex tasks and sub-tasks.&lt;/li&gt;
&lt;li&gt;A UI for reviewing, sharing, and approve plan, similar to Google’s Antigravity’s artefacts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at  &lt;a href="https://plannotator.ai/" rel="noopener noreferrer"&gt;Plannotator - Visual Plan Review for Claude Code&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Ralph Wiggum Plugin
&lt;/h2&gt;

&lt;p&gt;This one is quite famous, at least on the name front, as an insider joke in the software development community.&lt;/p&gt;

&lt;p&gt;Essentially, this plugin is designed for visual testing, especially useful for developing Swift apps.&lt;/p&gt;

&lt;p&gt;While standard testing (like the TDD we discussed) checks if the code "thinks" correctly, this plugin checks if the app "looks" correct.&lt;/p&gt;

&lt;p&gt;It uses the Xcode MCP to bridge the gap between Claude and your running simulator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conducts visual tests of the app using an Xcode MCP.&lt;/li&gt;
&lt;li&gt;Ensures that the app meets specific criteria and behaves as expected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developing applications where visual testing is crucial.&lt;/li&gt;
&lt;li&gt;Automating UI and functionality checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at: &lt;a href="https://claude.com/plugins/ralph-loop" rel="noopener noreferrer"&gt;Ralph Loop – Claude Plugin | Anthropic&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: It can be costly to use, as my friend shared , he wiped out all his quota while on 20$ plan in one single loop of Ralph Wingum.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Shipyard
&lt;/h2&gt;

&lt;p&gt;Shipyard combines lifecycle management from GSD with the Superpowers skill framework, adding support for infrastructure-as-code and security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports IaC validation for Terraform, Ansible, Docker, Kubernetes, and CloudFormation.&lt;/li&gt;
&lt;li&gt;Includes a dedicated auditor agent for security checks.&lt;/li&gt;
&lt;li&gt;Simplifies code by catching cross-task duplication and AI-generated bloat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managing full development lifecycles with a focus on IaC and security.&lt;/li&gt;
&lt;li&gt;Ensuring code quality and security in complex projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at: &lt;a href="https://shipyard.build/agents/claude-code/" rel="noopener noreferrer"&gt;Shipyard | Claude Code&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can think of shipyard as an extension of superpowers but for enterprise&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  8. Dev-Browser Plugin
&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%2Fp2p10ol8iihugkg95cj8.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%2Fp2p10ol8iihugkg95cj8.png" alt="Dev Browser Plugin" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Dev-Browser plugin is a faster alternative to the Playwright MCP, reducing context load per pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster than Playwright MCP.&lt;/li&gt;
&lt;li&gt;Reduces context load, improving performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web development for when quick, efficient browsing is needed.&lt;/li&gt;
&lt;li&gt;Reducing the computational load on Claude.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I use it for frontend testing &amp;amp; backend data validation.&lt;/p&gt;

&lt;p&gt;You can explore more at: &lt;a href="https://github.com/SawyerHood/dev-browser" rel="noopener noreferrer"&gt;Dev Browser | Claude&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Typescript &amp;amp; Rust LSP Plugins
&lt;/h2&gt;

&lt;p&gt;The plugins allow Claude to run proper type checks for TypeScript and Rust code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrates with Language Server Protocol (LSP) for type checking.&lt;/li&gt;
&lt;li&gt;Ensures code correctness and reduces errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Cases&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developing in Typescript or Rust, where type checking is essential.&lt;/li&gt;
&lt;li&gt;Improving code quality and reducing debugging time.&lt;/li&gt;
&lt;li&gt;My friend uses it to test for linting and type errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Explore more at:&lt;a href="https://claude.com/plugins/typescript-lsp" rel="noopener noreferrer"&gt;TypeScript LSP – Claude Plugin | Anthropic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A must have if developing apps in typescript / rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Agent-Peer-Review
&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%2Fl1wfw8rnm26ag8xcgxt5.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%2Fl1wfw8rnm26ag8xcgxt5.png" alt="Agent Peer Review Plugin" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This plugin provides peer reviews between Claude and Codex, allowing them to debate disagreements and escalate to external tools if needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enables direct communication between Claude and Codex for peer reviews.&lt;/p&gt;

&lt;p&gt;Supports escalation to Perplexity/WebSearch for additional context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conducting comprehensive code reviews with multiple AI perspectives.&lt;/li&gt;
&lt;li&gt;Reducing the manual effort of copying and pasting code reviews.&lt;/li&gt;
&lt;li&gt;Benchmarking coding models across councils of models (Codex &amp;amp; Claude)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I felt this one was a joke till I tried. But it really gets work done!&lt;/p&gt;

&lt;p&gt;I used it to validate Claude’s work using codex across varied perspectives on a research project code, and it helped me fix a critical bug that Claude missed during code generation.&lt;/p&gt;

&lt;p&gt;Explore more at: &lt;a href="https://github.com/jcputney/agent-peer-review" rel="noopener noreferrer"&gt;Agent Peer Review | Claude&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That concludes it, but it’s no use if you don’t follow these best practices for claude code!&lt;/p&gt;




&lt;h2&gt;
  
  
  Best Practices for Using Claude Code
&lt;/h2&gt;

&lt;p&gt;To get the most out of Claude Code, consider these best practices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Minimise the Provided Context&lt;/strong&gt;: Keep the context concise to improve performance. Start fresh conversations for new topics and use tools like git diff to minimize the context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve Problems Step by Step&lt;/strong&gt;: Break down large problems into smaller, manageable steps. This helps Claude handle complex tasks more effectively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Claude for Non-Coding Tasks&lt;/strong&gt;: Claude is excellent for understanding codebases, brainstorming, and architectural discussions. Use it to prepare thoroughly before jumping into coding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leverage Git and GitHub CLI&lt;/strong&gt;: Let Claude handle your Git and GitHub CLI tasks, such as committing, branching, pulling, and pushing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate Code Reviews&lt;/strong&gt;: Use plugins like Turingmind Claude Code Reviewer Skill to automate code reviews and catch subtle bugs and missed edge cases.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Subagents for Complex Tasks:&lt;/strong&gt; For multi-step plans, use subagents to execute different parts of the task.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Be Strategic About Token Usage&lt;/strong&gt;: Clear context after every user story and use the /compact command to manage token usage efficiently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design with Specificity&lt;/strong&gt;: Provide detailed design specifications and use design systems like Shadcn UI to ensure consistent and high-quality output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use External Tools for UX/UI:&lt;/strong&gt; Combine Claude Code with external design tools like Gemini or Uizard to generate UX/UI designs, then use Claude to implement them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Learning and Adaptation:&lt;/strong&gt; Stay up to date with the latest Claude Code features and practices. Regularly review and adjust your workflow to optimize performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Not all but, following even 1/3 of best practices can significantly improve your experience with Claude Code.&lt;br&gt;
But here is the final takeaway from the blog!&lt;/p&gt;




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

&lt;p&gt;Claude Code is a powerful tool that can significantly enhance your coding efficiency and quality.&lt;/p&gt;

&lt;p&gt;By integrating the right plugins and following these best practices, you can unlock its full potential and streamline your development workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What are MCP plugins in Claude Code, and why do they matter?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;MCP plugins (servers) let Claude Code interact with real systems like docs, repos, databases, browsers, and DevOps tools, so it can verify things and take actions instead of guessing.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Which plugins should I install first to get quick wins?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Start with a plugin hub/router (Awesome Claude Plugins), then add one for memory (Claude-Mem) and one for quality checks (Local-Review or TS/Rust LSP). After that, add planning/workflow (Superpowers or Shipyard) based on your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Are these plugins safe to use with private code and credentials?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;They can be, but treat them like any tool with access. Prefer least-privilege API keys, limit scopes, avoid storing secrets in prompts, and review what a plugin can read or write before enabling it.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How do I keep costs and token usage under control?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Keep context tight (use diffs, targeted files, and /compact), run tools only when needed, and be careful with multi-agent reviewers or visual testing loops since they can multiply usage fast.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>resources</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Use MCP in OpenAI Code (IDE, CLI, App, Cloud)</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 10 Feb 2026 08:59:12 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-use-mcp-in-openai-code-ide-cli-app-cloud-16c0</link>
      <guid>https://forem.com/composiodev/how-to-use-mcp-in-openai-code-ide-cli-app-cloud-16c0</guid>
      <description>&lt;h2&gt;
  
  
  The Rise of Codex
&lt;/h2&gt;

&lt;p&gt;OpenAI's Codex has taken AI coding by storm, powering IDE, CLI, and cloud agents that write out code, fix bugs, and handle PRs at lightning speed. &lt;/p&gt;

&lt;p&gt;Developers everywhere are buzzing about its game-changing potential for faster builds. Recently saw an X tweet claiming they will not go with Claude's code because Codex is better at planning first.&lt;/p&gt;

&lt;p&gt;But here's the catch with MCP integrations: Codex shines when pulling real-time context from external tools, yet wiring up each MCP server for GitHub, docs, or databases one by one is a tedious config nightmare that kills momentum.&lt;/p&gt;

&lt;p&gt;What if you could plug in one MCP server that instantly unlocks 500+ apps, auto-selecting the perfect tools and methods for any task?&lt;/p&gt;

&lt;p&gt;Enter Rube, the universal MCP hub. In this short blog, let's see how you can use it to supercharge your OpenAI Codex workflow across IDE, CLI, and the cloud.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to set up MCP for Codex
&lt;/h2&gt;

&lt;p&gt;The benefit of Codex is that it can run in all 3 modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GUI Mode&lt;/strong&gt;: You can uninstall the Codex extension in VS Code, Cursor, or Windsurf. It reads your workspace, edits code, and runs tasks right in your favourite IDE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI Mode&lt;/strong&gt;: Terminal fans can install Codex CLI via &lt;code&gt;npm install -g @openai/codex&lt;/code&gt;, then run &lt;code&gt;codex&lt;/code&gt; In their project for local agentic coding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Mode&lt;/strong&gt;: Power users can delegate heavy tasks to Codex Cloud from the IDE or GitHub (&lt;a class="mentioned-user" href="https://dev.to/codex"&gt;@codex&lt;/a&gt; tags), freeing them to focus while it handles builds remotely. This is a unique edge over rivals.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex App&lt;/strong&gt;: The new Codex app. A very beautiful UI that's very intuitive to work with.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But to use rube, all requires a bit of setup, here is how to do it for all modes!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Set up MCP in Codex GUI Mode
&lt;/h3&gt;

&lt;p&gt;I thought connecting remote MCP servers to the Codex extension was easy, but it's a major &lt;a href="https://github.com/openai/codex/issues/6465" rel="noopener noreferrer"&gt;issue&lt;/a&gt;, an open one right now on GitHub.&lt;br&gt;
So, here's the clean workaround I found to use MCP with extension:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://rube.app/" rel="noopener noreferrer"&gt;Rube&lt;/a&gt;, sign up/log in, or whatever MCP servers you want to use.&lt;/li&gt;
&lt;li&gt;Head to &lt;a href="https://rube.app/chat" rel="noopener noreferrer"&gt;Rube Chat&lt;/a&gt; → Use Rube → MCP URL → Generate Token. (You can use any other MCP URL)&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%2Fhesje2i251yy9edneweb.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%2Fhesje2i251yy9edneweb.png" alt="Rube MCP"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy the token&lt;/li&gt;
&lt;li&gt;Install the &lt;a href="https://marketplace.visualstudio.com/items?itemName=OpenAI.chatgpt" rel="noopener noreferrer"&gt;Codex extension&lt;/a&gt; for VS Code and log in.&lt;/li&gt;
&lt;li&gt;Then: ⚙️ → MCP Settings → + Add servers → &lt;strong&gt;Streamable&lt;/strong&gt; &lt;strong&gt;HTTP&lt;/strong&gt;:&lt;/li&gt;
&lt;li&gt;Put in the following details:

&lt;ul&gt;
&lt;li&gt;Name: rube&lt;/li&gt;
&lt;li&gt;URL: &lt;a href="https://rube.app/mcp" rel="noopener noreferrer"&gt;https://rube.app/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Headers:

&lt;ul&gt;
&lt;li&gt;Key: Authorisation&lt;/li&gt;
&lt;li&gt;Value: Bearer &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save → Refresh → Authenticate → Done!&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%2Fyr49h27k1wmfjmn72nss.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%2Fyr49h27k1wmfjmn72nss.png" alt="MCP Dashbaoard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To verify if mcp server is enabled or not, paste the following in the prompt box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do you have access to [mcp-server]? Tell me all the task it can perform.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it fetches the result with all tasks it can do or mcp details, you are all set.&lt;/p&gt;

&lt;p&gt;You can check out the &lt;a href="https://gist.github.com/DevloperHS/0bd80665579d80fccac163192c5b6448#file-config-toml" rel="noopener noreferrer"&gt;config.toml&lt;/a&gt; file for same, by going to ⚙️ → MCP Settings → Open config.toml file.&lt;/p&gt;

&lt;p&gt;Now let’s set up the same for CLI.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Set up MCP in Codex CLI Mode
&lt;/h3&gt;

&lt;p&gt;Terminal lovers, in the codex, we have 2 ways to setup mcp in the codex CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config file - &lt;code&gt;config.toml&lt;/code&gt; (manual, explicit)&lt;/li&gt;
&lt;li&gt;CLI commands (faster, recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, I find the &lt;strong&gt;config file&lt;/strong&gt; offers full control in a single file and feels native.&lt;/p&gt;

&lt;p&gt;Here is how to use the config file approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the codex CLI using: &lt;code&gt;npm i -g @openai/codex&lt;/code&gt;  (Make sure you have &lt;code&gt;npm&lt;/code&gt; install)&lt;/li&gt;
&lt;li&gt;Initialise a project root directory. I used &lt;code&gt;codex-test&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a folder named &lt;code&gt;codex&lt;/code&gt; using &lt;code&gt;mkdir&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inside it creates a new file called &lt;code&gt;config.toml&lt;/code&gt; and paste the following text from below and save it!&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[projects."/home/devloper_hs/codex-tests"]
trust_level = "untrusted"

[mcp_servers.rube]
enabled = true
url = "https://rube.app/mcp"

[mcp_servers.rube.http_headers]
Authorization = "Bearer &amp;lt;auth-token&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace the project path with your actual absolute path&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;auth-token&amp;gt;&lt;/code&gt; with the token you already generated earlier&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trust_level = "untrusted"&lt;/code&gt; is the safe default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But those tied to terminal commands you can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;codex&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for streamable-http based mcp servers*. &lt;strong&gt;Make sure to authenticate!&lt;/strong&gt;*&lt;/p&gt;

&lt;p&gt;or stdio  based mcp servers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;codex&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="n"&gt;VAR1&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;VALUE1&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="n"&gt;VAR2&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;VALUE2&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;codex&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;context7&lt;/span&gt; &lt;span class="p"&gt;--&lt;/span&gt; &lt;span class="n"&gt;npx&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;@upstash&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;context7&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next head to the root of the file and run &lt;code&gt;codex&lt;/code&gt;, login and run &lt;code&gt;/mcp&lt;/code&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%2Fhr506byozmw58xjzt2ib.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%2Fhr506byozmw58xjzt2ib.png" alt="/mcp results"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To ensure it uses the MCP server, you can use the following prompt validation flow:&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%2Flzwo07m1rzkq3i7cmpls.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%2Flzwo07m1rzkq3i7cmpls.png" alt="MCP Connected"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I liked the fact that instead of giving me rouge output, its actually gave me steps to validate. Btw I already validated the gmail earlier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now is the time to set up MCP for the codex using cloud mode.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Set up MCP in Codex Cloud Mode
&lt;/h3&gt;

&lt;p&gt;Codex allows delegating tasks to a cloud instance, letting developers focus on other tasks.&lt;/p&gt;

&lt;p&gt;Sadly, this has been long planned but not shipped. The blockers being: secure tool proxying, credential forwarding, deterministic replays and more.&lt;/p&gt;

&lt;p&gt;A smart approach is to use the MCP process locally, then delegate responses and the rest of the work to the cloud.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Set up MCP in the Codex App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Click on the Settings gear icon on the bottom left.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to MCP Servers. You’ll see some servers that you can authenticate and use.&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%2Frbcr96mtswofh0w0ov4k.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%2Frbcr96mtswofh0w0ov4k.png" alt="Codex App MCP Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or, add server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose STDIO or Streamable HTTP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add your MCP server&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%2F9qd0wcr5r333kysxhn67.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%2F9qd0wcr5r333kysxhn67.png" alt="MCP Server Connected"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And you’re done.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, with this, we are all set to look at a few use cases of Codex!&lt;/p&gt;




&lt;h2&gt;
  
  
  Use Cases of Codex + MCP
&lt;/h2&gt;

&lt;p&gt;Codex is mainly meant for coding, but with &lt;a href="https://www.notion.so/25df261a6dfe804791b6fe4a3709d774?pvs=21" rel="noopener noreferrer"&gt;Rube MCP&lt;/a&gt; it can handle a variety of tasks. Here are 3 use cases I like to use as a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Organizing Old Project Commits into an Existing Sheet for Refresher
&lt;/h3&gt;

&lt;p&gt;Integrations: &lt;a href="https://composio.dev/toolkits/googlesheet" rel="noopener noreferrer"&gt;Google Sheet&lt;/a&gt; + &lt;a href="https://composio.dev/toolkits/gitlab" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a new googlesheet and add last 10 code activity summary (PRs, commits, stale branches) from my [project] GitHub and local repository. Also give me the sheet link at the last.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;amp; here is the output:&lt;/p&gt;

&lt;p&gt;[pr_agent.mp4]

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


&lt;/p&gt;

&lt;p&gt;This gives me a rough idea of where I left off and start from there.  No more mundane checks.&lt;/p&gt;

&lt;p&gt;But the use cases don’t stop here.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Creating Changelogs / Project Report on the fly
&lt;/h3&gt;

&lt;p&gt;Integrations used: &lt;a href="https://composio.dev/toolkits/github" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://composio.dev/toolkits/googledoc" rel="noopener noreferrer"&gt;Google Doc&lt;/a&gt;s&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a new Google Doc and generate a clean changelog report for my [project] GitHub repository using the all merged commits in anice formatted way and give me doc link.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;amp; here is the output&lt;/p&gt;

&lt;p&gt;[commit_agent.mp4]

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


&lt;/p&gt;

&lt;p&gt;This allows me to turn my project changelogs into a well-formatted Google Doc and send them the pdf / Doc. They can use it to verify the progress, ask for further clarification or suggest some changes&lt;/p&gt;

&lt;p&gt;By far, I have shared productivity stuff; it's time for an actual development use case!&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Extracting Design Tokens from Figma File
&lt;/h3&gt;

&lt;p&gt;Integrations used: &lt;a href="https://composio.dev/toolkits/figma" rel="noopener noreferrer"&gt;Figma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one has been game changer for me.&lt;/p&gt;

&lt;p&gt;To be frank, I am not good with frontend, so I take inspiration form figma designs. However, manually converting the design to code was a headache.&lt;/p&gt;

&lt;p&gt;But now I fire up Codex and ask it to extract design tokens I can use to replicate the frontend in a similar style.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Analyze the Figma design file at https://www.figma.com/design/ZoE3NGZObwwNBr9Iyv8X9G/Shopping-Website -- Community -? node-id=2-
tokens), and generate a markdown file named design.md at root of project containing a professional design system reference.
Include token definitions, usage guidelines, naming conventions, and example mappings suitable for engineers to directly
implement in code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s the output&lt;/p&gt;

&lt;p&gt;[design_token_extraction_agent.mp4] 

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


&lt;/p&gt;

&lt;p&gt;Ofc, I make a few changes here and there before implementing, but this now codex + rube combo makes life so easier.&lt;/p&gt;

&lt;p&gt;And here is a bonus one for content creators!&lt;/p&gt;

&lt;h3&gt;
  
  
  Turning Codex into your Content Creator Devlogs in Medium Blogs Draft
&lt;/h3&gt;

&lt;p&gt;Integrations used: &lt;a href="https://composio.dev/toolkits/figma" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://composio.dev/toolkits/googledocs" rel="noopener noreferrer"&gt;Google Docs&lt;/a&gt;, &lt;a href="https://composio.dev/toolkits/notion" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Many developers love writing devlogs (summaries of what they did) while building a product. But with Codex + mcp, you can analyse each dev log on a day-by-day basis and create a blog that you can then share with the world. Similar to how big companies. &lt;/p&gt;

&lt;p&gt;Here is the prompt I used:&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 tasked with creating an SEO-optimized blog post from development logs for Medium publication.

**Requirements:**
1. Read the @devlog file content based on chronological order (earliest to latest based on days)
2. Transform technical devlogs into a narrative-driven blog post with personal storytelling
3. Use Rube MCP's googledocs tool to create and format the document
4. Follow this structure:
   - Engaging title with primary keyword
   - Compelling hook/introduction
   - Main body with 3-5 naturally flowing sections
   - Personal insights and lessons learned
   - Conclusion with takeaways
   - Call-to-action

**Writing Style:**
- First-person perspective ("I discovered...", "My journey with...")
- Story-driven narrative that connects technical milestones
- Natural transitions between sections (avoid forced segmentation)
- Balance technical detail with accessibility
- Include challenges, breakthroughs, and reflections

**SEO Optimization:**
- Include relevant keywords naturally in headers and content
- Use H2/H3 headings for structure
- Add meta description (150-160 characters)
- Include 3-5 tags for Medium
- Optimize readability (short paragraphs, varied sentence length)

**Formatting in Google Docs:**
- Bold for emphasis and subheadings
- Italics for technical terms or emphasis
- Bullet points for key takeaways
- Code blocks where appropriate
- Proper spacing between sections

Execute the task by:
1. Analyzing devlog files chronologically
2. Creating the narrative structure
3. Applying proper formatting
4. Writing the blog post with Rube MCP googledocs tool

Output the Google Docs URL when complete.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is the output it created: &lt;/p&gt;

&lt;p&gt;[content_creator_agent.mp4] 

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


&lt;/p&gt;

&lt;p&gt;By default, Codex doesn’t have access to Google Docs, but MCP can help with that. So, we let Codex handle the generation process, and rube handled the Google Docs. &lt;/p&gt;

&lt;p&gt;In short, this process allows anyone to turn their weekly builds into a full-fledged blogpost or content worth sharing.&lt;/p&gt;

&lt;p&gt;I hope you got an idea of what’s all possible.&lt;/p&gt;

&lt;p&gt;Now let’s look at the final lesson!&lt;/p&gt;




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

&lt;p&gt;Even with vibe coding pushing software development forward, most people still treat Codex/MCP like a magic box. That’s the actual problem.&lt;/p&gt;

&lt;p&gt;These tools don’t work magically. They need &lt;strong&gt;clear, structured prompts&lt;/strong&gt; to give good output. Most people don’t have that skill yet, so results fall apart.&lt;/p&gt;

&lt;p&gt;That’s where tools like Rube help - by enforcing structure and combining prompts with real tool support, instead of guesswork.&lt;/p&gt;

&lt;p&gt;Going forward, this becomes the new normal. Using these tools well won’t be optional.&lt;/p&gt;

&lt;p&gt;So, don’t waste time. Go to &lt;a href="http://rube.app" rel="noopener noreferrer"&gt;&lt;strong&gt;rube.app&lt;/strong&gt;&lt;/a&gt;, connect it with Codex, and start building or automating your work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>code</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to use Fix MCP issue in LangSmith Agent Builder to Build Specialized Agents</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 20 Jan 2026 10:19:43 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-use-fix-mcp-issue-in-langsmith-agent-builder-to-build-specialised-agents-2ggj</link>
      <guid>https://forem.com/composiodev/how-to-use-fix-mcp-issue-in-langsmith-agent-builder-to-build-specialised-agents-2ggj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;How to leverage the Model Context Protocol to give your LangChain agents production-grade tool access without manually piping toools&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;LangChain recently introduced &lt;a href="https://smith.langchain.com/" rel="noopener noreferrer"&gt;LangSmith Agent Builder&lt;/a&gt;, a no-code tool to build agents with natural languages and it's making quite the buzz.&lt;/p&gt;

&lt;p&gt;Instead of relying on the user to set up nodes and edges, it allows chat-based interactions, where the user just needs to define the goal, and the system generates the prompt, connects tools, and sets up triggers automatically.&lt;/p&gt;

&lt;p&gt;It built on top of &lt;a href="https://docs.langchain.com/oss/python/deepagents/overview" rel="noopener noreferrer"&gt;LangChain’s deep agent’s&lt;/a&gt; framework and supports planning, persistent memory, and multi-step tasks for complex workflow.&lt;/p&gt;

&lt;p&gt;However, when it comes to tool’s I felt it pretty limited, even connecting mcp was not straightforward, I had to struggle a bit to use remote MCPs.&lt;/p&gt;

&lt;p&gt;So, I did a manual digging and found the issues to both problems, and this blog covers the fix along with few use cases.&lt;/p&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;




&lt;h3&gt;
  
  
  TL; DR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LangSmith&lt;/strong&gt; Agent Builder lets you build AI agents through chat instead of wrestling with nodes and edges, but the MCP connection is secretly broken.&lt;/li&gt;
&lt;li&gt;Rube MCP unlocks 900+ tools instantly-Gmail, Calendar, LinkedIn, Exa-without auth headaches or tool selection chaos once you apply the manual fix.&lt;/li&gt;
&lt;li&gt;Email triage becomes autopilot when agents fetch unread Gmail, categorize by urgency, and send consolidated summaries without you lifting a finger.&lt;/li&gt;
&lt;li&gt;Calendar briefings turn intelligent when agents pull today's schedule, research external contacts via LinkedIn, and email you a personalized day-ahead report.&lt;/li&gt;
&lt;li&gt;LinkedIn candidate sourcing gets surgical precision as agents calibrate with 5 samples, refine criteria iteratively, then deliver 30 qualified profiles matching your exact requirements.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Set Up MCP Server in LangSmith Agent Builder
&lt;/h2&gt;

&lt;p&gt;For demonstration, we will go with hosted &lt;a href="https://rube.app/" rel="noopener noreferrer"&gt;Rube MCP&lt;/a&gt; server as it allows me to access 900+ tools without worrying about auth, tool selection, query management and tool calling orchestration. &lt;/p&gt;

&lt;p&gt;Here is what to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Head over to &lt;a href="https://rube.app/chat" rel="noopener noreferrer"&gt;Rube&lt;/a&gt; &amp;amp; Login / Create Account&lt;/li&gt;
&lt;li&gt;In left side panel select Use Rube → MCP URL → Copy it!&lt;/li&gt;
&lt;li&gt;Now head to LangSmith agent builder and Login / Create Account (important that you select no-code experience)&lt;/li&gt;
&lt;li&gt;Within LangSmith Agent Builder, click ⚙️ Settings → MCP Servers → Add MCP Servers&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the new modal put&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: rube,&lt;/li&gt;
&lt;li&gt;URL: &lt;a href="https://mcp.notion.com/mcp" rel="noopener noreferrer"&gt;https://mcp.notion.com/mcp&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;Select OAuth 2.1 &amp;amp; hit save.&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%2Fm26h6wvoqd1z8qrg4498.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%2Fm26h6wvoqd1z8qrg4498.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;After few seconds, a pop up will appear asking to verify, hit verify and you need to re-login to rube / the tool.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;However, it’s not over yet, you can’t use the tool yet!&lt;/p&gt;

&lt;p&gt;If you go now to agent builder workspace, select &lt;em&gt;Create manually instead,&lt;/em&gt; you will only see default tools (probably a bug), so to fix it, you need to click on MCP → fill in same details and revalidate. &lt;/p&gt;

&lt;p&gt;After few seconds you will see tools listed under the mcp server name you added, in our case it’s RUBE. &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%2Fikg5jcnnyqisfx74vbrv.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%2Fikg5jcnnyqisfx74vbrv.png" alt="Rube MCP Server Showing Tools"&gt;&lt;/a&gt;&lt;br&gt;
Rube MCP Server Showing Tools&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: Though I used rube mcp server for demo, you can use any other using same technique, till they don’t fix the issue!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let’s see how mcp server work together with LangSmith Agent Builder to handle daily odd jobs.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Use MCP server with LangSmith Agent Builder
&lt;/h2&gt;

&lt;p&gt;The process at Agent Builder is slightly different than rest of the tool you might have used!&lt;/p&gt;

&lt;p&gt;It actually a single &lt;a href="http://agent.md" rel="noopener noreferrer"&gt;agent.md&lt;/a&gt; file behind the scenes, with addition of folders like tools and skills as needed. &lt;/p&gt;

&lt;p&gt;When you create agent, these file changes in real time based on instructions and can later be reviewed.&lt;/p&gt;

&lt;p&gt;However, the above complexity is hidden behind a chat interface that allow user to prompt what they want to build, and the system take care of the rest. &lt;/p&gt;

&lt;p&gt;So, let’s use it for ease of understanding, by building 3 agents (easy, medium, complex).&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Email Triage Agent
&lt;/h3&gt;

&lt;p&gt;The 1st agent will be a simple one, use the agent to fetch all the emails and triage them into Important, General &amp;amp; Rubbish.&lt;/p&gt;

&lt;p&gt;Put in the following prompt to in the chat window &amp;amp; hit enter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a agent that uses Rube MCP to fetch only unread emails from Gmail. For each email, analyze the sender, subject, and content, then triage into exactly three labels: Important, General, Ignore based on urgency, relevance, and action required. After processing all unread emails, return a single consolidated summary with bullet points grouped by label, including sender, subject, and a one-line intent per email. Do not modify, reply, or archive emails. Output the summary only after the task fully completes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the agent builder will ask you few clarifying questions:&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%2Fxo3g6qofprf78vme9vui.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%2Fxo3g6qofprf78vme9vui.png" alt="image.png"&gt;&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%2F1el598s54oncktyc4kwf.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%2F1el598s54oncktyc4kwf.png" alt="image.png"&gt;&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%2Fz7pz2wl9vwg78i4dxu1y.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%2Fz7pz2wl9vwg78i4dxu1y.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you answer these, like I have done, it will combine metadata, toolbox, instructions and generate an agent overview. &lt;/p&gt;

&lt;p&gt;Hit create and your agent is created just like that!&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%2Ffykpz1adxer3lezk5tyk.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%2Ffykpz1adxer3lezk5tyk.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test the agent, in the left chat window enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Triage my unread Gmail emails using and email me the summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;As can be seen, it calls the gmail tool via rube mcp we added and did the task for us!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: To keep things simple, I have kept the text in markdown (apparently no rendering support in Gmail). Feel free to optimize it further.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Next up let’s spin up an agent that fetches the calendar and other tools, generates a daily briefer and send it to gmail. &lt;/p&gt;

&lt;p&gt;Enter the following prompt in the chat window:&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 a daily calendar assistant. Each morning, get today’s date (dd-mm-yyyy), fetch all events for the day, sort them by time and importance, and identify busy periods, gaps, and back-to-back meetings. Briefly research external meetings if needed using tavily_linkedin_search accessed via rube mcp. Send a concise email summary of the day via Gmail.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Ensure you add the TAVILY_API_KEY &amp;amp; GEMINI_API_KEY by selecting ⚙️ at top as well, for it work fine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now to test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;send me 21/01/2016 briefing please
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;As can be seen, it calls the rube calendar &amp;amp; Gmail tool via rube mcp we added and sent me a email. It seems I have a scheduled travel, so it wrote a customized message for me. (ignore markdowns)&lt;/p&gt;




&lt;h3&gt;
  
  
  3. LinkedIn Candidate Sourcing Agent
&lt;/h3&gt;

&lt;p&gt;As for last agent, let’s make an agent that can filter out / source candidate from LinkedIn based on provided criteria. &lt;/p&gt;

&lt;p&gt;We will use rube mcp to call exa-tool and pass in the inputs and let it handle the rest. &lt;/p&gt;

&lt;p&gt;Paste the following prompt in chat window:&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 an expert LinkedIn candidate sourcing agent. When a user requests candidates, first gather role requirements (skills, seniority, location, constraints) and ask clarifying questions if needed. Begin with a calibration search of exactly 5 candidates using the Exa search protocol via Rube MCP, returning real LinkedIn profiles only (name, role, company, qualifications, LinkedIn URL). 

Never fabricate data. Ask for feedback and refine criteria iteratively until the user confirms alignment. Only after explicit confirmation, run a full-scale Exa search via Rube MCP (default 30 candidates), list candidates in chat. Exclude candidates already at the hiring company. Clearly state limitations if results are sparse. Prioritize precision, transparency, and iteration over volume.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Ensure you add EXA_API_KEY and GEMINI_API_KEY in ⚙️ at top. Also select Gemini 3.0 Model from Model Selector&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s test it out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source LinkedIn candidates for a Senior Backend Engineer. Focus on Python, Django, AWS, 5–8 years' experience, based in India.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Results:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;Amazing it called the exa tool via rube mcp, we added earlier and showed potential candidate in chat based on criteria's.&lt;/p&gt;

&lt;p&gt;This is just a glimpse of what is automations are possible with LangSmith Agent Builder &amp;amp; and rube mcp.  Feel free to expand these base examples as per your liking and get rid of those boring mundane task.&lt;/p&gt;

&lt;p&gt;Time to look at the final take!&lt;/p&gt;




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

&lt;p&gt;LangSmith Agent Builder paired with Rube MCP turns complex agent workflows into effortless no-code magic, handling everything from email triage to candidate sourcing.&lt;/p&gt;

&lt;p&gt;Though the toolset starts limited, a quick MCP server like rube unlocks 900+ tools, letting you automate daily mundane task with chat-based prompts.&lt;/p&gt;

&lt;p&gt;So, connect Rube to LangSmith, drop in a goal like "build me a reseach agent…” add API keys, connect to tools/ mcp’s and watch it build, run, and deliver - while you reclaim your time for high-impact work.&lt;/p&gt;

&lt;p&gt;Happy Automating.&lt;/p&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1: How do I fix LangSmith Agent Builder not showing MCP tools after connection?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Click "Create manually" in Agent Builder workspace, select MCP, re-enter server details and revalidate -tools will appear under your MCP server name after verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2: What is Rube MCP and why use it with LangSmith Agent Builder?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Rube MCP is a hosted server providing 900+ pre-authenticated tools (Gmail, Calendar, LinkedIn, Exa) that integrate with LangSmith through OAuth 2.1 without manual auth configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3: Can LangSmith Agent Builder create agents without coding experience?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Yes, LangSmith uses chat-based prompts to auto-generate system prompts, connect tools, and build agents—no node setup required, built on LangChain's Deep Agents framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4: What agents can I build with LangSmith and Rube MCP integration?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: You can build email triage agents, calendar briefing bots, LinkedIn candidate sourcing tools, and any automation combining 900+ tools through natural language instructions.&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>automation</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to use OpenCode: A Practical Guide + Builds</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 13 Jan 2026 19:04:51 +0000</pubDate>
      <link>https://forem.com/composiodev/how-to-use-opencode-a-practical-guide-2egp</link>
      <guid>https://forem.com/composiodev/how-to-use-opencode-a-practical-guide-2egp</guid>
      <description>&lt;p&gt;OpenCode has recently gained significant popularity in the open-source space. It’s an alternative to Claude Code.&lt;/p&gt;

&lt;p&gt;But what if I told you could 100x your Opencode experience with just one MCP?  Yes, with &lt;a href="https://rube.app" rel="noopener noreferrer"&gt;Rube&lt;/a&gt;, that’s totally possible. But wait, what is possible?&lt;/p&gt;

&lt;p&gt;After building a thousand managed MCP integrations and speaking with countless users, we found that while MCP is a force multiplier, it still has physical limitations. Adding even a single GitHub server will take 20k tokens from your LLM's context window; adding Jira/Linear, Supabase, etc., will essentially choke the models. There is nothing novel in it; most industry folks are already aware of this. &lt;/p&gt;

&lt;p&gt;So, how do we solve this? &lt;/p&gt;

&lt;p&gt;By exposing a few meta tools (Search, Planner, Bash, Remote Workbench, etc). When the agent searches for tools, the search tool fetches only relevant tools from Composio-managed apps, ensuring the LLM's context space remains clean. &lt;/p&gt;

&lt;p&gt;For complex issues, it uses a remote workbench or a bash script to chain multiple tools together, and instead of dumping the large artefacts directly into the context, Rube stores them in a file system and fetches the results as needed. &lt;/p&gt;

&lt;p&gt;There’s more to it: OAuth handling, healing loop when tool execution fails, and more.&lt;/p&gt;

&lt;p&gt;Here in this blog post, I’ll walk you through how to set up Rube MCP with &lt;strong&gt;Opencode&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL DR;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rube MCP plugs into &lt;strong&gt;OpenCode&lt;/strong&gt; once and instantly unlocks hundreds of tools without the annoying manual MCP wiring.&lt;/li&gt;
&lt;li&gt;Automate code reviews and send off clean summaries straight to Gmail or Slack using Rube’s mail tools.&lt;/li&gt;
&lt;li&gt;Backend setup becomes trivial when Rube creates and seeds Supabase databases with text instructions and LLM commands.&lt;/li&gt;
&lt;li&gt;Turn project insights into polished X threads and auto-save them into Notion with a single prompt.&lt;/li&gt;
&lt;li&gt;OpenCode + Rube turns repetitive dev work into background noise so you can actually focus on building.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install OpenCode
&lt;/h2&gt;

&lt;p&gt;Let’s start with installing OpenCode.&lt;/p&gt;

&lt;p&gt;Head to the terminal and install it using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; opencode-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or use for the latest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; opencode-ai@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once done, verify it by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opencode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will open the TUI like this:&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%2Fo8mij03prc3lyl7k3mg3.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%2Fo8mij03prc3lyl7k3mg3.jpg" alt="OpenCode"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let’s connect it with Rube MCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect OpenCode with Rube MCP
&lt;/h2&gt;

&lt;p&gt;Connecting rube mcp with OpenCode is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://rube.app/" rel="noopener noreferrer"&gt;the Rube MCP&lt;/a&gt; site.&lt;/li&gt;
&lt;li&gt;Signup / Login&lt;/li&gt;
&lt;li&gt;Head to Add Rube → MCP URL → Generate Token and copy it.&lt;/li&gt;
&lt;li&gt;Create a new folder &lt;code&gt;open-code&lt;/code&gt; and open it.&lt;/li&gt;
&lt;li&gt;Inside, create a new file called &lt;code&gt;opencode.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Open it with File Explorer, nano/vim, and paste the following code.

&lt;ul&gt;
&lt;li&gt;Replace the &lt;code&gt;&amp;lt;api-token&amp;gt;&lt;/code&gt; with copied token and save it:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$schema&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;: &lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;,
  &lt;span class="s2"&gt;"mcp"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"rube_mcp"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"type"&lt;/span&gt;: &lt;span class="s2"&gt;"remote"&lt;/span&gt;,
      &lt;span class="s2"&gt;"url"&lt;/span&gt;: &lt;span class="s2"&gt;"https://rube.app/mcp"&lt;/span&gt;,
      &lt;span class="s2"&gt;"enabled"&lt;/span&gt;: &lt;span class="nb"&gt;true&lt;/span&gt;,
      &lt;span class="s2"&gt;"headers"&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"Authorization"&lt;/span&gt;: &lt;span class="s2"&gt;"Bearer &amp;lt;api-token&amp;gt;"&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open the OpenCode again and type &lt;code&gt;/mcp&lt;/code&gt; and it will show:&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%2Ffqa5w636lmfa11htzygk.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%2Ffqa5w636lmfa11htzygk.png" alt="image.png"&gt;&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%2Fjtonyhc9ldpdmpwjeeli.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%2Fjtonyhc9ldpdmpwjeeli.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can even verify this using OpenCode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Do you have access to Rube MCP?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get an answer like this, it means we are all set:&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%2Fstruf9h4zzdjz4n5vgpx.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%2Fstruf9h4zzdjz4n5vgpx.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: if you are new to MCP, don't change anything. If new to rube, for first time it ask for OAuth for each tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's see a few use cases of Rube in OpenCode.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Using OpenCode to automate Code Review &amp;amp; Update
&lt;/h2&gt;

&lt;p&gt;For the 1st task, we will ask OpenCode to find bugs across all files in a code repository, prepare a report, and send it to &lt;a href="https://rube.app/apps" rel="noopener noreferrer"&gt;Gmail&lt;/a&gt;. (can use &lt;a href="https://rube.app/apps" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; as well)&lt;/p&gt;

&lt;p&gt;Paste the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Act as an autonomous code auditor. Given access to a &lt;span class="nb"&gt;source &lt;/span&gt;code @ repository, recursively scan all files, detect bugs, vulnerabilities, logical errors, performance issues, and bad practices, classify them by severity, suggest concrete fixes, and generate a structured report &lt;span class="o"&gt;(&lt;/span&gt;summary, critical issues, file-wise findings, recommendations&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Use Rube MCP to handle the Gmail task and send the full report to devloper.hs2015@gmail.com. At the end, output a concise execution summary of all tasks completed. Prioritize real execution over explanation&lt;span class="p"&gt;;&lt;/span&gt; keep results actionable and production-ready.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In simple terms, the prompt asks the LLM to review the codebase, identify bugs, generate a summary, and email it to the user. The output should include a summary and a link to email. And all this should be done using rube’s Gmail tool. &lt;/p&gt;

&lt;p&gt;Yup, we don't have Gmail support in Antigravity, but rube helps here!&lt;/p&gt;

&lt;p&gt;And here’s the Output it generated:&lt;br&gt;


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


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: you may need to login to Gmail, if using first time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For simplicity, the report is kept short. Feel free to expand it using a format you prefer. &lt;/p&gt;

&lt;p&gt;Now let’s look at the 2nd use case!&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Using Rube MCP to handle Supabase Database for Apps
&lt;/h2&gt;

&lt;p&gt;For the next task, let’s ask OpenCode to handle the database creation via Rube MCP for a vehicle parking management app. &lt;/p&gt;

&lt;p&gt;Paste the following prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Build a minimal Parking Management System using Python, Supabase, HTML, and CSS with a Google Material Minimal aesthetic.

Project Setup
Create a new folder named &lt;span class="sb"&gt;`&lt;/span&gt;vms&lt;span class="sb"&gt;`&lt;/span&gt; and build the entire application inside it.
Create a &lt;span class="sb"&gt;`&lt;/span&gt;.venv&lt;span class="sb"&gt;`&lt;/span&gt; using &lt;span class="sb"&gt;`&lt;/span&gt;python3&lt;span class="sb"&gt;`&lt;/span&gt; and activate it before installing dependencies.
Use Supabase project ID: &lt;span class="sb"&gt;`&lt;/span&gt;&amp;lt;supabase-project-id&amp;gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

Phase 1: Database Setup &lt;span class="o"&gt;(&lt;/span&gt;via rube_mcp&lt;span class="o"&gt;)&lt;/span&gt;
Use rube_mcp to create database &lt;span class="sb"&gt;`&lt;/span&gt;parking-system&lt;span class="sb"&gt;`&lt;/span&gt; and models:
User&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;, name, email, created_at&lt;span class="o"&gt;)&lt;/span&gt;
Admin&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; → User.id, role, created_at&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;predefined]
ParkingLot&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;, name, location, total_spots&lt;span class="o"&gt;)&lt;/span&gt;
ParkingSpot&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;, lot_id → ParkingLot.id, spot_number, is_available&lt;span class="o"&gt;)&lt;/span&gt;
Reservation&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;, user_id → User.id, spot_id → ParkingSpot.id, start_time, end_time, status&lt;span class="o"&gt;)&lt;/span&gt;
Establish all relationships and seed: 1 Admin, 3 ParkingLots, 10–15 Spots per lot, 5–10 Users, 8–12 Reservations.

Constraints
All Supabase operations via rube_mcp, production-ready code, &lt;span class="nb"&gt;env &lt;/span&gt;vars &lt;span class="k"&gt;for &lt;/span&gt;secrets, clean error handling.

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In summary:&lt;/strong&gt; prompt the LLM to create a parking system model and define the relationship, and then pull in mock data defined in Supabase’s &lt;code&gt;student-db&lt;/code&gt; using crud api’s. &lt;/p&gt;

&lt;p&gt;Yup, we don't have Supabase support in OpenCode, but rube helps here!&lt;/p&gt;

&lt;p&gt;Here is the output:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;Notice how OpenCode defined the task, and worked on it incrementally, while OpenCode + rube mcp handled the heavy lifting&lt;/p&gt;

&lt;p&gt;Now let’s look at the final individual task, which we will do with OpenCode + Rube&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Using Rube MCP to generate a Build Log-based Social Media Post for X
&lt;/h2&gt;

&lt;p&gt;For the final task, we will ask OpenCode to draft us an X thread by analysing the entire project (handled by OpenCode) and save it to Notion (handled by rube mcp)&lt;br&gt;
Here is the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Analyze the entire @vehicle-parking-app project to identify its key problems, milestones, and achievements. Then, write a 5-tweet engaging X&lt;span class="o"&gt;(&lt;/span&gt;Twitter&lt;span class="o"&gt;)&lt;/span&gt;thread using a problem–solution narrative. The first tweet should hook readers, and the last should include a call-to-action. Keep each tweet under 250 characters, separated with &lt;span class="s2"&gt;"1/"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Use only bold or italic formatting &lt;span class="o"&gt;(&lt;/span&gt;no headings or code&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; Save the final formatted thread to the Notion page at https://www.notion.so/appdev1/Project-Devlogs-2e3b43216e448044941ec4ea71ca30cc. Use rube_mcp &lt;span class="k"&gt;for &lt;/span&gt;notion. 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In essence, the prompt asks OpenCode to analyse the project, find its key problems, milestones and achievements, use them to generate an engaging X thread based on given instructions and save it to the given Notion sheet.&lt;br&gt;
How it worked out for me:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;The OpenCode didn’t just create the task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It launched its subagents to focus on analysing the project&lt;/li&gt;
&lt;li&gt;while it performs the notion page retrieval,&lt;/li&gt;
&lt;li&gt;Then use the results of the subagent to generate the thread and&lt;/li&gt;
&lt;li&gt;Add it into given Notion page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretty handy, isn’t it?&lt;/p&gt;

&lt;p&gt;But so far, we have looked at individual use cases. OpenCode + rube combination can do more. Let’s give it a final challenge!&lt;/p&gt;




&lt;h2&gt;
  
  
  Capstone Task
&lt;/h2&gt;

&lt;p&gt;For the final task, let’s ask rube to create an image tools webapp that has 3 -4 functionalities, similar to &lt;a href="http://pinetools.com" rel="noopener noreferrer"&gt;pinetools.com&lt;/a&gt;, but in Python, Flask, core web dev frameworks and most heavy lifting done by rube integrations for AI tools. &lt;/p&gt;

&lt;p&gt;Here goes the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Build a simple MVP-level image creation web app as a new project named image-tools. 

Inside the project, first create and activate a Python 3 virtual environment &lt;span class="o"&gt;(&lt;/span&gt;venv&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="k"&gt;then &lt;/span&gt;build the full application. 

Use Python &lt;span class="o"&gt;(&lt;/span&gt;Flask&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;the backend, SQLAlchemy &lt;span class="k"&gt;for &lt;/span&gt;the &lt;span class="nb"&gt;local &lt;/span&gt;database, and HTML, CSS, and vanilla JavaScript &lt;span class="k"&gt;for &lt;/span&gt;the frontend. 

The UI/UX should follow a Google-inspired minimalist design — clean, centered, and modern. 

The app will have four AI-powered tools: Post Complement Image Creation, Theme Change, Background Removal, and Prompt-Based Image Generation. 

All image creation features should use Google Gemini API through Rube MCP &lt;span class="o"&gt;(&lt;/span&gt;gemini&lt;span class="o"&gt;)&lt;/span&gt; integration, where clicking a tool’s button triggers Rube MCP &lt;span class="k"&gt;in &lt;/span&gt;the backend to process the request and &lt;span class="k"&gt;return &lt;/span&gt;results. 

Flask handles routing and data flow, &lt;span class="k"&gt;while &lt;/span&gt;Rube manages all AI automation &lt;span class="k"&gt;for &lt;/span&gt;scalable, real-time image generation.

Follow the best security practices.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a nutshell, the prompt asks OpenCode to build an image editing tool that can use rube mcp to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate complement image to the provided post&lt;/li&gt;
&lt;li&gt;Change the theme of a given image (defaults)&lt;/li&gt;
&lt;li&gt;Remove the background of the provided image&lt;/li&gt;
&lt;li&gt;Generate an image based on a prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;while keeping the UI*&lt;em&gt;-UX&lt;/em&gt;* minimal and simple (google inspired)&lt;/p&gt;

&lt;p&gt;Here is the output:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;p&gt;Not only did OpenCode make the website one-shot with the power of Opus 4.5, but it also handled the DB (SQLite), multiple tool integrations, state handling, Ruber MCP routing, and UI/UX. &lt;/p&gt;

&lt;p&gt;This concludes our final build. Here are a few of my final thoughts on OpenCode + rube integrations.&lt;/p&gt;




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

&lt;p&gt;With OpenCode and Rube, the repetitive task became child’s play, and the best part is that this same workflow can be incorporated into various domains.&lt;/p&gt;

&lt;p&gt;Though OpenCode has been developed for the last 15 years, it packs some serious punch and with Rube MCP as a partner, the only limit is your imagination.&lt;/p&gt;

&lt;p&gt;So, head to Rube MCP, connect it to OpenCode, pull up some PRD doc, give it to Claude opus 4.5 / Claude sonnet 3.5 / Gemini3 models with a kickass prompt, and let the tool do its thing while you focus on software/automation architecting part. &lt;/p&gt;

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




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1. How do I integrate Rube MCP into OpenCode?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Generate a token from the Rube dashboard and paste the provided code directly into your &lt;code&gt;opencode.json&lt;/code&gt; config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2. How do I verify that Rube is successfully connected to OpenCode?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; In OpenCode check the bottom or use &lt;code&gt;/mcp&lt;/code&gt; command editor, in the popup, and confirm that the Rube tool appears in your active list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3&lt;/strong&gt;. &lt;strong&gt;Do I need to configure credentials for all 500+ tools manually?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Answer: No, you configure Rube once, and it dynamically handles connections, requiring only a one-time OAuth login the first time you use a specific tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4. Can Rube handle tasks for platforms not natively supported by Antigravity?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Absolutely; Rube acts as a bridge to fetch data and perform actions on external platforms like Figma, Supabase, and Gmail that the native IDE doesn't support yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q5&lt;/strong&gt;. &lt;strong&gt;How can I optimize the code generation quality for complex tasks like Figma conversions?&lt;/strong&gt; &lt;strong&gt;Answer:&lt;/strong&gt; Ensure you provide rich context, such as clearly naming Figma layers and color styles, so the model understands the specific structural requirements.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>cli</category>
      <category>mcp</category>
      <category>agents</category>
    </item>
    <item>
      <title>Function Calling With Google Gemini 3 - Google ADK &amp; Google Genai</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Mon, 29 Dec 2025 10:01:19 +0000</pubDate>
      <link>https://forem.com/composiodev/function-calling-with-google-gemini-3-google-adk-google-genai-55l5</link>
      <guid>https://forem.com/composiodev/function-calling-with-google-gemini-3-google-adk-google-genai-55l5</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;What is function calling in LLMs?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Large Language Models cannot access external systems such as APIs, databases, or SaaS apps independently; function calling is the pattern that enables them to do so safely. &lt;/p&gt;

&lt;p&gt;Instead of returning only natural language, the model can decide to “call” a function by emitting a structured description of which tool to use and which parameters to pass.&lt;/p&gt;

&lt;p&gt;You expose your internal or third‑party APIs to the model as functions, and the LLM chooses when and how to use them for tasks like sending emails, updating Sheets, scheduling events, or fetching live data such as weather and stock prices.&lt;/p&gt;

&lt;p&gt;Irony is that, despite the name, the LLM does not execute code itself; it returns a structured &lt;strong&gt;&lt;code&gt;functionCall&lt;/code&gt;&lt;/strong&gt; An object that your application uses to trigger real API calls and then feed results back to the model.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function calling enables LLMs to interact with external systems:&lt;/strong&gt; Instead of returning only natural language, models emit structured &lt;code&gt;functionCall&lt;/code&gt; objects that your app uses to trigger real API calls, then feed results back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini's function-calling loop is straightforward:&lt;/strong&gt; Declare tool schemas → Gemini returns &lt;code&gt;functionCall&lt;/code&gt; objects → your app executes them → send results back → Gemini synthesizes a final answer. This simple pattern powers all agentic workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native &lt;code&gt;google-genai&lt;/code&gt; SDK requires manual work:&lt;/strong&gt; You must write tool definitions, handle authentication, execute functions, and orchestrate the conversation loop yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composio abstracts the complexity:&lt;/strong&gt; Provides 900+ pre-built integrations so you don't have to write tool schemas or handle auth for each API manually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool Router MCP as a unified interface:&lt;/strong&gt; Handles search, planning, authentication, and execution across thousands of Composio tools in one place—less thinking, more building.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pair with Google ADK for production agents:&lt;/strong&gt; ADK provides primitives for tools, routing, sessions, and web UIs. Combined with Composio's Tool Router, you get full-blown multi-agent applications without integration hell.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;How does Gemini function calling work?&lt;/strong&gt;
&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%2F2gwxcpfapr0j5nehye7x.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%2F2gwxcpfapr0j5nehye7x.png" alt="Function Calling"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemini’s function-calling API follows a multi-step loop with fixed terminology and data structures.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You declare tools as functions:

&lt;ul&gt;
&lt;li&gt;One defines tools with one or more function declarations (schemas), each with a name, description, and parameters, using an &lt;code&gt;OpenAPI&lt;/code&gt;‑like JSON structure.&lt;/li&gt;
&lt;li&gt;These declarations tell Gemini which external capabilities are available and how to call them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;User sends a request with tools:

&lt;ul&gt;
&lt;li&gt;The request includes the user’s prompt and the tools configuration, passed typically via &lt;code&gt;GenerateContentConfig&lt;/code&gt; in the Python SDK.&lt;/li&gt;
&lt;li&gt;Gemini reads the prompt and the tool descriptions, then decides whether a function call is needed. &lt;em&gt;Prompting is key here!&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gemini returns &lt;code&gt;functionCall&lt;/code&gt; object:

&lt;ul&gt;
&lt;li&gt;Instead of a final text answer, Gemini may respond with one or more &lt;code&gt;functionCall&lt;/code&gt; objects in the candidate’s &lt;code&gt;content.parts&lt;/code&gt; . (crucial)&lt;/li&gt;
&lt;li&gt;Each &lt;code&gt;functionCall&lt;/code&gt;  object specifies the function name and a JSON-compatible &lt;code&gt;args&lt;/code&gt; object containing parameters that match the defined schema.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The app code executes the function(s)

&lt;ul&gt;
&lt;li&gt;The backend inspects the response, extracts each &lt;code&gt;functionCall&lt;/code&gt;, and invokes the corresponding function or external API with the provided &lt;code&gt;args&lt;/code&gt;.   (We got this from the Gemini)&lt;/li&gt;
&lt;li&gt;This is where one can handle authentication, validation, error handling, and any side effects, which are critical in production. Sadly, Genai SDK don’t provide support for the same.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You send tool results back to Gemini

&lt;ul&gt;
&lt;li&gt;You pass the original conversation plus tool results, wrapped as function response parts, in another &lt;code&gt;generate_content&lt;/code&gt; call.&lt;/li&gt;
&lt;li&gt;Gemini then uses this data to produce a final natural-language answer or further function calls.&lt;/li&gt;
&lt;li&gt;This step is primarily handled in the backend, so it is not shown to users. They feel like LLM is handling it.&lt;/li&gt;
&lt;li&gt;However, in most cases, developers have to pass the results and the original conversation. You can refer to the official &lt;a href="https://ai.google.dev/gemini-api/docs/function-calling" rel="noopener noreferrer"&gt;Gemini docs&lt;/a&gt; to learn more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In essence, the model proposes tool calls → the app executes them and passes conversation + tool results → the model synthesises results → new prompt &amp;amp; same repeats.&lt;/p&gt;

&lt;p&gt;Surprisingly, &lt;em&gt;this simple loop is the backbone of agentic workflows with any LLM!&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Tool calling with Gemini
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;&lt;code&gt;google-genai&lt;/code&gt;&lt;/strong&gt; Python SDK, we work with a &lt;strong&gt;&lt;code&gt;Client&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;FunctionDeclaration&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;GenerateContentConfig&lt;/code&gt;&lt;/strong&gt; to declare tools and read &lt;strong&gt;&lt;code&gt;function_call&lt;/code&gt;&lt;/strong&gt; parts in the response.&lt;/p&gt;

&lt;p&gt;The steps are as follows.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Steps
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Install the library and set up the workspace&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s start by installing the SDK and configuring the client. Open your terminal and paste the following command to installthe  generative AI package:&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; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; google-genai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, create a new Python file and import the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;from google import genai
from google.genai import types

client &lt;span class="o"&gt;=&lt;/span&gt; genai.Client&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_GEMINI_API_KEY"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# can do it from .env also&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty self-explanatory, right&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Initial request: user query + tool definitions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now is the time to add the initial request &amp;amp; tool definition. Let’s go with the tool definition first!&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="n"&gt;get_weather_fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FunctionDeclaration&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;get_weather&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;Get the current weather conditions for a specific location.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parameters&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;object&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;properties&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;location&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;string&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;description&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;The city and state/country, e.g., &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;San Francisco, CA&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;London, UK&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="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;required&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;location&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="n"&gt;get_stock_price_fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FunctionDeclaration&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;get_stock_price&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;Get the current stock price for a given ticker symbol.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parameters&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;object&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;properties&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;ticker_symbol&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;string&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;description&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;The stock ticker symbol, e.g., &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;GOOGL&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; or &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;AMZN&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="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;required&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;ticker_symbol&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we create two function schemas. For this, we used &lt;strong&gt;&lt;code&gt;FunctionDeclaration&lt;/code&gt;&lt;/strong&gt; from &lt;code&gt;types&lt;/code&gt; class. Think of it as a wrapper over the tool details that Gemini expects.&lt;/p&gt;

&lt;p&gt;Each &lt;strong&gt;&lt;code&gt;FunctionDeclaration&lt;/code&gt;&lt;/strong&gt; includes a &lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;description&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;parameters&lt;/code&gt;&lt;/strong&gt; JSON schema describing accepted arguments.&lt;/p&gt;

&lt;p&gt;Now let’s add our query:&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="n"&gt;tool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_declarations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_weather_fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_stock_price_fn&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;user_prompt_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the weather like in London?&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="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&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;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;user_prompt_content&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&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;tool&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;Key parts here are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model: A Gemini model that supports function calling, such as &lt;strong&gt;&lt;code&gt;gemini-2.0-flash&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;contents: Conversation history as a list of &lt;strong&gt;&lt;code&gt;Content&lt;/code&gt;&lt;/strong&gt; objects; here it starts with a single user message.&lt;/li&gt;
&lt;li&gt;tools: A list with one &lt;strong&gt;&lt;code&gt;Tool&lt;/code&gt;&lt;/strong&gt; that wraps multiple &lt;strong&gt;&lt;code&gt;FunctionDeclaration&lt;/code&gt;&lt;/strong&gt; objects. We covered this earlier&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Gemini’s response: requesting tool use&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As this is not a typical query, the model might use tools. In that case, it returns the response that contains a &lt;code&gt;function_call&lt;/code&gt; in one of its parts. We need to extract that:&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;# simple code to extract the output of parts -&amp;gt; function call
&lt;/span&gt;
&lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;

&lt;span class="n"&gt;function_call_part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="bp"&gt;None&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="n"&gt;function_call_part&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function_call_part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Function name:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Function args:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extracted &lt;code&gt;function_call&lt;/code&gt; should follow the schema as:&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;"candidates"&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;"content"&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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"parts"&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;"functionCall"&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_weather"&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="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"London, UK"&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;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;Important fields here are :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;parts[].function_call.name:&lt;/code&gt; Name of the tool (e.g., "&lt;code&gt;get_weather&lt;/code&gt;") that matches the schema declaration.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parts[].function_call.args&lt;/code&gt;: Object containing parameters Gemini inferred from the schema and user prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the last part of the Python code, we are extracting this only. You can check the output by running it yourself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; : Gemini can return multiple function call parts if it wants to use several tools in a single step.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;4. Subsequent request: providing the tool result&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that we have the request to execute the function, the app will execute it, and we need to pass the result to the model:&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;# define the tool (demo)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Mock api to mimic get_weather_results.
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temperature_c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;condition&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;mostly cloudy&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;# check if model actually returned a function_call part or not.
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;function_call_part&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function_call_part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;function_call&lt;/span&gt;
    &lt;span class="n"&gt;tool_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# conditionally run the tool 
&lt;/span&gt;        &lt;span class="c1"&gt;# (get_weather, get_stock_price)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tool_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;get_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;function_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;tool_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;get_stock_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Implement get_stock_price here
&lt;/span&gt;        &lt;span class="n"&gt;function_result&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;error&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;get_stock_price not implemented&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;function_result&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;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown function &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tool_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# wraps the tool call output &amp;amp; convert it to structured data
&lt;/span&gt;        &lt;span class="c1"&gt;# important for gemini to use
&lt;/span&gt;    &lt;span class="n"&gt;function_response_part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_function_response&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="n"&gt;tool_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;function_result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# defining model -&amp;gt; repersents model previous turn
&lt;/span&gt;    &lt;span class="n"&gt;function_call_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;function_call_part&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# define tool -&amp;gt; resperesent tool result to model's request 
&lt;/span&gt;    &lt;span class="n"&gt;function_response_content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;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;parts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;function_response_part&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# merge to pass tool result, prompt &amp;amp; conversation history.
&lt;/span&gt;        &lt;span class="c1"&gt;# also make model aware of tools being used.
&lt;/span&gt;    &lt;span class="n"&gt;final_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&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;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="n"&gt;user_prompt_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;function_call_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;function_response_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&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;tool&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# finally print the output - in natural language
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;final_response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Part.from_function_response&lt;/code&gt;&lt;/strong&gt; wraps the tool output so Gemini can consume it as structured data, not just plain text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;role="tool"&lt;/code&gt;&lt;/strong&gt; The content makes it clear this is a tool result, not another user or model message.&lt;/li&gt;
&lt;li&gt;Gemini then reads history, uses the tool result, and generates a final natural-language reply (or possibly more tool calls).&lt;/li&gt;
&lt;li&gt;Check it for yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let’s try to use a tool called to concretize our understanding&lt;/p&gt;




&lt;h3&gt;
  
  
  Function Calling with Composio Tools
&lt;/h3&gt;

&lt;p&gt;Composio provides access to 900+ tools, including Google Gemini support, so we can leverage it to get up to speed without worrying about manual tool write-ups and authentication. Let’s code one to understand better.&lt;/p&gt;

&lt;p&gt;We start by installing composio packages:&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="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;genai&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gemini&lt;/span&gt; &lt;span class="n"&gt;composio&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we import libraries and set up configs:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Head to &lt;a href="https://platform.composio.dev/auth" rel="noopener noreferrer"&gt;Composio&lt;/a&gt; , either login/signup&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once in, go to settings → New Api Key → add name &amp;amp; hit create&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy it somewhere safe, only visible once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also copy the &lt;code&gt;user_id&lt;/code&gt; In the &lt;strong&gt;Debug info for support.&lt;/strong&gt; We need this later on to authenticate composio tools.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.colab&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;userdata&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userdata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&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="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_gemini&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GeminiProvider&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we create a composio and a Gemini client:&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;# Create composio client
&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;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;GeminiProvider&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Create google client
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we add the composio user id and load tools, set up configs. For tools, we are using Composio’s DuckDuckGo search tool:&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="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;e92b1112-5c68-4501-8af4-49af4199592f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# Ge tools using the new SDK structure
&lt;/span&gt;&lt;span class="n"&gt;tools&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="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&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;DUCKDUCKGO&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 genai client config
&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerateContentConfig&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="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we create a chat and fire up a query to llm:&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;# Use the chat interface
&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chats&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;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;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;search about the latest info on OpenAI Code Red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the output (middle part, usually hidden):&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%2Ffye1a4nl3y47pkndnno1.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%2Ffye1a4nl3y47pkndnno1.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As can be seen, the response object consists of &lt;code&gt;function_call&lt;/code&gt; key along with name, query and role.  Time to extract the results.&lt;/p&gt;

&lt;p&gt;Finally, we beautify the output:&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;# Check if there are candidates and content parts
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;candidates&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;candidates&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="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&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;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Print only the text content if available
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&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%2F8c4ij72utjlblqb70s8u.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%2F8c4ij72utjlblqb70s8u.png" alt="image.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Excellent, we got the response, and this is how Composio abstracts away manual tool writing; however, this doesn’t end here. What if you have to access multiple tools across multiple use cases?&lt;/p&gt;

&lt;p&gt;This is where Composio’s tool routing comes into play. Let’s see it in action!&lt;/p&gt;




&lt;h3&gt;
  
  
  Function Calling with Composio Tool Router MCP with Google ADK
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developers.googleblog.com/en/agent-development-kit-easy-to-build-multi-agent-applications/" rel="noopener noreferrer"&gt;Google ADK&lt;/a&gt; (Agent Development Kit) is Google’s opinionated framework for building full-blown agents.  &lt;/p&gt;

&lt;p&gt;Unlike the raw Gemini SDK, ADK provides primitives for tools, routing, sessions, web UIs, and multi‑turn orchestration, making it far better suited for serious workloads such as production agents, dashboards, and complex automation flows. &lt;/p&gt;

&lt;p&gt;But it’s limited in terms of tools, and for cross-application workflows, you’ll need to build integrations. However, creating these can take an eternity; if it’s not central to your core product, you can use &lt;a href="https://composio.dev/toolkits" rel="noopener noreferrer"&gt;Composio toolkits&lt;/a&gt;. We also have an even better abstraction, Tool Router.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://composio.dev/blog/introducing-tool-router-(beta)" rel="noopener noreferrer"&gt;Tool Router MCP&lt;/a&gt; is a unified interface that lets an agent &lt;strong&gt;search&lt;/strong&gt;, &lt;strong&gt;plan&lt;/strong&gt;, &lt;strong&gt;authenticate&lt;/strong&gt;, and &lt;strong&gt;execute&lt;/strong&gt; actions across thousands of &lt;a href="https://composio.dev/toolkits" rel="noopener noreferrer"&gt;Composio tools&lt;/a&gt;. This means less thinking, more building. &lt;/p&gt;

&lt;p&gt;The Tool router MCP is super simple to use with Google ADK. Let’s see it in action.&lt;/p&gt;

&lt;p&gt;We start by installing the required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install &lt;/span&gt;google-adk composio composio_google
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then initialise the project with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;And select: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;root agent model as &lt;code&gt;gemini-2.5-flash&lt;/code&gt; ,&lt;/li&gt;
&lt;li&gt;model provider as &lt;code&gt;Google AI&lt;/code&gt; and&lt;/li&gt;
&lt;li&gt;Add the respective &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; key when prompted. Get it from &lt;a href="https://aistudio.google.com/api-keys" rel="noopener noreferrer"&gt;Google Studio&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leaves us with a new directory with the name &lt;code&gt;gmail_agent&lt;/code&gt;  along with all essential files (.env, &lt;strong&gt;agent.py&lt;/strong&gt; and &lt;strong&gt;&lt;strong&gt;init&lt;/strong&gt;.py&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Next, we open &lt;code&gt;gmail_agent/agent.py&lt;/code&gt;  and add the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;import os
import warnings

from composio import Composio
from composio_google import GoogleProvider
from dotenv import load_dotenv
from google.adk.agents.llm_agent import Agent
from google.adk.tools.mcp_tool.mcp_session_manager import &lt;span class="se"&gt;\&lt;/span&gt;
    StreamableHTTPConnectionParams
from google.adk.tools.mcp_tool.mcp_toolset import McpToolset

load_dotenv&lt;span class="o"&gt;()&lt;/span&gt;

&lt;span class="c"&gt;# This BaseAuthenticatedTool warning comes from ADK itself, it's nothing serious.&lt;/span&gt;
&lt;span class="c"&gt;# Makes the entire UI, shit, so just ignore it here....&lt;/span&gt;
warnings.filterwarnings&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ignore"&lt;/span&gt;, &lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;".*BaseAuthenticatedTool.*"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

GOOGLE_API_KEY &lt;span class="o"&gt;=&lt;/span&gt; os.getenv&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"GOOGLE_API_KEY"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
COMPOSIO_API_KEY &lt;span class="o"&gt;=&lt;/span&gt; os.getenv&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"COMPOSIO_API_KEY"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
COMPOSIO_USER_ID &lt;span class="o"&gt;=&lt;/span&gt; os.getenv&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"COMPOSIO_USER_ID"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;not GOOGLE_API_KEY:
    raise ValueError&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"GOOGLE_API_KEY is not set in the environment."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;not COMPOSIO_API_KEY:
    raise ValueError&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"COMPOSIO_API_KEY is not set in the environment."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;not COMPOSIO_USER_ID:
    raise ValueError&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"COMPOSIO_USER_ID is not set in the environment."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

try:
    print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Initializing Composio client..."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    composio_client &lt;span class="o"&gt;=&lt;/span&gt; Composio&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;COMPOSIO_API_KEY, &lt;span class="nv"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;GoogleProvider&lt;span class="o"&gt;())&lt;/span&gt;

    print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Creating Composio session..."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    composio_session &lt;span class="o"&gt;=&lt;/span&gt; composio_client.experimental.tool_router.create_session&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;COMPOSIO_USER_ID,
        &lt;span class="nv"&gt;toolkits&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;&lt;span class="s2"&gt;"composio_search"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
    &lt;span class="o"&gt;)&lt;/span&gt;

    COMPOSIO_MCP_URL &lt;span class="o"&gt;=&lt;/span&gt; composio_session.url
    print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"Composio MCP HTTP URL: {COMPOSIO_MCP_URL}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Creating Composio toolset for the agent..."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    composio_toolset &lt;span class="o"&gt;=&lt;/span&gt; McpToolset&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;connection_params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;StreamableHTTPConnectionParams&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;COMPOSIO_MCP_URL&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    root_agent &lt;span class="o"&gt;=&lt;/span&gt; Agent&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nv"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"gemini-2.5-pro"&lt;/span&gt;,
        &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"composio_agent"&lt;/span&gt;,
        &lt;span class="nv"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"An agent that uses Composio tools to perform actions."&lt;/span&gt;,
        &lt;span class="nv"&gt;instruction&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;
            &lt;span class="s2"&gt;"You are a helpful assistant connected to Composio. "&lt;/span&gt;
            &lt;span class="s2"&gt;"Use the available tools to answer user queries and perform actions. "&lt;/span&gt;
            &lt;span class="s2"&gt;"Execute the tools directly without asking for confirmation."&lt;/span&gt;
            &lt;span class="s2"&gt;"Just execute any tools that's required. no confirmation, at all. just run tools, directly when needed."&lt;/span&gt;
        &lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="nv"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;composio_toolset],
    &lt;span class="o"&gt;)&lt;/span&gt;
    print&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Agent setup complete. You can now run this agent directly ;)"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

except Exception as e:
    print&lt;span class="o"&gt;(&lt;/span&gt;f&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;An error occurred during agent setup: {e}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;and revert to &lt;code&gt;.env&lt;/code&gt; file to add the environment variables:&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;GOOGLE_GENAI_USE_VERTEXAI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0
&lt;span class="nv"&gt;GOOGLE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; your-gemini-api-key-from-build-studio
COMPOSIO_API_KEY &lt;span class="o"&gt;=&lt;/span&gt; composio-api-key-from-dashboard
COMPOSIO_USER_ID &lt;span class="o"&gt;=&lt;/span&gt; composio-user-id-from-dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then execute the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adk web &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find me top places to visit in Kerala. I have 10 days, 9-night trip and want to enjoy as much as I can.

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

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;


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


&lt;/p&gt;




&lt;h2&gt;
  
  
  Prompting Tips &amp;amp; Conclusion
&lt;/h2&gt;

&lt;p&gt;While function calling is compelling, getting LLMs like Gemini to use tools as intended often reliably requires careful design and iteration. &lt;/p&gt;

&lt;p&gt;If you find Gemini isn't calling functions when expected, calls the wrong function, or provides incorrect parameters, here are several strategies to improve performance:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Optimise tool definitions

&lt;ul&gt;
&lt;li&gt;Write clear descriptions that explicitly state when to use each tool and optionally include short inline examples.&lt;/li&gt;
&lt;li&gt;Use intuitive, distinct function names and keep each tool focused on a narrow responsibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Refine schemas and prompts

&lt;ul&gt;
&lt;li&gt;Use proper JSON schema types (string, number, boolean, object, array) plus enums to guide valid inputs strongly.&lt;/li&gt;
&lt;li&gt;In the user/system prompts, mention that the model should use tools when it needs external data or must perform actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Handle execution and errors carefully

&lt;ul&gt;
&lt;li&gt;Implement robust error handling in your Python functions (network issues, invalid parameters, timeouts, etc.).&lt;/li&gt;
&lt;li&gt;Return informative error messages via function responses so Gemini can explain failures or retry gracefully.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Choose the right Gemini model and configuration

&lt;ul&gt;
&lt;li&gt;Use more capable models like &lt;strong&gt;&lt;code&gt;gemini-3.0-flash&lt;/code&gt;&lt;/strong&gt; or later releases for better reasoning and tool selection.&lt;/li&gt;
&lt;li&gt;Consider using tool configuration options (e.g., forcing specific tools) when you need deterministic function calls.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Log, iterate, and test

&lt;ul&gt;
&lt;li&gt;Log prompts, function calls, tool arguments, tool outputs, and final responses to debug misuses or missing parameters.&lt;/li&gt;
&lt;li&gt;Iterate on descriptions, schemas, and result formats based on real traces to steadily improve reliability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So in the end I can only say:&lt;/p&gt;

&lt;p&gt;With well-structured functions, clean schemas, and a robust Python handler loop, Gemini function calling lets you build powerful agents that combine strong reasoning with live access to APIs, databases, and platforms like Composio.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1. What is the difference between function calling and tool use?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Function calling and tool use are the same concept with different terminology. &lt;/p&gt;

&lt;p&gt;Function calling refers to the LLM's ability to output structured requests for specific functions, while tool use is a broader term that encompasses the entire pattern of exposing external capabilities (APIs, databases, services) to the model.&lt;/p&gt;

&lt;p&gt;In practice, when an LLM performs function calling, it's engaging in tool use by selecting and invoking the appropriate tool for a given task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2. Can Gemini execute functions directly, or do I need to implement the execution layer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemini cannot execute functions directly. The model only returns a structured &lt;code&gt;functionCall&lt;/code&gt; object that describes which function to call and what parameters to use. &lt;/p&gt;

&lt;p&gt;Your application code must implement the execution layer parsing the function call, invoking the actual API or service, handling errors, and returning results back to the model. &lt;/p&gt;

&lt;p&gt;This design keeps the LLM safe and sandboxed while giving you full control over what actions are actually performed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3. How do I handle cases where Gemini calls the wrong function or provides incorrect parameters?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Gemini selects the wrong function or provides bad parameters, start by improving your function definitions with clearer descriptions, more specific names, and stricter JSON schemas (use enums, proper types, and required fields). &lt;/p&gt;

&lt;p&gt;Add explicit instructions in your system prompt about when to use each tool. &lt;/p&gt;

&lt;p&gt;Implement validation and error handling in your execution layer to catch invalid inputs early, and return descriptive error messages that help Gemini understand what went wrong so it can retry or explain the issue to the user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4. What is Composio's Tool Router MCP, and how does it simplify working with multiple tools?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Composio's Tool Router MCP (Model Context Protocol) is a unified interface that provides a single endpoint for searching, planning, authenticating, and executing actions across thousands of tools and integrations.&lt;/p&gt;

&lt;p&gt;Instead of manually defining and managing dozens of individual function schemas, you connect to the Tool Router MCP, which dynamically exposes relevant tools based on your query. &lt;/p&gt;

&lt;p&gt;This dramatically reduces boilerplate code and makes it easy to build agents that can seamlessly work across multiple platforms and services without writing custom integration code for each one.&lt;/p&gt;

</description>
      <category>googleaichallenge</category>
      <category>gemini</category>
      <category>resources</category>
      <category>ai</category>
    </item>
    <item>
      <title>Deepseek 3.2 Speciale vs Claude 4.5 Sonnet for agentic coding</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Tue, 16 Dec 2025 12:33:38 +0000</pubDate>
      <link>https://forem.com/composiodev/deepseek-32-speciale-vs-claude-45-sonnet-for-agentic-coding-2m97</link>
      <guid>https://forem.com/composiodev/deepseek-32-speciale-vs-claude-45-sonnet-for-agentic-coding-2m97</guid>
      <description>&lt;p&gt;DeepSeek recently released Deep Seek V3.2 Speciale - a reasoning-first model built for agents. &lt;/p&gt;

&lt;p&gt;As a developer who uses both open- and closed-source models for his builds, I decided to test the new model (Deep Seek V3.2) with my most-used model, Claude Sonnet 4.5. &lt;/p&gt;

&lt;p&gt;Also, during the building process, I used &lt;a href="https://dub.composio.dev/deepseek" rel="noopener noreferrer"&gt;Rube MCP,&lt;/a&gt; a single server that gives you access to apps like GitHub, Linear, Supabase, etc and loads tools dynamically to avoid context bloat. This helps us get a good picture of the tool-calling ability of models and also gives us an excuse to use dog food for the product.&lt;/p&gt;

&lt;p&gt;So, I coded a complete web app using the model to stress-test its capacity and found some fascinating insights.&lt;/p&gt;

&lt;p&gt;This post covers my build process, prompts, exact builds and a few insights. Let’s dive in!&lt;/p&gt;




&lt;h3&gt;
  
  
  TL;DR.
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;I tested DeepSeek V3.2 and Claude Sonnet 4.5 on a full-stack feature-voting app.&lt;/li&gt;
&lt;li&gt;DeepSeek V3.2 built parts of the app but stumbled on execution, speed, and reliability despite solid reasoning steps.&lt;/li&gt;
&lt;li&gt;Claude Sonnet 4.5 powered through the whole build with cleaner planning and better tooling, just at a much higher cost.&lt;/li&gt;
&lt;li&gt;Both models followed the workflow, but Claude handled ambiguity, testing, and end-to-end flow way more gracefully.&lt;/li&gt;
&lt;li&gt;DeepSeek impressed with memory and tool usage but required manual fixes and felt noticeably slower.&lt;/li&gt;
&lt;li&gt;Overall: DeepSeek is great for cost-efficient tinkering, Claude shines for dependable multi-step builds. So, pick based on your use case and cost.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  App Overview
&lt;/h2&gt;

&lt;p&gt;The app is the &lt;strong&gt;Team Feature Voting Board App&lt;/strong&gt;., which internal product teams can use to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submit feature ideas.&lt;/li&gt;
&lt;li&gt;Upvote/downvote features.&lt;/li&gt;
&lt;li&gt;Comment on features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While the board will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show vote counts, status, and basic metadata.&lt;/li&gt;
&lt;li&gt;Filter by status (e.g. “Backlog”, “In Progress”, “Shipped”).&lt;/li&gt;
&lt;li&gt;Prevent duplicate voting by the same user on the same feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this, I will use &lt;a href="https://rube.app" rel="noopener noreferrer"&gt;Rube MCP&lt;/a&gt; as a provider, as it unlocks access to 500+ tools with one-click setup + automated tool selection, planning and execution.&lt;/p&gt;

&lt;p&gt;Apart from that, for claude-sonnet-4.5 - I will go with Claude Code, and for Deep Seek V3.2 - I will use open code with open router as the model provider.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Methodology
&lt;/h2&gt;

&lt;p&gt;Used Claude 4.5 Sonnet with Claude Code and Deepseek 3.2 Speciale with Opencode.&lt;/p&gt;

&lt;p&gt;I started from the basic flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setting up app overview.&lt;/li&gt;
&lt;li&gt;Writing the project brief + scope.&lt;/li&gt;
&lt;li&gt;Creating Linear epic + tickets.&lt;/li&gt;
&lt;li&gt;Designing UI frames in Figma.&lt;/li&gt;
&lt;li&gt;Defining Supabase schema + migrations.&lt;/li&gt;
&lt;li&gt;Designing API endpoints + interactions.&lt;/li&gt;
&lt;li&gt;Planning frontend architecture + components.&lt;/li&gt;
&lt;li&gt;Implementing backend logic (votes, comments, features).&lt;/li&gt;
&lt;li&gt;Building frontend UI screens + state handling.&lt;/li&gt;
&lt;li&gt;Creating GitHub Commit + PR.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this, I wrote an instruction-based prompt and kept it in prompt.txt at the project level.&lt;/p&gt;

&lt;p&gt;For both terminals, I also added a terminal prompt to add an overview of the project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Terminal Prompt (same for both)&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Follow @prompt.txt &amp;amp; Build me a kanban style fully functional Team Feature Voting Board App which can be used by internal product teams to: Submit feature ideas, upvote / downvote and comment on the feature. The board will show: vote count, status and basic metdata for each feature proposed (modal), allow to filter by status (backlog, pending, approved, rejected, inprogress, pending) and should prevent duplicate voting. Use rube_mcp to connect to use supabase as database, fetch figma file at:"url", commit after each step and update the tracked issues in Linear. Make ui look beautiful and ui-ux should be responsive for mobile.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can check out the prompt I wrote in &lt;a href="https://gist.github.com/DevloperHS/fa847b7a788b6818a00de9a3c513b1c8#file-prompt-md" rel="noopener noreferrer"&gt;prompt.txt&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Here is the output of both!&lt;/p&gt;

&lt;p&gt;Deep Seek V3.2&lt;br&gt;


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


&lt;/p&gt;

&lt;p&gt;Deep Seek V3.2 built a partially functional app, even with reference to the Figma file I provided, which has much of the functionality broken.&lt;br&gt;
&lt;strong&gt;For ref:&lt;/strong&gt; I had to manually fix the partial code for DB and RPA and update the NextJS and TypeScript config files.&lt;/p&gt;

&lt;p&gt;It followed the following flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Went step by step,&lt;/li&gt;
&lt;li&gt;fetched all the relevant tools using &lt;em&gt;rube_mcp&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Remembered DB URLs, RLS rules, and, in fact, the DB ID itself.&lt;/li&gt;
&lt;li&gt;Created backend and frontend with multiple ask prompts,&lt;/li&gt;
&lt;li&gt;broke the high-level task into a to-do list and went one by one.&lt;/li&gt;
&lt;li&gt;Relatively slow compared to Claude 4.5 Sonnet, with&lt;/li&gt;
&lt;li&gt;no commits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, did the work partially &amp;amp; speed is a concern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: ~2$&lt;/li&gt;
&lt;li&gt;Tokens: ~8.4M with auto-compact.&lt;/li&gt;
&lt;li&gt;Time: ~ 1.45 hours - with additional prompt guidance.&lt;/li&gt;
&lt;li&gt;Quality: Mid-level, partially functional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude Sonnet 4.5&lt;br&gt;


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


&lt;/p&gt;

&lt;p&gt;Claude's code built a fully functional app with a simple UI (as reference URL, Figma failed to fetch), which worked fine. It followed the following flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planned API to fix rate limits.&lt;/li&gt;
&lt;li&gt;Understood the provided URL is a Figma make file, not a design one &amp;amp; guided step by step to find the one.&lt;/li&gt;
&lt;li&gt;Wrote a Python script internally to commit all the files in chunks.&lt;/li&gt;
&lt;li&gt;Fetched Figma design files, failed and then recreated them own&lt;/li&gt;
&lt;li&gt;One shot created the backend and the frontend.&lt;/li&gt;
&lt;li&gt;Ran multiple tests after each new functionality, ensured it worked, then moved forward in the to-do list.&lt;/li&gt;
&lt;li&gt;Got stuck with the final commit, so had to do it manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, did the work well, but cost is a concern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cost: 10$&lt;/li&gt;
&lt;li&gt;Tokens: ~14M tokens with auto compact enabled.&lt;/li&gt;
&lt;li&gt;Time: ~ 50 minutes - one shot with multiple ask prompts.&lt;/li&gt;
&lt;li&gt;Quality: Mid-level, fully functional. Considering it generated the frontend itself using the Figma design schema.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;DeepSeek V3.2 and Claude Sonnet 4.5 are both general LLMs optimised for reasoning, coding, and tool/agent use, but their usage differs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek V3.2 - use when you need cost-efficient reasoning and open-source flexibility; usually for personal projects.&lt;/li&gt;
&lt;li&gt;Sonnet 4.5 - use when you want stable multi-step planning, stronger execution, and enterprise-ready workflows and are ready to deal with cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the best bet would be to combine both of them for your use case.&lt;/p&gt;

&lt;p&gt;As for the final verdict, I would say:&lt;/p&gt;

&lt;p&gt;With recent launches like GPT 4.5, Gemini 3, Sonnet 4.5, and DeepSeek V3.2, learning to pick the right models for the proper use cases has become more critical than ever. &lt;/p&gt;

&lt;p&gt;Get started now!&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Q&amp;amp;A&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Which model handled full-stack execution better?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Claude Sonnet 4.5 completed the entire app reliably, while DeepSeek V3.2 delivered only a partial build.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Which model is more cost-efficient for long reasoning workflows?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; DeepSeek V3.2 is far cheaper but noticeably slower and requires more manual fixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; When should you choose Claude over DeepSeek?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; When you need stable multi-step planning, stronger tool use, and smoother end-to-end execution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; Which model is better for flexible, open-source-friendly setups?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; DeepSeek V3.2 shines when you want openness, lower cost, and reasoning-first workflows for personal builds.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>opensource</category>
      <category>deepseek</category>
      <category>agents</category>
      <category>ai</category>
    </item>
    <item>
      <title>The One MCP That Turns Antigravity Into a 500-Tool Powerhouse</title>
      <dc:creator>Developer Harsh</dc:creator>
      <pubDate>Fri, 28 Nov 2025 12:53:18 +0000</pubDate>
      <link>https://forem.com/composiodev/the-one-mcp-that-turns-antigravity-into-a-500-tool-powerhouse-4ehe</link>
      <guid>https://forem.com/composiodev/the-one-mcp-that-turns-antigravity-into-a-500-tool-powerhouse-4ehe</guid>
      <description>&lt;p&gt;Google recently released Gemini 3, Nano Banana Pro and its agentic IDE Antigravity, and it's exploding in popularity. AI, Builders &amp;amp; Business community are hyping it up like crazy. &lt;/p&gt;

&lt;p&gt;But when it comes to tools, it's limited. Though one can add MCPs for use cases, it's hectic to connect every applications MCP servers manually&lt;/p&gt;

&lt;p&gt;So, what if one has an MCP that you configure once, and it connects to 500+ products at once while intelligently figuring out which MCP tools and methods are needed?&lt;/p&gt;

&lt;p&gt;Enter Rube, a universal MCP &amp;amp; in this short blog, let's see how you can use it to supercharge your AI-assisted development.&lt;/p&gt;

&lt;h3&gt;
  
  
  TL DR;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Rube MCP plugs into Antigravity once and instantly unlocks hundreds of tools without the annoying manual MCP wiring.&lt;/li&gt;
&lt;li&gt;You can automate code reviews and send off clean summaries straight to Gmail / Slack using Rube’s mail tools.&lt;/li&gt;
&lt;li&gt;Backend setup becomes trivial when Rube creates and seeds Supabase databases with text instructions and LLM commands.&lt;/li&gt;
&lt;li&gt;Frontend devs can turn Figma wireframes into clean HTML/CSS by letting Rube fetch designs and Antigravity generate UI code.&lt;/li&gt;
&lt;li&gt;Antigravity + Rube turns repetitive dev work into background noise so you can actually focus on building.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Connect Antigravity with Rube MCP
&lt;/h2&gt;

&lt;p&gt;Before doing anything else, one needs to connect it once. Process is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://rube.app/" rel="noopener noreferrer"&gt;Rube MCP&lt;/a&gt; site.&lt;/li&gt;
&lt;li&gt;Signup / Login&lt;/li&gt;
&lt;li&gt;Head to Add Rube → MCP URL → Generate Token&lt;/li&gt;
&lt;li&gt;Copy the code to put in place of  &lt;code&gt;RUBE API KEY&lt;/code&gt; in &lt;code&gt;mcp.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Head back to Antigravity, &lt;code&gt;…&lt;/code&gt; dot in prompt editor → MCP -&amp;gt; Manage MCP Server → View raw config&lt;/li&gt;
&lt;li&gt;Paste the command in &lt;a href="https://gist.github.com/DevloperHS/19fb43ee702fd736a7f252da9ca9ec60#file-mcp-json" rel="noopener noreferrer"&gt;mcp.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Perform OAuth, wait till it completes&lt;/li&gt;
&lt;li&gt;and boom, Rube added to the MCP list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For verification, head to Manage MCP Servers, refresh and check the tool. It will look something like this:&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%2Fywgpw4ookhewcfusb7ri.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%2Fywgpw4ookhewcfusb7ri.png" alt="Rube MCP in Antigravity"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: if you are new to MCP, don't change anything. If new to rube, for first time it ask for OAuth for each tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now let's see a few use cases of Rube in Antigravity.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Using Rube MCP to automate Code Review &amp;amp; Update
&lt;/h2&gt;

&lt;p&gt;Senior developer often analyse intern codebases, pointing out errors, summarising them and sending them to their Slack/email.&lt;/p&gt;

&lt;p&gt;This can be a time-consuming, mundane &amp;amp; repetitive task. So, they can delegate it to Antigravity + Rube combo.&lt;/p&gt;

&lt;p&gt;So here is a prompt to paste in the agent window prompt box (much like VS Code)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find the bugs in @agent.py @requirements.txt @__init__.py . 
Categorise them in low , medium high priority and create a short summary analysis with proper formating. 
Then using @mcp:rube_mcp: Send the summary to devloper.hs2015@gmail.com with title "Code Analysis Summary".
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In simple words, the prompt asks the LLM to review the codebase, identify bugs, generate a summary, and send it as an email to the user. The output should include a summary and a mail link. And all this should be done using rube’s Gmail tool.&lt;/p&gt;

&lt;p&gt;Yup, we don't have Gmail support in Antigravity, but rube helps here!&lt;/p&gt;

&lt;p&gt;Now click &lt;code&gt;&amp;gt;&lt;/code&gt; And wait till it's complete. If this is 1st time, rube will ask you to connect your Gmail account to send mail, but that's just OAuth for you.&lt;/p&gt;

&lt;p&gt;Finally, it will come back with the draft/task it performed and an email link. Pretty transparent 😅&lt;/p&gt;

&lt;p&gt;Here I am performing the same:&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: You can even ask it to send to team slack, but I went with gmail, as this is just a demo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hopefully, now the intern will find the email and fix it all and send a pull request again :)&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Using Rube MCP to handle Supabase Database for Apps
&lt;/h2&gt;

&lt;p&gt;Backend developers often need to create different database models for different projects. This can be time-consuming, mundane and repetitive.&lt;/p&gt;

&lt;p&gt;They can leverage Rube MCP to connect to Supabase, build the database in one shot, and use APIs to pull real-time information. Best part - no manual handling of pesky database issues, all handled by rube!&lt;/p&gt;

&lt;p&gt;Here is a prompt to do so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a minimal Student Grade CRUD application using Flask, Jinja, HTML, and CSS. The aesthetic should be "Google Material Minimal"—clean white backgrounds, subtle shadows, rounded corners, and excellent typography.

Phase 1: Database Setup (via rube_mcp)
Use the `rube_mcp` tool to interact with Supabase.
1. Create a table named `students` in the database `student-data`.
2. The schema should include: `id` (serial/int, primary key), `name` (text), `subject` (text), `grade` (int), and `last_updated` (timestamp).
3. Immediately seed this table with 5-10 realistic mock entries (e.g., "Alice Smith", "Mathematics", 92).

Phase 2: Flask Application
Create a single-file Flask app (or standard folder structure if preferred) that connects to this Supabase instance.
1. API/Routes:
   - GET `/`: Render the dashboard showing all students.
   - POST `/add`: Add a new student.
   - POST `/update/&amp;lt;id&amp;gt;`: Update a student's grade.
   - POST `/delete/&amp;lt;id&amp;gt;`: Remove a student.
2. UI/UX:
   - Use Jinja2 for templating.
   - Style using vanilla CSS (no external frameworks like Bootstrap).
   - Design: Center-aligned card layout. The table should look like a Google Docs file list or Google Classroom roster. Use soft gray borders (#e0e0e0) and the system font stack (Inter/Roboto/San Francisco).
   - Add a "Add Student" floating action button (FAB) or a clean top bar button.

Ensure the code is production-ready, handles database connections securely, and renders the frontend cleanly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In summary:&lt;/strong&gt; prompt the LLM to create a Google minimal style UI-UX-based CRUD app (for demo purposes) and pull in mock data defined in Supabase’s &lt;code&gt;student-db&lt;/code&gt; using crud api’s. Here, the database was created using &lt;code&gt;rube_mcp&lt;/code&gt;. &lt;br&gt;
Yup, we don't have Supabase support in Antigravity, but rube helps here!.&lt;/p&gt;

&lt;p&gt;Here is how it worked for me! &lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: For demo purposes, I have used a CRUD app example, but same flow can be expanded to complex project as well&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Always provide enough context for the LLM to perform the job as expected. For this example, this translates to adding: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;db name - student-db&lt;/li&gt;
&lt;li&gt;column name - id, name, subject, grade, last_updated&lt;/li&gt;
&lt;li&gt;mock data - in tuple pairs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this power in hand, backend devs can create a robust and scalable database by just giving the right instructions!&lt;/p&gt;

&lt;p&gt;Now off to the final use case of today!&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Using Rube MCP to generate Frontend Code from Figma Mockups
&lt;/h2&gt;

&lt;p&gt;Frontend developers often have to convert the Figma designs shared into webpages. They can leverage Composio’s Rube MCP to connect to Figma, fetch the designs, and generate the frontend code for them—best fact: no need to handle the conversion details; all done by rube.&lt;/p&gt;

&lt;p&gt;Here is a prompt to do so!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mockup&lt;/strong&gt; (used for demo purposes only)&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%2Fjgnp6cisxq71l6mhdvyu.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%2Fjgnp6cisxq71l6mhdvyu.png" alt="Figma Mockup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Here is the figma file url https://www.figma.com/design/CHX6G247vkQFDYh84Qv9CS/Low-fi-Wireframe-Template--Community-?node-id=123-0&amp;amp;p=f&amp;amp;t=6OH8UhfkjgLRPLpE-0. 

Implement a blog based ui based on the given wireframe. Keep ui minimal and clean, similar to google (materialistic design). 

Only Tech stack to be used: HTML, CSS. Create the project in new folder called blogspace. I only need Mocup UI for client. 

Make sure to fetch the file using rube_mcp and then only start designing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a nutshell, the prompt provides the LLM with a Figma URL and asks it to replicate the wireframe into an HTML blog page with CSS, all in the same folder. &lt;/p&gt;

&lt;p&gt;Again, we don't have Figma support in Antigravity, but rube helps here!&lt;/p&gt;

&lt;p&gt;This is how it turned out:&lt;br&gt;


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


&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;For generating a complex frontend, follow these guidelines for optimized results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name the layers; include additional details, such as row and column numbers, in the layer names themselves. E.g &lt;code&gt;memo-card-grid-row0-col0&lt;/code&gt; (the leftmost corner).&lt;/li&gt;
&lt;li&gt;Name the colour styles. E.g. ❌ #FFFFFF, ✔️ background-color-white&lt;/li&gt;
&lt;li&gt;Name the file properly. Please don’t keep it generic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These guidelines provide the model with enough context to generate the complex frontend architecture that developers are expected to deliver. &lt;/p&gt;

&lt;p&gt;These were some use cases; the list is endless. But here is the final verdict!&lt;/p&gt;

&lt;p&gt;In case of any errors, check out: &lt;a href="https://github.com/DevloperHS/antigravity-vibe-coding-session" rel="noopener noreferrer"&gt;Antigravity Coding Session&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;With Antigravity and Rube, the repetitive task became child’s play, and the best part is that this same workflow can be incorporated into various domains.&lt;/p&gt;

&lt;p&gt;Though Antigravity is new, it packs some serious punch and with Rube MCP as a partner, the only limit is your imagination.&lt;/p&gt;

&lt;p&gt;So, head to Rube MCP, connect it to Antigravity, pull up some PRD doc, give it to Gemini 3 / Nano Banana Pro with a kickass prompt, and let the tool do its thing while you focus on ideating and planning the part. &lt;/p&gt;

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




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q1. How do I integrate Rube MCP into Antigravity?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Generate a token from the Rube dashboard and paste the provided command directly into your Antigravity’s &lt;code&gt;mcp.json&lt;/code&gt; raw config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2. How do I verify that Rube is successfully connected to Antigravity?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Head to "Manage MCP Servers" in the editor, refresh the page, and confirm that the Rube tool appears in your active list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3&lt;/strong&gt;. &lt;strong&gt;Do I need to configure credentials for all 500+ tools manually?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Answer: No, you configure Rube once, and it dynamically handles connections, requiring only a one-time OAuth login the first time you use a specific tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4. Can Rube handle tasks for platforms not natively supported by Antigravity?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer:&lt;/strong&gt; Absolutely; Rube acts as a bridge to fetch data and perform actions on external platforms like Figma, Supabase, and Gmail that the native IDE doesn't support yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q5&lt;/strong&gt;. &lt;strong&gt;How can I optimise the code generation quality for complex tasks like Figma conversions?&lt;/strong&gt; &lt;strong&gt;Answer:&lt;/strong&gt; Ensure you provide rich context, such as clearly naming Figma layers and colour styles, so the model understands the specific structural requirements.&lt;/p&gt;

</description>
      <category>gemini</category>
      <category>antigravity</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
