<?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: Giuliano Buzetti</title>
    <description>The latest articles on DEV Community by Giuliano Buzetti (@giuliano_buzetti_e1ce3412).</description>
    <link>https://dev.to/giuliano_buzetti_e1ce3412</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4195172%2Fb2f6a8d5-514d-43c0-99a4-dc662f50f02f.png</url>
      <title>DEV Community: Giuliano Buzetti</title>
      <link>https://dev.to/giuliano_buzetti_e1ce3412</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/giuliano_buzetti_e1ce3412"/>
    <language>en</language>
    <item>
      <title>SonarQube MCP in Claude Code: read-only setup, keeping the token out of your repo, and fewer toolsets</title>
      <dc:creator>Giuliano Buzetti</dc:creator>
      <pubDate>Wed, 28 Oct 2026 14:33:23 +0000</pubDate>
      <link>https://dev.to/giuliano_buzetti_e1ce3412/sonarqube-mcp-in-claude-code-read-only-setup-keeping-the-token-out-of-your-repo-and-fewer-3np</link>
      <guid>https://dev.to/giuliano_buzetti_e1ce3412/sonarqube-mcp-in-claude-code-read-only-setup-keeping-the-token-out-of-your-repo-and-fewer-3np</guid>
      <description>&lt;p&gt;The SonarQube MCP Server lets Claude Code read issues, quality gates, measures, security hotspots and coverage from SonarQube Cloud or SonarQube Server. SonarSource ships it as the &lt;code&gt;sonarsource/sonarqube-mcp&lt;/code&gt; container image, so Claude Code starts it as a local stdio process through Docker, and it acts with the rights of the token you give it.&lt;/p&gt;

&lt;p&gt;The steps below summarize the official docs (the &lt;a href="https://github.com/SonarSource/sonarqube-mcp-server" rel="noopener noreferrer"&gt;SonarQube MCP Server README&lt;/a&gt;, SonarSource's &lt;a href="https://mcp.sonarqube.com/config-generator.html" rel="noopener noreferrer"&gt;configuration generator&lt;/a&gt;, the SonarQube Cloud docs on &lt;a href="https://docs.sonarsource.com/sonarqube-cloud/managing-your-account/managing-tokens/" rel="noopener noreferrer"&gt;managing tokens&lt;/a&gt;, and the Claude Code docs on &lt;a href="https://code.claude.com/docs/en/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; and &lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;permissions&lt;/a&gt;), checked on 2026-10-28. They are based on the official docs, not hands-on tested; if something differs on your version, the linked docs win. The original version of this guide lives at &lt;a href="https://agenttaskatlas.com/guides/connect-sonarqube-mcp-claude-code" rel="noopener noreferrer"&gt;AgentTask Atlas: How to connect the SonarQube MCP server to Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check what you need
&lt;/h2&gt;

&lt;p&gt;Docker on the machine running Claude Code. For SonarQube Cloud: a token (&lt;code&gt;SONARQUBE_TOKEN&lt;/code&gt;); &lt;code&gt;SONARQUBE_ORG&lt;/code&gt; is optional and fixes the organization, and Cloud US also needs &lt;code&gt;SONARQUBE_URL=https://sonarqube.us&lt;/code&gt;. For SonarQube Server: a USER token plus &lt;code&gt;SONARQUBE_URL&lt;/code&gt;; the server must be SonarQube Server 2025.1 or Community Build 25.1 or newer. SonarSource also has an official configuration generator at mcp.sonarqube.com/config-generator.html if you'd rather not write the command yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add it for SonarQube Cloud, read-only
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SONAR_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_TOKEN"&lt;/span&gt;   &lt;span class="c"&gt;# better: load it from your secret manager or shell profile&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SONAR_ORG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-org-key"&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="nv"&gt;$SONAR_TOKEN&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="nv"&gt;$SONAR_ORG&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_READ_ONLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&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;--init&lt;/span&gt; &lt;span class="nt"&gt;--pull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &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 &lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_READ_ONLY sonarsource/sonarqube-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the Claude Code command from SonarSource's README with &lt;code&gt;SONARQUBE_READ_ONLY=true&lt;/code&gt; added, which turns off every write tool (such as changing an issue's status). Leave that line out only if you want the agent to accept issues or mark them false positives. Claude Code writes to local scope by default (only you, only this project, stored in &lt;code&gt;~/.claude.json&lt;/code&gt; outside your repository); add &lt;code&gt;--scope user&lt;/code&gt; to make it available in all your projects, or &lt;code&gt;--scope project&lt;/code&gt; to write it to &lt;code&gt;.mcp.json&lt;/code&gt; (see step 4 before doing that). Everything after &lt;code&gt;--&lt;/code&gt; is the docker command Claude Code runs, untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Or add it for SonarQube Server
&lt;/h2&gt;

