Skip to main content
Glama

get_gene_expression

Retrieve gene expression levels across multiple human tissues for a specified gene using GTEx data to analyze tissue-specific expression patterns.

Instructions

Get gene expression data across tissues for a specific gene

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
datasetIdNoGTEx dataset ID (default: gtex_v8)gtex_v8
gencodeIdYesGENCODE gene ID (e.g., ENSG00000223972.5)

Implementation Reference

  • Main handler function implementing the get_gene_expression tool logic: input validation, API call, data processing, grouping by gene/tissue, statistical summaries, and formatted text output.
    async getGeneExpression(args: any) { if (!args.geneIds || !Array.isArray(args.geneIds) || args.geneIds.length === 0) { throw new Error('geneIds parameter is required and must be a non-empty array of gene IDs (GENCODE IDs or gene symbols)'); } if (args.geneIds.length > 60) { return { content: [{ type: "text", text: "Maximum 60 genes can be processed at once. Please reduce the number of genes." }] }; } const result = await this.apiClient.getGeneExpression({ gencodeId: args.geneIds, datasetId: args.datasetId || 'gtex_v8', tissueSiteDetailId: args.tissueIds, attributeSubset: args.attributeSubset, page: args.page || 0, itemsPerPage: args.itemsPerPage || 250 }); if (result.error) { return { content: [{ type: "text", text: `Error retrieving gene expression data: ${result.error}` }], isError: true }; } const expressions = result.data || []; if (expressions.length === 0) { return { content: [{ type: "text", text: `No gene expression data found for the specified genes and tissues.${args.tissueIds ? ` Check that tissue IDs are valid: ${args.tissueIds.join(', ')}` : ''}` }] }; } // Group by gene and tissue for better organization const geneGroups: { [key: string]: any[] } = {}; expressions.forEach(expr => { const key = `${expr.geneSymbol} (${expr.gencodeId})`; if (!geneGroups[key]) { geneGroups[key] = []; } geneGroups[key].push(expr); }); let output = `**Gene Expression Data (${expressions.length} results)**\n`; output += `Dataset: ${expressions[0]?.datasetId || args.datasetId}\n`; if (args.attributeSubset) { output += `Subset by: ${args.attributeSubset}\n`; } output += '\n'; Object.entries(geneGroups).forEach(([geneKey, geneExpressions]) => { output += `### ${geneKey}\n`; geneExpressions.forEach(expr => { const tissueDisplayName = this.getTissueDisplayName(expr.tissueSiteDetailId); output += `**${tissueDisplayName}**${expr.subsetGroup ? ` (${expr.subsetGroup})` : ''}:\n`; const stats = this.calculateExpressionStats(expr.data); output += ` • Samples: ${expr.data.length}\n`; output += ` • Mean: ${stats.mean.toFixed(3)} ${expr.unit}\n`; output += ` • Median: ${stats.median.toFixed(3)} ${expr.unit}\n`; output += ` • Range: ${stats.min.toFixed(3)} - ${stats.max.toFixed(3)} ${expr.unit}\n`; output += ` • Non-zero samples: ${stats.nonZeroCount} (${stats.nonZeroPercent.toFixed(1)}%)\n\n`; }); }); if (result.paging_info && result.paging_info.totalNumberOfItems > expressions.length) { output += `**Note:** Showing ${expressions.length} of ${result.paging_info.totalNumberOfItems} total results. `; output += `Use page parameter to retrieve additional results.\n`; } return { content: [{ type: "text", text: output.trim() }] }; }
  • src/index.ts:625-630 (registration)
    Tool dispatch/registration in the CallToolRequest handler, mapping tool parameters to handler arguments.
    if (name === "get_gene_expression") { return await expressionHandlers.getGeneExpression({ geneIds: args?.gencodeId ? [args.gencodeId] : [], datasetId: args?.datasetId }); }
  • Input schema definition for the get_gene_expression tool in the ListTools response.
    name: "get_gene_expression", description: "Get gene expression data across tissues for a specific gene", 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"] }
  • TypeScript interface defining parameters for the getGeneExpression API call.
    export interface GetGeneExpressionParams { gencodeId: string[]; datasetId?: string; tissueSiteDetailId?: string[]; attributeSubset?: string; page?: number; itemsPerPage?: number; }
  • API client method that performs the HTTP request to GTEx Portal for gene expression data.
    async getGeneExpression(params: GetGeneExpressionParams): Promise<GTExApiResponse<GeneExpression[]>> { try { const queryParams = this.buildQueryParams({ gencodeId: params.gencodeId, datasetId: params.datasetId || 'gtex_v8', tissueSiteDetailId: params.tissueSiteDetailId, attributeSubset: params.attributeSubset, page: params.page || 0, itemsPerPage: params.itemsPerPage || 250 }); const response = await this.axiosInstance.get(`/expression/geneExpression?${queryParams}`); return { data: response.data.data, paging_info: response.data.paging_info }; } catch (error) { return error as GTExApiResponse<GeneExpression[]>; } }

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/Augmented-Nature/GTEx-MCP-Server'

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