Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Standards et agents IA : un tour d’horizon de M...

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Standards et agents IA : un tour d’horizon de MCP, A2A, ADK et plus encore

Les fondations des agents IA reposent sur une poignée de protocoles communs que vous devez maîtriser pour tirer le meilleur parti de votre LLM et de votre framework agentique. C’est pourquoi il est important de les comprendre. Certains gagnent du terrain, d’autres non.

Dans ce deep dive, nous explorerons l’écosystème en vous présentant ces standards et en nous concentrant sur les plus importants. Connaître certains frameworks est également utile pour démarrer plus rapidement. Bienvenue aux protocoles MCP, A2A, ACP, et aux frameworks ADK, Arc, Quarkus, LangChain4j !

Après un aperçu des principaux standards et protocoles, nous commencerons par construire un agent, d'abord sans protocole, puis en ajoutant des interactions MCP. Nous construirons après un système multi-agents et multi-technos (ADK, Quarkus et LangChain4j) via A2A.

Vous apprendrez ce que font ces protocoles et comment ils fonctionnent, mais aussi pourquoi ils sont importants, avec des parcours détaillés et des démos en direct tout au long de la session.

Si vous avez du mal à comprendre tous les détails des protocoles autour des agents IA, cette session est faite pour vous !

Avatar for Guillaume Laforge

Guillaume Laforge

April 22, 2026

More Decks by Guillaume Laforge

Other Decks in Technology