&lt;p&gt;Same command, with your server's URL instead of the organization. Use a USER token, not a project or global analysis token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&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="nv"&gt;$SONAR_USER_TOKEN&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_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$SONAR_URL&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_READ_ONLY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&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;--init&lt;/span&gt; &lt;span class="nt"&gt;--pull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &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_URL &lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_READ_ONLY sonarsource/sonarqube-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Share it with the team in .mcp.json without committing the token
&lt;/h2&gt;

&lt;p&gt;Claude Code expands &lt;code&gt;${VAR}&lt;/code&gt; in a project &lt;code&gt;.mcp.json&lt;/code&gt;'s &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;args&lt;/code&gt; and &lt;code&gt;env&lt;/code&gt;, so each teammate sets &lt;code&gt;SONARQUBE_TOKEN&lt;/code&gt; and &lt;code&gt;SONARQUBE_ORG&lt;/code&gt; in their own shell and the file stays secret-free:&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;"sonarqube"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="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;"docker"&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;"run"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--init"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--pull=always"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-i"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--rm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SONARQUBE_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SONARQUBE_ORG"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"-e"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SONARQUBE_READ_ONLY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sonarsource/sonarqube-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"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;"SONARQUBE_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${SONARQUBE_TOKEN}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SONARQUBE_ORG"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${SONARQUBE_ORG}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SONARQUBE_READ_ONLY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="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;Claude Code asks each person to approve project-scoped servers the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Load only the toolsets you use
&lt;/h2&gt;

&lt;p&gt;Every enabled tool's name, description and schema sits in Claude Code's context in every session. &lt;code&gt;SONARQUBE_TOOLSETS&lt;/code&gt; limits the server to the toolsets you list (&lt;code&gt;projects&lt;/code&gt; is always on), and &lt;code&gt;SONARQUBE_PROJECT_KEY&lt;/code&gt; fixes one project so tools stop asking for it. Pass each one with another &lt;code&gt;--env&lt;/code&gt; and &lt;code&gt;-e&lt;/code&gt; pair, or in the &lt;code&gt;env&lt;/code&gt; block above.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;SONARQUBE_TOOLSETS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;issues,quality-gates,security-hotspots,measures
&lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;SONARQUBE_PROJECT_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-project
&lt;span class="c"&gt;# and add to the docker args:&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_TOOLSETS &lt;span class="nt"&gt;-e&lt;/span&gt; SONARQUBE_PROJECT_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Check the connection and try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list
claude mcp get sonarqube
&lt;span class="c"&gt;# in a session:&lt;/span&gt;
My quality gate is failing &lt;span class="k"&gt;for &lt;/span&gt;my project. Can you &lt;span class="nb"&gt;help &lt;/span&gt;me understand why and fix the most critical issues?
I want to reduce technical debt &lt;span class="k"&gt;in &lt;/span&gt;my project. What are the top issues I should prioritize?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;claude mcp list&lt;/code&gt; should show sonarqube as connected, and &lt;code&gt;/mcp&lt;/code&gt; shows its tools. The prompts above are from SonarSource's examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Keep write tools behind a prompt
&lt;/h2&gt;

