Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
import io.modelcontextprotocol.spec.McpServerTransportProviderBase;
import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider;
import io.modelcontextprotocol.util.Assert;
import io.modelcontextprotocol.util.DeafaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.DefaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.McpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.Utils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -120,7 +120,7 @@ public class McpAsyncServer {

private List<String> protocolVersions;

private McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
private McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

/**
* Create a new McpAsyncServer with the given transport provider and capabilities.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import io.modelcontextprotocol.spec.McpStatelessServerTransport;
import io.modelcontextprotocol.spec.McpStreamableServerTransportProvider;
import io.modelcontextprotocol.util.Assert;
import io.modelcontextprotocol.util.DeafaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.DefaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.McpUriTemplateManagerFactory;
import reactor.core.publisher.Mono;

Expand Down Expand Up @@ -268,7 +268,7 @@ public McpAsyncServer build() {
*/
abstract class AsyncSpecification<S extends AsyncSpecification<S>> {

McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

McpJsonMapper jsonMapper;

Expand Down Expand Up @@ -865,7 +865,7 @@ public McpSyncServer build() {
*/
abstract class SyncSpecification<S extends SyncSpecification<S>> {

McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

McpJsonMapper jsonMapper;

Expand Down Expand Up @@ -1407,7 +1407,7 @@ class StatelessAsyncSpecification {

private final McpStatelessServerTransport transport;

McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

McpJsonMapper jsonMapper;

Expand Down Expand Up @@ -1870,7 +1870,7 @@ class StatelessSyncSpecification {

boolean immediateExecution = false;

McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

McpJsonMapper jsonMapper;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import io.modelcontextprotocol.spec.McpSchema.Tool;
import io.modelcontextprotocol.spec.McpStatelessServerTransport;
import io.modelcontextprotocol.util.Assert;
import io.modelcontextprotocol.util.DeafaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.DefaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.McpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.Utils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -74,7 +74,7 @@ public class McpStatelessAsyncServer {

private List<String> protocolVersions;

private McpUriTemplateManagerFactory uriTemplateManagerFactory = new DeafaultMcpUriTemplateManagerFactory();
private McpUriTemplateManagerFactory uriTemplateManagerFactory = new DefaultMcpUriTemplateManagerFactory();

private final JsonSchemaValidator jsonSchemaValidator;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,14 +141,34 @@ public boolean matches(String uri) {
return uri.equals(this.uriTemplate);
}

// Convert the pattern to a regex
String regex = this.uriTemplate.replaceAll("\\{[^/]+?\\}", "([^/]+?)");
regex = regex.replace("/", "\\/");
// Convert the URI template into a robust regex pattern that escapes special
// characters like '?'.
StringBuilder patternBuilder = new StringBuilder("^");
Matcher variableMatcher = URI_VARIABLE_PATTERN.matcher(this.uriTemplate);
int lastEnd = 0;

while (variableMatcher.find()) {
// Append the literal part of the template, safely quoted
String textBefore = this.uriTemplate.substring(lastEnd, variableMatcher.start());
patternBuilder.append(Pattern.quote(textBefore));
// Append a capturing group for the variable itself
patternBuilder.append("([^/]+?)");
lastEnd = variableMatcher.end();
}

// Append any remaining literal text after the last variable
if (lastEnd < this.uriTemplate.length()) {
patternBuilder.append(Pattern.quote(this.uriTemplate.substring(lastEnd)));
}

patternBuilder.append("$");

// Check if the URI matches the regex
return Pattern.compile(regex).matcher(uri).matches();
return Pattern.compile(patternBuilder.toString()).matcher(uri).matches();
}



@Override
public boolean isUriTemplate(String uri) {
return URI_VARIABLE_PATTERN.matcher(uri).find();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
/**
* @author Christian Tzolov
*/
public class DeafaultMcpUriTemplateManagerFactory implements McpUriTemplateManagerFactory {
public class DefaultMcpUriTemplateManagerFactory implements McpUriTemplateManagerFactory {

/**
* Creates a new instance of {@link McpUriTemplateManager} with the specified URI
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import java.util.List;
import java.util.Map;

import io.modelcontextprotocol.util.DeafaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.DefaultMcpUriTemplateManagerFactory;
import io.modelcontextprotocol.util.McpUriTemplateManager;
import io.modelcontextprotocol.util.McpUriTemplateManagerFactory;
import org.junit.jupiter.api.BeforeEach;
Expand All @@ -29,7 +29,7 @@ public class McpUriTemplateManagerTests {

@BeforeEach
void setUp() {
this.uriTemplateFactory = new DeafaultMcpUriTemplateManagerFactory();
this.uriTemplateFactory = new DefaultMcpUriTemplateManagerFactory();
}

@Test
Expand Down Expand Up @@ -94,4 +94,12 @@ void shouldMatchUriAgainstTemplatePattern() {
assertFalse(uriTemplateManager.matches("/api/users/123/comments/456"));
}

@Test
void shouldMatchUriWithQueryParameters() {
String templateWithQuery = "file://name/search?={search}";
var uriTemplateManager = this.uriTemplateFactory.create(templateWithQuery);

assertTrue(uriTemplateManager.matches("file://name/search?=abcd"),
"Should correctly match a URI containing query parameters.");
}
}
Loading