@@ -160,42 +160,77 @@ func (c *Client) Ping(ctx context.Context) error {
160
160
return err
161
161
}
162
162
163
- func (c * Client ) ListResources (
163
+ // ListResourcesByPage manually list resources by page.
164
+ func (c * Client ) ListResourcesByPage (
164
165
ctx context.Context ,
165
166
request mcp.ListResourcesRequest ,
166
167
) (* mcp.ListResourcesResult , error ) {
167
- response , err := c . sendRequest (ctx , "resources/list" , request . Params )
168
+ result , err := listByPage [mcp. ListResourcesResult ] (ctx , c , request . PaginatedRequest , "resources/list" )
168
169
if err != nil {
169
170
return nil , err
170
171
}
172
+ return result , nil
173
+ }
171
174
172
- var result mcp.ListResourcesResult
173
- if err := json .Unmarshal (* response , & result ); err != nil {
174
- return nil , fmt .Errorf ("failed to unmarshal response: %w" , err )
175
+ func (c * Client ) ListResources (
176
+ ctx context.Context ,
177
+ request mcp.ListResourcesRequest ,
178
+ ) (* mcp.ListResourcesResult , error ) {
179
+ result , err := c .ListResourcesByPage (ctx , request )
180
+ if err != nil {
181
+ return nil , err
182
+ }
183
+ for result .NextCursor != "" {
184
+ select {
185
+ case <- ctx .Done ():
186
+ return nil , ctx .Err ()
187
+ default :
188
+ request .Params .Cursor = result .NextCursor
189
+ newPageRes , err := c .ListResourcesByPage (ctx , request )
190
+ if err != nil {
191
+ return nil , err
192
+ }
193
+ result .Resources = append (result .Resources , newPageRes .Resources ... )
194
+ result .NextCursor = newPageRes .NextCursor
195
+ }
175
196
}
197
+ return result , nil
198
+ }
176
199
177
- return & result , nil
200
+ func (c * Client ) ListResourceTemplatesByPage (
201
+ ctx context.Context ,
202
+ request mcp.ListResourceTemplatesRequest ,
203
+ ) (* mcp.ListResourceTemplatesResult , error ) {
204
+ result , err := listByPage [mcp.ListResourceTemplatesResult ](ctx , c , request .PaginatedRequest , "resources/templates/list" )
205
+ if err != nil {
206
+ return nil , err
207
+ }
208
+ return result , nil
178
209
}
179
210
180
211
func (c * Client ) ListResourceTemplates (
181
212
ctx context.Context ,
182
213
request mcp.ListResourceTemplatesRequest ,
183
214
) (* mcp.ListResourceTemplatesResult , error ) {
184
- response , err := c .sendRequest (
185
- ctx ,
186
- "resources/templates/list" ,
187
- request .Params ,
188
- )
215
+ result , err := c .ListResourceTemplatesByPage (ctx , request )
189
216
if err != nil {
190
217
return nil , err
191
218
}
192
-
193
- var result mcp.ListResourceTemplatesResult
194
- if err := json .Unmarshal (* response , & result ); err != nil {
195
- return nil , fmt .Errorf ("failed to unmarshal response: %w" , err )
219
+ for result .NextCursor != "" {
220
+ select {
221
+ case <- ctx .Done ():
222
+ return nil , ctx .Err ()
223
+ default :
224
+ request .Params .Cursor = result .NextCursor
225
+ newPageRes , err := c .ListResourceTemplatesByPage (ctx , request )
226
+ if err != nil {
227
+ return nil , err
228
+ }
229
+ result .ResourceTemplates = append (result .ResourceTemplates , newPageRes .ResourceTemplates ... )
230
+ result .NextCursor = newPageRes .NextCursor
231
+ }
196
232
}
197
-
198
- return & result , nil
233
+ return result , nil
199
234
}
200
235
201
236
func (c * Client ) ReadResource (
@@ -226,21 +261,40 @@ func (c *Client) Unsubscribe(
226
261
return err
227
262
}
228
263
229
- func (c * Client ) ListPrompts (
264
+ func (c * Client ) ListPromptsByPage (
230
265
ctx context.Context ,
231
266
request mcp.ListPromptsRequest ,
232
267
) (* mcp.ListPromptsResult , error ) {
233
- response , err := c . sendRequest (ctx , "prompts/list" , request . Params )
268
+ result , err := listByPage [mcp. ListPromptsResult ] (ctx , c , request . PaginatedRequest , "prompts/list" )
234
269
if err != nil {
235
270
return nil , err
236
271
}
272
+ return result , nil
273
+ }
237
274
238
- var result mcp.ListPromptsResult
239
- if err := json .Unmarshal (* response , & result ); err != nil {
240
- return nil , fmt .Errorf ("failed to unmarshal response: %w" , err )
275
+ func (c * Client ) ListPrompts (
276
+ ctx context.Context ,
277
+ request mcp.ListPromptsRequest ,
278
+ ) (* mcp.ListPromptsResult , error ) {
279
+ result , err := c .ListPromptsByPage (ctx , request )
280
+ if err != nil {
281
+ return nil , err
241
282
}
242
-
243
- return & result , nil
283
+ for result .NextCursor != "" {
284
+ select {
285
+ case <- ctx .Done ():
286
+ return nil , ctx .Err ()
287
+ default :
288
+ request .Params .Cursor = result .NextCursor
289
+ newPageRes , err := c .ListPromptsByPage (ctx , request )
290
+ if err != nil {
291
+ return nil , err
292
+ }
293
+ result .Prompts = append (result .Prompts , newPageRes .Prompts ... )
294
+ result .NextCursor = newPageRes .NextCursor
295
+ }
296
+ }
297
+ return result , nil
244
298
}
245
299
246
300
func (c * Client ) GetPrompt (
@@ -255,21 +309,40 @@ func (c *Client) GetPrompt(
255
309
return mcp .ParseGetPromptResult (response )
256
310
}
257
311
258
- func (c * Client ) ListTools (
312
+ func (c * Client ) ListToolsByPage (
259
313
ctx context.Context ,
260
314
request mcp.ListToolsRequest ,
261
315
) (* mcp.ListToolsResult , error ) {
262
- response , err := c . sendRequest (ctx , "tools/list" , request . Params )
316
+ result , err := listByPage [mcp. ListToolsResult ] (ctx , c , request . PaginatedRequest , "tools/list" )
263
317
if err != nil {
264
318
return nil , err
265
319
}
320
+ return result , nil
321
+ }
266
322
267
- var result mcp.ListToolsResult
268
- if err := json .Unmarshal (* response , & result ); err != nil {
269
- return nil , fmt .Errorf ("failed to unmarshal response: %w" , err )
323
+ func (c * Client ) ListTools (
324
+ ctx context.Context ,
325
+ request mcp.ListToolsRequest ,
326
+ ) (* mcp.ListToolsResult , error ) {
327
+ result , err := c .ListToolsByPage (ctx , request )
328
+ if err != nil {
329
+ return nil , err
270
330
}
271
-
272
- return & result , nil
331
+ for result .NextCursor != "" {
332
+ select {
333
+ case <- ctx .Done ():
334
+ return nil , ctx .Err ()
335
+ default :
336
+ request .Params .Cursor = result .NextCursor
337
+ newPageRes , err := c .ListToolsByPage (ctx , request )
338
+ if err != nil {
339
+ return nil , err
340
+ }
341
+ result .Tools = append (result .Tools , newPageRes .Tools ... )
342
+ result .NextCursor = newPageRes .NextCursor
343
+ }
344
+ }
345
+ return result , nil
273
346
}
274
347
275
348
func (c * Client ) CallTool (
@@ -309,6 +382,23 @@ func (c *Client) Complete(
309
382
return & result , nil
310
383
}
311
384
385
+ func listByPage [T any ](
386
+ ctx context.Context ,
387
+ client * Client ,
388
+ request mcp.PaginatedRequest ,
389
+ method string ,
390
+ ) (* T , error ) {
391
+ response , err := client .sendRequest (ctx , method , request .Params )
392
+ if err != nil {
393
+ return nil , err
394
+ }
395
+ var result T
396
+ if err := json .Unmarshal (* response , & result ); err != nil {
397
+ return nil , fmt .Errorf ("failed to unmarshal response: %w" , err )
398
+ }
399
+ return & result , nil
400
+ }
401
+
312
402
// Helper methods
313
403
314
404
// GetTransport gives access to the underlying transport layer.
0 commit comments