&lt;p&gt;If you skipped read-only mode, an ask rule in &lt;code&gt;.claude/settings.json&lt;/code&gt; makes Claude Code confirm every SonarQube tool call before it runs, including status changes:&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;"ask"&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;"mcp__sonarqube__*"&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;Don't add an allow rule for &lt;code&gt;mcp__sonarqube__*&lt;/code&gt; unless you are fine with the agent accepting issues or marking them false positives on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting (from the official docs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"SonarQube server version is not supported, minimal version is SQS 2025.1 or SQCB 25.1":&lt;/strong&gt; the server checks your SonarQube Server version at startup. Upgrade to a supported release; this check doesn't apply to SonarQube Cloud.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A feature or tool from the README is missing:&lt;/strong&gt; you are probably on an old cached image. Run &lt;code&gt;docker pull sonarsource/sonarqube-mcp&lt;/code&gt; (or keep &lt;code&gt;--pull=always&lt;/code&gt;), then restart Claude Code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection or configuration problems you can't see:&lt;/strong&gt; set &lt;code&gt;SONARQUBE_DEBUG_ENABLED=true&lt;/code&gt; for debug logs on stderr and in &lt;code&gt;STORAGE_PATH/logs/mcp.log&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The server times out while starting:&lt;/strong&gt; raise Claude Code's MCP startup timeout, for example &lt;code&gt;MCP_TIMEOUT=10000 claude&lt;/code&gt; for 10 seconds. Running &lt;code&gt;docker pull sonarsource/sonarqube-mcp&lt;/code&gt; beforehand also keeps the image download out of startup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;claude mcp list&lt;/code&gt; shows sonarqube as ⏸ Pending approval:&lt;/strong&gt; it comes from a project &lt;code&gt;.mcp.json&lt;/code&gt; you haven't approved yet. Run &lt;code&gt;claude&lt;/code&gt; interactively in the project, accept the workspace trust dialog and approve the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;claude mcp list&lt;/code&gt; warns about a missing environment variable:&lt;/strong&gt; a &lt;code&gt;${VAR}&lt;/code&gt; in &lt;code&gt;.mcp.json&lt;/code&gt; names a variable that isn't set, so Claude Code passes the literal &lt;code&gt;${VAR}&lt;/code&gt; text. Export &lt;code&gt;SONARQUBE_TOKEN&lt;/code&gt; (and &lt;code&gt;SONARQUBE_ORG&lt;/code&gt; or &lt;code&gt;SONARQUBE_URL&lt;/code&gt;) in the shell you start &lt;code&gt;claude&lt;/code&gt; from.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;The server sends anonymous usage data to SonarSource (no source code or IP address, per the README). Add &lt;code&gt;--env TELEMETRY_DISABLED=true&lt;/code&gt; and &lt;code&gt;-e TELEMETRY_DISABLED&lt;/code&gt; to turn it off.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;analyze_code_snippet&lt;/code&gt; otherwise receives whole files as arguments. Mounting your project at &lt;code&gt;/app/mcp-workspace&lt;/code&gt; (&lt;code&gt;-v /path/to/project:/app/mcp-workspace&lt;/code&gt; in the docker args) lets it read files from disk instead, so file contents don't pass through the agent's context.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--pull=always&lt;/code&gt; gets updates automatically. For reproducible setups, pin a tag such as &lt;code&gt;sonarsource/sonarqube-mcp:&amp;lt;version&amp;gt;&lt;/code&gt; and drop &lt;code&gt;--pull=always&lt;/code&gt; so Docker doesn't upgrade silently.&lt;/li&gt;
&lt;li&gt;Give the agent a token with only the rights it needs: the server can do whatever that token can.&lt;/li&gt;
&lt;li&gt;The license is SonarSource's source-available license (SONAR Source-Available License v1.0), not an OSI open-source license.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>sonarqube</category>
      <category>ai</category>
    </item>
    <item>
      <title>Context7 in Claude Code: setup, keeping the API key out of your repo, and fixing 401s</title>
      <dc:creator>Giuliano Buzetti</dc:creator>
      <pubDate>Tue, 27 Oct 2026 14:34:10 +0000</pubDate>
      <link>https://dev.to/giuliano_buzetti_e1ce3412/context7-in-claude-code-setup-keeping-the-api-key-out-of-your-repo-and-fixing-401s-3gch</link>
      <guid>https://dev.to/giuliano_buzetti_e1ce3412/context7-in-claude-code-setup-keeping-the-api-key-out-of-your-repo-and-fixing-401s-3gch</guid>
      <description>&lt;p&gt;Context7 gives Claude Code current, version-specific library docs through two tools, &lt;code&gt;resolve-library-id&lt;/code&gt; and &lt;code&gt;query-docs&lt;/code&gt;. The hosted server at &lt;code&gt;https://mcp.context7.com/mcp&lt;/code&gt; needs no local Node.js; an API key is optional, but Upstash recommends a free one for higher rate limits. Your library names and queries are sent to Context7's hosted service, whose backend is private.&lt;/p&gt;

