<?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: xbill</title>
    <description>The latest articles on DEV Community by xbill (@xbill).</description>
    <link>https://dev.to/xbill</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%2F3490099%2Fc6a975d0-cd94-485d-82b1-14ed5b344fcf.jpg</url>
      <title>DEV Community: xbill</title>
      <link>https://dev.to/xbill</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xbill"/>
    <language>en</language>
    <item>
      <title>Meet 'Devto-Blogger': The Hermes Agent Skill That Automatically Writes Your Technical Blog Posts</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Fri, 29 May 2026 15:52:00 +0000</pubDate>
      <link>https://dev.to/xbill/meet-devto-blogger-the-hermes-agent-skill-that-automatically-writes-your-technical-blog-posts-2ne2</link>
      <guid>https://dev.to/xbill/meet-devto-blogger-the-hermes-agent-skill-that-automatically-writes-your-technical-blog-posts-2ne2</guid>
      <description>&lt;p&gt;If you are an open-source maintainer, developer advocate, or builder, you know the cycle: you build an amazing tool, but writing the launch blog post, documentation, or tutorial takes hours. &lt;/p&gt;

&lt;p&gt;For the &lt;strong&gt;Hermes Agent Challenge&lt;/strong&gt;, I wanted to build something that solves this exact problem. I built &lt;strong&gt;&lt;code&gt;devto-blogger&lt;/code&gt;&lt;/strong&gt;, a custom, prompt-driven skill for the brand new &lt;strong&gt;Hermes Agent&lt;/strong&gt; by Nous Research. &lt;/p&gt;

&lt;p&gt;It autonomously scans any workspace or codebase, analyzes the architecture, and drafts a fully-structured, rich Markdown technical article ready for publication on DEV.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What is Hermes Agent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hermes-agent.nousresearch.com/" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt; is an open-source agentic system built by &lt;strong&gt;Nous Research&lt;/strong&gt; (the lab behind the famous Hermes LLM models). Unlike basic coding copilots or simple chatbot wrappers, Hermes is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Environment-Aware&lt;/strong&gt;: It runs sandboxed in Docker, Modal, Daytona, SSH, or locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connected&lt;/strong&gt;: It interfaces with Telegram, Discord, Slack, WhatsApp, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closed Learning Loop&lt;/strong&gt;: It has persistent memory and creates custom skills on the fly from its own experience.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 The Entry: The &lt;code&gt;devto-blogger&lt;/code&gt; Skill
&lt;/h2&gt;

&lt;p&gt;In Hermes Agent, a "skill" is defined by a simple, declarative Markdown file (&lt;code&gt;SKILL.md&lt;/code&gt;) located in the &lt;code&gt;~/.hermes/skills/&lt;/code&gt; directory. By utilizing a prompt-driven skill structure, we can guide the agent's behavior globally without writing complex Python orchestration scripts.&lt;/p&gt;

&lt;p&gt;Here is the custom skill I designed and installed for this challenge:&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="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devto-blogger&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Scan&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;codebase&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;comprehensive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dev.to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;technical&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;blog&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;post&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;draft."&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1.0.0&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hermes Agent Developer&lt;/span&gt;
&lt;span class="na"&gt;license&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MIT&lt;/span&gt;
&lt;span class="na"&gt;platforms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;macos&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;windows&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;hermes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;devto&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;blogging&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;documentation&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;markdown&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;technical-writing&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;related_skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;plan&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;design-md&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Dev.to Technical Blogger Skill&lt;/span&gt;

Use this skill when you need to write an in-depth technical post, review, or tutorial about the active workspace or codebase.

&lt;span class="gu"&gt;## Core Behavior&lt;/span&gt;
&lt;span class="p"&gt;1.&lt;/span&gt; &lt;span class="gs"&gt;**Codebase Inspection**&lt;/span&gt;: Scan repository structure, configuration, and dependencies.
&lt;span class="p"&gt;2.&lt;/span&gt; &lt;span class="gs"&gt;**Drafting Strategy**&lt;/span&gt;: Write a high-quality technical article suitable for DEV.
&lt;span class="p"&gt;3.&lt;/span&gt; &lt;span class="gs"&gt;**Content Structure**&lt;/span&gt;: Outline introduction, the problem, technical walkthrough, and implementation code snippets.
&lt;span class="p"&gt;4.&lt;/span&gt; &lt;span class="gs"&gt;**Output File**&lt;/span&gt;: Save the draft under &lt;span class="sb"&gt;`drafts/devto-submission.md`&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;When I run Hermes in my workspace and instruct it to write a post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"Generate a blog post about our new project"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Activation&lt;/strong&gt;: Hermes detects that the task matches the &lt;code&gt;devto-blogger&lt;/code&gt; skill signature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analysis&lt;/strong&gt;: The agent uses its built-in codebase tools to list directories, view file structures, and parse key files (like &lt;code&gt;package.json&lt;/code&gt;, &lt;code&gt;requirements.txt&lt;/code&gt;, or config files).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drafting&lt;/strong&gt;: It synthesizes the information and writes a custom, highly engaging Dev.to markdown draft directly to the &lt;code&gt;/drafts&lt;/code&gt; folder.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🏆 Why This Matters for the Open Source Community
&lt;/h2&gt;

&lt;p&gt;Writing documentation and developer outreach content is often the most neglected part of software development. By leveraging Hermes Agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No More Cold Starts&lt;/strong&gt;: Get a comprehensive first draft in seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accurate Code Snippets&lt;/strong&gt;: The agent reads the exact code from your workspace, ensuring snippets are correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Effort Context&lt;/strong&gt;: Because Hermes is fully sandboxed, it acts directly on your working environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Try It Yourself!
&lt;/h2&gt;

&lt;p&gt;To install Hermes Agent and configure your own custom skills:&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 Hermes Agent&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://hermes-agent.nousresearch.com/install.sh | bash

&lt;span class="c"&gt;# Run setup&lt;/span&gt;
hermes setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Place the &lt;code&gt;SKILL.md&lt;/code&gt; template above in &lt;code&gt;~/.hermes/skills/creative/devto-blogger/SKILL.md&lt;/code&gt; and start automating your developer outreach!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with love using Hermes Agent during the 2026 Hermes Agent Challenge.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
    </item>
    <item>
      <title>Gemma 4 Deployment with NVIDIA L4, MCP, Cloud Run, and Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 28 May 2026 20:13:09 +0000</pubDate>
      <link>https://dev.to/gde/gemma-4-deployment-with-nvidia-l4-mcp-cloud-run-and-antigravity-cli-19h</link>
      <guid>https://dev.to/gde/gemma-4-deployment-with-nvidia-l4-mcp-cloud-run-and-antigravity-cli-19h</guid>
      <description>&lt;p&gt;This article provides a step by step deployment guide for Gemma 4 to a Google Cloud Run hosted GPU enabled system,. A suite of Python MCP tools is built to simplify management of the vLLM hosted Gemma 4 deployment with Antigravity CLI.&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%2Fprgzxj1uzsqeaii6cvvv.jpeg" 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%2Fprgzxj1uzsqeaii6cvvv.jpeg" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is this project trying to Do?
&lt;/h4&gt;

&lt;p&gt;This project is a DevOps/SRE assistant that uses a Gemma 4 model hosted on Cloud Run with GPU. It provides tools to provision the Docker container and deploy the model, as well as for observability and performance testing.&lt;/p&gt;

&lt;p&gt;This project is similar to a previous project that targeted GPU hosted Gemma4 instances on GCP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/gemma-sre-self-hosted-vllm-infrastructure-agent-afda000c0943" rel="noopener noreferrer"&gt;Gemma-SRE: Self-Hosted vLLM Infrastructure Agent&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Full Installation Instructions
&lt;/h4&gt;

&lt;p&gt;The detailed installation instructions for Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Python MCP Documentation
&lt;/h4&gt;

&lt;p&gt;The official GitHub Repo provides samples and documentation for getting started:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Where do I start?
&lt;/h4&gt;

&lt;p&gt;The strategy for starting MCP development for model management is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.&lt;/p&gt;

&lt;p&gt;Then, a minimal Python MCP Server is built with stdio transport. This server is validated with Antigravity CLI in the local environment.&lt;/p&gt;

&lt;p&gt;This setup validates the connection from Antigravity CLI to the local server via MCP. The MCP client (Antigravity CLI) and the Python MCP server both run in the same local environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup the Basic Environment
&lt;/h4&gt;

&lt;p&gt;At this point you should have a working Python environment and a working Antigravity CLI installation. The next step is to clone the GitHub samples repository with support scripts:&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;cd&lt;/span&gt; ~
git clone https://github.com/xbill9/gemma4-tips
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;strong&gt;init.sh&lt;/strong&gt; from the cloned directory.&lt;/p&gt;

&lt;p&gt;The script will attempt to determine your shell environment and set the correct variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpu-vllm-devops-agent
&lt;span class="nb"&gt;source &lt;/span&gt;init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your session times out or you need to re-authenticate- you can run the &lt;strong&gt;set_env.sh&lt;/strong&gt; script to reset your environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gpu-vllm-devops-agent
&lt;span class="nb"&gt;source &lt;/span&gt;set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables like PROJECT_ID need to be setup for use in the various build scripts- so the set_env script can be used to reset the environment if you time-out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Model Management Tool with MCP Stdio Transport
&lt;/h4&gt;

&lt;p&gt;One of the key features that the standard MCP libraries provide is abstracting various transport methods.&lt;/p&gt;

&lt;p&gt;The high level MCP tool implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.&lt;/p&gt;

&lt;p&gt;The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.&lt;/p&gt;

&lt;p&gt;The connection over stdio will look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Initialize FastMCP server
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Self-Hosted vLLM DevOps Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Running the Python Code
&lt;/h4&gt;

&lt;p&gt;First- switch the directory with the Python version of the MCP sample code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/gemma4-tips/gpu-vllm-devops-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the release version on the local system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;Processing ./.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project can also be linted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/gemma4-tips/gpu-vllm-devops-agent$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make lint
&lt;span class="go"&gt;ruff check .
All checks passed!
ruff format --check .
6 files already formatted
mypy .
Success: no issues found in 6 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a test run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/gemma4-tips/gpu-vllm-devops-agent$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;python test_agent.py
2026-05-28 12:34:44,071 - vllm-devops-agent - INFO - Initializing DevOps Agent MCP Server...
.........2026-05-28 12:34:44,110 - vllm-devops-agent - INFO - Querying Cloud Run model with prompt: 'Hello...'
2026-05-28 12:34:44,110 - vllm-devops-agent - INFO - Model response: 'Response from Gemma...'
.2026-05-28 12:34:44,112 - vllm-devops-agent - INFO - Querying model with stats with prompt: 'Hello...'
2026-05-28 12:34:44,112 - vllm-devops-agent - INFO - Model response with stats: TTFT=0.000s, TotalTime=0.000s
&lt;/span&gt;&lt;span class="c"&gt;.......
&lt;/span&gt;&lt;span class="go"&gt;----------------------------------------------------------------------
Ran 17 tests in 0.023s

OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  MCP stdio Transport
&lt;/h4&gt;

&lt;p&gt;One of the key features that the MCP protocol provides is abstracting various transport methods.&lt;/p&gt;

&lt;p&gt;The high level tool MCP implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.&lt;/p&gt;

&lt;p&gt;The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.&lt;/p&gt;

&lt;p&gt;In this project Antigravity CLI is used as the MCP client to interact with the Python MCP server code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI mcp_config.json
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .agents directory:&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;"gpu-devops-agent"&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;"python3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/gemma4-tips/gpu-vllm-devops-agent/server.py"&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;"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;"GOOGLE_CLOUD_PROJECT"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aisprint-491218"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GOOGLE_CLOUD_LOCATION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us-east4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"VLLM_BASE_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://vllm-gemma-4-e4b-it-289270257791.us-east4.run.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MODEL_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/mnt/models/gemma-4-E4B-it"&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;h4&gt;
  
  
  Validation with Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Antigravity CLI as a MCP client with the Python code providing the MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Servers

Configured (~/.gemini/antigravity-cli/mcp_config.json)
&amp;gt; ✓ developer-knowledge Tools: search_documents, answer_query, get_documents

Plugins (~/.gemini/antigravity-cli/plugins)
   ✓ google-dev-knowledge Tools: search_documents, answer_query, get_documents
   ✓ gpu-devops-agent Tools: save_hf_token, get_vllm_endpoint, list_vertex_models, list_bucket_models,
                       analyze_cloud_logging, +21 more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Getting Started with Gemma 4 on GPU
&lt;/h4&gt;

&lt;p&gt;Cloud Run GPU is tied to quota limits:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; check cloud run quota in us-east4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will return the current quotas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Presenting Quotas Clearly
  Here are the Google Cloud Run quotas for project aisprint-491218 in the us-east4 region:

  ### 📋 Core Resource Quotas

  • Services ( ServicesPerProject ): 1,000 limit per region.
  • Jobs ( JobsPerProject ): 1,000 limit per region.
  • Worker Pools ( WorkerPoolsPerProject ): 1,000 limit per region.
  • Active Revisions ( ActiveRevisionsPerProject ): 4,000 limit.
  • Running Executions ( RunningExecutionsPerProject ): 1,000 limit.
  • Tags ( TagsPerProject ): 2,000 limit.

  ### ⚡ Compute &amp;amp; Storage Allocations

  • Total CPU Allocation ( CpuAllocPerProjectRegion ): 5,000,000 milli vCPUs (equivalent to 5,000 vCPUs).
  • Total Memory Allocation ( MemAllocPerProjectRegion ): 10,737,418,240,000 bytes (equivalent to 10 TiB).
  • Max Per-Instance Ephemeral Disk ( MaxPerInstanceEphemeralDiskSizePerProjectRegion ): 10,737,418,240 bytes 
  (equivalent to 10 GiB).
  • Direct VPC Egress Instance Limit ( MaxInstancesLimitWithDirectVpcEgressPerProjectRegion ): 100 instances.

  ### 🎮 GPU Quotas

  • Nvidia L4 GPUs without zonal redundancy ( NvidiaL4GpuAllocNoZonalRedundancyPerProjectRegion ): 3 GPUs.
  • Nvidia L4 GPUs with zonal redundancy ( NvidiaL4GpuAllocPerProjectRegion ): No specific limits applied.
  • Nvidia RTX Pro 6000 GPUs ( NvidiaRtxPro6000GpuAllocNoZonalRedundancyPerProjectRegion ): No specific limits applied.

  ### ⏱️ API Rate Limits (per minute)

  • Read Requests ( ReadPerMinutePerProjectRegion ): 3,000 requests/min.
  • Write Requests ( WritePerMinutePerProjectRegion ): 180 requests/min.
  • Job Run Requests ( JobRunPerMinutePerProjectRegion ): 180 requests/min.
  • Inlined Source Deployments ( InlinedSourceDeployPerMinutePerProjectRegion ): 5 requests/min.
  • Source Deploy Bytes ( SourceDeployBytesPerMinutePerProjectRegion ): 2,000,000,000 bytes (equivalent to 2 GB /
  min).

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

&lt;/div&gt;



&lt;p&gt;You can also use the Antigravity CLI to submit a quota increase:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; request RTX Pro 6000 GPUs cloud run quota of 3 in us-east4
● google-dev-knowledge/search_documents(Quota increase command search)
● Read(/home/xbill/.gemini/antigravity-cli/brain/5a6...4e9cc0a/.system_generated/steps/32/output.txt) (ctrl+o to expand)

▸ Thought for 1s, 511 tokens
  Clarifying The Scope

● Search(Searching for L4 GPU metric)
● Read(/home/xbill/.gemini/antigravity-cli/brain/5a65b024-1b52-4d0b-b816-652984e9cc0a/scratch/run_quotas.yaml)
● Search(Grep search for RTX Pro 6000)
● Read(/home/xbill/.gemini/antigravity-cli/brain/5a65b024-1b52-4d0b-b816-652984e9cc0a/scratch/run_quotas.yaml)
● Bash(gcloud beta quotas preferences create --service=run.googleapis.com --project=aisprint-491218 --quota-
id=NvidiaRtx...)
● Bash(gcloud beta quotas preferences create --service=run.googleapis.com --project=aisprint-491218 -...) (ctrl+o to
expand)

  I have submitted requests to increase both RTX Pro 6000 GPU quotas to 3 GPUs (represented as 3000 milli GPUs in the
  API) in us-east4 for project aisprint-491218 .

  Here are the details of the submitted quota preferences:

  ### 1. With Zonal Redundancy

  • Quota ID: NvidiaRtxPro6000GpuAllocPerProjectRegion 
  • Service: run.googleapis.com 
  • Region: us-east4 
  • Requested Limit: 3000 milli GPUs (3 GPUs)
  • Preference Name: projects/aisprint-491218/locations/global/quotaPreferences/bdf815c3-a947-4069-91ae-8b6c6c0dd345 
  • Status: Submitted (reconciling)

  ### 2. Without Zonal Redundancy

  • Quota ID: NvidiaRtxPro6000GpuAllocNoZonalRedundancyPerProjectRegion 
  • Service: run.googleapis.com 
  • Region: us-east4 
  • Requested Limit: 3000 milli GPUs (3 GPUs)
  • Preference Name: projects/aisprint-491218/locations/global/quotaPreferences/2f6ccda1-76a5-4867-8f89-78948cd725b8 
  • Status: Submitted (reconciling)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Official vLLM repo also has Gemma4 specific information:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vllm-project/vllm/releases" rel="noopener noreferrer"&gt;Releases · vllm-project/vllm&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Model Lifecycle Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing vLLM deployment on Cloud Run or a TPU.&lt;/p&gt;

&lt;p&gt;Overview of MCP tools :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ### ⚙️ Active Environment Configuration

  • Project ID: aisprint-491218 
  • Region: us-east4 
  • Model Name: /mnt/models/gemma-4-E4B-it 
  • Active Serving Endpoint: Cloud Run Service https://vllm-gemma-4-e4b-it-289270257791.us-east4.run.app
  • GCS Storage Bucket: aisprint-491218-bucket 
  ──────
  ### 🧰 Summary of Available MCP Tools

  #### 🐳 Infrastructure &amp;amp; Deployment

  • deploy_vllm : Deploys vLLM to Cloud Run GPU (NVIDIA L4 in us-east4 ).
  • destroy_vllm : Deletes the Cloud Run vLLM service.
  • status_vllm : Checks the status of the Cloud Run vLLM service.
  • update_vllm_scaling : Configures min/max instances.
  • get_vllm_deployment_config / get_vllm_gpu_deployment_config : Outputs deployment configs for Cloud Run and GKE
  (NVIDIA L4).
  • check_gpu_quotas : Checks GPU resource availability and quotas.

  #### 📦 Model Management

  • list_vertex_models / list_bucket_models : Lists available model registries and GCS weight locations.
  • save_hf_token : Secures your Hugging Face API token in Secret Manager.
  • get_vertex_ai_model_copy_instructions / get_huggingface_model_copy_instructions : Guide commands to ingest
  models.

  #### 📊 Monitoring, Diagnostics &amp;amp; Benchmarks

  • get_system_status : Pulls high-level dashboard metrics and active settings.
  • verify_model_health : Verifies latency and connectivity.
  • run_benchmark : Performs concurrency sweeps and latency profiling.
  • analyze_cloud_logging / analyze_gpu_logs : Diagnoses SRE errors and parses system logs using the self-hosted
  model.
  • suggest_sre_remediation : Automatically generates remediation steps for detected errors.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Deploy The Model
&lt;/h4&gt;

&lt;p&gt;The MCP server tools are used to deploy the model to Cloud Run with TPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deploy the model

  The container logs show that the vLLM engine initialized correctly and began loading the model checkpoint files from
  the GCS FUSE mount ( /mnt/models/gemma-4-E4B-it ) at 18:25:53 .

  Since the weights are read on-demand over the network via FUSE and the engine has to compile CUDA graphs, the
  initialization phase takes several minutes before the startup health probe gets a 200 OK at /health . I've set
  another 90-second status timer and will monitor its progress.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Checking System status
&lt;/h4&gt;

&lt;p&gt;The status can be checked with an MCP tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_system_status

