<?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: Praveen Gowthaman</title>
    <description>The latest articles on DEV Community by Praveen Gowthaman (@praveengowthaman).</description>
    <link>https://dev.to/praveengowthaman</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F36770%2F02ea4301-80da-4eec-9e09-30fdb0861993.jpg</url>
      <title>DEV Community: Praveen Gowthaman</title>
      <link>https://dev.to/praveengowthaman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/praveengowthaman"/>
    <language>en</language>
    <item>
      <title>How to Build and Connect an MCP Server with Quarkus and Claude</title>
      <dc:creator>Praveen Gowthaman</dc:creator>
      <pubDate>Sun, 08 Mar 2026 15:39:52 +0000</pubDate>
      <link>https://dev.to/praveengowthaman/how-to-build-and-connect-an-mcp-server-with-quarkus-and-claude-lc3</link>
      <guid>https://dev.to/praveengowthaman/how-to-build-and-connect-an-mcp-server-with-quarkus-and-claude-lc3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this blog, we will walk through how to create a simple MCP server using Quarkus and explore how to integrate it with Claude Desktop.&lt;/p&gt;

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

&lt;p&gt;Before getting started, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A basic understanding of Java and Quarkus&lt;/li&gt;
&lt;li&gt;Java 17 installed on your system&lt;/li&gt;
&lt;li&gt;Claude Desktop installed&lt;/li&gt;
&lt;li&gt;A basic understanding of LLMs (Large Language Models)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it — once these are in place, we’re ready to start building our MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the Quarkus Project
&lt;/h3&gt;

&lt;p&gt;To get started, we first need to create a Quarkus project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;&lt;a href="https://code.quarkus.io" rel="noopener noreferrer"&gt;https://code.quarkus.io&lt;/a&gt;&lt;/strong&gt; in your browser.&lt;/li&gt;
&lt;li&gt;Configure the project with the following settings:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build Tool:&lt;/strong&gt; Gradle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Java Version:&lt;/strong&gt; 17&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group:&lt;/strong&gt; &lt;code&gt;&amp;lt;group-id-of-ur-choice&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact:&lt;/strong&gt; &lt;code&gt;mcp-tutorial-app&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;Generate and download the project.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the project is downloaded, extract it and open it in your preferred IDE (IntelliJ IDEA or VS Code).&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Required Dependencies
&lt;/h3&gt;

&lt;p&gt;Next, we need to add the dependencies required to build an MCP server and call external REST APIs.&lt;/p&gt;

&lt;p&gt;Open the &lt;code&gt;build.gradle&lt;/code&gt; file and ensure the following dependencies are present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;enforcedPlatform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;enforcedPlatform&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${quarkusPlatformGroupId}:quarkus-mcp-server-bom:${quarkusPlatformVersion}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkus:quarkus-rest'&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkus:quarkus-rest-client'&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkus:quarkus-rest-client-jackson'&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkiverse.mcp:quarkus-mcp-server-stdio'&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkus:quarkus-arc'&lt;/span&gt;

    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="s1"&gt;'io.quarkus:quarkus-junit5'&lt;/span&gt;
    &lt;span class="n"&gt;testImplementation&lt;/span&gt; &lt;span class="s1"&gt;'io.rest-assured:rest-assured'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These dependencies enable the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;quarkus-rest&lt;/strong&gt; – Allows us to expose REST endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quarkus-rest-client&lt;/strong&gt; – Helps us call external APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quarkus-rest-client-jackson&lt;/strong&gt; – Provides JSON serialization support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quarkus-mcp-server-stdio&lt;/strong&gt; – Enables the application to run as an MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;quarkus-arc&lt;/strong&gt; – Provides dependency injection support in Quarkus.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating the REST Client
&lt;/h3&gt;

&lt;p&gt;For this step, we will create a REST client to call the Quarkus Extensions API. Instead of creating everything from scratch, we can reuse the &lt;strong&gt;starter code&lt;/strong&gt; that comes with the project generated from &lt;strong&gt;code.quarkus.io&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you download the project from &lt;strong&gt;code.quarkus.io&lt;/strong&gt;, it already includes a sample REST resource (&lt;code&gt;MyRemoteService&lt;/code&gt;). We can use this starter project as a base and extend it to implement our REST client.&lt;/p&gt;

