Skip to main content
Glama

search_iftypes

Search the iftypes.txt file to locate interface definitions used in the Old School RuneScape game UI. Input a query to find specific definitions within paginated results.

Instructions

Search the iftypes.txt file for interface definitions used in the game's UI.

Input Schema

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

Implementation Reference

  • Shared handler logic for 'search_iftypes' and other search_* tools: derives 'iftypes.txt' filename from tool name, validates input, checks file existence, performs paginated search using searchFile helper, and formats response.
    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 tools including search_iftypes: defines query string and optional 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:268-272 (registration)
    Registration of the search_iftypes tool in the ListToolsRequestHandler response, including name, description, and input schema reference.
    {
        name: "search_iftypes",
        description: "Search the iftypes.txt file for interface definitions used in the game's UI.",
        inputSchema: convertZodToJsonSchema(FileSearchSchema),
    },
  • Core searchFile helper function: performs case-insensitive line search in data file with pagination, formats results as ID-value pairs, returns structured results with pagination info.
    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);
            });
        });
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions searching a file but does not describe key behaviors like whether the search is case-sensitive, what the output format looks like (e.g., list of matches, error handling), or any limitations (e.g., file size constraints, search scope). This leaves significant gaps in understanding how the tool operates beyond basic input parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is front-loaded with the core action and resource, making it easy to parse. However, it could be slightly more structured by including key usage details, but it avoids redundancy and stays focused on the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of a search tool with no annotations and no output schema, the description is incomplete. It fails to explain behavioral traits, output format, or how results are presented (e.g., paginated list, error messages). While the input schema is well-documented, the overall context for effective tool use is lacking, especially for an agent needing to understand what to expect from the tool's execution.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, clearly documenting all three parameters (query, page, pageSize) with details like defaults and constraints. The description adds no additional semantic meaning beyond the schema, such as explaining what 'interface definitions' entail or how the query term is applied (e.g., partial matches, regex). With high schema coverage, the baseline score of 3 is appropriate, as the description does not compensate but also does not detract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Search') and the target resource ('the iftypes.txt file for interface definitions used in the game's UI'), making the purpose evident. However, it does not explicitly differentiate this tool from its many sibling search tools (e.g., search_invtypes, search_loctypes), which all search different file types but share a similar naming pattern, leaving some ambiguity about when to choose this specific tool over others.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as other search tools in the sibling list (e.g., search_data_file or osrs_wiki_search). It lacks context about specific use cases, prerequisites, or exclusions, leaving the agent to infer usage based on the tool name and description alone without explicit direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Related Tools

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