Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
4 changes: 2 additions & 2 deletions mcp-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
<version>${jackson-annotations.version}</version>
</dependency>

<dependency>
Expand All @@ -100,7 +100,7 @@
<!-- Test dependencies -->
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-json-jackson2</artifactId>
<artifactId>mcp-json-jackson3</artifactId>
<version>0.18.0-SNAPSHOT</version>
<scope>test</scope>
</dependency>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
import tools.jackson.databind.exc.InvalidTypeIdException;

import io.modelcontextprotocol.spec.McpSchema.TextResourceContents;
import net.javacrumbs.jsonunit.core.Option;
Expand Down
6 changes: 3 additions & 3 deletions mcp-json-jackson2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<artifactId>mcp-json-jackson2</artifactId>
<packaging>jar</packaging>
<name>Java MCP SDK JSON Jackson</name>
<description>Java MCP SDK JSON implementation based on Jackson</description>
<description>Java MCP SDK JSON implementation based on Jackson 2</description>
<url>https://github.com/modelcontextprotocol/java-sdk</url>
<scm>
<url>https://github.com/modelcontextprotocol/java-sdk</url>
Expand Down Expand Up @@ -42,12 +42,12 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
<version>${jackson2.version}</version>
</dependency>
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>${json-schema-validator.version}</version>
<version>${json-schema-validator-jackson2.version}</version>
</dependency>

<dependency>
Expand Down
79 changes: 79 additions & 0 deletions mcp-json-jackson3/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-parent</artifactId>
<version>0.18.0-SNAPSHOT</version>
</parent>
<artifactId>mcp-json-jackson3</artifactId>
<packaging>jar</packaging>
<name>Java MCP SDK JSON Jackson</name>
<description>Java MCP SDK JSON implementation based on Jackson 3</description>
<url>https://github.com/modelcontextprotocol/java-sdk</url>
<scm>
<url>https://github.com/modelcontextprotocol/java-sdk</url>
<connection>git://github.com/modelcontextprotocol/java-sdk.git</connection>
<developerConnection>git@github.com/modelcontextprotocol/java-sdk.git</developerConnection>
</scm>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-json</artifactId>
<version>0.18.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson3.version}</version>
</dependency>
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>${json-schema-validator-jackson3.version}</version>
</dependency>

<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assert4j.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>

</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright 2026 - 2026 the original author or authors.
*/

package io.modelcontextprotocol.json.jackson3;

import io.modelcontextprotocol.json.McpJsonMapper;
import io.modelcontextprotocol.json.TypeRef;

import tools.jackson.databind.JavaType;
import tools.jackson.databind.json.JsonMapper;

/**
* Jackson-based implementation of JsonMapper. Wraps a Jackson JsonMapper but keeps the
* SDK decoupled from Jackson at the API level.
*/
public final class JacksonMcpJsonMapper implements McpJsonMapper {

private final JsonMapper jsonMapper;

/**
* Constructs a new JacksonMcpJsonMapper instance with the given JsonMapper.
* @param jsonMapper the JsonMapper to be used for JSON serialization and
* deserialization. Must not be null.
* @throws IllegalArgumentException if the provided JsonMapper is null.
*/
public JacksonMcpJsonMapper(JsonMapper jsonMapper) {
if (jsonMapper == null) {
throw new IllegalArgumentException("JsonMapper must not be null");
}
this.jsonMapper = jsonMapper;
}

/**
* Returns the underlying Jackson {@link JsonMapper} used for JSON serialization and
* deserialization.
* @return the JsonMapper instance
*/
public JsonMapper getJsonMapper() {
return jsonMapper;
}

@Override
public <T> T readValue(String content, Class<T> type) {
return jsonMapper.readValue(content, type);
}

@Override
public <T> T readValue(byte[] content, Class<T> type) {
return jsonMapper.readValue(content, type);
}

@Override
public <T> T readValue(String content, TypeRef<T> type) {
JavaType javaType = jsonMapper.getTypeFactory().constructType(type.getType());
return jsonMapper.readValue(content, javaType);
}

@Override
public <T> T readValue(byte[] content, TypeRef<T> type) {
JavaType javaType = jsonMapper.getTypeFactory().constructType(type.getType());
return jsonMapper.readValue(content, javaType);
}

@Override
public <T> T convertValue(Object fromValue, Class<T> type) {
return jsonMapper.convertValue(fromValue, type);
}

@Override
public <T> T convertValue(Object fromValue, TypeRef<T> type) {
JavaType javaType = jsonMapper.getTypeFactory().constructType(type.getType());
return jsonMapper.convertValue(fromValue, javaType);
}

@Override
public String writeValueAsString(Object value) {
return jsonMapper.writeValueAsString(value);
}

@Override
public byte[] writeValueAsBytes(Object value) {
return jsonMapper.writeValueAsBytes(value);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/*
* Copyright 2026 - 2026 the original author or authors.
*/

package io.modelcontextprotocol.json.jackson3;

import tools.jackson.databind.json.JsonMapper;

import io.modelcontextprotocol.json.McpJsonMapper;
import io.modelcontextprotocol.json.McpJsonMapperSupplier;

/**
* A supplier of {@link McpJsonMapper} instances that uses the Jackson library for JSON
* serialization and deserialization.
* <p>
* This implementation provides a {@link McpJsonMapper} backed by a Jackson
* {@link JsonMapper}.
*/
public class JacksonMcpJsonMapperSupplier implements McpJsonMapperSupplier {

/**
* Returns a new instance of {@link McpJsonMapper} that uses the Jackson library for
* JSON serialization and deserialization.
* <p>
* The returned {@link McpJsonMapper} is backed by a new instance of
* {@link tools.jackson.databind.json.JsonMapper}.
* @return a new {@link McpJsonMapper} instance
*/
@Override
public McpJsonMapper get() {
return new JacksonMcpJsonMapper(JsonMapper.shared());
}

}
Loading