&lt;p&gt;Quarkus provides support for REST clients using the &lt;strong&gt;MicroProfile REST Client&lt;/strong&gt; specification, which makes it easy to call external APIs using simple Java interfaces.&lt;/p&gt;

&lt;p&gt;This interface (&lt;code&gt;MyRemoteService&lt;/code&gt;) is annotated with &lt;code&gt;@RegisterRestClient&lt;/code&gt;. This interface will be responsible for calling the external Quarkus Extensions API and returning the extension details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.praveen.tutorial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.eclipse.microprofile.rest.client.inject.RegisterRestClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.ws.rs.GET&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.ws.rs.Path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.ws.rs.QueryParam&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Set&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * To use it via injection.
 *
 * {@code
 *     @Inject
 *     @RestClient
 *     MyRemoteService myRemoteService;
 *
 *     public void doSomething() {
 *         Set&amp;lt;MyRemoteService.Extension&amp;gt; restClientExtensions = myRemoteService.getExtensionsById("io.quarkus:quarkus-hibernate-validator");
 *     }
 * }
 */&lt;/span&gt;
&lt;span class="nd"&gt;@RegisterRestClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseUri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://stage.code.quarkus.io/api"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MyRemoteService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/extensions"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Extension&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getExtensionsById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@QueryParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Extension&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;shortName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nd"&gt;@java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Override&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Extension{"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                    &lt;span class="s"&gt;"id='"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'\''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                    &lt;span class="s"&gt;", name='"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'\''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                    &lt;span class="s"&gt;", shortName='"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shortName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'\''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                    &lt;span class="s"&gt;", keywords="&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                    &lt;span class="sc"&gt;'}'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementing MCP Tools
&lt;/h3&gt;

&lt;p&gt;Now that we have created the REST client, the next step is to expose functionality to Claude using &lt;strong&gt;MCP Tools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;MCP tools allow Claude (or any MCP-compatible client) to call specific methods in our application. These methods can perform actions such as calling APIs, retrieving data, or executing business logic.&lt;/p&gt;

&lt;p&gt;Below is the class we will use to implement our MCP tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.praveen.tutorial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Set&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.inject.Inject&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.eclipse.microprofile.rest.client.inject.RestClient&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.quarkiverse.mcp.server.Tool&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;io.quarkiverse.mcp.server.ToolArg&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.praveen.tutorial.MyRemoteService.Extension&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.praveen.tutorial.MyRemoteService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExtensionMCP&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@RestClient&lt;/span&gt;
    &lt;span class="nd"&gt;@Inject&lt;/span&gt;
    &lt;span class="nc"&gt;MyRemoteService&lt;/span&gt; &lt;span class="n"&gt;remoteService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Tool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Get the quarkus extension details using the query param called id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Extension&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAlerts&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@ToolArg&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"String field describing quarkus id name eg:io.quarkus:quarkus-hibernate-validator"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;remoteService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getExtensionsById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s understand each part of this class.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Dependency Injection with &lt;code&gt;@Inject&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Inject&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@Inject&lt;/code&gt; is provided by &lt;strong&gt;CDI (Contexts and Dependency Injection)&lt;/strong&gt; in Quarkus.&lt;br&gt;
It allows Quarkus to automatically create and manage the instance of the required class.&lt;/p&gt;

&lt;p&gt;In this case, Quarkus injects the &lt;code&gt;MyRemoteService&lt;/code&gt; REST client into our class so we can use it to call external APIs.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Using &lt;code&gt;@RestClient&lt;/code&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestClient&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;@RestClient&lt;/code&gt; tells Quarkus that the injected class is a &lt;strong&gt;MicroProfile REST Client&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This annotation ensures that the &lt;code&gt;MyRemoteService&lt;/code&gt; interface is treated as a REST client capable of making HTTP calls to external APIs.&lt;/p&gt;

