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" - ] -}