<?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: Allen Tuh</title>
    <description>The latest articles on Forem by Allen Tuh (@allentcm).</description>
    <link>https://forem.com/allentcm</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%2F2010875%2Fa1f92bd4-bf9b-44c1-a872-fba44b827501.jpeg</url>
      <title>Forem: Allen Tuh</title>
      <link>https://forem.com/allentcm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/allentcm"/>
    <language>en</language>
    <item>
      <title>How to Use Sidekick's Instant Commands from OpenAPI/Postman</title>
      <dc:creator>Allen Tuh</dc:creator>
      <pubDate>Mon, 23 Mar 2026 15:49:25 +0000</pubDate>
      <link>https://forem.com/allentcm/how-to-use-sidekicks-instant-commands-from-openapipostman-2hh7</link>
      <guid>https://forem.com/allentcm/how-to-use-sidekicks-instant-commands-from-openapipostman-2hh7</guid>
      <description>&lt;p&gt;Sidekick (sdkck) is a CLI companion tool designed for AI agents and developers. One of its most powerful features is the ability to turn any OpenAPI/Swagger spec or Postman collection into executable CLI commands — instantly. No code generation, no SDK wrappers. Just point it at a spec, and every endpoint becomes a command you can run.&lt;/p&gt;

&lt;p&gt;This guide walks you through the full workflow: importing specs, calling endpoints, configuring auth, searching commands, and managing your imported APIs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Install Sidekick globally via npm:&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; sdkck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1: Import an OpenAPI Spec or Postman Collection
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;sdkck openapi import&lt;/code&gt; command accepts a URL or a local file path. It parses the spec and registers every operation as a runnable CLI command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From a URL:&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;sdkck openapi import https://raw.githubusercontent.com/upstash/context7/refs/heads/master/docs/openapi.json &lt;span class="nt"&gt;--name&lt;/span&gt; context7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--name&lt;/code&gt; flag gives your API a short identifier that becomes the command namespace. If you omit it, Sidekick derives a slug from the spec's title.&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%2F0fxp498xlmnh7vvrx1se.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0fxp498xlmnh7vvrx1se.gif" alt=" " width="902" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also configure auth and a custom base URL during import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck openapi import ./api.yaml &lt;span class="nt"&gt;--name&lt;/span&gt; myapi &lt;span class="nt"&gt;--auth-type&lt;/span&gt; bearer &lt;span class="nt"&gt;--token&lt;/span&gt; sk-... &lt;span class="nt"&gt;--base-url&lt;/span&gt; https://api.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: List and Call Operations
&lt;/h2&gt;

&lt;p&gt;Once imported, use &lt;code&gt;sdkck &amp;lt;API name&amp;gt;&lt;/code&gt; to see all registered operations:&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;--help&lt;/code&gt; to see the details how to use an operation&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%2Flby379ajpjomalmq2p2b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flby379ajpjomalmq2p2b.gif" alt=" " width="902" height="1142"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Configure Authentication
&lt;/h2&gt;

&lt;p&gt;Most real APIs require authentication. Sidekick supports three auth types, configured once per API so every subsequent command uses it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bearer token:&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;sdkck openapi auth petstore &lt;span class="nt"&gt;--type&lt;/span&gt; bearer &lt;span class="nt"&gt;--token&lt;/span&gt; sk-your-token-here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;API key:&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;sdkck openapi auth myapi &lt;span class="nt"&gt;--type&lt;/span&gt; apikey &lt;span class="nt"&gt;--api-key&lt;/span&gt; mykey123 &lt;span class="nt"&gt;--api-key-header&lt;/span&gt; X-API-Key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Basic auth:&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;sdkck openapi auth petstore &lt;span class="nt"&gt;--type&lt;/span&gt; basic &lt;span class="nt"&gt;--username&lt;/span&gt; user &lt;span class="nt"&gt;--password&lt;/span&gt; secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verify your auth settings:&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;sdkck openapi auth petstore &lt;span class="nt"&gt;--show&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;To remove auth from an API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck openapi auth petstore &lt;span class="nt"&gt;--type&lt;/span&gt; none
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Update API Configuration
&lt;/h2&gt;

&lt;p&gt;After importing, you can modify the API's settings without re-importing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change the base URL (e.g., switch from staging to production)&lt;/span&gt;
sdkck openapi config petstore &lt;span class="nt"&gt;--base-url&lt;/span&gt; https://api.mypetstore.com/v2

&lt;span class="c"&gt;# Rename the API namespace&lt;/span&gt;
sdkck openapi config petstore &lt;span class="nt"&gt;--rename&lt;/span&gt; mystore

&lt;span class="c"&gt;# Update the display title and description&lt;/span&gt;
sdkck openapi config petstore &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"My Petstore"&lt;/span&gt; &lt;span class="nt"&gt;--description&lt;/span&gt; &lt;span class="s2"&gt;"Internal pet store API"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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




&lt;h2&gt;
  
  
  Step 5: Remove an API
&lt;/h2&gt;

&lt;p&gt;When you no longer need an imported API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck openapi remove context7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This unregisters all the operations associated with that spec.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup Permissions
&lt;/h2&gt;

&lt;p&gt;You can lock down agent permissions for safety:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow only read operations&lt;/span&gt;
sdkck permission allow &lt;span class="s2"&gt;"petstore listPets"&lt;/span&gt;
sdkck permission allow &lt;span class="s2"&gt;"petstore getPetById"&lt;/span&gt;
sdkck permission disallow &lt;span class="s2"&gt;"petstore *"&lt;/span&gt;

