<?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: Aadhin Karthik</title>
    <description>The latest articles on DEV Community by Aadhin Karthik (@aadhin_karthik_4e695b420a).</description>
    <link>https://dev.to/aadhin_karthik_4e695b420a</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%2F3781371%2Fcf598614-d080-4807-b09b-7960607b57c5.jpg</url>
      <title>DEV Community: Aadhin Karthik</title>
      <link>https://dev.to/aadhin_karthik_4e695b420a</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aadhin_karthik_4e695b420a"/>
    <language>en</language>
    <item>
      <title>Building a Fully Automated SonarCloud Pipeline Using Claude's MCP</title>
      <dc:creator>Aadhin Karthik</dc:creator>
      <pubDate>Sat, 21 Feb 2026 15:15:20 +0000</pubDate>
      <link>https://dev.to/aadhin_karthik_4e695b420a/building-a-fully-automated-sonarcloud-pipeline-using-claudes-mcp-2il4</link>
      <guid>https://dev.to/aadhin_karthik_4e695b420a/building-a-fully-automated-sonarcloud-pipeline-using-claudes-mcp-2il4</guid>
      <description>&lt;p&gt;Day X of solving real-world problems with Claude Code&lt;/p&gt;



&lt;p&gt;&lt;small&gt;I wanted SonarCloud code quality reports without constantly switching between my terminal, GitHub, and SonarCloud's web UI. &lt;strong&gt;The Goal:&lt;/strong&gt; Type one command in Claude Code and get a full quality report back—instantly.&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Here's Everything That Went Wrong (&amp;amp; Right)
&lt;/h4&gt;

&lt;p&gt;&lt;small&gt;Turns out, Claude Code's MCP (Model Context Protocol) ecosystem makes this possible — but getting there involved 9 distinct failures, 3 PAT permission updates, and one important discovery about how GitHub reports CI status.&lt;/small&gt;&lt;/p&gt;




&lt;h3&gt;What I Built&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;A fully automated pipeline:&lt;/small&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You write code
  → Claude commits &amp;amp; pushes
    → Creates PR via GitHub MCP
      → GitHub Actions runs sonar-scanner
        → Claude polls for completion
          → Pulls report via SonarQube MCP
            → Shows quality gate + issues table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;small&gt;⏱ Total time&lt;/small&gt;
