Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

Short answer: create a Quarkus application with the io.quarkiverse.mcp:quarkus-mcp-server-http extension, annotate a Java method with @Tool, run the app in dev mode, and point an MCP client at http://localhost:8080/mcp. This tutorial uses the modern Streamable HTTP transport and a minimal greeting tool, then shows testing, troubleshooting, security considerations, and the legacy SSE endpoint.

What you will build

You will build a Java 17+ Quarkus application that exposes an MCP server over HTTP. The server will publish one tool, greet, which accepts a name and returns a greeting. MCP clients such as MCP Inspector can discover and invoke that tool through Streamable HTTP.

The current Quarkiverse documentation identifies Streamable HTTP as the preferred network transport. The older SSE endpoint remains available for compatibility, but SSE is deprecated in the MCP 2025-03-26 specification. The protocol specification identified by the project overview is 2026-07-28, and the Quarkiverse project version is 2.0.0. Clients and servers must agree on the protocol behavior they support.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Prerequisites

  • JDK 17 or later.
  • Maven 3.9+ or Gradle.
  • A Quarkus project that uses a compatible Quarkus platform.
  • An MCP client for testing. You can use Quarkus Dev UI or MCP Inspector.

Use localhost for the first test. Quarkus protects local HTTP endpoints against DNS-rebinding attacks, so a request made through another hostname or an IP address can receive HTTP 403 even when the application is running correctly.

Choose the extension version carefully

The Quarkus Extensions Registry currently lists quarkus-mcp-server-http version 2.0.1, released September 11, 2026, with Java 17 as the minimum and a stable status. The Quarkiverse development guide’s Maven example uses 2.0.0. Because these values can change independently of your Quarkus platform, check the registry and your platform’s compatibility before copying a coordinate.

The artifact name is:

io.quarkiverse.mcp:quarkus-mcp-server-http

Create the Quarkus project

Using Maven

Generate a normal Quarkus application, then add the HTTP MCP extension. If you already have a project, only the dependency step is required.

mvn io.quarkus.platform:quarkus-maven-plugin:create 
  -DgroupId=com.example 
  -DartifactId=mcp-http-server 
  -DclassName=com.example.GreetingResource 
  -Dpath=/hello
cd mcp-http-server

Add the extension using the version that matches your Quarkus platform and the current registry entry. The development guide demonstrates the following form with version 2.0.0:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
mvn quarkus:add-extension 
  -Dextensions="io.quarkiverse.mcp:quarkus-mcp-server-http:2.0.0"

If your registry check selects 2.0.1, use that version instead. Avoid mixing a newer extension with an older, incompatible Quarkus platform without checking the platform constraints.

Using Gradle

For Gradle, add the same artifact to the application dependencies, using the version selected for your Quarkus platform:

implementation("io.quarkiverse.mcp:quarkus-mcp-server-http:2.0.1")

Replace 2.0.1 if your compatibility check identifies another supported release.

Implement a tool

Create a Java bean in your application and annotate a public method with @Tool:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
package com.example;

import io.quarkiverse.mcp.server.Tool;
import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class GreetingTools {

    @Tool(description = "Greet a user by name")
    public String greet(String name) {
        if (name == null || name.isBlank()) {
            return "Hello!";
        }
        return "Hello, " + name + "!";
    }
}

The Quarkiverse getting-started guide states that “The @Tool annotation automatically registers this method as an MCP tool.” There is no separate manual registration call in this minimal example. The method’s parameter and return type become part of the tool contract exposed to the client.

Design the first tool narrowly

  • Give the tool a clear description; clients use it when deciding which tool to call.
  • Validate input inside the method and return a predictable result.
  • Keep side effects explicit. A tool that writes data, sends mail, or changes infrastructure needs authentication, authorization, auditing, and careful error handling before production use.
  • Use additional MCP capabilities only when needed. Quarkiverse supports tools, resources, prompts, sampling, elicitation, progress, cancellation, and roots; resources and prompts are useful next steps, not prerequisites for the HTTP quickstart.

Start the server in dev mode

mvn quarkus:dev

Quarkus starts the application on port 8080 by default. The modern Streamable HTTP endpoint is:

http://localhost:8080/mcp

The legacy HTTP/SSE endpoint is:

http://localhost:8080/mcp/sse

Use /mcp for new clients. Keep /mcp/sse only when a client or deployment still requires the older SSE flow.

Test with Quarkus Dev UI

  1. Leave mvn quarkus:dev running.
  2. Open the Quarkus Dev UI shown in the terminal, normally http://localhost:8080/q/dev-ui.
  3. Find the MCP Server tools card.
  4. Select greet, enter a value such as Ada, and invoke the tool.
  5. Confirm that the result is Hello, Ada!.

Dev UI is the quickest in-app check because it uses the running Quarkus application directly and requires no separate client configuration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Test with MCP Inspector

  1. Start the application with mvn quarkus:dev.
  2. Launch MCP Inspector using the installation and command appropriate to your environment.
  3. Choose Streamable HTTP as the transport.
  4. Set the server URL to http://localhost:8080/mcp.
  5. Connect, open the discovered tools list, select greet, supply a name, and run it.
  6. Check the response and the request details if discovery or invocation fails.

Inspector is a separate MCP client, so it is a more realistic interoperability test than Dev UI. Test with localhost first; changing the URL to a machine hostname can trigger Quarkus’s DNS-rebinding protection.

Streamable HTTP versus the legacy SSE endpoint

