Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ The Spring integration module provides seamless integration with Spring AI and S
### Annotations

#### Client
- **`@McpLoggingConsumer`** - Annotates methods that handle logging message notifications from MCP servers
- **`@McpLogging`** - Annotates methods that handle logging message notifications from MCP servers
- **`@McpSampling`** - Annotates methods that handle sampling requests from MCP servers
- **`@McpElicitation`** - Annotates methods that handle elicitation requests to gather additional information from users
- **`@McpProgress`** - Annotates methods that handle progress notifications for long-running operations
Expand Down Expand Up @@ -148,9 +148,9 @@ The modules provide callback implementations for each operation type:
- `AsyncStatelessMcpResourceMethodCallback` - Asynchronous stateless implementation using `McpTransportContext`

#### Logging Consumer
- `AbstractMcpLoggingConsumerMethodCallback` - Base class for logging consumer method callbacks
- `SyncMcpLoggingConsumerMethodCallback` - Synchronous implementation
- `AsyncMcpLoggingConsumerMethodCallback` - Asynchronous implementation using Reactor's Mono
- `AbstractMcpLoggingMethodCallback` - Base class for logging consumer method callbacks
- `SyncMcpLoggingMethodCallback` - Synchronous implementation
- `AsyncMcpLoggingMethodCallback` - Asynchronous implementation using Reactor's Mono