● gpu-devops-agent/get_system_status(System status check) (ctrl+o to expand)

  The system status is fully online:

  ### 🌀 GPU Cloud Run System Status

  • vLLM Health: 🟢 Online (Endpoint https://vllm-gemma-4-e4b-it-289270257791.us-east4.run.app)
  • Cloud Run Service Status: 🟢 Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cross Check The Deployed Model
&lt;/h4&gt;

&lt;p&gt;Once the model starts locally- the MCP tool allows for model verification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; verify_model_health

● gpu-devops-agent/verify_model_health(Model health check) (ctrl+o to expand)

  The model health check has successfully passed:

  ### 🏥 Model Health Verification

  • Status: ✅ PASSED
  • Model Path: /mnt/models/gemma-4-E4B-it 
  • Latency: 1.35 seconds 
  • Response Snippet: "Hello! Yes, I am working. I am Gemma 4, a large la..."

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and model details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_active_models

● gpu-devops-agent/get_model_details(Model details retrieval) (ctrl+o to expand)

  The active model details from the running vLLM service are as follows:

  ### 🧩 Active Model details

  • Endpoint URL: https://vllm-gemma-4-e4b-it-289270257791.us-east4.run.app 
  • Active Model ID: /mnt/models/gemma-4-E4B-it 
  • Health Status: Healthy ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_endpoint

● gpu-devops-agent/get_endpoint(Endpoint retrieval) (ctrl+o to expand)

  The active endpoint URL for the Cloud Run vLLM deployment is:

  • Endpoint URL: https://vllm-gemma-4-e4b-it-289270257791.us-east4.run.app (🟢 Online)

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_system_details

● Bash(gcloud run services describe vllm-gemma-4-e4b-it --region us-east4 --project aisprint-491218 -...) (ctrl+o to
expand)

  Here are the detailed configuration and system specs of the active Cloud Run vLLM deployment:

  ### ⚙️ Hardware &amp;amp; Compute Resources

  • Accelerator: NVIDIA L4 GPU (1 unit)
  • CPU Limit: 8 vCPUs
  • Memory Limit: 32 GiB 
  • Execution Environment: Gen2
  • Storage Mount: aisprint-491218-bucket (GCS Bucket mounted at /mnt/models via GCS Fused volume driver, read-
  only)

  ### 🚀 vLLM Engine Configuration

  • Container Image: vllm/vllm-openai:latest 
  • Entrypoint: python3 -m vllm.entrypoints.openai.api_server 
  • Startup Arguments:
      • --model=/mnt/models/gemma-4-E4B-it 
      • --dtype=bfloat16 
      • --max-model-len=16384 
      • --gpu-memory-utilization=0.95 
      • --kv-cache-dtype=fp8 
      • --limit-mm-per-prompt={} 
      • --tensor-parallel-size=1 
      • --max-num-seqs=8 
      • --max-num-batched-tokens=4096 
      • --enable-auto-tool-choice 
      • --tool-call-parser=gemma4 
      • --reasoning-parser=gemma4 

  ### 📈 Network &amp;amp; Autoscaling

  • Container Concurrency: 4 simultaneous requests
  • Autoscaling Target: Max Revision Scale = 1 
  • Startup Probe: HTTP GET /health on port 8000 (Initial delay: 180s , Timeout: 60s )

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the Cloud Run deployment status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; show the cloud run docker status

● Bash(gcloud run services describe vllm-gemma-4-e4b-it --region us-east4 --project aisprint-491218 -...) (ctrl+o to
expand)

  In Cloud Run, the "docker container status" is tracked via its Service Conditions and Revisions.

  Here is the status of the container deployment:

  ### 📦 Container Service Status

  • Service URL: https://vllm-gemma-4-e4b-it-wgcq55zbfq-uk.a.run.app 
  • Active Container Image: vllm/vllm-openai:latest 
  • Latest Revision: vllm-gemma-4-e4b-it-00023-n4c (healthy and serving 100% of traffic)

  ### 🏥 System Status Conditions

   Condition Type | Status | Last Transition Time | Description
  -----------------------|-----------|------------------------|--------------------------------------------------------
    Ready | 🟢 True | 2026-05-28T18:32:41Z | The container is healthy, initialized, and accepting
                         | | | incoming requests.
    ConfigurationsReady | 🟢 True | 2026-05-28T18:23:35Z | Service parameters, environment variables, volumes,
                         | | | and hardware specs are valid.
    RoutesReady | 🟢 True | 2026-05-28T18:32:41Z | Traffic routing configuration and network load
                         | | | balancing are ready.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check the Cloud Run Service
&lt;/h4&gt;

&lt;p&gt;Once Deployed — the model is visible as a standard Cloud Run Service:&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%2F8nu2zgscafhwt30y6loy.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%2F8nu2zgscafhwt30y6loy.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Review the Model
&lt;/h4&gt;

&lt;p&gt;Check the model details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what are the model details?

● gpu-devops-agent/get_model_details(Model details retrieval) (ctrl+o to expand)

  The deployed model details are as follows:

  ### 🧩 Active Serving Model

  • Model ID / Name: /mnt/models/gemma-4-E4B-it 
  • Object Type: model (OpenAI-compatible /v1/models format)
  • Serving Platform: vLLM 
  • Health Status: Healthy ✅

  ### ℹ️ About Gemma 4 (E4B-it)

  • Model Family: Gemma 4 (Google's lightweight, state-of-the-art open models built from the same research and
  technology used to create the Gemini models).
  • Variant: E4B-it (Experimental ~4 Billion parameter Instruction-Tuned model).
  • Optimization: Configured to run in bfloat16 precision with FP8 KV caching to optimize memory usage and processing
  speed on the NVIDIA L4 GPU.
  • Context Window: Configured for up to 16,384 tokens.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything is online — you can send queries to the Model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; query_gemma4_with_stats what is gemma4?

● gpu-devops-agent/query_gemma4_with_stats(Query Gemma 4) (ctrl+o to expand)

  Here is the response from the model, along with performance statistics:

  ### 💬 Model Response

  │ I am Gemma 4. I am a Large Language Model developed by Google DeepMind. I am an open weights model.

  ### 📊 Serving Performance Stats

  • Model ID: /mnt/models/gemma-4-E4B-it 
  • Time to First Token (TTFT): 0.094s (Excellent startup latency)
  • Tokens per Second: 25.63 tokens/s 
  • Total Generation Time: 1.07s 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Benchmark the Local Model
&lt;/h4&gt;

&lt;p&gt;The local model was benchmarked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; The benchmark sweep has completed successfully. Here are the compiled results across all combinations of context
  window sizes and concurrency levels:

  ### 📈 Concurrency &amp;amp; Context Window Benchmark Sweep (Gemma 4 E4B-it)

   Context Window | Concurrency | Success Rate | Avg Latency (s) | Throughput (tok/s)
  -------------------|------------------------------------|-------------------|------------------|---------------------
   8 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.69 - 1.88s | 18.90 - 89.64 tok/s
   16 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.68 - 1.84s | 23.34 - 89.40 tok/s
   32 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.69 - 1.85s | 22.99 - 88.48 tok/s
   64 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.15 - 0.49s | 13.48 - 42.61 tok/s
   128 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.14 - 0.50s | 13.69 - 44.76 tok/s
   256 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.14 - 0.51s | 13.62 - 43.54 tok/s
   512 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.15 - 0.51s | 13.03 - 42.63 tok/s
   1024 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.16 - 0.51s | 12.22 - 41.20 tok/s
   2048 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.18 - 0.51s | 10.96 - 42.17 tok/s
   4096 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.21 - 0.56s | 17.45 - 39.08 tok/s
   8192 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.23 - 0.66s | 17.21 - 34.89 tok/s
   16384 | 1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 | 100.0% | 0.27 - 0.81s | 14.18 - 27.59 tok/s

  ### 🔍 Key Findings

  • 100% Success Rate: Every request across all context window tests completed successfully without a single OOM or
  timeout.
  • Throughput Scaling: High concurrency configurations (16 to 128 concurrent users) hit optimal throughput peaks of 80
  to 90 tok/s for smaller context sizes, and remained highly stable around 25 to 27 tok/s even at the maximum 16,384
  context window.

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

&lt;/div&gt;



&lt;p&gt;The analysis is reviewed:&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="gu"&gt;## 🔍 Key Performance Insights&lt;/span&gt;

&lt;span class="gu"&gt;### 1. Throughput Scaling (Left Chart)&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**High Efficiency at Low Concurrency**&lt;/span&gt; : With single-user requests (concurrency = 1), throughput is highly consistent acr
oss smaller context sizes.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Concurrency Scaling**&lt;/span&gt; : As concurrency climbs from 1 to 16, throughput scales up significantly, peaking around &lt;span class="ge"&gt;**&lt;/span&gt;80 to 
90 tokens/second&lt;span class="ge"&gt;**&lt;/span&gt; at smaller context windows. This proves the efficacy of vLLM's continuous batching implementation.
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Large Context Handling**&lt;/span&gt; : At the maximum context window size of &lt;span class="gs"&gt;**16,384 tokens**&lt;/span&gt; , throughput remains extremely stable
 around &lt;span class="gs"&gt;**25 to 27 tokens/second**&lt;/span&gt; , demonstrating that the GPU is fully capable of serving long-context requests under hig
h loads without degradation.

&lt;span class="gu"&gt;### 2. Latency Characteristics (Right Chart)&lt;/span&gt;
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Sub-Second Response Times**&lt;/span&gt; : Across all tested context windows (from 8 to 16,384 tokens), average latency remains well
 below 1 second for standard workloads (concurrency levels 1 to 32).
&lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="gs"&gt;**Predictable Scaling**&lt;/span&gt; : Even at maximum concurrency (128 concurrent users) and largest context sizes, latency stays und
er &lt;span class="gs"&gt;**1 second**&lt;/span&gt; on average, making this stack highly suitable for real-time applications and SRE automated diagnostic work
flows.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is visualized:&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%2Fy2ugyf0lb9k7cocdkuy5.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%2Fy2ugyf0lb9k7cocdkuy5.png" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;The strategy for using MCP for Gemma 4 GPU deployment with Antigravity CLI was validated with a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;A minimal stdio transport MCP Server was started from Python source code and validated with Antigravity CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to deploy and troubleshoot Cloud Run Model deployments.&lt;/p&gt;

</description>
      <category>googlecloudrun</category>
      <category>antigravitycli</category>
      <category>gemma4</category>
      <category>mcpserver</category>
    </item>
    <item>
      <title>Local Gemma 4 Deployment with MCP and Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 28 May 2026 15:53:51 +0000</pubDate>
      <link>https://dev.to/gde/local-gemma-4-deployment-with-mcp-and-antigravity-cli-hk8</link>
      <guid>https://dev.to/gde/local-gemma-4-deployment-with-mcp-and-antigravity-cli-hk8</guid>
      <description>&lt;p&gt;This article provides a step by step deployment guide for Gemma 4 to a 13th Gen Intel i7–1360P running Chrome OS Flex. A suite of Python MCP tools is built to simplify management of the Ollama hosted Gemma 4 deployment with Antigravity CLI.&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%2Fzxb41qb9nlfiea9r7tlj.jpeg" 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%2Fzxb41qb9nlfiea9r7tlj.jpeg" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is this project trying to Do?
&lt;/h4&gt;

&lt;p&gt;This project is a DevOps/SRE assistant that uses a Gemma 4 model self-hosted locally. It provides tools to provision the Docker container and deploy the model, as well as for observability and performance testing.&lt;/p&gt;

&lt;p&gt;This project is similar to a previous project that targeted TPU hosted Gemma4 instances on GCP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/self-hosted-gemma-4-on-tpu-with-mcp-adk-and-gemini-cli-7f646458a3c3" rel="noopener noreferrer"&gt;Self-hosted Gemma 4 on TPU with vLLM, MCP, ADK, and Gemini CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Full Installation Instructions
&lt;/h4&gt;

&lt;p&gt;The detailed installation instructions for Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Python MCP Documentation
&lt;/h4&gt;

&lt;p&gt;The official GitHub Repo provides samples and documentation for getting started:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Where do I start?
&lt;/h4&gt;

&lt;p&gt;The strategy for starting MCP development for model management is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.&lt;/p&gt;

&lt;p&gt;Then, a minimal Python MCP Server is built with stdio transport. This server is validated with Antigravity CLI in the local environment.&lt;/p&gt;

&lt;p&gt;This setup validates the connection from Antigravity CLI to the local server via MCP. The MCP client (Gemini CLI) and the Python MCP server both run in the same local environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup the Basic Environment
&lt;/h4&gt;

&lt;p&gt;At this point you should have a working Python environment and a working Gemini CLI installation. The next step is to clone the GitHub samples repository with support scripts:&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;cd&lt;/span&gt; ~
git clone https://github.com/xbill9/gemma4-tips
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;strong&gt;init.sh&lt;/strong&gt; from the cloned directory.&lt;/p&gt;

&lt;p&gt;The script will attempt to determine your shell environment and set the correct variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;local-devops-agent
&lt;span class="nb"&gt;source &lt;/span&gt;init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your session times out or you need to re-authenticate- you can run the &lt;strong&gt;set_env.sh&lt;/strong&gt; script to reset your environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;local-devops-agent
&lt;span class="nb"&gt;source &lt;/span&gt;set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables like PROJECT_ID need to be setup for use in the various build scripts- so the set_env script can be used to reset the environment if you time-out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Model Management Tool with MCP Stdio Transport
&lt;/h4&gt;

&lt;p&gt;One of the key features that the standard MCP libraries provide is abstracting various transport methods.&lt;/p&gt;

&lt;p&gt;The high level MCP tool implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.&lt;/p&gt;

&lt;p&gt;The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.&lt;/p&gt;

&lt;p&gt;The connection over stdio will look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Initialize FastMCP server
&lt;/span&gt;&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Self-Hosted vLLM DevOps Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Running the Python Code
&lt;/h4&gt;

&lt;p&gt;First- switch the directory with the Python version of the MCP sample code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/gemma4-tips/local-devops-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the release version on the local system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;Processing ./.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The project can also be linted:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/gemma4-tips/local-devops-agent$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make lint
&lt;span class="go"&gt;ruff check .
All checks passed!
ruff format --check .
9 files already formatted
mypy .
Success: no issues found in 9 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a test run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/gemma4-tips/local-devops-agent$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;python test_agent.py
.......2026-05-28 10:41:49,403 - vllm-devops-agent - INFO - Querying model with stats with prompt: 'Hi...'
2026-05-28 10:41:49,404 - vllm-devops-agent - INFO - Model response with stats: TTFT=0.000s, TotalTime=0.000s
&lt;/span&gt;&lt;span class="c"&gt;.....
&lt;/span&gt;&lt;span class="go"&gt;----------------------------------------------------------------------
Ran 12 tests in 0.038s

OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Docker Interaction with MCP stdio Transport
&lt;/h4&gt;

&lt;p&gt;One of the key features that the MCP protocol provides is abstracting various transport methods.&lt;/p&gt;

&lt;p&gt;The high level tool MCP implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.&lt;/p&gt;

&lt;p&gt;The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.&lt;/p&gt;

&lt;p&gt;In this project Gemini CLI is used as the MCP client to interact with the Python MCP server code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI mcp_config.json
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .agents directory:&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;"local-devops-agent"&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;"python3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/gemma4-tips/local-devops-agent/server.py"&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;"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;"GOOGLE_CLOUD_PROJECT"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"aisprint-491218"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MODEL_NAME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"google/gemma-4-E2B-it"&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;h4&gt;
  
  
  Validation with Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Antigravity CLI as a MCP client with the Python code providing the MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
/mcp list
&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
MCP Servers

Plugins (~/.gemini/antigravity-cli/plugins)
&amp;gt; ✓ google-dev-knowledge Tools: search_documents, answer_query, get_documents
   ✓ local-devops-agent Tools: verify_model_health, save_hf_token, manage_docker, get_system_status, get_endpoint, +9
                         more

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Getting Started with Gemma 4 Locally
&lt;/h4&gt;

&lt;p&gt;As most local deployments are constrained- the Ollama engine is used in a Docker container:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.ollama.com/docker" rel="noopener noreferrer"&gt;Docker - Ollama&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Official vLLM repo also has Gemma4 specific information:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vllm-project/vllm/releases/tag/v0.19.1" rel="noopener noreferrer"&gt;Release v0.19.1 · vllm-project/vllm&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Model Lifecycle Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing vLLM deployment on Cloud Run or a TPU.&lt;/p&gt;

&lt;p&gt;Overview of MCP tools :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; print out mcp tools

  Here is the updated list of available MCP tools for the local Gemma 4 agent:

   Tool Name | Description | Code Location
  ---------------------------|-----------------------------------------------------------------------|-----------------
    analyze_local_logs | Analyzes the local container logs using Gemma 4 to find SRE/DevOps | server.py
                             | errors. |
    get_active_models | Gets the currently loaded models in Ollama's memory. | server.py
    get_docker_logs | Retrieves startup and execution logs from the Docker container. | server.py
    get_endpoint | Checks endpoint connectivity and returns the service URL. | server.py
    get_help | Provides help text and summarizes the configuration options. | server.py
    get_model_show_details | Gets parameters, architecture, license, and config for a model. | server.py
    get_system_details | Retrieves detailed information about the running local model, engine, | server.py
                             | and versions. |
    get_system_status | Displays a dashboard of container and serving health status. | server.py
    manage_docker | Starts, stops, restarts, or removes the container. | server.py
    query_gemma4 | Standard prompt query interface for the local model. | server.py
    query_gemma4_with_stats | Prompt interface returning performance metrics (latency, TTFT). | server.py
    run_benchmark | Runs the benchmark suite or vLLM benchmarking script. | server.py
    save_hf_token | Securely caches a Hugging Face API token. | server.py
    verify_model_health | Runs a deep health check verifying latency and response correctness. | server.py

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Checking System status
&lt;/h4&gt;

&lt;p&gt;The status can be checked with an MCP tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ### 1. High-Level Dashboard: get_system_status 

  • Purpose: Checks the container status (via docker ps ) and model server availability to present a dashboard.
  • Function: server.py
  • Current Status:
      • vLLM Health: 🟢 Online (http://localhost:8000)
      • Docker Container Status: 🟢 Running

  ### 2. Service Connectivity Endpoint: get_endpoint 

  • Purpose: Verifies model service endpoint connectivity and reports the URL.
  • Function: server.py
  • Current Output:
  │ 🟢 Local vLLM/Ollama is Online at: http://localhost:8000 

  ### 3. Active Models in Memory: get_active_models 
  • Purpose: Checks which models are currently loaded in RAM/VRAM, along with context size and processor status (Ollama
  backend only).
  • Function: server.py
  • Current Output:
    NAME ID SIZE PROCESSOR CONTEXT UNTIL
  (Note: The active model list is currently empty, meaning no models are loaded in memory yet)

  ### 4. Deep Model Properties: get_model_show_details 

  • Purpose: Queries parameter details, license, system prompt templates, and architecture layers for a specific model
  (Ollama backend only).
  • Function: server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Deploy The Model Locally
&lt;/h4&gt;

&lt;p&gt;Once the base Docker environment has been checked- the Gemma model can be deployed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; deploy gemma4

● Read(/home/xbill/gemma4-tips/local-devops-agent/server.py)
● Read(/home/xbill/.gemini/antigravity-cli/mcp/local-devops-agent/manage_docker.json)
● local-devops-agent/manage_docker(Start Docker container)
● local-devops-agent/get_system_status(System status check)
● Read(/home/xbill/.gemini/antigravity-cli/mcp/local-devops-agent/verify_model_health.json)
● local-devops-agent/verify_model_health(Model health check) (ctrl+o to expand)

  The Gemma 4 local container stack has been successfully started and verified:

  1. Docker Container Start: Called server.py with action="start" to run or start the gemma4 container and
  pull the model.
  2. Status Check: Verified that the container status via server.py is 🟢 Running and online.
  3. Health Validation: Executed server.py, which passed with the following metrics:
      • Response: "Hello. Yes, I am working and ready to assist you." 
      • Latency: 39.10 seconds 

  The inference service is fully online at http://localhost:8000 and ready to serve requests.

  ### Summary of Work

  • Started the gemma4 Docker container using the server.py tool.
  • Verified status and deep endpoint health using server.py and server.py.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cross Check The Deployed Model
&lt;/h4&gt;

&lt;p&gt;Once the model starts locally- the MCP tool allows for model verification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Performs a deep health check by querying the model with a simple prompt and measuring response
    latency.

● local-devops-agent/verify_model_health(Model health check) (ctrl+o to expand)

  The health check has completed:

  • Status: ✅ Model health check PASSED
  • Response: "Hello! Yes, I am working and ready to assist you." 
  • Latency: 17.51 seconds 

  You can inspect the definition of this check in server.py within server.py.

  ### Summary of Work

  • Ran the server.py tool.
  • Verified the local Gemma 4 endpoint response latency and output.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and model details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_active_models

● local-devops-agent/get_active_models(Active models check)
● Read(/home/xbill/.gemini/antigravity-cli/mcp/local-devops-agent/query_gemma4.json)
● local-devops-agent/query_gemma4(Query local model)
● local-devops-agent/get_active_models(Active models check) (ctrl+o to expand)

  The local model has been loaded, and the resource details from server.py are shown below:

  ### 📊 Active Loaded Models:

    NAME ID SIZE PROCESSOR CONTEXT UNTIL
    gemma4:e2b 7fbdbf8f5e45 7.6 GB 100% CPU 4096 4 minutes from now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_endpoint

● local-devops-agent/get_endpoint(Local agent endpoint check) (ctrl+o to expand)

  The local Gemma 4 model server endpoint checked by server.py is active:

  │ 🟢 Local vLLM/Ollama is Online at: http://localhost:8000 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; get_system_details

● Read(/home/xbill/.gemini/antigravity-cli/mcp/local-devops-agent/get_system_details.json)
● local-devops-agent/get_system_details(System details check) (ctrl+o to expand)

  Here is the output from the renamed server.py tool:

  ### 🧩 Model Details (http://localhost:8000)

  Model Information ( /v1/models ):

    {
      "object": "list",
      "data": [
        {
          "id": "gemma4:e2b",
          "object": "model",
          "created": 1779979910,
          "owned_by": "library"
        }
      ]
    }

  Health Status ( /v1/models ):

  • Status: Healthy ✅

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

&lt;/div&gt;



&lt;p&gt;Check the Docker status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; manage_docker status
● local-devops-agent/manage_docker(Check Docker status) (ctrl+o to expand)
  Here is the status of the local Docker container as returned by server.py with action="status" :
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
  NAMES
    5b5917a97e98 ollama/ollama:latest "/bin/ollama serve" 53 minutes ago Up 53 minutes 0.0.0.0:8000-
  &amp;gt;11434/tcp, [::]:8000-&amp;gt;11434/tcp gemma4
  ### Summary of Work
  • Invoked server.py with action="status" to query container metrics directly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Review the Model
&lt;/h4&gt;

&lt;p&gt;Check the model details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Here are the deep parameters and configurations for the loaded model retrieved by server.py:

  ### 🧩 Model Details for gemma4:e2b :

    Model
        architecture gemma4
        parameters 5.1B
        context length 131072
        embedding length 1536
        quantization Q4_K_M
        requires 0.20.0

      Capabilities
        completion
        vision
        audio
        tools
        thinking

      Parameters
        temperature 1
        top_k 64
        top_p 0.95

      License
        Apache License
        Version 2.0, January 2004
        ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once everything is online — you can send queries to the Model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; query_gemma4_with_stats what is gemma4?

● Read(/home/xbill/.gemini/antigravity-cli/mcp/local-devops-agent/query_gemma4_with_stats.json)
● local-devops-agent/query_gemma4_with_stats(Query local model with stats) (ctrl+o to expand)

  Here is the response from querying the local model along with performance statistics, using server.py:

  ### 📊 Performance Stats

  • Time to First Token (TTFT): 10.262s 
  • Total Generation Time: 96.890s 
  • Tokens per Second: 2.53 tokens/s 
  • Total Tokens (approx.): 219 

  ### 💬 Model Response

  Gemma 4 is a family of large language models developed by Google DeepMind.

  Here are the key things to know about Gemma 4:

  1. Nature: It is a family of open-weights models, meaning the weights (the parameters that define the model) are
  publicly available, allowing researchers, developers, and the community to freely use, modify, and build upon the
  technology.
  2. Purpose: Like other large language models, Gemma 4 is designed to understand, generate, and process human language.
  3. Development: It is part of Google DeepMind's efforts to create powerful, responsible, and accessible AI models.
  4. Use Cases: It can be used for a wide variety of NLP tasks, including:
      • Text generation (writing stories, code, emails)
      • Translation
      • Summarization
      • Question answering
      • Code assistance

  In short, Gemma models represent an effort to make advanced large language model technology more accessible to the
  wider community.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Benchmark the Local Model
&lt;/h4&gt;

&lt;p&gt;The local model was benchmarked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  I have started the custom benchmark sweep using the parameters you requested:

  • Tokens: 4 , 8 , 16 , 32 , 64 
  • Concurrency (Concurrent Users): 1 , 2 , 4 

  Analyzing Task Results
  The custom benchmark sweep has completed successfully! Here is the performance data generated across the requested
  token lengths ( 4 , 8 , 16 , 32 , 64 ) and concurrent user counts ( 1 , 2 , 4 ) using the server.py suite:

  ### 📈 Benchmark Results Table

   Concurrency | Max Tokens | Success Rate | Avg Latency (s) | P95 Latency (s) | Throughput (req/s) | Gen Speed (tokens
  -------------|------------|--------------|-----------------|-----------------|--------------------|------------------
        1 | 4 | 100% | 1.14s | 1.73s | 0.87 | 3.49
        2 | 4 | 100% | 1.09s | 1.42s | 1.62 | 6.46
        4 | 4 | 100% | 1.18s | 1.42s | 2.10 | 8.42
        1 | 8 | 100% | 1.33s | 2.36s | 0.75 | 6.00
        2 | 8 | 100% | 1.69s | 2.15s | 0.93 | 7.46
        4 | 8 | 100% | 3.53s | 5.17s | 0.58 | 4.64
        1 | 16 | 100% | 2.58s | 4.40s | 0.39 | 6.20
        2 | 16 | 100% | 5.37s | 7.06s | 0.33 | 5.30
        4 | 16 | 100% | 5.65s | 8.49s | 0.35 | 5.65
        1 | 32 | 100% | 3.91s | 5.73s | 0.26 | 8.19
        2 | 32 | 100% | 8.73s | 11.34s | 0.20 | 6.46
        4 | 32 | 100% | 7.53s | 10.94s | 0.27 | 8.77
        1 | 64 | 100% | 6.77s | 10.13s | 0.15 | 9.46
        2 | 64 | 100% | 19.89s | 23.76s | 0.08 | 5.34
        4 | 64 | 100% | 20.35s | 30.30s | 0.10 | 6.34

  ### 🔍 Key Takeaways:

  1. Concurrency Scaling for Short Tokens: At small token lengths (e.g., 4 tokens), increasing concurrency from 1 to 4
  improves throughput from 0.87 req/s to 2.10 req/s with negligible impact on average latency.
  2. Resource Contention on Larger Sweeps: For longer token generations (e.g., 64 tokens), higher concurrency causes
  severe queuing and latency spikes on CPU execution, with average latency jumping from 6.77s (concurrency 1) to 20.35s
  (concurrency 4).
  3. Generation Speed: The generation speed remains relatively stable across most tests, hovering between 3.5 tokens/s 
  and 9.5 tokens/s.

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

&lt;/div&gt;



&lt;p&gt;This is visualized:&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%2F8z5mge8ywn91ztpi7jt6.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%2F8z5mge8ywn91ztpi7jt6.png" width="799" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;The strategy for using MCP for local Gemma 4 deployment with Antigravity CLI was validated with a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;A minimal stdio transport MCP Server was started from Python source code and validated with Antigravity CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to deploy and troubleshoot local Model deployments.&lt;/p&gt;

</description>
      <category>ollama</category>
      <category>gemma4</category>
      <category>antigravitycli</category>
      <category>mcps</category>
    </item>
    <item>
      <title>Cross Language A2A Agent Benchmarking with Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Wed, 27 May 2026 15:12:00 +0000</pubDate>
      <link>https://dev.to/gde/cross-language-a2a-agent-benchmarking-with-antigravity-cli-hn1</link>
      <guid>https://dev.to/gde/cross-language-a2a-agent-benchmarking-with-antigravity-cli-hn1</guid>
      <description>&lt;h4&gt;
  
  
  Building a Benchmarking Agent with A2A and MCP
&lt;/h4&gt;

&lt;p&gt;This tutorial aims to build and test benchmarking Agents using the A2A protocol across several popular programming languages. The Master Orchestrator Agent is exposed via MCP to allow Antigravity CLI to be used as a MCP client.&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%2Ffdus3n0g3pgdxvc12uiw.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%2Ffdus3n0g3pgdxvc12uiw.png" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Deja Vu — What is Old is New!
&lt;/h4&gt;

&lt;p&gt;This paper is a re-visiting of the original benchmark series with Gemini CLI over Node, GO, and Python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/cross-language-a2a-agent-benchmarking-with-gemini-3-and-gemini-cli-930eb3fd8507" rel="noopener noreferrer"&gt;Cross Language A2A Agent Benchmarking with Gemini 3 and Gemini CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this updated version, the Antigravity CLI is used over Node, GO, Python, and Rust.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I need Multi-Language Support? Can’t I just use Python?
&lt;/h4&gt;

&lt;p&gt;Most mature Agent development tools and libraries are Python based. Python allows for rapid prototyping and evaluation of approaches. Python is also an interpreted language- which has trade-offs in memory safety, and performance. Other languages like GO and Rust offer high performance and memory safe operations. With a language neutral communication protocol — the actual Agent implementation of each Agent can be coded in the most appropriate language.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is this Approach actually Benchmarking?
&lt;/h4&gt;

&lt;p&gt;The high level goal was to measure the actual time spent running an algorithm in the native language code inside the A2A agent. Each language had a slightly different implementation due to the language syntax. After running the algorithm- each Agent was instructed to calculate and return the elapsed time for cross language comparison.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is the Agent Development Kit?
&lt;/h4&gt;

&lt;p&gt;The Agent Development Kit (ADK) is a flexible and modular framework for &lt;strong&gt;developing and deploying AI agents&lt;/strong&gt;. While optimized for Gemini and the Google ecosystem, ADK is &lt;strong&gt;model-agnostic&lt;/strong&gt; , &lt;strong&gt;deployment-agnostic&lt;/strong&gt; , and is built for &lt;strong&gt;compatibility with other frameworks&lt;/strong&gt;. The official ADK is only currently available in the Python, GO, and Java programming languages.&lt;/p&gt;

&lt;h4&gt;
  
  
  Google’s Agent Stack in Action: ADK, MCP, A2A on Google Cloud
&lt;/h4&gt;

&lt;p&gt;Google provides full documentation on the Agent Development Kit (ADK) here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;Agent Development Kit (ADK)&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is the A2A protocol?
&lt;/h4&gt;

&lt;p&gt;The Agent2Agent (A2A) protocol, an open communication standard for AI agents, was initially introduced by Google in April 2025. It is specifically engineered to facilitate seamless interoperability within multi-agent systems, enabling AI agents developed by diverse providers or built upon disparate AI agent frameworks to communicate and collaborate effectively.&lt;/p&gt;

&lt;p&gt;A good overview of the A2A protocol can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;A2A Protocol&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Language Support For the A2A Protocol
&lt;/h4&gt;

&lt;p&gt;The official ADK for Python, GO, and Java provide built-in support for working with the A2A protocol. For other programming languages like JS, Rust, and .NET — 3rd party libraries are available to add support for the protocol.&lt;/p&gt;

&lt;p&gt;The main source for A2A Language support is the GitHub repo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/A2A" rel="noopener noreferrer"&gt;GitHub - a2aproject/A2A: An open protocol enabling communication and interoperability between opaque agentic applications.&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Tool Chain Setup for A2A
&lt;/h4&gt;

&lt;p&gt;This article targets the Python, GO, Rust, and JavaScript environments.&lt;/p&gt;

&lt;p&gt;The build tools for each language environment need to be in place. For building with Python- a working Python environment with 3.12 or later along with package management tools like uv or pip is required.&lt;/p&gt;

&lt;p&gt;For building with GO — a recent version of the GO compiler (1.24.1 or later) is required.&lt;/p&gt;

&lt;p&gt;For building with Rust, the Rust tool chain is required.&lt;/p&gt;

&lt;p&gt;For building with Node / JavaScript — a working Node.js environment with Node version 20 or later and a functional npm tool is needed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/gde/getting-started-with-antigravity-cli-183g"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking the Developer Environment
&lt;/h4&gt;

&lt;p&gt;Verify that all the prerequisite packages and compilers are installed — and clone the sample Github repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/xbill9/a2a-benchmark
cd a2a-benchmark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you have your Google Cloud Project and preferred authentication method — run the &lt;strong&gt;init.sh&lt;/strong&gt; script to validate the setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/a2a-benchmark$ source init.sh
Project ID file found, skipping.
--- Authentication Method ---
Do you want to use a Gemini API Key for authentication? (y/n): n
WARNING: Your active project does not match the quota project in your local Application Default Credentials file. This might result in unexpected quota issues.

To update your Application Default Credentials quota project, use the `gcloud auth application-default set-quota-project` command.
Updated property [core/project].
--- Setup complete ---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;set_env.sh&lt;/strong&gt; script is provided to set common ADK environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/a2a-benchmark$ source set_env.sh
--- Setting Google Cloud Environment Variables ---
Checking gcloud authentication status...
gcloud is authenticated.
Exported PROJECT_ID=comglitn
Exported PROJECT_NUMBER=1056842563084
Exported SERVICE_ACCOUNT_NAME=1056842563084-compute@developer.gserviceaccount.com
Exported GOOGLE_CLOUD_PROJECT=comglitn
Exported GOOGLE_GENAI_USE_VERTEXAI=TRUE
Exported GOOGLE_CLOUD_LOCATION=us-central1
Exported REPO_NAME=
Exported REGION=us-central1
--- Environment setup complete ---
xbill@penguin:~/a2a-benchmark$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Debugging API Permission Errors
&lt;/h4&gt;

&lt;p&gt;If your application default credentials expires or your Google Cloud Authentication expires you will get an error. The workaround is to re-authenticate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud auth login
gcloud auth application-default login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another common error is that the environment variables are not set correctly. Go the the root directory and re-run the &lt;strong&gt;set_env.sh&lt;/strong&gt; to set the variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/adk-hello-world-a2a
source set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Debugging Tools -A2A Inspector
&lt;/h4&gt;

&lt;p&gt;The A2A Inspector is a standalone tool that provides low level visibility into the A2A protocol. The GitHub is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;GitHub - a2aproject/a2a-inspector: Validation Tools for A2A Agents&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A summary of the features of the A2A inspector can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a2aprotocol.ai/docs/guide/a2a-inspector" rel="noopener noreferrer"&gt;A2A Protocol Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install the A2A Inspector:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~
git clone https://github.com/a2aproject/a2a-inspector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then follow the build instructions — you need &lt;strong&gt;&lt;em&gt;uv&lt;/em&gt;&lt;/strong&gt; , and a recent version of  &lt;strong&gt;&lt;em&gt;node&lt;/em&gt;&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector/blob/main/README.md" rel="noopener noreferrer"&gt;a2a-inspector/README.md at main · a2aproject/a2a-inspector&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Staring the A2A Inspector
&lt;/h4&gt;

&lt;p&gt;Once the A2A inspector has been installed- you can validate the installation by using this URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:5001/" rel="noopener noreferrer"&gt;http://127.0.0.1:5001/&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%2Fbqclvl5u4czdo3caj2k1.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%2Fbqclvl5u4czdo3caj2k1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Extending ADK Agents with A2A
&lt;/h4&gt;

&lt;p&gt;The ADK provides several key tools to allow standard ADK Agents to run as standalone A2A agents — without the ADK — either in A2A Client or A2A Server mode. The Python ADK includes libraries and samples to extend a standard ADK agent to enable A2A protocol features. Instead of running the agent inside the ADK web utility- the agents are dual purposed with A2A to be able to run as dedicated agents with their own embedded Uvicorn web server.&lt;/p&gt;

&lt;h4&gt;
  
  
  I am confused- How Does this all Work?
&lt;/h4&gt;

&lt;p&gt;When Agents are run in ADK mode — the ADK CLI or Web interface is used to directly interact with the Agents. The ADK UI is started in a well known port — usually 8000 and the Agents are accessed in that environment.&lt;/p&gt;

&lt;p&gt;The ADK does not automatically expose the agent as an A2A agent. The basic agent code from the ADK needs to be extended and enabled to run as a standalone A2A Agent. Without the additional A2A function calls and a active standalone web server- the Agents will not be usable in A2A mode.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mersenne Primes
&lt;/h4&gt;

&lt;p&gt;In &lt;a href="https://en.wikipedia.org/wiki/Mathematics" rel="noopener noreferrer"&gt;mathematics&lt;/a&gt;, a &lt;strong&gt;Mersenne prime&lt;/strong&gt; is a &lt;a href="https://en.wikipedia.org/wiki/Prime_number" rel="noopener noreferrer"&gt;prime number&lt;/a&gt; that is one less than a &lt;a href="https://en.wikipedia.org/wiki/Power_of_two" rel="noopener noreferrer"&gt;power of two&lt;/a&gt;. As of 2025, &lt;a href="https://en.wikipedia.org/wiki/List_of_Mersenne_primes_and_perfect_numbers" rel="noopener noreferrer"&gt;52 Mersenne primes&lt;/a&gt; are known. An interesting thing about Mersenne primes is that they are the easiest natural numbers to prove to be primes, so they make up the largest category on the list of known prime numbers. This example was chosen as a good problem as the computation is CPU bound and gets exponentially longer for each higher number.&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Cross Language Agents
&lt;/h4&gt;

&lt;p&gt;The a2a_benchmark Repo has sample scripts for running the ADK and various types of agents across programming languages. Each agent implements a Mersenne Prime Number generator with only basic optimization. The root directory of the a2a-benchmark directory contains several common agent development languages. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;benchmark-go (GO) A2A Server&lt;/li&gt;
&lt;li&gt;benchmark-python (Python) A2A Server&lt;/li&gt;
&lt;li&gt;benchmark-node (JavaScript) A2A Server&lt;/li&gt;
&lt;li&gt;benchmark-rust (Rust) A2A Server&lt;/li&gt;
&lt;li&gt;benchmark-master (Python) A2A Client / MCP Server&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (GO)
&lt;/h4&gt;

&lt;p&gt;This agent provides a basic Agent that generates Mersenne prime numbers. To run the agent — run the &lt;strong&gt;bench-go.sh&lt;/strong&gt; script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Running the Go project...
{"time":"2025-11-25T13:47:18.071713651-05:00","level":"INFO","msg":"Using Model ","model":"gemini-2.5-flash"}
{"time":"2025-11-25T13:47:18.07195886-05:00","level":"INFO","msg":"Starting A2A mersenne prime server","port":"8102"}
{"time":"2025-11-25T13:47:18.072116547-05:00","level":"INFO","msg":"Starting the web server: &amp;amp;{port:8102 writeTimeout:15000000000 readTimeout:15000000000 idleTimeout:60000000000}"}
{"time":"2025-11-25T13:47:18.072119644-05:00","level":"INFO","msg":""}
{"time":"2025-11-25T13:47:18.072121732-05:00","level":"INFO","msg":"Web servers starts on http://localhost:8102"}
{"time":"2025-11-25T13:47:18.072123829-05:00","level":"INFO","msg":" a2a: you can access A2A using jsonrpc protocol: http://localhost:8102"}
{"time":"2025-11-25T13:47:18.072125402-05:00","level":"INFO","msg":""}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The A2A inspector can be used to validate the Agent:&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%2Fjhi9959u9rc3fmlcamka.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%2Fjhi9959u9rc3fmlcamka.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"id": "adk-88a8aefa-3070-48ff-b8d1-631af65ea57e",
  "name": "generate_primes",
  "response": {
    "result": "Elapsed time: 307.932µs"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Python)
&lt;/h4&gt;

&lt;p&gt;This agent provides Python agent that implements the Mersenne generation algorithm.&lt;/p&gt;

&lt;p&gt;This Agent can be checked with the ADK web interface:&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%2Fzl0iumr5mifvue11n18r.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%2Fzl0iumr5mifvue11n18r.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what do you do

I can calculate Mersenne primes using the Lucas-Lehmer primality test. I can find the list of the first N Mersenne primes.

find the first 10 primes

It took 0.0002677440643310547 seconds to find the first 10 Mersenne primes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start the dedicated A2A version of the Python prime number generator Agent use the &lt;strong&gt;bench-python.sh&lt;/strong&gt; script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/a2a-benchmark$ source bench-python.sh

INFO: Started server process [10495]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8101 (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Node)
&lt;/h4&gt;

&lt;p&gt;This agent provides a minimal agent to generate a prime number. To run the Agent use the &lt;strong&gt;bench-node.sh&lt;/strong&gt; script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/xbill/a2a-benchmark/benchmark-node
staring a2a bench node generate prime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Agent can be validated with the A2A inspector on port 8103:&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%2Frwo65h1x3d69f3ksbppq.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%2Frwo65h1x3d69f3ksbppq.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A typical session will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what do you do
message
Found first 5 Mersenne primes in 0.09ms.

✅
find 10 primes
message
Found first 10 Mersenne primes in 0.81ms.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Rust)
&lt;/h4&gt;

&lt;p&gt;The Mersenne primes algorithm was newly implemented in Rust:&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%2F0qpfvho24apza3bpoupf.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%2F0qpfvho24apza3bpoupf.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A sample test script verified the A2A Agent skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/a2a-benchmark$ source test-rust.sh 
Checking if Rust A2A agent is running on port 8104...
Rust agent is already running.
Running Test 1: Fetching Agent Card...
Agent Card Response:
{
  "name": "Mersenne Prime Agent Rust",
  "description": "A rust agent that builds a list of the first n Mersenne primes and reports the elapsed time. Configured with model: Not specified.",
  "protocolVersion": "0.3.0",
  "version": "0.1.0",
  "url": "http://0.0.0.0:8104/",
  "skills": [
    {
      "id": "find-mersenne-rust",
      "name": "Find Mersenne Primes in rust",
      "description": "Finds the list of the first n Mersenne primes in Rust",
      "tags": [
        "math",
        "benchmark"
      ]
    }
  ],
  "capabilities": {},
  "defaultInputModes": [],
  "defaultOutputModes": []
}
✅ Test 1 Passed: Agent Card is valid.
Running Test 2: Sending message/send request to calculate 5 Mersenne primes...
Response:
{
  "id": 1,
  "jsonrpc": "2.0",
  "result": {
    "contextId": "test-context-123",
    "kind": "message",
    "messageId": "f20c704c-bafa-4081-a18d-8d7984d4213c",
    "parts": [
      {
        "kind": "text",
        "text": "Found first 5 Mersenne primes in 0.11ms."
      }
    ],
    "role": "agent"
  }
}
✅ Test 2 Passed: Successfully calculated primes.
Running Test 3: Sending invalid RPC method...
Error Response:
{
  "error": {
    "code": -32601,
    "message": "Method not found: invalid/method"
  },
  "id": 2,
  "jsonrpc": "2.0"
}
✅ Test 3 Passed: Invalid method was rejected successfully.
All tests passed successfully!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  MCP Master/Orchestrator Agent (Python)
&lt;/h4&gt;

&lt;p&gt;The final agent follows a slightly different pattern. It provides a minimal agent with several functions (Tools/Skills). It has one &lt;em&gt;root_agent&lt;/em&gt; and 3 remote agents connected over A2A. This agent also exposes an interface as a MCP server- allowing Antigravity CLI to be used as a MCP client.&lt;/p&gt;

&lt;p&gt;The Master Agent is started with a similar script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭──────────────────────────────────────────────────────────────────────────────╮                        
                       │ │                        
                       │ ▄▀▀ ▄▀█ █▀▀ ▀█▀ █▀▄▀█ █▀▀ █▀█ │                        
                       │ █▀ █▀█ ▄▄█ █ █ ▀ █ █▄▄ █▀▀ │                        
                       │ │                        
                       │ FastMCP 2.13.1 │                        
                       │ │                        
                       │ │                        
                       │ 🖥 Server name: benchmark │                        
                       │ │                        
                       │ 📦 Transport: HTTP │                        
                       │ 🔗 Server URL: http://127.0.0.1:8100/mcp │                        
                       │ │                        
                       │ 📚 Docs: https://gofastmcp.com │                        
                       │ 🚀 Hosting: https://fastmcp.cloud │                        
                       │ │                        
                       ╰──────────────────────────────────────────────────────────────────────────────╯                        


[11/25/25 14:17:36] INFO Starting MCP server 'benchmark' with transport 'http' on [http://127.0.0.1:8100/mcp](http://127.0.0.1:8100/mcp) server.py:2055
INFO: Started server process [21826]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on [http://127.0.0.1:8100](http://127.0.0.1:8100) (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity CLI with MCP Connection
&lt;/h4&gt;

&lt;p&gt;The Master Agent starts a FastMCP server interface. This allows Antigravity CLI to be used as a MCP client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/a2a-benchmark/.agents$ more mcp_config.json 
{
  "mcpServers": {
    "bench": {
      "serverUrl": "http://127.0.0.1:8100/mcp",
      "serverURL": "http://127.0.0.1:8100/mcp"
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  ADK Validation of the Master Agent
&lt;/h4&gt;

&lt;p&gt;Because it is Python based- the Master Agent can also be viewed with the ADK web interface:&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%2Fm2h4xqr470eibvsd6ie9.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%2Fm2h4xqr470eibvsd6ie9.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  So What is all this Doing?
&lt;/h4&gt;

&lt;p&gt;All of the setup and configuration allows you to start debugging and visualizing Agent flows using the A2A protocol. The Agents can be validated using the A2A Inspector. The Python Agents can be checked with the ADK web interfaces. The Master Agent can be validated with Antigravity CLI as a MCP client.&lt;/p&gt;

&lt;h4&gt;
  
  
  Time to Starting Running some Numbers!
&lt;/h4&gt;

&lt;p&gt;Now that the individual Agents have been validated — open several Terminal windows and start up all the remaining agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;benchmark-go.sh — (port 8102)&lt;/li&gt;
&lt;li&gt;benchmark-python.sh-(port 8101)&lt;/li&gt;
&lt;li&gt;benchmark-node.sh- (port 8103)&lt;/li&gt;
&lt;li&gt;benchmark-rust.sh- (port 8104)&lt;/li&gt;
&lt;li&gt;benchmark-master.sh — Orchestrator Agent (port 8100)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Start the Benchmarking Session
&lt;/h4&gt;

&lt;p&gt;Once all the agents have been started — the Master agent on port 8100 is connected over MCP with Antigravity CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  I have completed the benchmark run across all four language agents for primes 1 to 22.

  ### Summary of Actions Taken:

  1. Agent Startup &amp;amp; Verification: Automatically checked and started all four target language agents (Node.
  js/TypeScript, Rust, Go, Python) and verified they were active and listening on their respective A2A JSON-RPC ports.
  2. Benchmark Scripting: Created a customized benchmarking script run_benchmark_1_22.py that targets prime calculations
from
  $N = 1$ to $N = 22$.
  3. Execution: Ran the benchmark and recorded the exact computation time (within the tool call) and the total Agent-to-
  Agent (A2A) network/orchestration latency (RTT) for every prime count $N$.
  4. Data Plotting: Generated visualizations for both calculation times ( prime_calculation_times_1_22.png ) and
  overall latency ( a2a_latency_times_1_22.png ).
  5. Reporting: Compiled all calculations and visualizations into the analysis_results.md artifact.

  Please view analysis_results.md to inspect the table and embedded plots showing the comparison of calculation speeds
and
  latency characteristics!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Review Performance
&lt;/h4&gt;

&lt;p&gt;The results of the benchmark are graphed:&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%2F3y9f85p5f0ubik0urj3a.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%2F3y9f85p5f0ubik0urj3a.png" width="799" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With latency times:&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%2Fi7sdnszl6jezle4t77h3.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%2Fi7sdnszl6jezle4t77h3.png" width="799" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Final Results
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI summarized the results of the Agent Benchmarking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Formulating Key Findings
  Here is a summary of the key findings from the benchmark results for primes 1 to 22:

  ### 1. Core Computation Performance (Lucas-Lehmer Prime Calculation)

  • Rust is the fastest: Computes $N=22$ in 195.96 ms.
  • Node.js (TS) is extremely close: Computes $N=22$ in 214.06 ms.
  • Go performs well: Computes $N=22$ in 279.54 ms.
  • Python is the slowest: Computes $N=22$ in 572.48 ms (roughly 3x slower than Rust).

  ### 2. A2A Framework &amp;amp; Protocol Overhead

  • Minimal Overhead (Rust &amp;amp; Node.js):
      • Rust and Node.js use lightweight custom HTTP wrappers. Their framework overhead is practically negligible (&amp;lt; 2 
      ms). For example, Node's total round-trip time (RTT) for $N=22$ is 215.78 ms (only 1.72 ms higher than the raw
      calculation time).
  • Significant Base Overhead (Go &amp;amp; Python):
      • Both Go and Python use the official google-adk library. This introduces a fixed baseline overhead per request
      (schema validation, logging, and metadata context processing).
      • Go incurs a consistent baseline RTT of ~1.2s to 1.6s.
      • Python incurs a consistent baseline RTT of ~2.3s to 3.0s.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and a deeper dive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Analyzing Agent Initialization
  Based on an analysis of the codebase and execution paths, here is the breakdown of why the benchmark produced these
  results:
  ──────
  ### Factor 1: The Massive Latency (RTT) Difference (Framework vs. Mocking)

  The most striking difference is that Rust and Node.js have near-zero overhead, whereas Go takes ~1.5s and Python     
  takes
  ~2.5s. This is entirely due to how the agents process the benchmark messages:

  1. Rust and Node.js (Mocked Agent Logic / Direct Execution):
      • Both main.rs and server.ts implement custom JSON-RPC endpoints that intercept incoming queries and
      bypass the LLM entirely.
      • They use simple regex to extract the number of primes directly from the text "Calculate the first {N} Mersenne
      primes" , execute the math, and return a mock agent response message. Since there are no LLM API calls, the
      overhead is practically zero.
  2. Go and Python (Real Agentic Execution via ADK):
      • Both Go (main.go) and Python (agent.py) use the official Agent Development Kit ( google-adk ) and
      hook up the Gemini 2.5 Flash model.
      • When they receive a message, the ADK runner executes a full agent reasoning loop. This involves two sequential 
      remote LLM calls (one to determine which tool to call, and another to formulate the final natural language
      response).
      • This remote LLM invocation via the internet accounts for the 1.5–3.0 second latency overhead.

  ──────
  ### Factor 2: Mathematical Computation Speeds (Lucas-Lehmer Loop)

  At higher values (e.g., $N=22$, where the Mersenne number $2^{9941}-1$ has 2,993 decimal digits and the Lucas-Lehmer
  test requires 9,939 iterations of squaring and modular reductions), we see clear performance tiers:

  1. Rust (195.96 ms):
      • Rust is compiled to optimized native machine code (using --release ). The num-bigint crate executes the big
      integer arithmetic without garbage collection overhead, making it the most efficient compiled loop.
  2. Node.js (214.06 ms):
      • V8's JIT compiler is extremely good at compiling JavaScript loops to native machine instructions. Additionally,
      V8's native BigInt implementation is heavily optimized at the engine level (written in assembly/C++).
  3. Go (279.54 ms):
      • While Go compiles to native code, its implementation in main.go performs heap allocations inside the hot
      loop:
        a := new(big.Int).Rsh(s, uint(p))
        b := new(big.Int).And(s, m)
      Allocating new big.Int objects inside a loop that runs thousands of times puts extra pressure on Go's runtime
      allocator and garbage collector, dragging down performance compared to Rust.
  4. Python (572.48 ms):
      • Python handles arbitrary-precision integers natively, but executing the loop in interpreted bytecode has a lot
      of interpreter overhead compared to compiled or JIT-compiled languages. 9,939 iterations of the loop in bytecode
      is the bottleneck.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Core Findings
&lt;/h4&gt;

&lt;p&gt;For low numbers of Mersenne primes that execute quickly- all four languages are comparable. An unusual result was the good performance in the mid range from Node. This could have been from lower overhead of the Node A2A toolkit or potentially from JavaScript engine optimizations. As expected, GO and Rust did break out and delivered the best performance as the complexity scaled.&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;The goal of the demo/article was to get basic Agents implemented across multiple programming languages and benchmark the Agent performance finding Mersenne primes.&lt;/p&gt;

&lt;p&gt;The Google Agent development kit (ADK) was presented along with the complimentary A2A (Agent to Agent) protocol. Three basic agents were presented — covering various combinations of programming languages and Agent implementation approaches.&lt;/p&gt;

&lt;p&gt;Finally — a Master/Orchestrator agent was started to connect and delegate to the other agents via the A2A protocol. Antigravity CLI was used to connect to the Master Agent over MCP and execute the benchmarks.&lt;/p&gt;




</description>
      <category>mcps</category>
      <category>googleadk</category>
      <category>a2aprotocol</category>
      <category>crosslanguage</category>
    </item>
    <item>
      <title>Revisiting Benchmarking- Building a Rust A2A Agent</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Wed, 27 May 2026 02:55:27 +0000</pubDate>
      <link>https://dev.to/gde/revisiting-benchmarking-building-a-rust-a2a-agent-5bl2</link>
      <guid>https://dev.to/gde/revisiting-benchmarking-building-a-rust-a2a-agent-5bl2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cross Language A2A Agent Benchmarking with Gemini 3 and Antigravity CLI
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Building a Benchmarking Agent with A2A and MCP
&lt;/h4&gt;

&lt;p&gt;This tutorial aims to build and test benchmarking Agents using the A2A protocol across several popular programming languages. The Master Orchestrator Agent is exposed via MCP to allow Antigravity CLI to be used as a MCP client.&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%2Ff8i2tx94ty3txk2mx926.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%2Ff8i2tx94ty3txk2mx926.png" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Deja Vu — What is Old is New
&lt;/h4&gt;

&lt;p&gt;This paper is a re-visiting of the original benchmark series with Gemini CLI over Node, GO, and Python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/cross-language-a2a-agent-benchmarking-with-gemini-3-and-gemini-cli-930eb3fd8507" rel="noopener noreferrer"&gt;&lt;strong&gt;Cross Language A2A Agent Benchmarking with Gemini 3 and Gemini CLI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Building a Benchmarking Agent with A2A and MCP_medium.com&lt;/a&gt;&lt;a href="https://medium.com/google-cloud/cross-language-a2a-agent-benchmarking-with-gemini-3-and-gemini-cli-930eb3fd8507" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this updated version, the Antigravity CLI is used over Node, GO, Python, and Rust.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I need Multi-Language Support? Can’t I just use Python?
&lt;/h4&gt;

&lt;p&gt;Most mature Agent development tools and libraries are Python based. Python allows for rapid prototyping and evaluation of approaches. Python is also an interpreted language- which has trade-offs in memory safety, and performance. Other languages like GO and Rust offer high performance and memory safe operations. With a language neutral communication protocol — the actual Agent implementation of each Agent can be coded in the most appropriate language.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is this Approach actually Benchmarking?
&lt;/h4&gt;

&lt;p&gt;The high level goal was to measure the actual time spent running an algorithm in the native language code inside the A2A agent. Each language had a slightly different implementation due to the language syntax. After running the algorithm- each Agent was instructed to calculate and return the elapsed time for cross language comparison.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is the Agent Development Kit?
&lt;/h4&gt;

&lt;p&gt;The Agent Development Kit (ADK) is a flexible and modular framework for &lt;strong&gt;developing and deploying AI agents&lt;/strong&gt;. While optimized for Gemini and the Google ecosystem, ADK is &lt;strong&gt;model-agnostic&lt;/strong&gt;, &lt;strong&gt;deployment-agnostic&lt;/strong&gt;, and is built for &lt;strong&gt;compatibility with other frameworks&lt;/strong&gt;. The official ADK is only currently available in the Python, GO, and Java programming languages.&lt;/p&gt;

&lt;h4&gt;
  
  
  Google’s Agent Stack in Action: ADK, MCP, A2A on Google Cloud
&lt;/h4&gt;

&lt;p&gt;Google provides full documentation on the Agent Development Kit (ADK) here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;&lt;strong&gt;Agent Development Kit&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Build powerful multi-agent systems with Agent Development Kit_google.github.io&lt;/a&gt;&lt;a href="https://google.github.io/adk-docs/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is the A2A protocol?
&lt;/h4&gt;

&lt;p&gt;The Agent2Agent (A2A) protocol, an open communication standard for AI agents, was initially introduced by Google in April 2025. It is specifically engineered to facilitate seamless interoperability within multi-agent systems, enabling AI agents developed by diverse providers or built upon disparate AI agent frameworks to communicate and collaborate effectively.&lt;/p&gt;

&lt;p&gt;A good overview of the A2A protocol can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;&lt;strong&gt;A2A Protocol&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_The official documentation for the Agent2Agent (A2A) protocol. The A2A protocol is an open standard that allows…_a2a-protocol.org&lt;/a&gt;&lt;a href="https://a2a-protocol.org/latest/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Language Support For the A2A Protocol
&lt;/h4&gt;

&lt;p&gt;The official ADK for Python, GO, and Java provide built-in support for working with the A2A protocol. For other programming languages like JS, Rust, and .NET — 3rd party libraries are available to add support for the protocol.&lt;/p&gt;

&lt;p&gt;The main source for A2A Language support is the GitHub repo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/A2A" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub — a2aproject/A2A: An open protocol enabling communication and interoperability between…&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_An open protocol enabling communication and interoperability between opaque agentic applications. — a2aproject/A2A_github.com&lt;/a&gt;&lt;a href="https://github.com/a2aproject/A2A" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Tool Chain Setup for A2A
&lt;/h4&gt;

&lt;p&gt;This article targets the Python, GO, Rust, and JavaScript environments.&lt;/p&gt;

&lt;p&gt;The build tools for each language environment need to be in place. For building with Python- a working Python environment with 3.12 or later along with package management tools like uv or pip is required.&lt;/p&gt;

&lt;p&gt;For building with GO — a recent version of the GO compiler (1.24.1 or later) is required.&lt;/p&gt;

&lt;p&gt;For building with Rust, the Rust tool chain is required.&lt;/p&gt;

&lt;p&gt;For building with Node / JavaScript — a working Node.js environment with Node version 20 or later and a functional npm tool is needed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;&lt;strong&gt;Getting Started with Antigravity CLI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_This article covers the initial setup and configuration for the Antigravity CLI on a stock Linux Environment._medium.com&lt;/a&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;/p&gt;

&lt;p&gt;agy&lt;/p&gt;

&lt;p&gt;This will start the interface:&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%2Fnkknxfog12rfzzsjh0ke.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%2Fnkknxfog12rfzzsjh0ke.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Checking the Developer Environment
&lt;/h4&gt;

&lt;p&gt;Verify that all the prerequisite packages and compilers are installed — and clone the sample Github repo:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/xbill9/a2a-benchmark" rel="noopener noreferrer"&gt;https://github.com/xbill9/a2a-benchmark&lt;/a&gt;&lt;br&gt;&lt;br&gt;
cd a2a-benchmark&lt;/p&gt;

&lt;p&gt;Once you have your Google Cloud Project and preferred authentication method — run the &lt;strong&gt;init.sh&lt;/strong&gt; script to validate the setup:&lt;/p&gt;

&lt;p&gt;xbill@penguin:~/a2a-benchmark$ source init.sh&lt;br&gt;&lt;br&gt;
Project ID file found, skipping.&lt;br&gt;&lt;br&gt;
--- Authentication Method ---&lt;br&gt;&lt;br&gt;
Do you want to use a Gemini API Key for authentication? (y/n): n&lt;br&gt;&lt;br&gt;
WARNING: Your active project does not match the quota project in your local Application Default Credentials file. This might result in unexpected quota issues.&lt;/p&gt;

&lt;p&gt;To update your Application Default Credentials quota project, use the &lt;code&gt;gcloud auth application-default set-quota-project&lt;/code&gt; command.&lt;br&gt;&lt;br&gt;
Updated property [core/project].&lt;br&gt;&lt;br&gt;
--- Setup complete ---&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;set_env.sh&lt;/strong&gt; script is provided to set common ADK environment variables:&lt;/p&gt;

&lt;p&gt;xbill@penguin:~/a2a-benchmark$ source set_env.sh&lt;br&gt;&lt;br&gt;
--- Setting Google Cloud Environment Variables ---&lt;br&gt;&lt;br&gt;
Checking gcloud authentication status...&lt;br&gt;&lt;br&gt;
gcloud is authenticated.&lt;br&gt;&lt;br&gt;
Exported PROJECT_ID=comglitn&lt;br&gt;&lt;br&gt;
Exported PROJECT_NUMBER=1056842563084&lt;br&gt;&lt;br&gt;
Exported SERVICE_ACCOUNT_NAME=&lt;a href="mailto:1056842563084-compute@developer.gserviceaccount.com"&gt;1056842563084-compute@developer.gserviceaccount.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Exported GOOGLE_CLOUD_PROJECT=comglitn&lt;br&gt;&lt;br&gt;
Exported GOOGLE_GENAI_USE_VERTEXAI=TRUE&lt;br&gt;&lt;br&gt;
Exported GOOGLE_CLOUD_LOCATION=us-central1&lt;br&gt;&lt;br&gt;
Exported REPO_NAME=&lt;br&gt;&lt;br&gt;
Exported REGION=us-central1&lt;br&gt;&lt;br&gt;
--- Environment setup complete ---&lt;br&gt;&lt;br&gt;
xbill@penguin:~/a2a-benchmark$&lt;/p&gt;

&lt;h4&gt;
  
  
  Debugging API Permission Errors
&lt;/h4&gt;

&lt;p&gt;If your application default credentials expires or your Google Cloud Authentication expires you will get an error. The workaround is to re-authenticate:&lt;/p&gt;

&lt;p&gt;gcloud auth login&lt;br&gt;&lt;br&gt;
gcloud auth application-default login&lt;/p&gt;

&lt;p&gt;Another common error is that the environment variables are not set correctly. Go the the root directory and re-run the &lt;strong&gt;set_env.sh&lt;/strong&gt; to set the variables:&lt;/p&gt;

&lt;p&gt;cd ~/adk-hello-world-a2a&lt;br&gt;&lt;br&gt;
source set_env.sh&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Debugging Tools -A2A Inspector
&lt;/h4&gt;

&lt;p&gt;The A2A Inspector is a standalone tool that provides low level visibility into the A2A protocol. The GitHub is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub — a2aproject/a2a-inspector: Validation Tools for A2A Agents&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Validation Tools for A2A Agents. Contribute to a2aproject/a2a-inspector development by creating an account on GitHub._github.com&lt;/a&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A summary of the features of the A2A inspector can be found here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://a2aprotocol.ai/docs/guide/a2a-inspector" rel="noopener noreferrer"&gt;&lt;strong&gt;A2A Protocol Documentation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Documentation for A2A Protocol_a2aprotocol.ai&lt;/a&gt;&lt;a href="https://a2aprotocol.ai/docs/guide/a2a-inspector" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install the A2A Inspector:&lt;/p&gt;

&lt;p&gt;cd ~&lt;br&gt;&lt;br&gt;
git clone &lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;https://github.com/a2aproject/a2a-inspector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then follow the build instructions — you need &lt;strong&gt;&lt;em&gt;uv&lt;/em&gt;&lt;/strong&gt;, and a recent version of &lt;strong&gt;&lt;em&gt;node&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector/blob/main/README.md" rel="noopener noreferrer"&gt;&lt;strong&gt;a2a-inspector/README.md at main · a2aproject/a2a-inspector&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
_Validation Tools for A2A Agents. Contribute to a2aproject/a2a-inspector development by creating an account on GitHub._github.com&lt;/a&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector/blob/main/README.md" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Staring the A2A Inspector
&lt;/h4&gt;

&lt;p&gt;Once the A2A inspector has been installed- you can validate the installation by using this URL:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:5001/" rel="noopener noreferrer"&gt;http://127.0.0.1:5001/&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%2Fr8d8xeqm0ucq41oqq1ep.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%2Fr8d8xeqm0ucq41oqq1ep.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Extending ADK Agents with A2A
&lt;/h4&gt;

&lt;p&gt;The ADK provides several key tools to allow standard ADK Agents to run as standalone A2A agents — without the ADK — either in A2A Client or A2A Server mode. The Python ADK includes libraries and samples to extend a standard ADK agent to enable A2A protocol features. Instead of running the agent inside the ADK web utility- the agents are dual purposed with A2A to be able to run as dedicated agents with their own embedded Uvicorn web server.&lt;/p&gt;

&lt;h4&gt;
  
  
  I am confused- How Does this all Work?
&lt;/h4&gt;

&lt;p&gt;When Agents are run in ADK mode — the ADK CLI or Web interface is used to directly interact with the Agents. The ADK UI is started in a well known port — usually 8000 and the Agents are accessed in that environment.&lt;/p&gt;

&lt;p&gt;The ADK does not automatically expose the agent as an A2A agent. The basic agent code from the ADK needs to be extended and enabled to run as a standalone A2A Agent. Without the additional A2A function calls and a active standalone web server- the Agents will not be usable in A2A mode.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mersenne Primes
&lt;/h4&gt;

&lt;p&gt;In &lt;a href="https://en.wikipedia.org/wiki/Mathematics" rel="noopener noreferrer"&gt;mathematics&lt;/a&gt;, a &lt;strong&gt;Mersenne prime&lt;/strong&gt; is a &lt;a href="https://en.wikipedia.org/wiki/Prime_number" rel="noopener noreferrer"&gt;prime number&lt;/a&gt; that is one less than a &lt;a href="https://en.wikipedia.org/wiki/Power_of_two" rel="noopener noreferrer"&gt;power of two&lt;/a&gt;. As of 2025, &lt;a href="https://en.wikipedia.org/wiki/List_of_Mersenne_primes_and_perfect_numbers" rel="noopener noreferrer"&gt;52 Mersenne primes&lt;/a&gt; are known. An interesting thing about Mersenne primes is that they are the easiest natural numbers to prove to be primes, so they make up the largest category on the list of known prime numbers. This example was chosen as a good problem as the computation is CPU bound and gets exponentially longer for each higher number.&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Cross Language Agents
&lt;/h4&gt;

&lt;p&gt;The a2a_benchmark Repo has sample scripts for running the ADK and various types of agents across programming languages. Each agent implements a Mersenne Prime Number generator with only basic optimization. The root directory of the a2a-benchmark directory contains several common agent development languages. These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  benchmark-go (GO) A2A Server&lt;/li&gt;
&lt;li&gt;  benchmark-python (Python) A2A Server&lt;/li&gt;
&lt;li&gt;  benchmark-node (JavaScript) A2A Server&lt;/li&gt;
&lt;li&gt;  benchmark-rust (Rust) A2A Server&lt;/li&gt;
&lt;li&gt;  benchmark-master (Python) A2A Client / MCP Server&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (GO)
&lt;/h4&gt;

&lt;p&gt;This agent provides a basic Agent that generates Mersenne prime numbers. To run the agent — run the &lt;strong&gt;bench-go.sh&lt;/strong&gt; script:&lt;/p&gt;

&lt;p&gt;Running the Go project...&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.071713651-05:00","level":"INFO","msg":"Using Model ","model":"gemini-2.5-flash"}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.07195886-05:00","level":"INFO","msg":"Starting A2A mersenne prime server","port":"8102"}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.072116547-05:00","level":"INFO","msg":"Starting the web server: &amp;amp;{port:8102 writeTimeout:15000000000 readTimeout:15000000000 idleTimeout:60000000000}"}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.072119644-05:00","level":"INFO","msg":""}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.072121732-05:00","level":"INFO","msg":"Web servers starts on &lt;a href="http://localhost:8102%22" rel="noopener noreferrer"&gt;http://localhost:8102"&lt;/a&gt;}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.072123829-05:00","level":"INFO","msg":"       a2a:  you can access A2A using jsonrpc protocol: &lt;a href="http://localhost:8102%22" rel="noopener noreferrer"&gt;http://localhost:8102"&lt;/a&gt;}&lt;br&gt;&lt;br&gt;
{"time":"2025-11-25T13:47:18.072125402-05:00","level":"INFO","msg":""}&lt;/p&gt;

&lt;p&gt;The A2A inspector can be used to validate the Agent:&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%2Fjjf7ji5pu5jg3o244cye.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%2Fjjf7ji5pu5jg3o244cye.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"id": "adk-88a8aefa-3070-48ff-b8d1-631af65ea57e",&lt;br&gt;&lt;br&gt;
  "name": "generate_primes",&lt;br&gt;&lt;br&gt;
  "response": {&lt;br&gt;&lt;br&gt;
    "result": "Elapsed time: 307.932µs"&lt;br&gt;&lt;br&gt;
  }&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Python)
&lt;/h4&gt;

&lt;p&gt;This agent provides Python agent that implements the Mersenne generation algorithm.&lt;/p&gt;

&lt;p&gt;This Agent can be checked with the ADK web interface:&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%2Fy6mawprvw55nb9rtsx3d.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%2Fy6mawprvw55nb9rtsx3d.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;what do you do&lt;/p&gt;

&lt;p&gt;I can calculate Mersenne primes using the Lucas-Lehmer primality test. I can find the list of the first N Mersenne primes.&lt;/p&gt;

&lt;p&gt;find the first 10 primes&lt;/p&gt;

&lt;p&gt;It took 0.0002677440643310547 seconds to find the first 10 Mersenne primes.&lt;/p&gt;

&lt;p&gt;To start the dedicated A2A version of the Python prime number generator Agent use the &lt;strong&gt;bench-python.sh&lt;/strong&gt; script:&lt;/p&gt;

&lt;p&gt;xbill@penguin:~/a2a-benchmark$ source bench-python.sh&lt;/p&gt;

&lt;p&gt;INFO:     Started server process [10495]&lt;br&gt;&lt;br&gt;
INFO:     Waiting for application startup.&lt;br&gt;&lt;br&gt;
INFO:     Application startup complete.&lt;br&gt;&lt;br&gt;
INFO:     Uvicorn running on &lt;a href="http://0.0.0.0:8101" rel="noopener noreferrer"&gt;http://0.0.0.0:8101&lt;/a&gt; (Press CTRL+C to quit)&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Node)
&lt;/h4&gt;

&lt;p&gt;This agent provides a minimal agent to generate a prime number. To run the Agent use the &lt;strong&gt;bench-node.sh&lt;/strong&gt; script:&lt;/p&gt;

&lt;p&gt;/home/xbill/a2a-benchmark/benchmark-node&lt;br&gt;&lt;br&gt;
staring a2a bench node generate prime&lt;/p&gt;

&lt;p&gt;The Agent can be validated with the A2A inspector on port 8103:&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%2Fb4gog4xk4lkj7vkq95en.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%2Fb4gog4xk4lkj7vkq95en.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A typical session will look something like this:&lt;/p&gt;

&lt;p&gt;what do you do&lt;br&gt;&lt;br&gt;
message&lt;br&gt;&lt;br&gt;
Found first 5 Mersenne primes in 0.09ms.&lt;/p&gt;

&lt;p&gt;✅&lt;br&gt;&lt;br&gt;
find 10 primes&lt;br&gt;&lt;br&gt;
message&lt;br&gt;&lt;br&gt;
Found first 10 Mersenne primes in 0.81ms.&lt;/p&gt;

&lt;p&gt;✅&lt;/p&gt;

&lt;h4&gt;
  
  
  A2A Mersenne Prime Number Agent (Rust)
&lt;/h4&gt;

&lt;p&gt;The Mersenne primes algorithm was newly implemented in Rust:&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%2F01sr2wrgarrucj5hbhxq.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%2F01sr2wrgarrucj5hbhxq.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A sample test script verified the A2A Agent skill:&lt;/p&gt;

&lt;p&gt;xbill@penguin:~/a2a-benchmark$ source test-rust.sh&lt;br&gt;&lt;br&gt;
Checking if Rust A2A agent is running on port 8104...&lt;br&gt;&lt;br&gt;
Rust agent is already running.&lt;br&gt;&lt;br&gt;
Running Test 1: Fetching Agent Card...&lt;br&gt;&lt;br&gt;
Agent Card Response:&lt;br&gt;&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
  "name": "Mersenne Prime Agent Rust",&lt;br&gt;&lt;br&gt;
  "description": "A rust agent that builds a list of the first n Mersenne primes and reports the elapsed time. Configured with model: Not specified.",&lt;br&gt;&lt;br&gt;
  "protocolVersion": "0.3.0",&lt;br&gt;&lt;br&gt;
  "version": "0.1.0",&lt;br&gt;&lt;br&gt;
  "url": "&lt;a href="http://0.0.0.0:8104/" rel="noopener noreferrer"&gt;http://0.0.0.0:8104/&lt;/a&gt;",&lt;br&gt;&lt;br&gt;
  "skills": [&lt;br&gt;&lt;br&gt;
    {&lt;br&gt;&lt;br&gt;
      "id": "find-mersenne-rust",&lt;br&gt;&lt;br&gt;
      "name": "Find Mersenne Primes in rust",&lt;br&gt;&lt;br&gt;
      "description": "Finds the list of the first n Mersenne primes in Rust",&lt;br&gt;&lt;br&gt;
      "tags": [&lt;br&gt;&lt;br&gt;
        "math",&lt;br&gt;&lt;br&gt;
        "benchmark"&lt;br&gt;&lt;br&gt;
      ]&lt;br&gt;&lt;br&gt;
    }&lt;br&gt;&lt;br&gt;
  ],&lt;br&gt;&lt;br&gt;
  "capabilities": {},&lt;br&gt;&lt;br&gt;
  "defaultInputModes": [],&lt;br&gt;&lt;br&gt;
  "defaultOutputModes": []&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
✅ Test 1 Passed: Agent Card is valid.&lt;br&gt;&lt;br&gt;
Running Test 2: Sending message/send request to calculate 5 Mersenne primes...&lt;br&gt;&lt;br&gt;
Response:&lt;br&gt;&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
  "id": 1,&lt;br&gt;&lt;br&gt;
  "jsonrpc": "2.0",&lt;br&gt;&lt;br&gt;
  "result": {&lt;br&gt;&lt;br&gt;
    "contextId": "test-context-123",&lt;br&gt;&lt;br&gt;
    "kind": "message",&lt;br&gt;&lt;br&gt;
    "messageId": "f20c704c-bafa-4081-a18d-8d7984d4213c",&lt;br&gt;&lt;br&gt;
    "parts": [&lt;br&gt;&lt;br&gt;
      {&lt;br&gt;&lt;br&gt;
        "kind": "text",&lt;br&gt;&lt;br&gt;
        "text": "Found first 5 Mersenne primes in 0.11ms."&lt;br&gt;&lt;br&gt;
      }&lt;br&gt;&lt;br&gt;
    ],&lt;br&gt;&lt;br&gt;
    "role": "agent"&lt;br&gt;&lt;br&gt;
  }&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
✅ Test 2 Passed: Successfully calculated primes.&lt;br&gt;&lt;br&gt;
Running Test 3: Sending invalid RPC method...&lt;br&gt;&lt;br&gt;
Error Response:&lt;br&gt;&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
  "error": {&lt;br&gt;&lt;br&gt;
    "code": -32601,&lt;br&gt;&lt;br&gt;
    "message": "Method not found: invalid/method"&lt;br&gt;&lt;br&gt;
  },&lt;br&gt;&lt;br&gt;
  "id": 2,&lt;br&gt;&lt;br&gt;
  "jsonrpc": "2.0"&lt;br&gt;&lt;br&gt;
}&lt;br&gt;&lt;br&gt;
✅ Test 3 Passed: Invalid method was rejected successfully.&lt;br&gt;&lt;br&gt;
All tests passed successfully!&lt;/p&gt;

&lt;h4&gt;
  
  
  MCP Master/Orchestrator Agent (Python)
&lt;/h4&gt;

&lt;p&gt;The final agent follows a slightly different pattern. It provides a minimal agent with several functions (Tools/Skills). It has one &lt;em&gt;root_agent&lt;/em&gt; and 3 remote agents connected over A2A. This agent also exposes an interface as a MCP server- allowing Antigravity CLI to be used as a MCP client.&lt;/p&gt;

&lt;p&gt;The Master Agent is started with a similar script:&lt;/p&gt;

&lt;p&gt;╭──────────────────────────────────────────────────────────────────────────────╮&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                         ▄▀▀ ▄▀█ █▀▀ ▀█▀ █▀▄▀█ █▀▀ █▀█                        │&lt;br&gt;&lt;br&gt;
                       │                         █▀  █▀█ ▄▄█  █  █ ▀ █ █▄▄ █▀▀                        │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                                FastMCP 2.13.1                                │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                  🖥  Server name: benchmark                                   │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                  📦 Transport:   HTTP                                        │&lt;br&gt;&lt;br&gt;
                       │                  🔗 Server URL:  &lt;a href="http://127.0.0.1:8100/mcp" rel="noopener noreferrer"&gt;http://127.0.0.1:8100/mcp&lt;/a&gt;                   │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       │                  📚 Docs:        &lt;a href="https://gofastmcp.com" rel="noopener noreferrer"&gt;https://gofastmcp.com&lt;/a&gt;                       │&lt;br&gt;&lt;br&gt;
                       │                  🚀 Hosting:     &lt;a href="https://fastmcp.cloud" rel="noopener noreferrer"&gt;https://fastmcp.cloud&lt;/a&gt;                       │&lt;br&gt;&lt;br&gt;
                       │                                                                              │&lt;br&gt;&lt;br&gt;
                       ╰──────────────────────────────────────────────────────────────────────────────╯ &lt;/p&gt;

&lt;p&gt;[11/25/25 14:17:36] INFO     Starting MCP server 'benchmark' with transport 'http' on &lt;a href="http://127.0.0.1:8100/mcp" rel="noopener noreferrer"&gt;http://127.0.0.1:8100/mcp&lt;/a&gt;  server.py:2055&lt;br&gt;&lt;br&gt;
INFO:     Started server process [21826]&lt;br&gt;&lt;br&gt;
INFO:     Waiting for application startup.&lt;br&gt;&lt;br&gt;
INFO:     Application startup complete.&lt;br&gt;&lt;br&gt;
INFO:     Uvicorn running on &lt;a href="http://127.0.0.1:8100" rel="noopener noreferrer"&gt;http://127.0.0.1:8100&lt;/a&gt; (Press CTRL+C to quit)&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI with MCP Connection
&lt;/h4&gt;

&lt;p&gt;The Master Agent starts a FastMCP server interface. This allows Antigravity CLI to be used as a MCP client:&lt;/p&gt;

&lt;p&gt;xbill@penguin:~/a2a-benchmark/.agents$ more mcp_config.json&lt;br&gt;&lt;br&gt;
{&lt;br&gt;&lt;br&gt;
  "mcpServers": {&lt;br&gt;&lt;br&gt;
    "bench": {&lt;br&gt;&lt;br&gt;
      "serverUrl": "&lt;a href="http://127.0.0.1:8100/mcp" rel="noopener noreferrer"&gt;http://127.0.0.1:8100/mcp&lt;/a&gt;",&lt;br&gt;&lt;br&gt;
      "serverURL": "&lt;a href="http://127.0.0.1:8100/mcp" rel="noopener noreferrer"&gt;http://127.0.0.1:8100/mcp&lt;/a&gt;"&lt;br&gt;&lt;br&gt;
    }&lt;br&gt;&lt;br&gt;
  }&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;h4&gt;
  
  
  ADK Validation of the Master Agent
&lt;/h4&gt;

&lt;p&gt;Because it is Python based- the Master Agent can also be viewed with the ADK web interface:&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%2Fu2utid4tjuwnrs6a9m6r.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%2Fu2utid4tjuwnrs6a9m6r.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  So What is all this Doing?
&lt;/h4&gt;

&lt;p&gt;All of the setup and configuration allows you to start debugging and visualizing Agent flows using the A2A protocol. The Agents can be validated using the A2A Inspector. The Python Agents can be checked with the ADK web interfaces. The Master Agent can be validated with Antigravity CLI as a MCP client.&lt;/p&gt;

&lt;h4&gt;
  
  
  Time to Starting Running some Numbers!
&lt;/h4&gt;

&lt;p&gt;Now that the individual Agents have been validated — open several Terminal windows and start up all the remaining agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  benchmark-go.sh — (port 8102)&lt;/li&gt;
&lt;li&gt;  benchmark-python.sh-(port 8101)&lt;/li&gt;
&lt;li&gt;  benchmark-node.sh- (port 8103)&lt;/li&gt;
&lt;li&gt;  benchmark-rust.sh- (port 8104)&lt;/li&gt;
&lt;li&gt;  benchmark-master.sh — Orchestrator Agent (port 8100)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Start the Benchmarking Session
&lt;/h4&gt;

&lt;p&gt;Once all the agents have been started — the Master agent on port 8100 is connected over MCP with Antigravity CLI:&lt;/p&gt;

&lt;p&gt;I have completed the benchmark run across all four language agents for primes 1 to 22.  &lt;/p&gt;

&lt;p&gt;### Summary of Actions Taken:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agent Startup &amp;amp; Verification: Automatically checked and started all four target language agents (Node.
js/TypeScript, Rust, Go, Python) and verified they were active and listening on their respective A2A JSON-RPC ports.
&lt;/li&gt;
&lt;li&gt;Benchmark Scripting: Created a customized benchmarking script run_benchmark_1_22.py that targets prime calculations
from
$N = 1$ to $N = 22$.
&lt;/li&gt;
&lt;li&gt;Execution: Ran the benchmark and recorded the exact computation time (within the tool call) and the total Agent-to-
Agent (A2A) network/orchestration latency (RTT) for every prime count $N$.
&lt;/li&gt;
&lt;li&gt;Data Plotting: Generated visualizations for both calculation times ( prime_calculation_times_1_22.png ) and
overall latency ( a2a_latency_times_1_22.png ).
&lt;/li&gt;
&lt;li&gt;Reporting: Compiled all calculations and visualizations into the analysis_results.md artifact.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Please view analysis_results.md to inspect the table and embedded plots showing the comparison of calculation speeds&lt;br&gt;&lt;br&gt;
and&lt;br&gt;&lt;br&gt;
  latency characteristics!&lt;/p&gt;

&lt;h4&gt;
  
  
  Review Performance
&lt;/h4&gt;

&lt;p&gt;The results of the benchmark are graphed:&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%2Flgvhzey17dndypwkv6oy.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%2Flgvhzey17dndypwkv6oy.png" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With latency times:&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%2Flybmtmjhpr3fsczf9j39.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%2Flybmtmjhpr3fsczf9j39.png" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Final Results
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI summarized the results of the Agent Benchmarking:&lt;/p&gt;

&lt;p&gt;Formulating Key Findings&lt;br&gt;&lt;br&gt;
  Here is a summary of the key findings from the benchmark results for primes 1 to 22:  &lt;/p&gt;

&lt;p&gt;### 1. Core Computation Performance (Lucas-Lehmer Prime Calculation)  &lt;/p&gt;

&lt;p&gt;• Rust is the fastest: Computes $N=22$ in 195.96 ms.&lt;br&gt;&lt;br&gt;
  • Node.js (TS) is extremely close: Computes $N=22$ in 214.06 ms.&lt;br&gt;&lt;br&gt;
  • Go performs well: Computes $N=22$ in 279.54 ms.&lt;br&gt;&lt;br&gt;
  • Python is the slowest: Computes $N=22$ in 572.48 ms (roughly 3x slower than Rust).  &lt;/p&gt;

&lt;p&gt;### 2. A2A Framework &amp;amp; Protocol Overhead  &lt;/p&gt;

&lt;p&gt;• Minimal Overhead (Rust &amp;amp; Node.js):&lt;br&gt;&lt;br&gt;
      • Rust and Node.js use lightweight custom HTTP wrappers. Their framework overhead is practically negligible (&amp;lt; 2&lt;br&gt;&lt;br&gt;
      ms). For example, Node's total round-trip time (RTT) for $N=22$ is 215.78 ms (only 1.72 ms higher than the raw&lt;br&gt;&lt;br&gt;
      calculation time).&lt;br&gt;&lt;br&gt;
  • Significant Base Overhead (Go &amp;amp; Python):&lt;br&gt;&lt;br&gt;
      • Both Go and Python use the official  google-adk  library. This introduces a fixed baseline overhead per request&lt;br&gt;&lt;br&gt;
      (schema validation, logging, and metadata context processing).&lt;br&gt;&lt;br&gt;
      • Go incurs a consistent baseline RTT of ~1.2s to 1.6s.&lt;br&gt;&lt;br&gt;
      • Python incurs a consistent baseline RTT of ~2.3s to 3.0s.&lt;/p&gt;

&lt;p&gt;and a deeper dive:&lt;/p&gt;

&lt;p&gt;Analyzing Agent Initialization&lt;br&gt;&lt;br&gt;
  Based on an analysis of the codebase and execution paths, here is the breakdown of why the benchmark produced these&lt;br&gt;&lt;br&gt;
  results:&lt;br&gt;&lt;br&gt;
  ──────&lt;br&gt;&lt;br&gt;
  ### Factor 1: The Massive Latency (RTT) Difference (Framework vs. Mocking)  &lt;/p&gt;

&lt;p&gt;The most striking difference is that Rust and Node.js have near-zero overhead, whereas Go takes ~1.5s and Python&lt;br&gt;&lt;br&gt;
  takes&lt;br&gt;&lt;br&gt;
  ~2.5s. This is entirely due to how the agents process the benchmark messages:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rust and Node.js (Mocked Agent Logic / Direct Execution):
  • Both main.rs and server.ts implement custom JSON-RPC endpoints that intercept incoming queries and
  bypass the LLM entirely.
  • They use simple regex to extract the number of primes directly from the text  "Calculate the first {N} Mersenne
  primes" , execute the math, and return a mock agent response message. Since there are no LLM API calls, the
  overhead is practically zero.
&lt;/li&gt;
&lt;li&gt;Go and Python (Real Agentic Execution via ADK):
  • Both Go (main.go) and Python (agent.py) use the official Agent Development Kit ( google-adk ) and
  hook up the Gemini 2.5 Flash model.
  • When they receive a message, the ADK runner executes a full agent reasoning loop. This involves two sequential
  remote LLM calls (one to determine which tool to call, and another to formulate the final natural language
  response).
  • This remote LLM invocation via the internet accounts for the 1.5–3.0 second latency overhead.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;──────&lt;br&gt;&lt;br&gt;
  ### Factor 2: Mathematical Computation Speeds (Lucas-Lehmer Loop)  &lt;/p&gt;

&lt;p&gt;At higher values (e.g., $N=22$, where the Mersenne number $2^{9941}-1$ has 2,993 decimal digits and the Lucas-Lehmer&lt;br&gt;&lt;br&gt;
  test requires 9,939 iterations of squaring and modular reductions), we see clear performance tiers:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rust (195.96 ms):
  • Rust is compiled to optimized native machine code (using  --release ). The  num-bigint  crate executes the big
  integer arithmetic without garbage collection overhead, making it the most efficient compiled loop.
&lt;/li&gt;
&lt;li&gt;Node.js (214.06 ms):
  • V8's JIT compiler is extremely good at compiling JavaScript loops to native machine instructions. Additionally,
  V8's native  BigInt  implementation is heavily optimized at the engine level (written in assembly/C++).
&lt;/li&gt;
&lt;li&gt;Go (279.54 ms):
  • While Go compiles to native code, its implementation in main.go performs heap allocations inside the hot
  loop:
    a := new(big.Int).Rsh(s, uint(p))
    b := new(big.Int).And(s, m)
  Allocating new  big.Int  objects inside a loop that runs thousands of times puts extra pressure on Go's runtime
  allocator and garbage collector, dragging down performance compared to Rust.
&lt;/li&gt;
&lt;li&gt;Python (572.48 ms):
  • Python handles arbitrary-precision integers natively, but executing the loop in interpreted bytecode has a lot
  of interpreter overhead compared to compiled or JIT-compiled languages. 9,939 iterations of the loop in bytecode
  is the bottleneck.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Core Findings
&lt;/h4&gt;

&lt;p&gt;For low numbers of Mersenne primes that execute quickly- all four languages are comparable. An unusual result was the good performance in the mid range from Node. This could have been from lower overhead of the Node A2A toolkit or potentially from JavaScript engine optimizations. As expected, GO and Rust did break out and delivered the best performance as the complexity scaled.&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;The goal of the demo/article was to get basic Agents implemented across multiple programming languages and benchmark the Agent performance finding Mersenne primes.&lt;/p&gt;

&lt;p&gt;The Google Agent development kit (ADK) was presented along with the complimentary A2A (Agent to Agent) protocol. Three basic agents were presented — covering various combinations of programming languages and Agent implementation approaches.&lt;/p&gt;

&lt;p&gt;Finally — a Master/Orchestrator agent was started to connect and delegate to the other agents via the A2A protocol. Antigravity CLI was used to connect to the Master Agent over MCP and execute the benchmarks.### Cross Language A2A Agent Benchmarking with Gemini 3 and Antigravity CLI&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>a2a</category>
      <category>benchmarking</category>
    </item>
    <item>
      <title>Pokemon Battle Simulator Napkin Challenge!</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Tue, 26 May 2026 23:07:48 +0000</pubDate>
      <link>https://dev.to/gde/pokemon-battle-simulator-napkin-challenge-38db</link>
      <guid>https://dev.to/gde/pokemon-battle-simulator-napkin-challenge-38db</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  ▄▀▀▄        Antigravity CLI 1.0.2
 ▀▀▀▀▀▀       xbill9@gmail.com (Google AI Ultra)
▀▀▀▀▀▀▀▀      Gemini 3.5 Flash (Medium)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;▄▀▀    ▀▀▄     ~/pokemon&lt;br&gt;
  ▄▀▀      ▀▀▄&lt;br&gt;
────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;use @pokemon_api.jpg as the system architecture and build out a pokemon battle simulator&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ListDir(/home/xbill/pokemon)&lt;br&gt;
● Read(/home/xbill/pokemon/pokemon_api.jpg) (ctrl+o to expand)&lt;br&gt;
▸ Thought for 7s, 852 tokens&lt;br&gt;
  Observing the Image&lt;/p&gt;

&lt;p&gt;● Bash(node -v &amp;amp;&amp;amp; npm -v &amp;amp;&amp;amp; python3 --version) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 6s, 2.5k tokens&lt;br&gt;
  Considering Language Choice&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/.gemini/antigravity-cli/brain/42...abf-b329-894a07ec5075/implementation_plan.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;I have created the implementation plan for the Pokemon Battle Simulator matching the architecture in the diagram.&lt;/p&gt;

&lt;p&gt;Please review the implementation_plan.md and let me know if you approve or if you'd like any modifications before I&lt;br&gt;
begin&lt;br&gt;
  building the simulator.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;yes i approve&lt;br&gt;
▸ Thought for 6s, 304 tokens&lt;br&gt;
  Initiating Execution Phase&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● Create(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md)&lt;br&gt;
● Create(/home/xbill/pokemon/package.json)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 7s, 364 tokens&lt;br&gt;
  Defining API Layer&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/pokemon/src/api/pokeApi.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 7s, 1.4k tokens&lt;br&gt;
  Defining Move Database&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/pokemon/src/api/moveDatabase.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 7s, 2.6k tokens&lt;br&gt;
  Defining Battle SDK Logic&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/pokemon/src/sdk/battleSdk.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 1s, 373 tokens&lt;br&gt;
  Designing Color Utility&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/pokemon/src/utils/colors.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 6s, 1.3k tokens&lt;br&gt;
  Constructing the CLI Router&lt;br&gt;
● Create(/home/xbill/pokemon/src/cli/index.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md)&lt;br&gt;
● Create(/home/xbill/pokemon/index.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 8s, 228 tokens&lt;br&gt;
  Defining Test Runner Goals&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/pokemon/src/utils/test_runner.js)&lt;br&gt;
● Bash(node src/utils/test_runner.js)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 8s, 142 tokens&lt;br&gt;
  Drafting Walkthrough Documentation&lt;/p&gt;

&lt;p&gt;● Create(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/walkthrough.md)&lt;br&gt;
● Edit(/home/xbill/.gemini/antigravity-cli/brain/42560c5f-0aec-4abf-b329-894a07ec5075/task.md) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;▸ Thought for 5s, 517 tokens&lt;br&gt;
  I have built out the Pokemon Battle Simulator matching the system architecture diagram in  @pokemon_api.jpg .&lt;/p&gt;

&lt;p&gt;Here is a summary of the components created:&lt;/p&gt;

&lt;p&gt;• API Client (pokeApi.js): Connects to PokeAPI with local filesystem caching.&lt;br&gt;
  Verifying Project Completion&lt;br&gt;
  • Move Registry (moveDatabase.js): Predefined type databases and dynamic move generator prioritizing STAB.&lt;br&gt;
  • Gameplay SDK (battleSdk.js): Performs combat math, turn ordering, level scaling (Lv. 50 for team, Lv. 100 with 3x&lt;br&gt;
  HP for Bosses), and state execution.&lt;br&gt;
  • Color &amp;amp; Formatter (colors.js): Standard ANSI coloring, dynamic health bar drawing, and typewriter-style&lt;br&gt;
  delayed text printing.&lt;br&gt;
  • CLI Shell &amp;amp; Entry Point (index.js &amp;amp; index.js): Command router supporting  /pick team ,  /stats ,  /run &lt;br&gt;
  battle ,  /help , and  /exit .&lt;/p&gt;

&lt;p&gt;### Playing the Simulator&lt;/p&gt;

&lt;p&gt;To launch the game:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For full details on the codebase and how features were tested, please refer to the walkthrough.md.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;node index.js&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;▸ Thought for 5s, 420 tokens&lt;br&gt;
  Considering Interactive CLI Commands&lt;/p&gt;

&lt;p&gt;● Bash(node index.js)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;The simulator has successfully started and is running in the background:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔════════════════════════════╗
║  POKEMON BATTLE SIMULATOR  ║
╚════════════════════════════╝
Welcome, Trainer! Prepare for epic battles.
Type /help to see available commands.

poke-sim&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can interact with it by typing commands directly. If you want me to input a command for you, just tell me what to&lt;br&gt;
  type (e.g.  /help ,  /pick team pikachu charizard , or  /run battle )!&lt;/p&gt;

&lt;p&gt;The simulator is ready and waiting at the  poke-sim&amp;gt;   prompt. Let me know if you would like me to send a command to&lt;br&gt;
  the process, or if you would like to run it directly in your own terminal.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;/pick team squirtle mew lucario&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;br&gt;
  The team has been successfully selected:&lt;br&gt;
  • Squirtle&lt;br&gt;
  • Mew&lt;br&gt;
  • Lucario&lt;/p&gt;

&lt;p&gt;The simulator is ready for your next command (e.g.  /stats  or  /run battle ).&lt;/p&gt;

&lt;p&gt;The team is loaded! What would you like to do next? You can check their stats with  /stats  or initiate the battle&lt;br&gt;
  with  /run battle .&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;/run battle&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;The simulator is asking you to choose a Boss Pokemon to face:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Choose a Boss Pokemon (Default: Mewtwo):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Which Pokemon would you like to battle? (Or press Enter to face Mewtwo).&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;mewtwo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56)&lt;br&gt;
● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;The battle has begun! Here is the current field state:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;════════════════════════════════════════════════════════════
⚡ BOSS MEWTWO [Lv. 100]
Type:  PSYCHIC
HP:   [█████████████████████████] 1011/1011
────────────────────────────────────────────────────────────
🟢 YOUR SQUIRTLE [Lv. 50]
Type:  WATER
HP:   [█████████████████████████]   111/111
════════════════════════════════════════════════════════════

What will Squirtle do?
  1) Hydro Pump [ WATER ] Power: 110 (Spec)
  2) Surf [ WATER ] Power: 90 (Spec)
  3) Waterfall [ WATER ] Power: 80 (Phys)
  4) Tera Blast [ FIRE ] Power: 110 (Spec)
  5) Switch Pokemon
  6) Run Away
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Select an action (1-6):&lt;/p&gt;

&lt;p&gt;Please choose a move (1-4), switch Pokemon (5), or run (6).&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;Oh no! Mewtwo was too fast:&lt;/p&gt;

&lt;p&gt;• Mewtwo used Psychic! Dealt 465 damage.&lt;br&gt;
  • Squirtle fainted!&lt;/p&gt;

&lt;p&gt;You are forced to send out your next Pokemon. Here are your remaining members:&lt;br&gt;
    You must send out another Pokemon!&lt;br&gt;
    Choose a Pokemon:&lt;br&gt;
      1) Squirtle [Lv. 50] - FAINTED (Active)&lt;br&gt;
      2) Mew [Lv. 50] - HP: 167/167&lt;br&gt;
      3) Lucario [Lv. 50] - HP: 137/137&lt;/p&gt;

