Supported Content Types
According to the MCP specification, tool responses can include various content types to provide rich, multimodal results to clients. The following content types are supported:
TextContent
Text content is the most common content type, containing plain text or formatted text responses.
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.TextContent;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns a greeting message")
ToolResponse greet(String name) {
return ToolResponse.success(new TextContent("Hello, " + name + "!"));
}
}
ImageContent
Image content allows tools to return images as base64-encoded data with a MIME type.
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.ImageContent;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns an image from the filesystem")
ToolResponse getImage(String filename) throws Exception {
byte[] imageData = Files.readAllBytes(Path.of("images", filename));
String base64Image = Base64.getEncoder().encodeToString(imageData);
return ToolResponse.success(new ImageContent(base64Image, "image/png"));
}
}
AudioContent
Audio content allows tools to return audio data as base64-encoded data with a MIME type.
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.AudioContent;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns an audio file")
ToolResponse getAudio(String filename) throws Exception {
byte[] audioData = Files.readAllBytes(Path.of("audio", filename));
String base64Audio = Base64.getEncoder().encodeToString(audioData);
return ToolResponse.success(new AudioContent(base64Audio, "audio/wav"));
}
}
EmbeddedResource
Embedded resource content allows tools to embed resource contents directly in the response.
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.EmbeddedResource;
import io.quarkiverse.mcp.server.TextResourceContents;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns a file as an embedded resource")
ToolResponse getFileAsResource(String filename) {
String content = "File content for: " + filename;
return ToolResponse.success(
new EmbeddedResource(
new TextResourceContents("file:///" + filename, content, "text/plain")));
}
}
ResourceLink
Resource link content provides a reference to a resource without embedding its content directly.
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.ResourceLink;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns a link to a resource")
ToolResponse getResourceLink(String resourceName) {
String uri = "file:///resources/" + resourceName;
return ToolResponse.success(new ResourceLink(uri, "Link to " + resourceName));
}
}
Multiple Content Types
A single tool response can include multiple content types:
import java.util.Base64;
import io.quarkiverse.mcp.server.Tool;
import io.quarkiverse.mcp.server.TextContent;
import io.quarkiverse.mcp.server.ImageContent;
import io.quarkiverse.mcp.server.AudioContent;
import io.quarkiverse.mcp.server.EmbeddedResource;
import io.quarkiverse.mcp.server.ResourceLink;
import io.quarkiverse.mcp.server.TextResourceContents;
import io.quarkiverse.mcp.server.ToolResponse;
public class MyTools {
@Tool(description = "Returns multiple content types in a single response")
ToolResponse getMultipleContents() {
return ToolResponse.success(
new TextContent("Analysis complete"),
new ImageContent(Base64.getEncoder().encodeToString("chart-data".getBytes()), "image/png"),
new AudioContent(Base64.getEncoder().encodeToString("audio-data".getBytes()), "audio/wav"),
new EmbeddedResource(new TextResourceContents("file:///report.txt", "Report data", "text/plain")),
new ResourceLink("file:///full-results.json", "Full analysis results"));
}
}