&lt;p&gt;So when our MCP tool runs, it can call the external Quarkus extensions API through this client.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Declaring the MCP Tool with &lt;code&gt;@Tool&lt;/code&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Tool&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Get the quarkus extension details using the query param called id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;@Tool&lt;/code&gt; is provided by &lt;strong&gt;quarkus-mcp-server&lt;/strong&gt; and is used to expose a method as an &lt;strong&gt;MCP tool&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once the application runs as an MCP server, Claude can discover and call this method.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;description&lt;/code&gt; field is important because it helps the LLM understand what the tool does.&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Tool Arguments with &lt;code&gt;@ToolArg&lt;/code&gt;
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ToolArg&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"String field describing quarkus id name eg:io.quarkus:quarkus-hibernate-validator"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;@ToolArg&lt;/code&gt; describes the input parameter that the tool expects.&lt;/p&gt;

&lt;p&gt;This metadata helps the LLM understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what parameter the tool requires&lt;/li&gt;
&lt;li&gt;the type of input expected&lt;/li&gt;
&lt;li&gt;an example value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this example, the tool expects a &lt;strong&gt;Quarkus extension ID&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  5. Returning the Extension Data
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Extension&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The method returns a &lt;code&gt;Set&lt;/code&gt; of &lt;code&gt;Extension&lt;/code&gt; objects.&lt;br&gt;
The &lt;code&gt;Extension&lt;/code&gt; class is defined inside the &lt;code&gt;MyRemoteService&lt;/code&gt; interface and represents the structure of the response returned by the Quarkus extensions API.&lt;/p&gt;
&lt;h4&gt;
  
  
  6. Calling the REST Client
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;remoteService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getExtensionsById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Finally, the MCP tool calls the REST client method &lt;code&gt;getExtensionsById()&lt;/code&gt; and returns the results.&lt;/p&gt;

&lt;p&gt;When Claude invokes this MCP tool, the flow works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude calls the MCP tool &lt;code&gt;getExtensionsById&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The tool receives the extension &lt;code&gt;id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The REST client calls the external API&lt;/li&gt;
&lt;li&gt;The API response is returned back to Claude&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Building the Application as an Uber JAR
&lt;/h3&gt;

&lt;p&gt;Once the MCP tool implementation is complete, the next step is to package the application as a &lt;strong&gt;single runnable JAR&lt;/strong&gt;, also known as an &lt;strong&gt;Uber JAR&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;Uber JAR&lt;/strong&gt; bundles the application along with all its dependencies into a single executable file. This makes it easy to distribute and run the application without needing to manage external libraries separately.&lt;/p&gt;

&lt;p&gt;To enable Uber JAR packaging in Quarkus, add the following configuration to the &lt;code&gt;application.properties&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;quarkus.package.jar.type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;uber-jar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After adding this configuration, build the project using the Gradle command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./gradlew build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Windows users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gradlew build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the build completes successfully, the Uber JAR will be generated inside the &lt;code&gt;build&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;The generated file will look similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build/mcp-tutorial-app-1.0.0-SNAPSHOT-runner.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This JAR file contains the entire application and can be executed using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-jar&lt;/span&gt; build/mcp-tutorial-app-1.0.0-SNAPSHOT-runner.jar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, our MCP server is packaged and ready to be integrated with &lt;strong&gt;Claude Desktop&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrating the MCP Server with Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Now that our MCP server has been packaged as an Uber JAR, the next step is to integrate it with &lt;strong&gt;Claude Desktop&lt;/strong&gt; so that Claude can discover and use the MCP tools we created.&lt;/p&gt;

&lt;p&gt;Claude Desktop loads MCP servers through a configuration file called &lt;code&gt;claude_desktop_config.json&lt;/code&gt;. By adding an entry for our server in this file, we instruct Claude to start our MCP server when the application launches.&lt;/p&gt;

&lt;h4&gt;
  
  
  Locating the Configuration File
&lt;/h4&gt;

&lt;p&gt;On &lt;strong&gt;Windows&lt;/strong&gt;, the configuration file is located at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\Users\&amp;lt;your-username&amp;gt;\AppData\Roaming\Claude\claude_desktop_config.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open this file using any text editor such as &lt;strong&gt;VS Code&lt;/strong&gt; or &lt;strong&gt;Notepad&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adding the MCP Server Entry
&lt;/h4&gt;