&lt;p&gt;Please choose either 2 (Mew) or 3 (Lucario):&lt;/p&gt;

&lt;p&gt;Please choose 2 for Mew or 3 for Lucario.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56)&lt;br&gt;
● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;Mew is now on the field:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;════════════════════════════════════════════════════════════
⚡ BOSS MEWTWO [Lv. 100]
Type:  PSYCHIC
HP:   [█████████████████████████] 1011/1011
────────────────────────────────────────────────────────────
🟢 YOUR MEW [Lv. 50]
Type:  PSYCHIC
HP:   [█████████████████████████]   167/167
════════════════════════════════════════════════════════════

What will Mew do?
  1) Psychic [ PSYCHIC ] Power: 90 (Spec)
  2) Zen Headbutt [ PSYCHIC ] Power: 80 (Phys)
  3) Psybeam [ PSYCHIC ] Power: 65 (Spec)
  4) Thunder Punch [ FIRE ] Power: 110 (Phys)
  5) Switch Pokemon
  6) Run Away
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Select option (1-6):&lt;br&gt;
  Please select an action from 1 to 6.&lt;br&gt;
────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;Mewtwo is incredibly powerful and fast!&lt;/p&gt;

&lt;p&gt;• Mewtwo went first and used Thunder Punch! Dealt 195 damage.&lt;br&gt;
  • Mew fainted!&lt;/p&gt;

