Skip to main content
Glama

choose_technology

Select an Apple development framework or technology to scope all subsequent searches and documentation lookups within the Apple documentation system.

Instructions

Select the framework/technology to scope all subsequent searches and documentation lookups

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
identifierNoOptional technology identifier (e.g. doc://.../SwiftUI)
nameNoTechnology name/title (e.g. SwiftUI)

Implementation Reference

  • Core handler implementation for the 'choose_technology' tool. Builds a function that selects a technology/framework by name or identifier using exact, fuzzy matching, validates it, updates server state, and returns markdown response with success or suggestions.
    export const buildChooseTechnologyHandler = ({client, state}: ServerContext) =>
    	async (args: {name?: string; identifier?: string}): Promise<ToolResponse> => {
    		const {name, identifier} = args;
    		const technologies = await client.getTechnologies();
    		const candidates = Object.values(technologies).filter(tech => typeof tech?.title === 'string' && typeof tech?.identifier === 'string');
    
    		// Normalize search terms - case insensitive
    		const normalizedName = name?.toLowerCase().trim();
    		const normalizedIdentifier = identifier?.toLowerCase().trim();
    
    		let chosen: typeof candidates[0] | undefined;
    
    		// Try identifier first (most specific)
    		if (normalizedIdentifier) {
    			chosen = candidates.find(tech => tech.identifier?.toLowerCase() === normalizedIdentifier);
    		}
    
    		// Try exact name match (case-insensitive)
    		if (!chosen && normalizedName) {
    			chosen = candidates.find(tech => tech.title?.toLowerCase() === normalizedName);
    		}
    
    		// Try fuzzy match on name only if we have a name
    		if (!chosen && normalizedName) {
    			const scored = candidates
    				.map(tech => ({tech, score: fuzzyScore(tech.title, name)}))
    				.sort((a, b) => a.score - b.score);
    			// Only use fuzzy match if it's reasonably good (score < 3)
    			if (scored[0] && scored[0].score < 3) {
    				chosen = scored[0].tech;
    			}
    		}
    
    		if (!chosen) {
    			const searchTerm = normalizedName ?? normalizedIdentifier ?? '';
    			const suggestions = candidates
    				.filter(tech => tech.title?.toLowerCase().includes(searchTerm))
    				.slice(0, 5)
    				.map(tech => `• ${tech.title} — \`choose_technology "${tech.title}"\``);
    
    			const lines = [
    				header(1, '❌ Technology Not Found'),
    				`Could not resolve "${name ?? identifier ?? 'unknown'}".`,
    				'',
    				header(2, 'Suggestions'),
    				...(suggestions.length > 0
    					? suggestions
    					: ['• Use `discover_technologies { "query": "keyword" }` to find candidates']),
    			];
    
    			return {
    				content: [{text: lines.join('\n'), type: 'text'}],
    			};
    		}
    
    		ensureFramework(chosen);
    		state.setActiveTechnology(chosen);
    		state.clearActiveFrameworkData();
    
    		const lines = [
    			header(1, '✅ Technology Selected'),
    			'',
    			bold('Name', chosen.title),
    			bold('Identifier', chosen.identifier ?? 'Unknown'),
    			'',
    			header(2, 'Next actions'),
    			'• `search_symbols { "query": "keyword" }` — fuzzy search within this framework',
    			'• `get_documentation { "path": "SymbolName" }` — open a symbol page',
    			'• `discover_technologies` — pick another framework',
    		];
    
    		return {
    			content: [{text: lines.join('\n'), type: 'text'}],
    		};
    	};
  • Input schema for 'choose_technology' tool defining optional 'identifier' and 'name' parameters.
    inputSchema: {
    	type: 'object',
    	required: [],
    	properties: {
    		identifier: {
    			type: 'string',
    			description: 'Optional technology identifier (e.g. doc://.../SwiftUI)',
    		},
    		name: {
    			type: 'string',
    			description: 'Technology name/title (e.g. SwiftUI)',
    		},
    	},
    },
  • Tool definition object registering 'choose_technology' with name, description, input schema, and handler reference.
    {
    	name: 'choose_technology',
    	description: 'Select the framework/technology to scope all subsequent searches and documentation lookups',
    	inputSchema: {
    		type: 'object',
    		required: [],
    		properties: {
    			identifier: {
    				type: 'string',
    				description: 'Optional technology identifier (e.g. doc://.../SwiftUI)',
    			},
    			name: {
    				type: 'string',
    				description: 'Technology name/title (e.g. SwiftUI)',
    			},
    		},
    	},
    	handler: buildChooseTechnologyHandler(context),
    },
  • Top-level call to register all tools, including 'choose_technology', to the MCP Server instance.
    registerTools(server, {client, state});
  • Fuzzy matching utility function used by the handler to score and select technology names.
    const fuzzyScore = (a: string | undefined, b: string | undefined): number => {
    	if (!a || !b) {
    		return Number.POSITIVE_INFINITY;
    	}
    
    	const lowerA = a.toLowerCase();
    	const lowerB = b.toLowerCase();
    	if (lowerA === lowerB) {
    		return 0;
    	}
    
    	if (lowerA.startsWith(lowerB) || lowerB.startsWith(lowerA)) {
    		return 1;
    	}
    
    	if (lowerA.includes(lowerB) || lowerB.includes(lowerA)) {
    		return 2;
    	}
    
    	return 3;
    };

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/MightyDillah/apple-doc-mcp'

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