feat: add size field and builder pattern to Resource record (#331)
The size field helps hosts display file sizes and estimate context window usage. - Add size parameter to Resource record for tracking raw content size in bytes - Implement Builder pattern for Resource construction with validation - Add deprecated constructor for backwards compatibility - Add tests for builder pattern and field validation Resolves #330 Signed-off-by: Christian Tzolov <christian.tzolov@broadcom.com>
This commit is contained in:
parent
0fe76ba993
commit
6c330db5ad
2 changed files with 130 additions and 7 deletions
|
|
@ -0,0 +1,5 @@
|
|||
package io.modelcontextprotocol.spec;
|
||||
|
||||
public class ArgumentException {
|
||||
|
||||
}
|
||||
|
|
@ -3,23 +3,24 @@
|
|||
*/
|
||||
package io.modelcontextprotocol.spec;
|
||||
|
||||
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
|
||||
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
|
||||
import io.modelcontextprotocol.spec.McpSchema.TextResourceContents;
|
||||
import net.javacrumbs.jsonunit.core.Option;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
|
||||
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.json;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
|
||||
|
||||
import io.modelcontextprotocol.spec.McpSchema.TextResourceContents;
|
||||
import net.javacrumbs.jsonunit.core.Option;
|
||||
|
||||
/**
|
||||
* @author Christian Tzolov
|
||||
|
|
@ -295,6 +296,59 @@ public class McpSchemaTests {
|
|||
{"uri":"resource://test","name":"Test Resource","description":"A test resource","mimeType":"text/plain","annotations":{"audience":["user","assistant"],"priority":0.8}}"""));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testResourceBuilder() throws Exception {
|
||||
McpSchema.Annotations annotations = new McpSchema.Annotations(
|
||||
Arrays.asList(McpSchema.Role.USER, McpSchema.Role.ASSISTANT), 0.8);
|
||||
|
||||
McpSchema.Resource resource = McpSchema.Resource.builder()
|
||||
.uri("resource://test")
|
||||
.name("Test Resource")
|
||||
.description("A test resource")
|
||||
.mimeType("text/plain")
|
||||
.size(256L)
|
||||
.annotations(annotations)
|
||||
.build();
|
||||
|
||||
String value = mapper.writeValueAsString(resource);
|
||||
assertThatJson(value).when(Option.IGNORING_ARRAY_ORDER)
|
||||
.when(Option.IGNORING_EXTRA_ARRAY_ITEMS)
|
||||
.isObject()
|
||||
.isEqualTo(
|
||||
json("""
|
||||
{"uri":"resource://test","name":"Test Resource","description":"A test resource","mimeType":"text/plain","size":256,"annotations":{"audience":["user","assistant"],"priority":0.8}}"""));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testResourceBuilderUriRequired() {
|
||||
McpSchema.Annotations annotations = new McpSchema.Annotations(
|
||||
Arrays.asList(McpSchema.Role.USER, McpSchema.Role.ASSISTANT), 0.8);
|
||||
|
||||
McpSchema.Resource.Builder resourceBuilder = McpSchema.Resource.builder()
|
||||
.name("Test Resource")
|
||||
.description("A test resource")
|
||||
.mimeType("text/plain")
|
||||
.size(256L)
|
||||
.annotations(annotations);
|
||||
|
||||
assertThatThrownBy(resourceBuilder::build).isInstanceOf(java.lang.IllegalArgumentException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testResourceBuilderNameRequired() {
|
||||
McpSchema.Annotations annotations = new McpSchema.Annotations(
|
||||
Arrays.asList(McpSchema.Role.USER, McpSchema.Role.ASSISTANT), 0.8);
|
||||
|
||||
McpSchema.Resource.Builder resourceBuilder = McpSchema.Resource.builder()
|
||||
.uri("resource://test")
|
||||
.description("A test resource")
|
||||
.mimeType("text/plain")
|
||||
.size(256L)
|
||||
.annotations(annotations);
|
||||
|
||||
assertThatThrownBy(resourceBuilder::build).isInstanceOf(java.lang.IllegalArgumentException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testResourceTemplate() throws Exception {
|
||||
McpSchema.Annotations annotations = new McpSchema.Annotations(Arrays.asList(McpSchema.Role.USER), 0.5);
|
||||
|
|
|
|||
Loading…
Reference in a new issue