Transcript

  1. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Emmanuel Bernard @EmmanuelBernard Guillaume Laforge

    @glaforge Les standards des agents IA : approfondir MCP, A2A, ADK, LangChain4j…
  2. @EmmanuelBernard (Hexactgon) — @glaforge (Google) AI Agents — a general

    definition An agent is a service that talks to an AI model to perform a goal-based operation using the tools and context it has. 🤖 AGENT 🧠 ENVIRONMENT sensors actuators perceive act Tools!
  3. @EmmanuelBernard (Hexactgon) — @glaforge (Google) The AI agent equation AI

    agent 🟰 LLM ➕ memory ➕ planning ➕ tool use
  4. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Key characteristics & phases of

    AI agents THINK 🧠 Analyze user’s prompt & data, system prompt, to define a goal to reach 🗺 PLAN Check available tools, define the strategy to realize the requested goal REFLECT ♻ Evaluate & loop over the output, to fix errors, to suggest improvements 🎬 ACT RAG searches, API calls, code execution, invoke other agents, request human’s help
  5. @EmmanuelBernard (Hexactgon) — @glaforge (Google) One Agent? Multi-Agent Systems! 🤖

    AGENT 🧠 🤖 AGENT 🧠 🤖 AGENT 🧠 🤖 AGENT 🧠 🤖 AGENT 🧠 🤖 AGENT 🧠
  6. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md — readme for coding agent ACP — Agent Client Protocol MCP — Model Context Protocol A2A — Agent 2 Agent protocol ACP — Agent Communication Protocol AP2 — Agent Payment Protocol ACP — Agentic Commerce Protocol UCP — Universal Commerce Protocol AAIF — Agentic AI Foundation MCP-UI — Interactive UI components for MCP A2UI — A2A UI protocol
  7. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md ACP MCP A2A ACP AP2 ACP UCP AAIF MCP-UI A2UI Standards for AI coding agents to guide their work, and to integrate within IDEs and text editors
  8. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md ACP MCP A2A ACP AP2 ACP UCP AAIF MCP-UI A2UI Protocols for defining tool calling behavior and inter-agent communication
  9. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md ACP MCP A2A ACP AP2 ACP UCP AAIF MCP-UI A2UI Payment & commerce protocols to automate, process payments, to integrate with search and chat platforms
  10. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md ACP MCP A2A ACP AP2 ACP UCP AAIF MCP-UI A2UI Extension of the Linux Foundation to regroup standardization efforts around MCP and AGENTS.md
  11. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A Plethora of STandards &

    Protocols… AGENTS.md ACP MCP A2A ACP AP2 ACP UCP AAIF MCP-UI A2UI Beyond textual chat conversations, adding a UI visual & interaction layer to make agent interfaces richer and more intuitive
  12. @EmmanuelBernard (Hexactgon) — @glaforge (Google) The Big Ones Today: MCP

    & A2A Model Context Protocol Agent 2 Agent Protocol
  13. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Standardizing tool calling An open

    protocol that defines a standardized way to provide tools (functions) & context to your LLMs modelcontextprotocol.io
  14. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Recap on Function Calling Chatbot

    app LLM What’s the weather like in Paris? It’s sunny in Paris! External API or service user prompt + getWeather(String) function contract call getWeather(“Paris”) for me please 󰚦 getWeather(“Paris”) {“forecast”:”sunny”} function response is {“forecast”:”sunny”} Answer: “It’s sunny in Paris!”
  15. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP, the USB-C protocol for

    agent tools? https://norahsakal.com/blog/mcp-vs-api-model-context-protocol-explained/
  16. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP, the USB-C protocol for

    agent tools? https://norahsakal.com/blog/mcp-vs-api-model-context-protocol-explained/
  17. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Hosts, Clients, Servers... Server

    MCP Host / Application MCP Server Streamable HTTP MCP Server STDIO MCP Client MCP Client local resource local resource remote resource remote resource JSON-RPC 2.0
  18. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Primitives MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking
  19. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Client MCP Server notifications/initialized

    Params: • protocolVersion • capabilities • clientInfo Result: • capabilities • serverInfo initialize request with protocol version & client capabilities initialize response with protocol version & server capabilities Initialization
  20. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking Tools enable AI models to interact with external systems Each tool defines a specific operation with inputs and outputs Model-controlled: The model requests tool execution based on context
  21. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Client MCP Server tools/list

    request tools/list response with tools list tools/call request tools/call response with tool result Tools
  22. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — The Full Picture

    User Application MCP Client MCP Server LLM GitHub What repos do I own? Need list of avail. tools Here are the tools tools/list req tools/list resp Query + available tools Function call request Run this tool with args tool/call req tool/call result Request to GitHub Response from GitHub Send tool call result Your repositories are… Execution outcome
  23. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — ADK client StreamableHttpServerParameters

    params = StreamableHttpServerParameters .builder(embeddedServer.getURI().toString() + "/mcp") .build(); try (McpToolset mcpToolset = new McpToolset(params)) { List<BaseTool> moonPhasesTools = mcpToolset.getTools(null).toList().blockingGet(); LlmAgent moonExpertAgent = LlmAgent.builder() .name("moon-expert") .model("gemini-2.5-flash") .description("a moon expert") .instruction(""" You are a knowledgeable astronomy expert focusing on everything about the moon. """) .tools(moonPhasesTools) .build();
  24. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — LangChain4j Client ChatModel

    model = GoogleAiGeminiChatModel.builder() .modelName("gemini-2.5-flash") .apiKey(System.getenv("GOOGLE_API_KEY")) .build(); McpTransport transport = StreamableHttpMcpTransport.builder() .url(embeddedServer.getURI().toString() + "/mcp") .build(); McpClient mcpClient = DefaultMcpClient.builder() .key("MoonPhaseClient") .transport(transport) .build(); McpToolProvider toolProvider = McpToolProvider.builder() .mcpClients(mcpClient) .build();
  25. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — LangChain4j Client interface

    Bot { String chat(String msg); } Bot bot = AiServices.builder(Bot.class) .chatModel(model) .toolProvider(toolProvider) .build(); String response = bot.chat( "What's the current phase of the moon?");
  26. @EmmanuelBernard (Hexactgon) — @glaforge (Google) var transport = HttpClientStreamableHttpTransport .builder(embeddedServer.getURI().toString()

    + "/mcp") .build(); McpSyncClient client = McpClient.sync(transport) .requestTimeout(Duration.ofSeconds(10)) .build(); client.initialize(); McpSchema.ListToolsResult tools = client.listTools(); McpSchema.CallToolResult result = client.callTool( new McpSchema.CallToolRequest("moon-phase-at-date", Map.of("date", "2026-01-15")) ); Tools — MCP SDK Client
  27. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — Server in Micronaut

    public class MoonPhasesMcpServer { @Inject MoonPhasesService moonPhasesService; @Tool(name = "current-moon-phase", description = "Provides the current moon phase") public MoonPhase currentMoonPhase() { return moonPhasesService.currentMoonPhase(); } @Tool(name = "moon-phase-at-date", description = "Provides the moon phase at a certain date (yyyy-MM-dd)") @NotNull public MoonPhase moonPhaseAtDate(@Valid MoonPhaseRequest moonPhaseRequest) { return moonPhasesService.moonPhaseAtDate(moonPhaseRequest.date()); } }
  28. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tools — Server in Quarkus

    public class MoonPhasesMcpServer { @Inject MoonPhasesService moonPhasesService; @Tool(name = "current-moon-phase", description = "Provides the current moon phase") public MoonPhase currentMoonPhase() { return moonPhasesService.currentMoonPhase(); } @Tool(name = "moon-phase-at-date", description = "Provides the moon phase at a certain date (yyyy-MM-dd)") @NotNull public MoonPhase moonPhaseAtDate(@Valid MoonPhaseRequest moonPhaseRequest) { return moonPhasesService.moonPhaseAtDate(moonPhaseRequest.date()); } }
  29. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Resources MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking Resources and resource templates provide read-only access to data that the AI application can retrieve and provide as context to models
  30. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Resources @ResourceTemplate( uriTemplate = "https://arxiv.org/abs/{id}",

    description = "The abstract of the paper") public TextResourceContents getAbstract(@ResourceTemplateArg String id) { Feed feed = performSearch(null, id, 0, 1, null, null); if (feed.entries != null && !feed.entries.isEmpty()) { return TextResourceContents.create( "https://arxiv.org/abs/" + id, feed.entries.get(0).summary); } throw new RuntimeException("Paper not found: " + id); }
  31. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Prompts MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking Provide reusable prompts and prompt templates for a domain, or showcase how to best use the MCP server
  32. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Prompts @Prompt( name = "summarize_paper",

    description = "Summarize the given paper") public PromptMessage summarizePaper(String id) { Feed feed = performSearch(null, id, 0, 1, null, null); if (feed.entries != null && !feed.entries.isEmpty()) { String summary = feed.entries.get(0).summary; return PromptMessage.withUserRole( "Please summarize this paper abstract " + "(ID: " + id + "):\n\n" + summary); } return PromptMessage.withUserRole("Error: Paper not found"); }
  33. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking MCP server asks MCP client to make LLM calls on its behalf But keeps the human in the loop for approval, as token costs are on them!
  34. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling MCP Server MCP Client

    User LLM sampling/createMessage Server initiates sampling Human in the Loop review Present request approval Human approve / modify Model interaction Complete request Return approved response Forward approved request Return generation Response review Response for approval Human approve / modify
  35. @EmmanuelBernard (Hexactgon) — @glaforge (Google) var summaryTool = AsyncToolSpecification.builder() .tool(McpSchema.Tool.builder()

    .name("summarize_text") .description("Requests a summary of the provided text from the model") .inputSchema(new McpSchema.JsonSchema("object", Map.of("text", Map.of("type", "string")), List.of("text"), null, null, null)) .build()) .callHandler((exchange, request) -> { String text = (String) request.arguments().get("text"); // … Sampling — MCP Server
  36. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling — MCP Server //

    … // Create the sampling request for the client var createMessageRequest = CreateMessageRequest.builder() .messages(List.of(new SamplingMessage( Role.USER, new TextContent("Please summarize this: " + text)))) .systemPrompt("You are a concise summarizer.") .maxTokens(100) .build(); // …
  37. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling — MCP Server //

    … // Send the request to the client and return the result return exchange.createMessage(createMessageRequest) .map(samplingResult -> { String summary = ((TextContent) samplingResult.content()).text(); return CallToolResult.builder() .addTextContent("Summary: " + summary) .build(); }); }) .build();
  38. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling — MCP Client //

    Define the client-side sampling handler Function<CreateMessageRequest, Mono<CreateMessageResult>> clientSamplingHandler = request -> { // In a real scenario, the client would forward this to a local or remote LLM System.out.println("Server requested sampling with prompt: " + request.systemPrompt()); // Construct and return the result return Mono.just(CreateMessageResult.builder() .role(Role.ASSISTANT) .content(new TextContent("Mock summary generated by the client.")) .model("gemini-3-flash") .stopReason(StopReason.END_TURN) .build()); }; // …
  39. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Sampling — MCP Client //

    … // Build the client with sampling support McpAsyncClient client = McpClient.async(transport) .capabilities(ClientCapabilities.builder() .sampling() // Advertise sampling support .build()) .sampling(clientSamplingHandler) // Register the handler .build();
  40. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Roots MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking Roots are a mechanism for clients to communicate filesystem access boundaries to servers
  41. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Roots — Client // Define

    a root McpSchema.Root projectRoot = new McpSchema.Root( "file:///path/to/project", "Project Directory"); // Build the client with roots support McpAsyncClient client = McpClient.async(transport) .capabilities(ClientCapabilities.builder() .roots(true) // Advertise client supports listing roots & notifications .build()) .roots(projectRoot) // Set initial roots .build(); // Dynamically add a root later client.addRoot(new McpSchema.Root( "file:///path/to/another", "Secondary Assets")) // Notify server roots changed .then(client.rootsListChangedNotification()) .subscribe();
  42. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Roots — Server var listFilesTool

    = AsyncToolSpecification.builder() .tool(Tool.builder() .name("list_project_files") .description("Lists files within the client-provided roots") .build()) .callHandler((exchange, request) -> { // Retrieve all roots from the client return exchange.listRoots() .map(result -> { List<McpSchema.Root> roots = result.roots(); // Implement logic to list files within these root URIs return CallToolResult.builder() .addTextContent("Accessible roots: " + roots) .build(); }); }) .build();
  43. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Elicitation MCP Server MCP Client

    Tools LLM controlled Resources App controlled Prompts User controlled Sampling Roots Elicitation Functions LLMs request to be called on their behalf to do something or know more. Static data giving access to file contents, DB schemas, API docs. Predefined prompt templates users can use to tell the LLM how to work with tools & resources. Lets servers request LLM generation via the client. Client pays the tokens! But client controls permissions & security. Specify which files servers can access. Client handles security boundaries. Servers can request extra info from users in a structured way (standard UI widgets) - search flight - send message - create event - retrieve doc - read calendar - access a knowledge base - plan a vacation - draft an email - meeting summary Airline sends list of flights and asks LLM to pick the best one. Server booking travel may be given access to specific dir to read user’s files. Asks for user’s airline contact number for finalizing booking Elicitation enables MCP servers to request approval, ask for missing info, clarification requests from users via MCP clients for more dynamic workflows
  44. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Client MCP Server 2.

    elicitation/create (more info needed) User 3. Present elicitation UI 4. Provide requested information 5. Return user response 1. tools/call request 6. tools/call response Elicitation
  45. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Elicitation — MCP SERVER var

    elicitationTool = AsyncToolSpecification.builder() .tool(Tool.builder() .name("get_user_info") .description("Fetches user details") .build()) .callHandler((exchange, request) -> { var elicitRequest = ElicitRequest.builder() .message("Please provide your name to proceed.") .requestedSchema(Map.of( "type", "object", "properties", Map.of("name", Map.of("type", "string")), "required", List.of("name") )) .build(); // …
  46. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Elicitation — MCP SERVER //

    … // Send the request and handle the result return exchange.createElicitation(elicitRequest) .map(result -> { if (result.action() == Action.ACCEPT) { String name = (String) result.content().get("name"); return CallToolResult.builder() .addTextContent("Hello, " + name + "!") .build(); } else { return CallToolResult.builder() .addTextContent("User declined") .isError(true) .build(); } }); }) .build();
  47. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Elicitation — MCP Client Function<ElicitRequest,

    Mono<ElicitResult>> clientElicitHandler = request -> { // In a real application, this might trigger a UI form or CLI prompt System.out.println("Server is asking: " + request.message()); // Simulate user accepting and providing data return Mono.just(ElicitResult.builder() .message(ElicitResult.Action.ACCEPT) .content(Map.of("name", "John Doe")) .build()); }; // Build the client with the capability and handler McpAsyncClient client = McpClient.async(transport) .capabilities(ClientCapabilities.builder() .elicitation() // Advertise support for elicitation .build()) .elicitation(clientElicitHandler) // Register the handler .build();
  48. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP supports • Progress reporting

    from MCP servers • Progress tracking in MCP clients for long-running operations Progress Reporting & Monitoring
  49. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Progress notification: 0.0 / 1.0

    Progress notification: 0.5 / 1.0 Progress notification: 1.0 / 1.0 Progress MCP Client MCP Server Progress updates… Tool request with progress token Tool response Operation completed Initiating request
  50. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Progress — MCP Server //

    … .callHandler((exchange, request) -> { // 1. Extract the progress token from the request metadata var progressToken = (String) request.meta().get("progressToken"); // 2. Send progress updates through the exchange return exchange.progressNotification( new ProgressNotification(progressToken, 0.0, 1.0, "Started")) .then(exchange.progressNotification( new ProgressNotification(progressToken, 0.5, 1.0, "Processing"))) .then(exchange.progressNotification( new ProgressNotification(progressToken, 1.0, 1.0, "Finished"))) .thenReturn(CallToolResult.builder() .addTextContent("Task completed successfully") .build());
  51. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Progress — MCP Client McpAsyncClient

    client = McpClient.async(transport) // Register the progress monitor .progressConsumer(notif -> Mono.fromRunnable(() -> { System.out.println( "Progress update for [" + notif.progressToken() + "]: " + notif.message() + " (" + notif.progress() + "/" + notif.total() + ")"); })) .build(); // When calling a tool, provide a progress token in the request metadata McpSchema.CallToolRequest request = McpSchema.CallToolRequest.builder() .name("long-running-task") .meta(Map.of("progressToken", "my-unique-task-id")) .build(); client.callTool(request).subscribe();
  52. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Support in Various Tools

    Feature Category Feature Gemini CLI Claude Code Claude Desktop OpenAI Codex VS Code GitHub Copilot OpenCode Core Server Features Tools ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full Resources ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ❌ No Support ✅ Full (@ syntax) Prompts ✅ Slash Cmds ✅ Full ✅ Full ✅ Slash Cmds ✅ Slash Cmds ❌ No Support ✅ Slash Cmds Server Utilities Completion ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full Logging ✅ UI Footer ✅ Full ⚠ File Only ✅ Full ✅ Output Channel ✅ Full ✅ Full Pagination ❓ Unknown ❓ Unknown ❌ No UI ✅ Full ✅ Full ✅ Full ✅ Full Client Specific Elicitation ⚠ Basic ✅ Full ⚠ Chat Stream ✅ TUI Forms ✅ Input Box ✅ Full ✅ TUI Forms Sampling ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full Roots ⚠ Partial ✅ Full ✅ Strict ✅ Strict ✅ Multi-Root ✅ Full ✅ Full Base Protocol Cancellation ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full Ping ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full ✅ Full Progress ❌ Broken/Issue ✅ Full ❌ Not Planned ✅ Full ✅ Full ✅ Full ✅ Full Tasks (Exp) ❌ No Support ✅ Pipelining ⚠ Experimental ✅ Full ⚠ Experimental ❌ No Support ✅ Full
  53. @EmmanuelBernard (Hexactgon) — @glaforge (Google) MCP Feature Matrix for the

    Java ecosystem Feature Category Feature Spring Boot / Spring AI Quarkus LangChain4j ADK Micronaut Core Server Tools ✅ Native (@McpTool) ✅ Native (@Tool) N/A ✅ Native (@McpTool) ✅ Native (@Tool) Resources ✅ Native (Subscribable) ✅ Native ✅ Native (Consumption) 🛠 Manual (SDK access) ✅ Native Prompts ✅ Native ✅ Native ✅ Native (Consumption) 🛠 Manual (SDK access) ✅ Native Server Utilities Completion ✅ Native (SDK wrap) ✅ Native (@Complete) N/A 🛠 Manual (SDK access) ✅ Native (@PromptCompletion) Logging ✅ Native (context.info) ✅ Rich (Auto-Config) ✅ Native (Handler) ⛔ Unsupported 🛠 Manual (SDK) Pagination 🛠 Manual (Resources) ✅ Auto (Default 50) N/A 🛠 Config via SDK 🛠 Manual (Cursor) Client specific Elicitation ✅ Native (@McpElicitation) N/A (Server Focus) ⚠ Missing/Manual ✅ Native (Future) N/A Sampling ✅ Robust (Bidirectional) ⚠ Partial (API only) ⚠ Experimental ✅ Auto-managed ⚠ Unsupported Roots ✅ Full (Events) ⚠ Basic (Parsing) ✅ Native (Config) ⚠ Gap / Manual ⚠ Unsupported Base Protocol Cancellation ✅ Native (Reactive) ✅ Native ✅ Native ✅ Basic ✅ Native (SDK) Ping ✅ Native (context.ping) ✅ Native ✅ Native 🛠 Manual ✅ Native (SDK) Progress ✅ Native (context.progress) ✅ Native (API) ✅ Native (Callback) ⛔ N/A ✅ Native (SDK) Tasks ⚠ Gap (Use Progress) ⚠ Gap ⚠ Gap ⚠ Gap ⚠ Gap
  54. @EmmanuelBernard (Hexactgon) — @glaforge (Google) What is A2A really User

    Client Agent C# 😜 Local agents Agentic framework LLM Remote Agent (java) Local agents Agentic framework LLM A2A Client A2A Client A2A protocol A2A server Remote Agent (python) Local agents Agentic framework LLM A2A server
  55. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Why use A2A Technical Interoperability

    Build a composite AI system Technology agnostic Complex workflows Of subagents State management Secure and opaque Black box principle Can scale in complexity
  56. @EmmanuelBernard (Hexactgon) — @glaforge (Google) What for Advanced apps With

    full autonomous decisions Agents & subagents Expose Silos So they work collaboratively Ecosystem Cross platform Cross vendors
  57. @EmmanuelBernard (Hexactgon) — @glaforge (Google) The 1.0 drop From 0.3

    to 1.0 0.3 in Summer 2025 Several SDK and stack support 1.0 in March 2026 Spec is here, some SDKs, no stack Relatively minor changes Backward incompatible Our approach Slides for 1.0 with mention 0.3 changes Demos in 0.3
  58. @EmmanuelBernard (Hexactgon) — @glaforge (Google) { "name": "GeoSpatial Route Planner

    Agent", "description": "Provides advanced route planning ...", "supportedInterfaces": [ {"url": "https://georoute-agent.example.com/a2a/v1", "protocolBinding": "JSONRPC", "protocolVersion": "1.0"}, ... ], ... "version": "1.2.0", "documentationUrl": "https://docs.examplegeoservices.com/georoute-agent/api", "capabilities": { "streaming": true, "pushNotifications": true, "stateTransitionHistory": false, "extendedAgentCard": true }, "securitySchemes": { "google-openid": { "openIdConnectSecurityScheme": { "openIdConnectUrl": "..." } } }, "security": [{ "google-openid": ["openid", "profile", "email"] }], "defaultInputModes": ["application/json", "text/plain"], "defaultOutputModes": ["application/json", "image/png"], ... Discovery — Agent Card 1.0
  59. @EmmanuelBernard (Hexactgon) — @glaforge (Google) ... "skills": [ { "id":

    "route-optimizer-traffic", "name": "Traffic-Aware Route Optimizer", "description": "Calculates the optimal driving route between ...", "tags": ["maps", "routing", "navigation", "directions", "traffic"], "examples": [ "Plan a route from '1600 Amphitheatre Parkway, Mountain View, CA' to 'San Francisco International Airport' avoiding tolls.", "{\"origin\": {\"lat\": 37.422, \"lng\": -122.084}, ..." ], "inputModes": ["application/json", "text/plain"], "outputModes": ["application/json", "application/vnd.geo+json", ... ] }, ... ], Discovery — Agent Card 1.0
  60. @EmmanuelBernard (Hexactgon) — @glaforge (Google) And discovery ... "signatures": [

    { "protected": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpPU0UiLCJraWQiOiJrZXktMSIsImprdSI6Imh0dHBzOi8vZX hhbXBsZS5jb20vYWdlbnQvandrcy5qc29uIn0", "signature": "QFdkNLNszlGj3z3u0YQGt_T9LixY3qtdQpZmsTdDHDe3fXV9y9-B3m2-XgCpzuhiLt8E0tV6HXoZKH v4GtHgKQ" } ] } Discovery — Agent Card 1.0
  61. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Discovery — Agent Card 0.3

    { "protocolVersion": "0.3.0", "name": "GeoSpatial Route Planner Agent", "description": "Provides advanced route planning ...", "url": "https://georoute-agent.example.com/a2a/v1", "preferredTransport": "JSONRPC", "version": "1.2.0", "capabilities": { "streaming": true, "pushNotifications": true }, "securitySchemes": { "google-openid": { "type": "openIdConnect", "openIdConnectUrl": "..." } }, "security": [{ "google-openid": ["openid", "profile", "email"] }], "defaultInputModes": ["application/json", "text/plain"], "defaultOutputModes": ["application/json", "image/png"], ...
  62. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A2A — a message based

    state machine Task Central unit of work with a unique ID and lifecycle (submitted, working, completed…) Artifact Immutable outputs of a task, composed of one or more Parts Message Container for communication turns between client & agent, also composed of Parts Part Unit of content within Messages and Artifacts (text, url, file, data)
  63. @EmmanuelBernard (Hexactgon) — @glaforge (Google) What is in a message

    Message role: user|agent messageId taskId? contextId? Part(s) Text, file, data Task status taskId contextId? Artifact[] (artifact) Message[] (history) Artifact artifactId name description Part(s) Text, file, data
  64. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Life of a task Submitted

    Input required Failed auth required Completed Cancelled (user) Rejected (server) Working Unknown
  65. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A simple interaction Client Server

    Message “Request 1” Message “Answer 1” Message “Request 2” Message “Answer 2”
  66. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A task interaction Client Server

    Message “request” Task submitted Task working Message “More input” Task completed Artifact Task input-required
  67. @EmmanuelBernard (Hexactgon) — @glaforge (Google) ContextId and Tenant Client Server

    Message “request” Task submitted Task working Message “More input” Task completed Artifact Task input-required ContextId=bbc tenant=acme
  68. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Message or task Task Goal

    oriented Long running (including async) Parallel tasks Contextual isolation Flexibility (and its cost) Message only Task only Hybrid
  69. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Three protocols JSON-RPC 2.0 Method

    call based over HTTPS+JSON Streaming : SSE with JSON-RPC envelopes Push via webhook gRPC Method call based over HTTPS+Protobuf Streaming: server streaming RPCs Push via webhook HTTP & JSON / REST More RESTy Streaming: SSE (Server Sent Events) Push via webhook
  70. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Tenancy Info optional Send in

    each method call Not defined… much Versioning and tenancy Versioning Info send in each method call http header Was global in 0.3 Now per interface Explicit rules on compatibility
  71. @EmmanuelBernard (Hexactgon) — @glaforge (Google) 3 communication approaches Client Server

    Message send Message “Answer” Message 2 send Message “Answer 2” Client Server Message streaming Task working Task artifact-update Artifact p2 Client Server Message push Task submitted (push ack) Task get Task input-needed Artifact Push notif Task artifact-update Artifact p1 Task completed Sync Stream Push (webhook)
  72. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Security What the spec says

    Not an afterthought Embrace what exists Part of the protocol to auth up Signature Authentication • OAuth 2.0 ◦ OpenID Connect • API key • Bearer token • mTLS Authorization • Not spec-ed much • Granular control • Skill based (OAuth scope based)
  73. @EmmanuelBernard (Hexactgon) — @glaforge (Google) The demo Browser Todo Backend

    Websocket A2A Client Weather Agent A2A server Java Quarkus Weather service HTTP JSON RPC REST Movie Agent A2A server JS GenKit TMDB HTTP JSON RPC REST Java Quarkus
  74. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Diagram A2A, agents local, MCP

    User Client Agent C# 😜 Local agents Agentic framework LLM Remote Agent (java) Local agents Agentic framework LLM A2A Client A2A Client A2A protocol A2A server Remote Agent (python) Local agents Agentic framework LLM A2A server MCP tool MCP tool API and enterprise apps MCP tool MCP tool API and enterprise apps MCP tool API and enterprise apps
  75. @EmmanuelBernard (Hexactgon) — @glaforge (Google) A2A or MCP MCP Agent

    to tool • Tool ecosystem Contract based solutions • structured input/output Deterministic • Retry capabilities Claude Desktop like A2A Agent to agent • Agent ecosystem Isolated memory context Unstructured exchange Negotiation capable • More info • Changing goals mid flight
  76. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Very promising • Ecosystem of

    agents • Extensible • A solid spec unlike others A2A Summary But in transition • Spec at 1.0, ecosystem in 0.3 • Complex flows are to be defined • Tenant is useful… for google?
  77. @EmmanuelBernard (Hexactgon) — @glaforge (Google) GitHub Links for our demos

    and samples Resources Feedback, questions, and rate this talk For a2a, use branch devoxx-france-2026
  78. @EmmanuelBernard (Hexactgon) — @glaforge (Google) Les Cast Codeurs Podcast! Don’t

    forget to listen to Les Cast Codeurs podcast! And to visit Emmanuel’s new company website! Hexactgon.com