@@ -32,9 +32,18 @@ func getIssue(client *github.Client, t translations.TranslationHelperFunc) (tool
32
32
),
33
33
),
34
34
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
35
- owner := request .Params .Arguments ["owner" ].(string )
36
- repo := request .Params .Arguments ["repo" ].(string )
37
- issueNumber := int (request .Params .Arguments ["issue_number" ].(float64 ))
35
+ owner ,err := requiredStringParam (request ,"owner" )
36
+ if err != nil {
37
+ return mcp .NewToolResultError (err .Error ()),nil
38
+ }
39
+ repo ,err := requiredStringParam (request ,"repo" )
40
+ if err != nil {
41
+ return mcp .NewToolResultError (err .Error ()),nil
42
+ }
43
+ issueNumber ,err := requiredNumberParam (request ,"issue_number" )
44
+ if err != nil {
45
+ return mcp .NewToolResultError (err .Error ()),nil
46
+ }
38
47
39
48
issue ,resp ,err := client .Issues .Get (ctx ,owner ,repo ,issueNumber )
40
49
if err != nil {
@@ -81,10 +90,22 @@ func addIssueComment(client *github.Client, t translations.TranslationHelperFunc
81
90
),
82
91
),
83
92
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
84
- owner := request .Params .Arguments ["owner" ].(string )
85
- repo := request .Params .Arguments ["repo" ].(string )
86
- issueNumber := int (request .Params .Arguments ["issue_number" ].(float64 ))
87
- body := request .Params .Arguments ["body" ].(string )
93
+ owner ,err := requiredStringParam (request ,"owner" )
94
+ if err != nil {
95
+ return mcp .NewToolResultError (err .Error ()),nil
96
+ }
97
+ repo ,err := requiredStringParam (request ,"repo" )
98
+ if err != nil {
99
+ return mcp .NewToolResultError (err .Error ()),nil
100
+ }
101
+ issueNumber ,err := requiredNumberParam (request ,"issue_number" )
102
+ if err != nil {
103
+ return mcp .NewToolResultError (err .Error ()),nil
104
+ }
105
+ body ,err := requiredStringParam (request ,"body" )
106
+ if err != nil {
107
+ return mcp .NewToolResultError (err .Error ()),nil
108
+ }
88
109
89
110
comment := & github.IssueComment {
90
111
Body :github .Ptr (body ),
@@ -135,22 +156,25 @@ func searchIssues(client *github.Client, t translations.TranslationHelperFunc) (
135
156
),
136
157
),
137
158
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
138
- query := request .Params .Arguments ["q" ].(string )
139
- sort := ""
140
- if s ,ok := request .Params .Arguments ["sort" ].(string );ok {
141
- sort = s
159
+ query ,err := requiredStringParam (request ,"q" )
160
+ if err != nil {
161
+ return mcp .NewToolResultError (err .Error ()),nil
142
162
}
143
- order := ""
144
- if o , ok := request . Params . Arguments [ "order" ].( string ); ok {
145
- order = o
163
+ sort , err := optionalStringParam ( request , "sort" )
164
+ if err != nil {
165
+ return mcp . NewToolResultError ( err . Error ()), nil
146
166
}
147
- perPage := 30
148
- if pp , ok := request . Params . Arguments [ "per_page" ].( float64 ); ok {
149
- perPage = int ( pp )
167
+ order , err := optionalStringParam ( request , "order" )
168
+ if err != nil {
169
+ return mcp . NewToolResultError ( err . Error ()), nil
150
170
}
151
- page := 1
152
- if p ,ok := request .Params .Arguments ["page" ].(float64 );ok {
153
- page = int (p )
171
+ perPage ,err := optionalNumberParamWithDefault (request ,"per_page" ,30 )
172
+ if err != nil {
173
+ return mcp .NewToolResultError (err .Error ()),nil
174
+ }
175
+ page ,err := optionalNumberParamWithDefault (request ,"page" ,1 )
176
+ if err != nil {
177
+ return mcp .NewToolResultError (err .Error ()),nil
154
178
}
155
179
156
180
opts := & github.SearchOptions {
@@ -212,26 +236,34 @@ func createIssue(client *github.Client, t translations.TranslationHelperFunc) (t
212
236
),
213
237
),
214
238
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
215
- owner := request .Params .Arguments ["owner" ].(string )
216
- repo := request .Params .Arguments ["repo" ].(string )
217
- title := request .Params .Arguments ["title" ].(string )
239
+ owner ,err := requiredStringParam (request ,"owner" )
240
+ if err != nil {
241
+ return mcp .NewToolResultError (err .Error ()),nil
242
+ }
243
+ repo ,err := requiredStringParam (request ,"repo" )
244
+ if err != nil {
245
+ return mcp .NewToolResultError (err .Error ()),nil
246
+ }
247
+ title ,err := requiredStringParam (request ,"title" )
248
+ if err != nil {
249
+ return mcp .NewToolResultError (err .Error ()),nil
250
+ }
218
251
219
252
// Optional parameters
220
- var body string
221
- if b , ok := request . Params . Arguments [ "body" ].( string ); ok {
222
- body = b
253
+ body , err := optionalStringParam ( request , "body" )
254
+ if err != nil {
255
+ return mcp . NewToolResultError ( err . Error ()), nil
223
256
}
224
257
225
- //Parse assignees if present
226
- assignees := [] string {} // default to empty slice, can't be nil
227
- if a , ok := request . Params . Arguments [ "assignees" ].( string ); ok && a != "" {
228
- assignees = parseCommaSeparatedList ( a )
258
+ //Get assignees
259
+ assignees , err := optionalCommaSeparatedListParam ( request , "assignees" )
260
+ if err != nil {
261
+ return mcp . NewToolResultError ( err . Error ()), nil
229
262
}
230
-
231
- // Parse labels if present
232
- labels := []string {}// default to empty slice, can't be nil
233
- if l ,ok := request .Params .Arguments ["labels" ].(string );ok && l != "" {
234
- labels = parseCommaSeparatedList (l )
263
+ // Get labels
264
+ labels ,err := optionalCommaSeparatedListParam (request ,"labels" )
265
+ if err != nil {
266
+ return mcp .NewToolResultError (err .Error ()),nil
235
267
}
236
268
237
269
// Create the issue request
@@ -300,29 +332,43 @@ func listIssues(client *github.Client, t translations.TranslationHelperFunc) (to
300
332
),
301
333
),
302
334
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
303
- owner := request .Params .Arguments ["owner" ].(string )
304
- repo := request .Params .Arguments ["repo" ].(string )
335
+ owner ,err := requiredStringParam (request ,"owner" )
336
+ if err != nil {
337
+ return mcp .NewToolResultError (err .Error ()),nil
338
+ }
339
+ repo ,err := requiredStringParam (request ,"repo" )
340
+ if err != nil {
341
+ return mcp .NewToolResultError (err .Error ()),nil
342
+ }
305
343
306
344
opts := & github.IssueListByRepoOptions {}
307
345
308
346
// Set optional parameters if provided
309
- if state ,ok := request .Params .Arguments ["state" ].(string );ok && state != "" {
310
- opts .State = state
347
+ opts .State ,err = optionalStringParam (request ,"state" )
348
+ if err != nil {
349
+ return mcp .NewToolResultError (err .Error ()),nil
311
350
}
312
351
313
- if labels ,ok := request .Params .Arguments ["labels" ].(string );ok && labels != "" {
314
- opts .Labels = parseCommaSeparatedList (labels )
352
+ opts .Labels ,err = optionalCommaSeparatedListParam (request ,"labels" )
353
+ if err != nil {
354
+ return mcp .NewToolResultError (err .Error ()),nil
315
355
}
316
356
317
- if sort ,ok := request .Params .Arguments ["sort" ].(string );ok && sort != "" {
318
- opts .Sort = sort
357
+ opts .Sort ,err = optionalStringParam (request ,"sort" )
358
+ if err != nil {
359
+ return mcp .NewToolResultError (err .Error ()),nil
319
360
}
320
361
321
- if direction ,ok := request .Params .Arguments ["direction" ].(string );ok && direction != "" {
322
- opts .Direction = direction
362
+ opts .Direction ,err = optionalStringParam (request ,"direction" )
363
+ if err != nil {
364
+ return mcp .NewToolResultError (err .Error ()),nil
323
365
}
324
366
325
- if since ,ok := request .Params .Arguments ["since" ].(string );ok && since != "" {
367
+ since ,err := optionalStringParam (request ,"since" )
368
+ if err != nil {
369
+ return mcp .NewToolResultError (err .Error ()),nil
370
+ }
371
+ if since != "" {
326
372
timestamp ,err := parseISOTimestamp (since )
327
373
if err != nil {
328
374
return mcp .NewToolResultError (fmt .Sprintf ("failed to list issues: %s" ,err .Error ())),nil
@@ -397,38 +443,69 @@ func updateIssue(client *github.Client, t translations.TranslationHelperFunc) (t
397
443
),
398
444
),
399
445
func (ctx context.Context ,request mcp.CallToolRequest ) (* mcp.CallToolResult ,error ) {
400
- owner := request .Params .Arguments ["owner" ].(string )
401
- repo := request .Params .Arguments ["repo" ].(string )
402
- issueNumber := int (request .Params .Arguments ["issue_number" ].(float64 ))
446
+ owner ,err := requiredStringParam (request ,"owner" )
447
+ if err != nil {
448
+ return mcp .NewToolResultError (err .Error ()),nil
449
+ }
450
+ repo ,err := requiredStringParam (request ,"repo" )
451
+ if err != nil {
452
+ return mcp .NewToolResultError (err .Error ()),nil
453
+ }
454
+ issueNumber ,err := requiredNumberParam (request ,"issue_number" )
455
+ if err != nil {
456
+ return mcp .NewToolResultError (err .Error ()),nil
457
+ }
403
458
404
459
// Create the issue request with only provided fields
405
460
issueRequest := & github.IssueRequest {}
406
461
407
462
// Set optional parameters if provided
408
- if title ,ok := request .Params .Arguments ["title" ].(string );ok && title != "" {
463
+ title ,err := optionalStringParam (request ,"title" )
464
+ if err != nil {
465
+ return mcp .NewToolResultError (err .Error ()),nil
466
+ }
467
+ if title != "" {
409
468
issueRequest .Title = github .Ptr (title )
410
469
}
411
470
412
- if body ,ok := request .Params .Arguments ["body" ].(string );ok && body != "" {
471
+ body ,err := optionalStringParam (request ,"body" )
472
+ if err != nil {
473
+ return mcp .NewToolResultError (err .Error ()),nil
474
+ }
475
+ if body != "" {
413
476
issueRequest .Body = github .Ptr (body )
414
477
}
415
478
416
- if state ,ok := request .Params .Arguments ["state" ].(string );ok && state != "" {
479
+ state ,err := optionalStringParam (request ,"state" )
480
+ if err != nil {
481
+ return mcp .NewToolResultError (err .Error ()),nil
482
+ }
483
+ if state != "" {
417
484
issueRequest .State = github .Ptr (state )
418
485
}
419
486
420
- if labels ,ok := request .Params .Arguments ["labels" ].(string );ok && labels != "" {
421
- labelsList := parseCommaSeparatedList (labels )
422
- issueRequest .Labels = & labelsList
487
+ labels ,err := optionalCommaSeparatedListParam (request ,"labels" )
488
+ if err != nil {
489
+ return mcp .NewToolResultError (err .Error ()),nil
490
+ }
491
+ if len (labels )> 0 {
492
+ issueRequest .Labels = & labels
423
493
}
424
494
425
- if assignees ,ok := request .Params .Arguments ["assignees" ].(string );ok && assignees != "" {
426
- assigneesList := parseCommaSeparatedList (assignees )
427
- issueRequest .Assignees = & assigneesList
495
+ assignees ,err := optionalCommaSeparatedListParam (request ,"assignees" )
496
+ if err != nil {
497
+ return mcp .NewToolResultError (err .Error ()),nil
498
+ }
499
+ if len (assignees )> 0 {
500
+ issueRequest .Assignees = & assignees
428
501
}
429
502
430
- if milestone ,ok := request .Params .Arguments ["milestone" ].(float64 );ok {
431
- milestoneNum := int (milestone )
503
+ milestone ,err := optionalNumberParam (request ,"milestone" )
504
+ if err != nil {
505
+ return mcp .NewToolResultError (err .Error ()),nil
506
+ }
507
+ if milestone != 0 {
508
+ milestoneNum := milestone
432
509
issueRequest .Milestone = & milestoneNum
433
510
}
434
511