&lt;p&gt;The steps below summarize the official docs (the &lt;a href="https://github.com/upstash/context7" rel="noopener noreferrer"&gt;Context7 README&lt;/a&gt;, Context7's &lt;a href="https://context7.com/docs/clients/claude-code" rel="noopener noreferrer"&gt;Claude Code page&lt;/a&gt; and &lt;a href="https://context7.com/docs/resources/troubleshooting" rel="noopener noreferrer"&gt;troubleshooting page&lt;/a&gt;, and the Claude Code docs on &lt;a href="https://code.claude.com/docs/en/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; and &lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;permissions&lt;/a&gt;), checked on 2026-10-27. They are based on the official docs, not hands-on tested; if something differs on your version, the linked docs win. The original version of this guide lives at &lt;a href="https://agenttaskatlas.com/guides/connect-context7-mcp-claude-code" rel="noopener noreferrer"&gt;AgentTask Atlas: How to connect the Context7 MCP server to Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check what you need
&lt;/h2&gt;

&lt;p&gt;Nothing for the hosted server except outbound HTTPS. For an API key, create one in the Context7 dashboard (context7.com/dashboard); keys start with &lt;code&gt;ctx7sk&lt;/code&gt;. The local npx server needs Node.js 20 or newer, and the &lt;code&gt;ctx7&lt;/code&gt; setup CLI needs Node.js 22.13 or newer.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Fastest: let ctx7 set it up
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ctx7 setup &lt;span class="nt"&gt;--claude&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It signs you in with an OAuth device flow (a link and short code you can open on any device, so it also works over SSH), generates an API key and lets you choose CLI + skill mode or MCP mode. Undo it later with &lt;code&gt;npx ctx7 remove&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Or install the Context7 plugin
&lt;/h2&gt;

&lt;p&gt;Run these inside Claude Code, restart it, then open &lt;code&gt;/mcp&lt;/code&gt;, select Context7 and finish the browser sign-in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add upstash/context7
/plugin install context7@context7-marketplace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key is needed, and the plugin does not read &lt;code&gt;CONTEXT7_API_KEY&lt;/code&gt;, so use the next step on headless, SSH or CI hosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Manual: hosted server with the key from an env var
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;CONTEXT7_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt;   &lt;span class="c"&gt;# better: load it from your secret manager or shell profile&lt;/span&gt;
claude mcp add &lt;span class="nt"&gt;--scope&lt;/span&gt; user &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CONTEXT7_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--transport&lt;/span&gt; http context7 https://mcp.context7.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--scope user&lt;/code&gt; makes it available in every project and stores it in &lt;code&gt;~/.claude.json&lt;/code&gt;, outside your repository. To skip the key and sign in with OAuth instead, use &lt;code&gt;https://mcp.context7.com/mcp/oauth&lt;/code&gt; without the header and authenticate from &lt;code&gt;/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Share it with the team without committing the key
&lt;/h2&gt;

&lt;p&gt;Claude Code expands &lt;code&gt;${VAR}&lt;/code&gt; in the &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;headers&lt;/code&gt; of a project's &lt;code&gt;.mcp.json&lt;/code&gt;, so each teammate sets &lt;code&gt;CONTEXT7_API_KEY&lt;/code&gt; in their own environment and the file stays secret-free:&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;"context7"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.context7.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ${CONTEXT7_API_KEY}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;Claude Code asks each person to approve project-scoped servers the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Or run it locally over stdio
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;CONTEXT7_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTEXT7_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio context7 &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @upstash/context7-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pass the key with &lt;code&gt;--env&lt;/code&gt; instead of &lt;code&gt;--api-key&lt;/code&gt; on the command line. Keep &lt;code&gt;--transport stdio&lt;/code&gt; between &lt;code&gt;--env&lt;/code&gt; and the server name: if the name comes right after &lt;code&gt;--env&lt;/code&gt;, the CLI reads it as another KEY=value pair.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Check the connection
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list
claude mcp get context7
&lt;span class="c"&gt;# in a session:&lt;/span&gt;
use context7 with /vercel/next.js &lt;span class="k"&gt;for &lt;/span&gt;app router setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;claude mcp list&lt;/code&gt; should show context7 as connected. Adding the library ID (&lt;code&gt;/owner/repo&lt;/code&gt;) skips the lookup step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting (from the official docs)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate-limit errors:&lt;/strong&gt; add a free API key as an &lt;code&gt;Authorization: Bearer&lt;/code&gt; header (remote) or &lt;code&gt;CONTEXT7_API_KEY&lt;/code&gt; / &lt;code&gt;--api-key&lt;/code&gt; (local).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;401, and &lt;code&gt;claude mcp list&lt;/code&gt; shows Failed to connect:&lt;/strong&gt; check the key starts with &lt;code&gt;ctx7sk&lt;/code&gt; and the header reads exactly &lt;code&gt;Authorization: Bearer &amp;lt;key&amp;gt;&lt;/code&gt;. Claude Code reports a rejected header as a failed connection rather than offering OAuth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning about a missing variable:&lt;/strong&gt; &lt;code&gt;CONTEXT7_API_KEY&lt;/code&gt; isn't set in the shell that launched Claude Code. Export it first, or use a &lt;code&gt;${VAR:-default}&lt;/code&gt; fallback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ERR_MODULE_NOT_FOUND&lt;/code&gt; / &lt;code&gt;Cannot find module 'uriTemplate.js'&lt;/code&gt; locally:&lt;/strong&gt; use Node.js 20+ and &lt;code&gt;@upstash/context7-mcp@latest&lt;/code&gt;, try bunx or deno, or use the hosted URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;404 for a library:&lt;/strong&gt; IDs look like &lt;code&gt;/owner/repo&lt;/code&gt; or &lt;code&gt;/owner/repo/version&lt;/code&gt;; let &lt;code&gt;resolve-library-id&lt;/code&gt; find it first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate proxy:&lt;/strong&gt; set &lt;code&gt;https_proxy&lt;/code&gt; / &lt;code&gt;HTTPS_PROXY&lt;/code&gt; (in the server's env for stdio), then check &lt;code&gt;curl https://mcp.context7.com/ping&lt;/code&gt; returns &lt;code&gt;pong&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"already exists in local config":&lt;/strong&gt; run &lt;code&gt;claude mcp remove context7&lt;/code&gt; first, or add it under a different scope.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Context7's 2 tool definitions measured about 1,060 tokens (o200k) on &lt;code&gt;@upstash/context7-mcp&lt;/code&gt; 4.4.4, one of the lightest servers on our &lt;a href="https://agenttaskatlas.com/mcp-tool-budget" rel="noopener noreferrer"&gt;MCP tool budget table&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Every query text leaves your machine for Context7's service, so don't paste secrets or proprietary code into one.&lt;/li&gt;
&lt;li&gt;An allow rule for &lt;code&gt;mcp__context7__*&lt;/code&gt; in &lt;code&gt;.claude/settings.json&lt;/code&gt; stops the per-call prompt; leave it out to keep confirming each lookup.&lt;/li&gt;
&lt;li&gt;Library docs on Context7 are community-contributed; Upstash says it can't guarantee their accuracy or security.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>ai</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Connecting Jira, Confluence and Bitbucket to Claude Code with Atlassian's Rovo MCP server</title>
      <dc:creator>Giuliano Buzetti</dc:creator>
      <pubDate>Mon, 26 Oct 2026 14:37:13 +0000</pubDate>
      <link>https://dev.to/giuliano_buzetti_e1ce3412/connecting-jira-confluence-and-bitbucket-to-claude-code-with-atlassians-rovo-mcp-server-2id5</link>
      <guid>https://dev.to/giuliano_buzetti_e1ce3412/connecting-jira-confluence-and-bitbucket-to-claude-code-with-atlassians-rovo-mcp-server-2id5</guid>
      <description>&lt;p&gt;Atlassian runs an official, hosted MCP server (the Atlassian Rovo MCP Server), so there is nothing to install locally. Claude Code connects to &lt;code&gt;https://mcp.atlassian.com/v2/mcp&lt;/code&gt; over HTTP and acts with your own Atlassian Cloud permissions. Atlassian's README says v2 is the recommended endpoint for new setups.&lt;/p&gt;

