modelcontextprotocol / modelcontextprotocol/java-sdk

io.modelcontextprotocol.util.Utils#resolveUri incorrectly handles nested paths

Offen
#257 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

area/client enhancement help wanted P2
Vorherrschende Sprache
Java
Sterne
3.7k
Forks
1.1k
Ø Merge
1 T. 15 Std.
Gemergte PRs (30 T.)
9

Beschreibung

Please do a quick search on GitHub issues first, there might be already a duplicate issue for the one you are about to create.
If the bug is trivial, just go ahead and create the issue. Otherwise, please take a few moments and fill in the following sections:

Bug description

It took me four hours to locate and fix this Bug,
When I create a simple link, it always reminds me of http status 302. Finally, it was located that the SSE MCP Server of the business side was redirected.

Environment
Please provide as many details as possible: Spring MCP version, Java version, which vector store you use if any, etc

Java SDK

Steps to reproduce
It's very simple. When you have an SSE MCP SERVER but the interface does not end with /sse, an error will definitely be reported when creating the connection.

Expected behavior

Adapt to the SSE MCP SERVER with non-standard users

I first fork and change the IO. Modelcontextprotocol. Util. Utils# resolveUri logic is as follows

old code

	public static URI resolveUri(URI baseUrl, String endpointUrl) {
		URI endpointUri = URI.create(endpointUrl);
		if (endpointUri.isAbsolute() && !isUnderBaseUri(baseUrl, endpointUri)) {
			throw new IllegalArgumentException("Absolute endpoint URL does not match the base URL.");
		}
		else {
			return baseUrl.resolve(endpointUri);
		}
	}

new code

	public static URI resolveUri(URI baseUrl, String endpointUrl) {
		if (endpointUrl.equals(DEFAULT_SSE_ENDPOINT)) {
			return baseUrl;
		}
		else {
			URI endpointUri = URI.create(endpointUrl);
			return baseUrl.resolve(endpointUri);
		}
	}

Minimal Complete Reproducible example
You only need to replace the following URL with a URL that does not end with SSE, and it can be reproduced

import io.modelcontextprotocol.client.McpClient;
import io.modelcontextprotocol.client.McpSyncClient;
import io.modelcontextprotocol.client.transport.HttpClientSseClientTransport;
import io.modelcontextprotocol.spec.McpSchema;
import org.junit.Test;

import java.time.Duration;

public class SSEClientTest {
	private String youUrl = "https://host:port/aaa/bbb/cccc";

	@Test
	public void testSSE() {
		mockSSEClient(youUrl);
	}

	/**
	 * Test MCP Client
	 */
	private void mockSSEClient(String url) {
		McpSyncClient client = McpClient.sync(create(url))
			.requestTimeout(Duration.ofSeconds(3))
			.initializationTimeout(Duration.ofSeconds(1))
			.capabilities(McpSchema.ClientCapabilities.builder().build())
			.build();

		client.initialize();
		for (McpSchema.Tool tool : client.listTools().tools()) {
			System.out.println(" Tool :" + tool);
		}

	}

	private HttpClientSseClientTransport create(String url) {
		return HttpClientSseClientTransport.builder(url).build();
	}
}

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne bei io.modelcontextprotocol.util.Utils#resolveUri und prüfe, wie die Basis-URL und die Endpoint-URL für verschachtelte Pfade aufgelöst werden. Führe die bereitgestellte SSEClientTest-Reproduktion mit einer SSE-Server-URL aus, die nicht auf /sse endet; abgeschlossen ist die Aufgabe, wenn der Client sich erfolgreich verbindet, ohne den gemeldeten Weiterleitungsfehler.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
java
Bereich
api, networking
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.