search_torrents
Search torrents on M-Team private tracker using keywords with configurable modes, page numbers, and result sizes to find specific content.
Instructions
Search torrents on M-Team by keyword.
Args: keyword: Search keyword (supports Chinese / English). mode: Search mode. One of: normal, adult, movie, music, tvshow, waterfall, rss, rankings, all. Defaults to "normal". page_number: Page number (1-based). Defaults to 1. page_size: Number of results per page (max 100). Defaults to 20.
Returns: A formatted string listing matching torrents with their IDs, names, sizes, seeder/leecher counts, labels, ratings, and discount info.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | Yes | ||
| mode | No | normal | |
| page_number | No | ||
| page_size | No |
Implementation Reference
- mcp_server_mteam/server.py:61-140 (handler)Implementation of the search_torrents tool handler.
@mcp.tool def search_torrents( keyword: str, mode: str = "normal", page_number: int = 1, page_size: int = 20, ) -> str: """Search torrents on M-Team by keyword. Args: keyword: Search keyword (supports Chinese / English). mode: Search mode. One of: normal, adult, movie, music, tvshow, waterfall, rss, rankings, all. Defaults to "normal". page_number: Page number (1-based). Defaults to 1. page_size: Number of results per page (max 100). Defaults to 20. Returns: A formatted string listing matching torrents with their IDs, names, sizes, seeder/leecher counts, labels, ratings, and discount info. """ url = f"{BASE_URL}/torrent/search" body = { "keyword": keyword, "mode": mode, "pageNumber": page_number, "pageSize": page_size, } resp = requests.post(url, json=body, headers=_headers(), timeout=30) resp.raise_for_status() data = resp.json() code = data.get("code") message = data.get("message", "") payload = data.get("data") if str(code) != "0" and message.upper() != "SUCCESS": return f"API error {code}: {message}" if isinstance(payload, dict): items: list = ( payload.get("list") or payload.get("data") or payload.get("torrents") or [] ) total = payload.get("total") or payload.get("totalCount") or len(items) elif isinstance(payload, list): items = payload total = len(payload) else: return f"Unexpected response format:\n{data}" if not items: return f'No results found for "{keyword}" (mode={mode}).' lines = [ f'Search results for "{keyword}" (mode={mode})', f"Total: {total} | Page {page_number}, showing {len(items)} items", "-" * 60, ] for item in items: tid = item.get("id", "?") name = item.get("name") or item.get("title") or "(no name)" size = _format_size(item.get("size")) labels = ", ".join(item.get("labelsNew") or []) or "-" imdb_rating = item.get("imdbRating") or "-" douban_rating = item.get("doubanRating") or "-" status = item.get("status") or {} seeders = status.get("seeders", "?") leechers = status.get("leechers", "?") discount = status.get("discount", "-") lines.append( f"[{tid}] {name}\n" f" Size: {size} Seeders: {seeders} Leechers: {leechers}\n" f" Labels: {labels} Discount: {discount}\n" f" IMDB: {imdb_rating} Douban: {douban_rating}" ) return "\n".join(lines)