get_homologs
Find orthologous and paralogous genes across species using Ensembl data to identify evolutionary relationships and functional similarities between genes.
Instructions
Find orthologous and paralogous genes across species
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| gene_id | Yes | Ensembl gene ID | |
| species | No | Source species name (default: homo_sapiens) | |
| target_species | No | Target species to search (optional) | |
| type | No | Homolog type (default: all) | |
| format | No | Output format (default: json) |
Implementation Reference
- src/index.ts:1167-1252 (handler)The core handler function for the 'get_homologs' tool. It validates inputs, retrieves the source gene from Ensembl, searches for orthologs by gene symbol in a target species (default: mouse), and formats the response with source/ortholog details or fallback info if no ortholog found.
private async handleGetHomologs(args: any) { if (!isValidHomologArgs(args)) { throw new McpError(ErrorCode.InvalidParams, 'Invalid homolog arguments'); } try { const species = this.getDefaultSpecies(args.species); // Use overlap endpoint to get gene information from different species // This provides comparative information by looking up the same gene in different organisms const geneResponse = await this.apiClient.get(`/lookup/id/${args.gene_id}`, { params: { species } }); const gene = geneResponse.data; // Get orthologs by looking up the same gene symbol in other species const targetSpecies = args.target_species || 'mus_musculus'; // Default to mouse try { const orthologResponse = await this.apiClient.get(`/lookup/symbol/${targetSpecies}/${gene.display_name}`); return { content: [ { type: 'text', text: JSON.stringify({ source_gene: { id: gene.id, symbol: gene.display_name, species: species, description: gene.description, location: `${gene.seq_region_name}:${gene.start}-${gene.end}`, biotype: gene.biotype }, ortholog: { id: orthologResponse.data.id, symbol: orthologResponse.data.display_name, species: targetSpecies, description: orthologResponse.data.description, location: `${orthologResponse.data.seq_region_name}:${orthologResponse.data.start}-${orthologResponse.data.end}`, biotype: orthologResponse.data.biotype }, analysis: { method: 'Gene symbol ortholog lookup', conservation: 'Symbol-based orthology', note: 'Genes with same symbol across species are typically orthologs' } }, null, 2), }, ], }; } catch (orthologError) { // Return information about the source gene even if ortholog not found return { content: [ { type: 'text', text: JSON.stringify({ source_gene: { id: gene.id, symbol: gene.display_name, species: species, description: gene.description, location: `${gene.seq_region_name}:${gene.start}-${gene.end}`, biotype: gene.biotype }, ortholog_search: { target_species: targetSpecies, result: 'No ortholog found with same gene symbol', suggestion: 'Try different target species or use gene family analysis' }, available_data: { gene_info: 'Complete source gene information available', cross_references: 'Use get_xrefs tool for external database links', sequences: 'Use get_sequence tool for sequence comparison' } }, null, 2), }, ], }; } } catch (error) { return this.handleError(error, 'fetching comparative gene data'); } } - src/index.ts:657-666 (schema)JSON schema defining the input parameters for the get_homologs tool, including required gene_id and optional species, target_species, type, and format.
type: 'object', properties: { gene_id: { type: 'string', description: 'Ensembl gene ID' }, species: { type: 'string', description: 'Source species name (default: homo_sapiens)' }, target_species: { type: 'string', description: 'Target species to search (optional)' }, type: { type: 'string', enum: ['orthologues', 'paralogues', 'all'], description: 'Homolog type (default: all)' }, format: { type: 'string', enum: ['json', 'xml'], description: 'Output format (default: json)' }, }, required: ['gene_id'], }, - src/index.ts:654-667 (registration)Registration of the get_homologs tool in the ListToolsRequestSchema handler, providing name, description, and input schema.
name: 'get_homologs', description: 'Find orthologous and paralogous genes across species', inputSchema: { type: 'object', properties: { gene_id: { type: 'string', description: 'Ensembl gene ID' }, species: { type: 'string', description: 'Source species name (default: homo_sapiens)' }, target_species: { type: 'string', description: 'Target species to search (optional)' }, type: { type: 'string', enum: ['orthologues', 'paralogues', 'all'], description: 'Homolog type (default: all)' }, format: { type: 'string', enum: ['json', 'xml'], description: 'Output format (default: json)' }, }, required: ['gene_id'], }, }, - src/index.ts:849-850 (registration)Tool handler dispatch in the CallToolRequestSchema switch statement, routing 'get_homologs' calls to handleGetHomologs.
case 'get_homologs': return this.handleGetHomologs(args); - src/index.ts:214-227 (schema)Type guard function for validating get_homologs input arguments before execution.
const isValidHomologArgs = ( args: any ): args is { gene_id: string; species?: string; target_species?: string; type?: string; format?: string } => { return ( typeof args === 'object' && args !== null && typeof args.gene_id === 'string' && args.gene_id.length > 0 && (args.species === undefined || typeof args.species === 'string') && (args.target_species === undefined || typeof args.target_species === 'string') && (args.type === undefined || ['orthologues', 'paralogues', 'all'].includes(args.type)) && (args.format === undefined || ['json', 'xml'].includes(args.format)) ); };