&lt;p&gt;The steps below summarize the official docs (the &lt;a href="https://github.com/atlassian/atlassian-mcp-server" rel="noopener noreferrer"&gt;Atlassian MCP Server README&lt;/a&gt;, Atlassian Support's &lt;a href="https://support.atlassian.com/atlassian-rovo-mcp-server/docs/configuring-authentication-via-api-token/" rel="noopener noreferrer"&gt;API token guide&lt;/a&gt;, and the Claude Code docs on &lt;a href="https://code.claude.com/docs/en/mcp" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; and &lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;permissions&lt;/a&gt;), checked on 2026-10-26. Client CLIs and admin menus change, so if something differs on your version, the linked docs win. The original version of this guide lives at &lt;a href="https://agenttaskatlas.com/guides/connect-atlassian-mcp-claude-code" rel="noopener noreferrer"&gt;AgentTask Atlas: How to connect the Atlassian Rovo MCP server to Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check what you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An Atlassian Cloud site with Jira, Confluence, Jira Service Management, Bitbucket or Compass.&lt;/li&gt;
&lt;li&gt;A browser for the OAuth 2.1 sign-in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Headless setups can use an API token instead, but only if an org admin has enabled API-token authentication (Atlassian Administration → Rovo → Rovo MCP server → Authentication).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add the server
&lt;/h2&gt;

&lt;p&gt;This is the command Atlassian's README gives for Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http atlassian https://mcp.atlassian.com/v2/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;--scope user&lt;/code&gt; to make it available in every project, or &lt;code&gt;--scope project&lt;/code&gt; to share it through &lt;code&gt;.mcp.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sign in with OAuth
&lt;/h2&gt;

&lt;p&gt;Start a Claude Code session and run &lt;code&gt;/mcp&lt;/code&gt;, select &lt;code&gt;atlassian&lt;/code&gt; and complete the browser sign-in:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Until you do, &lt;code&gt;claude mcp list&lt;/code&gt; shows the server as needing authentication. Access is limited to what your Atlassian account can already see.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Or share it with the team in &lt;code&gt;.mcp.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This is the entry from Atlassian's own repository:&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;"atlassian"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.atlassian.com/v2/mcp"&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;Keep &lt;code&gt;"type": "http"&lt;/code&gt;. Claude Code reads an entry with a &lt;code&gt;url&lt;/code&gt; but no &lt;code&gt;type&lt;/code&gt; as a stdio server and skips it. Each teammate still signs in with their own account from &lt;code&gt;/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Headless: authenticate with an API token
&lt;/h2&gt;

&lt;p&gt;Create a scoped personal API token, base64-encode &lt;code&gt;email:api_token&lt;/code&gt; as Atlassian's token guide shows, and pass it as a Basic &lt;code&gt;Authorization&lt;/code&gt; header (a service account key uses &lt;code&gt;Bearer&lt;/code&gt; instead):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"your.email@example.com:YOUR_API_TOKEN"&lt;/span&gt; | &lt;span class="nb"&gt;base64
&lt;/span&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http atlassian https://mcp.atlassian.com/v2/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Basic BASE64_ENCODED_EMAIL_AND_TOKEN"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to know: Jira Service Management tools only work with token auth, and some Compass tools are not available with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep write tools behind a prompt
&lt;/h2&gt;

&lt;p&gt;The server can create and update Jira issues, Confluence pages and Bitbucket content. An &lt;code&gt;ask&lt;/code&gt; rule in &lt;code&gt;.claude/settings.json&lt;/code&gt; makes Claude Code confirm every Atlassian tool call:&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;"ask"&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;"mcp__atlassian__*"&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;Don't add an &lt;code&gt;allow&lt;/code&gt; rule for &lt;code&gt;mcp__atlassian__*&lt;/code&gt; unless you trust every write it can make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Good to know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;delete_jira&lt;/code&gt; and &lt;code&gt;manage_jira&lt;/code&gt; permission groups are disabled by default; an admin has to turn them on. Leave them off unless you need them.&lt;/li&gt;
&lt;li&gt;Tokens are not bound to one cloudId and skip the OAuth domain allowlist, so prefer OAuth for interactive use and keep tokens scoped to the projects the agent needs.&lt;/li&gt;
&lt;li&gt;Atlassian suggests putting your Jira project key, Confluence space and cloudId in &lt;code&gt;AGENTS.md&lt;/code&gt; so the agent makes fewer discovery calls.&lt;/li&gt;
&lt;li&gt;Every tool call is recorded in your organization's audit log (Atlassian Administration → Insights → Audit log).&lt;/li&gt;
&lt;li&gt;The legacy SSE endpoint (&lt;code&gt;/v1/sse&lt;/code&gt;) stopped being supported after 30 June 2026. Point old configs at &lt;code&gt;/v2/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More on MCP in Claude Code
&lt;/h2&gt;

&lt;p&gt;New to MCP in Claude Code? The general guide covers transports, scopes and how to confirm a server connected: &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-claude-code" rel="noopener noreferrer"&gt;How to add an MCP server to Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I keep a small catalog of MCP servers and Agent Skills organized by dev task, with the install step, credentials, permissions and documented clients taken from each project's official docs. The &lt;a href="https://agenttaskatlas.com/entry/atlassian-mcp-server" rel="noopener noreferrer"&gt;Atlassian Rovo MCP Server entry&lt;/a&gt; is based on official docs, not hands-on tested, so always check the source repo. The catalog is also available as a free, read-only remote MCP server (no account or key):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http agenttask-atlas https://agenttaskatlas.com/api/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Disclosure: I run AgentTask Atlas, the catalog linked above. This post was drafted with AI assistance from the guide on agenttaskatlas.com, whose steps summarize the official Atlassian and Claude Code docs as of 2026-10-26.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>atlassian</category>
      <category>ai</category>
    </item>
    <item>
      <title>Adding MCP servers to Claude Code: remote, local and team setups that actually connect</title>
      <dc:creator>Giuliano Buzetti</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:40:44 +0000</pubDate>
      <link>https://dev.to/giuliano_buzetti_e1ce3412/adding-mcp-servers-to-claude-code-remote-local-and-team-setups-that-actually-connect-dj0</link>
      <guid>https://dev.to/giuliano_buzetti_e1ce3412/adding-mcp-servers-to-claude-code-remote-local-and-team-setups-that-actually-connect-dj0</guid>
      <description>&lt;p&gt;Most "my MCP server doesn't work in Claude Code" problems come down to three small things: the wrong transport, the wrong scope, or a &lt;code&gt;.mcp.json&lt;/code&gt; entry that Claude Code silently skips. This post walks through each one with commands you can paste, then shows how to confirm the server is really connected before you rely on it.&lt;/p&gt;

&lt;p&gt;Everything below follows the official Claude Code MCP docs (&lt;a href="https://code.claude.com/docs/en/mcp" rel="noopener noreferrer"&gt;code.claude.com/docs/en/mcp&lt;/a&gt;). Client CLIs change often, so if a flag behaves differently on your version, the docs win. The original, shorter version of this guide lives at &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-claude-code" rel="noopener noreferrer"&gt;AgentTask Atlas: How to add an MCP server to Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Know which kind of server you have
&lt;/h2&gt;

&lt;p&gt;Before typing anything, look at the server's README and find out which of these two it is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remote (HTTP):&lt;/strong&gt; the README gives you a URL such as &lt;code&gt;https://.../mcp&lt;/code&gt;. The server runs somewhere else; Claude Code talks to it over HTTP. The docs recommend the HTTP transport for remote servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local (stdio):&lt;/strong&gt; the README gives you a command such as &lt;code&gt;npx some-package&lt;/code&gt; or &lt;code&gt;uvx some-tool&lt;/code&gt;. Claude Code starts that process on your machine and talks to it over stdin/stdout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Picking the wrong transport is the most common reason a server shows up as failed.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Add a remote server
&lt;/h2&gt;

&lt;p&gt;The shape is &lt;code&gt;claude mcp add --transport http &amp;lt;name&amp;gt; &amp;lt;url&amp;gt;&lt;/code&gt;. For example, Sentry documents a remote endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http sentry https://mcp.sentry.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servers that use OAuth (like that one) don't need a token on the command line. You sign in afterwards from inside a Claude Code session with &lt;code&gt;/mcp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If a server uses a fixed API token instead, pass it as a header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http secure-api https://api.example.com/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your-token"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Add a local (stdio) server
&lt;/h2&gt;

&lt;p&gt;For stdio servers, everything after &lt;code&gt;--&lt;/code&gt; is the command that starts the server, passed through untouched. Claude Code's own flags (&lt;code&gt;--transport&lt;/code&gt;, &lt;code&gt;--env&lt;/code&gt;, &lt;code&gt;--scope&lt;/code&gt;) go &lt;strong&gt;before&lt;/strong&gt; the &lt;code&gt;--&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio playwright &lt;span class="nt"&gt;--&lt;/span&gt; npx @playwright/mcp@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With an environment variable the server needs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-key &lt;span class="nt"&gt;--transport&lt;/span&gt; stdio example &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @example/mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you put &lt;code&gt;--env&lt;/code&gt; after the &lt;code&gt;--&lt;/code&gt;, it gets passed to the server as an argument instead of being set as a variable, which is an easy mistake to miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Choose a scope on purpose
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;claude mcp add&lt;/code&gt; writes to one of three scopes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Who sees it&lt;/th&gt;
&lt;th&gt;Where it lives&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;local&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;Only you, only this project&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.claude.json&lt;/code&gt;, under the project's path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;project&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Everyone who clones the repo&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.mcp.json&lt;/code&gt; at the project root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only you, in all your projects&lt;/td&gt;
&lt;td&gt;your user config&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A rule of thumb: servers with personal credentials go in &lt;code&gt;local&lt;/code&gt; or &lt;code&gt;user&lt;/code&gt;; servers the whole team should get go in &lt;code&gt;project&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http sentry &lt;span class="nt"&gt;--scope&lt;/span&gt; user https://mcp.sentry.dev/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Sharing with a team: the &lt;code&gt;.mcp.json&lt;/code&gt; gotcha
&lt;/h2&gt;

&lt;p&gt;For a team setup you can commit &lt;code&gt;.mcp.json&lt;/code&gt; at the repo root. The detail that trips people up: &lt;strong&gt;a remote entry needs &lt;code&gt;"type": "http"&lt;/code&gt;&lt;/strong&gt;. An entry with a &lt;code&gt;url&lt;/code&gt; but no &lt;code&gt;type&lt;/code&gt; is read as a stdio server and skipped, with a configuration warning.&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;"sentry"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.sentry.dev/mcp"&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;"playwright"&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;"npx"&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;"@playwright/mcp@latest"&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;Two more things worth knowing about project-scoped servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code asks each developer for approval before using servers from a &lt;code&gt;.mcp.json&lt;/code&gt; it hasn't seen before. &lt;code&gt;claude mcp reset-project-choices&lt;/code&gt; resets those choices.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.mcp.json&lt;/code&gt; supports &lt;code&gt;${VAR}&lt;/code&gt; and &lt;code&gt;${VAR:-default}&lt;/code&gt; expansion (in &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;args&lt;/code&gt;, &lt;code&gt;env&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;headers&lt;/code&gt;), so you don't have to commit secrets. The docs note that some credential variables are deliberately read as empty in a remote server's &lt;code&gt;url&lt;/code&gt; and &lt;code&gt;headers&lt;/code&gt;, so check that section if a header token doesn't arrive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Confirm it actually connected
&lt;/h2&gt;

&lt;p&gt;Adding a config doesn't mean the server works. Check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list          &lt;span class="c"&gt;# status per server: ✔ Connected, ! Needs authentication, ✘ Failed to connect&lt;/span&gt;
claude mcp get sentry    &lt;span class="c"&gt;# details for one server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside a session, &lt;code&gt;/mcp&lt;/code&gt; shows the same status and is where OAuth sign-in happens. A "✘ Failed to connect" in &lt;code&gt;claude mcp list&lt;/code&gt; means Claude Code couldn't reach that server, not that the &lt;code&gt;list&lt;/code&gt; command itself failed.&lt;/p&gt;

&lt;p&gt;Then do one real test: ask Claude to use a tool from that server and check the tool call in the transcript.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few practical tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Already set up servers in Claude Desktop? &lt;code&gt;claude mcp add-from-claude-desktop&lt;/code&gt; imports them (macOS and WSL).&lt;/li&gt;
&lt;li&gt;Slow-starting local servers: &lt;code&gt;MCP_TIMEOUT=10000 claude&lt;/code&gt; raises the startup timeout to 10 seconds.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude mcp remove &amp;lt;name&amp;gt;&lt;/code&gt; removes a server; for remote servers it also deletes the stored OAuth tokens.&lt;/li&gt;
&lt;li&gt;Only connect servers you trust. The docs warn that servers which fetch external content can expose you to prompt injection. Read the permissions and the credentials a server asks for before adding it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finding a server for the task in front of you
&lt;/h2&gt;

&lt;p&gt;If you're not sure which server to add, I keep a small, curated catalog of MCP servers and Agent Skills organized by dev task, with the install step, credentials, permissions and documented clients taken from each project's official README. Entries summarize official sources and are not hands-on tested, so always check the source repo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Servers whose docs include Claude Code setup: &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-claude-code#servers" rel="noopener noreferrer"&gt;the Claude Code guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Compare by task, e.g. &lt;a href="https://agenttaskatlas.com/best-mcp-servers/database" rel="noopener noreferrer"&gt;databases&lt;/a&gt; or &lt;a href="https://agenttaskatlas.com/best-mcp-servers/observability-debug" rel="noopener noreferrer"&gt;debugging &amp;amp; observability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Browser testing options such as &lt;a href="https://agenttaskatlas.com/entry/playwright-mcp" rel="noopener noreferrer"&gt;Playwright MCP&lt;/a&gt; and &lt;a href="https://agenttaskatlas.com/entry/chrome-devtools-mcp" rel="noopener noreferrer"&gt;Chrome DevTools MCP&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The catalog is also available as a free, read-only remote MCP server (no account or key), which doubles as a quick way to test step 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http agenttask-atlas https://agenttaskatlas.com/api/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setup for other clients: &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-cursor" rel="noopener noreferrer"&gt;Cursor&lt;/a&gt;, &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-vscode" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;, &lt;a href="https://agenttaskatlas.com/guides/connect-mcp-claude-desktop" rel="noopener noreferrer"&gt;Claude Desktop&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I run AgentTask Atlas, the catalog linked above. This post was drafted with AI assistance and every command was checked against the official Claude Code docs before publishing.&lt;/em&gt;&lt;/p&gt;

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