&lt;/th&gt;
&lt;td&gt;&lt;small&gt;~2.5 minutes (commit to report)&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;small&gt;🖐 Manual steps&lt;/small&gt;
&lt;/th&gt;
&lt;td&gt;&lt;small&gt; 0 (after one-time setup)&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;The Stack&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;small&gt;Component&lt;/small&gt;&lt;/th&gt;
&lt;th&gt;&lt;small&gt;Role&lt;/small&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Claude Code CLI&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Orchestrator&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcp/sonarqube&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Reads SonarCloud data — quality gates, issues, metrics&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;&lt;code&gt;ghcr.io/github/github-mcp-server&lt;/code&gt;&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Manages repos, branches, PRs&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;GitHub Actions&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Runs the sonar-scanner&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;SonarCloud (free tier)&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Hosts analysis results&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;Setup: The Happy Path (~30 min)&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;1. SonarCloud&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Import your project via "Analyze new project" (don't create manually). Disable Automatic Analysis. Generate a &lt;b&gt;Project Analysis Token&lt;/b&gt; (not a user token — this matters, see Challenge #3).&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. GitHub PAT (Fine-grained)&lt;/b&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;small&gt;Permission&lt;/small&gt;&lt;/th&gt;
&lt;th&gt;&lt;small&gt;Level&lt;/small&gt;&lt;/th&gt;
&lt;th&gt;&lt;small&gt;Why&lt;/small&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Contents&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read &amp;amp; Write&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Push files&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Workflows&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read &amp;amp; Write&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Create &lt;code&gt;.github/workflows/&lt;/code&gt; files&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Actions&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read &amp;amp; Write&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Manage workflow runs&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Pull requests&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read &amp;amp; Write&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Create PRs&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Commit statuses&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Poll CI status&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Metadata&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Read&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Required&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;small&gt; Missing &lt;strong&gt;any one&lt;/strong&gt; of these causes 403 errors at different stages. Workflows and Commit statuses are the most commonly missed.&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. MCP Servers&lt;/b&gt;&lt;br&gt;
&lt;small&gt;&lt;/small&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;# Pull Docker images&lt;/span&gt;
docker pull mcp/sonarqube
docker pull ghcr.io/github/github-mcp-server

&lt;span class="c"&gt;# Add to Claude Code (run from terminal, not inside Claude)&lt;/span&gt;
claude mcp add sonarqube &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;SONARQUBE_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;SONARQUBE_ORG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; docker run &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_TOKEN &lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_ORG mcp/sonarqube

claude mcp add github &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;GITHUB_PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--&lt;/span&gt; docker run &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; GITHUB_PERSONAL_ACCESS_TOKEN &lt;span class="se"&gt;\&lt;/span&gt;
       ghcr.io/github/github-mcp-server

&lt;span class="c"&gt;# RESTART Claude Code (MCP servers only load on startup)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;b&gt;4. GitHub Actions Workflow&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Two files needed in your repo:&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sonar-project.properties&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sonar.projectKey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;YourOrg_yourrepo&lt;/span&gt;
&lt;span class="py"&gt;sonar.organization&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yourorg&lt;/span&gt;
&lt;span class="py"&gt;sonar.sources&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;
&lt;span class="py"&gt;sonar.exclusions&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;**/node_modules/**,**/dist/**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;code&gt;.github/workflows/sonarcloud.yml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SonarCloud Analysis&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sonarcloud&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SonarSource/sonarqube-scan-action@v5&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;SONAR_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SONAR_TOKEN }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;small&gt;Claude can create both files via the GitHub MCP — no manual file creation needed. The only browser step: adding &lt;code&gt;SONAR_TOKEN&lt;/code&gt; as a GitHub Actions secret.&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;




&lt;h3&gt;The 9 Challenges (In Order)&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;1. MCP Server Not Connecting&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Added the server via &lt;code&gt;claude mcp add&lt;/code&gt; but tools weren't available.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; MCP servers load on startup only. Restart Claude Code.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2. Docker Image Not Pulled&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Config was correct but server wouldn't start.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; &lt;code&gt;docker pull mcp/sonarqube&lt;/code&gt; first.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3. "Project Not Found"&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Scanner ran but couldn't find the project.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Use a Project Analysis Token, not a generic user token. Generate in SonarCloud → My Account → Security.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;4. 403 on Workflow File&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Claude couldn't create &lt;code&gt;.github/workflows/sonarcloud.yml&lt;/code&gt;.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Add "Workflows: Read and Write" to the PAT.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;5. Invalid sonar.sources&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Scanner failed because source directories didn't exist on the scanned branch.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Make sure &lt;code&gt;sonar.sources&lt;/code&gt; references directories that exist on the branch being scanned.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;6. Automatic Analysis Conflict&lt;/b&gt;&lt;br&gt;
&lt;small&gt;"You are running CI analysis while Automatic Analysis is enabled."&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Disable Automatic Analysis in SonarCloud UI (can't be done via MCP).&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;7. Branch Analysis 404&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Quality gate returned 404 for non-default branches.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Free tier only supports main branch + PR analysis. Use PR-based analysis.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;8. Go Not Supported by Automatic Analysis&lt;/b&gt;&lt;br&gt;
&lt;small&gt;Automatic Analysis only works for JS/TS, Python, Java, C#.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Use GitHub Actions CI approach for compiled languages.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;9. PR Creation 403&lt;/b&gt;&lt;br&gt;
&lt;small&gt;PAT was missing Pull requests permission.&lt;br&gt;
&lt;b&gt;Fix:&lt;/b&gt; Add "Pull requests: Read and Write" to the PAT.&lt;/small&gt;&lt;/p&gt;




&lt;h3&gt;The Interesting Discovery: GitHub Status vs Check Runs&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;This was the most subtle issue. During polling, I used &lt;code&gt;pull_request_read(get_status)&lt;/code&gt; to check if CI was done. It kept returning "pending" even after SonarCloud had finished analyzing.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;strong&gt;Why?&lt;/strong&gt; SonarCloud reports via GitHub &lt;strong&gt;Check Runs&lt;/strong&gt;, not &lt;strong&gt;Commit Statuses&lt;/strong&gt;. These are different API endpoints. The &lt;code&gt;get_status&lt;/code&gt; method checks commit statuses, but SonarCloud uses check runs.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Use the SonarQube MCP as the primary polling method. Call &lt;code&gt;get_project_quality_gate_status(pullRequest: "PR_NUMBER")&lt;/code&gt; — when it returns data instead of an error, the analysis is complete. More reliable than the GitHub status API.&lt;br&gt;
&lt;/small&gt;&lt;/p&gt;



&lt;h3&gt;Dry Run Results&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;small&gt;Step&lt;/small&gt;&lt;/th&gt;
&lt;td&gt;&lt;small&gt;Commit + push&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Create PR&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Poll (4 x 30s)&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Pull report&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;&lt;b&gt;Total&lt;/b&gt;&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;&lt;small&gt;Time&lt;/small&gt;&lt;/th&gt;
&lt;td&gt;&lt;small&gt;~5s&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;~2s&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;~2 min&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;~3s&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;&lt;b&gt;~2.5 min&lt;/b&gt;&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;small&gt;Quality Gate&lt;/small&gt;
&lt;/th&gt;
&lt;td&gt;&lt;small&gt;❌ FAILED (intentionally)&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;th&gt;
&lt;small&gt;Issues found&lt;/small&gt;
&lt;/th&gt;
&lt;td&gt;&lt;small&gt;6 — 2 Critical, 1 Major, 3 Minor&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h3&gt;Eliminating Approval Fatigue&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;By default, Claude Code asks permission for every tool call. For an automated flow, this kills the experience. The fix: configure &lt;code&gt;.claude/settings.local.json&lt;/code&gt; with auto-approved tools:&lt;/small&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;"permissions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git 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;"Bash(git add:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git commit:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"Bash(git push:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash(sleep:*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"mcp__sonarqube__get_project_quality_gate_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;"mcp__sonarqube__search_sonar_issues_in_projects"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"mcp__github__create_pull_request"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"mcp__github__pull_request_read"&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;&lt;small&gt;This auto-approves git commands, polling sleep, and MCP tools while still prompting for potentially destructive operations.&lt;/small&gt;&lt;/p&gt;

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

&lt;h3&gt;What MCP Can and Can't Do&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;&lt;small&gt;✅ Can do&lt;/small&gt;&lt;/th&gt;
&lt;th&gt;&lt;small&gt;❌ Can't do (yet)&lt;/small&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Read quality gates, issues, metrics&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Trigger GitHub Actions re-runs&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Create files, branches, PRs&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Create GitHub secrets&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Push commits, read diffs&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Change SonarCloud project settings&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;small&gt;Analyze code snippets locally&lt;/small&gt;&lt;/td&gt;
&lt;td&gt;&lt;small&gt;Monitor workflow logs in real-time&lt;/small&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;Free Tier Tips&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;- Private repos: 50k lines free. Use &lt;code&gt;sonar.exclusions&lt;/code&gt; aggressively.&lt;/small&gt;&lt;br&gt;
&lt;small&gt;- PR analysis works on free tier and only scans new code — best strategy for staying under limits.&lt;/small&gt;&lt;br&gt;
&lt;small&gt;- Branch analysis requires paid tier. Use PRs instead.&lt;/small&gt;&lt;/p&gt;



&lt;h3&gt;The Full Guide&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;Everything above plus example configs, the "Feed to Claude" instructions (so any Claude Code instance can run the flow), and detailed troubleshooting:&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://github.com/Aadhin/claude-sonarcloud-guide" rel="noopener noreferrer"&gt;aadhin/claude-sonarcloud-guide on GitHub&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Built while working on a Go + React/TypeScript desktop app (Wails v2). SonarCloud free tier + GitHub Actions CI.&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>sonarcloud</category>
      <category>mcp</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
