<?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>DEV Community: Tim Kulbaev</title>
    <description>The latest articles on DEV Community by Tim Kulbaev (@tim_kulbaev).</description>
    <link>https://dev.to/tim_kulbaev</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%2F3822480%2Ff445d323-6862-4be5-a558-c3514dfa801d.jpg</url>
      <title>DEV Community: Tim Kulbaev</title>
      <link>https://dev.to/tim_kulbaev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tim_kulbaev"/>
    <language>en</language>
    <item>
      <title>The AI that helped you build it can post about it — from the same session</title>
      <dc:creator>Tim Kulbaev</dc:creator>
      <pubDate>Fri, 13 Mar 2026 14:36:01 +0000</pubDate>
      <link>https://dev.to/tim_kulbaev/the-ai-that-helped-you-build-it-can-post-about-it-from-the-same-session-1mp5</link>
      <guid>https://dev.to/tim_kulbaev/the-ai-that-helped-you-build-it-can-post-about-it-from-the-same-session-1mp5</guid>
      <description>&lt;p&gt;Here's the thing about building in public: the best posts come from the moment something clicks. Not from a content calendar. Not from a "let me write about what I shipped last Tuesday" session two days later.&lt;/p&gt;

&lt;p&gt;The insight is sharpest when it's fresh. But by the time you've switched apps, opened LinkedIn, and started typing, that sharpness is gone.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/timkulbaev/mcp-linkedin" rel="noopener noreferrer"&gt;mcp-linkedin&lt;/a&gt; to fix this — not as a scheduling tool, but as a way to publish &lt;em&gt;from the same session where something happened&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The actual unlock
&lt;/h2&gt;

&lt;p&gt;When you've been working with Claude Code or Cursor for two hours, your AI assistant has complete context of everything that happened. It knows what you tried, what failed, what surprised you, and what the insight was.&lt;/p&gt;

&lt;p&gt;You can just say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Write a LinkedIn post about what we just built. 
Lead with the surprising part."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it produces something specific and sharp — because it was there. It doesn't need to be told what the project is, what the insight was, or what tone to use. It already knows.&lt;/p&gt;

&lt;p&gt;That's not possible from a scheduled pipeline. A pipeline doesn't know you spent three hours debugging something and the lesson was unexpected. The same-session context &lt;em&gt;is&lt;/em&gt; the value.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mcp-linkedin&lt;/code&gt; is an MCP server that gives your AI assistant four native tools: &lt;code&gt;linkedin_publish&lt;/code&gt;, &lt;code&gt;linkedin_comment&lt;/code&gt;, &lt;code&gt;linkedin_react&lt;/code&gt;, and &lt;code&gt;linkedin_delete_post&lt;/code&gt;. Once registered in your MCP config, your AI can publish without you opening a browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Me: "Turn what we just shipped into a LinkedIn post. Under 200 chars."

Claude: [writes post, previews it, waits for my confirmation]

Me: "Good, publish."

Claude: [publishes, auto-likes, returns the clickable URL]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under 60 seconds. Zero context switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it differs from every other MCP LinkedIn tool
&lt;/h2&gt;

&lt;p&gt;There are about a dozen MCP LinkedIn servers on GitHub. They fall into two camps — and both have problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser automation tools&lt;/strong&gt; (the most common approach) drive a headless Playwright instance to simulate clicking around LinkedIn. They break whenever LinkedIn changes their DOM. They require an active browser session. They're fragile by design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LinkedIn API tools&lt;/strong&gt; use the official API — which requires going through LinkedIn's partner approval process. Good luck with that.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcp-linkedin&lt;/code&gt; uses &lt;a href="https://www.unipile.com" rel="noopener noreferrer"&gt;Unipile&lt;/a&gt; as the API bridge. Unipile handles LinkedIn OAuth so you don't need API approval, and there's no browser to break. It's the only MCP LinkedIn server that takes this approach.&lt;/p&gt;

&lt;p&gt;On top of that, two things none of the others do:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Dry run is on by default — publishing is a two-step confirmation
&lt;/h3&gt;

&lt;p&gt;Every call to &lt;code&gt;linkedin_publish&lt;/code&gt; defaults to &lt;code&gt;dry_run: true&lt;/code&gt;. The AI produces a preview — final text, character count, media validation, resolved @mentions — and shows it to you before anything goes live.&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"preview"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"post_text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Spent 3 hours on this config. The lesson was not what I expected."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"character_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ready_to_publish"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after you confirm does it publish. The AI cannot skip this step. That matters when your AI assistant is running autonomously — you don't want it deciding on its own that &lt;em&gt;now&lt;/em&gt; is a good time to post.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Ships with a SKILL.md — the AI knows the correct workflow
&lt;/h3&gt;

&lt;p&gt;I checked every MCP LinkedIn repo on GitHub. None of them ship a &lt;code&gt;SKILL.md&lt;/code&gt;. They're just tool definitions — they tell the AI what the tools do, not how to use them safely.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mcp-linkedin&lt;/code&gt; ships with a &lt;code&gt;SKILL.md&lt;/code&gt; that Claude Code loads automatically. It tells the AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always preview before publishing&lt;/li&gt;
&lt;li&gt;Never publish without explicit confirmation&lt;/li&gt;
&lt;li&gt;Always return the clickable post URL after publishing&lt;/li&gt;
&lt;li&gt;How to handle every error state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't have to remind it. The correct workflow is part of the tool.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/timkulbaev/mcp-linkedin.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mcp-linkedin
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign up for &lt;a href="https://www.unipile.com" rel="noopener noreferrer"&gt;Unipile&lt;/a&gt;, connect your LinkedIn account, get your API key and DSN. Free tier covers standard usage.&lt;/p&gt;

&lt;p&gt;Add to &lt;code&gt;~/.claude/mcp.json&lt;/code&gt;:&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;"linkedin"&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;"node"&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;"/absolute/path/to/mcp-linkedin/index.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"UNIPILE_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;"your-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;"UNIPILE_DSN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apiXX.unipile.com:XXXXX"&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;Restart Claude Code. Done.&lt;/p&gt;




&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;I went from posting once a week to 4–5 times a week. Not because I changed my habits — because the post now happens in the same session where the insight happened.&lt;/p&gt;

&lt;p&gt;The AI already has the context. The friction is gone. The moment doesn't pass.&lt;/p&gt;

&lt;p&gt;MIT licensed, 28 unit tests, Claude Code + Cursor + Windsurf compatible: &lt;a href="https://github.com/timkulbaev/mcp-linkedin" rel="noopener noreferrer"&gt;github.com/timkulbaev/mcp-linkedin&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tim Kulbaev is an AI automation consultant at TMC AI, helping companies build automated workflows with AI. &lt;a href="https://timconsulting.co" rel="noopener noreferrer"&gt;timconsulting.co&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