#### Tool
- `AbstractSyncMcpToolMethodCallback` - Base class for synchronous tool method callbacks
Expand Down Expand Up @@ -185,8 +185,8 @@ The project includes provider classes that scan for annotated methods and create
- `SyncMcpResourceProvider` - Processes `@McpResource` annotations for synchronous operations
- `SyncMcpToolProvider` - Processes `@McpTool` annotations for synchronous operations
- `AsyncMcpToolProvider` - Processes `@McpTool` annotations for asynchronous operations
- `SyncMcpLoggingConsumerProvider` - Processes `@McpLoggingConsumer` annotations for synchronous operations
- `AsyncMcpLoggingConsumerProvider` - Processes `@McpLoggingConsumer` annotations for asynchronous operations
- `SyncMcpLoggingProvider` - Processes `@McpLogging` annotations for synchronous operations
- `AsyncMcpLoggingProvider` - Processes `@McpLogging` annotations for asynchronous operations
- `SyncMcpSamplingProvider` - Processes `@McpSampling` annotations for synchronous operations
- `AsyncMcpSamplingProvider` - Processes `@McpSampling` annotations for asynchronous operations
- `SyncMcpElicitationProvider` - Processes `@McpElicitation` annotations for synchronous operations
Expand Down Expand Up @@ -663,7 +663,7 @@ public class LoggingHandler {
* Handle logging message notifications with a single parameter.
* @param notification The logging message notification
*/
@McpLoggingConsumer
@McpLogging
public void handleLoggingMessage(LoggingMessageNotification notification) {
System.out.println("Received logging message: " + notification.level() + " - " + notification.logger() + " - "
+ notification.data());
Expand All @@ -675,7 +675,7 @@ public class LoggingHandler {
* @param logger The logger name
* @param data The log message data
*/
@McpLoggingConsumer
@McpLogging
public void handleLoggingMessageWithParams(LoggingLevel level, String logger, String data) {
System.out.println("Received logging message with params: " + level + " - " + logger + " - " + data);
}
Expand All @@ -684,7 +684,7 @@ public class LoggingHandler {
* Handle logging message notifications for a specific client.
* @param notification The logging message notification
*/
@McpLoggingConsumer(clientId = "client-1")
@McpLogging(clientId = "client-1")
public void handleClient1LoggingMessage(LoggingMessageNotification notification) {
System.out.println("Client-1 logging message: " + notification.level() + " - " + notification.data());
}
Expand All @@ -693,7 +693,7 @@ public class LoggingHandler {
* Handle logging message notifications for another specific client.
* @param notification The logging message notification
*/
@McpLoggingConsumer(clientId = "client-2")
@McpLogging(clientId = "client-2")
public void handleClient2LoggingMessage(LoggingMessageNotification notification) {
System.out.println("Client-2 logging message: " + notification.level() + " - " + notification.data());
}
Expand All @@ -704,7 +704,7 @@ public class MyMcpClient {
public static McpSyncClient createClient(LoggingHandler loggingHandler) {

List<Consumer<LoggingMessageNotification>> loggingCOnsummers =
new SyncMcpLoggingConsumerProvider(List.of(loggingHandler)).getLoggingConsumers();
new SyncMcpLoggingProvider(List.of(loggingHandler)).getLoggingConsumers();

McpSyncClient client = McpClient.sync(transport)
.capabilities(ClientCapabilities.builder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@
import org.springaicommunity.mcp.method.logging.AsyncLoggingSpecification;
import org.springaicommunity.mcp.method.progress.AsyncProgressSpecification;
import org.springaicommunity.mcp.method.sampling.AsyncSamplingSpecification;
import org.springaicommunity.mcp.provider.AsyncMcpElicitationProvider;
import org.springaicommunity.mcp.provider.AsyncMcpLoggingConsumerProvider;
import org.springaicommunity.mcp.provider.AsyncMcpProgressProvider;
import org.springaicommunity.mcp.provider.AsyncMcpSamplingProvider;
import org.springaicommunity.mcp.provider.AsyncMcpToolProvider;
import org.springaicommunity.mcp.provider.AsyncStatelessMcpPromptProvider;
import org.springaicommunity.mcp.provider.AsyncStatelessMcpResourceProvider;
import org.springaicommunity.mcp.provider.AsyncStatelessMcpToolProvider;
import org.springaicommunity.mcp.provider.elicitation.AsyncMcpElicitationProvider;
import org.springaicommunity.mcp.provider.logging.AsyncMcpLoggingProvider;
import org.springaicommunity.mcp.provider.progress.AsyncMcpProgressProvider;
import org.springaicommunity.mcp.provider.prompt.AsyncStatelessMcpPromptProvider;
import org.springaicommunity.mcp.provider.resource.AsyncStatelessMcpResourceProvider;
import org.springaicommunity.mcp.provider.sampling.AsyncMcpSamplingProvider;
import org.springaicommunity.mcp.provider.tool.AsyncMcpToolProvider;
import org.springaicommunity.mcp.provider.tool.AsyncStatelessMcpToolProvider;

import io.modelcontextprotocol.server.McpServerFeatures.AsyncToolSpecification;
import io.modelcontextprotocol.server.McpStatelessServerFeatures;
Expand All @@ -39,9 +39,9 @@
*/
public class AsyncMcpAnnotationProvider {

private static class SpringAiAsyncMcpLoggingConsumerProvider extends AsyncMcpLoggingConsumerProvider {
private static class SpringAiAsyncMcpLoggingProvider extends AsyncMcpLoggingProvider {

public SpringAiAsyncMcpLoggingConsumerProvider(List<Object> loggingObjects) {
public SpringAiAsyncMcpLoggingProvider(List<Object> loggingObjects) {
super(loggingObjects);
}

Expand Down Expand Up @@ -144,7 +144,7 @@ protected Method[] doGetClassMethods(Object bean) {
}

public static List<AsyncLoggingSpecification> createAsyncLoggingSpecifications(List<Object> loggingObjects) {
return new SpringAiAsyncMcpLoggingConsumerProvider(loggingObjects).getLoggingSpecifications();
return new SpringAiAsyncMcpLoggingProvider(loggingObjects).getLoggingSpecifications();
}

public static List<AsyncSamplingSpecification> createAsyncSamplingSpecifications(List<Object> samplingObjects) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,17 @@
import org.springaicommunity.mcp.method.logging.SyncLoggingSpecification;
import org.springaicommunity.mcp.method.progress.SyncProgressSpecification;
import org.springaicommunity.mcp.method.sampling.SyncSamplingSpecification;
import org.springaicommunity.mcp.provider.SyncMcpCompletionProvider;
import org.springaicommunity.mcp.provider.SyncMcpElicitationProvider;
import org.springaicommunity.mcp.provider.SyncMcpLoggingConsumerProvider;
import org.springaicommunity.mcp.provider.SyncMcpProgressProvider;
import org.springaicommunity.mcp.provider.SyncMcpPromptProvider;
import org.springaicommunity.mcp.provider.SyncMcpResourceProvider;
import org.springaicommunity.mcp.provider.SyncMcpSamplingProvider;
import org.springaicommunity.mcp.provider.SyncMcpToolProvider;
import org.springaicommunity.mcp.provider.SyncStatelessMcpPromptProvider;
import org.springaicommunity.mcp.provider.SyncStatelessMcpResourceProvider;
import org.springaicommunity.mcp.provider.SyncStatelessMcpToolProvider;
import org.springaicommunity.mcp.provider.complete.SyncMcpCompletionProvider;
import org.springaicommunity.mcp.provider.elicitation.SyncMcpElicitationProvider;
import org.springaicommunity.mcp.provider.logging.SyncMcpLogginProvider;
import org.springaicommunity.mcp.provider.progress.SyncMcpProgressProvider;
import org.springaicommunity.mcp.provider.prompt.SyncMcpPromptProvider;
import org.springaicommunity.mcp.provider.prompt.SyncStatelessMcpPromptProvider;
import org.springaicommunity.mcp.provider.resource.SyncMcpResourceProvider;
import org.springaicommunity.mcp.provider.resource.SyncStatelessMcpResourceProvider;
import org.springaicommunity.mcp.provider.sampling.SyncMcpSamplingProvider;
import org.springaicommunity.mcp.provider.tool.SyncMcpToolProvider;
import org.springaicommunity.mcp.provider.tool.SyncStatelessMcpToolProvider;

import io.modelcontextprotocol.server.McpServerFeatures.SyncCompletionSpecification;
import io.modelcontextprotocol.server.McpServerFeatures.SyncPromptSpecification;
Expand Down Expand Up @@ -136,9 +136,9 @@ protected Method[] doGetClassMethods(Object bean) {

}

private static class SpringAiSyncMcpLoggingConsumerProvider extends SyncMcpLoggingConsumerProvider {
private static class SpringAiSyncMcpLoggingProvider extends SyncMcpLogginProvider {

public SpringAiSyncMcpLoggingConsumerProvider(List<Object> loggingObjects) {
public SpringAiSyncMcpLoggingProvider(List<Object> loggingObjects) {
super(loggingObjects);
}

Expand Down Expand Up @@ -220,7 +220,7 @@ public static List<McpStatelessServerFeatures.SyncResourceSpecification> createS
}

public static List<SyncLoggingSpecification> createSyncLoggingSpecifications(List<Object> loggingObjects) {
return new SpringAiSyncMcpLoggingConsumerProvider(loggingObjects).getLoggingSpecifications();
return new SpringAiSyncMcpLoggingProvider(loggingObjects).getLoggingSpecifications();
}

public static List<SyncSamplingSpecification> createSyncSamplingSpecifications(List<Object> samplingObjects) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@
*
* <p>
* Example usage: <pre>{@code
* &#64;McpLoggingConsumer
* &#64;McpLogging
* public void handleLoggingMessage(LoggingMessageNotification notification) {
* // Handle the notification
* }
*
*

&#64;McpLoggingConsumer
&#64;McpLogging
* public void handleLoggingMessageWithParams(LoggingLevel level, String logger, String data) {
* // Handle the logging message
* }
Expand All @@ -49,7 +49,7 @@
@Target({ ElementType.METHOD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface McpLoggingConsumer {
public @interface McpLogging {

/**
* Used as connection or client identifier to select the MCP client, the logging
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

import org.springaicommunity.mcp.annotation.McpLoggingConsumer;
import org.springaicommunity.mcp.annotation.McpLogging;

import io.modelcontextprotocol.spec.McpSchema.LoggingLevel;
import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification;
Expand All @@ -22,7 +22,7 @@
*
* @author Christian Tzolov
*/
public abstract class AbstractMcpLoggingConsumerMethodCallback {
public abstract class AbstractMcpLoggingMethodCallback {

protected final Method method;

Expand All @@ -33,7 +33,7 @@ public abstract class AbstractMcpLoggingConsumerMethodCallback {
* @param method The method to create a callback for
* @param bean The bean instance that contains the method
*/
protected AbstractMcpLoggingConsumerMethodCallback(Method method, Object bean) {
protected AbstractMcpLoggingMethodCallback(Method method, Object bean) {
Assert.notNull(method, "Method can't be null!");
Assert.notNull(bean, "Bean can't be null!");

Expand Down Expand Up @@ -212,7 +212,7 @@ public T bean(Object bean) {
* @return This builder
*/
@SuppressWarnings("unchecked")
public T loggingConsumer(McpLoggingConsumer loggingConsumer) {
public T loggingConsumer(McpLogging loggingConsumer) {
// No additional configuration needed from the annotation at this time
return (T) this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,25 @@
import java.lang.reflect.Method;
import java.util.function.Function;

import org.springaicommunity.mcp.annotation.McpLoggingConsumer;
import org.springaicommunity.mcp.annotation.McpLogging;

import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification;
import reactor.core.publisher.Mono;

/**
* Class for creating Function callbacks around logging consumer methods that return Mono.
*
* This class provides a way to convert methods annotated with {@link McpLoggingConsumer}
* into callback functions that can be used to handle logging message notifications in a
* This class provides a way to convert methods annotated with {@link McpLogging} into
* callback functions that can be used to handle logging message notifications in a
* reactive way. It supports methods with either a single LoggingMessageNotification
* parameter or three parameters (LoggingLevel, String, String).
*
* @author Christian Tzolov
*/
public final class AsyncMcpLoggingConsumerMethodCallback extends AbstractMcpLoggingConsumerMethodCallback
public final class AsyncMcpLoggingMethodCallback extends AbstractMcpLoggingMethodCallback
implements Function<LoggingMessageNotification, Mono<Void>> {

private AsyncMcpLoggingConsumerMethodCallback(Builder builder) {
private AsyncMcpLoggingMethodCallback(Builder builder) {
super(builder.method, builder.bean);
}

Expand Down Expand Up @@ -102,16 +102,16 @@ protected void validateReturnType(Method method) {
* This builder provides a fluent API for constructing
* AsyncMcpLoggingConsumerMethodCallback instances with the required parameters.
*/
public static class Builder extends AbstractBuilder<Builder, AsyncMcpLoggingConsumerMethodCallback> {
public static class Builder extends AbstractBuilder<Builder, AsyncMcpLoggingMethodCallback> {

/**
* Build the callback.
* @return A new AsyncMcpLoggingConsumerMethodCallback instance
*/
@Override
public AsyncMcpLoggingConsumerMethodCallback build() {
public AsyncMcpLoggingMethodCallback build() {
validate();
return new AsyncMcpLoggingConsumerMethodCallback(this);
return new AsyncMcpLoggingMethodCallback(this);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@
import java.lang.reflect.Method;
import java.util.function.Consumer;

import org.springaicommunity.mcp.annotation.McpLoggingConsumer;
import org.springaicommunity.mcp.annotation.McpLogging;

import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification;

/**
* Class for creating Consumer callbacks around logging consumer methods.
*
* This class provides a way to convert methods annotated with {@link McpLoggingConsumer}
* into callback functions that can be used to handle logging message notifications. It
* This class provides a way to convert methods annotated with {@link McpLogging} into
* callback functions that can be used to handle logging message notifications. It
* supports methods with either a single LoggingMessageNotification parameter or three
* parameters (LoggingLevel, String, String).
*
* @author Christian Tzolov
*/
public final class SyncMcpLoggingConsumerMethodCallback extends AbstractMcpLoggingConsumerMethodCallback
public final class SyncMcpLoggingMethodCallback extends AbstractMcpLoggingMethodCallback
implements Consumer<LoggingMessageNotification> {

private SyncMcpLoggingConsumerMethodCallback(Builder builder) {
private SyncMcpLoggingMethodCallback(Builder builder) {
super(builder.method, builder.bean);
}

Expand Down Expand Up @@ -79,16 +79,16 @@ protected void validateReturnType(Method method) {
* This builder provides a fluent API for constructing
* SyncMcpLoggingConsumerMethodCallback instances with the required parameters.
*/
public static class Builder extends AbstractBuilder<Builder, SyncMcpLoggingConsumerMethodCallback> {
public static class Builder extends AbstractBuilder<Builder, SyncMcpLoggingMethodCallback> {

/**
* Build the callback.
* @return A new SyncMcpLoggingConsumerMethodCallback instance
*/
@Override
public SyncMcpLoggingConsumerMethodCallback build() {
public SyncMcpLoggingMethodCallback build() {
validate();
return new SyncMcpLoggingConsumerMethodCallback(this);
return new SyncMcpLoggingMethodCallback(this);
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.springaicommunity.mcp.provider;
package org.springaicommunity.mcp.provider.complete;

import java.lang.reflect.Method;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.springaicommunity.mcp.provider;
package org.springaicommunity.mcp.provider.complete;

import java.lang.reflect.Method;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.springaicommunity.mcp.provider;
package org.springaicommunity.mcp.provider.complete;

import java.lang.reflect.Method;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.springaicommunity.mcp.provider;
package org.springaicommunity.mcp.provider.elicitation;

import java.lang.reflect.Method;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package org.springaicommunity.mcp.provider;
package org.springaicommunity.mcp.provider.elicitation;

import java.lang.reflect.Method;
import java.util.List;
Expand Down
Loading