&lt;p&gt;You only have Lucario left:&lt;br&gt;
    Choose a Pokemon:&lt;br&gt;
      1) Squirtle [Lv. 50] - FAINTED&lt;br&gt;
      2) Mew [Lv. 50] - FAINTED (Active)&lt;br&gt;
      3) Lucario [Lv. 50] - HP: 137/137&lt;/p&gt;

&lt;p&gt;Please select 3 (Lucario) to send it out:&lt;/p&gt;

&lt;p&gt;Please select 3 to send out Lucario.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56)&lt;br&gt;
● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;br&gt;
  Lucario is now on the field!&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;════════════════════════════════════════════════════════════
⚡ BOSS MEWTWO [Lv. 100]
Type:  PSYCHIC
HP:   [█████████████████████████] 1011/1011
────────────────────────────────────────────────────────────
🟢 YOUR LUCARIO [Lv. 50]
Type:  FIGHT   STEEL
HP:   [█████████████████████████]   137/137
════════════════════════════════════════════════════════════

What will Lucario do?
  1) Close Combat [ FIGHT ] Power: 120 (Phys)
  2) Aura Sphere [ FIGHT ] Power: 80 (Spec)
  3) Flash Cannon [ STEEL ] Power: 80 (Spec)
  4) Thunder Punch [ FIRE ] Power: 110 (Phys)
  5) Switch Pokemon
  6) Run Away
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Select option (1-6):&lt;/p&gt;

&lt;p&gt;Please select an option from 1 to 6.&lt;/p&gt;

&lt;p&gt;────────────────────────────────────────────────────────────&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56)&lt;br&gt;
● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56)&lt;br&gt;
● ManageTask(Input sent to task "42560c5f-0aec-4abf-b329-894a07ec5075/task-56".)&lt;br&gt;
● ManageTask(Task: 42560c5f-0aec-4abf-b329-894a07ec5075/task-56) (ctrl+o to expand)&lt;/p&gt;

&lt;p&gt;Mewtwo was a bit too powerful for our team!&lt;/p&gt;

&lt;p&gt;• Mewtwo went first and used Thunder Punch (Fire-type move)! Dealt 520 damage.&lt;br&gt;
  • Lucario fainted!&lt;/p&gt;

&lt;p&gt;Since all your Pokemon fainted, you were defeated:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╔══════════╗
║  DEFEAT  ║
╚══════════╝

💀 All your Pokemon fainted. Boss Mewtwo wins.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The game has successfully returned to the main lobby shell:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;poke-sim&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search and pick a larger or different team (e.g. up to 6 Pokemon with  /pick team ) to try to take on Mewtwo again.&lt;/li&gt;
&lt;li&gt;Select a weaker boss (e.g.  /run battle  and choose  pikachu  or  bulbasaur  as the boss) to test out your team!&lt;/li&gt;
&lt;li&gt;Exit the simulator with  /exit .&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What would you like to do next? You can try modifying your team, fighting another boss, or typing  /exit  to close&lt;br&gt;
  the simulator.&lt;/p&gt;

</description>
      <category>napkinchallenge</category>
      <category>antigravity</category>
      <category>cli</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>AWS Cloud Shell with Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Tue, 26 May 2026 19:07:25 +0000</pubDate>
      <link>https://dev.to/gde/aws-cloud-shell-with-antigravity-cli-e3a</link>
      <guid>https://dev.to/gde/aws-cloud-shell-with-antigravity-cli-e3a</guid>
      <description>&lt;p&gt;This article covers the initial setup and configuration for the Antigravity CLI on the AWS Cloud Shell. Why? Sometimes you need more than one Cloud!&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%2Fphs8fn6u86zx20xq28xd.jpeg" 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%2Fphs8fn6u86zx20xq28xd.jpeg" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Antigravity CLI?
&lt;/h4&gt;

&lt;p&gt;The Google Antigravity CLI is a lightweight Terminal User Interface (TUI) that allows developers to invoke, monitor, and interact with Google Antigravity AI agents directly from the command line. It pairs with Antigravity 2.0 to offer the same core agentic capabilities — like multi-step reasoning, tool calling, and sub-agents — without the overhead of a desktop application.&lt;/p&gt;

&lt;p&gt;More information is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/docs/cli-getting-started" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Amazon Cloud Shell
&lt;/h4&gt;

&lt;p&gt;AWS CloudShell is a browser-based, pre-authenticated terminal that allows users to securely manage, explore, and interact with AWS resources directly from the &lt;a href="https://aws.amazon.com/cloudshell/faqs/" rel="noopener noreferrer"&gt;AWS Management Console&lt;/a&gt;. It comes pre-installed with the AWS CLI, popular programming languages (Python, Node.js), and developer tools, removing the need for local configuration.&lt;/p&gt;

&lt;p&gt;The full background information on the Cloud Shell is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cloudshell/" rel="noopener noreferrer"&gt;Browser-based Shell - AWS CloudShell - AWS&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I want Antigravity CLI on AWS? Isn’t that a Google Thing?
&lt;/h4&gt;

&lt;p&gt;Yes- Antigravity CLI leverages the Google Gemini models but it is also platform agnostic. Many applications are already cross-cloud so this enables familiar tools to be run natively on Amazon AWS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Activating Amazon CloudShell
&lt;/h4&gt;

&lt;p&gt;The AWS CloudShell comes preinstalled on all AWS Accounts.&lt;/p&gt;

&lt;p&gt;To access the shell — click the Terminal Icon in the upper right hand corner of the console:&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%2Fwb9mz610eni1jgufg31n.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%2Fwb9mz610eni1jgufg31n.png" width="499" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then activate the full shell:&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%2Foqauy4ihtazn39pece9t.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%2Foqauy4ihtazn39pece9t.png" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note- the disk space in the environment is limited to 1GB.&lt;/p&gt;

&lt;h4&gt;
  
  
  Download and Install agy CLI
&lt;/h4&gt;

&lt;p&gt;The main Antigravity download page is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/download" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a terminal window/ shell install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://antigravity.google/cli/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the installation process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⠋ Detecting system environment...
✓ Platform detected: linux_amd64
⠋ Querying release repository...
✓ Latest available version: 1.0.2
⠋ Downloading release package...
✓ Download complete and checksum verified.
⠋ Extracting binary from archive...
⠋ Configuring shell environment...
I0526 14:30:04.912941 241 installer.go:27] Running Antigravity CLI setup...
I0526 14:30:04.913030 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.bashrc: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913261 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.bashrc
I0526 14:30:04.913319 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.zshrc: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913665 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.zshrc
I0526 14:30:04.913726 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.zprofile: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913856 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.zprofile
I0526 14:30:04.913898 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.bash_profile: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.914038 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.bash_profile
I0526 14:30:04.914070 241 installer_unix.go:40] PATH verification: ~/.local/bin is correctly configured in active PATH environment.

✅ Antigravity CLI installed successfully at /home/cloudshell-user/.local/bin/agy
Run 'agy' to start the CLI
~ $ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have the package installed — you can test the startup of Antigravity CLI. You will need to authenticate with a Google Project or your Google Account:&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%2Fewi51yu6yqyjuf8ebj1h.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%2Fewi51yu6yqyjuf8ebj1h.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then step through the process:&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%2Fb3nw9qgrfhs2q95cbxa2.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%2Fb3nw9qgrfhs2q95cbxa2.png" width="800" height="450"&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%2F3x5oinwkc3ix6iwf3v56.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%2F3x5oinwkc3ix6iwf3v56.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally the One time code:&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%2Fp7kgkx9zf4rkw18xdjhb.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%2Fp7kgkx9zf4rkw18xdjhb.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Initial Configuration
&lt;/h4&gt;

&lt;p&gt;Once you have installed and authenticated. Step through initial configuration:&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%2Fhddykqujxnbvkv8w7wbh.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%2Fhddykqujxnbvkv8w7wbh.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Are we There Yet!?!?
&lt;/h4&gt;

&lt;p&gt;If all the stars align and you do the correct sacrifices to the pagan Gods then at this point you should be able to start up the agy CLI and get down to business.&lt;/p&gt;

&lt;p&gt;The startup command is  &lt;strong&gt;agy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&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%2Fvj0u2ho3ttwfhjgcekaa.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%2Fvj0u2ho3ttwfhjgcekaa.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  All Right Already! Can you actually do something?
&lt;/h4&gt;

