88from eval_mcp .core .user_storage import list_datasets_from_db
99
1010
11+ def _dataset_preview (dataset : Dict [str , Any ]) -> Dict [str , Any ]:
12+ tests = dataset .get ("tests" , [])
13+ num_samples = dataset .get ("num_samples" , len (tests ) if isinstance (tests , list ) else 0 )
14+ preview = ""
15+ if isinstance (tests , list ) and len (tests ) > 0 :
16+ first_item = tests [0 ]
17+ if isinstance (first_item , dict ):
18+ preview = (
19+ first_item .get ("vars" , {}).get ("question" )
20+ or first_item .get ("question" )
21+ or str (first_item )[:100 ]
22+ )
23+ preview = preview [:100 ]
24+ if len (preview ) == 100 :
25+ preview += "..."
26+ return {
27+ "id" : dataset .get ("id" ),
28+ "name" : dataset .get ("name" ),
29+ "num_samples" : num_samples ,
30+ "preview" : preview or None ,
31+ }
32+
33+
1134async def handle_list_datasets (args : Dict [str , Any ]) -> List [TextContent ]:
12- """Handle list_datasets tool call .
35+ """List datasets with pagination and optional JSON format .
1336
14- Lists all datasets from the user's database.
15- Returns details about each dataset including number of samples and preview.
37+ Args (from `args` dict):
38+ user_id: required
39+ searchTerm: optional case-insensitive name filter
40+ limit: page size, default 20
41+ offset: page start, default 0
42+ response_format: "markdown" (default) or "json"
1643 """
1744 try :
18- # Get required user_id and optional search filter
1945 user_id = args .get ("user_id" )
2046 search_term = (args .get ("searchTerm" ) or "" ).lower ()
47+ limit = max (1 , int (args .get ("limit" , 20 ) or 20 ))
48+ offset = max (0 , int (args .get ("offset" , 0 ) or 0 ))
49+ response_format = (args .get ("response_format" ) or "markdown" ).lower ()
2150
2251 if not user_id :
2352 return [
@@ -27,38 +56,48 @@ async def handle_list_datasets(args: Dict[str, Any]) -> List[TextContent]:
2756 )
2857 ]
2958
30- # Get datasets from database
31- datasets = list_datasets_from_db (user_id , search_term )
59+ all_datasets = list_datasets_from_db (user_id , search_term )
60+ total = len (all_datasets )
61+ page = all_datasets [offset : offset + limit ]
62+ has_more = offset + len (page ) < total
63+ next_offset = offset + len (page ) if has_more else None
3264
33- if not datasets :
34- msg = f"No datasets found matching '{ search_term } '" if search_term else "No datasets found. Create your first dataset with save_dataset."
35- return [TextContent (type = "text" , text = msg )]
36-
37- # Format output
38- output = f"Found { len (datasets )} dataset(s):\n \n "
39-
40- for dataset in datasets :
41- tests = dataset .get ("tests" , [])
42- num_samples = dataset .get ("num_samples" , len (tests ) if isinstance (tests , list ) else 0 )
65+ if response_format == "json" :
66+ return [
67+ TextContent (
68+ type = "text" ,
69+ text = json .dumps (
70+ {
71+ "success" : True ,
72+ "total" : total ,
73+ "count" : len (page ),
74+ "offset" : offset ,
75+ "has_more" : has_more ,
76+ "next_offset" : next_offset ,
77+ "items" : [_dataset_preview (d ) for d in page ],
78+ },
79+ indent = 2 ,
80+ ),
81+ )
82+ ]
4383
44- # Get first question as preview
45- preview = ""
46- if isinstance (tests , list ) and len (tests ) > 0 :
47- first_item = tests [0 ]
48- if isinstance (first_item , dict ):
49- preview = (
50- first_item .get ("vars" , {}).get ("question" )
51- or first_item .get ("question" )
52- or str (first_item )[:100 ]
53- )
54- preview = preview [:100 ]
55- if len (preview ) == 100 :
56- preview += "..."
84+ if not all_datasets :
85+ msg = (
86+ f"No datasets found matching '{ search_term } '"
87+ if search_term
88+ else "No datasets found. Create your first dataset with save_dataset."
89+ )
90+ return [TextContent (type = "text" , text = msg )]
5791
58- output += f"📊 **{ dataset ['name' ]} **\n "
59- output += f" ID: { dataset ['id' ][:16 ]} ...\n "
60- output += f" Samples: { num_samples } \n "
61- output += f" Preview: { preview or 'No preview available' } \n \n "
92+ output = f"Found { total } dataset(s) — showing { offset + 1 } -{ offset + len (page )} :\n \n "
93+ for dataset in page :
94+ p = _dataset_preview (dataset )
95+ output += f"📊 **{ p ['name' ]} **\n "
96+ output += f" ID: { (p ['id' ] or '' )[:16 ]} ...\n "
97+ output += f" Samples: { p ['num_samples' ]} \n "
98+ output += f" Preview: { p ['preview' ] or 'No preview available' } \n \n "
99+ if has_more :
100+ output += f"More available — pass offset={ next_offset } to see the next page.\n "
62101
63102 return [TextContent (type = "text" , text = output )]
64103
0 commit comments