<?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.us-east-2.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>Debugging Deployments with Gemma 4B, TPU v6e-4, MCP, and Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Tue, 07 Jul 2026 17:12:47 +0000</pubDate>
      <link>https://dev.to/gde/debugging-deployments-with-gemma-4b-tpu-v6e-4-mcp-and-antigravity-cli-1l82</link>
      <guid>https://dev.to/gde/debugging-deployments-with-gemma-4b-tpu-v6e-4-mcp-and-antigravity-cli-1l82</guid>
      <description>&lt;p&gt;This article provides a step by step debugging guide for deploying Gemma 4 to a Google Cloud TPU 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ljlv92emy3xvocukydy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ljlv92emy3xvocukydy.jpeg" width="800" height="800"&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 TPU. 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;&lt;span class="nb"&gt;cd &lt;/span&gt;tpu-4B-v6e4-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;tpu-4B-v6e4-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 shell"&gt;&lt;code&gt;xbill@penguin:~/gemma4-tips/tpu-12B-v6e4-devops-agent&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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 shell"&gt;&lt;code&gt;xbill@penguin:~/gemma4-tips/tpu-4B-v6e4-devops-agent&lt;span class="nv"&gt;$ &lt;/span&gt;make lint
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
All checks passed!
ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
6 files already formatted
mypy &lt;span class="nb"&gt;.&lt;/span&gt;
Success: no issues found &lt;span class="k"&gt;in &lt;/span&gt;6 &lt;span class="nb"&gt;source &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"tpu-12B-v6e4-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/tpu-4B-v6e4-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_REGION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"southamerica-east1"&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_ZONE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"southamerica-east1-c"&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-4B-it"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ACCELERATOR_TYPE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v6e-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"TENSOR_PARALLEL_SIZE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4"&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

Plugins (~/.gemini/antigravity-cli/plugins)
&amp;gt; ✓ google-dev-knowledge Tools: search_documents, answer_query, get_documents
   ✓ tpu-4B-v6e4-devops-agent Tools: verify_model_health, save_hf_token, get_vllm_deployment_config,
                                get_vllm_tpu_deployment_config, destroy_queued_resource, +22 more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; make help&lt;/span&gt;
&lt;span class="p"&gt;
43.&lt;/span&gt;1k in | 604 out | 527 thinking
● Bash(make help) (ctrl+o to expand)

  Here is the output from running make help :
    Available MCP tools in server.py:&lt;span class="sb"&gt;

      get_vllm_deployment_config - Generates the gcloud command for a single-host TPU v6e vLLM deployment.
      get_vllm_tpu_deployment_config - Generates a GKE manifest for a TPU v6e vLLM deployment.
      list_queued_resources - Lists all Queued Resources in a specific zone.
      describe_queued_resource - Provides detailed information about a specific Queued Resource.
      get_reservation_status - Checks the lifecycle state and expiry time of a Queued Resource.
      check_tpu_availability - Simple check to see if a Queued Resource has reached ACTIVE state.
      estimate_deployment_cost - Estimates the cost of a TPU deployment.
      get_system_status - Status dashboard prioritizing Queued Resource states in us-central1-a.
      orchestrate_gemma4_stack - Seamless turnkey deployment of the Gemma 4 stack.
      get_vllm_endpoint - Discovery tool to verify connectivity and return the active vLLM service URL.
      deploy_queued_vllm - Deploys vLLM strictly using Queued Resources for Flex-start allocation.
      create_tpu_queued_resource - Creates a TPU Queued Resource (Flex-start) with the specified configuration.
      check_tpu_utilization - Monitors Tensor Core and HBM pressure on the TPU VM.
      get_vllm_metrics - Fetches real-time Prometheus metrics from the active vLLM service.
      validate_gemma4_deployment - Performs a comprehensive sanity check on the Gemma 4 deployment.
      query_queued_gemma4 - Queries the model hosted on the active Queued Resource.
      run_vllm_benchmark - Runs vLLM's internal benchmark tool inside the container on the TPU VM.
      run_vllm_internal_benchmark - Runs vLLM's internal benchmark tool inside the container on the TPU VM.
      run_external_load_test - Performs an external load test against the active vLLM endpoint.
      get_gemma4_full_report - Generates a deep technical report of the Gemma 4 deployment.
      fetch_tpu_vm_logs - Fetches specific logs from a TPU VM.
      grep_tpu_logs - Searches for a pattern in both startup and container logs on the TPU VM.
      destroy_queued_resource - Safely deletes a Queued Resource and its associated node.
      fetch_queued_node_logs - Fetches logs by identifying the node linked to a Queued Resource.
      save_hf_token - Saves HF token to GCP Secret Manager for the Queued Resource deployer.
      analyze_cloud_logging - Searches Cloud Logging for TPU-related errors and lifecycle events.
      verify_model_health - Performs a deep health check by querying the model with a simple prompt.
      query_vllm_with_metrics - Queries the model and provides streaming-based performance metrics.
      get_vllm_model_stats - Aggregates model-specific statistics from the vLLM server.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Getting Started with Gemma 4 on TPU
&lt;/h4&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;p&gt;The Gemma 12B model was just released:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/introducing-gemma-4-12b/" rel="noopener noreferrer"&gt;Introducing Gemma 4 12B: a unified, encoder-free multimodal model&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Find and Start the TPU
&lt;/h4&gt;

&lt;p&gt;First check for available zones with quota:&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="o"&gt;&amp;gt;&lt;/span&gt; get_zones_with_available_quota
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- a zone with availability and Quota as found!&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="gt"&gt;&amp;gt; status&lt;/span&gt;

  I will query the system SRE dashboard using the get_system_status tool.

● tpu-4B-v6e4-devops-agent/get_system_status(Get system status) (ctrl+o to expand)

  The system status remains healthy and fully online:

  ### 🌀 Current SRE Dashboard Status
  • vLLM Health: 🟢 Online
  • Active Endpoint: http://34.32.229.195:8000 
  • Active Zone: europe-west4-a 

  ### 📋 Resource Allocation
  • Queued Resource: vllm-gemma4-qr (State: ACTIVE )
  • TPU Accelerator: v6e-4 (4 TPU v6e cores, topology 2x2 )
  • Served Model: google/gemma-4-E4B-it (Hugging Face ID)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Review the Memory Layout
&lt;/h4&gt;

&lt;p&gt;The MCP server tools are used to review the model:&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="gt"&gt;&amp;gt; what is the memory layout of the model&lt;/span&gt;

  Based on the vLLM logs from the TPU VM node, here is the detailed memory layout and allocation of the  
  google/gemma-4-E4B-it model on the TPU v6e-4 cluster (4 chips, total 125 GiB HBM):

  ### 💾 Memory Budget Overview (HBM)

   Component | Per Chip (GiB) | Total Cluster (4 … | Description
  --------------------|----------------|--------------------|--------------------------------------------------------
   HBM Limit | 31.25 | 124.98 | Total physical High Bandwidth Memory
   Model Weights | 7.66 | 30.62 | Model weights loaded in bfloat16 (Checkpoint: 14.89
                      | | | GiB )
   KV Cache &amp;amp; Runtime | 21.11 | 84.46 | Memory reserved for JAX/vLLM KV Cache and XLA
                      | | | execution graphs
   Total Used Memory | 28.77 | 115.08 | Total reserved memory at runtime
   Free Headroom | 2.48 | 9.90 | Available headroom for execution workspace
  ──────
  ### 🔑 KV Cache Layout &amp;amp; Shape

  • Dtype: fp8_e5m2 (automatically enabled on TPU v6e to optimize throughput and save capacity).
  • Total KV Cache Capacity: 789,760 tokens.
  • Max Request Concurrency: 12.05x (assuming a full context size of 65,536 tokens per request).
  • Physical Layout:
      • Layers: 24 layers.
      • Cache Blocks: 6170 blocks (block size: 128 tokens).
      • Attention Shape: (num_blocks, (128, 4, 2, 256)) 

  ──────
  ### 🌐 Sharding &amp;amp; Parallelism Structure

  • Tensor Parallelism (TP): Size 4 (sharded across all 4 TPU chips using JAX Mesh data: 1, model: 4 ).
  • Attention Sharding Details: Since the model has 2 Key-Value heads ( num_kv_heads=2 ), which is not divisible by
  the TP size of 4, vLLM shards K/V projections on the head_dim dimension rather than the heads themselves to avoid
  TP partition alignment conflicts.
&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 — 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 markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; verify_model_health&lt;/span&gt;

  I will trigger the verify_model_health tool to run the health check against the active TPU endpoint.

● tpu-4B-v6e4-devops-agent/verify_model_health(Verify model health) (ctrl+o to expand)

  The model health check passed successfully:

  • Status: ✅ PASSED
  • Response Snippet: "Hello! Yes, I am working. I am..." 
  • Latency: 0.26 seconds (down from 0.56s during the warm-up run due to hot JIT cache compilation)
&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 markdown"&gt;&lt;code&gt;● tpu-4B-v6e4-devops-agent/get_model_details(Get model details) (ctrl+o to expand)

  The get_active_models tool is specific to Ollama backend environments. For this running vLLM stack on TPU, the
  active model details are:

  ### 🧩 Active Model Configurations (vLLM)

  • Model ID: google/gemma-4-E4B-it 
  • Max Model Sequence Length: 65,536 tokens
  • Serving Engine Status: Healthy ✅
  • vLLM Engine Version: 0.23.1rc1.dev551+g5274c1181 
  • Process Resident Memory: ~2.70 GiB (on host VM process level)
&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 markdown"&gt;&lt;code&gt;
● tpu-4B-v6e4-devops-agent/get_help(Get server help) (ctrl+o to expand)

  Here are the active system configuration and runtime details for the TPU environment:

  ### ⚙️ GCP TPU VM Configuration

  • Instance Name: vllm-gemma4-qr-node 
  • Zone: europe-west4-a 
  • Accelerator Type: v6e-4 (4 TPU v6e cores, topology 2x2 )
  • Status: READY 
  • Health: HEALTHY 
  • IP Configurations:
      • External IP: 34.32.229.195 
      • Internal IP: 10.164.0.4 
  • TPU API version: V2_ALPHA1 (Runtime: v2-alpha-tpuv6e )

  ### 🧠 Model Serving stack (vLLM)

  • Engine Status: 🟢 Online
  • Active Endpoint: http://34.32.229.195:8000 
  • Served Model: google/gemma-4-E4B-it 
  • Serving Engine TP Size: 4 (Tensor Parallelism)
  • vLLM Engine Version: 0.23.1rc1.dev551+g5274c1181 

  ### 📋 SRE Active Agent Environment Details

  • GCP Project ID: aisprint-491218 
  • Target GCP Region: europe-west4 
  • Target GCP Zone: europe-west4-a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check the Cloud TPU
&lt;/h4&gt;

&lt;p&gt;Once Deployed — the TPU is on the Google Cloud 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz0tw7qggek3phj8oyek.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz0tw7qggek3phj8oyek.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 markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; get_metrics&lt;/span&gt;

  I will run the get_metrics tool to retrieve raw Prometheus metrics directly from the vLLM engine.

● tpu-4B-v6e4-devops-agent/get_metrics(Get engine metrics) (ctrl+o to expand)

  I will view the saved metrics file to extract the key metrics of interest.

● Read(/home/xbill/.gemini/antigravity-cli/brain/d7...732e8/.system_generated/steps/381/output.txt) (ctrl+o to expand)
  Here is a summary of the key SRE metrics fetched from the active vLLM service ( /metrics ):

  ### 📊 Engine Queue &amp;amp; Concurrency

  • Running Requests ( vllm:num_requests_running ): 0 
  • Waiting Requests ( vllm:num_requests_waiting ): 0 
  • KV Cache Usage ( vllm:kv_cache_usage_perc ): 0.0 (0% utilized)

  ### 📈 Token &amp;amp; Request Throughput

  • Prefill/Prompt Tokens Processed ( vllm:prompt_tokens_total ): 32 tokens
  • Generation/Output Tokens Processed ( vllm:generation_tokens_total ): 20 tokens
  • Completed Requests ( vllm:request_success_total ): 2 requests completed

  ### ⏱️ Latency &amp;amp; Performance Statistics

  • Time to First Token (TTFT): ~158 ms average per request ( vllm:time_to_first_token_seconds_sum / request_count )
  • Inter-Token Latency: ~5.5 ms per token ( vllm:inter_token_latency_seconds_sum / generation_tokens_total or ~180
  tokens/sec decoding throughput)
  • End-to-End Latency: ~207 ms average per request ( vllm:e2e_request_latency_seconds_sum / request_count )

  ### 🖥️ Resource Utilization

  • VM Process Resident Memory: ~2.70 GiB ( 2,701,803,520 bytes)
  • Engine Awake State: Awake (value: 1.0 )
&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 markdown"&gt;&lt;code&gt;&lt;span class="gt"&gt;&amp;gt; query_gemma4_with_stats what is Gemma?&lt;/span&gt;

  I will call the query_queued_gemma4_with_stats tool again to see if the changes have been picked up.

● tpu-4B-v6e4-devops-agent/query_queued_gemma4_with_stats(Query model with stats) (ctrl+o to expand)

  The model returned the following response to the query:

  ### 💬 Model Response ( what is Gemma? )

  I am Gemma 4, a Large Language Model developed by Google DeepMind.

  In general, "Gemma" refers to a family of lightweight, state-of-the-art open weights models developed by Google
  DeepMind. These models are designed to be accessible and perform robustly across a variety of tasks.

  Key things to know about the Gemma family:

  • Open Models: Part of the open weights family, meaning researchers and developers have access to the model weights
  to build upon, fine-tune, and deploy them.
  • Different Sizes: Available in different parameter sizes, allowing users to choose models based on their available
  computational budget.
  • Capabilities: Trained to understand and generate human-quality text, answer questions, summarize, write code, and
  engage in creative writing.
  • Modalities: Some versions (like the 2B and 4B variants) are capable of processing audio input in addition to text.
  ──────
  ### 📊 Performance Analysis

  When using streaming completion APIs, Gemma 4 outputs its reasoning steps inside a specific delta.reasoning block
  (due to --reasoning-parser gemma4 configurations), rather than standard delta.content .

  I updated the server's streaming parser in server.py to support fallback to the reasoning attribute so that
  query_queued_gemma4_with_stats will properly extract the streamed text on the next server restart.

  Here is the raw latency metrics for this request:

  • Time to First Token (TTFT): ~0.158 seconds 
  • Average Token Generation Rate: ~180 tokens/second 
  • Serving Latency: 0.26 seconds
&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 markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### 🚀 Key Performance Insights&lt;/span&gt;

  • Peak Throughput: The system achieved a peak throughput of 223.85 req/s at 1024 concurrent users with an 8-token
  context window.
  • Scaling &amp;amp; Batching:
      • Low Concurrency (1–4 users): Throughput scales from 6 req/s to 16 req/s, showing linear batch efficiency.
      • Optimal Concurrency Range (128–1024 users): The serving stack thrives under high concurrency, maintaining
      high throughput (101–223 req/s) by maximizing TPU tensor core utilization via continuous iteration-level
      batching.
      • Extreme Load (2048 users): Stable throughput of 140–176 req/s is maintained, validating high availability and
      robust queue management under massive concurrent loads.
      • For single-user requests (concurrency = 1), throughput decreases from 6.31 req/s (4-token context) to 2.72
  • Context Window Impact:
      req/s (16K-token context) due to the increased KV cache computation and attention head scaling.
  • Physical KV Cache Boundaries:
      • The TPU v6e-4 has a physical cache boundary of 789,760 tokens in flight.
      • All combinations where concurrency &lt;span class="err"&gt;*&lt;/span&gt; context_len &amp;gt; 789,760 (such as 1024 users with ≥ 1024 context, or 2048
      users with ≥ 512 context) were automatically skipped to prevent memory exhaustion (OOM) and API hang states.

&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jv61d9arfp3kv4gkndl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0jv61d9arfp3kv4gkndl.png" width="800" height="571"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnaowo6w2n3zwwothgmqn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnaowo6w2n3zwwothgmqn.png" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Comparison with Other Deployments
&lt;/h4&gt;

&lt;p&gt;What just happened? Compare and contrast 12B on v6e-4:&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="gt"&gt;&amp;gt; print tpu_v6e4_model_size_comparison.md&lt;/span&gt;

   📊 Model Size Comparison: Gemma 4 (2B vs. 4B vs. 12B) on Cloud TPU v6e-4 

  This report analyzes how the serving performance of Gemma 4 scales across different model parameter sizes (2B vs.
  4B vs. 12B) when running on the exact same hardware configuration: a Cloud TPU v6e-4 node.
  ──────
  ## 📈 Performance Summary Matrix (8-token Context Window)

  Here is a side-by-side comparison of the serving throughput (req/s) for the three models at a standard 8-token
  context length:

   Concurrency (Users) | Gemma 4 2B (req/s) | Gemma 4 4B (req/s) | Gemma 4 12B (req/s)
  ----------------------------|----------------------------|----------------------------|----------------------------
   1 User | 5.14 | 6.13 | 3.81
   4 Users | 12.52 | 15.56 | 11.86
   16 Users | 34.34 | 34.34 | 34.92
   64 Users | 101.45 | 101.45 | 54.11
   256 Users | 181.42 | 178.86 | 61.98
   512 Users | 222.82 | 202.80 | 63.09
   1024 Users | 231.19 | 223.85 | 61.33
   2048 Users | 173.50 | 176.67 | 62.10
  ──────
  ## 🔍 Key Performance Trends &amp;amp; Findings

  ### 1. Throughput vs. Model Size (Parameter Scaling)

  • 2B vs. 4B Performance Parity:
      • Interestingly, the 2B (E2B-it) and 4B (E4B-it) models show highly comparable peak performance, capping at 
&lt;span class="p"&gt;      231.&lt;/span&gt;19 req/s and 223.85 req/s respectively.
      • Because both models are relatively lightweight, their execution is mostly memory-bandwidth bound at high
      concurrency rather than compute-bound. The v6e-4's HBM bandwidth is sufficient to feed the MXUs for both sizes
      at almost identical rates.
  • 12B Performance Bottleneck (Parameter scaling drop):
      • In contrast, the 12B model's throughput peaks at only 63.09 req/s (representing a ~73% drop in peak
      throughput compared to the 2B/4B models).
      • The 12B model has ~6x more parameters than the 2B model, requiring 6x more floating-point operations (FLOPs)
      per token. The execution shifts from memory-bandwidth bound to compute-bound, saturating the TPU's matrix
      arithmetic units (MXUs) at a much lower request rate.

  ### 2. Concurrency Saturation Point

  • 2B &amp;amp; 4B Models: Continue scaling throughput up to 1,024 concurrent users before saturating and declining at 2,048
  users.
  • 12B Model: Reaches its saturation peak much earlier, at 256 to 512 concurrent users ( ~62–63 req/s ). Beyond 256
  users, the throughput remains flat as the TPU's compute cores are completely saturated.

  ### 3. HBM &amp;amp; KV Cache Footprint Differences

  • Weights memory footprint:
      • 2B: ~4 GB HBM
      • 4B: ~8 GB HBM
      • 12B: ~24 GB HBM
  • Loading the 12B model's 24 GB of weights leaves significantly less HBM available on the TPU chips for active
  request tracking (activations and KV Cache).
  • Furthermore, the size of each token in the KV Cache scales with the model's hidden dimension size and head count.
  Consequently, the 12B model's KV Cache entries are significantly larger, meaning the physical capacity limit (in
  total tokens) is reached much earlier, prompting vLLM to pause/queue new incoming requests sooner to avoid OOM
  conditions.

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

&lt;/div&gt;



&lt;p&gt;Compare the models the basic v6e-1:&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="gt"&gt;&amp;gt; compare and contrast the 4B on v6e-4 vs 12B and 4B on v6e-1&lt;/span&gt;

  I will search the codebase to check if we have existing benchmark data or configurations for the 4B model running
  on a single-chip TPU v6e-1.

● Search(v6e-1 in /home/xbill/gemma4-tips) (ctrl+o to expand)

  Here is a comparative analysis comparing the Gemma 4 4B model running on a TPU v6e-4 (4 chips) cluster against both
  the Gemma 4 12B model and the Gemma 4 4B model running on a single-chip TPU v6e-1 (1 chip) configuration:
  ──────
  ### 📊 Performance Metrics Comparison Matrix

   Configuration | Peak Throug… | Single-User… | Max Context … | Primary Bottleneck
  -------------------------------|--------------|--------------|---------------|-------------------------------------
   Gemma 4 4B on v6e-4 (4 Chips) | 223.85 req/s | ~0.16s – | 16,384 tokens | TPU core compute saturation at high
                                 | | 0.26s | | concurrency.
   Gemma 4 12B on v6e-1 (1 Chip) | 63.09 req/s | 0.530s | 4,096 tokens | TPU memory capacity (OOMs at ≥ 8K)
                                 | | | | and HBM bandwidth.
   Gemma 4 4B on v6e-1 (1 Chip)&lt;span class="err"&gt;*&lt;/span&gt; | ~75.00 req/s | ~0.22s (est) | 4,096 tokens | Single accelerator memory size
                                 | (est) | | (est) | (32GB HBM) and compute capacity.

  &lt;span class="err"&gt;*&lt;/span&gt;Estimated based on 4B compute footprint scaling down to a single-chip TP=1 layout.
  ──────
  ### 🔍 Compare and Contrast

  #### 1. Gemma 4 4B on v6e-4 vs. Gemma 4 12B on v6e-1

  • The Scale-up Delta: Running a smaller model (4B) on a larger clustered node (v6e-4) yields an enormous
  performance boost. Peak throughput is 3.55x higher (223 req/s vs 63 req/s), and request latency is slashed by more
  than half.
  • Capacity Limit: The v6e-1 chip running the 12B model runs out of physical KV cache space extremely quickly,
  causing OOMs at 8K and 16K context lengths. The v6e-4 cluster easily handles the 4B model up to a 16K context size
  due to the aggregate 128GB of HBM shared across the 4 chips.

  #### 2. Gemma 4 4B on v6e-4 vs. Gemma 4 4B on v6e-1 (Architectural Trade-offs)

  • Inter-Chip Communication (ICI) Overhead:
      • On v6e-1 (Single Chip): The 4B model runs with Tensor Parallelism TP=1 . Since it fits entirely on one chip,
      it avoids all-gather and all-reduce latency overhead. For a single user, this results in an exceptionally clean
      and low latency profile (~0.22s), nearly matching the v6e-4.
      • On v6e-4 (Clustered): The model is sharded ( TP=4 ). For small requests, the communication overhead between
      chips offsets some of the compute speedups. However, as load scales, the cluster easily absorbs high
      concurrency.
  • Throughput Scaling:
      • Under heavy concurrent traffic, the single MXU (Matrix Execution Unit) of the v6e-1 chip saturates, capping
      throughput at around ~75 req/s.
      • The v6e-4 cluster utilizes iteration-level batching across 4 distinct chips, allowing throughput to scale up
      to 223 req/s (a 3x throughput multiplier under peak load).
  • Memory &amp;amp; Cache Allocation:
      • The v6e-1 chip has only 32GB HBM total.
      • The v6e-4 node provides 128GB HBM (4 x 32GB). This expanded footprint allows the v6e-4 to maintain a massive
      KV cache of 789,760 tokens in flight, which is 4 times the volume of concurrent context that a v6e-1 chip can
      sustain.

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

&lt;/div&gt;