&lt;p&gt;Fire up that terminal window and get to work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what does the aws command line tool do?

  The AWS Command Line Interface (AWS CLI) is a unified tool that allows you to manage and control Amazon Web Services
  (AWS) directly from your terminal or command-line shell.

  Instead of clicking through the web-based AWS Management Console, you can interact with almost all AWS services by
  running commands.

  ### Key Capabilities

  • Service Management: You can provision, configure, and delete AWS resources across services like Amazon S3 (storage),
  Amazon EC2 (virtual servers), DynamoDB (databases), IAM (identity/access management), and more.
  • Automation and Scripting: Because it runs in the shell, you can write scripts (using Bash, Zsh, or PowerShell) to
  automate complex tasks, deployments, backups, and resource monitoring.
  • API Integration: The CLI is a wrapper around the AWS REST APIs. It handles request signing, authentication,
  pagination, and output formatting (supporting JSON, YAML, text, or tables).

  ### Basic Command Structure

  AWS CLI commands follow a standard pattern:

    aws &amp;lt;service&amp;gt; &amp;lt;operation&amp;gt; [options-and-parameters]

  ### Common Examples

  1. List files in an Amazon S3 bucket:
    aws s3 ls s3://my-bucket-name

  2. Upload a file to Amazon S3:
    aws s3 cp document.pdf s3://my-bucket-name/

  3. List running Amazon EC2 instances:
    aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"

  4. Get the identity details of the current CLI user/role:
    aws sts get-caller-identity

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Describe the AWS environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Here is the environment information retrieved using the AWS CLI tool:

  ### 1. AWS CLI Version Info

  • CLI Version: 2.34.50 
  • Python Version: 3.14.4 
  • OS Platform: Linux (Amazon Linux 2023, run from AWS CloudShell)

  ### 2. AWS CLI Configuration

  • Active Profile: None set (default profile is active)
  • Access &amp;amp; Secret Keys: Configured via IAM role credentials (container-role)
  • Default Region: us-east-1 (defined by the AWS_REGION or AWS_DEFAULT_REGION environment variables)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And AWS specific commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; aws s3 ls

● Bash(aws s3 ls --no-cli-pager) (ctrl+o to expand)

  Here is the list of Amazon S3 buckets in your account:

  • bedrock-agentcore-runtime-106059658660-us-west-2-0jicfccoj2 (Created: 2026-05-08 13:52:46)
  • cdk-hnb659fds-assets-106059658660-us-east-1 (Created: 2026-05-06 01:16:31)
  • elasticbeanstalk-us-east-1-106059658660 (Created: 2026-05-08 20:56:05)
  • my-adk-comic-artifacts (Created: 2026-04-21 16:11:53)
  • xbill-test (Created: 2026-03-10 14:22:51)

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity Commands
&lt;/h4&gt;

&lt;p&gt;Get high level &lt;strong&gt;agy e&lt;/strong&gt; nvironment info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Antigravity CLI general commands shortcuts (←/→ or tab to cycle)
Antigravity CLI understands your codebase, makes edits with your permission,
and executes commands — right from your terminal.

Version 1.0.2
xbill9@gmail.com (Google AI Ultra)
Workspace: ~
Project: /home/cloudshell-user
Conversation: 2182496d-3225-4864-a42d-af69db5684bc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can switch between models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Switch Model

  Gemini 3.5 Flash (Medium) (current)
  Gemini 3.5 Flash (High)
&amp;gt; Gemini 3.5 Flash (Low)      
  Gemini 3.1 Pro (Low)
  Gemini 3.1 Pro (High)
  Claude Sonnet 4.6 (Thinking)
  Claude Opus 4.6 (Thinking)
  GPT-OSS 120B (Medium)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get Context info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Context Usage
◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Gemini 3.5 Flash (Low) · 28.4k/1.0M tokens
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ (2.7%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Token usage by category
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ User messages: 19 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Agent responses: 4.5k tokens (0.4%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Tool calls: 163 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ System prompt: 7.7k tokens (0.7%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ System tools: 15.4k tokens (1.5%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ Subagents: 662 tokens (0.1%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Free space: 1.0M (97.3%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⊠ Checkpoint buffer: 571 tokens (not counted in usage)

Checkpoints (1) · /rewind
└ Checkpoint 1 (active, in context): Initializing Coding Workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your quota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Model Quota

  Gemini 3.5 Flash (Medium)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (High)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.1 Pro (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI was introduced as a compliment to the existing GUI based IDE versions. Antigravity CLI was then installed from the official Google sources to the AWS Cloud Shell. Sample AWS specific querys were tested and some common slash commands were highlighted.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cli</category>
      <category>gemini35</category>
      <category>antigravitycli</category>
    </item>
    <item>
      <title>AWS Cloud Shell with Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Tue, 26 May 2026 14:48:49 +0000</pubDate>
      <link>https://dev.to/aws-builders/aws-cloud-shell-with-antigravity-cli-3c32</link>
      <guid>https://dev.to/aws-builders/aws-cloud-shell-with-antigravity-cli-3c32</guid>
      <description>&lt;p&gt;This article covers the initial setup and configuration for the Antigravity CLI on the AWS Cloud Shell. Why? Sometimes you need more than one Cloud!&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%2Fphs8fn6u86zx20xq28xd.jpeg" 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%2Fphs8fn6u86zx20xq28xd.jpeg" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Antigravity CLI?
&lt;/h4&gt;

&lt;p&gt;The Google Antigravity CLI is a lightweight Terminal User Interface (TUI) that allows developers to invoke, monitor, and interact with Google Antigravity AI agents directly from the command line. It pairs with Antigravity 2.0 to offer the same core agentic capabilities — like multi-step reasoning, tool calling, and sub-agents — without the overhead of a desktop application.&lt;/p&gt;

&lt;p&gt;More information is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/docs/cli-getting-started" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Amazon Cloud Shell
&lt;/h4&gt;

&lt;p&gt;AWS CloudShell is a browser-based, pre-authenticated terminal that allows users to securely manage, explore, and interact with AWS resources directly from the &lt;a href="https://aws.amazon.com/cloudshell/faqs/" rel="noopener noreferrer"&gt;AWS Management Console&lt;/a&gt;. It comes pre-installed with the AWS CLI, popular programming languages (Python, Node.js), and developer tools, removing the need for local configuration.&lt;/p&gt;

&lt;p&gt;The full background information on the Cloud Shell is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cloudshell/" rel="noopener noreferrer"&gt;Browser-based Shell - AWS CloudShell - AWS&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I want Antigravity CLI on AWS? Isn’t that a Google Thing?
&lt;/h4&gt;

&lt;p&gt;Yes- Antigravity CLI leverages the Google Gemini models but it is also platform agnostic. Many applications are already cross-cloud so this enables familiar tools to be run natively on Amazon AWS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Activating Amazon CloudShell
&lt;/h4&gt;

&lt;p&gt;The AWS CloudShell comes preinstalled on all AWS Accounts.&lt;/p&gt;

&lt;p&gt;To access the shell — click the Terminal Icon in the upper right hand corner of the console:&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%2Fwb9mz610eni1jgufg31n.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%2Fwb9mz610eni1jgufg31n.png" width="499" height="85"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then activate the full shell:&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%2Foqauy4ihtazn39pece9t.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%2Foqauy4ihtazn39pece9t.png" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note- the disk space in the environment is limited to 1GB.&lt;/p&gt;

&lt;h4&gt;
  
  
  Download and Install agy CLI
&lt;/h4&gt;

&lt;p&gt;The main Antigravity download page is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/download" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a terminal window/ shell install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://antigravity.google/cli/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the installation process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⠋ Detecting system environment...
✓ Platform detected: linux_amd64
⠋ Querying release repository...
✓ Latest available version: 1.0.2
⠋ Downloading release package...
✓ Download complete and checksum verified.
⠋ Extracting binary from archive...
⠋ Configuring shell environment...
I0526 14:30:04.912941 241 installer.go:27] Running Antigravity CLI setup...
I0526 14:30:04.913030 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.bashrc: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913261 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.bashrc
I0526 14:30:04.913319 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.zshrc: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913665 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.zshrc
I0526 14:30:04.913726 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.zprofile: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.913856 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.zprofile
I0526 14:30:04.913898 241 installer.go:147] Appending PATH export to profile /home/cloudshell-user/.bash_profile: export PATH="/home/cloudshell-user/.local/bin:$PATH"
I0526 14:30:04.914038 241 installer.go:184] Successfully updated shell profile: /home/cloudshell-user/.bash_profile
I0526 14:30:04.914070 241 installer_unix.go:40] PATH verification: ~/.local/bin is correctly configured in active PATH environment.

✅ Antigravity CLI installed successfully at /home/cloudshell-user/.local/bin/agy
Run 'agy' to start the CLI
~ $ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have the package installed — you can test the startup of Antigravity CLI. You will need to authenticate with a Google Project or your Google Account:&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%2Fewi51yu6yqyjuf8ebj1h.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%2Fewi51yu6yqyjuf8ebj1h.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then step through the process:&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%2Fb3nw9qgrfhs2q95cbxa2.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%2Fb3nw9qgrfhs2q95cbxa2.png" width="800" height="450"&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%2F3x5oinwkc3ix6iwf3v56.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%2F3x5oinwkc3ix6iwf3v56.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally the One time code:&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%2Fp7kgkx9zf4rkw18xdjhb.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%2Fp7kgkx9zf4rkw18xdjhb.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Initial Configuration
&lt;/h4&gt;

&lt;p&gt;Once you have installed and authenticated. Step through initial configuration:&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%2Fhddykqujxnbvkv8w7wbh.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%2Fhddykqujxnbvkv8w7wbh.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Are we There Yet!?!?
&lt;/h4&gt;

&lt;p&gt;If all the stars align and you do the correct sacrifices to the pagan Gods then at this point you should be able to start up the agy CLI and get down to business.&lt;/p&gt;

&lt;p&gt;The startup command is  &lt;strong&gt;agy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&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%2Fvj0u2ho3ttwfhjgcekaa.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%2Fvj0u2ho3ttwfhjgcekaa.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  All Right Already! Can you actually do something?
&lt;/h4&gt;

&lt;p&gt;Fire up that terminal window and get to work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what does the aws command line tool do?

  The AWS Command Line Interface (AWS CLI) is a unified tool that allows you to manage and control Amazon Web Services
  (AWS) directly from your terminal or command-line shell.

  Instead of clicking through the web-based AWS Management Console, you can interact with almost all AWS services by
  running commands.

  ### Key Capabilities

  • Service Management: You can provision, configure, and delete AWS resources across services like Amazon S3 (storage),
  Amazon EC2 (virtual servers), DynamoDB (databases), IAM (identity/access management), and more.
  • Automation and Scripting: Because it runs in the shell, you can write scripts (using Bash, Zsh, or PowerShell) to
  automate complex tasks, deployments, backups, and resource monitoring.
  • API Integration: The CLI is a wrapper around the AWS REST APIs. It handles request signing, authentication,
  pagination, and output formatting (supporting JSON, YAML, text, or tables).

  ### Basic Command Structure

  AWS CLI commands follow a standard pattern:

    aws &amp;lt;service&amp;gt; &amp;lt;operation&amp;gt; [options-and-parameters]

  ### Common Examples

  1. List files in an Amazon S3 bucket:
    aws s3 ls s3://my-bucket-name

  2. Upload a file to Amazon S3:
    aws s3 cp document.pdf s3://my-bucket-name/

  3. List running Amazon EC2 instances:
    aws ec2 describe-instances --filters "Name=instance-state-name,Values=running"

  4. Get the identity details of the current CLI user/role:
    aws sts get-caller-identity

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;Describe the AWS environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Here is the environment information retrieved using the AWS CLI tool:

  ### 1. AWS CLI Version Info

  • CLI Version: 2.34.50 
  • Python Version: 3.14.4 
  • OS Platform: Linux (Amazon Linux 2023, run from AWS CloudShell)

  ### 2. AWS CLI Configuration

  • Active Profile: None set (default profile is active)
  • Access &amp;amp; Secret Keys: Configured via IAM role credentials (container-role)
  • Default Region: us-east-1 (defined by the AWS_REGION or AWS_DEFAULT_REGION environment variables)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And AWS specific commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; aws s3 ls

● Bash(aws s3 ls --no-cli-pager) (ctrl+o to expand)

  Here is the list of Amazon S3 buckets in your account:

  • bedrock-agentcore-runtime-106059658660-us-west-2-0jicfccoj2 (Created: 2026-05-08 13:52:46)
  • cdk-hnb659fds-assets-106059658660-us-east-1 (Created: 2026-05-06 01:16:31)
  • elasticbeanstalk-us-east-1-106059658660 (Created: 2026-05-08 20:56:05)
  • my-adk-comic-artifacts (Created: 2026-04-21 16:11:53)
  • xbill-test (Created: 2026-03-10 14:22:51)

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity Commands
&lt;/h4&gt;

&lt;p&gt;Get high level &lt;strong&gt;agy e&lt;/strong&gt; nvironment info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Antigravity CLI general commands shortcuts (←/→ or tab to cycle)
Antigravity CLI understands your codebase, makes edits with your permission,
and executes commands — right from your terminal.

Version 1.0.2
xbill9@gmail.com (Google AI Ultra)
Workspace: ~
Project: /home/cloudshell-user
Conversation: 2182496d-3225-4864-a42d-af69db5684bc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can switch between models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Switch Model

  Gemini 3.5 Flash (Medium) (current)
  Gemini 3.5 Flash (High)
&amp;gt; Gemini 3.5 Flash (Low)      
  Gemini 3.1 Pro (Low)
  Gemini 3.1 Pro (High)
  Claude Sonnet 4.6 (Thinking)
  Claude Opus 4.6 (Thinking)
  GPT-OSS 120B (Medium)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get Context info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Context Usage
◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ ◉ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Gemini 3.5 Flash (Low) · 28.4k/1.0M tokens
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ (2.7%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Token usage by category
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ User messages: 19 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Agent responses: 4.5k tokens (0.4%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Tool calls: 163 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ System prompt: 7.7k tokens (0.7%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ System tools: 15.4k tokens (1.5%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⛁ Subagents: 662 tokens (0.1%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Free space: 1.0M (97.3%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ⊠ Checkpoint buffer: 571 tokens (not counted in usage)

Checkpoints (1) · /rewind
└ Checkpoint 1 (active, in context): Initializing Coding Workspace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your quota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Model Quota

  Gemini 3.5 Flash (Medium)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (High)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.1 Pro (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI was introduced as a compliment to the existing GUI based IDE versions. Antigravity CLI was then installed from the official Google sources to the AWS Cloud Shell. Sample AWS specific querys were tested and some common slash commands were highlighted.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cli</category>
      <category>gemini35</category>
      <category>antigravitycli</category>
    </item>
    <item>
      <title>Azure Cloud Shell with Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Tue, 26 May 2026 14:18:48 +0000</pubDate>
      <link>https://dev.to/gde/azure-cloud-shell-with-antigravity-cli-mn6</link>
      <guid>https://dev.to/gde/azure-cloud-shell-with-antigravity-cli-mn6</guid>
      <description>&lt;p&gt;This article covers the initial setup and configuration for the Antigravity CLI on the Azure Cloud Shell environment.&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%2F7o0kozqnrgb432e06q9y.jpeg" 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%2F7o0kozqnrgb432e06q9y.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Antigravity CLI?
&lt;/h4&gt;

&lt;p&gt;The Google Antigravity CLI is a lightweight Terminal User Interface (TUI) that allows developers to invoke, monitor, and interact with Google Antigravity AI agents directly from the command line. It pairs with Antigravity 2.0 to offer the same core agentic capabilities — like multi-step reasoning, tool calling, and sub-agents — without the overhead of a desktop application.&lt;/p&gt;

&lt;p&gt;More information is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/docs/cli-getting-started" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Azure Cloud Shell
&lt;/h4&gt;

&lt;p&gt;Azure Cloud Shell is a browser-based, authenticated terminal for managing Azure resources, accessible directly through the Azure portal, shell.azure.com, or the mobile app. It provides a preconfigured environment with Bash or PowerShell, eliminating local installation of tools. It runs on a temporary, secure, Linux-based host.&lt;/p&gt;

&lt;p&gt;The full background information on the Cloud Shell is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/get-started/azure-portal/cloud-shell" rel="noopener noreferrer"&gt;https://azure.microsoft.com/en-us/get-started/azure-portal/cloud-shell&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More information is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/cloud-shell/get-started/classic?wt.mc_id=fulltextsearch_inproduct_azure-portal-global-search&amp;amp;tabs=azurecli" rel="noopener noreferrer"&gt;Get started with Azure Cloud Shell&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I want Antigravity CLI on Azure? Isn’t that a Google Thing?
&lt;/h4&gt;

&lt;p&gt;Yes- Antigravity CLI leverages the Google Cloud console and Gemini models but it is also platform agnostic. Many applications are already cross-cloud so this enables familiar tools to be run natively on Microsoft Azure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Activating Azure Cloud Shell
&lt;/h4&gt;

&lt;p&gt;The Azure Cloud Shell comes preinstalled on all Azure Accounts.&lt;/p&gt;

&lt;p&gt;To access the shell — click the Terminal Icon in the upper right hand corner of the console:&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%2Fbsubssxraetql1lmam9n.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%2Fbsubssxraetql1lmam9n.png" width="229" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then activate the full shell:&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%2Fnj6zipv4ru2xdrzjerrc.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%2Fnj6zipv4ru2xdrzjerrc.png" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note- the disk space in the environment is limited to 5GB- but this is sufficient for Antigravity CLI, Google Cloud Tools, and some customization.&lt;/p&gt;

&lt;h4&gt;
  
  
  Azure CLI
&lt;/h4&gt;

&lt;p&gt;The Azure Command-Line Interface (CLI) is a cross-platform tool used to connect to Azure and execute administrative commands on Azure resources. It allows you to manage services like virtual machines, databases, and networking through a terminal using interactive prompts or scripts. [&lt;a href="https://learn.microsoft.com/en-us/cli/azure/what-is-azure-cli?view=azure-cli-latest" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://learn.microsoft.com/en-us/cli/azure/?view=azure-cli-latest" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://sumble.com/tech/azure-cli" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;More details are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/developer/azure-developer-cli/overview?tabs=linux" rel="noopener noreferrer"&gt;What is the Azure Developer CLI?&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Download and Install agy CLI
&lt;/h4&gt;

&lt;p&gt;The main Antigravity CLI download page is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://antigravity.google/download" rel="noopener noreferrer"&gt;Google Antigravity&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a terminal window/ shell install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://antigravity.google/cli/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the installation process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;william [~]$ curl -fsSL https://antigravity.google/cli/install.sh | bash
⠋ Detecting system environment...
✓ Platform detected: linux_amd64
⠋ Querying release repository...
✓ Latest available version: 1.0.2
⠋ Downloading release package...
✓ Download complete and checksum verified.
⠋ Extracting binary from archive...
⠋ Configuring shell environment...
I0526 14:06:50.576172 5501 installer.go:27] Running Antigravity CLI setup...
I0526 14:06:50.632909 5501 installer_unix.go:40] PATH verification: ~/.local/bin is correctly configured in active PATH environment.

✅ Antigravity CLI installed successfully at /home/william/.local/bin/agy
Run 'agy' to start the CLI
william [~]$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have the package installed — you can test the startup of Antigravity CLI. You will need to authenticate with a Google Project or your Google Account:&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%2Fewi51yu6yqyjuf8ebj1h.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%2Fewi51yu6yqyjuf8ebj1h.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then step through the process:&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%2Fb3nw9qgrfhs2q95cbxa2.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%2Fb3nw9qgrfhs2q95cbxa2.png" width="800" height="450"&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%2F3x5oinwkc3ix6iwf3v56.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%2F3x5oinwkc3ix6iwf3v56.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally the One time code:&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%2Fp7kgkx9zf4rkw18xdjhb.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%2Fp7kgkx9zf4rkw18xdjhb.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Initial Configuration
&lt;/h4&gt;

&lt;p&gt;Once you have installed and authenticated. Step through initial configuration:&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%2Fhddykqujxnbvkv8w7wbh.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%2Fhddykqujxnbvkv8w7wbh.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Are we There Yet!?!?
&lt;/h4&gt;

&lt;p&gt;If all the stars align and you do the correct sacrifices to the pagan Gods then at this point you should be able to start up the agy CLI and get down to business.&lt;/p&gt;

&lt;p&gt;The startup command is  &lt;strong&gt;agy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Run 'agy' to start the CLI
william [~]$ agy

      ▄▀▀▄ Antigravity CLI 1.0.2
     ▀▀▀▀▀▀ xbill9@gmail.com (Google AI Ultra)
    ▀▀▀▀▀▀▀▀ Gemini 3.5 Flash (Medium)
   ▄▀▀ ▀▀▄ ~
  ▄▀▀ ▀▀▄

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
? for shortcuts            
&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%2Fg5ty5kxpehzkcm6pppd0.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%2Fg5ty5kxpehzkcm6pppd0.png" width="799" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  All Right Already! Can you actually do something with Antigravity CLI?
&lt;/h4&gt;

&lt;p&gt;Fire up that terminal window and get to work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what is the azure cloud shell?

● WebSearch(Azure Cloud Shell definition features) (ctrl+o to expand)

  Azure Cloud Shell is a browser-accessible, authenticated, and pre-configured terminal environment hosted by Microsoft in the cloud.
  It is designed to let you manage and administer your Azure resources directly from your web browser without needing to install the
  Azure CLI or PowerShell locally.

  ### Key Features &amp;amp; Capabilities:

  1. Browser-Based and Accessible:
      • It requires no local software installations or complex setups.
      • You can access it from virtually anywhere via the Azure Portal https://portal.azure.com, directly at https://shell.azure.com,
      through the Azure Mobile App, or via integrations like the VS Code Azure Account extension.
  2. Choice of Environment:
      • Bash: A Linux-based environment (running on a container) ideal for standard bash scripting and using tools like git , make ,
      etc.
      • PowerShell: A Windows-friendly administrative shell that includes Azure Drive ( Azure: ), allowing you to navigate your Azure
      resources as if they were directories on a filesystem.
  3. Pre-configured Tools and Languages:
      • It comes pre-installed with common command-line utilities ( kubectl , terraform , ansible , docker , helm , git , etc.).
      • Includes programming runtimes and compilers (such as Python, Node.js, .NET, Go, and Java).
      • Features built-in text editors (such as nano , vim , and a built-in web-based graphical editor based on Monaco).
  4. Automatic Authentication:
      • Because it is authenticated through your Azure Portal session, you are automatically logged in when the terminal starts,
      allowing you to run management commands immediately without entering credentials.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get detailed Azure Cloud Shell information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; use the az command tool to get environment information
● ListDir(/home/william)
● Bash(az version)
● Bash(az account show) (ctrl+o to expand)

  I ran the az CLI to gather your environment information:

  ### Azure CLI Version ( az version )

    {
      "azure-cli": "2.86.0",
      "azure-cli-core": "2.86.0",
      "azure-cli-telemetry": "1.1.0",
      "extensions": {
        "ml": "2.42.0",
        "ssh": "2.0.8"
      }
    }

  ### Active Subscription and Account Information ( az account show )

    {
      "environmentName": "AzureCloud",
      "homeTenantId": "40482c55-d00d-4c6d-8903-643d76a74b9c",
      "id": "3db3ce66-50b6-4d11-91ef-5950cf4039ed",
      "isDefault": true,
      "managedByTenants": [],
      "name": "Azure subscription 1",
      "state": "Enabled",
      "tenantId": "40482c55-d00d-4c6d-8903-643d76a74b9c",
      "user": {
        "cloudShellID": true,
        "name": "live.com#xbill@glitnir.com",
        "type": "user"
      }
    }

──────────────────────────────────────────────────────────────────────────────────────────────────────────
&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get high level &lt;strong&gt;agy e&lt;/strong&gt; nvironment info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────
Antigravity CLI general commands shortcuts (←/→ or tab to cycle)
Antigravity CLI understands your codebase, makes edits with your permission,
and executes commands — right from your terminal.

Version 1.0.2
xbill9@gmail.com (Google AI Ultra)
Workspace: ~
Project: /home/william

Quick Reference
  / Type / to see available commands

Keyboard: ↑/↓ Navigate ←/→ Switch View esc Close

esc to cancel   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can switch between models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────
Switch Model

  Gemini 3.5 Flash (Medium)
  Gemini 3.5 Flash (High)
&amp;gt; Gemini 3.5 Flash (Low) (current)
  Gemini 3.1 Pro (Low)
  Gemini 3.1 Pro (High)
  Claude Sonnet 4.6 (Thinking)
  Claude Opus 4.6 (Thinking)
  GPT-OSS 120B (Medium)

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

&lt;/div&gt;



&lt;p&gt;Get Context info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Context Usage
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Gemini 3.5 Flash (Low) · 0/1.0M tokens
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Estimated usage (awaiting generation)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ User messages: 0 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Agent responses: 0 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ ◉ Tool calls: 0 tokens (0.0%)
□ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Free space: 1.0M (100.0%)

Related: /artifact · /skill · /rewind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your quota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt;
──────────────────────────────────────────────────────────────────────────────────────────────────────────
└ Model Quota

  Gemini 3.5 Flash (Medium)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (High)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.5 Flash (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.1 Pro (Low)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Gemini 3.1 Pro (High)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Claude Sonnet 4.6 (Thinking)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  Claude Opus 4.6 (Thinking)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  Quota available

  GPT-OSS 120B (Medium)
  ███████████ ███████████ ███████████ ███████████ ███████████ 100%
  (1–30 of 33 lines)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI was introduced as a compliment to the existing GUI based IDE versions. Antigravity CLI was then installed to Azure Cloud Shell from the official Google sources. A sample query was tested and some common slash commands were highlighted.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>azurecloudshell</category>
      <category>antigravitycli</category>
      <category>azure</category>
    </item>
    <item>
      <title>Deploying a Rust A2A Agent to Azure Container Apps (ACA)</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Fri, 22 May 2026 15:46:31 +0000</pubDate>
      <link>https://dev.to/gde/deploying-a-rust-a2a-agent-to-azure-container-apps-aca-2g93</link>
      <guid>https://dev.to/gde/deploying-a-rust-a2a-agent-to-azure-container-apps-aca-2g93</guid>
      <description>&lt;p&gt;This article covers building Agent applications with the Agent to Agent (A2A) protocol using the Rust programming language. A minimally viable A2A Rust Agent application was debugged and validated locally. Then- the entire solution is deployed to Azure Container Apps (ACA).&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%2F703c8p6pwfcp0hxsf8s1.jpeg" 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%2F703c8p6pwfcp0hxsf8s1.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust A2A? Isn’t that a Python Thing?
&lt;/h4&gt;

&lt;p&gt;The bulk of A2A Agents are in Python. The A2A protocol is language independent.&lt;/p&gt;

&lt;p&gt;Python has traditionally been the main coding language for ML and AI tools. The goal of this article is to provide a test bed for building, debugging, and deploying cross language applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  So where is the Beef?
&lt;/h4&gt;

&lt;p&gt;So what is different about this lab compared to all the others out there?&lt;/p&gt;

&lt;p&gt;This is one of the first deep dives into a Rust A2A agent leveraging the standard Rust crates.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Rust?
&lt;/h4&gt;

&lt;p&gt;Rust is a high performance, memory safe, compiled language:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rust provides memory safe operations beyond C/C++ and also can provide exceptional performance gains as it is compiled directly to native binaries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust Setup
&lt;/h4&gt;

&lt;p&gt;Instructions to install Rust are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/learn/get-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a Linux like environment the command looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl — proto ‘&lt;span class="o"&gt;=&lt;/span&gt;https’ — tlsv1.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rust also depends on a working C compiler and OpenSSL setup. For a Debian 12/13 system — install the basic 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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;libssl-dev
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;pkg-config
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libudev-dev
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;make
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Azure Container Apps
&lt;/h4&gt;

&lt;p&gt;Azure Container Apps is a fully managed, serverless Kubernetes-based application platform designed for building and deploying modern, containerized apps without managing complex infrastructure. It enables scaling from zero to high demand, supports microservices, and handles event-driven processing with built-in HTTPS and observability.&lt;/p&gt;

&lt;p&gt;Full details are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/container-apps" rel="noopener noreferrer"&gt;https://azure.microsoft.com/en-us/products/container-apps&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%2Fxzsiipedq5e6auvt0f5n.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%2Fxzsiipedq5e6auvt0f5n.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Why would I want A2A with Azure? Isn’t that a Google Thing?
&lt;/h4&gt;

&lt;p&gt;A2A is open source and platform agnostic. Many applications are already cross-cloud so this enables familiar tools to be run natively on Microsoft Azure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Where do I start?
&lt;/h4&gt;

&lt;p&gt;The strategy for starting Rust A2A development is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.&lt;/p&gt;

&lt;p&gt;Then, a Rust A2A agent is built, debugged, and tested locally.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup the Basic Environment
&lt;/h4&gt;

&lt;p&gt;At this point you should have a working Python environment and a working Antigravity CLI installation. All of the relevant code examples and documentation is available in GitHub.&lt;/p&gt;

&lt;p&gt;The next step is to clone the GitHub repository to your local environment:&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;cd&lt;/span&gt; ~
git clone https://github.com/xbill9/a2a-hello-world
&lt;span class="nb"&gt;cd &lt;/span&gt;poly-aca-rust-azure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;strong&gt;init.sh&lt;/strong&gt; from the cloned directory.&lt;/p&gt;

&lt;p&gt;The script will attempt to determine your shell environment and set the correct variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your session times out or you need to re-authenticate- you can run the &lt;strong&gt;set_env.sh&lt;/strong&gt; script to reset your environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables like PROJECT_ID need to be setup for use in the various build scripts- so the &lt;strong&gt;set_env&lt;/strong&gt; script can be used to reset the environment if you time-out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust A2A Libraries
&lt;/h4&gt;

&lt;p&gt;There are several crates that provide A2A support. This project uses the a2a-rs crate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crates.io/crates/a2a-rs" rel="noopener noreferrer"&gt;crates.io: Rust Package Registry&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%2F81eznifwit6ot5ni1kef.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%2F81eznifwit6ot5ni1kef.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a sample Cargo.TOML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;tokio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^1.37.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;anyhow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0.86"&lt;/span&gt;
&lt;span class="py"&gt;a2a-rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;futures&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.3"&lt;/span&gt;
&lt;span class="py"&gt;async-trait&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Minimal System Information Tool Build
&lt;/h4&gt;

&lt;p&gt;The first step is to build the basic tool directly with Rust. This allows the tool to be debugged and tested locally before adding the MCP layer.&lt;/p&gt;

&lt;p&gt;First build the tool locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make build
&lt;span class="go"&gt;Building the Rust project...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then lint check the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make lint
&lt;span class="go"&gt;Linting code...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.27s
Checking formatting...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run local tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;Running tests...
   Compiling a2a-server-rust v0.2.0 (/home/xbill/a2a-hello-world/poly-aca-rust-azure)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 1.39s
     Running unittests src/main.rs (target/debug/deps/a2a_server_rust-5d07a7739a477350)

running 2 tests
test tests::test_simple_agent_handler_creation ... ok
test tests::test_task_creation ... ok

&lt;/span&gt;&lt;span class="gp"&gt;test result: ok. 2 passed;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last step is to build the production version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make release
&lt;span class="go"&gt;Building Release...
    Finished `release` profile [optimized] target(s) in 0.26s
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The A2A server can be started locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make start
&lt;span class="go"&gt;Starting the A2A Rust server on port 8080...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
     Running `target/debug/a2a-server-rust`
🚀 Starting A2A Rust Server
==============================
🌐 Starting HTTP server on 0.0.0.0:8080...
🔗 HTTP server listening on http://0.0.0.0:8080
2026-05-21T20:01:10.860135Z INFO main ThreadId(01) start{server.address=0.0.0.0:8080 server.has_auth=false}: a2a_rs::adapter::transport::http::server: Starting HTTP server
2026-05-21T20:01:10.860358Z INFO main ThreadId(01) start{server.address=0.0.0.0:8080 server.has_auth=false}: a2a_rs::adapter::transport::http::server: HTTP server listening on 0.0.0.0:8080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check The Local Agent Status
&lt;/h4&gt;

&lt;p&gt;The project has a target to verify that the A2A server started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make status
&lt;span class="go"&gt;Checking Azure Container App status for a2a-app-penguin...
Name ProvisioningState FQDN
--------------- ------------------- ---------------------------------------------------------------
a2a-app-penguin Succeeded a2a-app-penguin.icyplant-a768d75c.westus2.azurecontainerapps.io
--- Service Status ---
Local (8080): ONLINE (A2A Rust Agent)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Inspector
&lt;/h4&gt;

&lt;p&gt;The A2A Inspector provides a tool to verify A2A operations.&lt;/p&gt;

&lt;p&gt;Background information is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discuss.google.dev/t/announcing-the-a2a-inspector-a-ui-tool-for-a2a-protocol-development/242240" rel="noopener noreferrer"&gt;Announcing the A2A Inspector: A UI tool for A2A protocol development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repo is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;GitHub - a2aproject/a2a-inspector: Validation Tools for A2A Agents&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify The Local A2A Installation
&lt;/h4&gt;

&lt;p&gt;Start the A2A Inspector and use localhost:8080:&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%2Fjlnxmsrefvqf8uacemi1.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%2Fjlnxmsrefvqf8uacemi1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see the details of the Agent Card:&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;"capabilities"&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;"pushNotifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stateTransitionHistory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streaming"&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;span class="nl"&gt;"defaultInputModes"&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;"text"&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;"defaultOutputModes"&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;"text"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"An A2A agent using the a2a-rs crate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"documentationUrl"&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://example.org/docs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A2A Rust Agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preferredTransport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JSONRPC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&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;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Organization"&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://example.org"&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;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Echoes back the user's message"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"examples"&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;"Echo: Hello World"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"inputModes"&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;"text"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Echo Skill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"outputModes"&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;"text"&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;"tags"&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;"echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"respond"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"http://0.0.0.0:8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;h4&gt;
  
  
  Test the Local A2A Connection Locally
&lt;/h4&gt;

&lt;p&gt;This step tests the A2A agent interactions with a test script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make card
&lt;span class="go"&gt;Fetching local agent card...
{
    "name": "A2A Rust Agent",
    "description": "An A2A agent using the a2a-rs crate",
    "url": "http://0.0.0.0:8080",
    "provider": {
        "organization": "Example Organization",
        "url": "https://example.org"
    },
    "version": "1.0.0",
    "protocolVersion": "0.3.0",
    "preferredTransport": "JSONRPC",
    "documentationUrl": "https://example.org/docs",
    "capabilities": {
        "streaming": false,
        "pushNotifications": false,
        "stateTransitionHistory": false
    },
    "defaultInputModes": [
        "text"
    ],
    "defaultOutputModes": [
        "text"
    ],
    "skills": [
        {
            "id": "echo",
            "name": "Echo Skill",
            "description": "Echoes back the user's message",
            "tags": [
                "echo",
                "respond"
            ],
            "examples": [
                "Echo: Hello World"
            ],
            "inputModes": [
                "text"
            ],
            "outputModes": [
                "text"
            ]
        }
    ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the A2A can be tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make a2a-local
&lt;span class="go"&gt;Running local A2A echo test...
🚀 Testing A2A Echo Skill at http://localhost:8080
💬 Sending message: 'Hello from the test program!'
✅ Received echo: 'Echo: Hello from the test program!'
🌟 Success! The echo skill is working correctly.
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  So What Just Happened?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Rust A2A&lt;/strong&gt; agent was started locally. This agent provided a standard A2A agent card. Then, test scripts performed a A2A skills call against the locally running Rust A2A server. Because the A2A server in Rust provides standard tools- the A2A inspector could connect. The actual implementation language of the A2A code does not matter — as long as standard services are exposed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deploy to ACA Azure
&lt;/h4&gt;

&lt;p&gt;Once the Agent has been validated and tested locally- the solution can be deployed to Azure ACA. Run the deploy target in the Makefile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure&lt;span class="nv"&gt;$ &lt;/span&gt;make deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the build is done — you can check the status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make status
&lt;span class="go"&gt;Checking Azure Container App status for a2a-app-penguin...
Name ProvisioningState FQDN
--------------- ------------------- ---------------------------------------------------------------
a2a-app-penguin Succeeded a2a-app-penguin.icyplant-a768d75c.westus2.azurecontainerapps.io
--- Service Status ---
Local (8080): ONLINE (A2A Rust Agent)
Remote (Cloud): ONLINE (A2A Rust Agent) - https://a2a-app-penguin.icyplant-a768d75c.westus2.azurecontainerapps.io
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and get the endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make endpoint
&lt;span class="go"&gt;a2a-app-penguin.icyplant-a768d75c.westus2.azurecontainerapps.io
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verify the Cloud Run Service
&lt;/h4&gt;

&lt;p&gt;The Rust A2A service will be visible from the Azure console:&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%2Flc5g6viqhhvpjvlcsapg.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%2Flc5g6viqhhvpjvlcsapg.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing Azure Deployment
&lt;/h4&gt;

&lt;p&gt;The Makefile has several tools for validating the remote A2A server.&lt;/p&gt;

&lt;p&gt;First — you can get the remote Agent card:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make card-remote
&lt;span class="go"&gt;Fetching remote agent card...
{
    "name": "A2A Rust Agent",
    "description": "An A2A agent using the a2a-rs crate",
    "url": "http://0.0.0.0:8080",
    "provider": {
        "organization": "Example Organization",
        "url": "https://example.org"
    },
    "version": "1.0.0",
    "protocolVersion": "0.3.0",
    "preferredTransport": "JSONRPC",
    "documentationUrl": "https://example.org/docs",
    "capabilities": {
        "streaming": false,
        "pushNotifications": false,
        "stateTransitionHistory": false
    },
    "defaultInputModes": [
        "text"
    ],
    "defaultOutputModes": [
        "text"
    ],
    "skills": [
        {
            "id": "echo",
            "name": "Echo Skill",
            "description": "Echoes back the user's message",
            "tags": [
                "echo",
                "respond"
            ],
            "examples": [
                "Echo: Hello World"
            ],
            "inputModes": [
                "text"
            ],
            "outputModes": [
                "text"
            ]
        }
    ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run a basic test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make a2a-remote
&lt;span class="go"&gt;Running remote A2A echo test...
🚀 Testing A2A Echo Skill at https://a2a-app-penguin.icyplant-a768d75c.westus2.azurecontainerapps.io
💬 Sending message: 'Hello from the test program!'
✅ Received echo: 'Echo: Hello from the test program!'
🌟 Success! The echo skill is working correctly.
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-aca-rust-azure$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Crates.io
&lt;/h4&gt;

&lt;p&gt;The full package is available on GitHub and crates.io:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crates.io/crates/a2a-server-rust-azure" rel="noopener noreferrer"&gt;https://crates.io/crates/a2a-server-rust-azure&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The package details are here:&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%2Fdophxdv9z4mnj1xnybok.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%2Fdophxdv9z4mnj1xnybok.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;A complete A2A server was built using Rust. Basic validation was done with the A2A inspector. Next, test scripts were built that directly called the Rust A2A server. Finally, the complete solution was deployed to Azure ACA.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>aca</category>
      <category>a2aprotocol</category>
      <category>agents</category>
    </item>
    <item>
      <title>Deploying a Rust A2A Agent to AWS Lightsail</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Fri, 22 May 2026 02:17:27 +0000</pubDate>
      <link>https://dev.to/aws-builders/deploying-a-rust-a2a-agent-to-aws-lightsail-2j21</link>
      <guid>https://dev.to/aws-builders/deploying-a-rust-a2a-agent-to-aws-lightsail-2j21</guid>
      <description>&lt;p&gt;This article covers building Agent applications with the Agent to Agent (A2A) protocol using the Rust programming language. A minimally viable A2A Rust Agent application was debugged and validated locally. Then- the entire solution is deployed to AWS Lightsail.&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%2Fo8ij91xrvrclij28j99n.jpeg" 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%2Fo8ij91xrvrclij28j99n.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust A2A? Isn’t that a Python Thing?
&lt;/h4&gt;

&lt;p&gt;The bulk of A2A Agents are in Python. The A2A protocol is language independent.&lt;/p&gt;

&lt;p&gt;Python has traditionally been the main coding language for ML and AI tools. The goal of this article is to provide a test bed for building, debugging, and deploying cross language applications.&lt;/p&gt;

&lt;h4&gt;
  
  
  So is this the Real Deal(TM)?
&lt;/h4&gt;

&lt;p&gt;So what is different about this lab compared to all the others out there?&lt;/p&gt;

&lt;p&gt;This is one of the first deep dives into a Rust A2A agent leveraging the standard Rust crates.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Rust?
&lt;/h4&gt;

&lt;p&gt;Rust is a high performance, memory safe, compiled language:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rust provides memory safe operations beyond C/C++ and also can provide exceptional performance gains as it is compiled directly to native binaries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust Setup
&lt;/h4&gt;

&lt;p&gt;Instructions to install Rust are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/learn/get-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a Linux like environment the command looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl — proto ‘&lt;span class="o"&gt;=&lt;/span&gt;https’ — tlsv1.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rust also depends on a working C compiler and OpenSSL setup. For a Debian 12/13 system — install the basic 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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;libssl-dev
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;pkg-config
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libudev-dev
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;make
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS CLI
&lt;/h4&gt;

&lt;p&gt;The AWS CLI provides a command line tool to directly access AWS services from your current environment. Full details on the CLI are available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/lightsail/latest/userguide/amazon-lightsail-install-software.html" rel="noopener noreferrer"&gt;Install Docker, AWS CLI, and the Lightsail Control plugin for containers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can version check the tool after installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/gemini-cli-aws/mcp-lightsai-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;aws &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="go"&gt;aws-cli/2.34.43 Python/3.14.4 Linux/6.6.99-09128-g14e87a8a9b71 exe/x86_64.debian.12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Amazon Lightsail
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/lightsail/" rel="noopener noreferrer"&gt;Amazon Lightsail&lt;/a&gt; is an easy-to-use virtual private server (VPS) provider and cloud platform designed by AWS for simpler workloads, offering developers pre-configured compute, storage, and networking for a low, predictable monthly price. It is ideal for hosting small websites, simple web apps, or creating development environments.&lt;/p&gt;

&lt;p&gt;More information is available on the official site here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/free/compute/lightsail/?trk=93c1c080-6a58-41f6-b56e-f352c703feb6&amp;amp;sc_channel=ps&amp;amp;ef_id=CjwKCAjwjtTNBhB0EiwAuswYhjYfDAdZvphotoys8sw1RlOcuvMz1mu6mp0MulOUryHwrqsyynfDEhoCxTEQAvD_BwE:G:s&amp;amp;s_kwcid=AL!4422!3!795794191906!e!!g!!amazon%20lightsail!23527793966!192204323906&amp;amp;gad_campaignid=23527793966&amp;amp;gbraid=0AAAAADjHtp_DJwRcBBdbHLaptszTVpfxR&amp;amp;gclid=CjwKCAjwjtTNBhB0EiwAuswYhjYfDAdZvphotoys8sw1RlOcuvMz1mu6mp0MulOUryHwrqsyynfDEhoCxTEQAvD_BwE" rel="noopener noreferrer"&gt;Amazon's Simple Cloud Server | Amazon Lightsail&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this is the direct URL to the console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://lightsail.aws.amazon.com/ls/webapp/home/containers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Lightsail console will look similar to:&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%2F4wowy8nvdi9gn79nuszr.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%2F4wowy8nvdi9gn79nuszr.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Where do I start?
&lt;/h4&gt;

&lt;p&gt;The strategy for starting Rust A2A development is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.&lt;/p&gt;

&lt;p&gt;Then, a Rust A2A agent is built, debugged, and tested locally.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup the Basic Environment
&lt;/h4&gt;

&lt;p&gt;At this point you should have a working Python environment and a working Antigravity CLI installation. All of the relevant code examples and documentation is available in GitHub.&lt;/p&gt;

&lt;p&gt;The next step is to clone the GitHub repository to your local environment:&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;cd&lt;/span&gt; ~
git clone https://github.com/xbill9/a2a-hello-world
&lt;span class="nb"&gt;cd &lt;/span&gt;poly-lightsail-rust-aws
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;strong&gt;init.sh&lt;/strong&gt; from the cloned directory.&lt;/p&gt;

&lt;p&gt;The script will attempt to determine your shell environment and set the correct variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your session times out or you need to re-authenticate- you can run the &lt;strong&gt;set_env.sh&lt;/strong&gt; script to reset your environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables like PROJECT_ID need to be setup for use in the various build scripts- so the &lt;strong&gt;set_env&lt;/strong&gt; script can be used to reset the environment if you time-out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust A2A Libraries
&lt;/h4&gt;

&lt;p&gt;There are several crates that provide A2A support. This project uses the a2a-rs crate:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crates.io/crates/a2a-rs" rel="noopener noreferrer"&gt;crates.io: Rust Package Registry&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%2F81eznifwit6ot5ni1kef.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%2F81eznifwit6ot5ni1kef.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a sample Cargo.TOML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;tokio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"^1.37.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;anyhow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0.86"&lt;/span&gt;
&lt;span class="py"&gt;a2a-rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"full"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;futures&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.3"&lt;/span&gt;
&lt;span class="py"&gt;async-trait&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Minimal System Information Tool Build
&lt;/h4&gt;

&lt;p&gt;The first step is to build the basic tool directly with Rust. This allows the tool to be debugged and tested locally before adding the MCP layer.&lt;/p&gt;

&lt;p&gt;First build the tool locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make
&lt;span class="go"&gt;Building the Rust project...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then lint check the code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make
&lt;span class="go"&gt;Building the Rust project...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.25s
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run local tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="go"&gt;Running tests...
   Compiling a2a-server-rust v0.2.0 (/home/xbill/a2a-hello-world/poly-lightsail-rust-aws)
    Finished `test` profile [unoptimized + debuginfo] target(s) in 2.31s
     Running unittests src/main.rs (target/debug/deps/a2a_server_rust-5d07a7739a477350)

running 2 tests
test tests::test_task_creation ... ok
test tests::test_simple_agent_handler_creation ... ok

&lt;/span&gt;&lt;span class="gp"&gt;test result: ok. 2 passed;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last step is to build the production version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make release
&lt;span class="go"&gt;Building Release...
    Finished `release` profile [optimized] target(s) in 0.29s
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The A2A server can be started locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make start
&lt;span class="go"&gt;Starting the A2A Rust server on port 8080...
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.19s
     Running `target/debug/a2a-server-rust`
🚀 Starting A2A Rust Server
==============================
🌐 Starting HTTP server on 0.0.0.0:8080...
🔗 HTTP server listening on http://0.0.0.0:8080
2026-05-21T17:05:41.115301Z INFO main ThreadId(01) start{server.address=0.0.0.0:8080 server.has_auth=false}: a2a_rs::adapter::transport::http::server: Starting HTTP server
2026-05-21T17:05:41.115593Z INFO main ThreadId(01) start{server.address=0.0.0.0:8080 server.has_auth=false}: a2a_rs::adapter::transport::http::server: HTTP server listening on 0.0.0.0:8080
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check The Local Agent Status
&lt;/h4&gt;

&lt;p&gt;The project has a target to verify that the A2A server started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make status
&lt;span class="go"&gt;Checking AWS Lightsail service status for a2a-lightsail-rust-aws...
--------------------------------------------
| GetContainerServices |
+-------------+--------+-----------+-------+
| Deployment | Power | State | URL |
+-------------+--------+-----------+-------+
| ACTIVE | nano | RUNNING | None |
+-------------+--------+-----------+-------+
--- Service Status ---
Local (8080): ONLINE (A2A Rust Agent)
Remote (Cloud): ONLINE (A2A Rust Agent) - https://a2a-lightsail-rust-aws.6wpv8vensby5c.us-east-1.cs.amazonlightsail.com
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  A2A Inspector
&lt;/h4&gt;

&lt;p&gt;The A2A Inspector provides a tool to verify A2A operations.&lt;/p&gt;

&lt;p&gt;Background information is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discuss.google.dev/t/announcing-the-a2a-inspector-a-ui-tool-for-a2a-protocol-development/242240" rel="noopener noreferrer"&gt;Announcing the A2A Inspector: A UI tool for A2A protocol development&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Repo is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/a2aproject/a2a-inspector" rel="noopener noreferrer"&gt;GitHub - a2aproject/a2a-inspector: Validation Tools for A2A Agents&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify The Local A2A Installation
&lt;/h4&gt;

&lt;p&gt;Start the A2A Inspector and use localhost:8080:&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%2Fjlnxmsrefvqf8uacemi1.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%2Fjlnxmsrefvqf8uacemi1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see the details of the Agent Card:&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;"capabilities"&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;"pushNotifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stateTransitionHistory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"streaming"&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;span class="nl"&gt;"defaultInputModes"&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;"text"&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;"defaultOutputModes"&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;"text"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"An A2A agent using the a2a-rs crate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"documentationUrl"&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://example.org/docs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A2A Rust Agent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preferredTransport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JSONRPC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.3.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&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;"organization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Organization"&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://example.org"&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;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Echoes back the user's message"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"examples"&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;"Echo: Hello World"&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"inputModes"&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;"text"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Echo Skill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"outputModes"&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;"text"&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;"tags"&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;"echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"respond"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"http://0.0.0.0:8080"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;h4&gt;
  
  
  Test the Local A2A Connection Locally
&lt;/h4&gt;

&lt;p&gt;This step tests the A2A agent interactions with a test script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make card
&lt;span class="go"&gt;Fetching local agent card...
{
    "name": "A2A Rust Agent",
    "description": "An A2A agent using the a2a-rs crate",
    "url": "http://0.0.0.0:8080",
    "provider": {
        "organization": "Example Organization",
        "url": "https://example.org"
    },
    "version": "1.0.0",
    "protocolVersion": "0.3.0",
    "preferredTransport": "JSONRPC",
    "documentationUrl": "https://example.org/docs",
    "capabilities": {
        "streaming": false,
        "pushNotifications": false,
        "stateTransitionHistory": false
    },
    "defaultInputModes": [
        "text"
    ],
    "defaultOutputModes": [
        "text"
    ],
    "skills": [
        {
            "id": "echo",
            "name": "Echo Skill",
            "description": "Echoes back the user's message",
            "tags": [
                "echo",
                "respond"
            ],
            "examples": [
                "Echo: Hello World"
            ],
            "inputModes": [
                "text"
            ],
            "outputModes": [
                "text"
            ]
        }
    ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the A2A can be tested:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make a2a-local
&lt;span class="go"&gt;Running local A2A echo test...
🚀 Testing A2A Echo Skill at http://localhost:8080
💬 Sending message: 'Hello from the test program!'
✅ Received echo: 'Echo: Hello from the test program!'
🌟 Success! The echo skill is working correctly.
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  So What Just Happened?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Rust A2A&lt;/strong&gt; agent was started locally. This agent provided a standard A2A agent card. Then, test scripts performed a A2A skills call against the locally running Rust A2A server. Because the A2A server in Rust provides standard tools- the A2A inspector could connect. The actual implementation language of the A2A code does not matter — as long as standard services are exposed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deploy to AWS Lightsail
&lt;/h4&gt;

&lt;p&gt;Once the Agent has been validated and tested locally- the solution can be deployed to AWS Lightsail. Run the deploy target in the Makefile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws&lt;span class="nv"&gt;$ &lt;/span&gt;make deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the build is done — you can check the status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make status
&lt;span class="go"&gt;Checking AWS Lightsail service status for a2a-lightsail-rust-aws...
--------------------------------------------
| GetContainerServices |
+-------------+--------+-----------+-------+
| Deployment | Power | State | URL |
+-------------+--------+-----------+-------+
| ACTIVE | nano | RUNNING | None |
+-------------+--------+-----------+-------+
--- Service Status ---
Local (8080): ONLINE (A2A Rust Agent)
Remote (Cloud): ONLINE (A2A Rust Agent) - [https://a2a-lightsail-rust-aws.6wpv8vensby5c.us-east-1.cs.amazonlightsail.com](https://a2a-lightsail-rust-aws.6wpv8vensby5c.us-east-1.cs.amazonlightsail.com)
&lt;/span&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and get the endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make endpoint
&lt;span class="go"&gt;https://a2a-lightsail-rust-aws.6wpv8vensby5c.us-east-1.cs.amazonlightsail.com/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verify the Cloud Run Service
&lt;/h4&gt;

&lt;p&gt;The Rust A2A service will be visible from the Lightsail console:&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%2F4wowy8nvdi9gn79nuszr.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%2F4wowy8nvdi9gn79nuszr.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing AWS Deployment
&lt;/h4&gt;

&lt;p&gt;The Makefile has several tools for validating the remote A2A server.&lt;/p&gt;

&lt;p&gt;First — you can get the remote Agent card:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make card-remote
&lt;span class="go"&gt;Fetching remote agent card...
{
    "name": "A2A Rust Agent",
    "description": "An A2A agent using the a2a-rs crate",
    "url": "http://0.0.0.0:8080",
    "provider": {
        "organization": "Example Organization",
        "url": "https://example.org"
    },
    "version": "1.0.0",
    "protocolVersion": "0.3.0",
    "preferredTransport": "JSONRPC",
    "documentationUrl": "https://example.org/docs",
    "capabilities": {
        "streaming": false,
        "pushNotifications": false,
        "stateTransitionHistory": false
    },
    "defaultInputModes": [
        "text"
    ],
    "defaultOutputModes": [
        "text"
    ],
    "skills": [
        {
            "id": "echo",
            "name": "Echo Skill",
            "description": "Echoes back the user's message",
            "tags": [
                "echo",
                "respond"
            ],
            "examples": [
                "Echo: Hello World"
            ],
            "inputModes": [
                "text"
            ],
            "outputModes": [
                "text"
            ]
        }
    ]
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and run a basic test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/a2a-hello-world/poly-lightsail-rust-aws$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make a2a-remote
&lt;span class="go"&gt;Running remote A2A echo test...
🚀 Testing A2A Echo Skill at https://a2a-lightsail-rust-aws.6wpv8vensby5c.us-east-1.cs.amazonlightsail.com
💬 Sending message: 'Hello from the test program!'
✅ Received echo: 'Echo: Hello from the test program!'
🌟 Success! The echo skill is working correctly.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Crates.io
&lt;/h4&gt;

&lt;p&gt;The full package is available on GitHub and crates.io:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crates.io/crates/a2a-server-rust-lightsail/0.2.0" rel="noopener noreferrer"&gt;crates.io: Rust Package Registry&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The package details are here:&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%2Fko8ll9p0kr3pa1xpqt6o.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%2Fko8ll9p0kr3pa1xpqt6o.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;A complete A2A server was built using Rust. Basic validation was done with the A2A inspector. Next, test scripts were built that directly called the Rust A2A server. Finally, the complete solution was deployed to Amazon Lightsail.&lt;/p&gt;

</description>
      <category>awslightsail</category>
      <category>aws</category>
      <category>ferristhecrab</category>
      <category>a2aprotocol</category>
    </item>
    <item>
      <title>Local MCP Development with Python and Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 21 May 2026 15:35:20 +0000</pubDate>
      <link>https://dev.to/gde/local-mcp-development-with-python-and-antigravity-cli-3ojg</link>
      <guid>https://dev.to/gde/local-mcp-development-with-python-and-antigravity-cli-3ojg</guid>
      <description>&lt;p&gt;This article re-visits and updates an existing deployment originally built with Gemini CLI and re-tools the setup to leverage the new Antigravity CLI to build Model Context Protocol (MCP) AI applications in Python with a local development environment.&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%2F99qwbu2leaheszw4aq36.jpeg" 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%2F99qwbu2leaheszw4aq36.jpeg" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Is this Deja Vu?
&lt;/h4&gt;

&lt;p&gt;There is no spoon.&lt;/p&gt;

&lt;p&gt;This article updates an earlier deployment built out with Gemini CLI and re-tools the entire setup for Antigravity CLI.&lt;/p&gt;

&lt;p&gt;The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xbill999.medium.com/local-mcp-development-with-python-and-gemini-cli-bfa9cea8bd1b" rel="noopener noreferrer"&gt;Local MCP Development with Python and Gemini CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Aren’t There a Quadrillion Python MCP Demos?
&lt;/h4&gt;

&lt;p&gt;Yes there are.&lt;/p&gt;

&lt;p&gt;Python has traditionally been the main coding language for ML and AI tools. The goal of this article is to provide a minimal viable basic working MCP stdio server that can be run locally without any unneeded extra code or extensions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI is the follow-on successor to Gemini CLI- the terminal driven, agent assisted coding tool.&lt;/p&gt;

&lt;p&gt;Full details on installing Antigravity CLI are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/getting-started-with-antigravity-cli-26c5da90951f" rel="noopener noreferrer"&gt;Getting Started with Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing the Antigravity CLI Environment
&lt;/h4&gt;

&lt;p&gt;Once you have all the tools in place- you can test the startup of Antigravity CLI.&lt;/p&gt;

&lt;p&gt;You will need to authenticate with a Google Cloud Project or your Google Account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start the interface:&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%2F6mvg4a6tnyt4j8666lb1.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%2F6mvg4a6tnyt4j8666lb1.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Python MCP Documentation
&lt;/h4&gt;

&lt;p&gt;The official GitHub Repo provides samples and documentation for getting started:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;GitHub - modelcontextprotocol/python-sdk: The official Python SDK for Model Context Protocol servers and clients&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most common MCP Python deployment path uses the FASTMCP library:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gofastmcp.com/getting-started/welcome" rel="noopener noreferrer"&gt;Welcome to FastMCP - FastMCP&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Where do I start?
&lt;/h4&gt;

&lt;p&gt;The strategy for starting MCP development is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the basic development environment is setup with the required system variables, and a working Antigravity CLI configuration.&lt;/p&gt;

&lt;p&gt;Then, a minimal Hello World Style Python MCP Server is built with stdio transport. This server is validated with Antigravity CLI in the local environment.&lt;/p&gt;

&lt;p&gt;This setup validates the connection from Antigravity CLI to the local process via MCP. The MCP client (Antigravity CLI) and the Python MCP server both run in the same local environment.&lt;/p&gt;

&lt;p&gt;Next- the basic MCP server is extended with Antigravity CLI to add several new tools in standard Python code.&lt;/p&gt;

&lt;h4&gt;
  
  
  Setup the Basic Environment
&lt;/h4&gt;

&lt;p&gt;At this point you should have a working Python interpreter and a working Antigravity CLI installation. The next step is to clone the GitHub samples repository with support scripts:&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;cd&lt;/span&gt; ~
git clone https://github.com/xbill9/gemini-cli-codeassist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run &lt;strong&gt;init.sh&lt;/strong&gt; from the cloned directory.&lt;/p&gt;

&lt;p&gt;The script will attempt to determine your shell environment and set the correct variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;gemini-cli-codeassist
&lt;span class="nb"&gt;source &lt;/span&gt;init.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your session times out or you need to re-authenticate- you can run the &lt;strong&gt;set_env.sh&lt;/strong&gt; script to reset your environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;gemini-cli-codeassist
&lt;span class="nb"&gt;source &lt;/span&gt;set_env.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Variables like PROJECT_ID need to be setup for use in the various build scripts- so the set_env script can be used to reset the environment if you time-out.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hello World with STDIO Transport
&lt;/h4&gt;

&lt;p&gt;One of the key features that the standard MCP libraries provide is abstracting various transport methods.&lt;/p&gt;

&lt;p&gt;The high level MCP tool implementation is the same no matter what low level transport channel/method that the MCP Client uses to connect to a MCP Server.&lt;/p&gt;

&lt;p&gt;The simplest transport that the SDK supports is the stdio (stdio/stdout) transport — which connects a locally running process. Both the MCP client and MCP Server must be running in the same environment.&lt;/p&gt;

&lt;p&gt;The connection over stdio will look similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; __main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Explicitly use stdio transport
&lt;/span&gt;    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stdio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Running the Python Code
&lt;/h4&gt;

&lt;p&gt;First- switch the directory with the Python MCP sample code:&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;cd&lt;/span&gt; ~/gemini-cli-codeassist/mcp-stdio-python-agy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the release version on the local system:&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;cd&lt;/span&gt; ~/gemini-cli-codeassist/mcp-stdio-python-agy
make release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can validate the final result by checking the messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requirement already satisfied: cryptography&amp;gt;=3.4.0 in /home/xbill/.local/lib/python3.13/site-packages (from pyjwt[crypto]&amp;gt;=2.10.1-&amp;gt;mcp-&amp;gt;-r requirements.txt (line 1)) (48.0.0)
Requirement already satisfied: cffi&amp;gt;=2.0.0 in /home/xbill/.local/lib/python3.13/site-packages (from cryptography&amp;gt;=3.4.0-&amp;gt;pyjwt[crypto]&amp;gt;=2.10.1-&amp;gt;mcp-&amp;gt;-r requirements.txt (line 1)) (2.0.0)
Requirement already satisfied: pycparser in /home/xbill/.local/lib/python3.13/site-packages (from cffi&amp;gt;=2.0.0-&amp;gt;cryptography&amp;gt;=3.4.0-&amp;gt;pyjwt[crypto]&amp;gt;=2.10.1-&amp;gt;mcp-&amp;gt;-r requirements.txt (line 1)) (3.0)
Requirement already satisfied: click&amp;gt;=7.0 in /home/xbill/.pyenv/versions/3.13.13/lib/python3.13/site-packages (from uvicorn&amp;gt;=0.31.1-&amp;gt;mcp-&amp;gt;-r requirements.txt (line 1)) (8.1.8)
xbill@penguin:~/gemini-cli-codeassist/mcp-stdio-python-agy$ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Antigravity CLI settings.json
&lt;/h4&gt;

&lt;p&gt;Settings.json is where MCP servers are setup in Gemini CLI. Antigravity CLI moves the MCP configuration to a seperate file: mcp_config.json.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xbill@penguin:~/gemini-cli-codeassist/mcp-stdio-python-agy$ cd .agents
xbill@penguin:~/gemini-cli-codeassist/mcp-stdio-python-agy/.agents$ d
total 4
-rw-r--r-- 1 xbill xbill 184 May 21 10:03 mcp_config.json
drwxr-xr-x 1 xbill xbill 30 May 21 10:03 .
drwxr-xr-x 1 xbill xbill 242 May 21 10:03 ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file contains the configuration for connecting to external tools and services:&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;"hello-stdio-python"&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;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/gemini-cli-codeassist/mcp-stdio-python-agy/main.py"&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;h4&gt;
  
  
  Validation with Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Finally- agy CLI is restarted and the MCP connection over stdio to the Python Code is validated, The full session will start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/mcp list
&lt;span class="go"&gt;────────────────────────────────────────────────────────────────────────────────────────────────────
MCP Servers

Plugins (~/.gemini/antigravity-cli/plugins)
&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;✓ hello-stdio-python Tools: greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you can then connect to the MCP Server over stdio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;greet Two Snakes!
&lt;span class="go"&gt;
● ListDir(/home/xbill/.gemini/antigravity-cli/mcp/hello-stdio-python)
● Read(/home/xbill/.gemini/antigrav...ello-stdio-python/greet.json)
● hello-stdio-python/greet(Calling greet tool via MCP) (ctrl+o to expand)

  Hello! I've invoked the greet tool from the hello-stdio-python server with the parameter   
  "Two Snakes!" , and it responded with:

  │ Two Snakes!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Extending the Python MCP Server with Antigravity CLI
&lt;/h4&gt;

&lt;p&gt;Now that the basic MCP functionality has been tested and verified with Antigravity CLI- the Python server code can be extended with new MCP tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;with @main.py add 2 new MCP tools - one that returns the current system &lt;span class="nb"&gt;time &lt;/span&gt;and the other
&lt;span class="go"&gt;  returns the current system info like OS,
    memory, etc

● ListDir(/home/xbill/gemini-cli-codeassist/mcp-stdio-python-agy)
● Read(/home/xbill/gemini-cli-codea...mcp-stdio-python-agy/main.py)
● Read(/home/xbill/gemini-cli-codea...-python-agy/requirements.txt) (ctrl+o to expand)
▸ Thought for 2s, 977 tokens
  Clarifying Instructions

● Read(/home/xbill/gemini-cli-codea...cp-stdio-python-agy/Makefile)
● Read(/home/xbill/gemini-cli-codea...dio-python-agy/test_greet.py)
● Read(/home/xbill/gemini-cli-codea...o-python-agy/test_logging.py) (ctrl+o to expand)

▸ Thought for 2s, 1.4k tokens
  Considering Time Return Formats
● ListPermissions(You have read and write access to the following workspace(s)...) (ctrl+o to
expand)

▸ Thought for 1s, 1.5k tokens
  Proposing the Execution

● Edit(/home/xbill/gemini-cli-codea...mcp-stdio-python-agy/main.py) (ctrl+o to expand)

▸ Thought for 2s, 589 tokens
  Initiating Unit Tests

● Edit(/home/xbill/gemini-cli-codea...dio-python-agy/test_greet.py)
● Bash(make test) (ctrl+o to expand)

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

&lt;/div&gt;



&lt;p&gt;Restart Antigravity CLI and check for the new MCP tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Servers

Plugins (~/.gemini/antigravity-cli/plugins)
&amp;gt; ✓ hello-stdio-python Tools: greet, get_system_time, get_system_info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the current time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;get_system_time
&lt;span class="go"&gt;
● hello-stdio-python/get_system_time(Executing get_system_time via MCP) (ctrl+o to expand)

  I have successfully invoked the get_system_time tool from the local MCP server, and it
  returned the following current system times:

    Local Time: 2026-05-21T10:15:38.715899 (2026-05-21 10:15:38)
    UTC Time: 2026-05-21T15:15:38.715912+00:00

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

&lt;/div&gt;



&lt;p&gt;And system Info:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;get_system_info
&lt;span class="go"&gt;
● hello-stdio-python/get_system_info(Executing get_system_info via MCP) (ctrl+o to expand)

  I have successfully invoked the get_system_info tool from the local MCP server. Here is the  
  current system information retrieved:

    Operating System: Linux
    Release/Kernel: 6.6.99-09128-g14e87a8a9b71
&lt;/span&gt;&lt;span class="gp"&gt;    Version: #&lt;/span&gt;1 SMP PREEMPT_DYNAMIC Fri, 6 Feb 2026 20:45:19 &lt;span class="nt"&gt;-0800&lt;/span&gt;
&lt;span class="go"&gt;    Architecture: x86_64
    CPU Cores: 12
    Memory Info: Total: 6530980 kB, Free: 332012 kB, Available: 1558252 kB                   
    Python Version: 3.13.13

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

&lt;/div&gt;



&lt;p&gt;The information from the MCP tool execution comes back into the current context. You can use the information returned from the tools along with the underlying Gemini Models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; can i play Cyberpunk 2077 on this machine

● WebSearch(Cyberpunk 2077 minimum system requirements) (ctrl+o to expand)

▸ Thought for 2s, 494 tokens
  Assessing Game Requirements
  Based on the system information retrieved, no, you cannot play Cyberpunk 2077 on this machine  
  in its current state.                                                                          

  Here is a detailed breakdown of why, comparing your system specs to the game's official minimum
  requirements (after Update 2.0):                                                               

  ### 1. RAM (Critical Bottleneck) ❌                                                            

  • Minimum Requirement: 12 GB RAM                                                               
  • Your Machine: ~6.2 GB RAM ( Total: 6530980 kB )                                              
  • Verdict: This is a severe bottleneck. With only 6.2 GB of RAM, the game will either fail to  
  launch, crash constantly, or suffer from unplayable stuttering as your system runs out of      
  memory.                                                                                        

  ### 2. Operating System ⚠️                                                                      

  • Minimum Requirement: 64-bit Windows 10/11                                                    
  • Your Machine: Linux (Kernel 6.6)                                                             
  • Verdict: While Cyberpunk 2077 does not have a native Linux version, this is actually not a   
  dealbreaker. The game has a "Platinum" rating on ProtonDB, meaning it runs beautifully on Linux
  via Steam Proton (compatibility layer). However, the hardware limits below still apply.        

  ### 3. CPU Cores

  • Minimum Requirement: Intel Core i7-6700 (4 cores) or AMD Ryzen 5 1600 (6 cores)
  • Your Machine: 12 Cores
  • Verdict: Excellent. Your CPU core count is more than capable of handling the game.           

  ### 4. Graphics Card &amp;amp; Storage (Unknown) ❓

  • Minimum Requirement: Dedicated GPU with at least 6 GB of VRAM (e.g., GeForce GTX 1060 6GB /  
  Radeon RX 580) and 70 GB SSD (an SSD is strictly required).
  • Our system info tools do not expose your GPU model or storage type, but you would need to    
  meet these specifications as well.
  ──────
  ### Conclusion

  Even though your CPU is powerful and Linux compatibility is excellent via Proton, the 6.2 GB   
  RAM limit will prevent you from playing the game. You would need to upgrade the system's RAM to
  at least 12 GB (ideally 16 GB) and ensure you have a gaming-grade dedicated graphics card.     

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

&lt;/div&gt;



&lt;p&gt;But you can still play Doom!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;can I play Classic Doom on this machine?
&lt;span class="go"&gt;
● WebSearch(classic doom 1993 system requirements) (ctrl+o to expand)

  Absolutely, 100% yes! In fact, your machine could easily run thousands of instances of Classic 
  Doom (1993) at the exact same time.                                                            

  Here is how your current system compares to the original 1993 requirements:

   Component │ Classic Doom (│ Your Machine │ How Much Better Is It?
  ───────────────┼───────────────┼────────────────────┼──────────────────────────────────────────
   Operating Syst│ MS-DOS 5.0 │ Linux (Kernel 6.6) │ Native Linux source ports (like Chocolate
   Processor (CPU│ Intel 386DX (3│ 12 CPU Cores (Multi│ Thousands of times faster with massive mu
   Memory (RAM) │ 4 MB (Megabyte│ 6,530 MB (6.2 GB) │ Over 1,600 times more RAM than required!
   Storage │ 12 MB │ Gigabytes available│ Plenty of space to store every mod ever c

&lt;/span&gt;&lt;span class="gp"&gt;  #&lt;/span&gt;&lt;span class="c"&gt;## How to play it on your Linux machine right now:&lt;/span&gt;
&lt;span class="go"&gt;
  Because Doom's engine code was open-sourced in 1997, Linux has excellent native support through
  modern "source ports" which run the game flawlessly with widescreen and high-resolution support.

  You can install a lightweight classic source port like Chocolate Doom directly via your package
  manager:

&lt;/span&gt;&lt;span class="gp"&gt;    #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;On Debian/Ubuntu-based systems
&lt;span class="go"&gt;    sudo apt install chocolate-doom

  Then, you just need a game file (like the free shareware DOOM1.WAD or a retail DOOM.WAD     
  from Steam/GOG) to start slaying demons!

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  One Last Code Review
&lt;/h4&gt;

&lt;p&gt;Lets see how good of a Python coder I am -&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; code review this Python MCP project

● Read(/home/xbill/gemini-cli-codea...p-stdio-python-agy/README.md)
● Bash(git status)
● Bash(find . -maxdepth 2) (ctrl+o to expand)

▸ Thought for 4s, 732 tokens
  Investigating File Absence
  Here is a comprehensive code review of the Python MCP (Model Context Protocol) project.        

  Overall, the project is exceptionally well-structured, lightweight, and employs industry best  
  practices for MCP stdio-based servers.                                                         
  ──────                                                                                         
   📊 Project-Wide Code Review                                                                   

  ## 1. Architectural Highlights &amp;amp; Best Practices                                                

  ### A. Protocol Stream Safety (Logging to Stderr)                                              

  • The Design: MCP servers communicating via the stdio transport use stdout exclusively for 
  JSON-RPC protocol messages. Any standard print statements or unstructured logs written to      
  stdout will corrupt the protocol stream and cause client-side connection failures.            
  • The Implementation: In main.py, the root logger is configured to send all logs to sys.
  stderr using the structured JsonFormatter from pythonjsonlogger .                          
  • Verdict: Excellent. This guarantees that all logs are safe, structured (JSON format), and    
  completely isolated from the MCP communication channel.                                        

  ### B. Developer Experience (DX)                                                               

  • The Makefile provides full life-cycle automation for installation, manual execution,   
  testing, linting ( flake8 ), formatting ( black ), and type checking ( mypy ).                 
  • The codebase maintains 100% strict compliance with PEP8/flake8 (79-character line limits) and
  passes static type checks under mypy without any warning or exception suppression.           
  ──────                                                                                         
  ## 2. File-by-File Detailed Review                                                             

  ### 📁 main.py                                                                          

  • Initialization: FastMCP simplifies server setup beautifully:                               
    mcp = FastMCP("hello-world-server")                                                          

  • Exposing Tools: The @mcp.tool() decorator is perfectly utilized. Docstrings are parsed     
  automatically by FastMCP and transmitted to MCP clients as the official description of the   
  tool:                                                                                          
    @mcp.tool()                                                                                  
    def get_system_time() -&amp;gt; str:                                                                
        """                                                                                      
        Get the current system time in ISO-8601 format and human-readable format.                
        """                                                                                      

  • Modern Python Features: The get_system_time tool avoids the deprecated utcnow() method,  
  utilizing standard timezone-aware UTC retrieval:                                               
    now_utc = datetime.now(timezone.utc)                                                         

  • Platform Portability: get_system_info gracefully detects whether it's running on Linux     
  (reading /proc/meminfo directly) and falls back to POSIX sysconf APIs if running on          
  macOS/BSD/other UNIX variants, ensuring maximum reliability.                                   
  ──────                                                                                         
  ### 📁 test_logging.py and test_greet.py                                                       

  • Logging Verification: test_logging.py employs a custom caplog_stream Pytest fixture that 
  intercepts root logging handlers to assert that debug, info, and error outputs generate valid  
  JSON strings with correct levels. This is highly robust!                                       
  • Input Robustness: test_greet.py thoroughly verifies greet behavior on empty strings and  
  special characters ( !@#$%^&amp;amp;*() ).                                                             
  • New Tools Coverage: The new system tools are fully covered, verifying output structures and  
  ensuring the expected system/time labels are present.                                          
  ──────                                                                                         
  ## 3. Areas for Improvement &amp;amp; Recommendations                                                  

  While the project is in a production-ready state, addressing the following points will make the
  project even more robust:                                                                      

  ### Recommendation 1: Update README Virtual Environment Instructions                           

  • File: README.md                                                                         
  • Issue: The README still suggests setting up a local .venv under # Installation . However, 
  as documented in your GEMINI.md, direct virtual environment setups can conflict with the  
  way MCP client launchers handle stdio Python subprocesses.                                     
  • Fix: Add a note in README.md warning developers that if the server is executed via an MCP  
  client (such as Claude Desktop), they must ensure their client configuration points explicitly 
  to the python executable inside that virtual environment (e.g., /path/to/project/.            
  venv/bin/python ), rather than just a global python command.                                 

  ### Recommendation 2: Avoid Swallowing Key Failures in get_system_info                        

  • File: main.py                                                                         
  • Issue: In get_system_info , the else block (POSIX fallback) catches all exceptions using a
  bare except Exception: pass . If os.sysconf fails or is missing, mem_details remains      
  "Memory information not available." without any traceback or warning captured in the logs.    
  • Fix: Log the exception details at DEBUG or WARNING level so that issues on unsupported   
  systems can be diagnosed:                                                                      
    except Exception as e:
        logger.debug(f"Failed to query POSIX sysconf memory: {str(e)}")

  ### Recommendation 3: Explicitly Set Pytest Rootdir

  • File: Makefile
  • Issue: Running pytest without a dedicated pytest.ini config file means it defaults to    
  scanning the current working directory recursively, which might include .venv files or parent
  folders if executed from outside.
  • Fix: Create a minimal pytest.ini file in the root of the project to lock down test         
  detection parameters:
    [pytest]
    testpaths = .
    python_files = test_*.py

  ──────
  ### Final Verdict

  Score: 9.8 / 10
  The project is extremely clean, PEP8 compliant, well-tested, and demonstrates an outstanding   
  understanding of the Model Context Protocol's stdio transport constraints.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Summary
&lt;/h4&gt;

&lt;p&gt;The strategy for using Python for MCP development with Antigravity CLI was validated with an incremental step by step approach.&lt;/p&gt;

&lt;p&gt;A minimal stdio transport MCP Server was started from Python source code and validated with Antigravity CLI running as a MCP client in the same local environment.&lt;/p&gt;

&lt;p&gt;Antigravity CLI was then used to extend the sample Python code with several MCP tools and use these tools inside the context for the underlying LLM.&lt;/p&gt;

&lt;p&gt;This approach can be extended to more complex deployments using other MCP transports and Cloud based options.&lt;/p&gt;

</description>
      <category>mcpserver</category>
      <category>python</category>
      <category>antigravitycli</category>
      <category>antigravity</category>
    </item>
  </channel>
</rss>