&lt;p&gt;Inside the configuration file, add a new entry under the &lt;code&gt;mcpServers&lt;/code&gt; section that points to the Uber JAR we built earlier.&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;"mcptutorial"&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;"java"&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;"-jar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;your-username&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;projects&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mcp-tutorial-app&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;build&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;mcp-tutorial-app-1.0.0-SNAPSHOT-runner.jar"&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;
  
  
  Understanding the Configuration
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;mcpServers&lt;/strong&gt; – This section defines all MCP servers that Claude Desktop should load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mcptutorial&lt;/strong&gt; – A name used to identify our MCP server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;command&lt;/strong&gt; – The command used to start the server. In this case, we run the JAR using &lt;code&gt;java&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;args&lt;/strong&gt; – Arguments passed to the command. Here we provide &lt;code&gt;-jar&lt;/code&gt; followed by the path to our Uber JAR.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Applying the Changes
&lt;/h4&gt;

&lt;p&gt;After saving the configuration file:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Close &lt;strong&gt;Claude Desktop&lt;/strong&gt; if it is running.&lt;/li&gt;
&lt;li&gt;Restart &lt;strong&gt;Claude Desktop&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When Claude starts again, it will automatically launch the MCP server defined in the code&lt;/p&gt;

&lt;h2&gt;
  
  
  Now let us prompt Claude and see the toll call being made
&lt;/h2&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%2Frvg2jt4kqntgf7yx6maj.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%2Frvg2jt4kqntgf7yx6maj.png" alt=" " 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.amazonaws.com%2Fuploads%2Farticles%2Fvmjc5qg8owo1orenpted.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%2Fvmjc5qg8owo1orenpted.png" alt=" " width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="https://quarkus.io/blog/mcp-server/" rel="noopener noreferrer"&gt;https://quarkus.io/blog/mcp-server/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.quarkiverse.io/quarkus-mcp-server/dev/index.html" rel="noopener noreferrer"&gt;https://docs.quarkiverse.io/quarkus-mcp-server/dev/index.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>machinelearning</category>
      <category>java</category>
      <category>ai</category>
    </item>
    <item>
      <title>Exploring OpenClaw: From Multi-Bot Concept to Actionable AI Agent</title>
      <dc:creator>Praveen Gowthaman</dc:creator>
      <pubDate>Wed, 25 Feb 2026 16:08:56 +0000</pubDate>
      <link>https://dev.to/praveengowthaman/exploring-openclaw-from-multi-bot-concept-to-actionable-ai-agent-516h</link>
      <guid>https://dev.to/praveengowthaman/exploring-openclaw-from-multi-bot-concept-to-actionable-ai-agent-516h</guid>
      <description>&lt;p&gt;Recently, I spent some time exploring OpenClaw — an open-source, agentic AI assistant that goes beyond chat and actually executes tasks.&lt;/p&gt;

&lt;p&gt;Unlike traditional LLM chat interfaces, OpenClaw operates more like an autonomous agent. It can connect to messaging platforms (like Telegram), execute commands, manage reminders, perform searches, and automate workflows.&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%2Fmhymxjjafuuwe1sxdmmz.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%2Fmhymxjjafuuwe1sxdmmz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of it as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🧠 AI brain + 💻 Command layer + 📲 Messaging interface&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What Makes OpenClaw Interesting?&lt;br&gt;
OpenClaw started as a multi-bot framework and evolved into a more unified, agent-driven system. The core idea is simple:&lt;/p&gt;

&lt;p&gt;Instead of asking AI questions, you assign it actions.&lt;/p&gt;

&lt;p&gt;It runs locally or on a server and connects through APIs and messaging bots.&lt;/p&gt;

&lt;p&gt;Running OpenClaw (Example via CMD)&lt;br&gt;
Here’s what a typical startup might look like from the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ python main.py

Starting OpenClaw...
Loading agent modules...
Connecting to Telegram bot...
OpenClaw is ready to assist.

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

&lt;/div&gt;



&lt;p&gt;Once running, you can issue structured commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd&amp;gt; /agenda today
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Today's Agenda:
- 10:00 AM - Team Meeting
- 1:30 PM - Client Call
- 4:00 PM - Project Deadline

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

&lt;/div&gt;



&lt;p&gt;Setting a reminder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd&amp;gt; /remind 6pm "Submit timesheet"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reminder set for 6:00 PM - Submit timesheet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Web search example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd&amp;gt; /websearch "latest AI agent frameworks"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Telegram Integration
&lt;/h2&gt;

