get_multi_tissue_eqtls
Retrieve multi-tissue eQTL meta-analysis results from GTEx data to identify gene expression associations across human tissues using GENCODE gene IDs.
Instructions
Get multi-tissue eQTL meta-analysis results
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| datasetId | No | GTEx dataset ID (default: gtex_v8) | gtex_v8 |
| gencodeId | Yes | GENCODE gene ID (e.g., ENSG00000223972.5) |
Implementation Reference
- Main MCP tool handler: validates input, calls API client for multi-tissue eQTL meta-analysis data, formats results with tissue-specific m-values, p-values, NES, and summaries into markdown text response.async getMultiTissueEQTLs(args: any) { if (!args.geneId || typeof args.geneId !== 'string') { throw new Error('geneId parameter is required and must be a gene ID string'); } const result = await this.apiClient.getMultiTissueEQTLs( args.geneId, args.variantId, args.datasetId || 'gtex_v8' ); if (result.error) { return { content: [{ type: "text", text: `Error retrieving multi-tissue eQTL data: ${result.error}` }], isError: true }; } const metaResults = result.data || []; if (metaResults.length === 0) { return { content: [{ type: "text", text: `No multi-tissue eQTL results found for gene: ${args.geneId}` }] }; } let output = `**Multi-Tissue eQTL Meta-Analysis**\n`; output += `Gene: ${args.geneId}\n`; output += `Dataset: ${metaResults[0]?.datasetId}\n`; output += `Results: ${metaResults.length} gene-variant combinations\n\n`; metaResults.forEach((result, index) => { output += `### Result ${index + 1}: ${result.variantId}\n`; output += `**Meta p-value:** ${result.metaP.toExponential(2)}\n`; output += `**Gene:** ${result.gencodeId}\n\n`; if (result.tissues && Object.keys(result.tissues).length > 0) { // Sort tissues by m-value (posterior probability) const tissueEntries = Object.entries(result.tissues); tissueEntries.sort((a, b) => b[1].mValue - a[1].mValue); output += `**Tissue-Specific Results:**\n`; const topTissues = tissueEntries.slice(0, 10); // Show top 10 tissues topTissues.forEach(([tissueName, tissueData]) => { const tissueDisplayName = this.getTissueDisplayName(tissueName); output += ` **${tissueDisplayName}**:\n`; output += ` • m-value (posterior prob): ${tissueData.mValue.toFixed(4)}\n`; output += ` • p-value: ${tissueData.pValue.toExponential(2)}\n`; output += ` • NES: ${tissueData.nes.toFixed(3)}\n`; output += ` • Standard error: ${tissueData.se.toFixed(4)}\n`; }); if (tissueEntries.length > 10) { output += ` ... and ${tissueEntries.length - 10} more tissues\n`; } // Summary statistics const mValues = tissueEntries.map(([, data]) => data.mValue); const nesValues = tissueEntries.map(([, data]) => data.nes); const significantTissues = tissueEntries.filter(([, data]) => data.mValue > 0.5); output += `\n**Summary:**\n`; output += ` • Tissues analyzed: ${tissueEntries.length}\n`; output += ` • Tissues with m-value > 0.5: ${significantTissues.length}\n`; output += ` • Max m-value: ${Math.max(...mValues).toFixed(4)}\n`; output += ` • Mean |NES|: ${(nesValues.map(n => Math.abs(n)).reduce((sum, n) => sum + n, 0) / nesValues.length).toFixed(3)}\n`; } output += '\n'; }); return { content: [{ type: "text", text: output.trim() }] }; }
- src/index.ts:693-697 (registration)Tool registration/dispatch: Routes CallToolRequest for 'get_multi_tissue_eqtls' to AssociationHandlers.getMultiTissueEQTLs with parsed arguments.if (name === "get_multi_tissue_eqtls") { return await associationHandlers.getMultiTissueEQTLs({ geneId: args?.gencodeId, datasetId: args?.datasetId });
- src/index.ts:301-317 (schema)Tool schema definition: Specifies input schema for ListTools response, defining required gencodeId and optional datasetId parameters.name: "get_multi_tissue_eqtls", description: "Get multi-tissue eQTL meta-analysis results", inputSchema: { type: "object", properties: { gencodeId: { type: "string", description: "GENCODE gene ID (e.g., ENSG00000223972.5)" }, datasetId: { type: "string", description: "GTEx dataset ID (default: gtex_v8)", default: "gtex_v8" } }, required: ["gencodeId"] }
- src/utils/api-client.ts:503-524 (helper)API client helper: Makes HTTP GET request to GTEx Portal /association/metasoft endpoint to fetch raw multi-tissue eQTL meta-analysis data (MASHR results).async getMultiTissueEQTLs( gencodeId: string, variantId?: string, datasetId: string = 'gtex_v8' ): Promise<GTExApiResponse<MultiTissueEQTL[]>> { try { const queryParams = this.buildQueryParams({ gencodeId, variantId, datasetId, page: 0, itemsPerPage: 250 }); const response = await this.axiosInstance.get(`/association/metasoft?${queryParams}`); return { data: response.data.data, paging_info: response.data.paging_info }; } catch (error) { return error as GTExApiResponse<MultiTissueEQTL[]>; } }
- src/types/gtex-types.ts:212-225 (schema)TypeScript interface defining the structure of multi-tissue eQTL response data from GTEx API.export interface MultiTissueEQTL { gencodeId: string; datasetId: string; metaP: number; variantId: string; tissues: { [tissueName: string]: { mValue: number; pValue: number; se: number; nes: number; }; }; }