Skip to content

Commit 3183c0a

Browse files
Pratyayclaude
andcommitted
Add mcp-resilience4j module with transport-level resilience
Adds a new mcp-resilience4j module providing circuit breaking, retry, rate limiting, time limiting, and bulkhead policies for McpClientTransport. - ResilientMcpClientTransport: decorator wrapping any McpClientTransport with all five Resilience4j policies on sendMessage(), CB+Retry only on connect(). Policy order follows the standard hierarchy: Retry → CircuitBreaker → RateLimiter → TimeLimiter → Bulkhead. - McpResilienceConfig: high-level fluent facade for configuring the transport wrapper via config objects or shared registries. - 13 unit tests covering delegation, retry, circuit breaker, time limiter, and all transparent-delegation methods. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent d1ef187 commit 3183c0a

6 files changed

Lines changed: 1356 additions & 0 deletions

File tree

mcp-bom/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
<version>${project.version}</version>
6262
</dependency>
6363

64+
<!-- MCP Resilience4j -->
65+
<dependency>
66+
<groupId>io.modelcontextprotocol.sdk</groupId>
67+
<artifactId>mcp-resilience4j</artifactId>
68+
<version>${project.version}</version>
69+
</dependency>
70+
6471
</dependencies>
6572
</dependencyManagement>
6673

