Content Types Reference

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")));
    }
}

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"));
    }
}