&lt;p&gt;One powerful feature is Telegram bot integration.&lt;/p&gt;

&lt;p&gt;Setup flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a bot using &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Copy the generated bot token&lt;/li&gt;
&lt;li&gt;Add it to your environment configuration:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export TELEGRAM_BOT_TOKEN=your_token_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart OpenClaw&lt;/p&gt;

&lt;p&gt;Now you can interact directly from Telegram:&lt;/p&gt;

&lt;p&gt;You:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What's on my schedule today?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bot:&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 your agenda:
✔ 10 AM - Team Sync
✔ 1:30 PM - Client Call
✔ 4 PM - Project Deadline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns Telegram into a command console for your AI agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;We’re moving from: Chatbots ➝ Task bots ➝ Autonomous agents&lt;/p&gt;

&lt;p&gt;The real shift isn’t just AI answering questions.&lt;/p&gt;

&lt;p&gt;It’s AI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Managing workflows&lt;/li&gt;
&lt;li&gt;Triggering automations&lt;/li&gt;
&lt;li&gt;Acting on structured commands&lt;/li&gt;
&lt;li&gt;Integrating into daily tools&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s where systems like OpenClaw become powerful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Consideration
&lt;/h2&gt;

&lt;p&gt;Agent-based systems can access local environments and APIs. Always:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use sandbox environments&lt;/li&gt;
&lt;li&gt;Limit permissions&lt;/li&gt;
&lt;li&gt;Protect API tokens&lt;/li&gt;
&lt;li&gt;Avoid connecting sensitive work systems without review&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;OpenClaw represents a shift toward AI that executes, not just converses.&lt;/p&gt;

&lt;p&gt;We’re entering an era where:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your messaging app becomes your control panel Your AI becomes your operations assistant&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exciting space to watch.&lt;/p&gt;

&lt;p&gt;Would love to hear if others are experimenting with agentic AI frameworks.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Java 8 - BiConsumer interface</title>
      <dc:creator>Praveen Gowthaman</dc:creator>
      <pubDate>Tue, 13 Apr 2021 10:06:24 +0000</pubDate>
      <link>https://dev.to/praveengowthaman/java-8-biconsumer-interface-4if9</link>
      <guid>https://dev.to/praveengowthaman/java-8-biconsumer-interface-4if9</guid>
      <description>&lt;h2&gt;
  
  
  What is Bi-Consumer interface ?
&lt;/h2&gt;

&lt;p&gt;Bi-Consumer interface is one of the functional interfaces that Java 8 provides. It is present in java.util.function package.&lt;/p&gt;

&lt;p&gt;It is quite similar to consumer interface, just that it accepts two parameters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    @FunctionalInterface
    public interface BiConsumer&amp;lt;T,U&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since it is a functional interface it has only one method definition . That method is called Accept.&lt;/p&gt;

&lt;p&gt;We all know functional interfaces can have default methods also . So here we have a default method called andThen .&lt;/p&gt;

&lt;h2&gt;
  
  
  What are the methods of the Bi-Consumer interface ?
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Accept :
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;void accept(T t,U u)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The accept method accepts two input parameter and performs a user defined operation on them.&lt;/p&gt;

&lt;h4&gt;
  
  
  AndThen :
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;default BiConsumer&amp;lt;T,U&amp;gt; andThen(BiConsumer&amp;lt;? super T,? super U&amp;gt; after)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The andThen method takes in a Bi-Consumer as an input and it runs it after the Bi-Consumer it is called upon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let us look at few examples !!!!!!
&lt;/h2&gt;