mcp-resilience4j/pom.xml

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<groupId>io.modelcontextprotocol.sdk</groupId>
8+
<artifactId>mcp-parent</artifactId>
9+
<version>2.0.1-SNAPSHOT</version>
10+
</parent>
11+
<artifactId>mcp-resilience4j</artifactId>
12+
<packaging>jar</packaging>
13+
<name>Java MCP SDK Resilience4j Integration</name>
14+
<description>Resilience4j integration for the Java MCP SDK providing circuit breaker, retry, and time limiter support for MCP transport</description>
15+
<url>https://github.com/modelcontextprotocol/java-sdk</url>
16+
17+
<scm>
18+
<url>https://github.com/modelcontextprotocol/java-sdk</url>
19+
<connection>scm:git:git://github.com/modelcontextprotocol/java-sdk.git</connection>
20+
<developerConnection>scm:git:ssh://git@github.com/modelcontextprotocol/java-sdk.git</developerConnection>
21+
</scm>
22+
23+
<properties>
24+
<resilience4j.version>2.2.0</resilience4j.version>
25+
</properties>
26+
27+
<dependencies>
28+
<dependency>
29+
<groupId>io.modelcontextprotocol.sdk</groupId>
30+
<artifactId>mcp-core</artifactId>
31+
<version>2.0.5-SNAPSHOT</version>
32+
<scope>provided</scope>
33+
</dependency>
34+
35+
<dependency>
36+
<groupId>io.projectreactor</groupId>
37+
<artifactId>reactor-core</artifactId>
38+
</dependency>
39+
40+
<dependency>
41+
<groupId>org.slf4j</groupId>
42+
<artifactId>slf4j-api</artifactId>
43+
<version>${slf4j-api.version}</version>
44+
</dependency>
45+
46+
<!-- Resilience4j core modules -->
47+
<dependency>
48+
<groupId>io.github.resilience4j</groupId>
49+
<artifactId>resilience4j-circuitbreaker</artifactId>
50+
<version>${resilience4j.version}</version>
51+
</dependency>
52+
53+
<dependency>
54+
<groupId>io.github.resilience4j</groupId>
55+
<artifactId>resilience4j-retry</artifactId>
56+
<version>${resilience4j.version}</version>
57+
</dependency>
58+
59+
<dependency>
60+
<groupId>io.github.resilience4j</groupId>
61+
<artifactId>resilience4j-bulkhead</artifactId>
62+
<version>${resilience4j.version}</version>
63+
</dependency>
64+
65+
<dependency>
66+
<groupId>io.github.resilience4j</groupId>
67+
<artifactId>resilience4j-ratelimiter</artifactId>
68+
<version>${resilience4j.version}</version>
69+
</dependency>
70+
71+
<dependency>
72+
<groupId>io.github.resilience4j</groupId>
73+
<artifactId>resilience4j-timelimiter</artifactId>
74+
<version>${resilience4j.version}</version>
75+
</dependency>
76+
77+
<!-- Resilience4j Reactor integration -->
78+
<dependency>
79+
<groupId>io.github.resilience4j</groupId>
80+
<artifactId>resilience4j-reactor</artifactId>
81+
<version>${resilience4j.version}</version>
82+
</dependency>
83+
84+
<!-- Micrometer integration (optional - for Hystrix/Prometheus metrics) -->
85+
<dependency>
86+
<groupId>io.github.resilience4j</groupId>
87+
<artifactId>resilience4j-micrometer</artifactId>
88+
<version>${resilience4j.version}</version>
89+
<optional>true</optional>
90+
</dependency>
91+
92+
<dependency>
93+
<groupId>io.micrometer</groupId>
94+
<artifactId>micrometer-core</artifactId>
95+
<version>1.13.0</version>
96+
<optional>true</optional>
97+
</dependency>
98+
99+
<!-- Jakarta Servlet (optional - for Hystrix SSE stream servlet) -->
100+
<dependency>
101+
<groupId>jakarta.servlet</groupId>
102+
<artifactId>jakarta.servlet-api</artifactId>
103+
<version>${jakarta.servlet.version}</version>
104+
<optional>true</optional>
105+
</dependency>
106+
107+
<!-- Test dependencies -->
108+
<dependency>
109+
<groupId>org.junit.jupiter</groupId>
110+
<artifactId>junit-jupiter-api</artifactId>
111+
<version>${junit.version}</version>
112+
<scope>test</scope>
113+
</dependency>
114+
115+
<dependency>
116+
<groupId>org.junit.jupiter</groupId>
117+
<artifactId>junit-jupiter-params</artifactId>
118+
<version>${junit.version}</version>
119+
<scope>test</scope>
120+
</dependency>
121+
122+
<dependency>
123+
<groupId>org.mockito</groupId>
124+
<artifactId>mockito-core</artifactId>
125+
<version>${mockito.version}</version>
126+
<scope>test</scope>
127+
</dependency>
128+
129+
<dependency>
130+
<groupId>org.mockito</groupId>
131+
<artifactId>mockito-junit-jupiter</artifactId>
132+
<version>${mockito.version}</version>
133+
<scope>test</scope>
134+
</dependency>
135+
136+
<dependency>
137+
<groupId>org.assertj</groupId>
138+
<artifactId>assertj-core</artifactId>
139+
<version>${assert4j.version}</version>
140+
<scope>test</scope>
141+
</dependency>
142+
143+
<dependency>
144+
<groupId>io.projectreactor</groupId>
145+
<artifactId>reactor-test</artifactId>
146+
<scope>test</scope>
147+
</dependency>
148+
149+
<dependency>
150+
<groupId>ch.qos.logback</groupId>
151+
<artifactId>logback-classic</artifactId>
152+
<version>${logback.version}</version>
153+
<scope>test</scope>
154+
</dependency>
155+
156+
<dependency>
157+
<groupId>net.bytebuddy</groupId>
158+
<artifactId>byte-buddy</artifactId>
159+
<version>${byte-buddy.version}</version>
160+
<scope>test</scope>
161+
</dependency>
162+
163+
</dependencies>
164+
165+
<profiles>
166+
<profile>
167+
<id>jackson3</id>
168+
<activation>
169+
<activeByDefault>true</activeByDefault>
170+
</activation>
171+
<dependencies>
172+
<dependency>
173+
<groupId>io.modelcontextprotocol.sdk</groupId>
174+
<artifactId>mcp-json-jackson3</artifactId>
175+
<version>2.0.5-SNAPSHOT</version>
176+
<scope>test</scope>
177+
</dependency>
178+
</dependencies>
179+
</profile>
180+
<profile>
181+
<id>jackson2</id>
182+
<dependencies>
183+
<dependency>
184+
<groupId>io.modelcontextprotocol.sdk</groupId>
185+
<artifactId>mcp-json-jackson2</artifactId>
186+
<version>2.0.5-SNAPSHOT</version>
187+
<scope>test</scope>
188+
</dependency>
189+
</dependencies>
190+
</profile>
191+
</profiles>
192+
193+
</project>

0 commit comments

Comments
 (0)