search_objtypes
Search object and item definitions in the OSRS game data by querying the objtypes.txt file. Supports pagination to browse results efficiently.
Instructions
Search the objtypes.txt file for object/item definitions in the game.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination | |
| pageSize | No | Number of results per page | |
| query | Yes | The term to search for in the file |
Input Schema (JSON Schema)
{
"additionalProperties": false,
"properties": {
"page": {
"default": 1,
"description": "Page number for pagination",
"minimum": 1,
"type": "integer"
},
"pageSize": {
"default": 10,
"description": "Number of results per page",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "The term to search for in the file",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
}
Implementation Reference
- index.ts:431-455 (handler)Handler logic for 'search_objtypes' and similar tools. Parses arguments, constructs filepath to 'objtypes.txt', checks existence, calls searchFile, and returns paginated results.case "search_varptypes": case "search_varbittypes": case "search_iftypes": case "search_invtypes": case "search_loctypes": case "search_npctypes": case "search_objtypes": case "search_rowtypes": case "search_seqtypes": case "search_soundtypes": case "search_spottypes": case "search_spritetypes": case "search_tabletypes": const fileSearchArgs = getSchemaForTool(name).parse(args) as { query: string; page?: number; pageSize?: number }; const { query, page: filePage = 1, pageSize: filePageSize = 10 } = fileSearchArgs; const filename = `${name.replace('search_', '')}.txt`; const filePath = path.join(getDataDir(), filename); if (!fileExists(filename)) { return responseToString({ error: `${filename} not found in data directory` }); } const fileResults = await searchFile(filePath, query, filePage, filePageSize); return responseToString(fileResults);
- index.ts:52-56 (schema)Input schema (FileSearchSchema) used for validating parameters of search_objtypes and other search_* tools.const FileSearchSchema = z.object({ query: z.string().describe("The term to search for in the file"), page: z.number().int().min(1).optional().default(1).describe("Page number for pagination"), pageSize: z.number().int().min(1).max(100).optional().default(10).describe("Number of results per page") });
- index.ts:338-340 (registration)Registration of the 'search_objtypes' tool in the list of available tools returned by ListTools.name: "search_objtypes", description: "Search the objtypes.txt file for object/item definitions in the game.", },
- index.ts:102-168 (helper)Core searchFile helper function that reads the file line-by-line, matches query (case-insensitive, spaces to underscores), paginates results, and formats as ID-value pairs.async function searchFile(filePath: string, searchTerm: string, page: number = 1, pageSize: number = 10): Promise<any> { //replace spaces with underscores searchTerm = searchTerm.replace(" ", "_"); return new Promise((resolve, reject) => { if (!fs.existsSync(filePath)) { reject(new Error(`File not found: ${filePath}`)); return; } const results: {line: string, lineNumber: number}[] = []; const fileStream = fs.createReadStream(filePath); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity }); let lineNumber = 0; rl.on('line', (line) => { lineNumber++; if (line.toLowerCase().includes(searchTerm.toLowerCase())) { results.push({ line, lineNumber }); } }); rl.on('close', () => { const totalResults = results.length; const totalPages = Math.ceil(totalResults / pageSize); const startIndex = (page - 1) * pageSize; const endIndex = startIndex + pageSize; const paginatedResults = results.slice(startIndex, endIndex); // Process the results to extract key-value pairs if possible const formattedResults = paginatedResults.map(result => { // Try to format as key-value pair (common for ID data files) const parts = result.line.split(/\s+/); if (parts.length >= 2) { const id = parts[0]; const value = parts.slice(1).join(' '); return { ...result, id, value, formatted: `${id}\t${value}` }; } return result; }); resolve({ results: formattedResults, pagination: { page, pageSize, totalResults, totalPages, hasNextPage: page < totalPages, hasPreviousPage: page > 1 } }); }); rl.on('error', (err) => { reject(err); }); }); }
- index.ts:175-183 (helper)fileExists helper used to check if the data file (objtypes.txt) exists before searching.async function fileExists(filename: string): Promise<boolean> { const filePath = path.join(getDataDir(), filename); try { await fs.promises.access(filePath); return true; } catch { return false; } }