&lt;p&gt;First lets look at the example of accept method . It accepts two values and performs given operation on them .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Class BiConsumerExample{

        public static void main(String[] args){

              BiConsumer&amp;lt;String,String&amp;gt; consumer= (s,s1)-&amp;gt;System.out.println(s+"

                "+s1);

              consumer.accept("Hello","World");

        }

   }

   o/p = Hello World
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let us look at an example of the andThen method of the BiConsumer interface.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Class BiConsumerExample{

        public static void main(String[] args){

              BiConsumer&amp;lt;String,String&amp;gt; consumer1= (s,s1)-&amp;gt;System.out.println(s+" "+s1);

              BiConsumer&amp;lt;String,String&amp;gt; consumer2= (s2,s3)-&amp;gt;System.out.println(

               s2.toUpperCase(),s3.toUpperCase());

              consumer1.andThen(consumer2).accept("Hello","World");

        }

   }

     o/p :

     Hello World

     HELLO WORLD

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

&lt;/div&gt;



&lt;p&gt;Let us look at above example. &lt;/p&gt;

&lt;p&gt;First we are creating one consumer called consumer1 which takes in two strings and just prints them. &lt;/p&gt;

&lt;p&gt;Next we are creating one more consumer called consumer2 which takes in two string converts the strings to uppercase and then prints the strings.&lt;/p&gt;

&lt;p&gt;Next we want to make consumer1 run first and then we want to make consumer2 run. &lt;/p&gt;

&lt;p&gt;So we do &lt;code&gt;consumer1.andThen(consumer2)&lt;/code&gt; which achieves that .&lt;/p&gt;

&lt;p&gt;Next we need to pass some input to perform this operation so we make use of accept method of consumer as below .&lt;/p&gt;

&lt;p&gt;&lt;code&gt;consumer1.andThen(consumer2).accept("Hello","World");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note: Kindly correct me in any info that is wrong on above blog . I am happy to learn .&lt;/p&gt;

&lt;p&gt;Also kindly have a look at my blog :)&lt;/p&gt;

&lt;p&gt;[&lt;a href="https://praveen075.blogspot.com/2021/04/introduction-to-java-8-in-laymans-terms_13.html" rel="noopener noreferrer"&gt;https://praveen075.blogspot.com/2021/04/introduction-to-java-8-in-laymans-terms_13.html&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Thank you&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Introduction to Java 8 in Layman's terms - Functional Interface - Consumer Interface</title>
      <dc:creator>Praveen Gowthaman</dc:creator>
      <pubDate>Wed, 07 Apr 2021 05:10:30 +0000</pubDate>
      <link>https://dev.to/praveengowthaman/introduction-to-java-8-in-layman-s-terms-functional-interface-consumer-interface-iil</link>
      <guid>https://dev.to/praveengowthaman/introduction-to-java-8-in-layman-s-terms-functional-interface-consumer-interface-iil</guid>
      <description>&lt;p&gt;Hi All !!!!&lt;/p&gt;

&lt;p&gt;Want to learn about Java's Consumer functional interface then check the link below .....&lt;/p&gt;

&lt;p&gt;&lt;a href="https://praveen075.blogspot.com/2021/04/introduction-to-java-8-in-laymans-terms_6.html" rel="noopener noreferrer"&gt;https://praveen075.blogspot.com/2021/04/introduction-to-java-8-in-laymans-terms_6.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>webdev</category>
      <category>functional</category>
      <category>consumer</category>
    </item>
    <item>
      <title>Introduction to Java 8 in Layman's terms - Lambda expression &amp; Functional interfaces basics</title>
      <dc:creator>Praveen Gowthaman</dc:creator>
      <pubDate>Mon, 05 Apr 2021 16:52:25 +0000</pubDate>
      <link>https://dev.to/praveengowthaman/introduction-to-java-8-in-layman-s-terms-lambda-expression-functional-interfaces-basics-30b1</link>
      <guid>https://dev.to/praveengowthaman/introduction-to-java-8-in-layman-s-terms-lambda-expression-functional-interfaces-basics-30b1</guid>
      <description>&lt;p&gt;Here is my blog post on some basic knowledge of Lambda expression &amp;amp; Functional interfaces.&lt;/p&gt;

&lt;p&gt;It's totally from a beginner's perspective. Kindly have a look. Hope you guys like it .....&lt;/p&gt;

&lt;p&gt;Let me know if I have got something wrong ... Happy to correct it ....&lt;/p&gt;

&lt;p&gt;&lt;a href="https://praveen075.blogspot.com/2021/04/introduction-to-java-8-in-laymans-terms.html" rel="noopener noreferrer"&gt;introduction-to-java-8-in-laymans-terms.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>lambda</category>
      <category>functional</category>
      <category>java</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