&lt;p&gt;what about GPU Deployments?&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="gt"&gt;&amp;gt; how does perfomance compare to GPU on cloud run, GCP, and AWS? use the benchmark runs in the parent directory&lt;/span&gt;
  Focusing specifically on the raw performance (throughput and latency) of the Gemma 4 4B (E4B-it) model, here is how
  the Cloud TPU v6e-4 (4 chips) compares directly to the NVIDIA L4 GPU on Cloud Run / GCP / AWS using the actual
  benchmark run data from the parent directory:
  ──────
  ### 📊 Raw Performance Metrics: Gemma 4 4B

   Workload Metric | NVIDIA L4 GPU (Cloud Run … | Cloud TPU v6e-4 (TPU VM Sl… | Performance Factor / Gain
  --------------------------|----------------------------|-----------------------------|-----------------------------
   Peak Token Throughput | ~80 – 90 tok/s | ~2,238 tok/s (concurrency = | 🚀 TPU is ~25x faster under
                            | (concurrency = 16) | 1024) | peak concurrency.
   Moderate Load Throughput | ~80 – 90 tok/s | ~417 tok/s (concurrency = | ⚡ TPU is ~4.6x faster
                            | (concurrency = 16, ctx = | 16, ctx = 8) | under moderate load.
                            | 8) | |
   Long-Context Throughput | ~25 – 27 tok/s | ~110 tok/s (concurrency = | 💾 TPU is ~4.1x faster on
                            | (concurrency = 16, ctx = | 16, ctx = 16K) | large contexts.
                            | 16K) | |
   Concurrency Ceiling | Performance saturates at | Performance scales up to | 📈 TPU supports 64x more
                            | 16 users | 1024 users | concurrent users before
                            | | | saturating.

  &lt;span class="err"&gt;*&lt;/span&gt;Source: /gpu-4B-L4-devops-agent/benchmark_report.md in the parent directory.
  ──────
  ### 🔍 Key Performance Comparisons

  #### 1. Throughput Scaling &amp;amp; Batching Efficiency

  • The L4 GPU Bottleneck: The single NVIDIA L4 GPU reaches its peak compute capacity early. When concurrency scales
  past 16 users, the GPU's memory bandwidth and tensor cores saturate, and throughput plateaus around 80–90 tok/s.
  • The TPU Cluster Advantage: The TPU v6e-4 leverages 4-chip tensor sharding (TP=4) and high-speed inter-chip links.
  As concurrency climbs from 16 to 1024 users, vLLM's continuous batching scales the output generation rate from 417
  tok/s up to a massive 2,238 tok/s.

  #### 2. Long-Context (16K Tokens) Performance

  • L4 GPU: When handling a 16K token context window, the L4 GPU's throughput falls to 25–27 tok/s.
  • TPU v6e-4: Under a similar 16K load, the TPU v6e-4 maintains 110 tok/s generation throughput. This highlights the
  memory advantage of the TPU cluster's pooled 128GB HBM and sharded attention projections over the L4 GPU's single
  24GB GDDR6 bus.

  #### 3. Request Latency Under Load

  • Low Load: Both platforms offer sub-second latency for single-user queries.
  • High Load: On the L4 GPU, adding users beyond a concurrency of 32 causes request queuing, which rapidly increases
  latency. On the TPU v6e-4 cluster, request queuing is deferred, allowing the stack to maintain sub-second response
  times for up to 128 concurrent users.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Cost Breakdown
&lt;/h4&gt;

&lt;p&gt;Finally — the last key question. What deployment is most cost effective?&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="gt"&gt;&amp;gt; compare costs across TPU v6e-1, TPU v6e-4, GCE with GPU, Cloud Run, azure, and AWS EC2 GPU do not use MCP tool&lt;/span&gt;

  Here is a comprehensive cost comparison across TPU v6e-1, TPU v6e-4, GCE with GPU, Cloud Run, Microsoft Azure, and
  AWS EC2 GPU, highlighting the pricing structures, flat-rate daily running costs, and workload fit:
  ──────
  ### 💵 Infrastructure Price Sheet (Hourly &amp;amp; Daily Baselines)
   Cloud Platform | Instance/accelerator Type | Average Hourly… | Flat-rate Daily… | Billing Model Characteris…
  ---------------------|---------------------------|-----------------|------------------|----------------------------
   GCP (TPU v6e-1) | 1x Trillium TPU Chip | $1.375 / hr | $33.00 / day | Flat rate. No scaling to
                       | | | | zero.
   GCP (TPU v6e-4) | 4x Trillium TPU Slice | $5.50 / hr | $132.00 / day | Flat rate. High throughput
                       | | | | efficiency.
   GCP (GCE VM GPU) | 1x NVIDIA L4 ( g2- | ~$1.01 / hr | $24.24 / day | Provisioned VM. Regular
                       | standard-4 ) | | | compute VM + GPU charge.
   GCP (GCE VM GPU) | 1x NVIDIA A100 (80GB) | ~$3.67 / hr | $88.08 / day | Provisioned VM. Optimized
                       | | | | for heavy
                       | | | | training/inference.
   GCP Cloud Run (GPU) | 1x NVIDIA L4 (Active) | ~$1.80 / hr | $0.00 / day (If | Scale-to-zero. Pay-per-
                       | | | idle) | second only when active.
   AWS EC2 (GPU) | 1x NVIDIA A10G ( | ~$1.006 / hr | $24.14 / day | Provisioned EC2 instance.
                       | g5.xlarge ) | | |
   AWS EC2 (GPU) | 1x NVIDIA L4 ( g6.xlarge | ~$0.97 / hr | $23.28 / day | AWS newest mid-tier
                       | ) | | | standard GPU instance.
   Azure (GPU VM) | 1x NVIDIA A10 ( | ~$1.21 / hr | $29.04 / day | Provisioned VM.
                       | NC24ads_A10_v4 ) | | |
   Azure (GPU VM) | 1x NVIDIA A100 ( | ~$3.40 / hr | $81.60 / day | Enterprise grade, sharded
                       | ND96asr_v4 slice) | | | high-compute.
  ──────
  ### 🔍 Compare and Contrast

  #### 1. Google Cloud TPUs vs. GCP Compute Engine (GCE) GPUs

  • TPU v6e-1 ($1.375/hr) vs. GCE L4 VM (~$1.01/hr): Running a single L4 GPU on GCE is slightly cheaper than a TPU
  v6e-1. However, if your model supports JAX/XLA compile paths, the TPU v6e-1 yields higher token throughput,
  offsetting the 30% hourly price premium.
  • TPU v6e-4 ($5.50/hr) vs. GCE A100 VM (~$3.67/hr): An A100 GPU is cheaper hourly than the TPU v6e-4 cluster.
  However, under high batch concurrency and long contexts, the TPU v6e-4's pooled memory bandwidth processes requests
  up to 8x faster, yielding a much lower cost-per-million-tokens ($0.53/million tokens on TPU vs. $4.24/million
  tokens on A100).

  #### 2. Cloud Run (Serverless GPU) vs. Always-On VMs (GCP, AWS, Azure)

  • The Low-Utilization Workload: For developer sandboxes, SRE diagnostics, or internal testing APIs that only run
  for a cumulative 1 hour per day, Cloud Run is the absolute winner. You pay only for active request-processing time
  (e.g., $1.80/day), while provisioned VMs or TPUs cost a flat $24–$132/day regardless of idle time.
  • The High-Utilization Workload: If your production API runs 24/7, the serverless overhead of Cloud Run makes it
  more expensive than dedicated VMs or TPUs.

  #### 3. GCP vs. AWS vs. Azure (GPU VMs)

  • GCP G2 (NVIDIA L4) vs. AWS G6 (NVIDIA L4): Pricing is neck-and-neck (~$1.01/hr on GCP vs ~$0.97/hr on AWS),
  making cloud migration decisions dependent on your existing VPC architectures rather than hardware cost
  differentials.
  • Azure NC/ND instances: Azure's GPU VMs typically carry a minor premium (~$1.21/hr for A10/L4 equivalents) but
  provide excellent integration with Azure Container Apps (ACA) for serverless GPU scaling.

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

&lt;/div&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 TPU deployments.&lt;/p&gt;

</description>
      <category>googleantigravity</category>
      <category>python</category>
      <category>mcps</category>
      <category>tpu</category>
    </item>
    <item>
      <title>MCP Configuration for Looker with Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Mon, 06 Jul 2026 20:23:55 +0000</pubDate>
      <link>https://dev.to/gde/mcp-configuration-for-looker-with-antigravity-cli-504d</link>
      <guid>https://dev.to/gde/mcp-configuration-for-looker-with-antigravity-cli-504d</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Looker and underlying Gemini LLM with the Antigravity CLI to enhance and extend Looker operations over MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hay3ava5vzkqnet2d2n.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0hay3ava5vzkqnet2d2n.jpeg" width="800" height="437"&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 article which used Gemini CLI:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/mcp-configuration-for-looker-with-gemini-cli-55e5671197fb" rel="noopener noreferrer"&gt;MCP Configuration for Looker with Gemini CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this updated version, the Antigravity CLI is used to integrate Looker functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Looker?
&lt;/h4&gt;

&lt;p&gt;Looker is a cloud-based business intelligence (BI) and data analytics platform owned by Google Cloud that enables organizations to analyze, visualize, and share data in real-time. It uses a unique modeling language called LookML to define data relationships, offering a centralized “single source of truth” for metrics. Looker focuses on embedded analytics and live data exploration rather than storing data itself.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/looker" rel="noopener noreferrer"&gt;Looker business intelligence platform embedded analytics&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Features and Capabilities
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;LookML (Looker Modeling Language): A code-based modeling language that allows data analysts to define dimensions, aggregates, and calculations, ensuring consistent metrics across the organization.&lt;/li&gt;
&lt;li&gt;Live Data Connection: Looker does not import data; it queries your data warehouse directly (e.g., BigQuery, Snowflake, Redshift) in real-time, ensuring data is always up to date.&lt;/li&gt;
&lt;li&gt;Embedded Analytics: Looker can be embedded into other applications, websites, or portals, allowing businesses to provide data insights directly within their own tools.&lt;/li&gt;
&lt;li&gt;Self-Service BI: Users can explore data, create visualizations, and build custom dashboards using a browser-based interface without needing deep SQL knowledge.&lt;/li&gt;
&lt;li&gt;Workflow Integration: Actionable data insights can be sent directly to other applications, such as triggering an email based on specific business rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Looker? I thought Big Query Did everything!
&lt;/h4&gt;

&lt;p&gt;Semantic layer is where all the cool kids hang out.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Google MCP Strategy
&lt;/h4&gt;

&lt;p&gt;Google has gone all-in for all the core Cloud services to provide connections over MCP. An overview is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/mcp/overview" rel="noopener noreferrer"&gt;Google Cloud MCP servers overview | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  MCP Toolbox
&lt;/h4&gt;

&lt;p&gt;MCP Toolbox is the “swiss army” knife that connects your data sources to MCP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/looker/docs/connect-ide-to-looker-using-mcp-toolbox" rel="noopener noreferrer"&gt;Use Looker with MCP, Gemini CLI and other Agents | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Looker MCP Setup
&lt;/h4&gt;

&lt;p&gt;For a mode detailed step by step setup instructions — there is a full codelab that goes through the setup:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codelabs.developers.google.com/codelabs/looker-mcp-toolbox#0" rel="noopener noreferrer"&gt;Connect Gemini CLI to Looker with MCP Toolbox | Google Codelabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and a further deep dive is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/looker/docs/connect-ide-to-looker-using-mcp-toolbox" rel="noopener noreferrer"&gt;Use Looker with MCP, Gemini CLI and other Agents | Google Cloud Documentation&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;
  
  
  Google Skills Repository
&lt;/h4&gt;

&lt;p&gt;Google Skills give your MCP client well known approaches to work with the core Google products including Big Query.&lt;/p&gt;

&lt;p&gt;The full details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/blog/topics/developers-practitioners/level-up-your-agents-announcing-googles-official-skills-repository" rel="noopener noreferrer"&gt;Level Up Your Agents: Announcing Google's Official Skills Repository | Google Cloud Blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To install the Skills in Gemini CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills &lt;span class="nb"&gt;install &lt;/span&gt;github.com/google/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What you talkin ‘bout Willis?
&lt;/h4&gt;

&lt;p&gt;That was a lot of setup! But wait- there is more! So what is different about this lab compared to all the others out there?&lt;/p&gt;

&lt;p&gt;This demo is one of the first deep dives into configuring Looker for MCP. Antigravity CLI provides a complete working environment with a full MCP client. Looker exposes the key features of the platform over the MCP layer.&lt;/p&gt;

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

&lt;p&gt;The strategy for configuring Looker with MCP is a incremental step by step approach.&lt;/p&gt;

&lt;p&gt;First, the Looker configuration settings are retrieved. Then, these settings are used to configure Antigravity CLI. Finally- Antigravity CLI is used as a MCP client to the Looker environment. Several samples are run using the Looker MCP Tools directly from Antigravity CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  Looker Admin Setup
&lt;/h4&gt;

&lt;p&gt;For Looker (Google Cloud core) — Admins do not directly create keys for standard users; instead, they enable the permission for users to manage their own.&lt;/p&gt;

&lt;p&gt;Navigate to the &lt;a href="https://docs.cloud.google.com/looker/docs/admin-panel-users-users" rel="noopener noreferrer"&gt;Looker Admin Users page&lt;/a&gt; (Admin &amp;gt; Users).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click Edit next to the specific user.&lt;/li&gt;
&lt;li&gt;Locate the API Keys field and toggle it to Enabled.&lt;/li&gt;
&lt;li&gt;Once enabled, the user can generate their own keys by going to their personal &lt;a href="https://docs.cloud.google.com/looker/docs/user-account" rel="noopener noreferrer"&gt;Account settings page&lt;/a&gt; (User Icon &amp;gt; Account &amp;gt; API Keys).&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Looker Instance URL
&lt;/h4&gt;

&lt;p&gt;To connect to the Looker setup — you need to derive your Looker Base URL. Typically this will be the hostname in the Looker app domain.&lt;/p&gt;

&lt;p&gt;For the test instance- this is an example of what the URL looks like (note the HTTPS prefix and no trailing slash):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://780eb09e-7dab-4076-9ec1-ecf9d8414630.looker.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Looker User Setup
&lt;/h4&gt;

&lt;p&gt;First Login to your Looker User environment. Go to Profile-&amp;gt;Account (in upper right hand side) and bring up the user settings:&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%2F9vannncuv5cnh5wh4xo3.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%2F9vannncuv5cnh5wh4xo3.jpeg" width="717" height="825"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the API Key box is unavailable- contact your Admin to enable the API setup on a per user basis.&lt;/p&gt;

&lt;p&gt;Once you have access to create API keys- the settings will look similar to this:&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%2Ffxmlue5k8ldi9lpsdy6r.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%2Ffxmlue5k8ldi9lpsdy6r.png" width="628" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click the “Manage” button to setup the API Keys:&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%2Fouonrmrmv0ck99cu8rwm.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%2Fouonrmrmv0ck99cu8rwm.png" width="800" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create New API key to generate the API Key. Save the &lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;At this point you should have a working Shell 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/looker-mcp-agy
&lt;span class="nb"&gt;cd &lt;/span&gt;looker-mcp-agy
&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;
  
  
  Initial Connection
&lt;/h4&gt;

&lt;p&gt;Start up Antigravity CLI after all the environment variables have been set:&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:~/looker-mcp-agy$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;agy
&lt;span class="go"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then use the &lt;strong&gt;/mcp list :&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;&amp;gt; list looker MCP tools

41.0k in | 728 out | 667 thinking
● ListDir(/home/xbill/.gemini/antigravity-cli/mcp/looker-toolbox) (ctrl+o to expand)
  Here is a list of the available tools provided by the Looker MCP Toolbox ( looker-toolbox ), organized by category:

  ### 1. Project &amp;amp; File Management
  • get_projects : Retrieve available Looker projects.
  • get_project_files : List files within a Looker project.
  • get_project_file : Retrieve the content of a specific file.
  • create_project_file : Create a new file within a project.
  • update_project_file : Update an existing project file.
  • delete_project_file : Delete a file from a project.
  • get_project_directories : Get the directory structure of a project.
  • create_project_directory : Create a new directory within a project.
  • delete_project_directory : Delete a directory from a project.
  • validate_project : Run LookML validator on a project.
  ### 2. Git Integration

  • get_git_branch : Get current active Git branch for a project.
  • list_git_branches : List Git branches associated with a project.
  • create_git_branch : Create a new Git branch.
  • switch_git_branch : Switch development to another Git branch.
  • delete_git_branch : Delete a Git branch.

  ### 3. Database Connections &amp;amp; Schema Discovery

  • get_connections : List active database connections in Looker.
  • get_connection_databases : List databases under a specific connection.
  • get_connection_schemas : Get schemas for a specific connection/database.
  • get_connection_tables : Get tables under a connection schema.
  • get_connection_table_columns : Retrieve columns and metadata for a database table.
  • create_view_from_table : Generate a basic LookML view from a database table.
  ### 4. LookML Metadata (Models, Explores, Fields)
  • get_explores : List Explores within a LookML model.
  • get_dimensions : Retrieve dimensions for a specific Explore.
  • get_measures : Retrieve measures for a specific Explore.
  • get_parameters : Retrieve parameters defined in an Explore.
  • get_filters : Retrieve active filters defined in an Explore.

  ### 5. Queries &amp;amp; Execution

  • query : Run a structured Looker query.
  • query_sql : Run raw SQL queries against a connection.
  • query_url : Execute a Looker query using an expanded Looker query URL.

  ### 6. Dashboards, Looks &amp;amp; Elements

  • get_models : List available LookML models.
  • get_dashboards : List or search for Looker dashboards.
  • make_dashboard : Create a new Looker dashboard.
  • run_dashboard : Execute and fetch results for a dashboard.
  • add_dashboard_element : Add a visual element (tile) to a dashboard.
  • add_dashboard_filter : Add a filter to a dashboard.
  • get_looks : List or search for Looks.
  • make_look : Create a new Look.
  • run_look : Run an existing Look and return the results.

  ### 7. Testing &amp;amp; Validation

  • get_lookml_tests : Retrieve LookML unit tests defined in a project.
  • run_lookml_tests : Run unit tests on LookML code.

  ### 8. Embedding &amp;amp; Access

  • generate_embed_url : Generate signed embed URLs for embedding Looker content.
  • dev_mode : Toggle Looker Developer Mode on/off.

  ### 9. System Health &amp;amp; Maintenance

  • health_analyze : Analyze Looker system health and performance.
  • health_pulse : Run high-level system checks.
  • health_vacuum : Perform vacuum operations to clean up system metadata.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;At this point- Antigravity CLI is setup with the MCP Toolbox and has direct access to all the Looker MCP Tools. Any operations with the Tools come back directly into the Antigravity CLI Context.&lt;/p&gt;

&lt;p&gt;To get an overview of Dashboards:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● looker-toolbox/get_dashboards(Get dashboards) (ctrl+o to expand)

  Here are the saved dashboards found in your Looker instance:

   ID | Title | Description
  ----|---------------------------------------------------------|-----------------------------------------------------------
   2 | 1) Business Pulse - Basic visualization examples | None
   1 | 2) Business Pulse - Intermediate visualization examples | None
   3 | 3) Business Pulse - Advanced visualization examples | None
   4 | Agreement for Shared Use of this Looker Instance | None
   13 | E-commerce Overview | A custom dashboard showing key e-commerce metrics.
   7 | Inventory | None
   11 | My Dashboard | None
   9 | Self-serve industry | None
   5 | test | None
   6 | test | None
   12 | test-orders | None
   8 | TestJC | None
   10 | TestOrdersByCity | None
   15 | ☁️ Cloud Optimization Hub | Operationalizing AI-driven cost savings from the Google
      | | Cloud Recommender API.
   14 | 💎 VIP Customer Intelligence | Real-time insights into our top-performing revenue
      | | segments, leveraging Advanced LTV and Ranking logic. │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also get 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; get_models

● looker-toolbox/get_models(Get models) (ctrl+o to expand)

  Here are the LookML models configured in your Looker instance:

   Model Name | Label | Project Name | Connections
  -------------------------|------------------------|----------------------------------|------------------------------------
   basic_ecomm | Z) Sample LookML | sample_thelook_ecommerce | default_bigquery_connection
   intermediate_ecomm | Z) Sample LookML | sample_thelook_ecommerce | default_bigquery_connection
   advanced_ecomm | Z) Sample LookML | sample_thelook_ecommerce | default_bigquery_connection
   extension-api-explorer | Extension-api-explorer | marketplace_extension_api_explor | default_bigquery_connection
                           | | er |
   data_block_acs_bigquery | Census Data Block | marketplace_acs_census-v2 | american-community-survey
   gcp_billing_block | Google Cloud Billing | marketplace_gcp-billing | billing-export-sample
   chrome-ux-block | Chrome-ux-block | marketplace_chrome-ux-block | chrome-ux
   london_bicycles | London Bicycles | london_bicycles | london-bicycles
   gde_rk | Gde Rk | gde_rk | default_bigquery_connection,
                           | | | american-community-survey, gcp-
                           | | | billing-export, billing-export-
                           | | | sample, london-bicycles, chrome-
                           | | | ux, crux-demo,
                           | | | self_service_connection
   data-dictionary | Data-dictionary | marketplace_extension_data_dicti | default_bigquery_connection
                           | | onary |
   bq_agent_analytics | Bq Agent Analytics | agent_events | default_bigquery_connection
   agent-analytics | Agent-analytics | marketplace_agent_analytics | default_bigquery_connection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And drill into the 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; drill into E-commerce Overview

23.6k in | 508 out | 262 thinking
● looker-toolbox/run_dashboard(Run dashboard) (ctrl+o to expand)

  Here is the drilled-down detailed information for the E-commerce Overview dashboard (ID: 13):
  ### Dashboard Metadata
  • Title: E-commerce Overview
  • Description: A custom dashboard showing key e-commerce metrics.
  ──────
  ### Tile 1: Total Sales by Country

  This tile shows the distribution of order sale prices aggregated by the customer's country.
   Country | Total Sales ($)
  -------------------------------------------------------------|------------------------------------------------------------
   🇨🇳 China | $3,644,758.69
   🇺🇸 United States | $2,456,702.48
   🇧🇷 Brasil | $1,576,687.84
   🇰🇷 South Korea | $574,673.69
   🇫🇷 France | $508,862.30
   🇬🇧 United Kingdom | $499,116.90
   🇩🇪 Germany | $473,842.69
   🇪🇸 Spain | $419,638.62
   🇯🇵 Japan | $269,667.42
   🇦🇺 Australia | $242,649.16
   🇧🇪 Belgium | $131,708.43
   🇵🇱 Poland | $31,306.44
   🇨🇴 Colombia | $1,084.87
   🇦🇹 Austria | $531.15
   🇪🇸 España | $58.55
  ──────
  ### Tile 2: Top 10 VIP Customers

  This tile lists the highest-value individual customers based on their cumulative purchase value.

   Rank | Customer Name | Total Sales ($)
  ----------------------------------------|----------------------------------------|----------------------------------------
   1 | Michael Johnson | $5,953.97
   2 | James Smith | $5,668.41
   3 | Michael Williams | $5,527.92
   4 | Michael Smith | $5,305.61
   5 | Michael Brown | $5,158.41
   6 | James Brown | $4,973.58
   7 | David Jones | $4,371.31
   8 | Jennifer Smith | $4,000.41
   9 | Michael Jones | $3,860.22
   10 | Robert Williams | $3,698.10

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

&lt;/div&gt;



&lt;p&gt;and dig deeper on the details:&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="o"&gt;&amp;gt;&lt;/span&gt; create a list of top customers by country

133.4k &lt;span class="k"&gt;in&lt;/span&gt; | 6.6k out | 3.2k thinking
● Bash&lt;span class="o"&gt;(&lt;/span&gt;python3 /home/xbill/.gemini/antigravity-cli/brain/7fc1f8be-df53-450c-8467-e4c1751d34c0/scratch/top_...&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ctrl+o to
&lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

Here is the list of Top VIP Customers &lt;span class="o"&gt;(&lt;/span&gt;highest spending&lt;span class="o"&gt;)&lt;/span&gt; grouped by country, extracted from globally-ranked high-value e-
  commerce orders:
  &lt;span class="c"&gt;### 🇺🇸 United States&lt;/span&gt;
   Rank | Customer Name &lt;span class="o"&gt;(&lt;/span&gt;ID&lt;span class="o"&gt;)&lt;/span&gt; | Total Spend &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$)&lt;/span&gt;
  &lt;span class="nt"&gt;----------------------------------------&lt;/span&gt;|----------------------------------------|----------------------------------------
   1 | Francis Wiley &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#39504) | $1,487.11&lt;/span&gt;
   2 | Ryan Griffin &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#75188) | $1,459.95&lt;/span&gt;
   3 | Chase Winters &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#11172) | $1,368.07&lt;/span&gt;
   4 | Robert Sanford &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#59187) | $1,356.82&lt;/span&gt;
   5 | Gabriel Fletcher &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#99218) | $1,338.77&lt;/span&gt;
  ──────
  &lt;span class="c"&gt;### 🇨🇳 China&lt;/span&gt;
   Rank | Customer Name &lt;span class="o"&gt;(&lt;/span&gt;ID&lt;span class="o"&gt;)&lt;/span&gt; | Total Spend &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$)&lt;/span&gt;
  &lt;span class="nt"&gt;----------------------------------------&lt;/span&gt;|----------------------------------------|----------------------------------------
   1 | Jesus Stanton &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#14997) | $1,573.94&lt;/span&gt;
   2 | Jason Williams &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#6329) | $1,539.48&lt;/span&gt;
   3 | Crystal Chandler &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#16853) | $1,391.88&lt;/span&gt;
   4 | Shane Savage &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#4318) | $1,354.23&lt;/span&gt;
   5 | George Monroe &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#57053) | $1,283.95&lt;/span&gt;
  ──────
  &lt;span class="c"&gt;### 🇧🇷 Brasil&lt;/span&gt;
   Rank | Customer Name &lt;span class="o"&gt;(&lt;/span&gt;ID&lt;span class="o"&gt;)&lt;/span&gt; | Total Spend &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$)&lt;/span&gt;
  &lt;span class="nt"&gt;----------------------------------------&lt;/span&gt;|----------------------------------------|----------------------------------------
   1 | Ernest Marquez &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#63421) | $1,667.99&lt;/span&gt;
   2 | Jack Perkins &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#45560) | $1,356.89&lt;/span&gt;
   3 | Amanda Mckinney &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#58988) | $1,326.32&lt;/span&gt;
   4 | Katherine Hunter &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#89606) | $1,317.49&lt;/span&gt;
   5 | Christopher Moore &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="c"&gt;#85521) | $1,302.18&lt;/span&gt;
  ──────

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  But Wait! There’s More!
&lt;/h4&gt;

&lt;p&gt;Once the Tools are exposed by MCP -they have full access to Looker resources:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✦ I've retrieved the structure of the "Business Pulse - Basic visualization examples" dashboard (ID: 2). It includes several key performance
  indicators (KPIs) and visualizations:

  Dashboard Tiles:
   1. Total Items: Overall volume of items.
   2. Average Sale Price: The mean price per item.
   3. Unique Users: Count of distinct customers.
   4. # of Order Items vs Avg Sale Price Over Time: Correlation and trend analysis.
   5. New Users with Orders: Tracking customer acquisition.
   6. Highest Spending Users: Identification of VIP customers.
   7. New Users by Date and Source: Growth by marketing channel.
   8. Users by Traffic Source and Country: Geographical and channel distribution.

  Deep Dive: Highest Spending Users
  Let's look at the data for one of these tiles—"Highest Spending Users"—to see who the top customers are:


  Analyzing Top Customers: Analyzing the 'Highest Spending Users' tile from the dashboard.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and find the biggest customers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deep Dive: Highest Spending Users
  Let's look at the data for one of these tiles—"Highest Spending Users"—to see who the top customers are:


  Analyzing Top Customers: Analyzing the 'Highest Spending Users' tile from the dashboard.

╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓ query (looker-toolbox MCP Server) {"model":"basic_ecomm","fields":["basic_users.first_name","basic_users.last_name","basic_order_items… │
│ │
│ {"basic_order_items.total_sale_price":6942.0700097084045,"basic_users.first_name":"Michael","basic_users.last_name":"Smith"} │
│ {"basic_order_items.total_sale_price":4528.939993858337,"basic_users.first_name":"James","basic_users.last_name":"Smith"} │
│ {"basic_order_items.total_sale_price":4340.889998435974,"basic_users.first_name":"Michael","basic_users.last_name":"Johnson"} │
│ {"basic_order_items.total_sale_price":4325.510012626648,"basic_users.first_name":"Jennifer","basic_users.last_name":"Smith"} │
│ {"basic_order_items.total_sale_price":4184.879993438721,"basic_users.first_name":"Michael","basic_users.last_name":"Williams"} │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ The top 5 highest spending users in the system are:

  ┌──────────────────┬─────────────┐
  │ Name │ Total Spent │
  ├──────────────────┼─────────────┤
  │ Michael Smith │ $6,942.07 │
  │ James Smith │ $4,528.94 │
  │ Michael Johnson │ $4,340.89 │
  │ Jennifer Smith │ $4,325.51 │
  │ Michael Williams │ $4,184.88 │
  └──────────────────┴─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And build a Dashboard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make_dashboard of top &lt;span class="nb"&gt;users &lt;/span&gt;and countries

● looker-toolbox/add_dashboard_element&lt;span class="o"&gt;(&lt;/span&gt;Add dashboard element&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ctrl+o to &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

  I have successfully created the dashboard &lt;span class="s2"&gt;"Top Users &amp;amp; Countries Overview"&lt;/span&gt; and populated it with the relevant tiles.

  &lt;span class="c"&gt;### 📊 Dashboard Summary: Top Users &amp;amp; Countries Overview&lt;/span&gt;

  • Dashboard ID: 16 
  • Looker URL: /dashboards/cwHC8jENHqwfZpHlNgZsga 
  • Description: An executive dashboard highlighting top spenders and high-performing countries globally.
  ──────
  &lt;span class="c"&gt;### 🧱 Added Dashboard Tiles (Elements)&lt;/span&gt;

  &lt;span class="c"&gt;#### 1. Total Sales by Country&lt;/span&gt;

  • Description: Lists sales value aggregated by country to showcase global geographic performance.
  • Fields: basic_users.country , basic_order_items.total_sale_price 
  • Sorting: Sorted by total sales &lt;span class="k"&gt;in &lt;/span&gt;descending order.

  &lt;span class="c"&gt;#### 2. Top VIP Customers&lt;/span&gt;

  • Description: Displays the top 10 highest-value individual spenders across all regions.
  • Fields: basic_users.first_name , basic_users.last_name , basic_order_items.total_sale_price 
  • Sorting: Sorted by total spend &lt;span class="k"&gt;in &lt;/span&gt;descending order.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F87p8pdk4rxllbexq8hen.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F87p8pdk4rxllbexq8hen.png" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  LookML
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI has access to the full data over MCP:&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_explores , get_models , get_measures , 
                              | get_dimensions , get_filters , get_parameters of basic_ecomm
63.1k in | 1.2k out | 369 thinking
● looker-toolbox/get_parameters(Get parameters) (ctrl+o to expand)

  Here are the explores, models, measures, dimensions, filters, and parameters defined for the basic_ecomm model:
  ### 1. Model
  • Model Name: basic_ecomm 
  • Project: sample_thelook_ecommerce 
  • Label: Z) Sample LookML
  ──────
  ### 2. Explores
  There is 1 explore defined within this model:

  • basic_order_items (Label: "1) Basic Ecommerce", Group Label: "Z) Sample LookML")
  ──────
  ### 3. Dimensions
  Below is the list of dimensions available in the basic_order_items explore, grouped by their LookML view:
  #### Basic Order Items View ( basic_order_items )
  • basic_order_items.id (ID - Number)
  • basic_order_items.order_id (Order ID - Number)
  • basic_order_items.product_id (Product ID - Number)
  • basic_order_items.user_id (User ID - Number)
  • basic_order_items.inventory_item_id (Inventory Item ID - Number)
  • basic_order_items.sale_price (Sale Price - Number)
  • basic_order_items.status (Status - String)
  • basic_order_items.is_returned_or_cancelled (Is Returned or Cancelled - String)
  • Timestamps &amp;amp; Dates:
      • created_at (Date, Month, Quarter, Time, Week, Year)
      • delivered_at (Date, Month, Quarter, Time, Week, Year)
      • shipped_at (Date, Month, Quarter, Time, Week, Year)
      • returned_at (Date, Month, Quarter, Time, Week, Year)

  #### Basic Users View ( basic_users )
  • basic_users.id (ID - Number)
  • basic_users.age (Age - Number)
  • basic_users.gender (Gender - String)
  • basic_users.email (Email - String)
  • basic_users.first_name (First Name - String)
  • basic_users.last_name (Last Name - String)
  • basic_users.street_address (Street Address - String)
  • basic_users.city (City - String)
  • basic_users.state (State - String)
  • basic_users.postal_code (Postal Code - String)
  • basic_users.country (Country - String)
  • basic_users.latitude (Latitude - Number)
  • basic_users.longitude (Longitude - Number)
  • basic_users.traffic_source (Traffic Source - String)
  • Timestamps &amp;amp; Dates:
      • created_at (Date, Month, Quarter, Time, Week, Year)

  ──────
  ### 4. Measures

  The following aggregate metrics are available:

  • basic_order_items.count : # of Order Items (Type: count )
  • basic_order_items.average_sale_price : Average Sale Price (Type: average )
  • basic_order_items.total_sale_price : Total Sale Price (Type: sum )
  • basic_users.count : # of Users (Type: count_distinct )
  ──────
  ### 5. Filters &amp;amp; Parameters

  • Filters: None defined explicitly via the filter: LookML parameter (Note: any standard dimension above can still be
  used for filtering).
  • Parameters: None defined.

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

&lt;/div&gt;



&lt;p&gt;and a deep dive into the Basic Ecommerce data:&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; Performing a deep dive into the basic_ecomm model reveals a foundational LookML structure designed for ecommerce analysis.
  It centers around the
    basic_order_items explore, which joins order transactional data with user demographic information.

  That is a is very accurate and precise synthesis.

  The basic_order_items explore establishes a critical relationship: connecting transactional line-items (like status,
  sale prices, and order dates) directly with the demographic profile of the customer who made the purchase (their age,
  location, and traffic source). This enables answering fundamental business questions such as:

  • Which user acquisition channels (traffic sources) yield the highest total or average sale price?
  • How do sales trends vary across different countries or states?
  • What is the distribution of orders and average spending across different age groups or genders?

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  One Last Dashboard Example
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI was prompted to build out a “Cool” dashboard:&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 created the 💎 VIP Customer Intelligence dashboard. This dashboard leverages the Advanced Ecommerce Model to pull live insights about
  your top revenue-generating customers.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a full recap:&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 VIP Customer List Look provides a fascinating point of comparison to our automated dashboard. While the dashboard focused on
  aggregated patterns and behavioral segments, this Look is a surgical list of individual performance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final results!&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%2F2tq977wq9ttkknenyqo3.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%2F2tq977wq9ttkknenyqo3.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Final Code Review
&lt;/h4&gt;

&lt;p&gt;As a final step — Antigravity CLI was used for a full code review of the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✦ This project, called the "MCP Toolbox," is a framework for creating and exposing "tools" and "skills" that interact with a variety of data
  sources and cloud services, with a primary focus on Google Cloud and Looker.

  Here's a breakdown of its key components and purpose:

* Core Engine: The heart of the project is a command-line binary named toolbox. This program can be run as a server to expose a set of
     configured tools and skills through an API.
   * Tools: These are the basic building blocks of the system, providing direct integrations with services like databases (e.g., AlloyDB,
     BigQuery, Cloud SQL, Spanner) and other platforms like Looker. The toolbox can be configured with a wide range of pre-built tools or custom
     tools defined in YAML files.
   * Skills: "Skills" are a higher-level abstraction built on top of the tools. They are defined in markdown files and provide documentation,
     examples, and orchestration for more complex tasks. The project includes a rich library of skills for interacting with Google Cloud services
     like GKE, Firebase, and more.
   * AI-Powered: The architecture and naming ("Model-Client-Proxy") strongly suggest that this toolbox is designed to be used by a large language
     model or an AI agent. The "skills" provide a natural language interface that an AI can easily understand and use to perform actions on behalf
     of a user.
   * Environment and Configuration: The project includes shell scripts (init.sh, set_env.sh) to simplify the setup process, including
     authentication with Google Cloud, configuration of Looker credentials, and setting up the necessary environment variables to run the toolbox.

In essence, the MCP Toolbox acts as a bridge between a generative AI model and a wide range of external services, enabling the AI to perform
  complex, real-world tasks in response to user requests, particularly in the domain of data analysis and cloud infrastructure management.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Antigravity CLI was configured as a Looker MCP client using the MCP Toolbox. Then, the MCP connection was used to connect to the Looker Instance and test basic operations. Finally, Antigravity CLI was used for a complete project code review.&lt;/p&gt;

</description>
      <category>looker</category>
      <category>lookml</category>
      <category>python</category>
      <category>antigravitycli</category>
    </item>
    <item>
      <title>Omni Flash Preview with Claude Code</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Mon, 06 Jul 2026 16:34:02 +0000</pubDate>
      <link>https://dev.to/gde/omni-flash-preview-with-claude-code-53a5</link>
      <guid>https://dev.to/gde/omni-flash-preview-with-claude-code-53a5</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Omni Preview and underlying Gemini LLM with Claude Code CLI to enhance and extend Omni operations over MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvnjm3ovi58g4s7lzzoio.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvnjm3ovi58g4s7lzzoio.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;f&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  What is Google Omni?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini Omni&lt;/strong&gt; (often referred to simply as Google Omni) is a powerful, multimodal AI video model developed by Google. It allows users to generate, edit, and iterate on video content using any combination of text, images, video, and audio inputs through simple, conversational prompts. [&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.atlascloud.ai/blog/guides/gemini-omni-features-overview" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=sspeHtbRh1U" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepmind.google/models/gemini-omni/" rel="noopener noreferrer"&gt;Gemini Omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/?source=post_page-----606e13ae6501---------------------------------------" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait- there is more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview" rel="noopener noreferrer"&gt;Gemini Omni Flash Preview | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/google-omni-flash-preview-with-mcp-and-antigravity-cli-64743adceca3" rel="noopener noreferrer"&gt;Google Omni Flash Preview with MCP and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Claude Code CLI.&lt;/p&gt;
&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Claude Code to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;
&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call the Omni models. Native MCP support in Claude Code opens up a new pathway to call the underlying Omni model.&lt;/p&gt;
&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&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="go"&gt;npx skills add google-gemini/gemini-skills --skill gemini-interactions-api
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Claude Code 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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd ~
git clone https://github.com/xbill9/omni-flash-video-agent-claude
&lt;/span&gt;&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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd omni-flash-video-agent-claude
source init.sh
&lt;/span&gt;&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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd omni-flash-video-agent-claude
source set_env.sh
&lt;/span&gt;&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;
  
  
  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 console"&gt;&lt;code&gt;&lt;span class="gp"&gt;xbill@penguin:~/omni-flash-video-agent-claude$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="go"&gt;pip install -r requirements.txt
&lt;/span&gt;&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:~/omni-flash-video-agent-claude$&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 .
4 files already formatted
mypy .
Success: no issues found in 4 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Claude Code MCP Config
&lt;/h4&gt;

&lt;p&gt;A sample MCP config file:&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;"omni-video-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;"/home/xbill/.pyenv/shims/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/omni-flash-video-agent-claude/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="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 Claude Code CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses the 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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;/mcp

   Manage MCP servers
   1 server

     Project MCPs (/home/xbill/omni-flash-video-agent-claude/.mcp.json)
   ❯ omni-video-agent · ✔ connected · 8 tools

Omni-video-agent MCP Server Status: ✔ connected
   Command: /home/xbill/.pyenv/shims/python
   Args: /home/xbill/omni-flash-video-agent-claude/server.py
   Config location: /home/xbill/omni-flash-video-agent-claude/.mcp.json
   Capabilities: tools
   Tools: 8 tools

   ❯ 1. View tools
     2. Reconnect
     3. Disable

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
   Tools for omni-video-agent
   8 tools

   ❯ 1. generate_video
     2. edit_video
     3. animate_image
     4. interpolate_images
   ↓ 5. generate_with_subjects

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Omni Video Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing the Omni Video calls.&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;
Here's the help summary for the Gemini Omni Flash Video Agent MCP tools available in this project:

🎬 Available Tools

┌────────────────────────┬─────────────────────────────────────────────────────────┐
│ Tool │ What it does │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ generate_video │ Text prompt → new video │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ edit_video │ Statefully edit a prior video via its interaction ID │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ animate_image │ Animate a static local image with a motion prompt │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ interpolate_images │ Transition video between two keyframe images │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ generate_with_subjects │ Video featuring specific subjects from reference images │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ edit_user_video │ Upload a local video + edit it │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ upload_to_youtube │ Publish a local video to YouTube │
├────────────────────────┼─────────────────────────────────────────────────────────┤
│ get_help │ This summary │
└────────────────────────┴─────────────────────────────────────────────────────────┘

📦 Delivery Modes

- inline (default) — base64 bytes, fast for small clips (&amp;lt; 4MB)
- uri — Google File API, recommended for larger clips

Aspect ratios: 16:9 (landscape) or 9:16 (portrait).

💡 Prompting Tips for Cinematic Results

1. Scene layout — environment, subjects, clothing, spatial arrangement
2. Subject action — specific movement ("the cat slowly sips its tea")
3. Camera &amp;amp; motion — panning, tracking shot, crane shot, slow zoom
4. Lighting &amp;amp; mood — volumetric light, golden hour, cyberpunk neon
5. Style — photorealistic 3D, Pixar-style, macro photography, 2D vector

Want me to generate, edit, or animate something? Just describe the video you have in mind (or point me at a local image/video file) and I'll take it from there.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the MCP tools are now available for working with the Omni models:&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="go"&gt;generate video- Called omni-video-agent

Done! The clip was generated and saved.

📹 Output: /home/xbill/omni-flash-video-agent-claude/gen_1783349792.mp4
🆔 Interaction ID: v1_ChdIY0pMYXRIYk81ak0tOFlQX04tdWtRVRIXSGNKTGF0SGJPNWpNLThZUF9OLXVrUVU

It shows the Claude Code mascot — a glowing orange starburst character, Pixar-style — standing in a futuristic data center with blue-lit server racks, holographic code streams, and a slow cinematic dolly-in as it waves.

A couple of things I can do next if you'd like:
- Edit it statefully (via edit_video) — e.g. change lighting, add motion, tweak the mascot's action. I have the interaction ID ready.
- Upload to YouTube as private/unlisted.

Note: since you asked for an image but this toolset only produces video, if you specifically need a still frame I can grab one from the clip with ffmpeg. Want me to do that?

https://www.youtube.com/watch?v=VN96SWejRsw
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VN96SWejRsw"&gt;
  &lt;/iframe&gt;
&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="go"&gt;edit video with interactions ID

📹 Output: /home/xbill/omni-flash-video-agent-claude/edit_1783351815.mp4
🆔 New Interaction ID: v1_ChdIY0pMYXRIYk81ak0tOFlQX04tdWtRVRIXQmNwTGFxU0xOTmVOanJFUC1abldtUTQ

The Claude Code mascot is now rendered in blue, with the futuristic data center, server racks, and holographic code preserved.

https://www.youtube.com/watch?v=sfxY1cGeP4w
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/sfxY1cGeP4w"&gt;
  &lt;/iframe&gt;
&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="go"&gt;❯ call mcp tool animate_image claude.webp

  Listed 1 directory

Found the file. Let me take a quick look so the motion prompt fits what's actually in the image.

  Read 1 file

It's a cute pixel-art orange blocky creature holding a small banana in its raised hand. I'll animate it with a playful, retro-game feel that suits the pixel style.

  Called omni-video-agent

Animated! The pixel-art creature is now bouncing and waving its banana in a looping 8-bit idle animation.

📹 Output: /home/xbill/omni-flash-video-agent-claude/animated_1783352756.mp4
🆔 Interaction ID: v1_ChdzczFMYXRxcU1mSFNZktsMU1rUHFLeUgyUWs

https://www.youtube.com/watch?v=nhCzd7fgUmM
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/nhCzd7fgUmM"&gt;
  &lt;/iframe&gt;
&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="go"&gt;call mcp tool interpolate_images banana.webp claude.webp

  Listed 1 directory

Both files exist. Let me look at banana.webp so the transition prompt matches the actual keyframes.

  Read 1 file

&lt;/span&gt;&lt;span class="gp"&gt;Start frame is a pixel-art yellow banana with eyes;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;end frame is the orange blocky creature. I&lt;span class="s1"&gt;'ll set up a smooth morph transition between them.
&lt;/span&gt;&lt;span class="go"&gt;
  Called omni-video-agent

Done! Created a pixel-art morph transition from the banana into the Claude mascot.


https://www.youtube.com/watch?v=atj2ythTQMw
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/atj2ythTQMw"&gt;
  &lt;/iframe&gt;
&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="go"&gt;❯ call mcp tool generate with subjects banana.webp claude.webp

Both subject images are already confirmed present. I'll generate a scene featuring both the banana and the mascot together.

  Called omni-video-agent

Done! Generated a video featuring both subjects together.

📹 Output: /home/xbill/omni-flash-video-agent-claude/subject_1783354313.mp4
🆔 Interaction ID: v1_Chd4OU5MYXVIN0NvbXNqckVQM05EYzRROBIXeDlOTGF1SDdDb21zanJFUDNORGM0UTg

The banana and the Claude mascot adventure together as best friends through a colorful 8-bit side-scrolling game world — hopping across platforms, past coins and pixel flowers. 

https://www.youtube.com/watch?v=ibgve6EUVkQ
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ibgve6EUVkQ"&gt;
  &lt;/iframe&gt;
&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="go"&gt;❯ call mcp tool edit_user_video gen_1783349792.mp4 - make it steam punk

Called omni-video-agent

Done! The original data-center clip has been reimagined in a steampunk style.

📹 Output: /home/xbill/omni-flash-video-agent-claude/user_edit_1783354931.mp4
🆔 Interaction ID: v1_ChdNZFpMYXMza0F0aU8xTWtQcVpxUTRRWRIXTWRaTGFzM2tBdGlPMU1rUHFacVE0UVk

The sci-fi data center is now a Victorian mechanical hall of brass pipes, copper gears, and hissing steam, with the mascot reimagined as a clockwork brass-and-copper automaton — still waving.

https://www.youtube.com/watch?v=N-O4_YZcyyk
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/N-O4_YZcyyk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Claude CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Omni and Claude 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 Claude CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to interact with the Omni models.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>googleomni</category>
      <category>mcps</category>
      <category>python</category>
    </item>
    <item>
      <title>Omni Flash Preview with Codex</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Sun, 05 Jul 2026 02:28:00 +0000</pubDate>
      <link>https://dev.to/gde/omni-flash-preview-with-codex-3h17</link>
      <guid>https://dev.to/gde/omni-flash-preview-with-codex-3h17</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Omni Preview and underlying Gemini LLM with Codex CLI to enhance and extend Omni operations over MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3ijwpp0fh03f57ctkzx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3ijwpp0fh03f57ctkzx.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Omni?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini Omni&lt;/strong&gt; (often referred to simply as Google Omni) is a powerful, multimodal AI video model developed by Google. It allows users to generate, edit, and iterate on video content using any combination of text, images, video, and audio inputs through simple, conversational prompts. [&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.atlascloud.ai/blog/guides/gemini-omni-features-overview" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=sspeHtbRh1U" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepmind.google/models/gemini-omni/" rel="noopener noreferrer"&gt;Gemini Omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/?source=post_page-----606e13ae6501---------------------------------------" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait- there is more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview" rel="noopener noreferrer"&gt;Gemini Omni Flash Preview | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/google-omni-flash-preview-with-mcp-and-antigravity-cli-64743adceca3" rel="noopener noreferrer"&gt;Google Omni Flash Preview with MCP and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Codex CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Codex to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call the Omni models. Native MCP support in Codex opens up a new pathway to call the underlying Omni model.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Codex 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/omni-flash-video-agent-codex
&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;omni-flash-video-agent-codex
&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;omni-flash-video-agent-codex
&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;
  
  
  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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-codex&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-codex&lt;span class="nv"&gt;$ &lt;/span&gt;make lint
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
All checks passed!
ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
4 files already formatted
mypy &lt;span class="nb"&gt;.&lt;/span&gt;
Success: no issues found &lt;span class="k"&gt;in &lt;/span&gt;4 &lt;span class="nb"&gt;source &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Codex CLI MCP Config
&lt;/h4&gt;

&lt;p&gt;A sample MCP config file:&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;[mcp_servers.omni-video-agent]&lt;/span&gt;
&lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/home/xbill/.pyenv/shims/python"&lt;/span&gt;
&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"/home/xbill/omni-flash-video-agent-codex/server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Validation with Codex CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Codex 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

🔌 MCP Tools

  • codex_apps
    • Auth: Bearer token
    • Tools: (none)

  • omni-video-agent
    • Auth: Unsupported
    • Tools: animate_image, edit_user_video, edit_video, generate_video, generate_with_subjects, get_help,
    interpolate_images, upload_to_youtube
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Omni Video Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing the Omni Video calls.&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;• get_help returns the project’s inline guide for the Gemini Omni Flash Video Agent.

  Available tools:

  1. generate_video
  2. edit_video
  3. animate_image
  4. interpolate_images
  5. generate_with_subjects
  6. edit_user_video
  7. upload_to_youtube
  8. get_help

  Delivery modes:

  - inline: base64 video data, best for small clips under 4 MB.
  - uri: Google File API delivery, recommended for larger clips.

  Prompting guidance:

  - Describe scene layout, subjects, clothing, and spatial arrangement.
  - Be specific about subject movement.
  - Include camera motion like pan, tracking shot, crane shot, or slow zoom.
  - Specify lighting and mood.
  - State the visual style clearly.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the MCP tools are now available for working with the Omni models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use the mcp tool generate_video to create a video of the kiro ghost in a futuristic data center


https://www.youtube.com/watch?v=qpXWySOHFSQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qpXWySOHFSQ"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;omni-video-&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;agent.edit_video(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"previous_interaction_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"v1_ChdheWxKYXVEaUJmQzVzT0lQbG9haTJRSRIXYXlsSmF1RGlCZkM1c09
        JUGxvYWkyUUk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"edit_prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Edit the existing video to add a small friendly nano banana companion
        beside the Codex mascot. Make it a cute futuristic banana-shaped AI sidekick with tiny glowing eyes,
        polished yellow-and-silver materials, subtle circuit-line details, and a gentle hovering motion. Keep
        the original futuristic data center, holographic code panels, lighting, camera movement, and Codex
        mascot consistent. The companion should appear naturally in the scene, floating alongside the mascot
        and reacting as the mascot orchestrates streams of light. High-detail photorealistic 3D animation, warm
        futuristic tone, no text overlays, no logos, no watermarks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"delivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"inline"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;🟢&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;successfully&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/edit_&lt;/span&gt;&lt;span class="mi"&gt;1783181125&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Delivery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mode:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inline&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdheWxKYXVEaUJmQzVzT&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;lQbG&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;haTJRSRIXUkM&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;SmFwT&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;hJcEs&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;MU&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;rUDRPcmR&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;UW&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;https://www.youtube.com/watch?v=dIaWhrJR&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;vA&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/dIaWhrJR0vA"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Called&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;omni-video-agent.animate_image(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"image_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/omni-flash-video-agent-codex/
        gen_1783111489_1ac76ec9.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"motion_prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Animate this image into a cinematic 10-second video.
        Preserve the original subject, composition, style, colors, and lighting. Add subtle lifelike motion
        appropriate to the scene, gentle parallax depth, soft atmospheric movement, and a smooth slow camera
        push-in. Keep the animation polished and natural with no text overlays, no logos, and no
        watermarks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"delivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"inline"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;🟢&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;successfully&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/animated_&lt;/span&gt;&lt;span class="mi"&gt;1783181403&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Delivery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mode:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inline&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdXVEJKYXYzVk&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;aUEFzT&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;lQeV&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;YeXVROBIXV&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;RCSmF&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;M&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;ZNWlBBc&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;JUHlfWHl&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;UTg&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;animation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;succeeded.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;I’ll&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;size.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Explored&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;animated_&lt;/span&gt;&lt;span class="mi"&gt;1783181403&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Animated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;here:&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;animated_&lt;/span&gt;&lt;span class="mi"&gt;1783181403&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdXVEJKYXYzVk&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;aUEFzT&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;lQeV&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;YeXVROBIXV&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;RCSmF&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;M&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;ZNWlBBc&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="err"&gt;JUHlfWHl&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;UTg&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;Size:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MB.&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;span class="err"&gt;https://www.youtube.com/watch?v=WlKzO-r_HYw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WlKzO-r_HYw"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interpolate_images&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;banana.jpg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Codex.jpg&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Called&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;omni-video-agent.interpolate_images(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"start_image_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/omni-flash-video-agent-codex/
        banana.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"end_image_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/omni-flash-video-agent-codex/codex.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Create a
        smooth cinematic 10-second interpolation transition from the banana image to the Codex image. Preserve
        the visual style and lighting continuity while the first image gradually transforms into the second.
        Add subtle parallax depth, gentle camera motion, soft atmospheric lighting, and a polished futuristic
        transition feel. No text overlays, no logos, no watermarks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"delivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"inline"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;🟢&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;successfully&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/interpolation_&lt;/span&gt;&lt;span class="mi"&gt;1783181661&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Delivery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mode:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inline&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdXekZKYXBMX&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;pKYTAxTWtQX&lt;/span&gt;&lt;span class="mi"&gt;015&lt;/span&gt;&lt;span class="err"&gt;Q&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;FRbxIXV&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;pGSmFwTF&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;KSmEwMU&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;rUF&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;NeUNxUW&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interpolation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;succeeded.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;I’ll&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;verify&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;generated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MP&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;size.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Explored&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interpolation_&lt;/span&gt;&lt;span class="mi"&gt;1783181661&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Interpolation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;here:&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;interpolation_&lt;/span&gt;&lt;span class="mi"&gt;1783181661&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdXekZKYXBMX&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;pKYTAxTWtQX&lt;/span&gt;&lt;span class="mi"&gt;015&lt;/span&gt;&lt;span class="err"&gt;Q&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;FRbxIXV&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;pGSmFwTF&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;KSmEwMU&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;rUF&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;NeUNxUW&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;Size:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MB.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;https://www.youtube.com/watch?v=rGshv&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="err"&gt;b&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;Qg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/rGshv20b1Qg"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Called&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;generated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cinematic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;interpolation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;transitioning&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;banana&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;into&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Codex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;smooth&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;motion,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;parallax&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;depth,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;atmospheric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;lighting.&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="err"&gt;category_id&lt;/span&gt;&lt;span class="s2"&gt;":"&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="err"&gt;privacy_status&lt;/span&gt;&lt;span class="s2"&gt;":"&lt;/span&gt;&lt;span class="err"&gt;public&lt;/span&gt;&lt;span class="s2"&gt;"})
• I’ll use both images as subject references and generate a new scene featuring them together.

◦ Calling
  └ omni-video-agent.generate_with_subjects({"&lt;/span&gt;&lt;span class="err"&gt;subject_image_paths&lt;/span&gt;&lt;span class="s2"&gt;":["&lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;banana.jpg&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/codex.jpg&lt;/span&gt;&lt;span class="s2"&gt;"],"&lt;/span&gt;&lt;span class="err"&gt;prompt&lt;/span&gt;&lt;span class="s2"&gt;":"&lt;/span&gt;&lt;span class="err"&gt;Create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cinematic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;second&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;featuring&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;both&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;referenced&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;subjects&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;together:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;banana&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;companion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Codex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mascot.&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;Preserve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;their&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;recognizable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;visual&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;identities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;reference&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;images.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Place&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;them&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;futuristic&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;center&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;transparent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;racks,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;flowing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;blue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;green&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;streams,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;holographic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;panels,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;polished&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;reflective&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;floors,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;warm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;volumetric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;lighting.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Codex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mascot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;walks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;confidently&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;banana&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;companion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;hovers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;playfully&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;beside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;reacting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;streams&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;light&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;they&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;move&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;through&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;scene.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Smooth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tracking&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;camera&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;motion,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;high-detail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;photorealistic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;D&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;animation,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;polished&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;futuristic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tone,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;overlays,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;logos,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;watermarks.&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="err"&gt;delivery&lt;/span&gt;&lt;span class="s2"&gt;":"&lt;/span&gt;&lt;span class="err"&gt;inline&lt;/span&gt;&lt;span class="s2"&gt;"})


https://www.youtube.com/watch?v=CYcNQaVxldA
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CYcNQaVxldA"&gt;
  &lt;/iframe&gt;
&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Called&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;omni-video-agent.edit_user_video(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"video_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"/home/xbill/omni-flash-video-agent-codex/
        subject_1783181961.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"edit_prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Restyle this video into a richly detailed steampunk version
        while preserving the Codex mascot, banana companion, main composition, motion, and timing. Transform
        the futuristic data center into a brass-and-copper steampunk machine room with glowing vacuum tubes,
        exposed gears, analog gauges, polished pipes, warm amber lighting, steam wisps, and Victorian
        industrial details. Keep the scene cinematic, high-detail, and polished. No text overlays, no logos, no
        watermarks."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"delivery"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"inline"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;🟢&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Video&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;successfully&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;saved!&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Saved&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/home/xbill/omni-flash-video-agent-codex/user_edit_&lt;/span&gt;&lt;span class="mi"&gt;1783182179&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Delivery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;mode:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;inline&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdZak&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;KYXJ&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;QkdmNkQtOFlQd&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="err"&gt;qT&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="err"&gt;BRRIXWWpOSmFyeUJHZjZELThZUHdOak&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;vQUU&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Explored&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;└&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;List&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;user_edit_&lt;/span&gt;&lt;span class="mi"&gt;1783182179&lt;/span&gt;&lt;span class="err"&gt;.mp&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;Interaction&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ID:&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;v&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;_ChdZak&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;KYXJ&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="err"&gt;QkdmNkQtOFlQd&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="err"&gt;qT&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="err"&gt;BRRIXWWpOSmFyeUJHZjZELThZUHdOak&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="err"&gt;vQUU&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="err"&gt;Size:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MB.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;─&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Worked&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;───────────────────────────────────────────────────────────────────────────────────────────&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;•&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;https://www.youtube.com/watch?v=F&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;zymvxCFyk&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/F8zymvxCFyk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Codex CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Omni and Codex 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 Codex CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to interact with the Omni models.&lt;/p&gt;

</description>
      <category>omniflash</category>
      <category>xcode</category>
      <category>aivideogenerator</category>
      <category>mcpserver</category>
    </item>
    <item>
      <title>Nano Banana 2 Lite with Claude Code</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Sat, 04 Jul 2026 03:09:53 +0000</pubDate>
      <link>https://dev.to/gde/nano-banana-2-lite-with-claude-code-4n6l</link>
      <guid>https://dev.to/gde/nano-banana-2-lite-with-claude-code-4n6l</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Nano Banana 2 Lite and underlying Gemini LLM with Claude Code CLI to enhance and extend image operations over the MCP protocol.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7f88moq8pa3afuiwtxnr.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7f88moq8pa3afuiwtxnr.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Nano Banana 2 Lite?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Nano Banana 2 Lite&lt;/strong&gt; (officially known as the &lt;strong&gt;Gemini 3.1 Flash-Lite Image&lt;/strong&gt; model) is Google’s fastest and most cost-efficient AI image generation and editing model. It is built specifically for enterprises and developers who need to generate high-quality images quickly and affordably at a large scale. [&lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://9to5google.com/2026/06/30/notebooklm-short-video-overviews/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-Fast Latency:&lt;/strong&gt; Capable of generating high-quality images in about 4 seconds. [&lt;a href="https://blog.google/innovation-and-ai/technology/ai/nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Efficient Pricing:&lt;/strong&gt; Priced at approximately $0.034 per 1,000 images in Google AI Studio, undercutting standard models and previous versions. [&lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-World Grounding:&lt;/strong&gt; Integrates with Google Web and Image Search to produce highly accurate visuals based on real-world information, such as live weather data and exact global locations. [&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro-Level Editing:&lt;/strong&gt; Allows for nuanced image-editing capabilities, aspect ratio control, and text rendering/translation directly onto images. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Consistency:&lt;/strong&gt; Retains the fidelity of subjects across multiple generations and scenarios, making it highly effective for storyboarding and marketing campaigns. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/bringing-nano-banana-2-to-enterprise" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite-image" rel="noopener noreferrer"&gt;Gemini 3.1 Flash-Lite Image (Nano Banana 2 Lite) | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/nano-banana-2-lite-with-mcp-and-antigravity-cli-606e13ae6501" rel="noopener noreferrer"&gt;Nano Banana 2 Lite with MCP, and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Claude Code CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Claude Code to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call models. Native MCP support in Claude Code opens up a new pathway to call the underlying Nano Banana model.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;but wait — there’s more!&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Claude Code 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/nb2lite-claude
&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;nb2lite-claude
&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;nb2lite-claude
&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;
  
  
  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 make"&gt;&lt;code&gt;&lt;span class="err"&gt;make&lt;/span&gt; &lt;span class="err"&gt;install&lt;/span&gt;
&lt;span class="err"&gt;pip&lt;/span&gt; &lt;span class="err"&gt;install&lt;/span&gt; &lt;span class="err"&gt;-r&lt;/span&gt; &lt;span class="err"&gt;requirements.txt&lt;/span&gt;
&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:~/nb2lite-claude$&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 .
2 files already formatted
mypy .
Success: no issues found in 2 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Validation with Claude Code CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses the 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; Manage MCP servers
   3 servers
   Project MCPs (/Users/xbill/nb2lite-claude/.mcp.json)                
❯ nb2lite-agent · ✔ connected · 4 tools                                      

   Status: ✔ connected
   Command: python3
   Args: /Users/xbill/nb2lite-claude/server.py                 
 Config location: /Users/xbill/nb2lite-claude/.mcp.json  
              Capabilities: tools                                                          
Tools: 4 tools

▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔Tools for nb2lite-agent 4 tools                                                                      
   ❯ 1. generate_image
     2. edit_image
     3. edit_local_image
   ❯ 4. get_help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the tools are reviewed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ list the mcp tools for nb2lite

The nb2lite-agent MCP server exposes 4 tools:

1. generate_image — generates a new image from a text prompt (with aspect_ratio and thinking_level options)
2. edit_image — edits a previously generated image by its interaction ID, given a natural-language edit prompt
3. edit_local_image — edits a local image file on disk using a text prompt
4. get_help — returns help text summarizing the server's config and available tools

✻ Baked for 5s


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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Enough, Already! Show me the Money!
&lt;/h4&gt;

&lt;p&gt;Claude Code CLI was started up for a hands-on image editing session:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fog82k9kgv7ls1xsf35vt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fog82k9kgv7ls1xsf35vt.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Bananas?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use the mcp tools to edit gen_1782921715_ec8088ac.jpg and make the ghost banana a ghost apple

❯ use the nb2lite mcp tools to make edit_local_1783132225_f3d7a0f5.jpg an apple

  Searched for 1 pattern

I'm locating the file edit_local_1783132225_f3d7a0f5.jpg on disk before editing it.

  Read 1 file, called nb2lite-agent

Edited and saved to /Users/xbill/nb2lite-claude/edit_local_1783133920_af24af48.jpg — a pixel-art yellow apple with stem/leaf, keeping the same eyes/style.
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwozkvc5iyluebxoxzmb.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftwozkvc5iyluebxoxzmb.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Apples?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
❯ use the nb2lite mcp tools with v1_ChczM1pJYXNtVkNmNkQtOFlQd05qT29BRRIXaVhkSWF1Q09KZjZELThZUHdOak9vQUU interaction id - make it a pinapple

  Read 1 file, called nb2lite-agent

Saved to /Users/xbill/nb2lite-claude/edit_1783134165_02f7567c.jpg.

Interaction ID: v1_ChczM1pJYXNtVkNmNkQtOFlQd05qT29BRRIXMVhkSWF0R0xFNHp3anJFUHZiLXYtQTg
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ez5m6x1nis3sif2z85j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ez5m6x1nis3sif2z85j.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One last example — the banner for this article was re-themed in steam-punk style:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ use the mcp tools to make the banana pixel image steampunk

  Read 1 file, called nb2lite-agent

Saved to /Users/xbill/nb2lite-claude/edit_1783134280_c49290eb.jpg — Clawd now has brass gears, rivets, goggle-eyes, and mechanical joints, still holding the banana. Interaction ID: v1_Chc2blJJYXRfUEJkYWYtOFlQN002bnFRMBIXUjNoSWFydmROYTJhOU1vUG5vdWhvUXc
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy58mh90gvcsuoikadpz.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy58mh90gvcsuoikadpz.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Claude Code CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Nano Banana 2 Lite and Claude Code 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 the CLI running as a MCP client in the same local environment.&lt;/p&gt;

&lt;p&gt;This MCP Python server provided all of the management tools to interact with the model and generate high quality cyberpunk banana images.&lt;/p&gt;

</description>
      <category>mcps</category>
      <category>claudecode</category>
      <category>nanobanana</category>
      <category>cli</category>
    </item>
    <item>
      <title>Nano Banana 2 Lite with Codex</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Sat, 04 Jul 2026 02:14:56 +0000</pubDate>
      <link>https://dev.to/gde/nano-banana-2-lite-with-codex-34ge</link>
      <guid>https://dev.to/gde/nano-banana-2-lite-with-codex-34ge</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Nano Banana 2 Lite and underlying Gemini LLM with Codex CLI to enhance and extend image operations over the MCP protocol.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3ijwpp0fh03f57ctkzx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb3ijwpp0fh03f57ctkzx.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Nano Banana 2 Lite?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Nano Banana 2 Lite&lt;/strong&gt; (officially known as the &lt;strong&gt;Gemini 3.1 Flash-Lite Image&lt;/strong&gt; model) is Google’s fastest and most cost-efficient AI image generation and editing model. It is built specifically for enterprises and developers who need to generate high-quality images quickly and affordably at a large scale. [&lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://9to5google.com/2026/06/30/notebooklm-short-video-overviews/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-Fast Latency:&lt;/strong&gt; Capable of generating high-quality images in about 4 seconds. [&lt;a href="https://blog.google/innovation-and-ai/technology/ai/nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Efficient Pricing:&lt;/strong&gt; Priced at approximately $0.034 per 1,000 images in Google AI Studio, undercutting standard models and previous versions. [&lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-World Grounding:&lt;/strong&gt; Integrates with Google Web and Image Search to produce highly accurate visuals based on real-world information, such as live weather data and exact global locations. [&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro-Level Editing:&lt;/strong&gt; Allows for nuanced image-editing capabilities, aspect ratio control, and text rendering/translation directly onto images. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Consistency:&lt;/strong&gt; Retains the fidelity of subjects across multiple generations and scenarios, making it highly effective for storyboarding and marketing campaigns. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/bringing-nano-banana-2-to-enterprise" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite-image" rel="noopener noreferrer"&gt;Gemini 3.1 Flash-Lite Image (Nano Banana 2 Lite) | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/nano-banana-2-lite-with-mcp-and-antigravity-cli-606e13ae6501" rel="noopener noreferrer"&gt;Nano Banana 2 Lite with MCP, and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Claude Code CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Codex to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call models. Native MCP support in Codex opens up a new pathway to call the underlying Nano Bananna model.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integrating Codex with Nano Banana 2 Flash Lite
&lt;/h4&gt;

&lt;p&gt;Pairing Codex with Nano Banana 2 Lite expands the agent’s core capabilities, allowing it to act on multimodal inputs and execute complex tasks on your behalf.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;but wait — there’s more!&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&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="go"&gt;npx skills add google-gemini/gemini-skills --skill gemini-interactions-api
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Codex 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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd ~
git clone https://github.com/xbill9/nb2lite-codex
&lt;/span&gt;&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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd nb2lite-codex
source init.sh
&lt;/span&gt;&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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;cd nb2lite
source set_env.sh
&lt;/span&gt;&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;
  
  
  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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;make install
pip install -r requirements.txt
&lt;/span&gt;&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:~/nb2lite-codex$&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 .
2 files already formatted
mypy .
Success: no issues found in 2 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Codex MCP Config
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided:&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="err"&gt;m3:.codex&lt;/span&gt; &lt;span class="err"&gt;xbill$&lt;/span&gt; &lt;span class="err"&gt;more&lt;/span&gt; &lt;span class="err"&gt;config.toml&lt;/span&gt; 
  &lt;span class="nn"&gt;[mcp_servers.nb2lite-agent]&lt;/span&gt;
  &lt;span class="py"&gt;command&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/opt/homebrew/bin/python3"&lt;/span&gt;
  &lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"/Users/xbill/nb2lite-codex/server.py"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="py"&gt;enabled&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="py"&gt;env_vars&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"GEMINI_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"GOOGLE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nn"&gt;[mcp_servers.nb2lite-agent.tools.generate_image]&lt;/span&gt;
  &lt;span class="py"&gt;approval_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"approve"&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.nb2lite-agent.tools.get_help]&lt;/span&gt;
&lt;span class="py"&gt;approval_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"approve"&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.nb2lite-agent.tools.edit_image]&lt;/span&gt;
&lt;span class="py"&gt;approval_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"approve"&lt;/span&gt;

&lt;span class="nn"&gt;[mcp_servers.nb2lite-agent.tools.edit_local_image]&lt;/span&gt;
&lt;span class="py"&gt;approval_mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"approve"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Validation with Codex CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Codex 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

🔌 MCP Tools

  • codex_apps
    • Auth: Bearer token
    • Tools: (none)

  • nb2lite-agent
    • Auth: Unsupported
    • Tools: edit_image, edit_local_image, generate_image, get_help
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the tools are reviewed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
• nb2lite-agent exposes these MCP tools:

  - generate_image - generate a new image from a prompt.
  - edit_image - edit a previously generated image using its interaction ID.
  - edit_local_image - edit a local image file by path.
  - get_help - show server help, config, and tool details.

  Current model: gemini-3.1-flash-lite-image
  Output directory: /Users/xbill/nb2lite-codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the tools are now available for working with the Nano Banana2 Lite models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;› summarize the nblite mcp tools

• nb2lite-agent provides image generation and editing tools backed by Gemini.

  - generate_image: Creates a new image from a text prompt. Supports aspect ratios like 1:1,
    16:9, 9:16, 4:3, 3:4.

  - edit_image: Edits a previously generated image using its interaction_id, preserving session
    continuity.

  - edit_local_image: Edits an existing local image file from a filesystem path.
  - get_help: Returns server help, current config, and available tool details.

  Current setup:

  - Model: gemini-3.1-flash-lite-image
  - Output folder: /Users/xbill/nb2lite-codex
  - API key status: set


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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Enough, Already! Show me the Money!
&lt;/h4&gt;

&lt;p&gt;Codex CLI was started up for a hands-on image editing session:&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="go"&gt;› call mcp tool generate_image codex banana

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

&lt;/div&gt;



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

&lt;p&gt;Not a fan of Bananas?&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="go"&gt;› use the mcp tool edit_image make the banana an apple with Saved image:
    gen_1783125858_21c75be6.jpg

    Interaction ID:

    v1_ChdZVmRJYW9pRUhlX2FqckVQcnFPTC1BOBIXWVZkSWFvaUVIZV9hanJFUHJxT0wtQTg

• I’ll use edit_image with the interaction ID so the server edits the existing banana session
  into an apple while preserving the mascot style.

• Called
  └ nb2lite-
        agent.edit_image({"previous_interaction_id":"v1_ChdZVmRJYW9pRUhlX2FqckVQcnFPTC1BOBIXWVZ
        kSWFvaUVIZV9hanJFUHJxT0wtQTg","edit_prompt":"Transform the banana mascot into a playful
        futuristic Codex apple mascot. Preserve the same centered composition, polished
        stylized 3D illustration style, clean studio lighting, expressive friendly eyes, subtle
        software-engineering circuit-like markings, and tiny terminal charm. The subject should
        clearly be a bright apple instead of a banana. No text, no
        watermark.","thinking_level":"low"})
    🟢 Image successfully saved!
    • Saved to: /Users/xbill/nb2lite-codex/edit_1783126427_6b6cef2d.jpg
    • Interaction ID: v1_ChdZVmRJYW9pRUhlX2FqckVQcnFPTC1BOBIXbWxsSWFyNjhMWnpxanJFUHVkMnJxQVU

───────────────────────────────────────────────────────────────────────────────────────────────

• Edited successfully.

  Saved image:
  edit_1783126427_6b6cef2d.jpg

  New interaction ID:

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

&lt;/div&gt;



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

&lt;p&gt;Not a fan of Apples?&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;› use the mcp tool edit local image to make [Image #&lt;/span&gt;1] a pineapple
&lt;span class="go"&gt;
• I’ll use edit_local_image on the local file and ask it to convert the apple mascot into a
  pineapple while keeping the same pose, lab setting, and 3D Codex style.

• Called
  └ nb2lite-agent.edit_local_image({"image_path":"/Users/xbill/nb2lite-codex/
        edit_1783126427_6b6cef2d.jpg","edit_prompt":"Transform the apple mascot into a playful
        futuristic Codex pineapple mascot. Preserve the same centered composition, pose,
        friendly expression, polished stylized 3D illustration quality, clean sci-fi lab
        background, studio lighting, subtle software-engineering circuit-like markings, limbs,
        tiny terminal charm, and overall mascot feel. The subject should clearly be a pineapple
        with a golden textured pineapple body and green leafy crown instead of an apple. No
        text, no watermark.","aspect_ratio":"1:1","thinking_level":"low"})
    🟢 Image successfully saved!
    • Saved to: /Users/xbill/nb2lite-codex/edit_local_1783126589_39305f53.jpg
    • Interaction ID: v1_ChdQRnBJYXNUMUFZQ2JqckVQaXZDRXlBTRIXUEZwSWFzVDFBWUNianJFUGl2Q0V5QU0

───────────────────────────────────────────────────────────────────────────────────────────────

• Edited local image successfully.

  Saved image:
  edit_local_1783126589_39305f53.jpg

  Interaction ID:

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

&lt;/div&gt;



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

&lt;p&gt;One last example — the banner for this article was re-themed in steam-punk style:&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="go"&gt;› use the nblite mcp tools to retheme this as steam-punk: Saved image:
    gen_1783111489_1ac76ec9.jpg

    Interaction ID:

    v1_ChdRUjlJYW91b0NxT2dqckVQZzVhTS1RTRIXUVI5SWFvdW9DcU9nanJFUGc1YU0tUU0

• I’ll use the existing interaction ID with edit_image so the original Codex pet is rethemed
  into steampunk while keeping the same mascot identity and composition.

• Called
  └ nb2lite-
        agent.edit_image({"previous_interaction_id":"v1_ChdRUjlJYW91b0NxT2dqckVQZzVhTS1RTRIXUVI
        5SWFvdW9DcU9nanJFUGc1YU0tUU0","edit_prompt":"Retheme the existing Codex pet mascot as
        steampunk. Preserve the same main character identity, friendly expression, centered
        composition, compact companion-creature proportions, and polished stylized 3D
        illustration quality. Replace the futuristic software aesthetic with brass and copper
        mechanical details, tiny gears, rivets, leather straps, clockwork accents, warm amber
        glow, and subtle Victorian workshop atmosphere. Keep it approachable and memorable. No
        text, no watermark.","thinking_level":"low"})
    🟢 Image successfully saved!
    • Saved to: /Users/xbill/nb2lite-codex/edit_1783126855_06812b3a.jpg
    • Interaction ID: v1_ChdRUjlJYW91b0NxT2dqckVQZzVhTS1RTRIXUmx0SWFvdmFGYWl4MU1rUHNwMm53QW8

───────────────────────────────────────────────────────────────────────────────────────────────

• Rethemed successfully.

  Saved image:
  edit_1783126855_06812b3a.jpg

  Interaction ID:

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

&lt;/div&gt;



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

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Codex CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Nano Banana 2 Lite and Codex 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 Codex CLI running as a MCP client in the same local environment.&lt;/p&gt;

&lt;p&gt;This MCP Python server provided all of the management tools to interact with the model and generate high quality cyberpunk banana images.&lt;/p&gt;

</description>
      <category>python</category>
      <category>openaicodex</category>
      <category>nanobanana</category>
      <category>mcps</category>
    </item>
    <item>
      <title>Debugging Deployments with Gemma 2B, TPU v6e-4, MCP, and Antigravity CLI</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Fri, 03 Jul 2026 02:55:09 +0000</pubDate>
      <link>https://dev.to/gde/debugging-deployments-with-gemma-2b-tpu-v6e-4-mcp-and-antigravity-cli-539h</link>
      <guid>https://dev.to/gde/debugging-deployments-with-gemma-2b-tpu-v6e-4-mcp-and-antigravity-cli-539h</guid>
      <description>&lt;p&gt;This article provides a step by step debugging guide for deploying Gemma 4 to a Google Cloud TPU 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ljlv92emy3xvocukydy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ljlv92emy3xvocukydy.jpeg" width="800" height="800"&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 TPU. 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;&lt;span class="nb"&gt;cd &lt;/span&gt;tpu-2B-v6e4-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;tpu-2B-v6e4-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 shell"&gt;&lt;code&gt;xbill@penguin:~/gemma4-tips/tpu-2B-v6e4-devops-agent&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
Requirement already satisfied: mcp &lt;span class="k"&gt;in&lt;/span&gt; /home/xbill/.pyenv/versions/3.13.14/lib/python3.13/site-packages &lt;span class="o"&gt;(&lt;/span&gt;from &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;(&lt;/span&gt;line 1&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1.28.0&lt;span class="o"&gt;)&lt;/span&gt;
Requirement already satisfied: google-cloud-logging &lt;span class="k"&gt;in&lt;/span&gt; /home/xbill/.pyenv/versions/3.13.14/lib/python3.13/site-packages 
&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 shell"&gt;&lt;code&gt;xbill@penguin:~/gemma4-tips/tpu-2B-v6e4-devops-agent&lt;span class="nv"&gt;$ &lt;/span&gt;make lint
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
All checks passed!
ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
13 files already formatted
mypy &lt;span class="nb"&gt;.&lt;/span&gt;
Success: no issues found &lt;span class="k"&gt;in &lt;/span&gt;13 &lt;span class="nb"&gt;source &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;"tpu-2B-v6e4-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/tpu-2B-v6e4-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_REGION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"southamerica-east1"&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_ZONE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"southamerica-east1-c"&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="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ACCELERATOR_TYPE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v6e-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"TENSOR_PARALLEL_SIZE"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4"&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

Plugins (~/.gemini/config/plugins)
   ✓ google-dev-knowledge Tools: search_documents, answer_query, get_documents
   ✓ tpu-2B-v6e4-devops-agent Tools: verify_model_health, save_hf_token, get_vllm_deployment_config,
                               get_vllm_tpu_deployment_config, destroy_queued_resource, +26 more
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 markdown"&gt;&lt;code&gt;  Here are the MCP tools available for the Gemma 4 2B SRE/DevOps agent ( tpu-2B-v6e4-devops-agent ):

  ### 🐳 Infrastructure &amp;amp; Deployment

  • manage_queued_resource : Ensures the primary Queued Resource exists and cleans up redundant ones.
  • destroy_queued_resource : Safely deletes a Queued Resource and its node.
  • list_queued_resources : Lists all Queued Resources in a specific zone.
  • describe_queued_resource : Provides detailed information about a specific Queued Resource.
  • get_reservation_status : Checks the lifecycle state and expiry time of a Queued Resource.
  • check_tpu_availability : Checks if a Queued Resource has reached the ACTIVE state.
  • get_vllm_deployment_config : Generates the gcloud command for a single-host TPU v6e vLLM deployment.
  • get_vllm_tpu_deployment_config : Generates GKE manifests for TPU-based deployments.
  • manage_vllm_docker : Manages the vLLM Docker container on the TPU VM ( start , stop , restart , status , log ,
  and rm ).

  ### 📊 Observability &amp;amp; Logs

  • get_system_status : High-level status dashboard of TPU node health and the vLLM service.
  • get_vllm_endpoint / get_deployed_endpoint : Verifies connectivity and returns the active service URL.
  • get_metrics : Fetches raw Prometheus metrics from the running vLLM service's /metrics endpoint.
  • get_vllm_docker_logs : Retrieves logs from the vLLM Docker container on the TPU VM.
  • get_tpu_system_logs : Retrieves systemd logs for a specific service from the TPU VM.
  • get_cloud_logging_logs : Fetches logs from Google Cloud Logging.
  • analyze_cloud_logging : Summarizes TPU-related errors using the self-hosted Gemma 4 model.
  • get_model_details : Retrieves detailed information about the running model, vLLM engine, and versions.

  ### 📈 Diagnostics &amp;amp; Performance

  • query_queued_gemma4 : Queries the running Gemma 4 model on the TPU VM.
  • query_queued_gemma4_with_stats : Queries the model and returns performance/latency stats.
  • verify_model_health : Runs a deep logic check with latency reporting.
  • run_vllm_benchmark : Runs vLLM's internal benchmark tool inside the container on the TPU VM.
  • get_help : Provides configuration details and a tool summary.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Getting Started with Gemma 4 on TPU
&lt;/h4&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;p&gt;The Gemma 2B model was just released:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/google/gemma-2b" rel="noopener noreferrer"&gt;google/gemma-2b · Hugging Face&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Find and Start the TPU
&lt;/h4&gt;

&lt;p&gt;First check for available zones with quota:&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="o"&gt;&amp;gt;&lt;/span&gt; get_zones_with_available_quota
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- a zone with availability and Quota as found!&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; status

  Checking the southamerica-west1-a zone:

  • Queued Resource: vllm-gemma4-qr is ACTIVE 
  • TPU Node ID: vllm-gemma4-qr-node 
  • External IP: 34.176.47.5 
  • vLLM Service Status: 🟢 Online &amp;amp; Healthy
      • Endpoint: http://34.176.47.5:8000 
      • Model: google/gemma-4-E2B-it 
      • Verification: A chat completions test returned successfully ( "Hello! Yes, I am working..." ).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Review the Memory Layout
&lt;/h4&gt;

&lt;p&gt;The MCP server tools are used to review the model:&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="gt"&gt;&amp;gt; what is the memory layout&lt;/span&gt;
  Based on the server startup logs and JAX engine configurations, here is the detailed memory layout of the running
  Gemma 4 2B (E2B-it) model on the TPU v6e-4 (4 chips):

  ### 1. Model Weights (bfloat16)
  • Total Size: ~9.54 GiB
  • Precision: torch.bfloat16 
  • Sharding: 4-way Tensor Parallelism ( --tensor-parallel-size 4 ) sharded across the model mesh axis of the 4 TPU
  chips.
  ### 2. KV Cache Layout (FP8)

  • Precision: float8_e4m3fn (FP8 E4M3 format)
  • Number of Attention Layers: 15
  • Total Blocks Allocated: 18,523 blocks (each block handles 16 tokens across all heads/layers per TP shard,
  yielding a total capacity of 296,368 tokens).
  • Attention Shape per Block: (32, 4, 4, 256) 
  • Sharding Scheme: NamedSharding across the 4-chip mesh Mesh('data': 1, 'model': 4) using shard partition spec 
  P('data', None, 'model') .
  • HBM Footprint: Occupies ~12.53 GiB out of the 31.25 GiB HBM available on each of the 4 TPU chips.

────────────────────────────────────────────────────────────
&lt;span class="gt"&gt;&amp;gt; breakdown the 32GB TPU memory per chip and the use&lt;/span&gt;

  On a Cloud TPU v6e chip, there is 32 GB of physical High Bandwidth Memory (HBM), of which 31.25 GiB is usable.

  Here is the memory breakdown per chip for our running Gemma 4 2B deployment:

   Memory Component | Allocation per Chip | % of Total HBM | Description
  -----------------------------------|---------------------|----------------|----------------------------------------
   Model Weights | ~2.39 GiB | ~7.6% | The 9.54 GiB model weights in
                                     | | | bfloat16 sharded evenly across 4
                                     | | | chips using 4-way Tensor Parallelism.
   KV Cache | ~12.53 GiB | ~40.1% | 18,523 blocks in float8_e4m3fn (FP8)
                                     | | | format allocated for holding context
                                     | | | history.
   Workspace &amp;amp; Activation Scratchpad | ~16.33 GiB | ~52.3% | Reserved for dynamic activations
                                     | | | during forward passes (e.g.,
                                     | | | intermediate tensors, attention maps)
                                     | | | and JAX/XLA runtime compilation
                                     | | | overhead.
   Total Usable HBM | 31.25 GiB | 100% | The total addressable memory space per
                                     | | | TPU v6e chip.

  ### Key takeaways:

  • The FP8 KV Cache is the largest consumer of HBM: Since Gemma 4 models can handle very long context windows,
  allocating 40% of the HBM to the KV cache allows the model to process large batch sizes and sequence lengths
  without out-of-memory (OOM) errors.
  • Large Activation Margin: Setting --gpu-memory-utilization 0.4 ensures that JAX has over 16 GiB of free
  workspace memory per chip. This prevents memory fragmentation and OOMs during runtime execution of complex dynamic
  operations.&lt;span class="sb"&gt;


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

&lt;/div&gt;



&lt;p&gt;the key factors for deployment are what can be quantized:&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="gt"&gt;&amp;gt; what is quant in this model? weights? kv cache? fptype?&lt;/span&gt;

  Here is the quantization configuration currently active in this deployment:

   Component | Precision / Quantization | Details
  ----------------------|--------------------------|-----------------------------------------------------------------
   Model Weights | Unquantized ( bfloat16 ) | The weights are loaded in their native 16-bit brain floating
                        | | point format. Weight quantization (like FP8 weights) is
                        | | disabled.
   KV Cache | Quantized ( fp8_e4m3fn ) | The Key-Value cache is quantized to 8-bit floating point (E4M3
                        | | format: 1 sign bit, 4 exponent bits, 3 mantissa bits), cutting
                        | | the KV memory footprint in half.
   Computation (fptype) | bfloat16 | All active matrix multiplications and activations are computed
                        | | in 16-bit bfloat16 ; the KV cache tensors are dynamically
                        | | dequantized/quantized on-the-fly during attention computation.

&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 — 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

● tpu-2B-v6e4-devops-agent/verify_model_health(Verify model health via MCP) (ctrl+o to expand)

  The model health check via the MCP server has successfully passed!

  ### 📊 Verification Details

  • Status: PASSED / ONLINE ✅
  • Latency: 0.46 seconds
  • Response Output:
  │ "Hello! Yes, I am working. I am..."

  The server is fully functional and responsive, leveraging the optimized southamerica-west1-a deployment.

&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_model_details

● tpu-2B-v6e4-devops-agent/get_model_details(Get model details via MCP) (ctrl+o to expand)

  Here are the details for the running model and vLLM engine:

  ### 🧩 Model &amp;amp; vLLM Engine Details (http://34.176.47.5:8000)

  • Model ID: google/gemma-4-E2B-it 
  • Max Model Sequence Length: 16384 
  • vLLM Version: 0.23.1rc1.dev667+g9969466a5 (TPU-optimized nightly build)
  • Health Status: Healthy ✅
  • Process Resident Memory: ~2.96 GB (API server process resident memory on the host VM)
&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_help

● tpu-2B-v6e4-devops-agent/get_help(Get agent help information via MCP) (ctrl+o to expand)

  Here is the help documentation and active configuration for the SRE agent:

  ### 🛠️ TPU Gemma 4 SRE Agent Help &amp;amp; Configuration

  #### Current Configuration Environment Variables:

  • GOOGLE_CLOUD_PROJECT : aisprint-491218 (GCP Project ID)
  • GOOGLE_CLOUD_ZONE : southamerica-west1-a (TPU VM Zone)
  • GOOGLE_CLOUD_REGION : southamerica-west1 (TPU VM Region)
  • MODEL_NAME : google/gemma-4-E2B-it (Target Gemma 4 model)
  • ACCELERATOR_TYPE : v6e-4 (TPU type)
  • TENSOR_PARALLEL_SIZE : 4 (Tensor parallelism configuration)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check the Cloud TPU
&lt;/h4&gt;

&lt;p&gt;Once Deployed — the TPU is on the Google Cloud 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz0tw7qggek3phj8oyek.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyz0tw7qggek3phj8oyek.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; get_metrics

7.2k in | 502 out | 257 thinking
● Search(Search metrics for cache usage) (ctrl+o to expand)

  The Prometheus metrics have been successfully retrieved from the active vLLM service (
  http://34.176.47.5:8000/metrics ).

  Here are the key operational metrics:

  ### 📊 Key Performance Metrics

  • KV-Cache Usage: 0.0% ( vllm:kv_cache_usage_perc{...} 0.0 ) — Currently idle.
  • Running Requests: 0 ( vllm:num_requests_running{...} 0.0 )
  • Waiting Requests: 0 ( vllm:num_requests_waiting{...} 0.0 )

  ### 🖥️ Resource Utilization

  • API Process Resident Memory: ~2.96 GB ( process_resident_memory_bytes 2.961993728e+09 )
  • Virtual Memory Allocation: ~46.5 GB ( process_virtual_memory_bytes 4.651452416e+010 )
  • Open File Descriptors: 34 ( process_open_fds 34.0 )
  • Total CPU Process Time: 103.32 seconds ( process_cpu_seconds_total 103.32 )
&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 Gemma?

● tpu-2B-v6e4-devops-agent/query_queued_gemma4_with_stats(Query Gemma 4 with stats via MCP) (ctrl+o to expand)

  Here is the response from the self-hosted Gemma 4 model along with real-time performance statistics:

  ### 📊 Performance Statistics

  • Time to First Token (TTFT): 0.310s (extremely low latency)
  • Tokens per Second: 207.27 tokens/s (blazing fast throughput)
  • Total Generation Time: 2.689s 
  • Total Generated Tokens: ~493 
  ──────
  ### 💬 Model Response: "What is Gemma?"

  Gemma is a family of lightweight, state-of-the-art open models developed by Google DeepMind.

  Here's a breakdown of what that means and the key things to know about Gemma:

  ### 1. What Kind of Model Is It? (Large Language Model - LLM)

  At its core, Gemma is a Large Language Model (LLM). It has been trained on massive amounts of text and code data,
  allowing it to perform a wide variety of natural language processing tasks, such as:

  • Answering questions
  • Generating creative text (stories, poems, code)
  • Summarizing documents
  • Translating languages
  • Following instructions

  ### 2. Key Characteristics of Gemma

  • Open Weights: This is one of the most important features. "Open weights" means that the model's parameters are
  publicly available. This allows developers to inspect, fine-tune, and deploy the model on private infrastructure
  (like this Cloud TPU cluster) without relying on a third-party API.
  • Lightweight and Efficient: Gemma models are designed to be smaller and more efficient than Google's largest LLMs
  (like Gemini). This makes them fast to respond and cost-effective to serve.
  • State-of-the-Art Performance: Despite being lightweight, Gemma models maintain a high level of accuracy across
  various benchmarks, making them highly capable for their size.
  • Responsible AI Focus: Gemma models are developed with an emphasis on safety, alignment, and ethical AI practices.

  ### 3. The Gemma Family

  "Gemma" is a growing family of models released in different sizes (such as 2B, 9B, 27B, and now Gemma 4 variants)
  to suit different serving environments and compute configurations.

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

&lt;/div&gt;



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

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;  ### 📈 Highlight Metrics

  • Peak Serving Throughput: 232.14 req/s achieved at 1,024 concurrent users (with a 4-token context window).
  • High Efficiency Range: The TPU v6e-4 cluster operates at optimal efficiency between 256 and 512 concurrent users,
  maintaining throughput above 150 req/s up to 512 tokens of context.
  • HBM Protection: High-demand combinations (e.g., 1,024 users with 1,024+ context) were safely skipped as they
  exceeded the physical limit of the cluster's 296,368-token FP8 KV cache boundary, protecting the hardware from
  runtime OOMs.
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqww7wmlqr2a5hmsu85is.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqww7wmlqr2a5hmsu85is.png" width="800" height="534"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmefmvm614l9duhi8pfct.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmefmvm614l9duhi8pfct.png" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Comparison with Other Deployments
&lt;/h4&gt;

&lt;p&gt;Check the other models on the same TPU:&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="gt"&gt;&amp;gt; Comparing the Gemma 4 2B model's performance to the Gemma 4 4B and 12B model, both running on a Cloud TPU v6e-4&lt;/span&gt;
&lt;span class="p"&gt;
39.&lt;/span&gt;7k in | 3.5k out | 1.6k thinking
● Create(/home/xbill/.gemini/antigravity-cli/brain/d...7815b7be4/tpu_v6e4_model_size_comparison.md) (ctrl+o to expand)

  I have compiled the benchmark results for the different model sizes and generated a detailed model size comparison
  report (2B vs. 4B vs. 12B) on the Cloud TPU v6e-4 node:

  👉 tpu_v6e4_model_size_comparison.md

  ### 📊 Performance Scaling Highlights (at 8-token context):

  • 2B vs 4B Parity:
      • The 2B and 4B models demonstrate very similar peak serving throughput capacities, capping at 231.19 req/s 
      and 223.85 req/s respectively. Under high concurrency, both models behave as memory-bandwidth bound rather
      than compute-bound.
  • 12B Performance Saturation:
      • The 12B model's throughput peaks at 63.09 req/s (representing a ~73% drop in peak request capacity compared
      to the 2B/4B models). With ~6x more parameters, the workload transitions to a compute-bound state, saturating
      the TPU's matrix arithmetic cores.
  • KV Cache Capacity Limitations:
      • The 12B model requires ~24 GB of HBM for weights alone (compared to ~4 GB for 2B). Additionally, each token
      cached in the KV Cache has a larger memory footprint because of the model's larger hidden dimension size and
      attention head counts. This causes the physical token cache size limit to be reached much earlier under heavy
      concurrent requests.
────────────────────────────────────────────────────────────
&lt;span class="gt"&gt;&amp;gt; print tpu_v6e4_model_size_comparison.md&lt;/span&gt;

   📊 Model Size Comparison: Gemma 4 (2B vs. 4B vs. 12B) on Cloud TPU v6e-4 

  This report analyzes how the serving performance of Gemma 4 scales across different model parameter sizes (2B vs.
  4B vs. 12B) when running on the exact same hardware configuration: a Cloud TPU v6e-4 node.
  ──────
  ## 📈 Performance Summary Matrix (8-token Context Window)

  Here is a side-by-side comparison of the serving throughput (req/s) for the three models at a standard 8-token
  context length:

   Concurrency (Users) | Gemma 4 2B (req/s) | Gemma 4 4B (req/s) | Gemma 4 12B (req/s)
  ----------------------------|----------------------------|----------------------------|----------------------------
   1 User | 5.14 | 6.13 | 3.81
   4 Users | 12.52 | 15.56 | 11.86
   16 Users | 34.34 | 34.34 | 34.92
   64 Users | 101.45 | 101.45 | 54.11
   256 Users | 181.42 | 178.86 | 61.98
   512 Users | 222.82 | 202.80 | 63.09
   1024 Users | 231.19 | 223.85 | 61.33
   2048 Users | 173.50 | 176.67 | 62.10
  ──────
  ## 🔍 Key Performance Trends &amp;amp; Findings

  ### 1. Throughput vs. Model Size (Parameter Scaling)

  • 2B vs. 4B Performance Parity:
      • Interestingly, the 2B (E2B-it) and 4B (E4B-it) models show highly comparable peak performance, capping at 
&lt;span class="p"&gt;      231.&lt;/span&gt;19 req/s and 223.85 req/s respectively.
      • Because both models are relatively lightweight, their execution is mostly memory-bandwidth bound at high
      concurrency rather than compute-bound. The v6e-4's HBM bandwidth is sufficient to feed the MXUs for both sizes
      at almost identical rates.
  • 12B Performance Bottleneck (Parameter scaling drop):
      • In contrast, the 12B model's throughput peaks at only 63.09 req/s (representing a ~73% drop in peak
      throughput compared to the 2B/4B models).
      • The 12B model has ~6x more parameters than the 2B model, requiring 6x more floating-point operations (FLOPs)
      per token. The execution shifts from memory-bandwidth bound to compute-bound, saturating the TPU's matrix
      arithmetic units (MXUs) at a much lower request rate.

  ### 2. Concurrency Saturation Point
  • 2B &amp;amp; 4B Models: Continue scaling throughput up to 1,024 concurrent users before saturating and declining at 2,048
  users.
  • 12B Model: Reaches its saturation peak much earlier, at 256 to 512 concurrent users ( ~62–63 req/s ). Beyond 256
  users, the throughput remains flat as the TPU's compute cores are completely saturated.
  ### 3. HBM &amp;amp; KV Cache Footprint Differences

  • Weights memory footprint:
      • 2B: ~4 GB HBM
      • 4B: ~8 GB HBM
      • 12B: ~24 GB HBM
  • Loading the 12B model's 24 GB of weights leaves significantly less HBM available on the TPU chips for active
  request tracking (activations and KV Cache).
  • Furthermore, the size of each token in the KV Cache scales with the model's hidden dimension size and head count.
  Consequently, the 12B model's KV Cache entries are significantly larger, meaning the physical capacity limit (in
  total tokens) is reached much earlier, prompting vLLM to pause/queue new incoming requests sooner to avoid OOM
  conditions.

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

&lt;/div&gt;



&lt;p&gt;Check the same model across different TPU sizes:&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="gt"&gt;&amp;gt; print tpu_v6e4_vs_v6e1_comparison.md&lt;/span&gt;

   ⚖️ Benchmarking Comparison: TPU v6e-4 vs. TPU v6e-1 

  This report analyzes the serving performance differences for Gemma 4 2B (E2B-it) when scaling from a single-chip
  Cloud TPU v6e-1 node to a 4-chip Cloud TPU v6e-4 node.
  ──────
  ## 📊 Throughput Comparison Matrix (8-token Context Window)

  Below is the request throughput (req/s) comparison at a standard 8-token context window length across various user
  concurrencies:

   Concurrency (Users) | TPU v6e-1 (TP=1) | TPU v6e-4 (TP=4) | Throughput Scaling Factor
  ----------------------------|----------------------------|----------------------------|----------------------------
   1 User | 3.81 req/s | 5.14 req/s | 1.35x
   2 Users | 6.72 req/s | 8.32 req/s | 1.24x
   4 Users | 11.86 req/s | 12.52 req/s | 1.06x
   8 Users | 21.49 req/s | 16.49 req/s | 0.77x (TP overhead)
   16 Users | 34.92 req/s | 34.34 req/s | 0.98x
   32 Users | 58.22 req/s | 58.07 req/s | 1.00x
   64 Users | 64.66 req/s | 101.45 req/s | 1.57x
   128 Users | 71.86 req/s | 140.37 req/s | 1.95x
   256 Users | 72.39 req/s | 181.42 req/s | 2.51x
   512 Users | 70.12 req/s | 222.82 req/s | 3.18x
   1024 Users | 72.83 req/s | 231.19 req/s | 3.17x
   2048 Users | 71.43 req/s | 173.50 req/s | 2.43x
  ──────
  ## 🔍 Key Insights &amp;amp; Architectural Analysis

  ### 1. Scaling Saturation &amp;amp; Peak Throughput (3.2x Gain)

  • TPU v6e-1 (Single Chip): Capped and saturated very early at around 72 req/s starting from 128 concurrent users.
  The single chip's Memory Bandwidth and Matrix Multiply Units (MXUs) reached full saturation.
  • TPU v6e-4 (4 Chips): Scaled continuously, peaking at 231.19 req/s (at 1024 users) — representing a 3.17x 
  increase in throughput. Sharding the execution across 4 chips via Tensor Parallelism ( --tensor-parallel-size 4 )
  effectively unlocks the aggregate bandwidth of all 4 chips.

  ### 2. Low Concurrency Overhead (TP Latency Tradeoff)

  • At low concurrencies (specifically around 8 to 32 users), the TPU v6e-1 matches or slightly outperforms the v6e-4.
  • This is a classic distributed systems tradeoff: when the compute request is small, the inter-chip communication
  overhead (performing All-Reduce operations over ICI links across 4 chips) outweighs the parallelization benefits.
  • However, as the concurrency load increases, parallel computation capacity dominates, and the v6e-4 scales
  aggressively.

  ### 3. Memory &amp;amp; KV Cache Limits

  • v6e-1: The single-chip architecture limits the physical KV Cache size. Under high load, requests must wait
  earlier due to block constraints.
  • v6e-4: Spanning across 4 chips aggregates HBM (128GB vs 32GB), allowing vLLM to maintain a much larger pool of
  active context blocks. This extends the limit of concurrent active contexts without triggering capacity blocks.

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

&lt;/div&gt;



&lt;p&gt;what about Cross TPU / Cross Gemma model?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;   ⚖️ Unified Comparison: Gemma 4 (2B, 4B, 12B) across TPU v6e-1 and TPU v6e-4 

  This comparison analyzes performance scaling characteristics of the Gemma 4 family across two major variables:
  Model Parameter Size (2B vs. 4B vs. 12B) and TPU Chip Topology (single-chip v6e-1 vs. 4-chip v6e-4).
  ──────
  ## 📊 Peak Throughput Matrix (req/s at 8-token context)

  The table below outlines peak throughput achievements for each model size served on both TPU architectures:

   Model Size | TPU v6e-1 (1 Chip, TP=1) | TPU v6e-4 (4 Chips, TP=4) | Scaling Factor (v6e-1 → v6e-4)
  ---------------------------|--------------------------|---------------------------|--------------------------------
   Gemma 4 2B | 72.83 req/s | 231.19 req/s | 3.17x
   Gemma 4 4B | 64.66 req/s | 223.85 req/s | 3.46x
   Gemma 4 12B | 22.01 req/s | 63.09 req/s | 2.87x
  ──────
  ## 🔍 Key Insights &amp;amp; Architectural Trends

  ### 1. Scaling Factors by Model Size

  • 2B and 4B Models: Both models scale beautifully when moving from v6e-1 to v6e-4, achieving over 3.1x to 3.4x 
  throughput gains. Because they are lightweight, distributing their weight sharding across 4 chips leverages the
  full aggregate memory bandwidth of the cluster.
  • 12B Model: Scaling is slightly lower at 2.87x . The 12B model's execution becomes compute-bound at lower
  concurrencies, and the communication cost of inter-chip tensor sharding (performing All-Reduce matrix operations
  over ICI links) begins to consume a larger fraction of runtime.

  ### 2. The Efficiency Sweet Spot

  • TPU v6e-1 (Single Chip): Ideal for smaller workloads and low concurrencies. Because there is no inter-chip
  communication latency (Tensor Parallelism = 1), single-user response times are extremely snappy. However, it
  saturates quickly under load (capping at ~72 req/s for 2B).
  • TPU v6e-4 (4-chip Topology): Best suited for high-density, high-concurrency production endpoints. It successfully
  shifts the saturation bottleneck out to 1,024 concurrent users, enabling massive scale-up.

  ### 3. KV Cache &amp;amp; HBM Protection Boundaries

  • As the model size increases, the physical limit of the KV cache decreases due to the space taken by model weights
  in HBM:
      • 2B Model: Leaves ~112GB HBM for KV Cache, allowing up to 296,368 tokens active capacity.
      • 12B Model: Weights occupy 24GB, leaving less cache space and having larger per-token tensor dimensions,
      limiting active concurrent tokens and causing earlier queue limits.
  • Enabling FP8 ( float8_e4m3fn ) KV Cache is highly recommended on both TPU architectures to prevent early out-of-
  memory (OOM) failures under heavy concurrency.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  Deep Dive on Inference Issues
&lt;/h4&gt;

&lt;p&gt;Now that several configurations and runs have been performed with various model sizes and TPUs — summarize the key issues with Inference:&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="gt"&gt;&amp;gt; what are the key inference issues&lt;/span&gt;

  When serving the Gemma 4 family on Cloud TPUs via vLLM, the key inference-specific issues center around memory
  bottlenecks, compute distribution, and hardware utilization characteristics:
  ──────
  ### 1. KV Cache Memory Scaling &amp;amp; Capacity Limits

  • Static Block Allocation: vLLM pre-allocates the KV cache memory footprint at startup. Setting the memory
  utilization parameters too high causes the compiler (XLA/JAX) to OOM before inference even starts.
  • Preemption &amp;amp; Block Queuing: For the 2B model on TPU v6e-4 (TP=4), the cache is capped at 296,368 tokens. When
  concurrent user prompts exceed this capacity:
      • vLLM is forced to queue incoming requests.
      • In worse cases, it initiates preemption (evicting active requests from the cache and recomputing them later),
      causing significant tail-latency spikes.

  ──────
  ### 2. Prefill (Compute-Bound) vs. Decode (Memory-Bandwidth Bound)

  • Prefill Phase (TTFT): Processing the input prompt is highly compute-intensive. Large prompt windows (8K to 16K)
  saturate the TPU’s Matrix Multiply Units (MXUs).
  • Decode Phase (TPOT): Generating tokens sequentially is highly memory-bandwidth bound. Because only one token is
  processed at a time, the TPU’s MXUs remain underutilized, and performance is gated entirely by how fast weights can
  be read from High Bandwidth Memory (HBM).
  ──────
  ### 3. Tensor Parallelism (TP) Latency Overhead

  • Communication Latency: Sharding the model across 4 chips (TP=4) requires an All-Reduce operation at the end of
  every attention layer to sync token states across the Inter-Chip Interconnect (ICI) bus.
  • Small Batch Bottleneck: For low concurrency (1–32 users), the computation per step is so small that the time
  spent passing data between chips over the ICI bus exceeds the actual calculation time, capping low-concurrency
  throughput.
  ──────
  ### 4. Precision &amp;amp; Quantization Gaps

  • Post-Training Quantization (PTQ) Limitations: vLLM's JAX compiler does not support dynamic runtime weight
  quantization ( --quantization fp8 ) for Gemma 4 architectures on TPUs. SREs must run weights in native bfloat16 
  (costly) or use pre-trained QAT (Quantization Aware Training) checkpoints.
  • FP8 KV Cache Tradeoffs: Quantizing the KV cache to FP8 ( float8_e4m3fn ) doubles active token capacity and raises
  throughput but can introduce slight accuracy degradation or formatting slip-ups in complex reasoning tasks.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  And the winner is…
&lt;/h4&gt;

&lt;p&gt;So which model and which hardware is best for the job?&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="gt"&gt;&amp;gt; what are high level recommendations for choosing the model and TPU for inference?&lt;/span&gt;

  I have generated a high-level strategic decision framework for choosing the correct Gemma 4 model size and Cloud
  TPU topology for your inference deployments:

  👉 tpu_inference_recommendations.md
  ──────                                                                                                             
  ## 🎯 Quick Selection Matrix

   Workload Characteristics | Recommended Mod… | Recommended TPU To… | Key Serving Configuration
  -----------------------------|------------------|---------------------|--------------------------------------------
   Low Traffic / Dev / Testing | Gemma 4 2B or 4B | TPU v6e-1 (1 Chip) | --tensor-parallel-size 1 
   High Concurrency Production | Gemma 4 2B or 4B | TPU v6e-4 (4 Chips) | --tensor-parallel-size 4 , --kv-cache-
                               | | | dtype fp8 
   Agentic / Complex Reasoning | Gemma 4 12B | TPU v6e-4 (4 Chips) | --tensor-parallel-size 4 , --max-model-
                               | | | len 16384 
  ──────
  ## 🔍 Key Decision Drivers

  ### 1. Choosing the Model Size (2B vs. 4B vs. 12B)

  • Select 2B / 4B (E2B-it / E4B-it) for Speed &amp;amp; Scale:
      • Both sizes perform similarly, peaking at ~220–230 req/s on v6e-4.
      • Choose these for high-throughput tasks like SRE log scanning, simple classifications, and high-concurrency
      chat systems.
  • Select 12B for High-Fidelity Reasoning:
      • Throughput drops by ~73% (peaking at ~63 req/s ).
      • Choose this only when the task requires complex multi-step reasoning, agentic tool-calling, or deep code
      analysis that the smaller models cannot reliably handle.

  ### 2. Choosing the TPU Topology (v6e-1 vs. v6e-4)

  • Select TPU v6e-1 (Single Chip, 32GB HBM) for Cost &amp;amp; Low-Traffic Efficiency:
      • No Inter-Chip Latency: Runs with Tensor Parallelism = 1. Single-user requests do not suffer from network sync
      overhead, making v6e-1 highly efficient for low-traffic endpoints (1–32 users).
      • Cost-Efficient: Ideal for sandbox environments or batch inference.
  • Select TPU v6e-4 (4 Chips, 128GB HBM) for Production Scale:
      • Aggregate Bandwidth: Sharding the model across 4 chips shifts the saturation barrier from 128 users to 1,024
      users, boosting peak throughput by 3.2x .
      • Large Cache Pool: Aggregates HBM to host up to 296,368 tokens active KV cache capacity, preventing early
      request queuing under heavy concurrent user spikes.

  ──────
  ## ⚙️ Baseline Production Serving Configurations

  For all TPU production setups, ensure the following parameters are passed to vLLM:
&lt;span class="p"&gt;
  1.&lt;/span&gt; --kv-cache-dtype fp8 : Mandated to double context cache capacity and prevent OOMs.
&lt;span class="p"&gt;  2.&lt;/span&gt; --max-model-len 16384 : Optimized maximum context window size for Gemma 4 architectures.
&lt;span class="p"&gt;  3.&lt;/span&gt; --tool-call-parser gemma4 --enable-auto-tool-choice : Required for native agentic tool execution.

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

&lt;/div&gt;



&lt;h4&gt;
  
  
  One last review
&lt;/h4&gt;

&lt;p&gt;What about best practices for Inference?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   🛠️ Operational SRE Best Practices: Gemma 4 on Cloud TPUs 

  This document outlines the core configuration guidelines, network routing strategies, and lifecycle management
  rules required to maintain a highly available, high-performance Gemma 4 serving stack on Cloud TPUs using vLLM.
  ──────
  &lt;span class="c"&gt;## 1. Serving Parameters (The Production Baseline)&lt;/span&gt;

  To ensure optimal throughput, memory safety, and tool-calling stability, always initialize the vLLM API server with
  the following arguments:

    python3 &lt;span class="nt"&gt;-m&lt;/span&gt; vllm.entrypoints.openai.api_server &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--model&lt;/span&gt; google/gemma-4-E2B-it &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 4 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 16384 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--max_num_batched_tokens&lt;/span&gt; 4096 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--disable_chunked_mm_input&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--kv-cache-dtype&lt;/span&gt; fp8 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--enable-auto-tool-choice&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--tool-call-parser&lt;/span&gt; gemma4 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--reasoning-parser&lt;/span&gt; gemma4 &lt;span class="se"&gt;\&lt;/span&gt;
      &lt;span class="nt"&gt;--limit-mm-per-prompt&lt;/span&gt; &lt;span class="s1"&gt;'{"image":4,"audio":1}'&lt;/span&gt;

  &lt;span class="c"&gt;### Key Flag Justifications:&lt;/span&gt;

  • &lt;span class="nt"&gt;--kv-cache-dtype&lt;/span&gt; fp8 : Crucial &lt;span class="k"&gt;for &lt;/span&gt;doubling active serving capacity and avoiding Out-Of-Memory &lt;span class="o"&gt;(&lt;/span&gt;OOM&lt;span class="o"&gt;)&lt;/span&gt; failures
  under high concurrent user spikes by compressing the cache to float8_e4m3fn &lt;span class="nb"&gt;.&lt;/span&gt;
  • &lt;span class="nt"&gt;--disable_chunked_mm_input&lt;/span&gt; : Prevents numerical instability and attention mismatch issues on XLA/JAX compiler
  backends.
  • &lt;span class="nt"&gt;--tool-call-parser&lt;/span&gt; gemma4 : Required to map Gemma 4&lt;span class="s1"&gt;'s reasoning blocks to structured JSON schema arguments for
  agentic tool execution.
  • --tensor-parallel-size : Must exactly match the chip topology (e.g. 4 for a TPU v6e-4 or 8 for a TPU v6e-8)
  to execute weight sharding efficiently.
  ──────
  ## 2. Network &amp;amp; Routing Safety

  • IPv4 Binding Enforcement: Always target the IPv4 loopback ( 127.0.0.1 ) or local interface IP rather than
  resolving to localhost . vLLM only binds to IPv4, and loopbacks via IPv6 ( ::1 ) will fail.
  • Private Google Access: Run TPU VM networks with Private Google Access enabled. This allows the host to fetch
  images from GCP Artifact Registry and checkpoints from Hugging Face/Vertex Model Garden without requiring a public
  IP address.
  ──────
  ## 3. Lifecycle &amp;amp; Resource Management

  • Never Destroy Active Queued Resources: TPU chips are high-demand resources. Keep your primary Queued Resource
  active. If you delete it, provisioning a replacement can take up to 2 hours depending on zonal demand.
  • Configure Flex-start Limits: Always define a maxRunDuration (up to 7 days) and a termination action for Flex-
  start queued resources to optimize cluster costs and avoid orphaned VMs.
  • Dynamic Secret Management: Do not bake Hugging Face API keys into code or environment files. Retrieve the key
  dynamically during VM startup from GCP Secret Manager:
    export HF_TOKEN=$(gcloud secrets versions access latest --secret=hf-token)

  ──────
  ## 4. Observability &amp;amp; SRE Pipeline Integration

  • Prometheus Alerting: Regularly scrape the vLLM /metrics endpoint. Set up alert thresholds when
  vllm:kv_cache_usage_perc exceeds 0.85 or when vllm:num_requests_waiting is greater than 0 for more than 30
  seconds (indicating queue saturation).
  • Crash Diagnostics: Feed Cloud Logging stderr entries for tpu_worker to the self-hosted Gemma 4 endpoint to
  automatically generate troubleshooting runbooks for SRE on-call engineers.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 TPU deployments.&lt;/p&gt;

</description>
      <category>gemma4</category>
      <category>python</category>
      <category>tpu</category>
      <category>mcps</category>
    </item>
    <item>
      <title>Midsommer Madness with WASM, Rust, and Azure Container Apps</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 02 Jul 2026 19:14:36 +0000</pubDate>
      <link>https://dev.to/gde/midsommer-madness-with-wasm-rust-and-azure-container-apps-113b</link>
      <guid>https://dev.to/gde/midsommer-madness-with-wasm-rust-and-azure-container-apps-113b</guid>
      <description>&lt;p&gt;This article covers debugging and deploying a Rust backed WASM module with an Azure Container Apps hosted web app celebrating the Swedish Midsommar traditions.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgl7va0ur64sps2vl70hf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgl7va0ur64sps2vl70hf.jpeg" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How did we get Here?
&lt;/h4&gt;

&lt;p&gt;What started as a submission for the &lt;a href="http://Dev.to" rel="noopener noreferrer"&gt;dev.to&lt;/a&gt; June Solstace Jam:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/challenges/june-game-jam-2026-06-03"&gt;June Solstice Game Jam - DEV Challenge - DEV Community&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Blossomed into a whole series exploring new approaches to building out interactive apps across various platforms:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/xbill/series/40713"&gt;midsommer Series' Articles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Earlier articles covered Web, Flutter, Firebase, and IOS/Android deployment.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is new about this installment?
&lt;/h4&gt;

&lt;p&gt;This installment brings a WASM build with Rust to Midsommer Madness via Antigravity CLI. The Midsommer Madness web app is deployed to Azure Container Apps (ACA) with Rust and WASM — and the Maypole was saved!&lt;/p&gt;

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

&lt;p&gt;When it comes to Summar Solstace — the place to be is Sweden. It is one of the highlights of the calendar.&lt;/p&gt;

&lt;p&gt;This project aimed to recreate some of the mystique around the event- just in time for some fresh surestromming!&lt;/p&gt;

&lt;p&gt;Now you can get it with Azure enhancements! And WASM! And Rust!&lt;/p&gt;

&lt;h4&gt;
  
  
  So Why Am I reading this?
&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 deploying a Rust based WASM deployment ported from an existing working web application.&lt;/p&gt;

&lt;p&gt;Is it comprehensive? Not really. The goal was to explore, extend, and exercise the powerful combination of a Rust backed WASM application served from an Azure ACA endpoint.&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;h4&gt;
  
  
  WASM
&lt;/h4&gt;

&lt;p&gt;WebAssembly (often abbreviated as &lt;strong&gt;Wasm&lt;/strong&gt; ) is a low-level binary instruction format that allows developers to run code written in languages like C, C++, Rust, and Go directly in modern web browsers at near-native speeds. [&lt;a href="https://developer.mozilla.org/en-US/docs/WebAssembly" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/WebAssembly" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=dqhJU772ckM" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  How it Works
&lt;/h4&gt;

&lt;p&gt;Unlike traditional web code that requires step-by-step interpretation, Wasm compiles code into a compact binary format ahead of time. [&lt;a href="https://www.reddit.com/r/webdev/comments/thgkw7/can_you_explain_webassembly/" rel="noopener noreferrer"&gt;1&lt;/a&gt;]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Compilation Target:&lt;/strong&gt; You don’t write Wasm directly. Instead, you write high-level code in your preferred language and use a compiler to translate it into a .wasm file. [&lt;a href="https://developer.mozilla.org/en-US/docs/WebAssembly/Guides/Concepts" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/WebAssembly" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://tetrate.io/learn/what-is-wasm" rel="noopener noreferrer"&gt;3&lt;/a&gt;, &lt;a href="https://www.reddit.com/r/WebAssembly/comments/jhu96m/how_does_it_actually_work/" rel="noopener noreferrer"&gt;4&lt;/a&gt;, &lt;a href="https://motherduck.com/learn/web-assembly/" rel="noopener noreferrer"&gt;5&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Virtual Machine:&lt;/strong&gt; This binary is run inside a lightweight, stack-based virtual machine built into the browser. [&lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.youtube.com/shorts/v6bKJF9Ltbw" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teamwork with JavaScript:&lt;/strong&gt; Wasm is designed to &lt;em&gt;complement&lt;/em&gt; JavaScript, not replace it. JavaScript is still used to structure the web page, while Wasm handles heavy computations in the background. [&lt;a href="https://developer.mozilla.org/en-US/docs/WebAssembly" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.fullstack.com/labs/resources/blog/what-is-webassembly-and-what-is-it-used-for" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://thenewstack.io/webassembly-deep-dive/" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Azure Container App Service
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/products/container-apps" rel="noopener noreferrer"&gt;Azure Container Apps (ACA)&lt;/a&gt; is a fully managed, serverless platform designed for running containerized applications and microservices without managing underlying infrastructure. Built on &lt;a href="https://learn.microsoft.com/en-us/azure/container-apps/overview" rel="noopener noreferrer"&gt;Azure Kubernetes Service (AKS)&lt;/a&gt;, it offers built-in autoscaling (including to zero), traffic splitting for blue/green deployments, and Dapr integration, making it ideal for event-driven, API, and background processing workloads.&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%2Fopuxr7ozfdt16ur4qu38.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%2Fopuxr7ozfdt16ur4qu38.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Azure Container App Configuration
&lt;/h4&gt;

&lt;p&gt;To configure your Azure Service with the base system tools- this article provides a reference:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xbill999.medium.com/mcp-development-with-python-and-azure-container-apps-0586919987db" rel="noopener noreferrer"&gt;MCP Development with Python, and Azure Container Apps&lt;/a&gt;&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/gemini-cli-azure
&lt;span class="nb"&gt;cd &lt;/span&gt;midsommer-wasm-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;
  
  
  OK it Got Weird. How Did Rust get involved?
&lt;/h4&gt;

&lt;p&gt;Ferris is sneaky crab.&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; how is Rust used in this project?

96.4k in | 501 out | 420 thinking
● Read(/home/xbill/midsommer-wasm/game-wasm/src/lib.rs) (ctrl+o to expand)

In this project, Rust acts as the high-performance core engine of the game, compiled to WebAssembly (WASM). It manages
  physics calculations, collision systems, game entities, and particle logic, delegating rendering and media management to
  the JavaScript/browser layer.

Here are the specific ways Rust is utilized in the codebase:

### 1. High-Performance Physics &amp;amp; Vector Math
  Rather than running heavy game physics and coordinate tracking in the main JavaScript thread, the game uses Rust for 60Hz
  fixed-timestep updates:

• Collision Detection: Implements precise Axis-Aligned Bounding Box (AABB) collision checks ( check_aabb_collision ) and
  circle-based proximity checks ( check_circle_collision ).
  • Vector Mechanics: Handles directional speeds, distance calculations, and fast vector normalization directly in compiled
  machine code.
  ### 2. Zero-Allocation Particle System
  Under game-wasm/src/lib.rs , a custom particle emitter system handles up to 1000 simultaneous particles ( Particle 
  struct):

• State Updates: Tracks coordinates, velocity, damping (friction/drag), life expectancy, and color indexes.
  • Performance Optimization: Utilizes flat, contiguous memory allocations ( static mut PARTICLES: [Particle; 1000] ) to
  process particle logic without memory allocations during runtime, keeping CPU caching friendly and ensuring smooth
  gameplay.

### 3. Centralized Entity State Logic

The internal state of the player and active characters is maintained in Rust-native memory:

• The Player Struct: Tracks attributes like health, coordinates, score, active status effects (speed boosts, shields), and
  weapon parameters—including uniquely Swedish themed ammo varieties ( ammo_surstromming and ammo_flatpack ).
  • The Enemy Struct: Houses state definitions for subclasses of enemies (e.g., Shoppers, Drunkards, ABBAbots).

### 4. Seamless JavaScript Bridging (WASM Interface)

To bridge the memory boundaries between JavaScript and WebAssembly, Rust uses an extern "C" layout:

• No-Mangle Primitive APIs: Employs #[no_mangle] pub extern "C" to export functions like get_particle_x(idx) or
  spawn_particle(...) using primitive data types ( f32 , i32 ) for absolute compatibility.
  • Inline Packaging: When compiling via the Makefile ( make build-wasm ), the compiled output in assets/game_physics.
  wasm is base64-inlined into assets/wasm_binary.js . This allows the game rendering file ( assets/game.js ) to load the
  game engine instantly inline without needing separate network requests. Use-Interaction-free.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  WASM, Rust, And Javascript? What’s Next? Flying Cars?
&lt;/h4&gt;

&lt;p&gt;The high level design allows the performance sensitive calculations to be done within the memory safe Rust layer:&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; Do WASM and Rust work well together?
  Yes, Rust and WebAssembly (WASM) are widely considered to be one of the strongest pairings in modern software engineering.
  They were designed with overlapping goals—speed, safety, and efficiency—and have developed highly mature ecosystems
  together.

Here is why they work exceptionally well together:
  ### 1. No Garbage Collector (Zero-Cost Abstractions)
  Unlike languages like Go, C#, or Java, Rust does not require a garbage collector or a heavy runtime to manage memory.
  • Tiny Binary Footprints: Since WebAssembly payloads must be downloaded over the network to run in a browser, keeping
  compiled file sizes small is crucial.
  • Predictable Performance: Rust uses compile-time memory management (borrow checker), meaning there are no garbage
  collection pauses during gameplay or high-frequency calculations.

### 2. Memory Safety in a Linear Sandbox
  WebAssembly operates on a flat, linear memory space. In languages like C or C++, a buffer overflow can overwrite arbitrary
  locations in this memory, leading to major security exploits or hard-to-debug crashes.

• Rust’s compile-time guarantees ensure that memory access is safe, bounds-checked, and free of data races before the code
  ever compiles to WASM.

### 3. Industry-Leading Tooling

The Rust community has built the most advanced tools for WebAssembly development:

• wasm32-unknown-unknown : A native compiler target built directly into the Rust compiler ( rustc ), allowing you to
  compile Rust to WASM out of the box with zero dependencies.
  • wasm-pack : A one-stop CLI tool that compiles Rust code to WASM, optimizes it (using wasm-opt ), and packages it with
  auto-generated JavaScript/TypeScript bindings.
  • wasm-bindgen &amp;amp; web-sys : Libraries that enable high-performance, seamless sharing of complex structures (objects,
  strings, arrays) between Rust and JavaScript, and provide direct, type-safe access to browser APIs (like DOM, WebGL, and
  Web Audio).

### 4. Code Reuse Across Ecosystems

You can write high-performance computation blocks once in Rust, compile them to WebAssembly, and run them anywhere:

• In the browser (as done in this project's canvas UI).
  • On mobile devices (wrapped in Flutter webviews or React Native).
  • On servers and edge computing platforms (Cloudflare Workers, Fastly).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  My Lingonberries are ripening- get to work!
&lt;/h4&gt;

&lt;p&gt;How do you deploy this?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;make&lt;/span&gt; &lt;span class="err"&gt;help&lt;/span&gt;

&lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="err"&gt;Bash(make&lt;/span&gt; &lt;span class="err"&gt;help)&lt;/span&gt; &lt;span class="err"&gt;(ctrl+o&lt;/span&gt; &lt;span class="err"&gt;to&lt;/span&gt; &lt;span class="err"&gt;expand)&lt;/span&gt;

  &lt;span class="nl"&gt;I have run make help for you&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;

    &lt;span class="err"&gt;========================================================================&lt;/span&gt;
    &lt;span class="err"&gt;🇸🇪&lt;/span&gt; &lt;span class="err"&gt;Midsommer&lt;/span&gt; &lt;span class="err"&gt;Madness&lt;/span&gt; &lt;span class="err"&gt;Azure&lt;/span&gt; &lt;span class="err"&gt;ACA&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;Development&lt;/span&gt; &lt;span class="err"&gt;Controls&lt;/span&gt; &lt;span class="err"&gt;🇸🇪&lt;/span&gt;
      &lt;span class="err"&gt;========================================================================&lt;/span&gt;
      &lt;span class="nl"&gt;Available commands&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        make dev - Start the &lt;span class="nb"&gt;local &lt;/span&gt;web server &lt;span class="k"&gt;for &lt;/span&gt;browser play &lt;span class="o"&gt;(&lt;/span&gt;from assets/&lt;span class="o"&gt;)&lt;/span&gt;
        make build-wasm - Compile the Rust WebAssembly physics and particle engine
        make &lt;span class="nb"&gt;test&lt;/span&gt; - Run the Flutter unit/widget &lt;span class="nb"&gt;test &lt;/span&gt;suite
        make build-apk - Compile the Flutter App and build Debug APK
        make build-ios - Compile the Flutter App and build iOS app &lt;span class="o"&gt;(&lt;/span&gt;no codesign&lt;span class="o"&gt;)&lt;/span&gt;
        make install-apk - Install the compiled debug APK on a connected device/emulator
        make clean - Clean Flutter build outputs and temporary caches
        make logcat - Monitor application logs using Flutter logger
        make check-requirements - Check &lt;span class="k"&gt;if &lt;/span&gt;Azure CLI &lt;span class="o"&gt;(&lt;/span&gt;az&lt;span class="o"&gt;)&lt;/span&gt; and Docker are installed
        make az-login - Log &lt;span class="k"&gt;in &lt;/span&gt;to Azure CLI
        make deploy - Package WASM, build Docker, push to ACR and deploy to ACA
        make aca-status - Check status of Azure Container App
        make endpoint - Get the public endpoint FQDN of the deployed container app
        make aca-logs - Follow/stream logs from Azure Container App
        make destroy - Delete all created Azure resources &lt;span class="o"&gt;(&lt;/span&gt;ACA, ACR, Resource Group&lt;span class="o"&gt;)&lt;/span&gt;
        Note: Pushing/merging to &lt;span class="s1"&gt;'master'&lt;/span&gt; on GitHub automatically triggers deployment.
      &lt;span class="o"&gt;========================================================================&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WASM + Rust Build:&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="o"&gt;&amp;gt;&lt;/span&gt; make build-wasm

● Bash&lt;span class="o"&gt;(&lt;/span&gt;make build-wasm&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ctrl+o to &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

  I have compiled the Rust WebAssembly physics and particle engine:

    Compiling Rust WebAssembly module...
    &lt;span class="nb"&gt;cd &lt;/span&gt;game-wasm &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cargo build &lt;span class="nt"&gt;--target&lt;/span&gt; wasm32-unknown-unknown &lt;span class="nt"&gt;--release&lt;/span&gt;
        Finished &lt;span class="sb"&gt;`&lt;/span&gt;release&lt;span class="sb"&gt;`&lt;/span&gt; profile &lt;span class="o"&gt;[&lt;/span&gt;optimized] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.02s
    WebAssembly compiled and &lt;span class="nb"&gt;base64 &lt;/span&gt;helper assets/wasm_binary.js generated successfully!

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

&lt;/div&gt;



&lt;p&gt;Deploying to Azure Container Apps:&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="o"&gt;&amp;gt;&lt;/span&gt; make deploy

● Bash&lt;span class="o"&gt;(&lt;/span&gt;make deploy&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ctrl+o to &lt;span class="nb"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

  I have kicked off the deployment &lt;span class="k"&gt;in &lt;/span&gt;the background as task task-105 &lt;span class="nb"&gt;.&lt;/span&gt; I will monitor the execution and notify you
  immediately once the new deployment is completed and active!

  The new deployment is officially &lt;span class="nb"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

  Your updated container has been fully registered and deployed to Azure Container Apps.

  You can visit and play the Swedish-themed retro arcade game directly here:
  👉 https://midsommer-app-penguin.jollymoss-b0dba861.westus2.azurecontainerapps.io/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The service will be available on 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bmasvkx0u7xyae8j3c8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bmasvkx0u7xyae8j3c8.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust Code Patterns
&lt;/h4&gt;

&lt;p&gt;Is Rust Overkill for a simple web game? Probably.&lt;/p&gt;

&lt;p&gt;The interesting pattern is the matching of Rust + WASM along with some Javascript glue code.&lt;/p&gt;

&lt;p&gt;What does Antigravity CLI have to say about this?&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 combo of Rust and WASM bring to this project?
  The combination of Rust and WebAssembly (WASM) brings several distinct architectural and execution-level advantages
  specifically tailored to the requirements of this hybrid Flutter/Web game:
  ──────
  ### 1. Jitter-Free 60Hz Physics (Eliminating Garbage Collection)
  • The Challenge: Standard JavaScript games frequently suffer from micro-stuttering or "jitter" because of the
  browser's Garbage Collector (GC) reclaiming memory from expired particles, projectiles, and dead enemies.
  • The Rust + WASM Solution: In lib.rs, all game entities are kept in fixed-size, pre-allocated static
  arrays ( PARTICLES , ENEMIES , PROJECTILES ). Because Rust handles memory directly without a garbage collector
  and WASM operates on a flat, linear memory space, there are zero heap allocations or deallocations during gameplay.
  This guarantees that the physics tick maintains a stable 16.6ms frame budget.
  ### 2. High-Density Simulation Capability
  • At any moment, the game can track:
      • 1,000 active particles (running position updates, damping velocity, and linear array compaction).
      • 100 enemies (processing complex AI routines, state machines, and distance checks).
      • 200 projectiles (testing bounds, collision overlapping, and ticking Area-of-Effect surströmming gas).
  • WASM runs at near-native speed. This execution density allows the physics loop to complete in microseconds,
  leaving the majority of the frame time for the browser's main thread to handle CSS transitions, canvas rendering,
  and procedural audio synthesis.
  ### 3. Inline Zero-Fetch Loading (Base64 JS Module)
  • The Challenge: Traditional WASM deployment requires fetching a .wasm file over the network, which can trigger
  CORS issues, MIME-type mismatches, or file-not-found errors in local mobile webviews (like Flutter's WebViewWidget
  ).
  • The Rust + WASM Solution: The compiled WASM bytecode is serialized directly into a Base64 string inside 
  assets/wasm_binary.js . Rust compiles down to a highly optimized, compact binary (using opt-level = "s" as noted
  in Cargo.toml ). This allows the entire physics module to be loaded inline instantly from memory with zero
  additional HTTP network requests.

### 4. Mathematical Determinism Across Platforms

• JavaScript floats can sometimes behave slightly differently depending on the browser engine's JIT implementation
  (V8 on Android, JavaScriptCore on iOS).
  • Because WebAssembly compiles Rust's explicit math logic directly into standard WASM bytecode instructions,
  computations like distance , check_circle_collision , and trigonometric AI angles ( atan2 , cos , sin ) yield
  identical results on any hardware or operating system.

### 5. Clear Separation of Concerns (MVC Boundary)

The combination enforces a strict architectural boundary:

• Rust/WASM (The Model/Simulation): Calculates the absolute state, velocities, damage ticks, AI states, and
  coordinate limits.
  • JavaScript/Canvas (The View/Presentation): Polls the WASM memory buffer, handles touch/keyboard inputs, renders
  sprites onto the HTML5 Canvas, and triggers procedural synthesizers.
  ──────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Run it on the Web!
&lt;/h4&gt;

&lt;p&gt;The current version is now available at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://midsommer-app-penguin.jollymoss-b0dba861.westus2.azurecontainerapps.io/" rel="noopener noreferrer"&gt;Midsommer Madness - Swedish Retro Arcade&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The deployed system will be live on the ACA URL:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fen2dnd6akwr395y9bbxw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fen2dnd6akwr395y9bbxw.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Level Design
&lt;/h4&gt;

&lt;p&gt;The key levels include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;IKEA Warehouse:&lt;/strong&gt; Battle crowded, flatpack-carrying shoppers who throw box projectiles at you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systembolaget:&lt;/strong&gt; The state-owned liquor shop crowded with drunk Swedes stumbling and lobbing green beer bottles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lördagsgodis:&lt;/strong&gt; Sugar rush Saturday! Dodge hyperactive, strung-out Swedish kids throwing sweet candy projectiles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Swedish Pub:&lt;/strong&gt; Sing along with Frank Zappa fans singing “Bobby Brown” (shouting and firing glowing letters B, O, B, B, Y).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volvo Highway:&lt;/strong&gt; A survival lane-crossing level where…&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  This is Fun! How do I add my own levels?
&lt;/h4&gt;

&lt;p&gt;Antigravity CLI has full visibility into the game:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;godis&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;where&lt;/span&gt; &lt;span class="nx"&gt;strung&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="nx"&gt;kids&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;lordagsgodis&lt;/span&gt; &lt;span class="err"&gt;▸&lt;/span&gt; &lt;span class="nx"&gt;Thought&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;525&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="nx"&gt;Considering&lt;/span&gt; &lt;span class="nx"&gt;Level&lt;/span&gt; &lt;span class="nx"&gt;Placement&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt; &lt;span class="nx"&gt;checks&lt;/span&gt; &lt;span class="nx"&gt;referencing&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;prepare&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;adding&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;th&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Search&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;lvl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nx"&gt;checks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;495&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;585&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;inspect&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;configurations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;▸&lt;/span&gt; &lt;span class="nx"&gt;Thought&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="nx"&gt;Sequencing&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;Levels&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;setLevelAudioMode&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;prepare&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;adding&lt;/span&gt; &lt;span class="nx"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lördagsgodis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;setLevelAudioMode&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;scales&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;tempos&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;checks&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;tickSequencer&lt;/span&gt; &lt;span class="nx"&gt;inside&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;prepare&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;replacements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;shift&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;conditionals&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;music&lt;/span&gt; &lt;span class="nx"&gt;sequencer&lt;/span&gt; &lt;span class="nx"&gt;tickSequencer&lt;/span&gt; &lt;span class="nx"&gt;method&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;accommodate&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;progression&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;920&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;935&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;locate&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;exact&lt;/span&gt; &lt;span class="nx"&gt;Maypole&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;initLevel&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;1060&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1070&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;1290&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1300&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;1360&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1375&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;1370&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1385&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;1460&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1475&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt; &lt;span class="nx"&gt;checks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;final&lt;/span&gt; &lt;span class="nx"&gt;Maypole&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;register&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;candy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;throwing&lt;/span&gt; &lt;span class="nx"&gt;kids&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;HUD&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;levels&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;prepare&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;insertion&lt;/span&gt; &lt;span class="nx"&gt;edit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;545&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;585&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;▸&lt;/span&gt; &lt;span class="nx"&gt;Thought&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="nx"&gt;Refining&lt;/span&gt; &lt;span class="nx"&gt;The&lt;/span&gt; &lt;span class="nx"&gt;Level&lt;/span&gt; &lt;span class="nx"&gt;Design&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;levels&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;insert&lt;/span&gt; &lt;span class="nx"&gt;Lördagsgodis&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shift&lt;/span&gt; &lt;span class="nx"&gt;subsequent&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;IDs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;re&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;calculate&lt;/span&gt; &lt;span class="nx"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;950&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;985&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;locate&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;spawnEnemy&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="nx"&gt;statement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;985&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1010&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;kid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;spawnEnemy&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="nx"&gt;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;▸&lt;/span&gt; &lt;span class="nx"&gt;Thought&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1&lt;/span&gt;&lt;span class="nx"&gt;k&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="nx"&gt;Considering&lt;/span&gt; &lt;span class="nx"&gt;Projectile&lt;/span&gt; &lt;span class="nx"&gt;Design&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ZappaFan&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;locate&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;suitable&lt;/span&gt; &lt;span class="nx"&gt;place&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;insert&lt;/span&gt; &lt;span class="nx"&gt;CandyKid&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;Lordagsgodis&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Search&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;ZappaFan&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;2120&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2145&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;insert&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;CandyKid&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;Lordagsgodis&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;definitions&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;right&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;Drunkard&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;275&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;325&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;Level&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nx"&gt;Lördagsgodis&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;sidebar&lt;/span&gt; &lt;span class="nx"&gt;levels&lt;/span&gt; &lt;span class="nx"&gt;tracker&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;levels&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="nx"&gt;through&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;midsommer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;madness&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;syntax&lt;/span&gt; &lt;span class="nx"&gt;check&lt;/span&gt; &lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ensure&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;classes&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;configurations&lt;/span&gt; &lt;span class="nx"&gt;are&lt;/span&gt; &lt;span class="nx"&gt;syntax&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="nx"&gt;free&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Bash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;view&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;game_overview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;inspect&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;levels&lt;/span&gt; &lt;span class="nx"&gt;sequence&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gemini&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;antigravity&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;brain&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;ba&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4622&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;b252&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;003672&lt;/span&gt;&lt;span class="nx"&gt;e1b73f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game_overview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt; &lt;span class="nx"&gt;game_overview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;describe&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;layout&lt;/span&gt; &lt;span class="nx"&gt;including&lt;/span&gt; &lt;span class="nx"&gt;Lördagsgodis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;●&lt;/span&gt; &lt;span class="nc"&gt;Edit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/home/&lt;/span&gt;&lt;span class="nx"&gt;xbill&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gemini&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;antigravity&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;brain&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;ba&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4622&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;b252&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;003672&lt;/span&gt;&lt;span class="nx"&gt;e1b73f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;game_overview&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctrl&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;expand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;I&lt;/span&gt; &lt;span class="nx"&gt;have&lt;/span&gt; &lt;span class="nx"&gt;successfully&lt;/span&gt; &lt;span class="nx"&gt;added&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;Lördagsgodis&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;Midsommer&lt;/span&gt; &lt;span class="nx"&gt;Madness&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;featuring&lt;/span&gt; &lt;span class="nx"&gt;hyperactive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sugar&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;rushed&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="nx"&gt;throwing&lt;/span&gt; &lt;span class="nx"&gt;Saturday&lt;/span&gt; &lt;span class="nx"&gt;candy&lt;/span&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Sven&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Summary of Changes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Level Setup ( game.js ): * Inserted Lördagsgodis as game.js in the levels array, shifting following levels up to Level 10 (ABBA Disco). * Updated all final-level check logic throughout game.js from Level 9 to Level 10.&lt;/li&gt;
&lt;li&gt;Added CandyKid &amp;amp; Lordagsgodis Classes ( game.js ):
* Defined game.js and game.js right after the Drunkard class.
* Behavior:
* CandyKid has high speed (1.8), low health (35), and throws sweets rapidly.
* Kids shiver/vibrate rapidly on screen to depict their extreme sugar rush.
* Lordagsgodis are fast-moving candy projectiles (round jelly drops, square sweet gel blocks, and candy
star crosses) that rotate in flight and come in a variety of bright colors.&lt;/li&gt;
&lt;li&gt;Music &amp;amp; Audio:
* Modified game.js to include a happy, hyperactive 150 BPM C Major chiptune track for Level 3
(Lördagsgodis).
* Shifted level conditions in game.js to map Levels 8, 9, and 10 to their respective custom chiptune
hooks.&lt;/li&gt;
&lt;li&gt;UI &amp;amp; Documentation:
* renumerated the sidebar tracker list in index.html to show the 10-level layout.
* Updated the level progression descriptions in game_overview.md.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  We have a Winner!
&lt;/h4&gt;

&lt;p&gt;Midsommer is saved!&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffcc2usdql9qdlior6ljl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffcc2usdql9qdlior6ljl.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Phew! That was a lot!
&lt;/h4&gt;

&lt;p&gt;This installment covered extending the Midsommer madness app with Rust and WASM to play the web based versions deployed to Azure ACA. Future enhancements under consideration include experimenting with WASM across mobile platforms.&lt;/p&gt;




</description>
      <category>webassembly</category>
      <category>midsommer</category>
      <category>azurecontainerapps</category>
      <category>azure</category>
    </item>
    <item>
      <title>Omni Flash Preview with Kiro</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 02 Jul 2026 13:17:45 +0000</pubDate>
      <link>https://dev.to/gde/omni-flash-preview-with-kiro-19ka</link>
      <guid>https://dev.to/gde/omni-flash-preview-with-kiro-19ka</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Omni Preview and underlying Gemini LLM with Kiro CLI to enhance and extend Omni operations over MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe92p5kuk4r46nz3f4fdf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe92p5kuk4r46nz3f4fdf.jpeg" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Omni?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini Omni&lt;/strong&gt; (often referred to simply as Google Omni) is a powerful, multimodal AI video model developed by Google. It allows users to generate, edit, and iterate on video content using any combination of text, images, video, and audio inputs through simple, conversational prompts. [&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.atlascloud.ai/blog/guides/gemini-omni-features-overview" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=sspeHtbRh1U" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepmind.google/models/gemini-omni/" rel="noopener noreferrer"&gt;Gemini Omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/?source=post_page-----606e13ae6501---------------------------------------" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait- there is more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview" rel="noopener noreferrer"&gt;Gemini Omni Flash Preview | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/google-omni-flash-preview-with-mcp-and-antigravity-cli-64743adceca3" rel="noopener noreferrer"&gt;Google Omni Flash Preview with MCP and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Kiro CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Kiro to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS Setup
&lt;/h4&gt;

&lt;p&gt;The AWS CLI provides the basic tools for working with the AWS services:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the AWS 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;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/aws &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="go"&gt;aws-cli/2.34.57 Python/3.14.5 Linux/6.6.137+ exe/x86_64.ubuntu.24
&lt;/span&gt;&lt;span class="gp"&gt;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the tools are installed — login to the AWS console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws login &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is Kiro
&lt;/h4&gt;

&lt;p&gt;Kiro is an agentic, AI-powered Integrated Development Environment (IDE) built by Amazon Web Services (AWS) designed to help developers move from initial concepts to production-ready software. Based on a fork of VS Code (Code OSS), Kiro feels familiar while acting like an autonomous co-developer. [&lt;a href="https://dev.to/aws-builders/introducing-kiro-an-ai-ide-that-thinks-like-a-developer-42jp"&gt;1&lt;/a&gt;, &lt;a href="https://caylent.com/blog/kiro-first-impressions" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.constellationr.com/insights/news/aws-launches-kiro-ide-powered-ai-agents" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  Installing Kiro
&lt;/h4&gt;

&lt;p&gt;The main download site for Kiro is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://kiro.dev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro: Bring engineering rigor to agentic development&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%2F8jto4o59z59l417plw06.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%2F8jto4o59z59l417plw06.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for the CLI download — click CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cli.kiro.dev/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;once the stars align — you will see the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⢀⣴⣶⣶⣦⡀⠀⠀⠀⠀⢀⣴⣶⣦⣄⡀ ⢀⣴⣶⣶⣦⡀ ⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀ ⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀
                            ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁ ⠈⢻⡆ ⢰⣿⠋⠁⠈⠙⣿⡆ ⢰⣿⠋⠁ ⠈⠙⠻⣦ ⣴⡿⠟⠋⠁ ⠈⠙⠻⢿⣦
                            ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀ ⢀⣼⠇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄ ⣿⡆ ⣼⡟⠀⠀⠀ ⣀⣀⣀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀ ⢀⣾⡿⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇ ⣿⡇ ⣼⡟⠀⠀ ⣰⡿⠟⠛⠻⢿⣆⠀⠀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀ ⢀⣼⡟⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀ ⣿⠇ ⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀ ⣿⡆⠀⠀ ⣿⡆
                            ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⠹⣷⡀ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⣠⣼⠟ ⢸⣿⠀⠀ ⢸⣿⠀⠀⠀⠀ ⣿⡇⠀⠀ ⣿⡇
                            ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀ ⠹⣷⡄ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⣤⣄ ⠀⠀⠹⣿⡅ ⠸⣿⠀⠀ ⠸⣿⠀⠀⠀⠀ ⣿⠇⠀ ⣿⠇
                            ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢻⣧⠀⠀ ⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
                            ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢻⣧⠀⠀⠀ ⠉⠉⠉ ⣼⡟
                            ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠸⣿⣄⡀⢀⣠⣿⠇ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠻⣷⣦⣄⡀ ⢀⣠⣴⣾⠟
                             ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁

                                                 Welcome to Kiro CLI V3!

                             What's new: Specs, expanded hooks, and an improved trust model.
                         Migration tooling to bring your V2 configurations to V3 is coming soon.
                                              &amp;lt;a href="https://kiro.dev/docs/cli/v3/"&amp;gt;https://kiro.dev/docs/cli/v3/&amp;lt;/a&amp;gt;

                                         Share feedback anytime with /feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call the Omni models. Native MCP support in Kiro opens up a new pathway to call the underlying Omni model.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Kiro 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/omni-flash-video-agent-kiro
&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;omni-flash-video-agent-kiro
&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;omni-flash-video-agent-kiro
&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;
  
  
  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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-kiro&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-kiro&lt;span class="nv"&gt;$ &lt;/span&gt;make lint
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
All checks passed!
ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
4 files already formatted
mypy &lt;span class="nb"&gt;.&lt;/span&gt;
Success: no issues found &lt;span class="k"&gt;in &lt;/span&gt;4 &lt;span class="nb"&gt;source &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Kiro CLI MCP Config
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .kiro 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;"omni-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/omni-flash-video-agent-kiro/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;"disabled"&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;"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="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;"aws-mcp"&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;"uvx"&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;"mcp-proxy-for-aws==1.6.0"&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://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-east-1"&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;"disabled"&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="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 Kiro CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Kiro 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 list · 2 configured
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 search: type to filter

 Configured Servers
 Name Status Details
 aws-mcp ● running 9 tools
 omni-agent ● running 8 tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Omni Video Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing the Omni Video calls.&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;  Here's a summary of the available tools in this Gemini Omni Flash Video Agent:

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  Video Generation

  - generate_video — Create a video from a text prompt. Supports 16:9 or 9:16 aspect ratio.
  - generate_with_subjects — Generate a video using reference images as subjects.

  Video Editing

  - edit_video — Edit a previously generated video by passing its interaction ID and an edit prompt.
  - edit_user_video — Upload a local video file and edit it with a prompt.

  Image-Based

  - animate_image — Animate a static local image with a motion description.
  - interpolate_images — Create a transition video between two keyframe images.

  Publishing

  - upload_to_youtube — Upload a local video file to YouTube (requires client_secrets.json).

  Utility

  - get_help — Returns this guide (what you just called).

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  Delivery modes:

  - inline (default) — base64-encoded, best for clips under ~4MB
  - uri — recommended for larger videos, uses Google File API

  Workflow tip: Generate → Edit → Upload. Use the interaction_id returned from generate_video as input to edit_video for
  stateful multi-turn editing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the MCP tools are now available for working with the Omni models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  use the mcp tool generate_video to create a video of the kiro ghost in a futuristic data center
● generate_video
    ╰ prompt=A glowing ghost mascot floating through a futuristic data center with neon blue server racks, cyberpunk
    atmosphere, cinematic shot, delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  The video was generated successfully! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/gen_1782940602.mp4
  - Interaction ID: v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0

[https://www.youtube.com/watch?v=w5mgqeJZsgk](https://www.youtube.com/watch?v=w5mgqeJZsgk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href%22&gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href"&amp;amp;gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  edit_video v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0 add a nano banana companion

● edit_video
    ╰ previous_interaction_id=v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0, edit_prompt=Add a
    tiny nano banana companion floating alongside the ghost. The banana is miniature and cute, glowing with a warm
    yellow light, bouncing and hovering next to the ghost as they drift together through the futuristic data center.,
    delivery=inline

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/edit_1782940987.mp4
  - Interaction ID: v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXT29WRmF2cXdFdWUwMU1rUDdfS2ItUWM

  The nano banana companion is now glowing yellow and bouncing alongside the Kiro ghost through the data center. Want to
  keep editing, or upload this version to YouTube?

[https://www.youtube.com/watch?v=JsCJhcfjnRY](https://www.youtube.com/watch?v=JsCJhcfjnRY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href%22&gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href"&amp;amp;gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href&amp;amp;lt;/a&lt;/a&gt;&amp;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 mcp tool animate_image with Kiro.web
  use the mcp tool animate_image with image kiro.webp

● Glob "kiro.webp"
  1 file
    kiro.webp
● animate_image
    ╰ image_path=/home/xbill/omni-flash-video-agent-kiro/kiro.webp, motion_prompt=The Kiro ghost gently floats and bobs
    up and down with a subtle ghostly hovering motion. A soft glowing aura pulses around it. The ghost's expression
    remains friendly as it drifts slowly, with a slight swaying side to side motion, leaving a faint trail of shimmering
    light particles., delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Animated! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/animated_1782941216.mp4
  - Interaction ID: v1_ChZINFpGYXZtaURlS2lqckVQNE5teENBEhZINFpGYXZtaURlS2lqckVQNE5teENB

  The Kiro ghost is now animated with a gentle floating bob, pulsing glow, and shimmering light trail. Want to edit it
  further or upload it to YouTube?


[https://www.youtube.com/watch?v=dxOyZG4OCzg](https://www.youtube.com/watch?v=dxOyZG4OCzg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href%22&gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href"&amp;amp;gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; interpolate_images omni.jpg edit_local_1782839741_1c2c5bd5.jpg

● Glob "ghost_banana.webp"
  1 file
    ghost_banana.webp
● interpolate_images
    ╰ start_image_path=/home/xbill/omni-flash-video-agent-kiro/kiro.webp,
    end_image_path=/home/xbill/omni-flash-video-agent-kiro/ghost_banana.webp, prompt=A smooth cinematic transition from
    the Kiro ghost to the ghost banana companion. The Kiro ghost gently morphs and transforms into the ghost banana with
    a magical glowing effect, light particles swirling around as the shape shifts. Soft volumetric lighting, dreamy and
    fluid motion., delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/interpolation_1782941999.mp4
  - Interaction ID: v1_ChdMWWxGYW83a09xRDJqckVQbjYyanNRWRIXTFlsRmFvN2tPcUQyanJFUG42MmpzUVk

  The video smoothly transitions from the Kiro ghost to the ghost banana companion with a magical glowing morph effect.
  Want to edit it further or upload it to YouTube?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href%22&gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href"&amp;amp;gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; generate_with_subjects v1_ChdMVk5FYXZDLUY5ejBqckVQLXFDRWlBURIXTFZORWF2Qy1GOXowanJFUC1xQ0VpQVE
  v1_ChdrVkJFYXJ5SE8tYXUxTWtQMmM3aDBRNBIXcUZGRWFxLTdJYy1NMzlJUDhKbXl3UUU

● generate_with_subjects
    ╰ subject_image_paths=/home/xbill/omni-flash-video-agent-kiro/kiro.webp,
    /home/xbill/omni-flash-video-agent-kiro/ghost_banana.webp, prompt=The Kiro ghost and the ghost banana companion
    explore a futuristic data center together. They float side by side between towering server racks covered in blinking
    neon blue and cyan LED lights. Holographic data streams flow around them as they drift curiously through the
    corridors. The ghost emits a soft white and purple glow while the banana glows warm yellow. Reflective floors,
    volumetric lighting, cinematic tracking shot, cyberpunk atmosphere, photorealistic 3D render., delivery=inline

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/subject_1782942220.mp4
  - Interaction ID: v1_ChdDb3BGYW9pTk5jbVVfdU1QaUwyeWtBcxIXQ29wRmFvaU5OY21VX3VNUGlMMnlrQXM

  The Kiro ghost and ghost banana are now exploring the futuristic data center together, floating side by side through
  neon-lit server corridors. Want to edit it or upload it to YouTube?

[https://www.youtube.com/watch?v=7NlLxIG3iaQ](https://www.youtube.com/watch?v=7NlLxIG3iaQ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/154cdf373ec64091167330a989c40c45/href%22&gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href"&amp;amp;gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● edit_user_video
    ╰ delivery=inline, edit_prompt=Transform the entire video into a steampunk aesthetic. Replace the futuristic neon
    data center with a Victorian-era steampunk machine room filled with brass pipes, copper gears, steam vents, and gas
    lamps. The server racks become towering brass computing engines with spinning cogs and pressure gauges. The
    holographic data streams become parchment ticker tape and telegraph wires. The Kiro ghost and ghost banana retain
    their forms but glow with warm amber and sepia tones instead of neon. Cinematic, rich steampunk atmosphere.,
    video_path=/home/xbill/omni-flash-video-agent-kiro/subject_1782942220.mp4

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/user_edit_1782942468.mp4
  - Interaction ID: v1_ChdBNHRGYXZQeExZdXVqckVQdGRPQy1BaxIXQTR0RmF2UHhMWXV1anJFUHRkT0MtQWs

https://www.youtube.com/watch?v=sUivQ8o342s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href%22&gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href"&amp;amp;gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Kiro CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Omni and Kiro 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 Kiro CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to interact with the Omni models.&lt;/p&gt;




</description>
      <category>gemini</category>
      <category>llm</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Omni Flash Preview with Kiro</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Thu, 02 Jul 2026 01:34:41 +0000</pubDate>
      <link>https://dev.to/aws-builders/omni-flash-preview-with-kiro-5d1k</link>
      <guid>https://dev.to/aws-builders/omni-flash-preview-with-kiro-5d1k</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Omni Preview and underlying Gemini LLM with Kiro CLI to enhance and extend Omni operations over MCP.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe92p5kuk4r46nz3f4fdf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe92p5kuk4r46nz3f4fdf.jpeg" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Omni?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini Omni&lt;/strong&gt; (often referred to simply as Google Omni) is a powerful, multimodal AI video model developed by Google. It allows users to generate, edit, and iterate on video content using any combination of text, images, video, and audio inputs through simple, conversational prompts. [&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.atlascloud.ai/blog/guides/gemini-omni-features-overview" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.youtube.com/watch?v=sspeHtbRh1U" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni/" rel="noopener noreferrer"&gt;https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deepmind.google/models/gemini-omni/" rel="noopener noreferrer"&gt;Gemini Omni&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/?source=post_page-----606e13ae6501---------------------------------------" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But wait- there is more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/omni-flash-preview" rel="noopener noreferrer"&gt;Gemini Omni Flash Preview | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/google-omni-flash-preview-with-mcp-and-antigravity-cli-64743adceca3" rel="noopener noreferrer"&gt;Google Omni Flash Preview with MCP and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Kiro CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Kiro to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS Setup
&lt;/h4&gt;

&lt;p&gt;The AWS CLI provides the basic tools for working with the AWS services:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the AWS 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;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/aws &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="go"&gt;aws-cli/2.34.57 Python/3.14.5 Linux/6.6.137+ exe/x86_64.ubuntu.24
&lt;/span&gt;&lt;span class="gp"&gt;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the tools are installed — login to the AWS console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws login &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is Kiro
&lt;/h4&gt;

&lt;p&gt;Kiro is an agentic, AI-powered Integrated Development Environment (IDE) built by Amazon Web Services (AWS) designed to help developers move from initial concepts to production-ready software. Based on a fork of VS Code (Code OSS), Kiro feels familiar while acting like an autonomous co-developer. [&lt;a href="https://dev.to/aws-builders/introducing-kiro-an-ai-ide-that-thinks-like-a-developer-42jp"&gt;1&lt;/a&gt;, &lt;a href="https://caylent.com/blog/kiro-first-impressions" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.constellationr.com/insights/news/aws-launches-kiro-ide-powered-ai-agents" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  Installing Kiro
&lt;/h4&gt;

&lt;p&gt;The main download site for Kiro is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://kiro.dev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro: Bring engineering rigor to agentic development&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%2F8jto4o59z59l417plw06.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%2F8jto4o59z59l417plw06.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for the CLI download — click CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cli.kiro.dev/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;once the stars align — you will see the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;⢀⣴⣶⣶⣦⡀⠀⠀⠀⠀⢀⣴⣶⣦⣄⡀ ⢀⣴⣶⣶⣦⡀ ⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀ ⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀
                            ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁ ⠈⢻⡆ ⢰⣿⠋⠁⠈⠙⣿⡆ ⢰⣿⠋⠁ ⠈⠙⠻⣦ ⣴⡿⠟⠋⠁ ⠈⠙⠻⢿⣦
                            ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀ ⢀⣼⠇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄ ⣿⡆ ⣼⡟⠀⠀⠀ ⣀⣀⣀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀ ⢀⣾⡿⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇ ⣿⡇ ⣼⡟⠀⠀ ⣰⡿⠟⠛⠻⢿⣆⠀⠀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀ ⢀⣼⡟⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀ ⣿⠇ ⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀ ⣿⡆⠀⠀ ⣿⡆
                            ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⠹⣷⡀ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⣠⣼⠟ ⢸⣿⠀⠀ ⢸⣿⠀⠀⠀⠀ ⣿⡇⠀⠀ ⣿⡇
                            ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀ ⠹⣷⡄ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⣤⣄ ⠀⠀⠹⣿⡅ ⠸⣿⠀⠀ ⠸⣿⠀⠀⠀⠀ ⣿⠇⠀ ⣿⠇
                            ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢻⣧⠀⠀ ⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
                            ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢻⣧⠀⠀⠀ ⠉⠉⠉ ⣼⡟
                            ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠸⣿⣄⡀⢀⣠⣿⠇ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠻⣷⣦⣄⡀ ⢀⣠⣴⣾⠟
                             ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁

                                                 Welcome to Kiro CLI V3!

                             What's new: Specs, expanded hooks, and an improved trust model.
                         Migration tooling to bring your V2 configurations to V3 is coming soon.
                                              &amp;lt;a href="https://kiro.dev/docs/cli/v3/"&amp;gt;https://kiro.dev/docs/cli/v3/&amp;lt;/a&amp;gt;

                                         Share feedback anytime with /feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call the Omni models. Native MCP support in Kiro opens up a new pathway to call the underlying Omni model.&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Kiro 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/omni-flash-video-agent-kiro
&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;omni-flash-video-agent-kiro
&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;omni-flash-video-agent-kiro
&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;
  
  
  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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-kiro&lt;span class="nv"&gt;$ &lt;/span&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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 shell"&gt;&lt;code&gt;xbill@penguin:~/omni-flash-video-agent-kiro&lt;span class="nv"&gt;$ &lt;/span&gt;make lint
ruff check &lt;span class="nb"&gt;.&lt;/span&gt;
All checks passed!
ruff format &lt;span class="nt"&gt;--check&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
4 files already formatted
mypy &lt;span class="nb"&gt;.&lt;/span&gt;
Success: no issues found &lt;span class="k"&gt;in &lt;/span&gt;4 &lt;span class="nb"&gt;source &lt;/span&gt;files
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Kiro CLI MCP Config
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .kiro 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;"omni-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/omni-flash-video-agent-kiro/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;"disabled"&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;"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="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;"aws-mcp"&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;"uvx"&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;"mcp-proxy-for-aws==1.6.0"&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://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-east-1"&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;"disabled"&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="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 Kiro CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Kiro 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 list · 2 configured
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 search: type to filter

 Configured Servers
 Name Status Details
 aws-mcp ● running 9 tools
 omni-agent ● running 8 tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Omni Video Management via MCP
&lt;/h4&gt;

&lt;p&gt;The MCP tools provide a complete suite of agent-oriented operations for managing the Omni Video calls.&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;  Here's a summary of the available tools in this Gemini Omni Flash Video Agent:

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  Video Generation

  - generate_video — Create a video from a text prompt. Supports 16:9 or 9:16 aspect ratio.
  - generate_with_subjects — Generate a video using reference images as subjects.

  Video Editing

  - edit_video — Edit a previously generated video by passing its interaction ID and an edit prompt.
  - edit_user_video — Upload a local video file and edit it with a prompt.

  Image-Based

  - animate_image — Animate a static local image with a motion description.
  - interpolate_images — Create a transition video between two keyframe images.

  Publishing

  - upload_to_youtube — Upload a local video file to YouTube (requires client_secrets.json).

  Utility

  - get_help — Returns this guide (what you just called).

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  Delivery modes:

  - inline (default) — base64-encoded, best for clips under ~4MB
  - uri — recommended for larger videos, uses Google File API

  Workflow tip: Generate → Edit → Upload. Use the interaction_id returned from generate_video as input to edit_video for
  stateful multi-turn editing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the MCP tools are now available for working with the Omni models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  use the mcp tool generate_video to create a video of the kiro ghost in a futuristic data center
● generate_video
    ╰ prompt=A glowing ghost mascot floating through a futuristic data center with neon blue server racks, cyberpunk
    atmosphere, cinematic shot, delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  The video was generated successfully! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/gen_1782940602.mp4
  - Interaction ID: v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0

[https://www.youtube.com/watch?v=w5mgqeJZsgk](https://www.youtube.com/watch?v=w5mgqeJZsgk)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href%22&gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href"&amp;amp;gt;https://medium.com/media/2be64ef90a364620be2cdd42b4dccb32/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  edit_video v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0 add a nano banana companion

● edit_video
    ╰ previous_interaction_id=v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXdVlORmF1T0JCcmZxak1jUGliX1ltUU0, edit_prompt=Add a
    tiny nano banana companion floating alongside the ghost. The banana is miniature and cute, glowing with a warm
    yellow light, bouncing and hovering next to the ghost as they drift together through the futuristic data center.,
    delivery=inline

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/edit_1782940987.mp4
  - Interaction ID: v1_Chd1WU5GYXVPQkJyZnFqTWNQaWJfWW1RTRIXT29WRmF2cXdFdWUwMU1rUDdfS2ItUWM

  The nano banana companion is now glowing yellow and bouncing alongside the Kiro ghost through the data center. Want to
  keep editing, or upload this version to YouTube?

[https://www.youtube.com/watch?v=JsCJhcfjnRY](https://www.youtube.com/watch?v=JsCJhcfjnRY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href%22&gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href"&amp;amp;gt;https://medium.com/media/92e8b79911a2d507f3dc3734c8e29dcf/href&amp;amp;lt;/a&lt;/a&gt;&amp;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 mcp tool animate_image with Kiro.web
  use the mcp tool animate_image with image kiro.webp

● Glob "kiro.webp"
  1 file
    kiro.webp
● animate_image
    ╰ image_path=/home/xbill/omni-flash-video-agent-kiro/kiro.webp, motion_prompt=The Kiro ghost gently floats and bobs
    up and down with a subtle ghostly hovering motion. A soft glowing aura pulses around it. The ghost's expression
    remains friendly as it drifts slowly, with a slight swaying side to side motion, leaving a faint trail of shimmering
    light particles., delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Animated! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/animated_1782941216.mp4
  - Interaction ID: v1_ChZINFpGYXZtaURlS2lqckVQNE5teENBEhZINFpGYXZtaURlS2lqckVQNE5teENB

  The Kiro ghost is now animated with a gentle floating bob, pulsing glow, and shimmering light trail. Want to edit it
  further or upload it to YouTube?


[https://www.youtube.com/watch?v=dxOyZG4OCzg](https://www.youtube.com/watch?v=dxOyZG4OCzg)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href%22&gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href"&amp;amp;gt;https://medium.com/media/c7f03a5520160debf4aa78bf834984f3/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; interpolate_images omni.jpg edit_local_1782839741_1c2c5bd5.jpg

● Glob "ghost_banana.webp"
  1 file
    ghost_banana.webp
● interpolate_images
    ╰ start_image_path=/home/xbill/omni-flash-video-agent-kiro/kiro.webp,
    end_image_path=/home/xbill/omni-flash-video-agent-kiro/ghost_banana.webp, prompt=A smooth cinematic transition from
    the Kiro ghost to the ghost banana companion. The Kiro ghost gently morphs and transforms into the ghost banana with
    a magical glowing effect, light particles swirling around as the shape shifts. Soft volumetric lighting, dreamy and
    fluid motion., delivery=inline
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/interpolation_1782941999.mp4
  - Interaction ID: v1_ChdMWWxGYW83a09xRDJqckVQbjYyanNRWRIXTFlsRmFvN2tPcUQyanJFUG42MmpzUVk

  The video smoothly transitions from the Kiro ghost to the ghost banana companion with a magical glowing morph effect.
  Want to edit it further or upload it to YouTube?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href%22&gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href"&amp;amp;gt;https://medium.com/media/e0dba7b51720aa3693a80841c225ced9/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; generate_with_subjects v1_ChdMVk5FYXZDLUY5ejBqckVQLXFDRWlBURIXTFZORWF2Qy1GOXowanJFUC1xQ0VpQVE
  v1_ChdrVkJFYXJ5SE8tYXUxTWtQMmM3aDBRNBIXcUZGRWFxLTdJYy1NMzlJUDhKbXl3UUU

● generate_with_subjects
    ╰ subject_image_paths=/home/xbill/omni-flash-video-agent-kiro/kiro.webp,
    /home/xbill/omni-flash-video-agent-kiro/ghost_banana.webp, prompt=The Kiro ghost and the ghost banana companion
    explore a futuristic data center together. They float side by side between towering server racks covered in blinking
    neon blue and cyan LED lights. Holographic data streams flow around them as they drift curiously through the
    corridors. The ghost emits a soft white and purple glow while the banana glows warm yellow. Reflective floors,
    volumetric lighting, cinematic tracking shot, cyberpunk atmosphere, photorealistic 3D render., delivery=inline

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/subject_1782942220.mp4
  - Interaction ID: v1_ChdDb3BGYW9pTk5jbVVfdU1QaUwyeWtBcxIXQ29wRmFvaU5OY21VX3VNUGlMMnlrQXM

  The Kiro ghost and ghost banana are now exploring the futuristic data center together, floating side by side through
  neon-lit server corridors. Want to edit it or upload it to YouTube?

[https://www.youtube.com/watch?v=7NlLxIG3iaQ](https://www.youtube.com/watch?v=7NlLxIG3iaQ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/154cdf373ec64091167330a989c40c45/href%22&gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href"&amp;amp;gt;https://medium.com/media/154cdf373ec64091167330a989c40c45/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● edit_user_video
    ╰ delivery=inline, edit_prompt=Transform the entire video into a steampunk aesthetic. Replace the futuristic neon
    data center with a Victorian-era steampunk machine room filled with brass pipes, copper gears, steam vents, and gas
    lamps. The server racks become towering brass computing engines with spinning cogs and pressure gauges. The
    holographic data streams become parchment ticker tape and telegraph wires. The Kiro ghost and ghost banana retain
    their forms but glow with warm amber and sepia tones instead of neon. Cinematic, rich steampunk atmosphere.,
    video_path=/home/xbill/omni-flash-video-agent-kiro/subject_1782942220.mp4

  Done! Here are the details:

  - File: /home/xbill/omni-flash-video-agent-kiro/user_edit_1782942468.mp4
  - Interaction ID: v1_ChdBNHRGYXZQeExZdXVqckVQdGRPQy1BaxIXQTR0RmF2UHhMWXV1anJFUHRkT0MtQWs

https://www.youtube.com/watch?v=sUivQ8o342s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&amp;lt;a href="&lt;a href="https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href%22&gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href&lt;/a" rel="noopener noreferrer"&gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href"&amp;amp;gt;https://medium.com/media/5227a04e06ccd69eb609126ce0f1e003/href&amp;amp;lt;/a&lt;/a&gt;&amp;gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Kiro CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Omni and Kiro 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 Kiro CLI running as a MCP client in the same local environment. This Python server provided all of the management tools to interact with the Omni models.&lt;/p&gt;




</description>
      <category>geminiomniflash</category>
      <category>mcps</category>
      <category>kiro</category>
      <category>largelanguagemodels</category>
    </item>
    <item>
      <title>Nano Banana 2 Lite with Kiro</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Wed, 01 Jul 2026 20:26:21 +0000</pubDate>
      <link>https://dev.to/gde/nano-banana-2-lite-with-kiro-3d3n</link>
      <guid>https://dev.to/gde/nano-banana-2-lite-with-kiro-3d3n</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Nano Banana 2 Lite and underlying Gemini LLM with Kiro CLI to enhance and extend image operations over the MCP protocol.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpwnksgw5pq24hk437qw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpwnksgw5pq24hk437qw.jpeg" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Nano Banana 2 Lite?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Nano Banana 2 Lite&lt;/strong&gt; (officially known as the &lt;strong&gt;Gemini 3.1 Flash-Lite Image&lt;/strong&gt; model) is Google’s fastest and most cost-efficient AI image generation and editing model. It is built specifically for enterprises and developers who need to generate high-quality images quickly and affordably at a large scale. [&lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://9to5google.com/2026/06/30/notebooklm-short-video-overviews/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-Fast Latency:&lt;/strong&gt; Capable of generating high-quality images in about 4 seconds. [&lt;a href="https://blog.google/innovation-and-ai/technology/ai/nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Efficient Pricing:&lt;/strong&gt; Priced at approximately $0.034 per 1,000 images in Google AI Studio, undercutting standard models and previous versions. [&lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-World Grounding:&lt;/strong&gt; Integrates with Google Web and Image Search to produce highly accurate visuals based on real-world information, such as live weather data and exact global locations. [&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro-Level Editing:&lt;/strong&gt; Allows for nuanced image-editing capabilities, aspect ratio control, and text rendering/translation directly onto images. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Consistency:&lt;/strong&gt; Retains the fidelity of subjects across multiple generations and scenarios, making it highly effective for storyboarding and marketing campaigns. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/bringing-nano-banana-2-to-enterprise" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite-image" rel="noopener noreferrer"&gt;Gemini 3.1 Flash-Lite Image (Nano Banana 2 Lite) | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/nano-banana-2-lite-with-mcp-and-antigravity-cli-606e13ae6501" rel="noopener noreferrer"&gt;Nano Banana 2 Lite with MCP, and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Kiro CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Kiro to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS Setup
&lt;/h4&gt;

&lt;p&gt;The AWS CLI provides the basic tools for working with the AWS services:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the AWS 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;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/aws &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="go"&gt;aws-cli/2.34.57 Python/3.14.5 Linux/6.6.137+ exe/x86_64.ubuntu.24
&lt;/span&gt;&lt;span class="gp"&gt;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the tools are installed — login to the AWS console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws login &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is Kiro
&lt;/h4&gt;

&lt;p&gt;Kiro is an agentic, AI-powered Integrated Development Environment (IDE) built by Amazon Web Services (AWS) designed to help developers move from initial concepts to production-ready software. Based on a fork of VS Code (Code OSS), Kiro feels familiar while acting like an autonomous co-developer. [&lt;a href="https://dev.to/aws-builders/introducing-kiro-an-ai-ide-that-thinks-like-a-developer-42jp"&gt;1&lt;/a&gt;, &lt;a href="https://caylent.com/blog/kiro-first-impressions" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.constellationr.com/insights/news/aws-launches-kiro-ide-powered-ai-agents" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  Installing Kiro
&lt;/h4&gt;

&lt;p&gt;The main download site for Kiro is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://kiro.dev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro: Bring engineering rigor to agentic development&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%2F8jto4o59z59l417plw06.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%2F8jto4o59z59l417plw06.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for the CLI download — click CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cli.kiro.dev/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;once the stars align — you will see the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                             ⢀⣴⣶⣶⣦⡀⠀⠀⠀⠀⢀⣴⣶⣦⣄⡀ ⢀⣴⣶⣶⣦⡀ ⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀ ⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀
                            ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁ ⠈⢻⡆ ⢰⣿⠋⠁⠈⠙⣿⡆ ⢰⣿⠋⠁ ⠈⠙⠻⣦ ⣴⡿⠟⠋⠁ ⠈⠙⠻⢿⣦
                            ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀ ⢀⣼⠇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄ ⣿⡆ ⣼⡟⠀⠀⠀ ⣀⣀⣀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀ ⢀⣾⡿⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇ ⣿⡇ ⣼⡟⠀⠀ ⣰⡿⠟⠛⠻⢿⣆⠀⠀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀ ⢀⣼⡟⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀ ⣿⠇ ⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀ ⣿⡆⠀⠀ ⣿⡆
                            ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⠹⣷⡀ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⣠⣼⠟ ⢸⣿⠀⠀ ⢸⣿⠀⠀⠀⠀ ⣿⡇⠀⠀ ⣿⡇
                            ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀ ⠹⣷⡄ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⣤⣄ ⠀⠀⠹⣿⡅ ⠸⣿⠀⠀ ⠸⣿⠀⠀⠀⠀ ⣿⠇⠀ ⣿⠇
                            ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢻⣧⠀⠀ ⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
                            ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢻⣧⠀⠀⠀ ⠉⠉⠉ ⣼⡟
                            ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠸⣿⣄⡀⢀⣠⣿⠇ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠻⣷⣦⣄⡀ ⢀⣠⣴⣾⠟
                             ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁

                                                 Welcome to Kiro CLI V3!

                             What's new: Specs, expanded hooks, and an improved trust model.
                         Migration tooling to bring your V2 configurations to V3 is coming soon.
                                              https://kiro.dev/docs/cli/v3/

                                         Share feedback anytime with /feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call models. Native MCP support in Kiro opens up a new pathway to call the underlying Nano Bananna model.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integrating Kiro with Nano Banana 2 Flash Lite
&lt;/h4&gt;

&lt;p&gt;Pairing Kiro with Nano Banana 2 Lite expands the agent’s core capabilities, allowing it to act on multimodal inputs and execute complex tasks on your behalf. [&lt;a href="https://ai.google.dev/gemini-api/docs/antigravity-agent" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.mygreatlearning.com/blog/what-is-gemini-omni-googles-unified-ai-model-for-video-image-audio-and-text/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://antigravity.google/docs/home" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;but wait — there’s more!&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Kiro 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/nb2lite-kiro
&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;nb2lite-kiro
&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;nb2lite
&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;
  
  
  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 shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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:~/nb2lite-kiro$&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 .
2 files already formatted
mypy .
Success: no issues found in 2 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Kiro CLI mcp.json
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .kiro/settings 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;"nb2lite-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/nb2lite-kiro/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;"disabled"&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="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;"aws-mcp"&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;"uvx"&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;"mcp-proxy-for-aws==1.6.0"&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://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-east-1"&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;"disabled"&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="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 Kiro CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Kiro 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 list · 2 configured
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 search: nb2lite-agent 

 Configured Servers
 Name Status Details
 nb2lite-agent ● running 4 tools
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the tools are reviewed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  list the mcp tools for nb2lite

● Read /home/xbill/nb2lite-kiro/.agents/mcp_config.json
● Read /home/xbill/nb2lite-kiro/server.py

  The nb2lite MCP server (nb2lite-agent) exposes 4 tools:

  generate_image

  Generates a new image from a text prompt and saves it locally.

  - prompt (str, required) — natural language description of the image
  - aspect_ratio (str, optional, default "1:1") — 1:1, 16:9, 9:16, 4:3, 3:4
  - thinking_level (str, optional, default "medium") — minimal, low, medium, high

  edit_image

  Edits a previously generated image using its interaction ID (multi-turn continuity).

  - previous_interaction_id (str, required) — ID returned from a prior generation or edit
  - edit_prompt (str, required) — description of changes to apply
  - thinking_level (str, optional, default "medium")

  edit_local_image

  Uploads a local image file (base64 encoded) and applies text-described edits.

  - image_path (str, required) — path to the local image file
  - edit_prompt (str, required) — description of modifications
  - aspect_ratio (str, optional, default "1:1")
  - thinking_level (str, optional, default "medium")

  get_help

  Returns a help summary of the server's configuration and all available tools. No arguments.

  The server uses gemini-3.1-flash-lite-image (overridable via GEMINI_MODEL_NAME) and saves output images to the current
  directory (overridable via IMAGE_OUTPUT_DIR) using the naming pattern &amp;lt;prefix&amp;gt;_&amp;lt;timestamp&amp;gt;_&amp;lt;uuid&amp;gt;.jpg.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the tools are now available for working with the Nano Banana2 Lite models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;summarize the mcp tools

  The nb2lite MCP server provides 4 tools for AI-powered image generation and editing using Google's Gemini model:

  1. generate_image — Create a new image from a text prompt. Control output shape with aspect_ratio and quality/speed
  tradeoff with thinking_level.
  2. edit_image — Iteratively edit a previously generated image by passing its previous_interaction_id. Maintains style
  and pixel continuity across turns.
  3. edit_local_image — Edit an image file already on disk by providing its path and a description of the changes you
  want.
  4. get_help — Returns server configuration status (API key, model name, output directory) and a full tool reference.

  All tools save output images locally. The thinking_level parameter (minimal → high) trades response speed for
  generation quality across all image tools.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Enough, Already! Show me the Money!
&lt;/h4&gt;

&lt;p&gt;Kiro CLI was started up for a hands-on image editing session:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq777td3u15cwe7a8s3v6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq777td3u15cwe7a8s3v6.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Bananas?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  use the mcp tools to edit gen_1782921715_ec8088ac.jpg and make the ghost banana a ghost apple

● Read /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  TASK 1: Edit image using MCP tools to make ghost banana a ghost apple

  STATUS: in-progress

  USER QUERIES: 1 ("use the mcp tools to edit gen_1782921715_ec8088ac.jpg and make the ghost banana a ghost apple")

  DETAILS:

  - The user requested editing the file /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg using the MCP image editing
  tools
  - The image was read and confirmed to exist (JPEG, 492614 bytes) — it's a ghost banana image
  - The MCP tool mcp_nb2lite_agent_edit_local_image was identified as the appropriate tool to use
  - The tool call was initiated with:
    - image_path: /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
    - edit_prompt: "make the ghost banana a ghost apple"
    - aspect_ratio: "1:1"

  - The context window was exhausted before the tool call could complete and return results — the edit has NOT been
  confirmed as completed

  NEXT STEPS:

  - Call mcp_nb2lite_agent_edit_local_image with:
    - image_path: /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
    - edit_prompt: "make the ghost banana a ghost apple"
    - aspect_ratio: "1:1" (or omit for default)

  - Save/confirm the output image path returned by the tool
  - Report the result to the user

  FILEPATHS:

  - /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg (source image to edit)

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  USER CORRECTIONS AND INSTRUCTIONS:

  - Use the MCP tools (specifically mcp_nb2lite_agent_edit_local_image) for image editing — not other approaches
  - The workspace is /home/xbill/nb2lite-kiro/

  Files to read:

  - /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg (the image to edit — already read, skip re-reading unless
  needed)
● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg, edit_prompt=make the ghost banana a ghost apple,
    aspect_ratio=1:1
● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg, edit_prompt=make the ghost banana a ghost apple,
    aspect_ratio=1:1, thinking_level=low
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  The edit succeeded. The ghost banana has been transformed into a ghost apple and saved to:

  /home/xbill/nb2lite-kiro/edit_local_1782922067_7371b516.jpg
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9irkoi84sa6qlzqysd7z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9irkoi84sa6qlzqysd7z.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Apples?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  what is the interactions API ID

  The interaction ID returned from the edit is:

  v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8

▸ Credits: 0.06 • Time: 2s
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  with v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8 and the MCP tools make the ghost apple a
  ghost pinapple

● edit_image
    ╰ previous_interaction_id=v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8, edit_prompt=make
    the ghost apple a ghost pineapple, thinking_level=low
    {
      "content": [ { ...+5 lines (ctrl+o to toggle) Done! The ghost apple has been turned into a ghost pineapple, saved to: /home/xbill/nb2lite-kiro/edit_1782922194_394f5f79.jpg New interaction ID: v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXMFR0RmFxbS1Pdi1YX3VNUDVjN3RnQWc
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhhsmj61opwn7rmdlvfzd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhhsmj61opwn7rmdlvfzd.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One last example — the banner for this article was re-themed in steam-punk style:&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 MCP tool to edit_local_image and retheme ghost-banana.jpeg as steam-punk

● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/ghost_banana.jpeg, edit_prompt=retheme this image as steampunk, with steampunk
    aesthetics including brass gears, cogs, pipes, copper tones, Victorian industrial style, goggles, and mechanical
    elements, aspect_ratio=1:1, thinking_level=low
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Done! The steampunk-themed ghost banana has been saved to:

  /home/xbill/nb2lite-kiro/edit_local_1782922350_db5b8fcc.jpg

  Interaction ID: v1_ChdiRHhGYXN5Zk85YkotOFlQZ19TbXFRYxIXYkR4RmFzeWZPOWJKLThZUGdfU21xUWM

▸ Credits: 0.15 • Time: 16s
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dcxrcjwyskqcg03xgru.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dcxrcjwyskqcg03xgru.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Kiro CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Nano Banana 2 Lite and Kiro 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 Kiro CLI running as a MCP client in the same local environment.&lt;/p&gt;

&lt;p&gt;This MCP Python server provided all of the management tools to interact with the model and generate high quality cyberpunk banana images.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>gemini</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Nano Banana 2 Lite with Kiro</title>
      <dc:creator>xbill</dc:creator>
      <pubDate>Wed, 01 Jul 2026 18:05:51 +0000</pubDate>
      <link>https://dev.to/aws-builders/nano-banana-2-lite-with-kiro-2hb0</link>
      <guid>https://dev.to/aws-builders/nano-banana-2-lite-with-kiro-2hb0</guid>
      <description>&lt;p&gt;This article covers the MCP setup and configuration for using Google Nano Banana 2 Lite and underlying Gemini LLM with Kiro CLI to enhance and extend image operations over the MCP protocol.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpwnksgw5pq24hk437qw.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpwnksgw5pq24hk437qw.jpeg" width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What is Google Nano Banana 2 Lite?
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Nano Banana 2 Lite&lt;/strong&gt; (officially known as the &lt;strong&gt;Gemini 3.1 Flash-Lite Image&lt;/strong&gt; model) is Google’s fastest and most cost-efficient AI image generation and editing model. It is built specifically for enterprises and developers who need to generate high-quality images quickly and affordably at a large scale. [&lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://9to5google.com/2026/06/30/notebooklm-short-video-overviews/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Key Features&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-Fast Latency:&lt;/strong&gt; Capable of generating high-quality images in about 4 seconds. [&lt;a href="https://blog.google/innovation-and-ai/technology/ai/nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-Efficient Pricing:&lt;/strong&gt; Priced at approximately $0.034 per 1,000 images in Google AI Studio, undercutting standard models and previous versions. [&lt;a href="https://venturebeat.com/technology/google-unveils-nano-banana-2-lite-aka-gemini-3-1-flash-lite-for-low-cost-4-second-fast-enterprise-image-generations" rel="noopener noreferrer"&gt;1&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-World Grounding:&lt;/strong&gt; Integrates with Google Web and Image Search to produce highly accurate visuals based on real-world information, such as live weather data and exact global locations. [&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemini-image/flash-lite/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro-Level Editing:&lt;/strong&gt; Allows for nuanced image-editing capabilities, aspect ratio control, and text rendering/translation directly onto images. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/build-with-nano-banana-2/" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Character Consistency:&lt;/strong&gt; Retains the fidelity of subjects across multiple generations and scenarios, making it highly effective for storyboarding and marketing campaigns. [&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/bringing-nano-banana-2-to-enterprise" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/ultimate-prompting-guide-for-nano-banana" rel="noopener noreferrer"&gt;2&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More details are here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-omni-flash-nano-banana-2-lite/" rel="noopener noreferrer"&gt;Start building with Nano Banana 2 Lite and Gemini Omni Flash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-1-flash-lite-image" rel="noopener noreferrer"&gt;Gemini 3.1 Flash-Lite Image (Nano Banana 2 Lite) | Gemini Enterprise Agent Platform | Google Cloud Documentation&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Haven’t You Done this One Before?
&lt;/h4&gt;

&lt;p&gt;What is old is new.&lt;/p&gt;

&lt;p&gt;This article extends a previous article covering using Antigravity CLI with MCP servers. The original article is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/google-cloud/nano-banana-2-lite-with-mcp-and-antigravity-cli-606e13ae6501" rel="noopener noreferrer"&gt;Nano Banana 2 Lite with MCP, and Antigravity CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same structured approach is used to enable Python MCP servers on Kiro CLI.&lt;/p&gt;

&lt;h4&gt;
  
  
  This seems Pretty Basic- why even Bother?!
&lt;/h4&gt;

&lt;p&gt;When configuring a new environment and new tools — the key to a successful deployment is to validate the basic building blocks for the approach. Python MCP servers allow CLI tools like Kiro to be dynamically extended with a clear approach to enable minimal MCP tools. Before attempting more complicated MCP tools — a set of basic MCP commands with the simplest MCP protocol (stdio) is used to verify the functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  AWS Setup
&lt;/h4&gt;

&lt;p&gt;The AWS CLI provides the basic tools for working with the AWS services:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the AWS 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;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/aws &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="go"&gt;aws-cli/2.34.57 Python/3.14.5 Linux/6.6.137+ exe/x86_64.ubuntu.24
&lt;/span&gt;&lt;span class="gp"&gt;xbill9@cloudshell:~ (aisprint-491218)$&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the tools are installed — login to the AWS console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws login &lt;span class="nt"&gt;--remote&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is Kiro
&lt;/h4&gt;

&lt;p&gt;Kiro is an agentic, AI-powered Integrated Development Environment (IDE) built by Amazon Web Services (AWS) designed to help developers move from initial concepts to production-ready software. Based on a fork of VS Code (Code OSS), Kiro feels familiar while acting like an autonomous co-developer. [&lt;a href="https://dev.to/aws-builders/introducing-kiro-an-ai-ide-that-thinks-like-a-developer-42jp"&gt;1&lt;/a&gt;, &lt;a href="https://caylent.com/blog/kiro-first-impressions" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.constellationr.com/insights/news/aws-launches-kiro-ide-powered-ai-agents" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  Installing Kiro
&lt;/h4&gt;

&lt;p&gt;The main download site for Kiro is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://kiro.dev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://kiro.dev/" rel="noopener noreferrer"&gt;Kiro: Bring engineering rigor to agentic development&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%2F8jto4o59z59l417plw06.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%2F8jto4o59z59l417plw06.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;for the CLI download — click CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cli.kiro.dev/install | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;once the stars align — you will see the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                             ⢀⣴⣶⣶⣦⡀⠀⠀⠀⠀⢀⣴⣶⣦⣄⡀ ⢀⣴⣶⣶⣦⡀ ⢀⣴⣶⣶⣶⣶⣶⣶⣶⣶⣶⣦⣄⡀ ⢀⣠⣴⣶⣶⣶⣶⣶⣦⣄⡀
                            ⢰⣿⠋⠁⠈⠙⣿⡆⠀⢀⣾⡿⠁ ⠈⢻⡆ ⢰⣿⠋⠁⠈⠙⣿⡆ ⢰⣿⠋⠁ ⠈⠙⠻⣦ ⣴⡿⠟⠋⠁ ⠈⠙⠻⢿⣦
                            ⢸⣿⠀⠀⠀⠀⣿⣇⣴⡿⠋⠀⠀ ⢀⣼⠇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢠⣤⣤⣤⣤⣄ ⣿⡆ ⣼⡟⠀⠀⠀ ⣀⣀⣀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⣿⡿⠋⠀⠀ ⢀⣾⡿⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⠉⠉⠉⣿⡇ ⣿⡇ ⣼⡟⠀⠀ ⣰⡿⠟⠛⠻⢿⣆⠀⠀ ⢻⣧
                            ⢸⣿⠀⠀⠀⠀⠙⠁⠀⠀ ⢀⣼⡟⠁ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⢸⣿⣶⣶⡶⠋⠀ ⣿⠇ ⢰⣿⠀⠀⠀⢰⣿⠀⠀⠀ ⣿⡆⠀⠀ ⣿⡆
                            ⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⠹⣷⡀ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀ ⣠⣼⠟ ⢸⣿⠀⠀ ⢸⣿⠀⠀⠀⠀ ⣿⡇⠀⠀ ⣿⡇
                            ⢸⣿⠀⠀⠀⠀⠀⣠⡀⠀⠀ ⠹⣷⡄ ⢸⣿⠀⠀⠀⠀⣿⡇⠀⢸⣿⠀⠀⠀⠀⣤⣄ ⠀⠀⠹⣿⡅ ⠸⣿⠀⠀ ⠸⣿⠀⠀⠀⠀ ⣿⠇⠀ ⣿⠇
                            ⢸⣿⠀⠀⠀⠀⣾⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡟⣷⡀⠀⠀ ⠘⣿⣆ ⢻⣧⠀⠀ ⠹⣷⣦⣤⣤⣾⠏⠀⠀⠀⣼⡟
                            ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢸⣿⠀⠀⠀⠀⣿⡇ ⢸⣿⠀⠀⠀⠀⣿⡇⠹⣷⡀ ⠀⠈⢻⡇ ⢻⣧⠀⠀⠀ ⠉⠉⠉ ⣼⡟
                            ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠸⣿⣄⡀⢀⣠⣿⠇ ⠸⣿⣄⡀⢀⣠⣿⠇⠀⠙⣷⡀ ⢀⣼⠇ ⠻⣷⣦⣄⡀ ⢀⣠⣴⣾⠟
                             ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁ ⠈⠻⠿⠿⠟⠁⠀⠀⠀⠈⠻⠿⠿⠟⠁ ⠀⠀⠈⠙⠻⠿⠿⠿⠿⠟⠋⠁

                                                 Welcome to Kiro CLI V3!

                             What's new: Specs, expanded hooks, and an improved trust model.
                         Migration tooling to bring your V2 configurations to V3 is coming soon.
                                              https://kiro.dev/docs/cli/v3/

                                         Share feedback anytime with /feedback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  What is MCP?
&lt;/h4&gt;

&lt;p&gt;Unless you have been living off grid without Internet- MCP is the new universal connector and next “Big Thing”.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://cloud.google.com/discover/what-is-model-context-protocol" rel="noopener noreferrer"&gt;What is Model Context Protocol (MCP)? A guide&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;
  
  
  Isn’t MCP overkill?
&lt;/h4&gt;

&lt;p&gt;There are many ways to call models. Native MCP support in Kiro opens up a new pathway to call the underlying Nano Bananna model.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integrating Kiro with Nano Banana 2 Flash Lite
&lt;/h4&gt;

&lt;p&gt;Pairing Kiro with Nano Banana 2 Lite expands the agent’s core capabilities, allowing it to act on multimodal inputs and execute complex tasks on your behalf. [&lt;a href="https://ai.google.dev/gemini-api/docs/antigravity-agent" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.mygreatlearning.com/blog/what-is-gemini-omni-googles-unified-ai-model-for-video-image-audio-and-text/" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://antigravity.google/docs/home" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;h4&gt;
  
  
  So what is the Secret Sauce?
&lt;/h4&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; allows for a clean consistent call to the model.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Interactions API&lt;/strong&gt; is Google’s unified interface for building with Gemini AI models and autonomous agents. Rather than using multiple separate endpoints for text chat, tool use, image generation, or background agents, it provides a single, streamlined API to handle complex, stateful workflows. [&lt;a href="https://www.youtube.com/watch?v=65VEhvJ08LM" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-quickstart" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.philschmid.de/interactions-api-developer-guide" rel="noopener noreferrer"&gt;3&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/interactions-overview" rel="noopener noreferrer"&gt;Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ai.google.dev/api/interactions-api" rel="noopener noreferrer"&gt;Gemini Interactions API | Gemini API | Google AI for Developers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;but wait — there’s more!&lt;/p&gt;

&lt;h4&gt;
  
  
  There is A Skill for That!
&lt;/h4&gt;

&lt;p&gt;You can make the magic happen!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/interactions-api-general-availability/" rel="noopener noreferrer"&gt;Interactions API: our primary interface for Gemini models and agents&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add google-gemini/gemini-skills &lt;span class="nt"&gt;--skill&lt;/span&gt; gemini-interactions-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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 Kiro 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/nb2lite-kiro
&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;nb2lite-kiro
&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;nb2lite
&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;
  
  
  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 shell"&gt;&lt;code&gt;make &lt;span class="nb"&gt;install
&lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&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:~/nb2lite-kiro$&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 .
2 files already formatted
mypy .
Success: no issues found in 2 source files
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Kiro CLI mcp.json
&lt;/h4&gt;

&lt;p&gt;A sample MCP server file is provided in the .kiro/settings 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;"nb2lite-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/nb2lite-kiro/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;"disabled"&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="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;"aws-mcp"&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;"uvx"&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;"mcp-proxy-for-aws==1.6.0"&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://aws-mcp.us-east-1.api.aws/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--metadata"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"AWS_REGION=us-east-1"&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;"disabled"&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="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 Kiro CLI
&lt;/h4&gt;

&lt;p&gt;The final connection test uses Kiro 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 list · 2 configured
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 search: nb2lite-agent 

 Configured Servers
 Name Status Details
 nb2lite-agent ● running 4 tools
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the tools are reviewed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  list the mcp tools for nb2lite

● Read /home/xbill/nb2lite-kiro/.agents/mcp_config.json
● Read /home/xbill/nb2lite-kiro/server.py

  The nb2lite MCP server (nb2lite-agent) exposes 4 tools:

  generate_image

  Generates a new image from a text prompt and saves it locally.

  - prompt (str, required) — natural language description of the image
  - aspect_ratio (str, optional, default "1:1") — 1:1, 16:9, 9:16, 4:3, 3:4
  - thinking_level (str, optional, default "medium") — minimal, low, medium, high

  edit_image

  Edits a previously generated image using its interaction ID (multi-turn continuity).

  - previous_interaction_id (str, required) — ID returned from a prior generation or edit
  - edit_prompt (str, required) — description of changes to apply
  - thinking_level (str, optional, default "medium")

  edit_local_image

  Uploads a local image file (base64 encoded) and applies text-described edits.

  - image_path (str, required) — path to the local image file
  - edit_prompt (str, required) — description of modifications
  - aspect_ratio (str, optional, default "1:1")
  - thinking_level (str, optional, default "medium")

  get_help

  Returns a help summary of the server's configuration and all available tools. No arguments.

  The server uses gemini-3.1-flash-lite-image (overridable via GEMINI_MODEL_NAME) and saves output images to the current
  directory (overridable via IMAGE_OUTPUT_DIR) using the naming pattern &amp;lt;prefix&amp;gt;_&amp;lt;timestamp&amp;gt;_&amp;lt;uuid&amp;gt;.jpg.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  We have Lift Off!
&lt;/h4&gt;

&lt;p&gt;Finally- the tools are now available for working with the Nano Banana2 Lite models:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;summarize the mcp tools

  The nb2lite MCP server provides 4 tools for AI-powered image generation and editing using Google's Gemini model:

  1. generate_image — Create a new image from a text prompt. Control output shape with aspect_ratio and quality/speed
  tradeoff with thinking_level.
  2. edit_image — Iteratively edit a previously generated image by passing its previous_interaction_id. Maintains style
  and pixel continuity across turns.
  3. edit_local_image — Edit an image file already on disk by providing its path and a description of the changes you
  want.
  4. get_help — Returns server configuration status (API key, model name, output directory) and a full tool reference.

  All tools save output images locally. The thinking_level parameter (minimal → high) trades response speed for
  generation quality across all image tools.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Enough, Already! Show me the Money!
&lt;/h4&gt;

&lt;p&gt;Kiro CLI was started up for a hands-on image editing session:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq777td3u15cwe7a8s3v6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq777td3u15cwe7a8s3v6.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Bananas?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  use the mcp tools to edit gen_1782921715_ec8088ac.jpg and make the ghost banana a ghost apple

● Read /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  TASK 1: Edit image using MCP tools to make ghost banana a ghost apple

  STATUS: in-progress

  USER QUERIES: 1 ("use the mcp tools to edit gen_1782921715_ec8088ac.jpg and make the ghost banana a ghost apple")

  DETAILS:

  - The user requested editing the file /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg using the MCP image editing
  tools
  - The image was read and confirmed to exist (JPEG, 492614 bytes) — it's a ghost banana image
  - The MCP tool mcp_nb2lite_agent_edit_local_image was identified as the appropriate tool to use
  - The tool call was initiated with:
    - image_path: /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
    - edit_prompt: "make the ghost banana a ghost apple"
    - aspect_ratio: "1:1"

  - The context window was exhausted before the tool call could complete and return results — the edit has NOT been
  confirmed as completed

  NEXT STEPS:

  - Call mcp_nb2lite_agent_edit_local_image with:
    - image_path: /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg
    - edit_prompt: "make the ghost banana a ghost apple"
    - aspect_ratio: "1:1" (or omit for default)

  - Save/confirm the output image path returned by the tool
  - Report the result to the user

  FILEPATHS:

  - /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg (source image to edit)

  ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

  USER CORRECTIONS AND INSTRUCTIONS:

  - Use the MCP tools (specifically mcp_nb2lite_agent_edit_local_image) for image editing — not other approaches
  - The workspace is /home/xbill/nb2lite-kiro/

  Files to read:

  - /home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg (the image to edit — already read, skip re-reading unless
  needed)
● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg, edit_prompt=make the ghost banana a ghost apple,
    aspect_ratio=1:1
● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/gen_1782921715_ec8088ac.jpg, edit_prompt=make the ghost banana a ghost apple,
    aspect_ratio=1:1, thinking_level=low
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  The edit succeeded. The ghost banana has been transformed into a ghost apple and saved to:

  /home/xbill/nb2lite-kiro/edit_local_1782922067_7371b516.jpg
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9irkoi84sa6qlzqysd7z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9irkoi84sa6qlzqysd7z.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not a fan of Apples?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  what is the interactions API ID

  The interaction ID returned from the edit is:

  v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8

▸ Credits: 0.06 • Time: 2s
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  with v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8 and the MCP tools make the ghost apple a
  ghost pinapple

● edit_image
    ╰ previous_interaction_id=v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXVWp0RmF0amRHLV91X3VNUC03ZWlnUW8, edit_prompt=make
    the ghost apple a ghost pineapple, thinking_level=low
    {
      "content": [ { ...+5 lines (ctrl+o to toggle) Done! The ghost apple has been turned into a ghost pineapple, saved to: /home/xbill/nb2lite-kiro/edit_1782922194_394f5f79.jpg New interaction ID: v1_ChdVanRGYXRqZEctX3VfdU1QLTdlaWdRbxIXMFR0RmFxbS1Pdi1YX3VNUDVjN3RnQWc
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhhsmj61opwn7rmdlvfzd.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhhsmj61opwn7rmdlvfzd.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One last example — the banner for this article was re-themed in steam-punk style:&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 MCP tool to edit_local_image and retheme ghost-banana.jpeg as steam-punk

● edit_local_image
    ╰ image_path=/home/xbill/nb2lite-kiro/ghost_banana.jpeg, edit_prompt=retheme this image as steampunk, with steampunk
    aesthetics including brass gears, cogs, pipes, copper tones, Victorian industrial style, goggles, and mechanical
    elements, aspect_ratio=1:1, thinking_level=low
    {
      "content": [
        {
    ...+5 lines (ctrl+o to toggle)

  Done! The steampunk-themed ghost banana has been saved to:

  /home/xbill/nb2lite-kiro/edit_local_1782922350_db5b8fcc.jpg

  Interaction ID: v1_ChdiRHhGYXN5Zk85YkotOFlQZ19TbXFRYxIXYkR4RmFzeWZPOWJKLThZUGdfU21xUWM

▸ Credits: 0.15 • Time: 16s
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dcxrcjwyskqcg03xgru.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5dcxrcjwyskqcg03xgru.jpeg" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  One last thought- Where are Agents?
&lt;/h4&gt;

&lt;p&gt;Where are the Agents?&lt;/p&gt;

&lt;p&gt;The Kiro CLI harness itself uses agents to manage the workflow.&lt;/p&gt;

&lt;p&gt;The additional touch point for leveraging the MCP interface is that they all are exposed as MCP tools. The MCP tools can be called directly from Agent code or used as a template for Interactions API calls embedded in an Agent.&lt;/p&gt;

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

&lt;p&gt;The strategy for using MCP with Nano Banana 2 Lite and Kiro 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 Kiro CLI running as a MCP client in the same local environment.&lt;/p&gt;

&lt;p&gt;This MCP Python server provided all of the management tools to interact with the model and generate high quality cyberpunk banana images.&lt;/p&gt;

</description>
      <category>kiro</category>
      <category>agents</category>
      <category>mcps</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
