CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-com-embabel-agent--embabel-agent-platform-autoconfigure

Spring Boot auto-configuration platform for Embabel Agent Framework, enabling annotation-driven profile activation and bootstrapping of agent configurations with MCP client support

Overview
Eval results
Files

Embabel Agent Platform Auto-Configuration

Spring Boot auto-configuration for the Embabel Agent Framework. Enables automatic setup of agent platforms, tool groups, and Model Context Protocol (MCP) clients with annotation-driven profile activation.

Package: com.embabel.agent:embabel-agent-platform-autoconfigure:0.3.3 Language: Java (Spring Boot)

Quick Start

1. Add Dependency

<dependency>
    <groupId>com.embabel.agent</groupId>
    <artifactId>embabel-agent-platform-autoconfigure</artifactId>
    <version>0.3.3</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Add Spring AI model provider (required) -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

2. Configure Model Provider

# application.properties
spring.ai.openai.api-key=your-api-key
spring.ai.openai.chat.options.model=gpt-4

3. Enable Auto-Configuration

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import com.embabel.agent.autoconfigure.platform.AgentPlatformAutoConfiguration;

@SpringBootApplication
@ImportAutoConfiguration(AgentPlatformAutoConfiguration.class)
public class AgentApplication {
    public static void main(String[] args) {
        SpringApplication.run(AgentApplication.class, args);
    }
}

4. Optional: Configure Logging Theme

embabel.agent.logging.personality=starwars

Prerequisites

Required: Spring Boot Web, Spring AI Model Provider (OpenAI/Anthropic/Ollama/etc.), Java 17+

Core Capabilities

Auto-Configuration

Automatically bootstraps:

  • Agent Platform Configuration
  • Tool Groups Configuration
  • MCP Client with resilient initialization
  • Component scanning for agent packages
@AutoConfiguration
@ImportAutoConfiguration({QuiteMcpClientAutoConfiguration.class})
@Import({CommonPlatformPropertiesLoader.class, ScanConfiguration.class,
         AgentPlatformConfiguration.class, ToolGroupsConfiguration.class})
public class AgentPlatformAutoConfiguration {
    // Automatically discovered by Spring Boot
}

What gets scanned: com.embabel.agent.{api,core,experimental,prompt,spi,test,tools,web}

MCP Client Support

Provides synchronous/asynchronous MCP clients with error resilience preventing startup failures.

@AutoConfiguration
@ConditionalOnClass(McpSchema.class)
@ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = "enabled",
                       havingValue = "true", matchIfMissing = true)
public class QuiteMcpClientAutoConfiguration extends McpClientAutoConfiguration {

    @Bean
    @ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = "type",
                           havingValue = "SYNC", matchIfMissing = true)
    List<McpSyncClient> mcpSyncClients(...);

    @Bean
    @ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = "type",
                           havingValue = "ASYNC")
    List<McpAsyncClient> mcpAsyncClients(...);
}

Key feature: Failed MCP client initialization is logged but doesn't prevent application startup.

Configuration Properties

// Logging theme
@ConfigurationProperties(prefix = "embabel.agent.logging")
record LoggingPersonalityProperties(String personality) {}

// MCP client (from Spring AI)
class McpClientCommonProperties {
    boolean enabled;              // Default: true
    String type;                  // SYNC or ASYNC, default: SYNC
    String name;                  // Client name
    String version;               // Client version
    Duration requestTimeout;      // Request timeout
    boolean initialized;          // Auto-initialize, default: true
}

Common Tasks

Task: Setup with Auto-Discovery

Let Spring Boot auto-discover the configuration:

@SpringBootApplication
public class MyAgentApp {
    public static void main(String[] args) {
        SpringApplication.run(MyAgentApp.class, args);
    }
}

application.properties:

spring.ai.openai.api-key=sk-...
embabel.agent.logging.personality=starwars

Task: Configure MCP Client

spring.ai.mcp.client.enabled=true
spring.ai.mcp.client.type=SYNC
spring.ai.mcp.client.name=my-agent
spring.ai.mcp.client.version=1.0.0
spring.ai.mcp.client.request-timeout=10s
spring.ai.mcp.client.initialized=true

