diff --git a/spring-boot-admin-samples/spring-boot-admin-sample-mcp/pom.xml b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/pom.xml
new file mode 100644
index 00000000000..73712045d93
--- /dev/null
+++ b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/pom.xml
@@ -0,0 +1,90 @@
+
+
+
+
+ 4.0.0
+
+ spring-boot-admin-sample-mcp
+
+ Spring Boot Admin Sample MCP
+ Spring Boot Admin sample demonstrating the MCP server alongside the Web UI
+
+
+ de.codecentric
+ spring-boot-admin-samples
+ ${revision}
+ ../pom.xml
+
+
+
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server-mcp
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-server
+
+
+
+ de.codecentric
+ spring-boot-admin-starter-client
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+ build-info
+
+
+
+
+ de.codecentric.boot.admin.sample.mcp.SpringBootAdminMcpApplication
+ false
+
+
+
+
+
diff --git a/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/java/de/codecentric/boot/admin/sample/mcp/SpringBootAdminMcpApplication.java b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/java/de/codecentric/boot/admin/sample/mcp/SpringBootAdminMcpApplication.java
new file mode 100644
index 00000000000..76bf1735251
--- /dev/null
+++ b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/java/de/codecentric/boot/admin/sample/mcp/SpringBootAdminMcpApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2014-2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.codecentric.boot.admin.sample.mcp;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+
+@SpringBootApplication
+@EnableAdminServer
+public class SpringBootAdminMcpApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootAdminMcpApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/resources/application.yml b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/resources/application.yml
new file mode 100644
index 00000000000..230a4e40ba5
--- /dev/null
+++ b/spring-boot-admin-samples/spring-boot-admin-sample-mcp/src/main/resources/application.yml
@@ -0,0 +1,29 @@
+spring:
+ application:
+ name: spring-boot-admin-sample-mcp
+ boot:
+ admin:
+ client:
+ url: http://localhost:8080
+ mcp:
+ enabled: true
+ profiles:
+ active:
+ - insecure
+
+logging:
+ file:
+ name: "target/boot-admin-sample-mcp.log"
+
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: ALWAYS
+ restart:
+ enabled: true
+ refresh:
+ enabled: true
diff --git a/spring-boot-admin-server-mcp/pom.xml b/spring-boot-admin-server-mcp/pom.xml
new file mode 100644
index 00000000000..bc1616e7aba
--- /dev/null
+++ b/spring-boot-admin-server-mcp/pom.xml
@@ -0,0 +1,88 @@
+
+
+
+
+ 4.0.0
+
+ spring-boot-admin-server-mcp
+
+ Spring Boot Admin Server MCP
+ Spring Boot Admin MCP Server — exposes registered instances and health status via the Model Context Protocol
+
+
+ de.codecentric
+ spring-boot-admin-build
+ ${revision}
+ ../spring-boot-admin-build
+
+
+
+
+
+ org.springframework.ai
+ spring-ai-bom
+ ${spring-ai.version}
+ pom
+ import
+
+
+
+
+
+
+ de.codecentric
+ spring-boot-admin-server
+
+
+ org.springframework.ai
+ spring-ai-starter-mcp-server-webflux
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure-processor
+ true
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ io.projectreactor
+ reactor-test
+ test
+
+
+ org.wiremock
+ wiremock-standalone
+ test
+
+
+
diff --git a/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpAutoConfiguration.java b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpAutoConfiguration.java
new file mode 100644
index 00000000000..66cfa20a7d4
--- /dev/null
+++ b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpAutoConfiguration.java
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2014-2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.codecentric.boot.admin.server.mcp.config;
+
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import de.codecentric.boot.admin.server.mcp.tools.ActuatorClient;
+import de.codecentric.boot.admin.server.mcp.tools.ApplicationTools;
+import de.codecentric.boot.admin.server.mcp.tools.BeansTools;
+import de.codecentric.boot.admin.server.mcp.tools.CachesTools;
+import de.codecentric.boot.admin.server.mcp.tools.EnvTools;
+import de.codecentric.boot.admin.server.mcp.tools.HealthTools;
+import de.codecentric.boot.admin.server.mcp.tools.HttpExchangesTools;
+import de.codecentric.boot.admin.server.mcp.tools.LoggersTools;
+import de.codecentric.boot.admin.server.mcp.tools.LogsTools;
+import de.codecentric.boot.admin.server.mcp.tools.MetricsTools;
+import de.codecentric.boot.admin.server.mcp.tools.OperationsTools;
+import de.codecentric.boot.admin.server.mcp.tools.ScheduledTasksTools;
+import de.codecentric.boot.admin.server.mcp.tools.ThreadDumpTools;
+import de.codecentric.boot.admin.server.web.client.InstanceWebClient;
+
+/**
+ * Auto-configuration for the Spring Boot Admin MCP server integration.
+ *
+ *
+ * Activates only when {@code spring.boot.admin.mcp.enabled=true}. When inactive, no MCP
+ * beans are created and the application context is unaffected.
+ *
+ */
+@AutoConfiguration
+@ConditionalOnProperty(prefix = "spring.boot.admin.mcp", name = "enabled", havingValue = "true")
+@EnableConfigurationProperties(McpProperties.class)
+public class McpAutoConfiguration {
+
+ /**
+ * Creates the shared {@link ActuatorClient} bean used by all tool classes to call
+ * actuator endpoints on registered applications.
+ * @param instanceRepository the repository used to look up registered instances
+ * @param instanceWebClientBuilder builder for the web client used to call actuator
+ * endpoints
+ * @param mcpProperties the MCP configuration properties
+ * @return the configured {@link ActuatorClient}
+ */
+ @Bean
+ public ActuatorClient actuatorClient(InstanceRepository instanceRepository,
+ InstanceWebClient.Builder instanceWebClientBuilder, McpProperties mcpProperties) {
+ return new ActuatorClient(instanceRepository, instanceWebClientBuilder.build(), mcpProperties.getTimeout());
+ }
+
+ /**
+ * Creates the {@link ApplicationTools} bean for listing registered applications.
+ * @param instanceRepository the repository used to look up registered instances
+ * @return the configured {@link ApplicationTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "applications", havingValue = "true",
+ matchIfMissing = true)
+ public ApplicationTools applicationTools(InstanceRepository instanceRepository) {
+ return new ApplicationTools(instanceRepository);
+ }
+
+ /**
+ * Creates the {@link HealthTools} bean for querying application health and status.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link HealthTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "health", havingValue = "true",
+ matchIfMissing = true)
+ public HealthTools healthTools(ActuatorClient actuatorClient) {
+ return new HealthTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link MetricsTools} bean for querying application metrics.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link MetricsTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "metrics", havingValue = "true",
+ matchIfMissing = true)
+ public MetricsTools metricsTools(ActuatorClient actuatorClient) {
+ return new MetricsTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link EnvTools} bean for resolving application environment properties.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link EnvTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "env", havingValue = "true",
+ matchIfMissing = true)
+ public EnvTools envTools(ActuatorClient actuatorClient) {
+ return new EnvTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link LogsTools} bean for accessing application log output.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link LogsTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "logs", havingValue = "true",
+ matchIfMissing = true)
+ public LogsTools logsTools(ActuatorClient actuatorClient) {
+ return new LogsTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link OperationsTools} bean for performing write operations on
+ * applications.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link OperationsTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "operations", havingValue = "true",
+ matchIfMissing = true)
+ public OperationsTools operationsTools(ActuatorClient actuatorClient) {
+ return new OperationsTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link LoggersTools} bean for querying and configuring log levels.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link LoggersTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "loggers", havingValue = "true",
+ matchIfMissing = true)
+ public LoggersTools loggersTools(ActuatorClient actuatorClient) {
+ return new LoggersTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link ThreadDumpTools} bean for capturing thread dumps.
+ * @param actuatorClient the shared actuator call helper
+ * @param mcpProperties the MCP configuration properties
+ * @return the configured {@link ThreadDumpTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "thread-dump", havingValue = "true",
+ matchIfMissing = true)
+ public ThreadDumpTools threadDumpTools(ActuatorClient actuatorClient, McpProperties mcpProperties) {
+ return new ThreadDumpTools(actuatorClient, mcpProperties.getThreadDumpTimeout());
+ }
+
+ /**
+ * Creates the {@link HttpExchangesTools} bean for inspecting recent HTTP exchanges.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link HttpExchangesTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "http-exchanges", havingValue = "true",
+ matchIfMissing = true)
+ public HttpExchangesTools httpExchangesTools(ActuatorClient actuatorClient) {
+ return new HttpExchangesTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link ScheduledTasksTools} bean for inspecting scheduled tasks.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link ScheduledTasksTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "scheduled-tasks", havingValue = "true",
+ matchIfMissing = true)
+ public ScheduledTasksTools scheduledTasksTools(ActuatorClient actuatorClient) {
+ return new ScheduledTasksTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link CachesTools} bean for inspecting application caches.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link CachesTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "caches", havingValue = "true",
+ matchIfMissing = true)
+ public CachesTools cachesTools(ActuatorClient actuatorClient) {
+ return new CachesTools(actuatorClient);
+ }
+
+ /**
+ * Creates the {@link BeansTools} bean for inspecting Spring application context
+ * beans.
+ * @param actuatorClient the shared actuator call helper
+ * @return the configured {@link BeansTools}
+ */
+ @Bean
+ @ConditionalOnProperty(prefix = "spring.boot.admin.mcp.tools", name = "beans", havingValue = "true",
+ matchIfMissing = true)
+ public BeansTools beansTools(ActuatorClient actuatorClient) {
+ return new BeansTools(actuatorClient);
+ }
+
+}
diff --git a/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpProperties.java b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpProperties.java
new file mode 100644
index 00000000000..2c733ef0117
--- /dev/null
+++ b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpProperties.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2014-2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.codecentric.boot.admin.server.mcp.config;
+
+import java.time.Duration;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Configuration properties for the Spring Boot Admin MCP server integration.
+ *
+ *
+ * MCP support is disabled by default. To enable it, set
+ * {@code spring.boot.admin.mcp.enabled=true} in your application configuration.
+ *
+ *
+ *
+ * Example configuration:
+ *
+ *
+ *
+ * spring:
+ * boot:
+ * admin:
+ * mcp:
+ * enabled: true
+ * ai:
+ * mcp:
+ * server:
+ * type: ASYNC
+ * protocol: STREAMABLE
+ *
+ */
+@lombok.Data
+@ConfigurationProperties(prefix = "spring.boot.admin.mcp")
+public class McpProperties {
+
+ /**
+ * Creates a new {@code McpProperties} instance with default values.
+ */
+ public McpProperties() {
+ // NOOP
+ }
+
+ /**
+ * Whether the MCP server integration is enabled. Defaults to {@code false} to ensure
+ * zero impact on existing Spring Boot Admin deployments.
+ */
+ private boolean enabled = false;
+
+ /**
+ * Timeout for actuator calls made by MCP tools. Applies to all standard actuator
+ * endpoints. Defaults to {@code 450ms}. The thread dump endpoint uses
+ * {@code threadDumpTimeout} instead.
+ */
+ private Duration timeout = Duration.ofMillis(450);
+
+ /**
+ * Timeout for {@code /actuator/threaddump} calls, which can be slower than standard
+ * actuator endpoints. Defaults to {@code 10s}.
+ */
+ private Duration threadDumpTimeout = Duration.ofSeconds(10);
+
+ /**
+ * Server-side toggles controlling which MCP tool categories are registered and
+ * advertised to clients. These operate on the Spring Boot Admin server itself and are
+ * independent of the monitored applications' {@code management.endpoint.*} settings
+ * (which are enforced at runtime by the target application). All categories default
+ * to {@code true}.
+ */
+ private Tools tools = new Tools();
+
+ /**
+ * Category-level enablement flags for the exposed MCP tools. Disabling a category
+ * prevents the corresponding tool bean from being created, so its tools are never
+ * advertised. Changes take effect on server restart.
+ */
+ @lombok.Data
+ public static class Tools {
+
+ /**
+ * Whether the {@code list-applications} tool is available.
+ */
+ private boolean applications = true;
+
+ /**
+ * Whether the {@code get-health} and {@code get-status} tools are available.
+ */
+ private boolean health = true;
+
+ /**
+ * Whether the {@code list-metrics} and {@code get-metrics} tools are available.
+ */
+ private boolean metrics = true;
+
+ /**
+ * Whether the {@code get-env} and {@code list-env} tools are available.
+ */
+ private boolean env = true;
+
+ /**
+ * Whether the {@code get-logs} tool is available.
+ */
+ private boolean logs = true;
+
+ /**
+ * Whether the write operation tools ({@code restart-application} and
+ * {@code refresh-configuration}) are available.
+ */
+ private boolean operations = true;
+
+ /**
+ * Whether the {@code list-loggers}, {@code get-logger}, and
+ * {@code set-logger-level} tools are available.
+ */
+ private boolean loggers = true;
+
+ /**
+ * Whether the {@code get-thread-dump} tool is available.
+ */
+ private boolean threadDump = true;
+
+ /**
+ * Whether the {@code get-http-exchanges} tool is available.
+ */
+ private boolean httpExchanges = true;
+
+ /**
+ * Whether the {@code get-scheduled-tasks} tool is available.
+ */
+ private boolean scheduledTasks = true;
+
+ /**
+ * Whether the {@code list-caches} tool is available.
+ */
+ private boolean caches = true;
+
+ /**
+ * Whether the {@code list-beans} tool is available.
+ */
+ private boolean beans = true;
+
+ }
+
+}
diff --git a/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpServerDefaultsEnvironmentPostProcessor.java b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpServerDefaultsEnvironmentPostProcessor.java
new file mode 100644
index 00000000000..2fb9e9c8c32
--- /dev/null
+++ b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/config/McpServerDefaultsEnvironmentPostProcessor.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright 2014-2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.codecentric.boot.admin.server.mcp.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.boot.EnvironmentPostProcessor;
+import org.springframework.boot.SpringApplication;
+import org.springframework.core.Ordered;
+import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.MapPropertySource;
+import org.springframework.util.StringUtils;
+
+/**
+ * Contributes sensible defaults for the Spring AI MCP server metadata reported to
+ * clients, namely {@code spring.ai.mcp.server.name} and
+ * {@code spring.ai.mcp.server.version}.
+ *
+ *
+ * The defaults are added as a low-precedence {@link MapPropertySource} placed at the end
+ * of the property source list. As a result, any explicit configuration in a user's
+ * {@code application.yml}, {@code application.properties}, environment variables, or
+ * command-line arguments takes precedence and overrides these defaults.
+ *
+ *
+ *
+ * The server name defaults to {@value #DEFAULT_SERVER_NAME}. The version is read from the
+ * JAR manifest via {@link Package#getImplementationVersion()}, so it tracks the running
+ * Spring Boot Admin version automatically. When the classes are not packaged in a JAR
+ * (for example during tests or when running from an IDE) the manifest attribute is
+ * absent; in that case no version default is contributed and Spring AI's own fallback
+ * applies.
+ *
+ *
+ *
+ * The MCP server API type defaults to {@value #DEFAULT_SERVER_TYPE}. Spring Boot Admin
+ * runs on a reactive WebFlux/Netty stack and its actuator calls are non-blocking, so the
+ * asynchronous MCP server is the natural fit. Spring AI's own default is {@code sync},
+ * which would introduce blocking bridges on the reactive event loop. Contributing
+ * {@code async} here means users only need to enable the MCP server via
+ * {@code spring.boot.admin.mcp.enabled=true} without also setting any {@code spring.ai.*}
+ * properties.
+ *
+ *
+ *
+ * The transport protocol defaults to {@value #DEFAULT_SERVER_PROTOCOL}. Although Spring
+ * AI's {@code McpServerProperties} Java default is {@code STREAMABLE}, the transport
+ * autoconfiguration selects the active transport via {@code @ConditionalOnProperty}
+ * evaluated against the {@code Environment} — before the properties object is bound.
+ * {@code McpServerSseWebFluxAutoConfiguration} carries {@code matchIfMissing=true} on its
+ * SSE condition, so when {@code spring.ai.mcp.server.protocol} is absent from the
+ * environment the legacy SSE transport wins and {@code /mcp} returns 404. Contributing
+ * {@code streamable} here ensures the Streamable HTTP transport is active out of the box,
+ * exposing the single {@code /mcp} endpoint that modern MCP clients expect.
+ *
+ */
+public class McpServerDefaultsEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
+
+ /**
+ * The property that reports the MCP server name to clients.
+ */
+ static final String NAME_PROPERTY = "spring.ai.mcp.server.name";
+
+ /**
+ * The property that reports the MCP server version to clients.
+ */
+ static final String VERSION_PROPERTY = "spring.ai.mcp.server.version";
+
+ /**
+ * The property that selects the MCP server API type ({@code sync} or {@code async}).
+ */
+ static final String TYPE_PROPERTY = "spring.ai.mcp.server.type";
+
+ /**
+ * The property that selects the MCP transport protocol ({@code streamable},
+ * {@code stateless}, or the legacy {@code sse}).
+ */
+ static final String PROTOCOL_PROPERTY = "spring.ai.mcp.server.protocol";
+
+ /**
+ * Default server name advertised to MCP clients.
+ */
+ static final String DEFAULT_SERVER_NAME = "Spring Boot Admin MCP Server";
+
+ /**
+ * Default MCP server API type. Spring Boot Admin runs on a reactive WebFlux/Netty
+ * stack, so the asynchronous server is the natural fit.
+ */
+ static final String DEFAULT_SERVER_TYPE = "async";
+
+ /**
+ * Default MCP transport protocol. Must be set explicitly in the environment because
+ * Spring AI's SSE transport condition carries {@code matchIfMissing=true} and wins
+ * when the property is absent, even though {@code McpServerProperties} defaults to
+ * {@code STREAMABLE}.
+ */
+ static final String DEFAULT_SERVER_PROTOCOL = "streamable";
+
+ /**
+ * Name of the property source contributing the defaults.
+ */
+ static final String PROPERTY_SOURCE_NAME = "springBootAdminMcpServerDefaults";
+
+ /**
+ * Creates a new {@code McpServerDefaultsEnvironmentPostProcessor}.
+ */
+ public McpServerDefaultsEnvironmentPostProcessor() {
+ // NOOP
+ }
+
+ @Override
+ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
+ Map defaults = new HashMap<>();
+ defaults.put(NAME_PROPERTY, DEFAULT_SERVER_NAME);
+ defaults.put(TYPE_PROPERTY, DEFAULT_SERVER_TYPE);
+ defaults.put(PROTOCOL_PROPERTY, DEFAULT_SERVER_PROTOCOL);
+ String version = resolveVersion();
+ if (StringUtils.hasText(version)) {
+ defaults.put(VERSION_PROPERTY, version);
+ }
+ // addLast -> lowest precedence, so user configuration always wins.
+ environment.getPropertySources().addLast(new MapPropertySource(PROPERTY_SOURCE_NAME, defaults));
+ }
+
+ /**
+ * Resolves the Spring Boot Admin implementation version from the JAR manifest.
+ * @return the implementation version, or {@code null} when unavailable (e.g. not
+ * running from a packaged JAR)
+ */
+ private String resolveVersion() {
+ Package pkg = McpServerDefaultsEnvironmentPostProcessor.class.getPackage();
+ return (pkg != null) ? pkg.getImplementationVersion() : null;
+ }
+
+ @Override
+ public int getOrder() {
+ // Run late so the defaults are only ever contributed as a fallback.
+ return Ordered.LOWEST_PRECEDENCE;
+ }
+
+}
diff --git a/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/tools/ActuatorClient.java b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/tools/ActuatorClient.java
new file mode 100644
index 00000000000..b72e495b1f3
--- /dev/null
+++ b/spring-boot-admin-server-mcp/src/main/java/de/codecentric/boot/admin/server/mcp/tools/ActuatorClient.java
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2014-2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package de.codecentric.boot.admin.server.mcp.tools;
+
+import java.time.Duration;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.MediaType;
+import reactor.core.publisher.Mono;
+
+import de.codecentric.boot.admin.server.domain.entities.Instance;
+import de.codecentric.boot.admin.server.domain.entities.InstanceRepository;
+import de.codecentric.boot.admin.server.domain.values.InstanceId;
+import de.codecentric.boot.admin.server.web.client.InstanceWebClient;
+
+/**
+ * Shared helper for MCP tool classes that call actuator endpoints on registered Spring
+ * Boot applications.
+ *
+ *
+ * Encapsulates the repeated WebClient call patterns and the
+ * {@code findByName / switchIfEmpty} lookup so that individual tool classes only contain
+ * their {@code @McpTool}-annotated methods and response formatters.
+ *
+ */
+public class ActuatorClient {
+
+ private static final Logger log = LoggerFactory.getLogger(ActuatorClient.class);
+
+ static final ParameterizedTypeReference