annotation-driven dual-protocol action exposure (a2a + mcp)
Developers annotate standard Java methods with @Action, @Agent, and @ActionParameter decorators; the framework's PredictionLoader package scanner automatically introspects these annotations at startup and registers the same method as both an A2A Skill (discoverable at /.well-known/agent.json) and an MCP Tool (via tools/list endpoint). A unified AIProcessor orchestrates invocation through both protocols without code duplication, using protocol-specific controllers (DynamicTaskController for A2A, MCPToolsController for MCP) that delegate to the same underlying business logic.
Unique: Single @Action annotation automatically exposes methods as both A2A Skills and MCP Tools through unified AIProcessor orchestration, eliminating protocol-specific boilerplate that competitors require (e.g., separate tool definitions for OpenAI vs Anthropic function calling)
vs alternatives: Faster multi-protocol agent development than writing separate A2A and MCP adapters, and more maintainable than hand-coded protocol bridges because business logic remains protocol-agnostic
multi-provider ai processor abstraction with protocol-specific implementations
The AIProcessor interface abstracts LLM invocation across Gemini, OpenAI, and Anthropic, with concrete implementations (GeminiV2ActionProcessor, OpenAiActionProcessor, AnthropicActionProcessor) that handle provider-specific request/response formatting, streaming, and tool-calling conventions. The framework selects the appropriate processor at runtime based on configuration, allowing a single @Action method to be invoked by different LLM providers without code changes. Integration with tools4ai library enables structured tool-calling across all providers.
Unique: Pluggable AIProcessor implementations decouple business logic from provider-specific tool-calling semantics, using tools4ai library for unified structured tool invocation across Gemini, OpenAI, and Anthropic instead of hardcoding provider APIs
vs alternatives: More flexible than LangChain's provider abstraction because it exposes protocol-level control (A2A vs MCP) while maintaining provider portability, and simpler than building custom adapter layers for each provider combination
custom action callbacks and protocol extension hooks
The framework provides ActionCallback interface and custom callback implementations (SSEEmitterCallback, etc.) that allow developers to hook into action execution lifecycle (before, during, after) and extend protocol behavior. Callbacks receive execution context including action name, parameters, and results, enabling custom logging, monitoring, authorization, and result transformation. Protocol extensions can be implemented by subclassing controller classes and overriding request/response handling, allowing teams to add custom headers, authentication schemes, or result formatting without modifying core framework code.
Unique: ActionCallback interface provides unified hooks for both A2A and MCP execution paths, allowing a single callback implementation to apply custom logic across both protocols without duplication, with protocol-aware context passed to callbacks
vs alternatives: More integrated than aspect-oriented programming because callbacks understand agent semantics, and more flexible than hardcoded authorization because callbacks can implement arbitrary custom logic without framework changes
testing framework with a2a and mcp client test utilities
The framework provides A2ATaskClientTest and regression test utilities that enable developers to test agent actions via both A2A and MCP protocols without deploying to a server. Test utilities include mock clients (A2AAgent, MCPAgent) that invoke actions directly, assertion helpers for validating results, and fixtures for common test scenarios. The testing framework integrates with Spring Boot Test, allowing agents to be tested in isolation with mocked LLM providers or real providers depending on test requirements.
Unique: Testing framework provides protocol-aware test clients (A2ATaskClient, MCPAgent) that invoke actions through both A2A and MCP paths, enabling comprehensive protocol testing without separate test suites for each protocol
vs alternatives: More integrated than generic HTTP testing libraries because it understands agent semantics and protocol requirements, and more complete than unit testing alone because it enables protocol-level testing
dynamic task controller with asynchronous execution and polling
The DynamicTaskController implements asynchronous task execution for long-running @Action methods, assigning unique task IDs and allowing clients to poll for completion status via REST endpoints. Task state is tracked in memory (or can be persisted to external storage), with endpoints for task creation (/task/create), status polling (/task/status/{taskId}), and result retrieval (/task/result/{taskId}). This enables non-blocking client interactions where clients submit tasks and check back later, rather than blocking on action execution. The controller integrates with SSEEmitterCallback for streaming intermediate results during task execution.
Unique: DynamicTaskController integrates task lifecycle management directly into the @Action execution model, automatically assigning task IDs and tracking state without requiring developers to implement custom task management logic
vs alternatives: More integrated than generic task queue systems because it understands agent action semantics, and simpler than message queue-based approaches because it uses REST polling instead of requiring message broker infrastructure
real-time streaming with sse callbacks for long-running agent operations
The SSEEmitterCallback and SseEmitter components enable Server-Sent Events streaming for long-running @Action methods, allowing clients to receive intermediate results and status updates without blocking. The framework wraps action execution in a streaming context that captures callbacks and pushes them to HTTP clients via Spring's SseEmitter, with protocol-aware formatting for both A2A and MCP consumers. This enables interactive agent experiences where users see progress in real-time rather than waiting for final results.
Unique: SSEEmitterCallback integrates streaming directly into the @Action execution model, allowing any annotated method to emit progress events without explicit streaming code, with protocol-aware formatting for both A2A and MCP clients
vs alternatives: Simpler than WebSocket-based streaming because it reuses HTTP and requires no separate connection upgrade, and more integrated than generic SSE libraries because it understands agent task semantics and protocol requirements
agenticmesh multi-agent orchestration with ai-powered routing
The AgenticMesh class implements multi-agent orchestration patterns where multiple @Agent instances are registered in an AgentCatalog, and incoming requests are routed to the most appropriate agent based on AI-powered selection logic. The framework uses the configured LLM provider to analyze request intent and select the best agent, then delegates execution to that agent's actions. This enables hierarchical agent systems where a coordinator agent can decompose tasks and route sub-tasks to specialist agents, with all routing decisions made by the LLM rather than hardcoded rules.
Unique: AgenticMesh uses the same LLM provider (Gemini, OpenAI, Claude) that executes actions to also make routing decisions, creating a unified decision-making plane where agent selection is semantic rather than rule-based, integrated directly into the @Agent annotation model
vs alternatives: More flexible than hardcoded routing rules because it adapts to new agents without code changes, and more intelligent than simple keyword matching because it understands task semantics and agent capabilities through LLM reasoning
a2a protocol task lifecycle management with skill discovery
The DynamicTaskController implements the A2A (Agent-to-Agent) protocol task lifecycle, handling task creation, status polling, and result retrieval through REST endpoints. The framework automatically generates A2A Skill definitions from @Action annotations and exposes them at /.well-known/agent.json for discovery by A2A-compatible clients (e.g., Gemini agents). Task execution is tracked with unique task IDs, allowing asynchronous clients to poll for completion status and retrieve results without blocking, with support for long-running operations via SSE streaming.
Unique: DynamicTaskController automatically generates A2A Skill manifests from @Action annotations without manual schema definition, implementing the full A2A task lifecycle (create, poll, retrieve) with unified streaming support via SSEEmitterCallback
vs alternatives: More integrated than generic A2A server implementations because it leverages Java annotations to eliminate boilerplate, and more complete than REST-only approaches because it implements the full A2A protocol including discovery and asynchronous task tracking
+5 more capabilities