Task: Use MCP Clients

import io.modelcontextprotocol.client.McpSyncClient;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class MyService {
    @Autowired
    private List<McpSyncClient> mcpClients;

    public void useClient() {
        if (!mcpClients.isEmpty()) {
            McpSyncClient client = mcpClients.get(0);
            // Use client...
        }
    }
}

Task: Disable Auto-Configuration

@SpringBootApplication(exclude = {AgentPlatformAutoConfiguration.class})
public class MyApp { }

Or via properties:

spring.autoconfigure.exclude=\
  com.embabel.agent.autoconfigure.platform.AgentPlatformAutoConfiguration

Task: Disable MCP Clients

spring.ai.mcp.client.enabled=false

Task: Use Async MCP Clients

spring.ai.mcp.client.type=ASYNC
import io.modelcontextprotocol.client.McpAsyncClient;
import reactor.core.publisher.Mono;

@Service
public class MyReactiveService {
    @Autowired
    private List<McpAsyncClient> mcpAsyncClients;

    public Mono<Void> useClientAsync() {
        if (!mcpAsyncClients.isEmpty()) {
            McpAsyncClient client = mcpAsyncClients.get(0);
            // Use reactive client...
        }
        return Mono.empty();
    }
}

Task: Configure Logging Theme

# Choose one theme
embabel.agent.logging.personality=starwars
embabel.agent.logging.personality=severance
embabel.agent.logging.personality=colossus
embabel.agent.logging.personality=hitchhiker
embabel.agent.logging.personality=montypython

Access in code:

@Value("${embabel.agent.logging.personality:}")
private String theme;

Task: Profile-Specific Configuration

# application.yml
spring:
  profiles:
    active: dev

---
spring:
  config:
    activate:
      on-profile: dev
embabel:
  agent:
    logging:
      personality: starwars

---
spring:
  config:
    activate:
      on-profile: prod
embabel:
  agent:
    logging:
      personality: ""

Configuration Reference

Property: embabel.agent.logging.personality

Type: String Default: "" (no theme) Values: starwars, severance, colossus, hitchhiker, montypython Purpose: Sets logging theme personality

Property: spring.ai.mcp.client.enabled

Type: boolean Default: true Purpose: Enable/disable MCP client auto-configuration

Property: spring.ai.mcp.client.type

Type: String Default: SYNC Values: SYNC, ASYNC Purpose: Choose sync or async MCP clients Bean: List<McpSyncClient> or List<McpAsyncClient>

Property: spring.ai.mcp.client.name

Type: String Purpose: Client name for MCP protocol identification

Property: spring.ai.mcp.client.version

Type: String Purpose: Client version for MCP protocol identification

Property: spring.ai.mcp.client.request-timeout

Type: Duration Format: 5s, 30s, 1m Purpose: Timeout for MCP requests

Property: spring.ai.mcp.client.initialized

Type: boolean Default: true Purpose: Auto-initialize clients on creation Note: When false, must call client.initialize() manually

API Reference

Core classes and their signatures:

// Main auto-configuration
@AutoConfiguration
public class AgentPlatformAutoConfiguration {
    // Imports: QuiteMcpClientAutoConfiguration, ScanConfiguration,
    //          AgentPlatformConfiguration, ToolGroupsConfiguration
}

// Component scanning
@Configuration
@ComponentScan(basePackages = {"com.embabel.agent.*"})
@ConfigurationPropertiesScan(basePackages = {"com.embabel.agent.*"})
public class ScanConfiguration {
}

// MCP client auto-configuration
@AutoConfiguration
@ConditionalOnClass(McpSchema.class)
@ConditionalOnProperty(prefix = "spring.ai.mcp.client", name = "enabled",
                       havingValue = "true", matchIfMissing = true)
public class QuiteMcpClientAutoConfiguration extends McpClientAutoConfiguration {

