Skip to main content
Glama
WaterSippin

OSRS MCP Server

Official
by WaterSippin

search_spottypes

Find specific spot animation definitions in the spottypes.txt file using query and pagination parameters for efficient access to graphical effect data on the OSRS MCP Server.

Instructions

Search the spottypes.txt file for spot animation (graphical effect) definitions.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for pagination
pageSizeNoNumber of results per page
queryYesThe term to search for in the file

Implementation Reference

  • Handler logic for executing the 'search_spottypes' tool (shared with other search_* tools). Determines the data file 'spottypes.txt' from the tool name, validates input using FileSearchSchema, checks if the file exists, and calls the searchFile helper function to perform the search.
    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);
  • Zod schema used for input validation of search_spottypes 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:353-356 (registration)
    Tool registration/definition returned by listTools endpoint.
    { name: "search_spottypes", description: "Search the spottypes.txt file for spot animation (graphical effect) definitions.", },
  • Core search functionality that reads the file line-by-line, finds matching lines case-insensitively (after replacing spaces with underscores in query), paginates results, and formats them as ID-value pairs where possible.
    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); }); }); }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/WaterSippin/mcp-osrs'

If you have feedback or need assistance with the MCP directory API, please join our Discord server