@@ -127,50 +127,19 @@ func GetNotifications(getClient GetClientFn, t translations.TranslationHelperFun
127
127
}
128
128
}
129
129
130
- //markNotificationRead creates a tool to marka notification as read.
131
- func MarkNotificationRead ( getclient GetClientFn ,t translations.TranslationHelperFunc ) (tool mcp.Tool ,handler server.ToolHandlerFunc ) {
132
- return mcp .NewTool ("mark_notification_read " ,
133
- mcp .WithDescription (t ("TOOL_MARK_NOTIFICATION_READ_DESCRIPTION " ,"Mark a notification as read" )),
134
- mcp .WithString ("threadID " ,
130
+ //ManageNotifications creates a tool tomanage notifications ( markas read, mark all as read, or mark as done) .
131
+ func ManageNotifications ( getClient GetClientFn ,t translations.TranslationHelperFunc ) (tool mcp.Tool ,handler server.ToolHandlerFunc ) {
132
+ return mcp .NewTool ("manage_notifications " ,
133
+ mcp .WithDescription (t ("TOOL_MANAGE_NOTIFICATIONS_DESCRIPTION " ,"Manage notifications (mark as read, mark all as read, or mark as done) " )),
134
+ mcp .WithString ("action " ,
135
135
mcp .Required (),
136
- mcp .Description ("The ID of the notification thread" ),
136
+ mcp .Description ("The action to perform: 'mark_read', 'mark_all_read', or 'mark_done'" ),
137
+ ),
138
+ mcp .WithString ("threadID" ,
139
+ mcp .Description ("The ID of the notification thread (required for 'mark_read' and 'mark_done')" ),
137
140
),
138
- ),
139
- func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
140
- client ,err := getclient (ctx )
141
- if err != nil {
142
- return nil ,fmt .Errorf ("failed to get GitHub client: %w" ,err )
143
- }
144
-
145
- threadID ,err := requiredParam [string ](request ,"threadID" )
146
- if err != nil {
147
- return mcp .NewToolResultError (err .Error ()),nil
148
- }
149
-
150
- resp ,err := client .Activity .MarkThreadRead (ctx ,threadID )
151
- if err != nil {
152
- return nil ,fmt .Errorf ("failed to mark notification as read: %w" ,err )
153
- }
154
- defer func () {_ = resp .Body .Close () }()
155
-
156
- if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
157
- body ,err := io .ReadAll (resp .Body )
158
- if err != nil {
159
- return nil ,fmt .Errorf ("failed to read response body: %w" ,err )
160
- }
161
- return mcp .NewToolResultError (fmt .Sprintf ("failed to mark notification as read: %s" ,string (body ))),nil
162
- }
163
-
164
- return mcp .NewToolResultText ("Notification marked as read" ),nil
165
- }
166
- }
167
-
168
- // MarkAllNotificationsRead creates a tool to mark all notifications as read.
169
- func MarkAllNotificationsRead (getClient GetClientFn ,t translations.TranslationHelperFunc ) (tool mcp.Tool ,handler server.ToolHandlerFunc ) {
170
- return mcp .NewTool ("mark_all_notifications_read" ,
171
- mcp .WithDescription (t ("TOOL_MARK_ALL_NOTIFICATIONS_READ_DESCRIPTION" ,"Mark all notifications as read" )),
172
141
mcp .WithString ("lastReadAt" ,
173
- mcp .Description ("Describes the last point that notifications were checked (optional). Default: Now" ),
142
+ mcp .Description ("Describes the last point that notifications were checked (optional, for 'mark_all_read' ). Default: Now" ),
174
143
),
175
144
),
176
145
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
@@ -179,122 +148,96 @@ func MarkAllNotificationsRead(getClient GetClientFn, t translations.TranslationH
179
148
return nil ,fmt .Errorf ("failed to get GitHub client: %w" ,err )
180
149
}
181
150
182
- lastReadAt ,err := OptionalStringParam (request ,"lastReadAt " )
151
+ action ,err := requiredParam [ string ] (request ,"action " )
183
152
if err != nil {
184
153
return mcp .NewToolResultError (err .Error ()),nil
185
154
}
186
155
187
- var markReadOptions github. Timestamp
188
- if lastReadAt != "" {
189
- lastReadTime ,err := time . Parse ( time . RFC3339 , lastReadAt )
156
+ switch action {
157
+ case "mark_read" :
158
+ threadID ,err := requiredParam [ string ]( request , "threadID" )
190
159
if err != nil {
191
- return mcp .NewToolResultError (fmt .Sprintf ("invalid lastReadAt time format, should be RFC3339/ISO8601: %v" ,err )),nil
192
- }
193
- markReadOptions = github.Timestamp {
194
- Time :lastReadTime ,
160
+ return mcp .NewToolResultError (err .Error ()),nil
195
161
}
196
- }
197
-
198
- resp ,err := client .Activity .MarkNotificationsRead (ctx ,markReadOptions )
199
- if err != nil {
200
- return nil ,fmt .Errorf ("failed to mark all notifications as read: %w" ,err )
201
- }
202
- defer func () {_ = resp .Body .Close () }()
203
162
204
- if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
205
- body ,err := io .ReadAll (resp .Body )
163
+ resp ,err := client .Activity .MarkThreadRead (ctx ,threadID )
206
164
if err != nil {
207
- return nil ,fmt .Errorf ("failed to read response body: %w" ,err )
165
+ return nil ,fmt .Errorf ("failed to mark notification as read: %w" ,err )
166
+ }
167
+ defer func () {_ = resp .Body .Close () }()
168
+
169
+ if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
170
+ body ,err := io .ReadAll (resp .Body )
171
+ if err != nil {
172
+ return nil ,fmt .Errorf ("failed to read response body: %w" ,err )
173
+ }
174
+ return mcp .NewToolResultError (fmt .Sprintf ("failed to mark notification as read: %s" ,string (body ))),nil
208
175
}
209
- return mcp .NewToolResultError (fmt .Sprintf ("failed to mark all notifications as read: %s" ,string (body ))),nil
210
- }
211
-
212
- return mcp .NewToolResultText ("All notifications marked as read" ),nil
213
- }
214
- }
215
-
216
- // GetNotificationThread creates a tool to get a specific notification thread.
217
- func GetNotificationThread (getClient GetClientFn ,t translations.TranslationHelperFunc ) (tool mcp.Tool ,handler server.ToolHandlerFunc ) {
218
- return mcp .NewTool ("get_notification_thread" ,
219
- mcp .WithDescription (t ("TOOL_GET_NOTIFICATION_THREAD_DESCRIPTION" ,"Get a specific notification thread" )),
220
- mcp .WithString ("threadID" ,
221
- mcp .Required (),
222
- mcp .Description ("The ID of the notification thread" ),
223
- ),
224
- ),
225
- func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
226
- client ,err := getClient (ctx )
227
- if err != nil {
228
- return nil ,fmt .Errorf ("failed to get GitHub client: %w" ,err )
229
- }
230
-
231
- threadID ,err := requiredParam [string ](request ,"threadID" )
232
- if err != nil {
233
- return mcp .NewToolResultError (err .Error ()),nil
234
- }
235
176
236
- thread ,resp ,err := client .Activity .GetThread (ctx ,threadID )
237
- if err != nil {
238
- return nil ,fmt .Errorf ("failed to get notification thread: %w" ,err )
239
- }
240
- defer func () {_ = resp .Body .Close () }()
177
+ return mcp .NewToolResultText ("Notification marked as read" ),nil
241
178
242
- if resp . StatusCode != http . StatusOK {
243
- body ,err := io . ReadAll ( resp . Body )
179
+ case "mark_done" :
180
+ threadIDStr ,err := requiredParam [ string ]( request , "threadID" )
244
181
if err != nil {
245
- return nil , fmt . Errorf ( "failed to read response body: %w" , err )
182
+ return mcp . NewToolResultError ( err . Error ()), nil
246
183
}
247
- return mcp .NewToolResultError (fmt .Sprintf ("failed to get notification thread: %s" ,string (body ))),nil
248
- }
249
-
250
- r ,err := json .Marshal (thread )
251
- if err != nil {
252
- return nil ,fmt .Errorf ("failed to marshal response: %w" ,err )
253
- }
254
184
255
- return mcp .NewToolResultText (string (r )),nil
256
- }
257
- }
185
+ threadID ,err := strconv .ParseInt (threadIDStr ,10 ,64 )
186
+ if err != nil {
187
+ return mcp .NewToolResultError ("Invalid threadID: must be a numeric value" ),nil
188
+ }
258
189
259
- // markNotificationDone creates a tool to mark a notification as done.
260
- func MarkNotificationDone (getclient GetClientFn ,t translations.TranslationHelperFunc ) (tool mcp.Tool ,handler server.ToolHandlerFunc ) {
261
- return mcp .NewTool ("mark_notification_done" ,
262
- mcp .WithDescription (t ("TOOL_MARK_NOTIFICATION_DONE_DESCRIPTION" ,"Mark a notification as done" )),
263
- mcp .WithString ("threadID" ,
264
- mcp .Required (),
265
- mcp .Description ("The ID of the notification thread" ),
266
- ),
267
- ),
268
- func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
269
- client ,err := getclient (ctx )
270
- if err != nil {
271
- return nil ,fmt .Errorf ("failed to get GitHub client: %w" ,err )
272
- }
190
+ resp ,err := client .Activity .MarkThreadDone (ctx ,threadID )
191
+ if err != nil {
192
+ return nil ,fmt .Errorf ("failed to mark notification as done: %w" ,err )
193
+ }
194
+ defer func () {_ = resp .Body .Close () }()
195
+
196
+ if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
197
+ body ,err := io .ReadAll (resp .Body )
198
+ if err != nil {
199
+ return nil ,fmt .Errorf ("failed to read response body: %w" ,err )
200
+ }
201
+ return mcp .NewToolResultError (fmt .Sprintf ("failed to mark notification as done: %s" ,string (body ))),nil
202
+ }
273
203
274
- threadIDStr ,err := requiredParam [string ](request ,"threadID" )
275
- if err != nil {
276
- return mcp .NewToolResultError (err .Error ()),nil
277
- }
204
+ return mcp .NewToolResultText ("Notification marked as done" ),nil
278
205
279
- threadID ,err := strconv .ParseInt (threadIDStr ,10 ,64 )
280
- if err != nil {
281
- return mcp .NewToolResultError ("Invalid threadID: must be a numeric value" ),nil
282
- }
206
+ case "mark_all_read" :
207
+ lastReadAt ,err := OptionalStringParam (request ,"lastReadAt" )
208
+ if err != nil {
209
+ return mcp .NewToolResultError (err .Error ()),nil
210
+ }
283
211
284
- resp ,err := client .Activity .MarkThreadDone (ctx ,threadID )
285
- if err != nil {
286
- return nil ,fmt .Errorf ("failed to mark notification as done: %w" ,err )
287
- }
288
- defer func () {_ = resp .Body .Close () }()
212
+ var markReadOptions github.Timestamp
213
+ if lastReadAt != "" {
214
+ lastReadTime ,err := time .Parse (time .RFC3339 ,lastReadAt )
215
+ if err != nil {
216
+ return mcp .NewToolResultError (fmt .Sprintf ("invalid lastReadAt time format, should be RFC3339/ISO8601: %v" ,err )),nil
217
+ }
218
+ markReadOptions = github.Timestamp {
219
+ Time :lastReadTime ,
220
+ }
221
+ }
289
222
290
- if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
291
- body ,err := io .ReadAll (resp .Body )
223
+ resp ,err := client .Activity .MarkNotificationsRead (ctx ,markReadOptions )
292
224
if err != nil {
293
- return nil ,fmt .Errorf ("failed toread response body : %w" ,err )
225
+ return nil ,fmt .Errorf ("failed tomark all notifications as read : %w" ,err )
294
226
}
295
- return mcp .NewToolResultError (fmt .Sprintf ("failed to mark notification as done: %s" ,string (body ))),nil
296
- }
227
+ defer func () {_ = resp .Body .Close () }()
228
+
229
+ if resp .StatusCode != http .StatusResetContent && resp .StatusCode != http .StatusOK {
230
+ body ,err := io .ReadAll (resp .Body )
231
+ if err != nil {
232
+ return nil ,fmt .Errorf ("failed to read response body: %w" ,err )
233
+ }
234
+ return mcp .NewToolResultError (fmt .Sprintf ("failed to mark all notifications as read: %s" ,string (body ))),nil
235
+ }
236
+
237
+ return mcp .NewToolResultText ("All notifications marked as read" ),nil
297
238
298
- return mcp .NewToolResultText ("Notification marked as done" ),nil
239
+ default :
240
+ return mcp .NewToolResultError ("Invalid action: must be 'mark_read', 'mark_all_read', or 'mark_done'" ),nil
241
+ }
299
242
}
300
243
}