    List<McpSyncClient> mcpSyncClients(
        McpSyncClientConfigurer configurer,
        McpClientCommonProperties properties,
        ObjectProvider<List<NamedClientMcpTransport>> transports,
        ObjectProvider<ClientMcpSyncHandlersRegistry> handlers
    );

    List<McpAsyncClient> mcpAsyncClients(
        McpAsyncClientConfigurer configurer,
        McpClientCommonProperties properties,
        ObjectProvider<List<NamedClientMcpTransport>> transports,
        ObjectProvider<ClientMcpAsyncHandlersRegistry> handlers
    );
}

// Auto-configuration filter
public class AgentPlatformAutoConfigurationFilter
    implements AutoConfigurationImportFilter {

    boolean[] match(String[] autoConfigurationClasses,
                    AutoConfigurationMetadata metadata);
    // Excludes: org.springframework.ai.mcp.client.common.autoconfigure.McpClientAutoConfiguration
}

// Environment post-processor
public class EnvironmentPostProcessor
    implements org.springframework.boot.env.EnvironmentPostProcessor,
               org.springframework.core.Ordered {

    String LOGGING_THEME_PROPERTY = "embabel.agent.logging.personality";

    void postProcessEnvironment(ConfigurableEnvironment environment,
                                SpringApplication application);

    int getOrder(); // Returns Ordered.HIGHEST_PRECEDENCE
}

// Configuration properties
@ConfigurationProperties(prefix = "embabel.agent.logging")
record LoggingPersonalityProperties(String personality) {}

class McpClientCommonProperties {
    boolean enabled;
    String type;
    String name;
    String version;
    Duration requestTimeout;
    boolean initialized;
}

// MCP client types
interface McpSyncClient {
    void initialize();
}

interface McpAsyncClient {
    Mono<Void> initialize();
}

Deprecated Features

@EnableAgents Annotation (Deprecated since 0.3.1)

Old approach:

@SpringBootApplication
@EnableAgents(
    loggingTheme = LoggingThemes.STAR_WARS,
    mcpServers = {"filesystem"}
)
public class OldApp { }

New approach:

@SpringBootApplication
@ImportAutoConfiguration(AgentPlatformAutoConfiguration.class)
public class NewApp { }
embabel.agent.logging.personality=starwars

McpServers Utility Class (Deprecated since 0.3.1)

Use Spring AI MCP client properties instead.

Spring Boot Integration

Auto-Discovery

  • META-INF/spring/.../AutoConfiguration.imports - AgentPlatformAutoConfiguration
  • META-INF/spring.factories - EnvironmentPostProcessor, AutoConfigurationImportFilter

Init Order: Filter → Transports → MCP Clients → Platform → Scanning

Component Scanning

Packages: com.embabel.agent.{api,core,experimental,prompt,spi,test,tools,web}

Error Handling

MCP Client Initialization Failures

Behavior: Failed MCP client initialization is logged but doesn't prevent application startup.

Logging:

ERROR c.e.a.a.p.QuiteMcpClientAutoConfiguration -
Failed to initialize MCP Sync Client: my-client - Application startup will continue

Result:

  • Successfully initialized clients added to List<McpSyncClient> bean
  • Failed clients excluded
  • Application continues starting

To troubleshoot:

  1. Check MCP server availability
  2. Verify transport configuration
  3. Check network connectivity
  4. Validate authentication/credentials

Supported Model Providers

  • OpenAI, Anthropic, Ollama, Azure OpenAI, AWS Bedrock, Google Vertex AI, Hugging Face
  • See Spring AI documentation for provider-specific configuration

Further Documentation

API Reference

  • Annotations - Annotation-based configuration
  • Auto-Configuration - Auto-configuration details
  • Environment Post Processor - Environment processing
  • MCP Client - MCP client API
  • Properties - Configuration properties reference

Setup Guides

Reference

Additional Resources

Install with Tessl CLI

npx tessl i tessl/maven-com-embabel-agent--embabel-agent-platform-autoconfigure
Workspace
tessl
Visibility
Public
Created
Last updated
Describes
mavenpkg:maven/com.embabel.agent/embabel-agent-platform-autoconfigure@0.3.x