&lt;span class="c"&gt;# Export permissions for team sharing&lt;/span&gt;
sdkck permission &lt;span class="nb"&gt;export &lt;/span&gt;permissions.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Import a spec&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck openapi import &amp;lt;source&amp;gt; --name &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List all APIs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck openapi list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List operations&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck &amp;lt;API name&amp;gt; --help&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure auth&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck openapi auth &amp;lt;name&amp;gt; --type bearer --token &amp;lt;token&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update config&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck openapi config &amp;lt;name&amp;gt; --base-url &amp;lt;url&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove an API&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck openapi remove &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Sidekick's OpenAPI/Postman import feature eliminates the gap between having an API spec and being able to use it. There's no code to write, no SDK to learn. Import the spec, configure auth once, and every endpoint is immediately callable from the command line — by you or by an AI agent. Combined with semantic search and a permission system, it makes any API accessible in seconds.&lt;/p&gt;

&lt;p&gt;For more details, visit the &lt;a href="https://github.com/hesedcasa/sdkck" rel="noopener noreferrer"&gt;Sidekick GitHub repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>cli</category>
      <category>oclif</category>
    </item>
    <item>
      <title>Getting Started with Sidekick (sdkck): A Complete Setup Guide</title>
      <dc:creator>Allen Tuh</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:26:12 +0000</pubDate>
      <link>https://forem.com/allentcm/getting-started-with-sidekick-sdkck-a-complete-setup-guide-460m</link>
      <guid>https://forem.com/allentcm/getting-started-with-sidekick-sdkck-a-complete-setup-guide-460m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;How to install the agentic CLI and connect it to Jira, MySQL, Sentry, and more&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Sidekick (sdkck) is an agentic CLI that supercharges your terminal with a growing library of tools delivered via plugins. Whether you're managing Jira tickets, querying databases, or triaging Sentry errors — Sidekick brings it all into one place without leaving your command line.&lt;/p&gt;

&lt;p&gt;This guide walks you through installing Sidekick and configuring authentication for three of the most commonly used integrations: Jira, MySQL, and Sentry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Node.js v20 or later&lt;br&gt;
npm installed globally&lt;br&gt;
Terminal access (macOS, Linux, or WSL on Windows)&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Install Sidekick
&lt;/h2&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; sdkck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# sdkck/0.4.0 linux-x64 node-v20.20.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To see all available commands at any time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck &lt;span class="nt"&gt;--help&lt;/span&gt;
sdkck commands
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Official Plugins — Already Included
&lt;/h2&gt;

&lt;p&gt;No need to hunt for third-party packages. Sidekick ships with a suite of &lt;strong&gt;official &lt;code&gt;@hesed&lt;/code&gt; plugins&lt;/strong&gt; that are preinstalled out of the box:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;What it connects to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/jira&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Atlassian Jira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/sentry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sentry error monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/mysql&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MySQL databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/psql&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/supabase&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Supabase database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/conni&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connection manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@hesed/bb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bitbucket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are bundled with your &lt;code&gt;sdkck&lt;/code&gt; installation — &lt;strong&gt;you do not need to run &lt;code&gt;plugins add&lt;/code&gt; for any of them.&lt;/strong&gt; They are available immediately after installing Sidekick.&lt;/p&gt;