Aspect Streamable HTTP Legacy HTTP/SSE
URL in this quickstart http://localhost:8080/mcp http://localhost:8080/mcp/sse
Current status Preferred network transport Legacy; SSE is deprecated in MCP 2025-03-26
Best use New MCP clients and web-accessible deployments Existing clients that have not migrated
Session model Supports the protocol’s modern request behavior Uses the older SSE-oriented interaction model

The Quarkus announcement dated September 21, 2026 explains that server version 2.0.0 added stateless requests for protocol 2026-07-28 while preserving the older stateful, session-based path. Stateless requests can be handled by any server instance, which is useful in a distributed deployment. Do not assume that every interaction is stateless: tools involving sampling, elicitation, roots, or subscriptions may require the correct stateful or stateless flow and a client that supports it.

Security and production deployment

Quarkiverse documents integration with Quarkus Security for authentication and authorization. That is an integration capability, not proof that the minimal greeting sample is protected by a production access policy.

Before exposing the endpoint publicly

  • Choose an authentication mechanism supported by your Quarkus application and MCP clients.
  • Define authorization rules for the MCP route and for sensitive tools individually.
  • Reject unauthenticated requests before invoking tools with side effects.
  • Validate all tool arguments and set limits for payload size, execution time, and resource use.
  • Log tool invocation outcomes without writing secrets, tokens, or personal data to logs.
  • Test both allowed and denied requests from the actual network path, including a reverse proxy if one is used.
  • Decide whether your deployment needs stateful sessions or can use stateless requests. A load-balanced deployment must preserve whatever session or callback behavior the selected MCP features require.

Troubleshooting

Dependency resolution fails

Symptom: Maven cannot resolve the extension or reports incompatible platform artifacts.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Cause: The extension version and Quarkus platform are out of alignment, or the version from the guide differs from the current registry.

Fix: Check the Quarkus Extensions Registry, select a compatible release, and update the dependency. The registry’s 2.0.1 listing and the guide’s 2.0.0 command are different documented points in time.

The endpoint returns 404

Symptom: /mcp is not found.

Fix: Confirm that quarkus-mcp-server-http is on the runtime classpath, restart dev mode after changing the build file, and verify that you are using the correct application port. Use /mcp for Streamable HTTP and /mcp/sse only for the legacy endpoint.

A client receives HTTP 403

Cause: The request used a hostname or IP address that Quarkus rejected under its DNS-rebinding protection.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: Reconfigure the client to use http://localhost:8080/mcp for local testing. If remote access is intentional, follow Quarkus’s DNS-rebinding guidance and explicitly configure the allowed origins or hostnames for your deployment.

No tools are listed

Checks:

  • Confirm the class is a CDI bean, such as with @ApplicationScoped.
  • Confirm the method imports io.quarkiverse.mcp.server.Tool.
  • Confirm the annotation is on a public method and includes a useful description.
  • Restart dev mode after changing source or dependency files.
  • Ensure Inspector is configured for Streamable HTTP rather than SSE.

Inspector cannot connect

Verify that the application is still running, use the exact URL http://localhost:8080/mcp, and check that no local proxy or firewall is rewriting the request. If the client only supports the old transport, try the documented SSE URL while planning a migration.

Calls work locally but fail behind a load balancer

Review whether the client interaction is stateful or stateless and whether your selected MCP features require callbacks or subscriptions. Configure session affinity or shared state when required, or use the stateless flow supported by your client and server version.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance, reliability, and cost considerations

The official material reviewed for this tutorial does not publish a benchmark or throughput figure, so capacity must be measured in your own environment. Profile tool execution, HTTP connection limits, payload sizes, downstream calls, and concurrent requests under representative load.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Keep tools short-lived or move long work to a job system with progress reporting.
  • Set timeouts on downstream services and return structured, actionable errors.
  • Use health checks and metrics appropriate to your Quarkus deployment.
  • Test cold starts, rolling deployments, retries, and duplicate requests before enabling automatic client retries.
  • For stateless horizontal scaling, verify that every instance can process the requests your client sends.

The extension itself does not impose a separate MCP service fee. Your costs come from the infrastructure, downstream systems, and operational controls you choose.

Or skip the browser setup

If your next task is capturing the MCP endpoint, documentation page, or test result as an image or PDF, ScreenshotNeo provides a single HTTP request instead of a browser automation setup. It accepts cookie and consent banners like a visitor, then removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status.

It also offers an MCP server with take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. Every plan includes the same feature set, including full-page capture, CSS-selector element capture, device presets, custom viewport and retina scale, PDF controls, custom CSS and JavaScript, click and wait actions, request blocking, headers, cookies, user agents, authorization, timezone and geolocation, transparent backgrounds, resizing, TTL caching, signed links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API, and an OpenAPI specification.

curl -G "https://api.screenshotneo.com/v1/shot" 
  -d access_key=YOUR_API_KEY 
  --data-urlencode url=http://localhost:8080/mcp 
  -o mcp-endpoint.webp

See the ScreenshotNeo documentation for authentication and capture options. The Free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Frequently Asked Questions

Can I expose the same Quarkus MCP server over both Streamable HTTP and SSE?

Yes. The documented application exposes Streamable HTTP at /mcp and the legacy HTTP/SSE endpoint at /mcp/sse. Prefer /mcp for new clients and retain SSE only for compatibility.

Do I need to register each @Tool method manually?

No. The Quarkiverse getting-started guide says the @Tool annotation automatically registers the method as an MCP tool.

Is the greeting example production-secure by default?

No. Quarkiverse supports integration with Quarkus Security, but you must configure and test authentication and authorization for your own deployment.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.