diff --git a/src/All.slnx b/src/All.slnx
index d96ebbd831d..d30fbb66195 100644
--- a/src/All.slnx
+++ b/src/All.slnx
@@ -244,7 +244,9 @@
+
+
@@ -379,4 +381,4 @@
-
\ No newline at end of file
+
diff --git a/src/HotChocolate/Core/src/Types.Abstractions/Types/Extensions/HotChocolateTypesAbstractionsScalarDefinitionExtensions.cs b/src/HotChocolate/Core/src/Types.Abstractions/Types/Extensions/HotChocolateTypesAbstractionsScalarDefinitionExtensions.cs
index 0f9c63a3968..99320437d09 100644
--- a/src/HotChocolate/Core/src/Types.Abstractions/Types/Extensions/HotChocolateTypesAbstractionsScalarDefinitionExtensions.cs
+++ b/src/HotChocolate/Core/src/Types.Abstractions/Types/Extensions/HotChocolateTypesAbstractionsScalarDefinitionExtensions.cs
@@ -16,7 +16,9 @@ public static ScalarSerializationType GetScalarSerializationType(
this IScalarTypeDefinition scalarTypeDefinition)
{
if (scalarTypeDefinition.SpecifiedBy is not null
- && s_serializationTypeLookup.TryGetValue(scalarTypeDefinition.SpecifiedBy.AbsoluteUri, out var scalarSerializationType))
+ && s_serializationTypeLookup.TryGetValue(
+ scalarTypeDefinition.SpecifiedBy.OriginalString,
+ out var scalarSerializationType))
{
return scalarSerializationType;
}
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs
index a74694cbbe2..195f1b765ca 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/DateTimeZoneType.cs
@@ -18,6 +18,7 @@ public class DateTimeZoneType : StringToClassBaseType
public DateTimeZoneType() : base("DateTimeZone")
{
Description = NodaTimeResources.DateTimeZoneType_Description;
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs
index 9b8408670d9..0bc26920264 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/DurationType.cs
@@ -30,6 +30,7 @@ public DurationType(params IPattern[] allowedPatterns) : base("Duratio
allowedPatterns,
NodaTimeResources.DurationType_Description,
NodaTimeResources.DurationType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs
index 38711ba1a08..2eaa2e30f0b 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/InstantType.cs
@@ -30,6 +30,7 @@ public InstantType(params IPattern[] allowedPatterns) : base("Instant")
allowedPatterns,
NodaTimeResources.InstantType_Description,
NodaTimeResources.InstantType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs
index 041c208bc0e..cb6c12d558b 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/IsoDayOfWeekType.cs
@@ -17,6 +17,7 @@ public class IsoDayOfWeekType : IntToStructBaseType
public IsoDayOfWeekType() : base("IsoDayOfWeek")
{
Description = NodaTimeResources.IsoDayOfWeekType_Description;
+ SerializationType = ScalarSerializationType.Int;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs
index f47022b4999..346456a3fa8 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateTimeType.cs
@@ -30,6 +30,7 @@ public LocalDateTimeType(params IPattern[] allowedPatterns) : bas
_allowedPatterns,
NodaTimeResources.LocalDateTimeType_Description,
NodaTimeResources.LocalDateTimeType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs
index 3eaf4b1f026..aa45c479de2 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalDateType.cs
@@ -31,6 +31,7 @@ public LocalDateType(params IPattern[] allowedPatterns) : base("Local
allowedPatterns,
NodaTimeResources.LocalDateType_Description,
NodaTimeResources.LocalDateType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs
index 7ccc51f90e7..d516e4c3780 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/LocalTimeType.cs
@@ -31,6 +31,7 @@ public LocalTimeType(params IPattern[] allowedPatterns) : base("Local
allowedPatterns,
NodaTimeResources.LocalTimeType_Description,
NodaTimeResources.LocalTimeType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs
index d4c5c769575..cb21cb74611 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateTimeType.cs
@@ -31,6 +31,7 @@ public OffsetDateTimeType(params IPattern[] allowedPatterns)
allowedPatterns,
NodaTimeResources.OffsetDateTimeType_Description,
NodaTimeResources.OffsetDateTimeType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs
index e34cdc2ce12..435c596a609 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetDateType.cs
@@ -32,6 +32,7 @@ public OffsetDateType(params IPattern[] allowedPatterns) : base("Off
allowedPatterns,
NodaTimeResources.OffsetDateType_Description,
NodaTimeResources.OffsetDateType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs
index 683726f3c55..aecc2c79c78 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetTimeType.cs
@@ -31,6 +31,7 @@ public OffsetTimeType(params IPattern[] allowedPatterns) : base("Off
allowedPatterns,
NodaTimeResources.OffsetTimeType_Description,
NodaTimeResources.OffsetTimeType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs
index 26a891c553c..c6a36d32458 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/OffsetType.cs
@@ -32,6 +32,7 @@ public OffsetType(params IPattern[] allowedPatterns) : base("Offset")
allowedPatterns,
NodaTimeResources.OffsetType_Description,
NodaTimeResources.OffsetType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs
index 09a667919ed..7c346cd814c 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/PeriodType.cs
@@ -27,6 +27,7 @@ public PeriodType(params IPattern[] allowedPatterns) : base("Period")
_allowedPatterns = allowedPatterns;
_serializationPattern = allowedPatterns[0];
Description = NodaTimeResources.PeriodType_Description;
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs
index e163da72998..33b93edae13 100644
--- a/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs
+++ b/src/HotChocolate/Core/src/Types.NodaTime/ZonedDateTimeType.cs
@@ -37,6 +37,7 @@ public ZonedDateTimeType(params IPattern[] allowedPatterns)
allowedPatterns,
NodaTimeResources.ZonedDateTimeType_Description,
NodaTimeResources.ZonedDateTimeType_Description_Extended);
+ SerializationType = ScalarSerializationType.String;
}
///
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs
index 47b2b71baba..6bb21583664 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/ByteArrayType.cs
@@ -20,6 +20,7 @@ public ByteArrayType(
{
Description = description;
SerializationType = ScalarSerializationType.String;
+ Pattern = @"^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$";
}
///
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs
index e3109afbc2a..0b130984417 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateTimeType.cs
@@ -41,6 +41,8 @@ public DateTimeType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ Pattern = @"^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(?:\.\d{1,7})?(?:[Zz]|[+-]\d{2}:\d{2})$";
SpecifiedBy = new Uri(SpecifiedByUri);
_enforceSpecFormat = !disableFormatCheck;
}
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs
index 6435f4ac4c0..fb933349249 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/DateType.cs
@@ -21,6 +21,8 @@ public DateType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ Pattern = @"^\d{4}-\d{2}-\d{2}$";
_enforceSpecFormat = !disableFormatCheck;
}
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs
index 1540df4ddd4..eb46c35179e 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateTimeType.cs
@@ -23,6 +23,8 @@ public LocalDateTimeType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ Pattern = @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$";
}
///
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs
index e0a42c9af60..6a5d28bfabb 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalDateType.cs
@@ -32,6 +32,8 @@ public LocalDateType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ Pattern = @"^\d{4}-\d{2}-\d{2}$";
SpecifiedBy = new Uri(SpecifiedByUri);
_enforceSpecFormat = !disableFormatCheck;
}
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs
index 3b07d2e0986..d7f7c0b97d4 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/LocalTimeType.cs
@@ -25,6 +25,8 @@ public LocalTimeType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ Pattern = @"^\d{2}:\d{2}:\d{2}$";
_enforceSpecFormat = !disableFormatCheck;
}
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs
index 794a1f0e848..ad69758e0fb 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/TimeSpanType.cs
@@ -29,6 +29,14 @@ public TimeSpanType(
Format = format;
Description = description;
SerializationType = ScalarSerializationType.String;
+ Pattern = format switch
+ {
+ TimeSpanFormat.Iso8601
+ => @"^-?P(?:\d+W|(?=\d|T(?:\d|$))(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?)$",
+ TimeSpanFormat.DotNet
+ => @"^-?(?:(?:\d{1,8})\.)?(?:[0-1]?\d|2[0-3]):(?:[0-5]?\d):(?:[0-5]?\d)(?:\.(?:\d{1,7}))?$",
+ _ => throw new ArgumentOutOfRangeException(nameof(format), format, null)
+ };
}
[ActivatorUtilitiesConstructor]
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs
index 746de10f908..5501d484dc3 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UrlType.cs
@@ -18,6 +18,8 @@ public UrlType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ SpecifiedBy = new Uri(SpecifiedByUri);
}
///
@@ -27,7 +29,6 @@ public UrlType(
public UrlType()
: this(ScalarNames.URL, bind: BindingBehavior.Implicit)
{
- SpecifiedBy = new Uri(SpecifiedByUri);
}
protected override bool IsInstanceOfType(StringValueNode valueSyntax)
diff --git a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs
index 290228f5c9b..be956ea5da8 100644
--- a/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs
+++ b/src/HotChocolate/Core/src/Types/Types/Scalars/UuidType.cs
@@ -34,7 +34,6 @@ public UuidType(char defaultFormat = '\0', bool enforceFormat = false)
enforceFormat: enforceFormat,
bind: BindingBehavior.Implicit)
{
- SpecifiedBy = new Uri(SpecifiedByUri);
}
///
@@ -72,6 +71,8 @@ public UuidType(
: base(name, bind)
{
Description = description;
+ SerializationType = ScalarSerializationType.String;
+ SpecifiedBy = new Uri(SpecifiedByUri);
_format = CreateFormatString(defaultFormat);
_enforceFormat = enforceFormat;
}
diff --git a/src/HotChocolate/ModelContextProtocol/HotChocolate.ModelContextProtocol.slnx b/src/HotChocolate/ModelContextProtocol/HotChocolate.ModelContextProtocol.slnx
index a88c405cce1..b6e807719f1 100644
--- a/src/HotChocolate/ModelContextProtocol/HotChocolate.ModelContextProtocol.slnx
+++ b/src/HotChocolate/ModelContextProtocol/HotChocolate.ModelContextProtocol.slnx
@@ -1,6 +1,8 @@
+
+
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.Fusion.ModelContextProtocol/HotChocolate.Fusion.ModelContextProtocol.csproj b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.Fusion.ModelContextProtocol/HotChocolate.Fusion.ModelContextProtocol.csproj
new file mode 100644
index 00000000000..d58518d43ac
--- /dev/null
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.Fusion.ModelContextProtocol/HotChocolate.Fusion.ModelContextProtocol.csproj
@@ -0,0 +1,8 @@
+
+
+
+ HotChocolate.Fusion.ModelContextProtocol
+ HotChocolate.ModelContextProtocol
+
+
+
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/AggregateMcpDiagnosticEventListener.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/AggregateMcpDiagnosticEventListener.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/AggregateMcpDiagnosticEventListener.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/AggregateMcpDiagnosticEventListener.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/IMcpDiagnosticEventListener.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/IMcpDiagnosticEventListener.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/IMcpDiagnosticEventListener.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/IMcpDiagnosticEventListener.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/IMcpDiagnosticEvents.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/IMcpDiagnosticEvents.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/IMcpDiagnosticEvents.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/IMcpDiagnosticEvents.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/McpDiagnosticEventListener.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/McpDiagnosticEventListener.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/McpDiagnosticEventListener.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/McpDiagnosticEventListener.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/NoopMcpDiagnosticEventListener.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/NoopMcpDiagnosticEventListener.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Diagnostics/NoopMcpDiagnosticEventListener.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Diagnostics/NoopMcpDiagnosticEventListener.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirective.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolAnnotationsDirective.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirective.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolAnnotationsDirective.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolDirective.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolDirective.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolDirective.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolDirective.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolDirectiveParser.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolDirectiveParser.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolDirectiveParser.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Directives/McpToolDirectiveParser.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/EndpointRouteBuilderExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/EndpointRouteBuilderExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/EndpointRouteBuilderExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/EndpointRouteBuilderExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/FieldNodeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/FieldNodeExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/FieldNodeExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/FieldNodeExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/HasDirectivesExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/HasDirectivesExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/HasDirectivesExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/HasDirectivesExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/InputFieldExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/InputValueDefinitionExtensions.cs
similarity index 59%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/InputFieldExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/InputValueDefinitionExtensions.cs
index 9f094e871c7..ad29a65953e 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/InputFieldExtensions.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/InputValueDefinitionExtensions.cs
@@ -3,12 +3,17 @@
namespace HotChocolate.ModelContextProtocol.Extensions;
-internal static class InputFieldExtensions
+internal static class InputValueDefinitionExtensions
{
- public static JsonSchema ToJsonSchema(this InputField inputField)
+ public static JsonSchema ToJsonSchema(this IInputValueDefinition inputField)
{
var type = inputField.Type;
- var schemaBuilder = type.ToJsonSchemaBuilder(isOneOf: inputField.DeclaringType.IsOneOf);
+ var schemaBuilder =
+ type.ToJsonSchemaBuilder(
+ isOneOf: inputField.DeclaringMember is IInputObjectTypeDefinition
+ {
+ IsOneOf: true
+ });
// Description.
if (inputField.Description is not null)
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/JsonSchemaExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/JsonSchemaExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/JsonSchemaExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/JsonSchemaExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/OperationDefinitionNodeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/OperationDefinitionNodeExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/OperationDefinitionNodeExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/OperationDefinitionNodeExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/OutputFieldDefinitionExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/OutputFieldDefinitionExtensions.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/OutputFieldDefinitionExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/OutputFieldDefinitionExtensions.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeExtensions.cs
new file mode 100644
index 00000000000..a7b85511dd9
--- /dev/null
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeExtensions.cs
@@ -0,0 +1,214 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json.Nodes;
+using HotChocolate.Types;
+using Json.Schema;
+using static HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources;
+
+namespace HotChocolate.ModelContextProtocol.Extensions;
+
+internal static class TypeExtensions
+{
+ public static JsonSchemaBuilder ToJsonSchemaBuilder(this IType type, bool isOneOf = false)
+ {
+ var schemaBuilder = new JsonSchemaBuilder();
+
+ // Type.
+ var jsonType = type.GetJsonSchemaValueType();
+
+ if (!type.IsNonNullType() && !isOneOf)
+ {
+ // Nullability.
+ jsonType |= SchemaValueType.Null;
+ }
+
+ schemaBuilder.Type(jsonType);
+
+ // Format.
+ if (type.TryGetJsonSchemaFormat(out var format))
+ {
+ schemaBuilder.Format(format);
+ }
+
+ // Pattern.
+ if (type.TryGetJsonSchemaPattern(out var pattern))
+ {
+ schemaBuilder.Pattern(pattern);
+ }
+
+ switch (type.NullableType())
+ {
+ case IEnumTypeDefinition enumType:
+ // Enum values.
+ List enumValues = [];
+
+ foreach (var enumValue in enumType.Values)
+ {
+ enumValues.Add(JsonValue.Create(enumValue.Name));
+ }
+
+ if (type.IsNullableType())
+ {
+ enumValues.Add(null);
+ }
+
+ schemaBuilder.Enum(enumValues);
+ break;
+
+ case IInputObjectTypeDefinition inputObjectType:
+ // Object properties.
+ var objectProperties = new Dictionary();
+ var requiredObjectProperties = new List();
+
+ foreach (var field in inputObjectType.Fields)
+ {
+ var fieldSchema = field.ToJsonSchema();
+
+ objectProperties.Add(field.Name, fieldSchema);
+
+ if (field.Type.IsNonNullType() && field.DefaultValue is null)
+ {
+ requiredObjectProperties.Add(field.Name);
+ }
+ }
+
+ // OneOf.
+ if (inputObjectType.IsOneOf)
+ {
+ List oneOfSchemas = [];
+
+ foreach (var (propertyName, propertySchema) in objectProperties)
+ {
+ var oneOfSchema = new JsonSchemaBuilder();
+
+ oneOfSchema
+ .Type(SchemaValueType.Object)
+ .Properties((propertyName, propertySchema))
+ .Required(propertyName);
+
+ oneOfSchemas.Add(oneOfSchema.Build());
+ }
+
+ schemaBuilder.OneOf(oneOfSchemas);
+ }
+ else
+ {
+ schemaBuilder.Properties(objectProperties);
+ schemaBuilder.Required(requiredObjectProperties);
+ }
+
+ break;
+
+ case ListType listType:
+ // Array items.
+ schemaBuilder.Items(listType.ElementType().ToJsonSchemaBuilder());
+ break;
+ }
+
+ return schemaBuilder;
+ }
+
+ private static SchemaValueType GetJsonSchemaValueType(this IType type)
+ {
+ return type switch
+ {
+ IEnumTypeDefinition => SchemaValueType.String,
+ IInputObjectTypeDefinition or IInterfaceTypeDefinition or IObjectTypeDefinition or IUnionTypeDefinition
+ => SchemaValueType.Object,
+ IScalarTypeDefinition s => GetJsonSchemaValueType(s.GetScalarSerializationType()),
+ ListType => SchemaValueType.Array,
+ NonNullType => GetJsonSchemaValueType(type.NullableType()),
+ _ =>
+ throw new NotSupportedException(
+ string.Format(
+ TypeExtensions_UnableToDetermineJsonSchemaValueType,
+ type.GetType().Name))
+ };
+ }
+
+ private static SchemaValueType GetJsonSchemaValueType(
+ ScalarSerializationType scalarSerializationType)
+ {
+ SchemaValueType result = 0;
+
+ if ((scalarSerializationType & ScalarSerializationType.String) != 0)
+ {
+ result |= SchemaValueType.String;
+ }
+
+ if ((scalarSerializationType & ScalarSerializationType.Boolean) != 0)
+ {
+ result |= SchemaValueType.Boolean;
+ }
+
+ if ((scalarSerializationType & ScalarSerializationType.Int) != 0)
+ {
+ result |= SchemaValueType.Integer;
+ }
+
+ if ((scalarSerializationType & ScalarSerializationType.Float) != 0)
+ {
+ result |= SchemaValueType.Number;
+ }
+
+ if ((scalarSerializationType & ScalarSerializationType.Object) != 0)
+ {
+ result |= SchemaValueType.Object;
+ }
+
+ if ((scalarSerializationType & ScalarSerializationType.List) != 0)
+ {
+ result |= SchemaValueType.Array;
+ }
+
+ // Default to string.
+ if (result == 0)
+ {
+ result = SchemaValueType.String;
+ }
+
+ return result;
+ }
+
+ private static bool TryGetJsonSchemaFormat(
+ this IType type,
+ [NotNullWhen(true)] out Format? format)
+ {
+ if (type.NullableType() is not IScalarTypeDefinition scalarType)
+ {
+ format = null;
+ return false;
+ }
+
+ format = scalarType.SpecifiedBy?.OriginalString switch
+ {
+ "https://scalars.graphql.org/andimarek/date-time.html" => Formats.DateTime,
+ "https://scalars.graphql.org/andimarek/local-date.html" => Formats.Date,
+ _ => null
+ };
+
+ return format is not null;
+ }
+
+ private static bool TryGetJsonSchemaPattern(
+ this IType type,
+ [NotNullWhen(true)] out string? pattern)
+ {
+ if (type.NullableType() is not IScalarTypeDefinition scalarType)
+ {
+ pattern = null;
+ return false;
+ }
+
+ pattern = scalarType.SpecifiedBy?.OriginalString switch
+ {
+ "https://scalars.graphql.org/andimarek/date-time.html"
+ => @"^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}(?:\.\d{1,7})?(?:[Zz]|[+-]\d{2}:\d{2})$",
+ "https://scalars.graphql.org/andimarek/local-date.html"
+ => @"^\d{4}-\d{2}-\d{2}$",
+ _ => null
+ };
+
+ pattern ??= scalarType.Pattern;
+ return pattern is not null;
+ }
+}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeNodeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeNodeExtensions.cs
new file mode 100644
index 00000000000..3d7755c2b58
--- /dev/null
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/TypeNodeExtensions.cs
@@ -0,0 +1,21 @@
+using HotChocolate.Language;
+using HotChocolate.Types;
+using static HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources;
+
+namespace HotChocolate.ModelContextProtocol.Extensions;
+
+internal static class TypeNodeExtensions
+{
+ public static IType ToType(this ITypeNode typeNode, ISchemaDefinition schema)
+ {
+ var typeName = typeNode.NamedType().Name.Value;
+
+ if (schema.Types.TryGetType(typeName, out var typeDefinition))
+ {
+ return typeNode.RewriteToType(typeDefinition);
+ }
+
+ throw new NotSupportedException(
+ string.Format(TypeNodeExtensions_UnableToFindGraphQLTypeInSchema, typeName));
+ }
+}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/ValueNodeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/ValueNodeExtensions.cs
similarity index 60%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/ValueNodeExtensions.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/ValueNodeExtensions.cs
index 85630fd01f8..434df3dab74 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/ValueNodeExtensions.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Extensions/ValueNodeExtensions.cs
@@ -15,24 +15,19 @@ internal static class ValueNodeExtensions
{
BooleanValueNode booleanValueNode => JsonValue.Create(booleanValueNode.Value),
EnumValueNode enumValueNode => JsonValue.Create(enumValueNode.Value),
- FloatValueNode floatValueNode => nullableType switch
- {
- DecimalType => JsonValue.Create(floatValueNode.ToDecimal()),
- FloatType => JsonValue.Create(floatValueNode.ToDouble()),
- // TODO: Treating all unknown scalar types as strings is a temporary solution.
- _ => JsonValue.Create(floatValueNode.Value)
- },
- IntValueNode intValueNode => nullableType switch
- {
- ByteType => JsonValue.Create(intValueNode.ToByte()),
- DecimalType => JsonValue.Create(intValueNode.ToDecimal()),
- FloatType => JsonValue.Create(intValueNode.ToDouble()),
- IntType => JsonValue.Create(intValueNode.ToInt32()),
- LongType => JsonValue.Create(intValueNode.ToInt64()),
- ShortType => JsonValue.Create(intValueNode.ToInt16()),
- // TODO: Treating all unknown scalar types as strings is a temporary solution.
- _ => JsonValue.Create(intValueNode.Value)
- },
+ FloatValueNode floatValueNode when nullableType is IScalarTypeDefinition scalarType
+ => scalarType.GetScalarSerializationType() switch
+ {
+ ScalarSerializationType.Float => JsonValue.Create(floatValueNode.ToDecimal()),
+ _ => JsonValue.Create(floatValueNode.Value)
+ },
+ IntValueNode intValueNode when nullableType is IScalarTypeDefinition scalarType
+ => scalarType.GetScalarSerializationType() switch
+ {
+ ScalarSerializationType.Float => JsonValue.Create(intValueNode.ToDecimal()),
+ ScalarSerializationType.Int => JsonValue.Create(intValueNode.ToInt64()),
+ _ => JsonValue.Create(intValueNode.Value)
+ },
ListValueNode listValueNode => listValueNode.ToJsonNode(nullableType),
NullValueNode => null,
ObjectValueNode objectValueNode => objectValueNode.ToJsonNode(nullableType),
@@ -63,9 +58,10 @@ private static JsonObject ToJsonNode(this ObjectValueNode valueNode, IType objec
foreach (var field in valueNode.Fields)
{
- var graphQLFieldType = objectType is InputObjectType inputObjectType
+ var graphQLFieldType = objectType is IInputObjectTypeDefinition inputObjectType
? inputObjectType.Fields[field.Name.Value].Type
- : new AnyType(); // Types like JsonType or AnyType have no schema.
+ // Placeholder for fields of scalar types like JsonType or AnyType.
+ : new MissingType("");
jsonObject.Add(field.Name.Value, field.Value.ToJsonNode(graphQLFieldType));
}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Handlers/CallToolHandler.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Handlers/CallToolHandler.cs
similarity index 82%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Handlers/CallToolHandler.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Handlers/CallToolHandler.cs
index 15a5355d951..32b023df90b 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Handlers/CallToolHandler.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Handlers/CallToolHandler.cs
@@ -1,9 +1,11 @@
using System.Security.Claims;
+using System.Text;
using System.Text.Json;
using System.Text.Json.Nodes;
using HotChocolate.Buffers;
using HotChocolate.Execution;
using HotChocolate.Language;
+using HotChocolate.Transport.Formatters;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using ModelContextProtocol.Protocol;
@@ -18,7 +20,8 @@ public static async ValueTask HandleAsync(
RequestContext context,
CancellationToken cancellationToken)
{
- var registry = context.Services!.GetRequiredService();
+ var services = context.Services!;
+ var registry = services.GetRequiredService();
if (!registry.TryGetTool(context.Params!.Name, out var tool))
{
@@ -35,7 +38,7 @@ public static async ValueTask HandleAsync(
};
}
- var requestExecutor = context.Services!.GetRequiredService();
+ var requestExecutor = services.GetRequiredService();
var arguments = context.Params?.Arguments ?? Enumerable.Empty>();
Dictionary variableValues = [];
@@ -47,8 +50,8 @@ public static async ValueTask HandleAsync(
variableValues.Add(name, jsonValueParser.Parse(value));
}
- var httpContext =
- context.Services!.GetRootServiceProvider().GetRequiredService().HttpContext!;
+ var rootServiceProvider = services.GetRequiredService().ServiceProvider;
+ var httpContext = rootServiceProvider.GetRequiredService().HttpContext!;
var requestBuilder = CreateRequestBuilder(httpContext);
var request =
requestBuilder
@@ -57,7 +60,11 @@ public static async ValueTask HandleAsync(
.Build();
var result = await requestExecutor.ExecuteAsync(request, cancellationToken).ConfigureAwait(false);
var operationResult = result.ExpectOperationResult();
- var jsonOperationResult = operationResult.ToJson();
+
+ using var writer = new PooledArrayWriter();
+
+ JsonResultFormatter.Indented.Format(operationResult, writer);
+ var jsonOperationResult = Encoding.UTF8.GetString(writer.WrittenSpan);
return new CallToolResult
{
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Handlers/ListToolsHandler.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Handlers/ListToolsHandler.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Handlers/ListToolsHandler.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Handlers/ListToolsHandler.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/HotChocolate.ModelContextProtocol.Core.csproj b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/HotChocolate.ModelContextProtocol.Core.csproj
new file mode 100644
index 00000000000..79a5ca3feb6
--- /dev/null
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/HotChocolate.ModelContextProtocol.Core.csproj
@@ -0,0 +1,44 @@
+
+
+
+ HotChocolate.ModelContextProtocol.Core
+ HotChocolate.ModelContextProtocol
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ ModelContextProtocolResources.Designer.cs
+
+
+
+
+
+ True
+ True
+ ModelContextProtocolResources.resx
+
+
+
+
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/JsonSchemaJsonSerializerContext.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/JsonSchemaJsonSerializerContext.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/JsonSchemaJsonSerializerContext.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/JsonSchemaJsonSerializerContext.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/OperationTool.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/OperationTool.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/OperationTool.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/OperationTool.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/OperationToolFactory.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/OperationToolFactory.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/OperationToolFactory.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/OperationToolFactory.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.Designer.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.Designer.cs
new file mode 100644
index 00000000000..216429261f2
--- /dev/null
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.Designer.cs
@@ -0,0 +1,116 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace HotChocolate.ModelContextProtocol.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class ModelContextProtocolResources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal ModelContextProtocolResources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources", typeof(ModelContextProtocolResources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The tool '{0}' was not found..
+ ///
+ internal static string CallToolHandler_ToolNotFound {
+ get {
+ return ResourceManager.GetString("CallToolHandler_ToolNotFound", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to The argument `{0}` is not supported on @mcpTool..
+ ///
+ internal static string McpToolDirectiveParser_ArgumentNotSupportedOnMcpToolDirective {
+ get {
+ return ResourceManager.GetString("McpToolDirectiveParser_ArgumentNotSupportedOnMcpToolDirective", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to An operation tool document must have exactly one operation definition..
+ ///
+ internal static string OperationToolDefinition_DocumentMustContainSingleOperation {
+ get {
+ return ResourceManager.GetString("OperationToolDefinition_DocumentMustContainSingleOperation", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unable to determine the JSON schema value type for the GraphQL type '{0}'..
+ ///
+ internal static string TypeExtensions_UnableToDetermineJsonSchemaValueType {
+ get {
+ return ResourceManager.GetString("TypeExtensions_UnableToDetermineJsonSchemaValueType", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unable to find GraphQL type '{0}' in the schema..
+ ///
+ internal static string TypeNodeExtensions_UnableToFindGraphQLTypeInSchema {
+ get {
+ return ResourceManager.GetString("TypeNodeExtensions_UnableToFindGraphQLTypeInSchema", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unable to convert value node of type '{0}' to JSON node..
+ ///
+ internal static string ValueNodeExtensions_UnableToConvertValueNodeToJsonNode {
+ get {
+ return ResourceManager.GetString("ValueNodeExtensions_UnableToConvertValueNodeToJsonNode", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.resx b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.resx
similarity index 66%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.resx
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.resx
index 709195d677e..728563a7cce 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.resx
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Properties/ModelContextProtocolResources.resx
@@ -21,28 +21,19 @@
The tool '{0}' was not found.
-
- A tool document must contain a single operation definition.
-
-
- A tool document operation with the same name already exists.
-
-
- A tool document operation must be named.
-
The argument `{0}` is not supported on @mcpTool.
+
+ An operation tool document must have exactly one operation definition.
+
Unable to determine the JSON schema value type for the GraphQL type '{0}'.
-
- Unable to find GraphQL type '{0}' in the schema or type map.
+
+ Unable to find GraphQL type '{0}' in the schema.
Unable to convert value node of type '{0}' to JSON node.
-
- An operation tool document must have exactly one operation definition.
-
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/McpExecutorSession.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/McpExecutorSession.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/McpExecutorSession.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/McpExecutorSession.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/McpRequestExecutorProxy.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/McpRequestExecutorProxy.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/McpRequestExecutorProxy.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/McpRequestExecutorProxy.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/SseHandlerProxy.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/SseHandlerProxy.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/SseHandlerProxy.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/SseHandlerProxy.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/StreamableHttpHandlerProxy.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/StreamableHttpHandlerProxy.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Proxies/StreamableHttpHandlerProxy.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Proxies/StreamableHttpHandlerProxy.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/IOperationToolStorage.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/IOperationToolStorage.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/IOperationToolStorage.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/IOperationToolStorage.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolDefinition.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolDefinition.cs
similarity index 96%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolDefinition.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolDefinition.cs
index 91351725f9c..792a9e6b405 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolDefinition.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolDefinition.cs
@@ -53,7 +53,7 @@ public OperationToolDefinition(
if (operation is not null)
{
throw new ArgumentException(
- Document_Must_Have_Single_Op,
+ OperationToolDefinition_DocumentMustContainSingleOperation,
nameof(document));
}
@@ -63,7 +63,7 @@ public OperationToolDefinition(
if (operation is null)
{
throw new ArgumentException(
- Document_Must_Have_Single_Op,
+ OperationToolDefinition_DocumentMustContainSingleOperation,
nameof(document));
}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolStorageEventArgs.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolStorageEventArgs.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolStorageEventArgs.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolStorageEventArgs.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolStorageEventType.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolStorageEventType.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Storage/OperationToolStorageEventType.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/Storage/OperationToolStorageEventType.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/ToolRegistry.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/ToolRegistry.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/ToolRegistry.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/ToolRegistry.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/ToolStorageObserver.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/ToolStorageObserver.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/ToolStorageObserver.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/ToolStorageObserver.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownArgumentNames.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownArgumentNames.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownArgumentNames.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownArgumentNames.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownDirectiveNames.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownDirectiveNames.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownDirectiveNames.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownDirectiveNames.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownFieldNames.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownFieldNames.cs
similarity index 100%
rename from src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/WellKnownFieldNames.cs
rename to src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol.Core/WellKnownFieldNames.cs
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsAttribute.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsAttribute.cs
index 3addfcfd54b..38ffb1e89cc 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsAttribute.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsAttribute.cs
@@ -1,9 +1,8 @@
using System.Reflection;
-using HotChocolate.ModelContextProtocol.Directives;
using HotChocolate.Types;
using HotChocolate.Types.Descriptors;
-namespace HotChocolate.ModelContextProtocol.Attributes;
+namespace HotChocolate.ModelContextProtocol.Directives;
///
/// Additional properties describing a Tool to clients.
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirectiveType.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirectiveType.cs
index a2b0de2a1e3..3e5727f41f1 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirectiveType.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Directives/McpToolAnnotationsDirectiveType.cs
@@ -1,7 +1,6 @@
-using HotChocolate.ModelContextProtocol.Directives;
using HotChocolate.Types;
-namespace HotChocolate.ModelContextProtocol.Types;
+namespace HotChocolate.ModelContextProtocol.Directives;
///
/// Additional properties describing a Tool to clients.
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/RequestExecutorBuilderExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/RequestExecutorBuilderExtensions.cs
index 8cd39ece4cc..b990f118298 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/RequestExecutorBuilderExtensions.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/RequestExecutorBuilderExtensions.cs
@@ -2,10 +2,10 @@
using HotChocolate.Execution;
using HotChocolate.Execution.Configuration;
using HotChocolate.ModelContextProtocol.Diagnostics;
+using HotChocolate.ModelContextProtocol.Directives;
using HotChocolate.ModelContextProtocol.Handlers;
using HotChocolate.ModelContextProtocol.Proxies;
using HotChocolate.ModelContextProtocol.Storage;
-using HotChocolate.ModelContextProtocol.Types;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/SchemaBuilderExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/SchemaBuilderExtensions.cs
index 302d98054a5..54b83f8825f 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/SchemaBuilderExtensions.cs
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/SchemaBuilderExtensions.cs
@@ -1,13 +1,13 @@
-using HotChocolate.ModelContextProtocol.Types;
-
-namespace HotChocolate.ModelContextProtocol.Extensions;
-
-public static class SchemaBuilderExtensions
-{
- public static ISchemaBuilder AddMcp(this ISchemaBuilder builder)
- {
- builder.AddDirectiveType();
-
- return builder;
- }
-}
+using HotChocolate.ModelContextProtocol.Directives;
+
+namespace HotChocolate.ModelContextProtocol.Extensions;
+
+public static class SchemaBuilderExtensions
+{
+ public static ISchemaBuilder AddMcp(this ISchemaBuilder builder)
+ {
+ builder.AddDirectiveType();
+
+ return builder;
+ }
+}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeExtensions.cs
deleted file mode 100644
index e276a598488..00000000000
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeExtensions.cs
+++ /dev/null
@@ -1,282 +0,0 @@
-using System.Diagnostics.CodeAnalysis;
-using System.Text.Json.Nodes;
-using HotChocolate.Types;
-using Json.Schema;
-using static HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources;
-
-namespace HotChocolate.ModelContextProtocol.Extensions;
-
-internal static class TypeExtensions
-{
- public static JsonSchemaBuilder ToJsonSchemaBuilder(this IType type, bool isOneOf = false)
- {
- var schemaBuilder = new JsonSchemaBuilder();
-
- // Type.
- var jsonType = type.GetJsonSchemaValueType();
-
- if (!type.IsNonNullType() && !isOneOf)
- {
- // Nullability.
- jsonType |= SchemaValueType.Null;
- }
-
- schemaBuilder.Type(jsonType);
-
- // Format.
- if (type.TryGetJsonSchemaFormat(out var format))
- {
- schemaBuilder.Format(format);
- }
-
- // Pattern.
- if (type.TryGetJsonSchemaPattern(out var pattern))
- {
- schemaBuilder.Pattern(pattern);
- }
-
- // Minimum.
- if (type.TryGetJsonSchemaMinimum(out var minimum))
- {
- schemaBuilder.Minimum(minimum);
- }
-
- // Maximum.
- if (type.TryGetJsonSchemaMaximum(out var maximum))
- {
- schemaBuilder.Maximum(maximum);
- }
-
- switch (type.NullableType())
- {
- case EnumType enumType:
- // Enum values.
- List enumValues = [];
-
- foreach (var enumValue in enumType.Values)
- {
- enumValues.Add(JsonValue.Create(enumValue.Name));
- }
-
- if (type.IsNullableType())
- {
- enumValues.Add(null);
- }
-
- schemaBuilder.Enum(enumValues);
- break;
-
- case InputObjectType inputObjectType:
- // Object properties.
- var objectProperties = new Dictionary();
- var requiredObjectProperties = new List();
-
- foreach (var field in inputObjectType.Fields)
- {
- var fieldSchema = field.ToJsonSchema();
-
- objectProperties.Add(field.Name, fieldSchema);
-
- if (field.Type.IsNonNullType() && field.DefaultValue is null)
- {
- requiredObjectProperties.Add(field.Name);
- }
- }
-
- // OneOf.
- if (inputObjectType.IsOneOf)
- {
- List oneOfSchemas = [];
-
- foreach (var (propertyName, propertySchema) in objectProperties)
- {
- var oneOfSchema = new JsonSchemaBuilder();
-
- oneOfSchema
- .Type(SchemaValueType.Object)
- .Properties((propertyName, propertySchema))
- .Required(propertyName);
-
- oneOfSchemas.Add(oneOfSchema.Build());
- }
-
- schemaBuilder.OneOf(oneOfSchemas);
- }
- else
- {
- schemaBuilder.Properties(objectProperties);
- schemaBuilder.Required(requiredObjectProperties);
- }
-
- break;
-
- case ListType listType:
- // Array items.
- schemaBuilder.Items(listType.ElementType().ToJsonSchemaBuilder());
- break;
- }
-
- return schemaBuilder;
- }
-
- private static SchemaValueType GetJsonSchemaValueType(this IType type)
- {
- return type switch
- {
- EnumType => SchemaValueType.String,
- InputObjectType or InterfaceType or ObjectType or UnionType => SchemaValueType.Object,
- ListType => SchemaValueType.Array,
- NonNullType => GetJsonSchemaValueType(type.NullableType()),
- ScalarType => type switch
- {
- AnyType or JsonType =>
- SchemaValueType.Object
- | SchemaValueType.Array
- | SchemaValueType.Boolean
- | SchemaValueType.String
- | SchemaValueType.Number
- | SchemaValueType.Integer,
- BooleanType => SchemaValueType.Boolean,
- ByteType or IntType or LongType or ShortType => SchemaValueType.Integer,
- DecimalType or FloatType => SchemaValueType.Number,
- IdType or StringType => SchemaValueType.String,
- // The following types are serialized as strings:
- // URL, UUID, ByteArray, DateTime, Date, TimeSpan, LocalDate, LocalDateTime,
- // LocalTime.
- // TODO: Treating all unknown scalar types as strings is a temporary solution.
- _ => SchemaValueType.String
- },
- _ =>
- throw new NotSupportedException(
- string.Format(
- TypeExtensions_UnableToDetermineJsonSchemaValueType,
- type.GetType().Name))
- };
- }
-
- private static bool TryGetJsonSchemaFormat(
- this IType type,
- [NotNullWhen(true)] out Format? format)
- {
- format = type.NullableType() switch
- {
- DateTimeType => Formats.DateTime, // Further constrained by pattern.
- DateType => Formats.Date,
- LocalDateTimeType => Formats.DateTime, // Further constrained by pattern.
- LocalDateType => Formats.Date,
- LocalTimeType => Formats.Time, // Further constrained by pattern.
- UrlType => Formats.UriReference,
- UuidType => Formats.Uuid,
- _ => null
- };
-
- return format is not null;
- }
-
- private static bool TryGetJsonSchemaPattern(
- this IType type,
- [NotNullWhen(true)] out string? pattern)
- {
- pattern = type.NullableType() switch
- {
- ByteArrayType
- // e.g. dmFsdWU= (Base64-encoded string)
- => @"^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$",
- DateTimeType
- // e.g. 2011-08-30T13:22:53.108Z (https://scalars.graphql.org/andimarek/date-time.html)
- =>
- @"^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}:\d{2}"
- + @"(?:\.\d{1,7})?(?:[Zz]|[+-]\d{2}:\d{2})$",
- LocalDateTimeType
- // e.g. 2011-08-30T13:22:53
- => @"^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$",
- LocalTimeType
- // e.g. 13:22:53
- => @"^\d{2}:\d{2}:\d{2}$",
- TimeSpanType timeSpanType
- => timeSpanType.Format switch
- {
- // e.g. PT5M
- TimeSpanFormat.Iso8601
- =>
- @"^-?P(?:\d+W|(?=\d|T(?:\d|$))(?:\d+Y)?(?:\d+M)?(?:\d+D)?"
- + @"(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?)$",
- // e.g. 00:05:00
- TimeSpanFormat.DotNet
- =>
- @"^-?(?:(?:\d{1,8})\.)?(?:[0-1]?\d|2[0-3]):(?:[0-5]?\d):(?:[0-5]?\d)"
- + @"(?:\.(?:\d{1,7}))?$",
- _ => throw new InvalidOperationException()
- },
- _ => null
- };
-
- return pattern is not null;
- }
-
- private static bool TryGetJsonSchemaMinimum(this IType type, out decimal minimum)
- {
- switch (type.NullableType())
- {
- case ByteType byteType when byteType.MinValue != byte.MinValue:
- minimum = byteType.MinValue;
- return true;
-
- case DecimalType decimalType when decimalType.MinValue != decimal.MinValue:
- minimum = decimalType.MinValue;
- return true;
-
- case FloatType { MinValue: >= (double)decimal.MinValue } floatType:
- minimum = (decimal)floatType.MinValue;
- return true;
-
- case IntType intType when intType.MinValue != int.MinValue:
- minimum = intType.MinValue;
- return true;
-
- case LongType longType when longType.MinValue != long.MinValue:
- minimum = longType.MinValue;
- return true;
-
- case ShortType shortType when shortType.MinValue != short.MinValue:
- minimum = shortType.MinValue;
- return true;
- }
-
- minimum = 0;
- return false;
- }
-
- private static bool TryGetJsonSchemaMaximum(this IType type, out decimal maximum)
- {
- switch (type.NullableType())
- {
- case ByteType byteType when byteType.MaxValue != byte.MaxValue:
- maximum = byteType.MaxValue;
- return true;
-
- case DecimalType decimalType when decimalType.MaxValue != decimal.MaxValue:
- maximum = decimalType.MaxValue;
- return true;
-
- case FloatType { MaxValue: <= (double)decimal.MaxValue } floatType:
- maximum = (decimal)floatType.MaxValue;
- return true;
-
- case IntType intType when intType.MaxValue != int.MaxValue:
- maximum = intType.MaxValue;
- return true;
-
- case LongType longType when longType.MaxValue != long.MaxValue:
- maximum = longType.MaxValue;
- return true;
-
- case ShortType shortType when shortType.MaxValue != short.MaxValue:
- maximum = shortType.MaxValue;
- return true;
- }
-
- maximum = 0;
- return false;
- }
-}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeNodeExtensions.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeNodeExtensions.cs
deleted file mode 100644
index c3764014f9b..00000000000
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Extensions/TypeNodeExtensions.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System.Collections.Frozen;
-using HotChocolate.Language;
-using HotChocolate.Types;
-using static HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources;
-
-namespace HotChocolate.ModelContextProtocol.Extensions;
-
-internal static class TypeNodeExtensions
-{
- public static IType ToType(this ITypeNode typeNode, ISchemaDefinition schema)
- {
- var typeName = typeNode.NamedType().Name.Value;
-
- if (schema.Types.TryGetType(typeName, out var typeDefinition))
- {
- return typeNode.RewriteToType(typeDefinition);
- }
-
- if (s_typeMap.TryGetValue(typeName, out var type))
- {
- return typeNode.RewriteToType(type.AsTypeDefinition());
- }
-
- throw new NotSupportedException(
- string.Format(TypeNodeExtensions_UnableToFindGraphQLTypeInSchemaOrTypeMap, typeName));
- }
-
- private static readonly FrozenDictionary s_typeMap =
- new Dictionary
- {
- { ScalarNames.Any, new AnyType() },
- { ScalarNames.Boolean, new BooleanType() },
- { ScalarNames.Byte, new ByteType() },
- { ScalarNames.ByteArray, new ByteArrayType() },
- { ScalarNames.Date, new DateType() },
- { ScalarNames.DateTime, new DateTimeType() },
- { ScalarNames.Decimal, new DecimalType() },
- { ScalarNames.Float, new FloatType() },
- { ScalarNames.ID, new IdType() },
- { ScalarNames.Int, new IntType() },
- { ScalarNames.JSON, new JsonType() },
- { ScalarNames.LocalDate, new LocalDateType() },
- { ScalarNames.LocalDateTime, new LocalDateTimeType() },
- { ScalarNames.LocalTime, new LocalTimeType() },
- { ScalarNames.Long, new LongType() },
- { ScalarNames.Short, new ShortType() },
- { ScalarNames.String, new StringType() },
- { ScalarNames.TimeSpan, new TimeSpanType() },
- { ScalarNames.URL, new UrlType() },
- { ScalarNames.UUID, new UuidType() }
- }.ToFrozenDictionary();
-}
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/HotChocolate.ModelContextProtocol.csproj b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/HotChocolate.ModelContextProtocol.csproj
index 8b63f3b3f66..58c44a3b041 100644
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/HotChocolate.ModelContextProtocol.csproj
+++ b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/HotChocolate.ModelContextProtocol.csproj
@@ -5,35 +5,10 @@
HotChocolate.ModelContextProtocol
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ResXFileCodeGenerator
- ModelContextProtocolResources.Designer.cs
-
-
-
-
-
- True
- True
- ModelContextProtocolResources.resx
-
+
+
diff --git a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.Designer.cs b/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.Designer.cs
deleted file mode 100644
index ce6bab0f7f6..00000000000
--- a/src/HotChocolate/ModelContextProtocol/src/HotChocolate.ModelContextProtocol/Properties/ModelContextProtocolResources.Designer.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-//------------------------------------------------------------------------------
-//
-// This code was generated by a tool.
-//
-// Changes to this file may cause incorrect behavior and will be lost if
-// the code is regenerated.
-//
-//------------------------------------------------------------------------------
-
-namespace HotChocolate.ModelContextProtocol.Properties {
- using System;
-
-
- [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
- [System.Diagnostics.DebuggerNonUserCodeAttribute()]
- [System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class ModelContextProtocolResources {
-
- private static System.Resources.ResourceManager resourceMan;
-
- private static System.Globalization.CultureInfo resourceCulture;
-
- [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
- internal ModelContextProtocolResources() {
- }
-
- [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static System.Resources.ResourceManager ResourceManager {
- get {
- if (object.Equals(null, resourceMan)) {
- System.Resources.ResourceManager temp = new System.Resources.ResourceManager("HotChocolate.ModelContextProtocol.Properties.ModelContextProtocolResources", typeof(ModelContextProtocolResources).Assembly);
- resourceMan = temp;
- }
- return resourceMan;
- }
- }
-
- [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
- internal static System.Globalization.CultureInfo Culture {
- get {
- return resourceCulture;
- }
- set {
- resourceCulture = value;
- }
- }
-
- internal static string CallToolHandler_ToolNotFound {
- get {
- return ResourceManager.GetString("CallToolHandler_ToolNotFound", resourceCulture);
- }
- }
-
- internal static string InMemoryMcpOperationDocumentStorage_ToolDocumentMustContainSingleOperation {
- get {
- return ResourceManager.GetString("InMemoryMcpOperationDocumentStorage_ToolDocumentMustContainSingleOperation", resourceCulture);
- }
- }
-
- internal static string InMemoryMcpOperationDocumentStorage_ToolDocumentOperationAlreadyExists {
- get {
- return ResourceManager.GetString("InMemoryMcpOperationDocumentStorage_ToolDocumentOperationAlreadyExists", resourceCulture);
- }
- }
-
- internal static string InMemoryMcpOperationDocumentStorage_ToolDocumentOperationMustBeNamed {
- get {
- return ResourceManager.GetString("InMemoryMcpOperationDocumentStorage_ToolDocumentOperationMustBeNamed", resourceCulture);
- }
- }
-
- internal static string McpToolDirectiveParser_ArgumentNotSupportedOnMcpToolDirective {
- get {
- return ResourceManager.GetString("McpToolDirectiveParser_ArgumentNotSupportedOnMcpToolDirective", resourceCulture);
- }
- }
-
- internal static string TypeExtensions_UnableToDetermineJsonSchemaValueType {
- get {
- return ResourceManager.GetString("TypeExtensions_UnableToDetermineJsonSchemaValueType", resourceCulture);
- }
- }
-
- internal static string TypeNodeExtensions_UnableToFindGraphQLTypeInSchemaOrTypeMap {
- get {
- return ResourceManager.GetString("TypeNodeExtensions_UnableToFindGraphQLTypeInSchemaOrTypeMap", resourceCulture);
- }
- }
-
- internal static string ValueNodeExtensions_UnableToConvertValueNodeToJsonNode {
- get {
- return ResourceManager.GetString("ValueNodeExtensions_UnableToConvertValueNodeToJsonNode", resourceCulture);
- }
- }
-
- internal static string Document_Must_Have_Single_Op {
- get {
- return ResourceManager.GetString("OperationToolDefinition_OperationToolDefinition_An_operation_tool_document_must_h" +
- "ave_exactly_one_operation_definition_", resourceCulture);
- }
- }
- }
-}
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/OperationToolFactoryTests.cs b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/OperationToolFactoryTests.cs
index 3052a30184a..f2f42ba707a 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/OperationToolFactoryTests.cs
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/OperationToolFactoryTests.cs
@@ -269,30 +269,6 @@ public void CreateTool_WithComplexVariables_CreatesCorrectSchema()
mcpTool.OutputSchema.MatchSnapshot(postFix: "Output", extension: ".json");
}
- [Fact]
- public void CreateTool_WithVariableMinMaxValues_CreatesCorrectInputSchema()
- {
- // arrange
- var schema =
- CreateSchema(
- s => s
- .AddType(new ByteType(min: 1, max: 10))
- .AddType(new DecimalType(min: 1, max: 10))
- .AddType(new FloatType(min: 1.0, max: 10.0))
- .AddType(new IntType(min: 1, max: 10))
- .AddType(new LongType(min: 1, max: 10))
- .AddType(new ShortType(min: 1, max: 10)));
- var document = Utf8GraphQLParser.Parse(
- File.ReadAllText("__resources__/GetWithVariableMinMaxValues.graphql"));
- var toolDefinition = new OperationToolDefinition("get_with_variable_min_max_values", document);
-
- // act
- var tool = new OperationToolFactory(schema).CreateTool(toolDefinition);
-
- // assert
- tool.Tool.InputSchema.MatchSnapshot(extension: ".json");
- }
-
[Fact]
public void CreateTool_WithInterfaceType_CreatesCorrectOutputSchema()
{
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/TestSchema.cs b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/TestSchema.cs
index a069aaa31bd..0a2af744fd1 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/TestSchema.cs
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/TestSchema.cs
@@ -4,7 +4,7 @@
using System.Text.Json;
using HotChocolate.Authorization;
using HotChocolate.Language;
-using HotChocolate.ModelContextProtocol.Attributes;
+using HotChocolate.ModelContextProtocol.Directives;
using HotChocolate.Types;
namespace HotChocolate.ModelContextProtocol;
@@ -446,12 +446,6 @@ public sealed class ExplicitOpenWorld
public int ExplicitOpenWorldField() => 1;
}
- public sealed class ImplicitClosedWorld
- {
- // Defaults to closed-world, because the parent (query) field is closed-world.
- public int ImplicitClosedWorldField() => 1;
- }
-
public sealed class ExplicitClosedWorld
{
[McpToolAnnotations(OpenWorldHint = false)]
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__resources__/GetWithVariableMinMaxValues.graphql b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__resources__/GetWithVariableMinMaxValues.graphql
deleted file mode 100644
index 0f4e70d84be..00000000000
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__resources__/GetWithVariableMinMaxValues.graphql
+++ /dev/null
@@ -1,11 +0,0 @@
-"GetWithVariableMinMaxValues description"
-query GetWithVariableMinMaxValues(
- $byte: Byte!
- $decimal: Decimal!
- $float: Float!
- $int: Int!
- $long: Long!
- $short: Short!
-) {
- withVariableMinMaxValues
-}
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Input.json
index 8a878a65984..4b48515b46c 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Input.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Input.json
@@ -19,7 +19,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description",
"default": "12:00:00"
@@ -77,7 +76,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description",
"default": "12:00:00"
@@ -159,7 +157,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description",
"default": "12:00:00"
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Output.json
index fd00ba452bc..c9687abd170 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Output.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithComplexVariables_CreatesCorrectSchema_Output.json
@@ -28,7 +28,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -70,7 +69,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -132,7 +130,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json
index 0f205d77d9b..cc1f0c30175 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Input.json
@@ -33,7 +33,7 @@
},
"date": {
"type": "string",
- "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date description",
"default": "2000-01-01"
},
@@ -64,7 +64,10 @@
"default": 1.5
},
"id": {
- "type": "string",
+ "type": [
+ "string",
+ "integer"
+ ],
"description": "ID description",
"default": "default"
},
@@ -100,19 +103,18 @@
"localDate": {
"type": "string",
"format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "LocalDate description",
"default": "2000-01-01"
},
"localDateTime": {
"type": "string",
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalDateTime description",
"default": "2000-01-01T12:00:00"
},
"localTime": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalTime description",
"default": "12:00:00"
@@ -133,7 +135,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description",
"default": "12:00:00"
@@ -188,13 +189,11 @@
},
"url": {
"type": "string",
- "format": "uri-reference",
"description": "URL description",
"default": "https://example.com"
},
"uuid": {
"type": "string",
- "format": "uuid",
"description": "UUID description",
"default": "00000000-0000-0000-0000-000000000000"
}
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json
index 4e160088c8f..11f5348f44b 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithDefaultedVariables_CreatesCorrectSchema_Output.json
@@ -32,7 +32,7 @@
},
"date": {
"type": "string",
- "format": "date"
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"dateTime": {
"type": "string",
@@ -53,7 +53,10 @@
"type": "number"
},
"id": {
- "type": "string"
+ "type": [
+ "string",
+ "integer"
+ ]
},
"int": {
"type": "integer"
@@ -76,16 +79,15 @@
},
"localDate": {
"type": "string",
- "format": "date"
+ "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"localDateTime": {
"type": "string",
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"
},
"localTime": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$"
},
"long": {
@@ -102,7 +104,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -140,12 +141,10 @@
"type": "string"
},
"url": {
- "type": "string",
- "format": "uri-reference"
+ "type": "string"
},
"uuid": {
- "type": "string",
- "format": "uuid"
+ "type": "string"
}
},
"required": [
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json
index a604c727ecd..a979efc1fb0 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Input.json
@@ -27,7 +27,7 @@
},
"date": {
"type": "string",
- "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date description"
},
"dateTime": {
@@ -53,7 +53,10 @@
"description": "Float description"
},
"id": {
- "type": "string",
+ "type": [
+ "string",
+ "integer"
+ ],
"description": "ID description"
},
"int": {
@@ -81,17 +84,16 @@
"localDate": {
"type": "string",
"format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "LocalDate description"
},
"localDateTime": {
"type": "string",
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalDateTime description"
},
"localTime": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalTime description"
},
@@ -110,7 +112,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -151,12 +152,10 @@
},
"url": {
"type": "string",
- "format": "uri-reference",
"description": "URL description"
},
"uuid": {
"type": "string",
- "format": "uuid",
"description": "UUID description"
}
},
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json
index cd2aaab579e..beb5bef2317 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNonNullableVariables_CreatesCorrectSchema_Output.json
@@ -32,7 +32,7 @@
},
"date": {
"type": "string",
- "format": "date"
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"dateTime": {
"type": "string",
@@ -53,7 +53,10 @@
"type": "number"
},
"id": {
- "type": "string"
+ "type": [
+ "string",
+ "integer"
+ ]
},
"int": {
"type": "integer"
@@ -76,16 +79,15 @@
},
"localDate": {
"type": "string",
- "format": "date"
+ "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"localDateTime": {
"type": "string",
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"
},
"localTime": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$"
},
"long": {
@@ -102,7 +104,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -140,12 +141,10 @@
"type": "string"
},
"url": {
- "type": "string",
- "format": "uri-reference"
+ "type": "string"
},
"uuid": {
- "type": "string",
- "format": "uuid"
+ "type": "string"
}
},
"required": [
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json
index 403fe020c8f..2fd29c55ec9 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Input.json
@@ -40,7 +40,7 @@
"string",
"null"
],
- "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date description"
},
"dateTime": {
@@ -81,6 +81,7 @@
"id": {
"type": [
"string",
+ "integer",
"null"
],
"description": "ID description"
@@ -123,6 +124,7 @@
"null"
],
"format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "LocalDate description"
},
"localDateTime": {
@@ -130,7 +132,6 @@
"string",
"null"
],
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalDateTime description"
},
@@ -139,7 +140,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "LocalTime description"
},
@@ -173,7 +173,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -223,7 +222,6 @@
"string",
"null"
],
- "format": "uri-reference",
"description": "URL description"
},
"uuid": {
@@ -231,7 +229,6 @@
"string",
"null"
],
- "format": "uuid",
"description": "UUID description"
}
},
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json
index fe9067d8276..5e477ec3822 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithNullableVariables_CreatesCorrectSchema_Output.json
@@ -45,7 +45,7 @@
"string",
"null"
],
- "format": "date"
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"dateTime": {
"type": [
@@ -81,6 +81,7 @@
"id": {
"type": [
"string",
+ "integer",
"null"
]
},
@@ -118,14 +119,14 @@
"string",
"null"
],
- "format": "date"
+ "format": "date",
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"localDateTime": {
"type": [
"string",
"null"
],
- "format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"
},
"localTime": {
@@ -133,7 +134,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$"
},
"long": {
@@ -165,7 +165,6 @@
"string",
"null"
],
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -218,15 +217,13 @@
"type": [
"string",
"null"
- ],
- "format": "uri-reference"
+ ]
},
"uuid": {
"type": [
"string",
"null"
- ],
- "format": "uuid"
+ ]
}
},
"required": [
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithSkipAndInclude_CreatesCorrectOutputSchema.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithSkipAndInclude_CreatesCorrectOutputSchema.json
index 0a394828780..5e7fa202e71 100644
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithSkipAndInclude_CreatesCorrectOutputSchema.json
+++ b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithSkipAndInclude_CreatesCorrectOutputSchema.json
@@ -45,7 +45,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -80,7 +79,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -115,7 +113,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
@@ -150,7 +147,6 @@
"properties": {
"field1C": {
"type": "string",
- "format": "time",
"pattern": "^\\d{2}:\\d{2}:\\d{2}$",
"description": "field1C description"
}
diff --git a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithVariableMinMaxValues_CreatesCorrectInputSchema.json b/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithVariableMinMaxValues_CreatesCorrectInputSchema.json
deleted file mode 100644
index e3992362eb2..00000000000
--- a/src/HotChocolate/ModelContextProtocol/test/HotChocolate.ModelContextProtocol.Tests/__snapshots__/OperationToolFactoryTests.CreateTool_WithVariableMinMaxValues_CreatesCorrectInputSchema.json
+++ /dev/null
@@ -1,43 +0,0 @@
-{
- "type": "object",
- "properties": {
- "byte": {
- "type": "integer",
- "minimum": 1,
- "maximum": 10
- },
- "decimal": {
- "type": "number",
- "minimum": 1,
- "maximum": 10
- },
- "float": {
- "type": "number",
- "minimum": 1,
- "maximum": 10
- },
- "int": {
- "type": "integer",
- "minimum": 1,
- "maximum": 10
- },
- "long": {
- "type": "integer",
- "minimum": 1,
- "maximum": 10
- },
- "short": {
- "type": "integer",
- "minimum": 1,
- "maximum": 10
- }
- },
- "required": [
- "byte",
- "decimal",
- "float",
- "int",
- "long",
- "short"
- ]
-}