forked from modelcontextprotocol/csharp-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgressNotificationParams.cs
More file actions
140 lines (121 loc) · 5.09 KB
/
ProgressNotificationParams.cs
File metadata and controls
140 lines (121 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using Microsoft.Extensions.Logging.Abstractions;
using System.ComponentModel;
using System.Text.Json;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
namespace ModelContextProtocol.Protocol;
/// <summary>
/// Represents an out-of-band notification used to inform the receiver of a progress update for a long-running request.
/// </summary>
/// <remarks>
/// See the <see href="https://github.com/modelcontextprotocol/specification/blob/main/schema/">schema</see> for more details.
/// </remarks>
[JsonConverter(typeof(Converter))]
public sealed class ProgressNotificationParams : NotificationParams
{
/// <summary>
/// Gets or sets the progress token which was given in the initial request, used to associate this notification with
/// the corresponding request.
/// </summary>
/// <remarks>
/// <para>
/// This token acts as a correlation identifier that links progress updates to their corresponding request.
/// </para>
/// <para>
/// When an endpoint initiates a request with a <see cref="ProgressToken"/> in its metadata,
/// the receiver can send progress notifications using this same token. This allows both sides to
/// correlate the notifications with the original request.
/// </para>
/// </remarks>
public required ProgressToken ProgressToken { get; init; }
/// <summary>
/// Gets or sets the progress thus far.
/// </summary>
/// <remarks>
/// This should increase for each notification issued as part of the same request, even if the total is unknown.
/// </remarks>
public required ProgressNotificationValue Progress { get; init; }
/// <summary>
/// Provides a <see cref="JsonConverter"/> for <see cref="ProgressNotificationParams"/>.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public sealed class Converter : JsonConverter<ProgressNotificationParams>
{
/// <inheritdoc />
public override ProgressNotificationParams? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
ProgressToken? progressToken = null;
float? progress = null;
float? total = null;
string? message = null;
JsonObject? meta = null;
while (reader.Read() && reader.TokenType != JsonTokenType.EndObject)
{
if (reader.TokenType == JsonTokenType.PropertyName)
{
var propertyName = reader.GetString();
reader.Read();
switch (propertyName)
{
case "progressToken":
progressToken = (ProgressToken)JsonSerializer.Deserialize(ref reader, options.GetTypeInfo(typeof(ProgressToken)))!;
break;
case "progress":
progress = reader.GetSingle();
break;
case "total":
total = reader.GetSingle();
break;
case "message":
message = reader.GetString();
break;
case "_meta":
meta = JsonSerializer.Deserialize(ref reader, McpJsonUtilities.JsonContext.Default.JsonObject);
break;
}
}
}
if (progress is null)
{
throw new JsonException("Missing required property 'progress'.");
}
if (progressToken is null)
{
throw new JsonException("Missing required property 'progressToken'.");
}
return new ProgressNotificationParams
{
ProgressToken = progressToken.GetValueOrDefault(),
Progress = new ProgressNotificationValue
{
Progress = progress.GetValueOrDefault(),
Total = total,
Message = message,
},
Meta = meta,
};
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, ProgressNotificationParams value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WritePropertyName("progressToken");
JsonSerializer.Serialize(writer, value.ProgressToken, options.GetTypeInfo(typeof(ProgressToken)));
writer.WriteNumber("progress", value.Progress.Progress);
if (value.Progress.Total is { } total)
{
writer.WriteNumber("total", total);
}
if (value.Progress.Message is { } message)
{
writer.WriteString("message", message);
}
if (value.Meta is { } meta)
{
writer.WritePropertyName("_meta");
JsonSerializer.Serialize(writer, meta, McpJsonUtilities.JsonContext.Default.JsonObject);
}
writer.WriteEndObject();
}
}
}