Skip to main content
Glama

search_npctypes

Query and retrieve NPC definitions from the npctypes.txt file in Old School RuneScape. Use this tool to search for specific non-player characters, with options for pagination and result customization.

Instructions

Search the npctypes.txt file for NPC (non-player character) definitions.

Input Schema

NameRequiredDescriptionDefault
pageNoPage number for pagination
pageSizeNoNumber of results per page
queryYesThe 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

  • Shared handler logic for search_npctypes (explicitly cased at line 389) and other search_* tools. Parses FileSearchSchema input, derives 'npctypes.txt' filename from tool name, checks file existence, invokes searchFile helper, 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 { query, page: filePage = 1, pageSize: filePageSize = 10 } = FileSearchSchema.parse(args); const filename = `${name.replace('search_', '')}.txt`; const filePath = path.join(DATA_DIR, 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 input schema for search_npctypes and other search_* tools, defining query, pagination parameters.
    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:283-287 (registration)
    Registration of search_npctypes tool in ListToolsRequestSchema handler, providing name, description, and input schema.
    { name: "search_npctypes", description: "Search the npctypes.txt file for NPC (non-player character) definitions.", inputSchema: convertZodToJsonSchema(FileSearchSchema), },
  • Core helper function implementing file search logic with case-insensitive matching, pagination, and key-value formatting for results. Called by search_npctypes handler to search npctypes.txt.
    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/JayArrowz/mcp-osrs'

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