&lt;p&gt;To confirm they are present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck plugins &lt;span class="nt"&gt;--core&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see all &lt;code&gt;@hesed/*&lt;/code&gt; plugins listed under core plugins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Additional Plugins
&lt;/h3&gt;

&lt;p&gt;If you need integrations beyond the official set, Sidekick's plugin system is fully open. Install any compatible plugin from the npm registry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck plugins add &amp;lt;plugin-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To update all plugins (official and user-installed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck plugins update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Use &lt;code&gt;sdkck search &amp;lt;query&amp;gt;&lt;/code&gt; to discover available commands across all installed plugins.&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck search jira
sdkck search &lt;span class="s2"&gt;"create issue"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 3: Connecting Jira/Confluence/Bitbucket
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@hesed/jira&lt;/code&gt; plugin is preinstalled — no setup needed on the plugin side. All you need is your Atlassian API token.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieve Your Jira API Token
&lt;/h3&gt;

&lt;p&gt;Jira uses API tokens (not passwords) for CLI and third-party authentication.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to your Atlassian account at &lt;a href="https://id.atlassian.com" rel="noopener noreferrer"&gt;https://id.atlassian.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click your &lt;strong&gt;profile avatar&lt;/strong&gt; in the top-right corner&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Account settings"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;"Security"&lt;/strong&gt; tab&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;"API token"&lt;/strong&gt;, click &lt;strong&gt;"&lt;a href="https://id.atlassian.com/manage-profile/security/api-tokens" rel="noopener noreferrer"&gt;Create and manage API tokens&lt;/a&gt;"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create API token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give it a descriptive label (e.g., &lt;code&gt;sdkck-cli&lt;/code&gt;) and click &lt;strong&gt;"Create"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the token immediately&lt;/strong&gt; — it won't be shown again&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbc4lyiqmge32fiwfmb3m.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%2Fbc4lyiqmge32fiwfmb3m.png" alt="Create token" width="600" height="402"&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%2F1w9014bkn1c90a0p5bnb.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%2F1w9014bkn1c90a0p5bnb.png" alt="Copy token" width="597" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Jira Auth in Sidekick
&lt;/h3&gt;

&lt;p&gt;Once you have your token, configure your Jira credentials. The exact command depends on your installed plugin, but the standard pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck jira auth add
&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%2F03yeavvcdfxbydb3xx3k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F03yeavvcdfxbydb3xx3k.gif" alt="Jira auth add" width="902" height="243"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Connecting MySQL/PostgreSQL
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@hesed/mysql&lt;/code&gt; and &lt;code&gt;@hesed/psql&lt;/code&gt; plugins are preinstalled. All you need are your database credentials.&lt;/p&gt;

&lt;p&gt;MySQL/PostgreSQL authentication in Sidekick uses standard database credentials. You can connect to a local or remote instance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieve Your MySQL/PostgreSQL Credentials
&lt;/h3&gt;

&lt;p&gt;You'll need the following from your database administrator or cloud provider:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;db.yourcompany.com&lt;/code&gt; or &lt;code&gt;localhost&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;&lt;code&gt;3306&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;&lt;code&gt;production_db&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck_user&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;&lt;code&gt;your_db_password&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Configure MySQL Auth in Sidekick
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck mysql auth add
&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%2Fesb6uhj4t4qczbeduym7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fesb6uhj4t4qczbeduym7.gif" alt=" " width="902" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Security tip:&lt;/strong&gt; For production environments, use a read-only database user for Sidekick to limit blast radius if credentials are ever exposed.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 5: Connecting Sentry
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@hesed/sentry&lt;/code&gt; plugin is preinstalled. Sentry uses &lt;strong&gt;Auth Tokens&lt;/strong&gt; for API access — scoped tokens that can be granted specific permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Retrieve Your Sentry Auth Token
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Log in to &lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;https://sentry.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click your &lt;strong&gt;username/avatar&lt;/strong&gt; in the bottom-left sidebar&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"User Auth Tokens"&lt;/strong&gt; (or navigate to &lt;code&gt;Settings → Account → API → Auth Tokens&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create New Token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Give it a name (e.g., &lt;code&gt;sdkck-cli&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Select the required &lt;strong&gt;scopes&lt;/strong&gt; — at minimum:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;project:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;event:read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;org:read&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create Token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy the token immediately&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flby0so4khdv0r32to9ux.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%2Flby0so4khdv0r32to9ux.png" alt="Sentry token" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Sentry Auth in Sidekick
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck sentry auth add
&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%2Flxkglwa7t8payekt7jv8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flxkglwa7t8payekt7jv8.gif" alt="Sentry auth" width="902" height="197"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;Once your integrations are configured, you can start using Sidekick's full power. Use &lt;code&gt;search&lt;/code&gt; to discover what commands are available across your plugins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Find all Jira-related commands&lt;/span&gt;
sdkck search jira

&lt;span class="c"&gt;# Find commands with full help output&lt;/span&gt;
sdkck search sentry &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Find database query commands&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"mysql query"&lt;/span&gt; &lt;span class="nt"&gt;--details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List open Jira issues assigned to you&lt;/span&gt;
sdkck jira issues &lt;span class="nt"&gt;--assignee&lt;/span&gt; me &lt;span class="nt"&gt;--status&lt;/span&gt; &lt;span class="s2"&gt;"In Progress"&lt;/span&gt;

&lt;span class="c"&gt;# Run a quick MySQL query&lt;/span&gt;
sdkck mysql query &lt;span class="s2"&gt;"SELECT COUNT(*) FROM users WHERE created_at &amp;gt; NOW() - INTERVAL 7 DAY"&lt;/span&gt;

&lt;span class="c"&gt;# Check the latest Sentry errors in a project&lt;/span&gt;
sdkck sentry issues &lt;span class="nt"&gt;--project&lt;/span&gt; my-backend &lt;span class="nt"&gt;--limit&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Managing Your Plugins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;List installed plugins&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add a plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins add &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update all plugins&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins update&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remove a plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins remove &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reset all plugins&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins reset&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspect a plugin&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sdkck plugins inspect &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Keeping Sidekick Updated
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm update &lt;span class="nt"&gt;-g&lt;/span&gt; sdkck
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never commit API tokens to version control.&lt;/strong&gt; Use &lt;code&gt;.env&lt;/code&gt; files with &lt;code&gt;.gitignore&lt;/code&gt;, or a secrets manager like 1Password CLI or AWS Secrets Manager.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the minimum required scopes.&lt;/strong&gt; When creating tokens for Jira and Sentry, only grant the permissions Sidekick actually needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate tokens regularly.&lt;/strong&gt; Treat CLI tokens the same way you'd treat production secrets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use read-only database credentials&lt;/strong&gt; for MySQL unless your workflow explicitly requires write access.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Plugin not found after install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkck plugins reset
sdkck plugins add &amp;lt;plugin-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Auth errors with Jira:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-check that your &lt;code&gt;JIRA_DOMAIN&lt;/code&gt; includes &lt;code&gt;https://&lt;/code&gt; and ends without a trailing slash&lt;/li&gt;
&lt;li&gt;Ensure the API token belongs to an account with access to the target project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MySQL connection refused:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verify the host allows connections from your IP (check firewall/security group rules)&lt;/li&gt;
&lt;li&gt;Confirm the port is correct (default &lt;code&gt;3306&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sentry token permission error:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Re-check that the token scopes include &lt;code&gt;project:read&lt;/code&gt; and &lt;code&gt;event:read&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Confirm the &lt;code&gt;--org&lt;/code&gt; slug matches exactly what appears in your Sentry URL&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;You've configured the most common integrations, but Sidekick ships with even more out of the box. The other preinstalled &lt;code&gt;@hesed&lt;/code&gt; plugins follow the same auth pattern — grab a credential from the provider dashboard and pass it in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@hesed/supabase&lt;/code&gt;&lt;/strong&gt; — uses your Supabase project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@hesed/bb&lt;/code&gt;&lt;/strong&gt; — connects to Atlassian Bitbucket&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;@hesed/conni&lt;/code&gt;&lt;/strong&gt; — connects to Atlassian Confluence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For any of these, use &lt;code&gt;sdkck search &amp;lt;plugin-name&amp;gt; -d&lt;/code&gt; to see the full list of available commands and flags.&lt;/p&gt;

&lt;p&gt;Sidekick is built to grow further. The plugin architecture means new community integrations can be added without touching the core CLI. Keep an eye on the &lt;a href="https://npmjs.org/package/sdkck" rel="noopener noreferrer"&gt;npm registry&lt;/a&gt; for new plugin releases, and use &lt;code&gt;sdkck search&lt;/code&gt; to explore everything already available.&lt;/p&gt;

&lt;p&gt;Happy building. 🛠️&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>cli</category>
      <category>oclif</category>
    </item>
    <item>
      <title>Why I Switched from MCP to CLI</title>
      <dc:creator>Allen Tuh</dc:creator>
      <pubDate>Tue, 17 Mar 2026 00:38:43 +0000</pubDate>
      <link>https://forem.com/allentcm/why-i-switched-from-mcp-to-cli-3ifb</link>
      <guid>https://forem.com/allentcm/why-i-switched-from-mcp-to-cli-3ifb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;After months wrestling with bloated context windows and flaky protocol servers, I went back to basics — and my AI coding agent finally started working the way I wanted.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I was the MCP evangelist in my team. I set up the Atlassian MCP server, the Playwright MCP, the Figma MCP and much more. Then I started actually using them with Claude Code on a real project.&lt;/p&gt;

&lt;p&gt;I keep hitting the limit on Claude Pro plan with just a few round of prompting. I check the token counter and found out that all &lt;strong&gt;the MCP servers have took up almost 40% to 50% of the context window before the agent did a single useful thing!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That was the moment I uninstalled everything and opened a terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP promise vs. the MCP reality
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol arrived in late 2024 with enormous backing. Every major AI provider endorsed it. The pitch was clean: one standard protocol, any AI model, any tool. Build an MCP server for your database and every AI client could query it. No more per-client glue code.&lt;/p&gt;

&lt;p&gt;In theory, beautiful. In practice, the seams show quickly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What actually happens when MCP loads&lt;/p&gt;

&lt;p&gt;A standard Atlassian MCP server dumps its entire tool schema into your context window on initialization — all 73 tools, their parameter descriptions, authentication flows, state management instructions. Your agent hasn't done anything yet, and roughly 40% of your context budget is already gone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The deeper problem is architectural. MCP asks AI models to operate through an abstraction layer they were never trained on. Claude, GPT-4, Gemini — these models have been trained on billions of lines of terminal interactions. Stack Overflow answers, GitHub READMEs, documentation, tutorials — all of it is saturated with shell commands. They know &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;gh&lt;/code&gt;, &lt;code&gt;docker&lt;/code&gt;, &lt;code&gt;kubectl&lt;/code&gt; as fluently as a senior engineer who's been at the terminal for a decade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP schemas? Zero training data. The model is improvising every time.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why CLI wins for developer workflows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Self-documenting by design.&lt;/strong&gt; Every CLI tool ships with &lt;code&gt;--help&lt;/code&gt; and man pages. The agent can explore what a command does, drill into subcommands, and discover options — all without an external schema definition. No MCP server to maintain, no schema to keep in sync.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composability built over 50 years.&lt;/strong&gt; Unix pipes. Output routing. Chaining. Parallel execution with &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt;. MCP is designing in 2025–2026 what Unix figured out in the 1970s and spent five decades debugging. CLI composability carries the reliability of a v50 system. MCP composability is v0.1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMs just know this stuff.&lt;/strong&gt; The model has seen &lt;code&gt;find . -name "*.ts" | xargs grep "import"&lt;/code&gt; ten thousand times. It improvises novel combinations because the composability grammar is embedded in its weights. When it hits an error, it knows how to parse &lt;code&gt;stderr&lt;/code&gt;, adjust flags, and retry. That fluency simply doesn't exist for MCP tool chains.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Tool results and definitions can sometimes consume 50,000+ tokens before an agent reads a request... At Anthropic, we've seen tool definitions consume 134K tokens before optimization." - &lt;a href="https://www.anthropic.com/engineering/advanced-tool-use" rel="noopener noreferrer"&gt;Anthropic Engineering Blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;"Previously, the Projects toolset, as with other now-consolidated toolsets, used a significant portion of the context window for the tools list. As a result, we've reduced token usage by around 23,000 tokens (50%)." - &lt;a href="https://github.blog/changelog/2026-01-28-github-mcp-server-new-projects-tools-oauth-scope-filtering-and-new-features" rel="noopener noreferrer"&gt;GitHub Changelog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;"&lt;a href="https://x.com/steipete/status/2007876353463660757?s=20" rel="noopener noreferrer"&gt;MCP were a mistake. Bash is better.&lt;/a&gt;" - Peter Steinberger, creator of OpenClaw&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introducing Sidekick
&lt;/h2&gt;

&lt;p&gt;This brings me to a project I've been using heavily: Sidekick (sdkck). It's an open-source agentic CLI built to give AI coding agents like Claude Code a clean, composable, extensible interface to the tools they need — without the MCP overhead.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/hesedcasa" rel="noopener noreferrer"&gt;
        hesedcasa
      &lt;/a&gt; / &lt;a href="https://github.com/hesedcasa/sdkck" rel="noopener noreferrer"&gt;
        sdkck
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Agentic CLI that provides multiple tools via plugins
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt; ____  _     _      _    _      _
/ ___|(_) __| | ___| | _(_) ___| | __
\___ \| |/ _` |/ _ \ |/ / |/ __| |/ /
 ___) | | (_| |  __/   &amp;lt;| | (__|   &amp;lt; 
|____/|_|\__,_|\___|_|\_\_|\___|_|\_\

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Sidekick (sdkck)&lt;/h1&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;The Best Companion Tool for AI Agents&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;One CLI to search, connect, and command every tool in your stack. Zero context window bloat. Maximum productivity.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://npmjs.org/package/sdkck" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dd841e07e4480eca8963a5c01038ab1b4ae84d2f5ff2dadcbe333ed10bc2e214/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f73646b636b2e737667" alt="Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/hesedcasa/sdkck/blob/main/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/798509b4df525f56802b56f8096862487f08023e3d7561c68656f8dab10d0d6e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4170616368652d2d322e302d626c75652e737667" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://npmjs.org/package/sdkck" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a370166c0b6b55a987387f3f7e58ae1a3955a48b84327ee956019f17887c89ff/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f64772f73646b636b2e737667" alt="Downloads/week"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Key Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Instant Commands from OpenAPI/Postman&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Point Sidekick at any OpenAPI/Swagger spec or Postman collection — local file or URL — and every endpoint becomes a CLI command instantly.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Import an OpenAPI spec from a URL or local file&lt;/span&gt;
sdkck openapi import https://petstore3.swagger.io/api/v3/openapi.json --name petstore
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Import a Postman collection the same way&lt;/span&gt;
sdkck openapi import ./postman_collection.json --name myapi

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Every operation is now a real command&lt;/span&gt;
sdkck petstore listPets
sdkck petstore getPetById --param petId=42
sdkck petstore createPet --body name=Fido --body tag=dog

&lt;/pre&gt;…
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/hesedcasa/sdkck" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;What makes Sidekick interesting isn't just what it does — it's how it fits into AI-first workflows. Because it's a standard CLI, Claude Code and other agents can discover its capabilities naturally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Agent discovers available commands&lt;/span&gt;
sdkck &lt;span class="nt"&gt;--help&lt;/span&gt;

&lt;span class="c"&gt;# Search for specific functionality&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"create pr"&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"jira"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"update issue"&lt;/span&gt; &lt;span class="nt"&gt;--details&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The search command is the key insight. Instead of dumping your entire tool catalogue into context, an agent can query for exactly what it needs in the moment. This is context efficiency by design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Sidekick with Claude Code
&lt;/h2&gt;

&lt;p&gt;Here's how to set this up. First, install Sidekick and any plugins your workflow needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Sidekick globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; sdkck

&lt;span class="c"&gt;# Install plugins (community or your own)&lt;/span&gt;
sdkck plugins add myplugin
sdkck plugins add someuser/someplugin

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
sdkck version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then document it in your &lt;code&gt;CLAUDE.md&lt;/code&gt; at the project root. This is the equivalent of an MCP server config — except it costs zero tokens at load time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# CLAUDE.md&lt;/span&gt;

&lt;span class="gu"&gt;## Available CLI Tools&lt;/span&gt;

sdkck is installed and available. Use it for task and issue management.

&lt;span class="gu"&gt;### Discovery&lt;/span&gt;
sdkck search "&lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt;"          # find relevant commands
sdkck search "&lt;span class="nt"&gt;&amp;lt;query&amp;gt;&lt;/span&gt;" -d       # detailed help for each result
sdkck --help                     # full command list

&lt;span class="gu"&gt;### Workflow&lt;/span&gt;
Always search before assuming a command exists.
Prefer composing sdkck commands with standard Unix pipes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Claude Code encounters a task, it searches first, then acts. Here's what that looks like in practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code working on a feature branch&lt;/span&gt;

&lt;span class="c"&gt;# 1. Search for relevant commands&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"create pr"&lt;/span&gt; &lt;span class="nt"&gt;--details&lt;/span&gt;

&lt;span class="c"&gt;# 2. Compose with existing tools&lt;/span&gt;
gh &lt;span class="nb"&gt;pr &lt;/span&gt;create &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"feat: add auth"&lt;/span&gt; &lt;span class="nt"&gt;--body&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;PR_TEMPLATE.md&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 3. Chain with other commands naturally&lt;/span&gt;
sdkck search &lt;span class="s2"&gt;"jira"&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Extending Sidekick with Plugins
&lt;/h2&gt;

&lt;p&gt;The plugin system is where Sidekick becomes genuinely powerful. You can build and link your own tools for development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install a plugin from a github url.&lt;/span&gt;
sdkck plugins &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/someuser/someplugin

&lt;span class="c"&gt;# Inspect what got installed&lt;/span&gt;
sdkck plugins inspect my-jira-plugin

&lt;span class="c"&gt;# List all installed plugins&lt;/span&gt;
sdkck plugins

&lt;span class="c"&gt;# Keep plugins updated&lt;/span&gt;
sdkck plugins update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For other coding agents — Cursor, Copilot, Kiro, OpenClaw — the integration pattern is the same: document &lt;strong&gt;Sidekick&lt;/strong&gt; in whatever context file the agent reads (AGENT.md, .cursorrules, agent instructions), and let the agent discover capabilities through &lt;code&gt;sdkck search&lt;/code&gt; rather than preloading schemas.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Nuance
&lt;/h2&gt;

&lt;p&gt;I want to be fair here: MCP isn't bad. It has a legitimate use case, and writing it off entirely would be intellectually dishonest.&lt;/p&gt;

&lt;p&gt;For 80–90% of developer-facing use cases — building features, running tests, managing git, automating your own workflows — CLI is the faster, cheaper, more reliable path. For multi-tenant products where your agent acts on behalf of customers inside their organizations, MCP's governance model earns its overhead.&lt;/p&gt;

&lt;p&gt;The smartest teams in 2026 aren't picking sides. They're using CLI for development workflows and MCP for customer-facing compliance-sensitive features. But if you're a developer automating your own stack, there's no reason to carry MCP's weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;If you want to try this approach today:&lt;br&gt;
Detail guide can be found &lt;a href="https://dev.to/allentcm/getting-started-with-sidekick-sdkck-a-complete-setup-guide-460m"&gt;here&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Sidekick&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; sdkck

&lt;span class="c"&gt;# Explore what's available&lt;/span&gt;
sdkck commands
sdkck search &lt;span class="s2"&gt;"anything"&lt;/span&gt;

&lt;span class="c"&gt;# In your project root&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"sdkck is available. Use 'sdkck search &amp;lt;query&amp;gt;' to find commands."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No JSON config. No SSE server. No schema dumped into your context. Just a tool your agent can pick up and use.&lt;/p&gt;

&lt;p&gt;The Unix philosophy — small, composable tools that do one thing well — has proven remarkably durable. Fifty years later, it turns out it's also the best interface we've built for AI agents. Not because we planned it that way. Because we already spent fifty years making it work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>oclif</category>
    </item>
    <item>
      <title>Using Claude Code with GitHub Copilot Subscription</title>
      <dc:creator>Allen Tuh</dc:creator>
      <pubDate>Wed, 22 Oct 2025 06:24:17 +0000</pubDate>
      <link>https://forem.com/allentcm/using-claude-code-with-github-copilot-subscription-2obj</link>
      <guid>https://forem.com/allentcm/using-claude-code-with-github-copilot-subscription-2obj</guid>
      <description>&lt;p&gt;Do you have a Github Copilot subscription sitting around doing nothing? Why not pair it with the Claude Code (claimed by many developers as the best AI coding agent thus far).&lt;/p&gt;

&lt;h2&gt;
  
  
  A. Using LiteLLM
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install Python on your local machine&lt;/li&gt;
&lt;li&gt;Setup &lt;a href="https://docs.litellm.ai/docs/#quick-start-proxy---cli" rel="noopener noreferrer"&gt;LiteLLM&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Create a folder for LiteLLM e.g.: litellm&lt;/li&gt;
&lt;li&gt;Create a config.yaml file with the below content in the litellm folder
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model_list:
  - model_name: anthropic/*
    litellm_params:
      model: github_copilot/gpt-5-mini
      extra_headers: {"editor-version": "vscode/1.85.1", "Copilot-Integration-Id": "vscode-chat"}
  - model_name: anthropic/*
    litellm_params:
      model: github_copilot/claude-sonnet-4.5
      extra_headers: {"editor-version": "vscode/1.85.1", "Copilot-Integration-Id": "vscode-chat"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Start the litellm proxy server
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;litellm --config config.yaml
&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%2Fwzgu7xtylooww9lc3149.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%2Fwzgu7xtylooww9lc3149.png" alt=" " width="800" height="682"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  B. Using Copilot API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;First you need to setup GitHub Copilot API proxy&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install -g copilot-api&lt;/code&gt; to install the API proxy&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;copilot-api start&lt;/code&gt; to start the proxy server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymnocgpdejureq70evw1.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%2Fymnocgpdejureq70evw1.png" alt=" " width="800" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Claude Code
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Now install Claude Code in your local machine&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install -g @anthropic-ai/claude-code&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Edit the config file &lt;code&gt;.claude/settings.json&lt;/code&gt; for Claude Code to use the LiteLLM or Copilot API proxy server instead of the default Claude subscription which is more expensive&lt;/li&gt;
&lt;li&gt;Add this settings into the config file&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;LiteLLM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "env": {
    "ANTHROPIC_BASE_URL": "http://0.0.0.0:4000",
    "ANTHROPIC_AUTH_TOKEN": "sk-litellm-static-key",
    "ANTHROPIC_MODEL": "github_copilot/claude-sonnet-4.5",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "github_copilot/gpt-5-mini",
    "DISABLE_NON_ESSENTIAL_MODEL_CALLS": "1",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "env": {
    "ANTHROPIC_BASE_URL": "http://localhost:4141",
    "ANTHROPIC_AUTH_TOKEN": "sk-dummy",
    "ANTHROPIC_MODEL": "claude-sonnet-4.5",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gpt-5-mini",
    "DISABLE_NON_ESSENTIAL_MODEL_CALLS": "1",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start your Claude Code and enjoy coding!&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%2F9pv33efjwdrspcqtl03o.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%2F9pv33efjwdrspcqtl03o.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>I hacked Sonoff RF Bridge to control my ceiling fan lights</title>
      <dc:creator>Allen Tuh</dc:creator>
      <pubDate>Mon, 20 Oct 2025 08:03:19 +0000</pubDate>
      <link>https://forem.com/allentcm/i-hacked-sonoff-rf-bridge-to-control-my-ceiling-fan-lights-5hbd</link>
      <guid>https://forem.com/allentcm/i-hacked-sonoff-rf-bridge-to-control-my-ceiling-fan-lights-5hbd</guid>
      <description>&lt;p&gt;I have the Home Assistant setup in my house. I installed 4 ceiling fan lights in my house. Each ceiling fan light is connected to a smart switch. However, only the light will turn on when I turn on the switch. To turn on the fan, I need to use the remote control. This isn't very pleasant for a person who likes conveniences such as me.&lt;/p&gt;

&lt;p&gt;I must do something to satisfy my "laziness". Basically to be able to control the ceiling fan light, first, you need to find out the RF signals the remote control sends to the ceiling fan lights, then you need to be able to replicate these RF signals via other means or hardware. I came across a few solutions:&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Duplicate the remote control circuit
&lt;/h3&gt;

&lt;p&gt;This solution involves opening up my current remote controller to decode the RF signal used to control the fan, which is a NO-NO for me because my remote controller is sealed tight. I also do not have the resources to build a circuit board. However, if you are interested you can refer to this &lt;a href="https://youtu.be/HGYSuoNjKs0?si=BcGHjVUy4sAgR53H" rel="noopener noreferrer"&gt;video tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Replace with Tuya WiFi smart remote control kit
&lt;/h3&gt;

&lt;p&gt;This solution is more straightforward. You just need to buy a new remote control kit &lt;a href="https://www.aliexpress.com/w/wholesale-fan-light-remote-control-tuya.html?spm=a2g0o.productlist.search.0" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Tuya allows you to integrate directly with Home Assistant. Since my fans are new and I don't want to break my warranty, I will skip this solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  C. Install Sonoff RF bridge
&lt;/h3&gt;

&lt;p&gt;This solution is very challenging and has a lot of roadblocks. I was not aware of what I was getting myself into. Initially, I thought I just going to buy and install a Sonoff RF bridge and I am done. Boy, I was so wrong!&lt;/p&gt;

&lt;h3&gt;
  
  
  Journey to hack the Sonoff RF bridge
&lt;/h3&gt;

&lt;p&gt;Sonoff RF bridge was only compatible with the Sonoff family of RF devices, so no luck with my ceiling fan lights. However, I came across several projects that hack the Sonoff RF bridge to work with more RF devices. These projects give me hope. I tried every single one of them and finally made one of them work with my ceiling fan lights. I will list down all the relevant projects, but will only emphasize the one that work for me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/schmurtzm/RFLink32-For-Sonoff-RF-Bridge" rel="noopener noreferrer"&gt;RFLink32 for Sonoff RF Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/xoseperez/espurna/wiki/Hardware-Itead-Sonoff-RF-Bridge" rel="noopener noreferrer"&gt;ESPurna&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tasmota.github.io/docs/devices/Sonoff-RF-Bridge-433/" rel="noopener noreferrer"&gt;Tasmota&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openmqttgateway.com/setitup/rf.html#sonoff-rf-bridge-hardware-setup" rel="noopener noreferrer"&gt;OpenMQTTGateway&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  OMG! It works!
&lt;/h3&gt;

&lt;p&gt;After countless weeks of trying, I finally got OMG(OpenMQTTGateway) to work on the Sonoff RF bridge and control all my ceiling fan lights from Home Assistant. Here is the step-by-step guide:&lt;/p&gt;

&lt;h4&gt;
  
  
  Prerequisite
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.aliexpress.com/w/wholesale-sonoff-rf-bridge.html?spm=a2g0o.home.search.0" rel="noopener noreferrer"&gt;Sonoff RF Bridge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.aliexpress.com/item/1005006173485270.html?spm=a2g0o.order_list.order_list_main.28.55211802aYCd6M" rel="noopener noreferrer"&gt;USB to serial adapter&lt;/a&gt; (for flashing firmware)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.aliexpress.com/w/wholesale-digital-tv-usb-stick-sdr.html?spm=a2g0o.productlist.search.0" rel="noopener noreferrer"&gt;Software-Defined Radio(SDR)&lt;/a&gt; (to decode the RF signal)&lt;/li&gt;
&lt;li&gt;Soldering kit&lt;/li&gt;
&lt;li&gt;Some programming knowledge&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  1. Hack the PCB board
&lt;/h4&gt;

&lt;p&gt;If you bought a Sonoff RF bridge from the Internet, most likely it will be version &lt;strong&gt;R2 V2.2&lt;/strong&gt;. If you have other versions, please refer &lt;a href="https://github.com/xoseperez/espurna/wiki/Hardware-Itead-Sonoff-RF-Bridge---Direct-Hack" rel="noopener noreferrer"&gt;here&lt;/a&gt;. Solder a jumper from the pin &lt;strong&gt;USBRXD&lt;/strong&gt; to the target pin of the receiver chip and another one from the pin &lt;strong&gt;USBTXD&lt;/strong&gt; to the target pin of the transmitter chip as shown in the photo below. I get the circuit modification from &lt;a href="https://community.home-assistant.io/t/new-sonoff-rf-bridge-board-need-flashing-help/344326/23" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&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%2Flxervmxlmu35euvzdk40.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%2Flxervmxlmu35euvzdk40.jpg" alt=" " width="800" height="778"&gt;&lt;/a&gt;&lt;br&gt;
Flip to the back side of the PCB and cut off the traces at the 2 points shown in the photo below.&lt;br&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%2Fha6sgtm1o0kqudxsmhv1.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%2Fha6sgtm1o0kqudxsmhv1.jpg" alt=" " width="800" height="795"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Create the custom firmware
&lt;/h4&gt;

&lt;p&gt;Obviously, we are going to load the OMG firmware. As of the moment only &lt;strong&gt;v0.9.16&lt;/strong&gt; works. Check out the v0.9.16 of the OMG repo from &lt;a href="https://github.com/theengs/OpenMQTTGateway" rel="noopener noreferrer"&gt;https://github.com/theengs/OpenMQTTGateway&lt;/a&gt;. OMG is developed with PlatformIO so setup your IDE accordingly (&lt;a href="https://platformio.org/platformio-ide" rel="noopener noreferrer"&gt;https://platformio.org/platformio-ide&lt;/a&gt;).&lt;br&gt;
Create a prod_env.ini file to be able to connect to the house WiFi network and talk to the Home Assistant via MQTT protocol. Here is the example file I created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[platformio]
default_envs = rfbridge-direct-1

[env:rfbridge-direct-1]
platform = ${com.esp8266_platform}
board = esp8285
lib_deps =
  ${com-esp.lib_deps}
  ${libraries.wifimanager8266}
  ${libraries.esppilight}
build_flags =
  ${com-esp.build_flags}
  '-DZgatewayPilight="Pilight"'
  '-DRF_RECEIVER_GPIO=4'
  '-DRF_EMITTER_GPIO=5'
  '-DLED_INFO=13'
  '-DLED_INFO_ON=0'
  '-DZsensorGPIOInput="GPIOInput"'
  '-DINPUT_GPIO=0'
  '-fcommon'
  '-DESPWifiManualSetup=true'
  '-DGateway_Name="OMGSonoff"'
  '-Dgw_password="password"'
  '-Dwifi_ssid="MYWIFI"'
  '-Dwifi_password="password"'
  '-DNetworkAdvancedSetup=true'
  '-DNET_IP="192.168.1.605"'
  '-DNET_MASK="255.255.255.0"'
  '-DNET_GW="192.168.1.254"'
  '-DBase_Topic="omgsonoff/"'
  '-DMQTT_USER="mqtt-user"'
  '-DMQTT_PASS="password"'
  '-DMQTT_SERVER="192.168.1.501"'
board_build.flash_mode = dout
board_build.ldscript = eagle.flash.1m64.ld ;this frees more space for firmware upload via OTA.
custom_description = RF gateway for the Sonoff RF Bridge requiring direct hack, relying on ESPilight library, [tutorial](https://1technophile.blogspot.com/2019/04/sonoff-rf-bridge-pilight-or-how-to.html).
custom_hardware = RFBridge v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the below settings accordingly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dwifi_ssid: your house's WiFi SSID&lt;/li&gt;
&lt;li&gt;Dwifi_password: WiFi password&lt;/li&gt;
&lt;li&gt;DNET_IP: Static IP for the Sonoff RF Bridge&lt;/li&gt;
&lt;li&gt;DNET_MASK: Subnet mask&lt;/li&gt;
&lt;li&gt;DNET_GW: Gateway IP&lt;/li&gt;
&lt;li&gt;DMQTT_USER: MQTT user created in Home Assistant&lt;/li&gt;
&lt;li&gt;DMQTT_PASS: MQTT user password&lt;/li&gt;
&lt;li&gt;DMQTT_SERVER: MQTT server usually is the IP for your Home Assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After successfully building the OMG project, you will get the firmware file.&lt;br&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%2Fd10ubri35tjjuuvkrl7x.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%2Fd10ubri35tjjuuvkrl7x.png" alt=" " width="800" height="879"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Flash the firmware
&lt;/h4&gt;

&lt;p&gt;Sonoff is using the ESP8266 chip which makes flashing custom firmware possible. Solder 4 headers to the 4 programming pins on the PCB. Connect the serial adapter to the programming headers as shown below: Always ensure that the voltage setting on the adapter is 3.3V.&lt;br&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%2Fz99nnhwge2qguw574c4b.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%2Fz99nnhwge2qguw574c4b.jpg" alt=" " width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download and install the &lt;a href="https://docs.espressif.com/projects/esptool/en/latest/esp32/installation.html#installation" rel="noopener noreferrer"&gt;ESPTool&lt;/a&gt;. Make a backup of the original firmware by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esptool.py --port /dev/cu.usbserial-21420 read_flash 0x00000 0x100000 esp-1MB-backup.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clear the firmware on the chip by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esptool.py erase_flash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flash the custom firmware to the chip by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;esptool.py --chip esp8266 --port /dev/cu.usbserial-21420 write_flash --flash_size detect --flash_mode dout 0x00000 firmware.bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can refer to this &lt;a href="https://tasmota.github.io/docs/devices/Sonoff-RF-Bridge-433/#video-tutorial-by-alsolh" rel="noopener noreferrer"&gt;video tutorial&lt;/a&gt;. Plug in the Sonoff RF Bridge to the power supply and you should see the blue LED turn on.&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%2Fk7wj6zlrzczibqyml7mc.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%2Fk7wj6zlrzczibqyml7mc.jpg" alt=" " width="800" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Connect OMG to Home Assistant via MQTT
&lt;/h4&gt;

&lt;p&gt;Install &lt;a href="https://www.home-assistant.io/integrations/mqtt" rel="noopener noreferrer"&gt;MQTT&lt;/a&gt; and Mosquitto broker add-on in Home Assistant. I will not go through the process here. Create the MQTT user in Home Assistant to allow OMG to connect to the Home Assistant with this user. The username and password MUST match the one we set in &lt;strong&gt;Step 2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3pfiznn3tdyekb386yg.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%2Fq3pfiznn3tdyekb386yg.png" alt=" " width="800" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is setup correctly, you will see this in the Mosquitto broker log.&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%2Fznfpigx7u9gv0csza2wk.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%2Fznfpigx7u9gv0csza2wk.png" alt=" " width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Hack the ceiling fan light RF signal
&lt;/h4&gt;

&lt;p&gt;Plug in the SDR into your Laptop and install &lt;a href="https://github.com/jopohl/urh" rel="noopener noreferrer"&gt;Universal Radio Hacker (URH)&lt;/a&gt; software. Get your ceiling fan light remote control ready and record the RF signal with URH. Usually, the RF frequency is 433.92M.&lt;/p&gt;

</description>
      <category>homeassistant</category>
      <category>sonoff</category>
      <category>openmqttgateway</category>
    </item>
  </channel>
</rss>
