@cyanheads/ensembl-mcp-server 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/AGENTS.md +383 -0
  2. package/CLAUDE.md +383 -0
  3. package/Dockerfile +99 -0
  4. package/LICENSE +201 -0
  5. package/README.md +326 -0
  6. package/changelog/0.1.x/0.1.1.md +31 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +14 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +21 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +40 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/prompts/definitions/gene-dossier.prompt.d.ts +10 -0
  17. package/dist/mcp-server/prompts/definitions/gene-dossier.prompt.d.ts.map +1 -0
  18. package/dist/mcp-server/prompts/definitions/gene-dossier.prompt.js +60 -0
  19. package/dist/mcp-server/prompts/definitions/gene-dossier.prompt.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/gene.resource.d.ts +15 -0
  21. package/dist/mcp-server/resources/definitions/gene.resource.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/gene.resource.js +59 -0
  23. package/dist/mcp-server/resources/definitions/gene.resource.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/species.resource.d.ts +15 -0
  25. package/dist/mcp-server/resources/definitions/species.resource.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/species.resource.js +48 -0
  27. package/dist/mcp-server/resources/definitions/species.resource.js.map +1 -0
  28. package/dist/mcp-server/resources/definitions/transcript.resource.d.ts +15 -0
  29. package/dist/mcp-server/resources/definitions/transcript.resource.d.ts.map +1 -0
  30. package/dist/mcp-server/resources/definitions/transcript.resource.js +53 -0
  31. package/dist/mcp-server/resources/definitions/transcript.resource.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/get-homology.tool.d.ts +43 -0
  33. package/dist/mcp-server/tools/definitions/get-homology.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/get-homology.tool.js +183 -0
  35. package/dist/mcp-server/tools/definitions/get-homology.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/get-sequence.tool.d.ts +35 -0
  37. package/dist/mcp-server/tools/definitions/get-sequence.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/get-sequence.tool.js +154 -0
  39. package/dist/mcp-server/tools/definitions/get-sequence.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/get-xrefs.tool.d.ts +28 -0
  41. package/dist/mcp-server/tools/definitions/get-xrefs.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/get-xrefs.tool.js +122 -0
  43. package/dist/mcp-server/tools/definitions/get-xrefs.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/list-species.tool.d.ts +28 -0
  45. package/dist/mcp-server/tools/definitions/list-species.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/list-species.tool.js +105 -0
  47. package/dist/mcp-server/tools/definitions/list-species.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/lookup-gene.tool.d.ts +57 -0
  49. package/dist/mcp-server/tools/definitions/lookup-gene.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/lookup-gene.tool.js +254 -0
  51. package/dist/mcp-server/tools/definitions/lookup-gene.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/predict-variant.tool.d.ts +58 -0
  53. package/dist/mcp-server/tools/definitions/predict-variant.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/predict-variant.tool.js +246 -0
  55. package/dist/mcp-server/tools/definitions/predict-variant.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/query-region.tool.d.ts +48 -0
  57. package/dist/mcp-server/tools/definitions/query-region.tool.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/query-region.tool.js +162 -0
  59. package/dist/mcp-server/tools/definitions/query-region.tool.js.map +1 -0
  60. package/dist/services/ensembl/ensembl-service.d.ts +32 -0
  61. package/dist/services/ensembl/ensembl-service.d.ts.map +1 -0
  62. package/dist/services/ensembl/ensembl-service.js +366 -0
  63. package/dist/services/ensembl/ensembl-service.js.map +1 -0
  64. package/dist/services/ensembl/types.d.ts +289 -0
  65. package/dist/services/ensembl/types.d.ts.map +1 -0
  66. package/dist/services/ensembl/types.js +6 -0
  67. package/dist/services/ensembl/types.js.map +1 -0
  68. package/package.json +106 -0
  69. package/server.json +113 -0
@@ -0,0 +1,366 @@
1
+ /**
2
+ * @fileoverview Ensembl REST API service — HTTP client, rate-limit-aware retry,
3
+ * error normalization, and typed methods per endpoint family.
4
+ * @module services/ensembl/ensembl-service
5
+ */
6
+ import { notFound, serviceUnavailable, validationError } from '@cyanheads/mcp-ts-core/errors';
7
+ import { requestContextService, withRetry } from '@cyanheads/mcp-ts-core/utils';
8
+ import { getServerConfig } from '../../config/server-config.js';
9
+ // --- Normalizers ---
10
+ function normalizeGene(raw) {
11
+ const desc = raw.description?.split('[')[0]?.trim();
12
+ return {
13
+ id: raw.id,
14
+ ...(raw.species && { species: raw.species }),
15
+ ...(raw.display_name && { displayName: raw.display_name }),
16
+ ...(desc ? { description: desc } : {}),
17
+ ...(raw.biotype && { biotype: raw.biotype }),
18
+ ...(raw.seq_region_name && { chromosome: raw.seq_region_name }),
19
+ ...(typeof raw.start === 'number' && { start: raw.start }),
20
+ ...(typeof raw.end === 'number' && { end: raw.end }),
21
+ ...(typeof raw.strand === 'number' && { strand: raw.strand }),
22
+ ...(raw.assembly_name && { assemblyName: raw.assembly_name }),
23
+ ...(raw.Transcript && {
24
+ transcripts: raw.Transcript.map((t) => ({
25
+ id: t.id,
26
+ ...(t.display_name && { displayName: t.display_name }),
27
+ ...(t.biotype && { biotype: t.biotype }),
28
+ isCanonical: t.is_canonical === 1,
29
+ ...(typeof t.start === 'number' && { start: t.start }),
30
+ ...(typeof t.end === 'number' && { end: t.end }),
31
+ ...(typeof t.strand === 'number' && { strand: t.strand }),
32
+ ...(typeof t.length === 'number' && { lengthInBp: t.length }),
33
+ })),
34
+ }),
35
+ };
36
+ }
37
+ function normalizeTranscript(raw) {
38
+ return {
39
+ id: raw.id,
40
+ ...(raw.Parent && { parentGeneId: raw.Parent }),
41
+ ...(raw.display_name && { displayName: raw.display_name }),
42
+ ...(raw.biotype && { biotype: raw.biotype }),
43
+ isCanonical: raw.is_canonical === 1,
44
+ ...(raw.species && { species: raw.species }),
45
+ ...(raw.seq_region_name && { chromosome: raw.seq_region_name }),
46
+ ...(typeof raw.start === 'number' && { start: raw.start }),
47
+ ...(typeof raw.end === 'number' && { end: raw.end }),
48
+ ...(typeof raw.strand === 'number' && { strand: raw.strand }),
49
+ ...(raw.assembly_name && { assemblyName: raw.assembly_name }),
50
+ ...(typeof raw.length === 'number' && { lengthInBp: raw.length }),
51
+ };
52
+ }
53
+ function normalizeSequence(raw, type) {
54
+ return {
55
+ id: raw.id,
56
+ type,
57
+ seq: raw.seq,
58
+ lengthInBp: raw.seq.length,
59
+ ...(raw.desc && { description: raw.desc }),
60
+ };
61
+ }
62
+ function normalizeOverlapFeature(raw) {
63
+ return {
64
+ ...(raw.id && { id: raw.id }),
65
+ ...(raw.external_name && { name: raw.external_name }),
66
+ featureType: raw.feature_type ?? 'unknown',
67
+ ...(raw.biotype && { biotype: raw.biotype }),
68
+ chromosome: raw.seq_region_name ?? '',
69
+ start: raw.start ?? 0,
70
+ end: raw.end ?? 0,
71
+ ...(typeof raw.strand === 'number' && { strand: raw.strand }),
72
+ ...(raw.description && { description: raw.description }),
73
+ ...(raw.consequence_type && { consequenceType: raw.consequence_type }),
74
+ ...(raw.clinical_significance?.length && {
75
+ clinicalSignificance: raw.clinical_significance,
76
+ }),
77
+ };
78
+ }
79
+ function normalizeVep(raw) {
80
+ return {
81
+ ...(raw.input && { input: raw.input }),
82
+ ...(raw.seq_region_name && { chromosome: raw.seq_region_name }),
83
+ ...(typeof raw.start === 'number' && { start: raw.start }),
84
+ ...(typeof raw.end === 'number' && { end: raw.end }),
85
+ ...(raw.assembly_name && { assemblyName: raw.assembly_name }),
86
+ ...(raw.most_severe_consequence && {
87
+ mostSevereConsequence: raw.most_severe_consequence,
88
+ }),
89
+ transcriptConsequences: (raw.transcript_consequences ?? []).map((tc) => ({
90
+ ...(tc.transcript_id && { transcriptId: tc.transcript_id }),
91
+ ...(tc.gene_id && { geneId: tc.gene_id }),
92
+ ...(tc.gene_symbol && { geneSymbol: tc.gene_symbol }),
93
+ consequenceTerms: tc.consequence_terms ?? [],
94
+ ...(tc.impact && { impact: tc.impact }),
95
+ ...(tc.biotype && { biotype: tc.biotype }),
96
+ ...(tc.hgvsc && { hgvsc: tc.hgvsc }),
97
+ ...(tc.hgvsp && { hgvsp: tc.hgvsp }),
98
+ ...(tc.amino_acids && { aminoAcids: tc.amino_acids }),
99
+ ...(tc.sift && { sift: tc.sift }),
100
+ ...(tc.polyphen && { polyphen: tc.polyphen }),
101
+ })),
102
+ colocatedVariants: (raw.colocated_variants ?? []).map((cv) => ({
103
+ ...(cv.id && { id: cv.id }),
104
+ ...(cv.allele_string && { alleleString: cv.allele_string }),
105
+ ...(cv.clinical_significance?.length && {
106
+ clinicalSignificance: cv.clinical_significance,
107
+ }),
108
+ ...(cv.pubmed?.length && { pubmed: cv.pubmed }),
109
+ })),
110
+ };
111
+ }
112
+ function normalizeHomology(raw, sourceId) {
113
+ const dataEntry = raw.data?.find((d) => d.id === sourceId) ?? raw.data?.[0];
114
+ if (!dataEntry?.homologies)
115
+ return [];
116
+ return dataEntry.homologies.map((h) => ({
117
+ targetId: h.target?.id ?? h.id,
118
+ ...(h.target?.species
119
+ ? { targetSpecies: h.target.species }
120
+ : h.species
121
+ ? { targetSpecies: h.species }
122
+ : {}),
123
+ ...(h.type && { type: h.type }),
124
+ ...(typeof (h.target?.perc_id ?? h.perc_id) === 'number' && {
125
+ percId: h.target?.perc_id ?? h.perc_id,
126
+ }),
127
+ ...(typeof (h.target?.perc_pos ?? h.perc_pos) === 'number' && {
128
+ percPos: h.target?.perc_pos ?? h.perc_pos,
129
+ }),
130
+ ...(h.taxonomy_level && { taxonomyLevel: h.taxonomy_level }),
131
+ }));
132
+ }
133
+ function normalizeXref(raw) {
134
+ return {
135
+ ...(raw.dbname && { dbname: raw.dbname }),
136
+ ...(raw.db_display_name && { dbDisplayName: raw.db_display_name }),
137
+ ...(raw.primary_id && { primaryId: raw.primary_id }),
138
+ ...(raw.display_id && { displayId: raw.display_id }),
139
+ ...(raw.description && { description: raw.description }),
140
+ };
141
+ }
142
+ function normalizeSpecies(raw) {
143
+ return (raw.species ?? []).map((s) => ({
144
+ name: s.name ?? '',
145
+ ...(s.display_name && { displayName: s.display_name }),
146
+ ...(s.common_name && { commonName: s.common_name }),
147
+ ...(s.taxon_id && { taxonId: s.taxon_id }),
148
+ ...(s.assembly && { assembly: s.assembly }),
149
+ ...(s.division && { division: s.division }),
150
+ }));
151
+ }
152
+ // --- Service ---
153
+ export class EnsemblService {
154
+ baseUrl;
155
+ constructor(_config, _storage) {
156
+ this.baseUrl = getServerConfig().baseUrl;
157
+ }
158
+ // --- Core fetch ---
159
+ async fetchJson(path, ctx, options) {
160
+ const url = `${this.baseUrl}${path}`;
161
+ const method = options?.method ?? 'GET';
162
+ const fetchOptions = {
163
+ method,
164
+ headers: {
165
+ Accept: 'application/json',
166
+ 'Content-Type': 'application/json',
167
+ },
168
+ signal: options?.signal ?? ctx.signal,
169
+ };
170
+ if (options?.body !== undefined) {
171
+ fetchOptions.body = JSON.stringify(options.body);
172
+ }
173
+ ctx.log.debug('Ensembl request', { url, method });
174
+ const response = await fetch(url, fetchOptions);
175
+ if (response.status === 429) {
176
+ const retryAfter = response.headers.get('Retry-After');
177
+ throw serviceUnavailable(`Ensembl rate limit exceeded.${retryAfter ? ` Retry after ${retryAfter}s.` : ''}`, { retryAfter: retryAfter ? Number(retryAfter) : undefined });
178
+ }
179
+ const text = await response.text();
180
+ // Detect HTML error pages
181
+ if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
182
+ throw serviceUnavailable('Ensembl API returned HTML instead of JSON — service may be degraded.');
183
+ }
184
+ let parsed;
185
+ try {
186
+ parsed = JSON.parse(text);
187
+ }
188
+ catch {
189
+ throw serviceUnavailable(`Ensembl API returned unparseable response.`, {
190
+ status: response.status,
191
+ });
192
+ }
193
+ // Ensembl error envelope: { error: "..." }
194
+ if (typeof parsed === 'object' &&
195
+ parsed !== null &&
196
+ 'error' in parsed &&
197
+ typeof parsed.error === 'string') {
198
+ const msg = parsed.error;
199
+ // Classify based on message content
200
+ if (/not found|not exist|does not exist|no stable id/i.test(msg)) {
201
+ throw notFound(msg);
202
+ }
203
+ if (/invalid|unrecognized|malformed|bad request/i.test(msg)) {
204
+ throw validationError(msg);
205
+ }
206
+ // Generic API error — treat as not found for ID-based lookups
207
+ throw notFound(msg);
208
+ }
209
+ if (!response.ok) {
210
+ throw serviceUnavailable(`Ensembl API returned HTTP ${response.status}.`, {
211
+ status: response.status,
212
+ });
213
+ }
214
+ return parsed;
215
+ }
216
+ // --- withRetry wrapper ---
217
+ fetchWithRetry(path, ctx, options) {
218
+ const operation = `EnsemblService.fetch:${path.split('?')[0]}`;
219
+ const reqCtx = requestContextService.createRequestContext({
220
+ operation,
221
+ parentContext: { requestId: ctx.requestId },
222
+ });
223
+ return withRetry(() => this.fetchJson(path, ctx, options), {
224
+ operation,
225
+ context: reqCtx,
226
+ baseDelayMs: 1000,
227
+ signal: ctx.signal,
228
+ });
229
+ }
230
+ // --- Gene lookup ---
231
+ async lookupGene(symbol, species, expandTranscripts, ctx) {
232
+ const expand = expandTranscripts ? '?expand=1' : '';
233
+ const path = `/lookup/symbol/${encodeURIComponent(species)}/${encodeURIComponent(symbol)}${expand}`;
234
+ const raw = await this.fetchWithRetry(path, ctx);
235
+ return normalizeGene(raw);
236
+ }
237
+ async lookupGeneById(id, expandTranscripts, ctx) {
238
+ const expand = expandTranscripts ? '?expand=1' : '';
239
+ const path = `/lookup/id/${encodeURIComponent(id)}${expand}`;
240
+ const raw = await this.fetchWithRetry(path, ctx);
241
+ return normalizeGene(raw);
242
+ }
243
+ async lookupGenesBatch(ids, expandTranscripts, ctx) {
244
+ const body = { ids };
245
+ if (expandTranscripts)
246
+ body.expand = 1;
247
+ const raw = await this.fetchWithRetry('/lookup/id', ctx, {
248
+ method: 'POST',
249
+ body,
250
+ });
251
+ const result = new Map();
252
+ for (const [k, v] of Object.entries(raw)) {
253
+ if (v)
254
+ result.set(k, normalizeGene(v));
255
+ }
256
+ return result;
257
+ }
258
+ async lookupSymbolsBatch(symbols, species, expandTranscripts, ctx) {
259
+ const body = { symbols };
260
+ if (expandTranscripts)
261
+ body.expand = 1;
262
+ const raw = await this.fetchWithRetry(`/lookup/symbol/${encodeURIComponent(species)}`, ctx, { method: 'POST', body });
263
+ const result = new Map();
264
+ for (const [k, v] of Object.entries(raw)) {
265
+ if (v)
266
+ result.set(k, normalizeGene(v));
267
+ }
268
+ return result;
269
+ }
270
+ // --- Transcript lookup ---
271
+ async lookupTranscript(id, ctx) {
272
+ const path = `/lookup/id/${encodeURIComponent(id)}`;
273
+ const raw = await this.fetchWithRetry(path, ctx);
274
+ return normalizeTranscript(raw);
275
+ }
276
+ // --- Sequence ---
277
+ async getSequenceById(id, type, ctx) {
278
+ const path = `/sequence/id/${encodeURIComponent(id)}?type=${encodeURIComponent(type)}`;
279
+ const raw = await this.fetchWithRetry(path, ctx);
280
+ return normalizeSequence(raw, type);
281
+ }
282
+ async getSequenceByRegion(species, region, expand5prime, expand3prime, ctx) {
283
+ let path = `/sequence/region/${encodeURIComponent(species)}/${encodeURIComponent(region)}`;
284
+ const params = [];
285
+ if (expand5prime > 0)
286
+ params.push(`expand_5prime=${expand5prime}`);
287
+ if (expand3prime > 0)
288
+ params.push(`expand_3prime=${expand3prime}`);
289
+ if (params.length > 0)
290
+ path += `?${params.join('&')}`;
291
+ const raw = await this.fetchWithRetry(path, ctx);
292
+ return normalizeSequence(raw, 'genomic');
293
+ }
294
+ // --- Overlap/region ---
295
+ async queryRegion(species, region, features, biotype, ctx) {
296
+ const featureParams = features.map((f) => `feature=${encodeURIComponent(f)}`).join('&');
297
+ let path = `/overlap/region/${encodeURIComponent(species)}/${encodeURIComponent(region)}?${featureParams}`;
298
+ if (biotype)
299
+ path += `&biotype=${encodeURIComponent(biotype)}`;
300
+ const raw = await this.fetchWithRetry(path, ctx);
301
+ if (!Array.isArray(raw))
302
+ return [];
303
+ return raw.map(normalizeOverlapFeature);
304
+ }
305
+ // --- VEP ---
306
+ async predictVariantHgvs(notation, species, ctx) {
307
+ const path = `/vep/${encodeURIComponent(species)}/hgvs/${encodeURIComponent(notation)}`;
308
+ const raw = await this.fetchWithRetry(path, ctx);
309
+ if (!Array.isArray(raw))
310
+ return [];
311
+ return raw.map(normalizeVep);
312
+ }
313
+ async predictVariantRegion(chr, start, end, strand, allele, species, ctx) {
314
+ const regionAllele = `${encodeURIComponent(`${chr}:${start}:${end}:${strand}`)}/${encodeURIComponent(allele)}`;
315
+ const path = `/vep/${encodeURIComponent(species)}/region/${regionAllele}`;
316
+ const raw = await this.fetchWithRetry(path, ctx);
317
+ if (!Array.isArray(raw))
318
+ return [];
319
+ return raw.map(normalizeVep);
320
+ }
321
+ // --- Homology ---
322
+ async getHomologyBySymbol(symbol, species, type, targetSpecies, ctx) {
323
+ let path = `/homology/symbol/${encodeURIComponent(species)}/${encodeURIComponent(symbol)}?type=${encodeURIComponent(type)}`;
324
+ if (targetSpecies)
325
+ path += `&target_species=${encodeURIComponent(targetSpecies)}`;
326
+ const raw = await this.fetchWithRetry(path, ctx);
327
+ return normalizeHomology(raw, symbol);
328
+ }
329
+ async getHomologyById(id, species, type, targetSpecies, ctx) {
330
+ let path = `/homology/id/${encodeURIComponent(species)}/${encodeURIComponent(id)}?type=${encodeURIComponent(type)}`;
331
+ if (targetSpecies)
332
+ path += `&target_species=${encodeURIComponent(targetSpecies)}`;
333
+ const raw = await this.fetchWithRetry(path, ctx);
334
+ return normalizeHomology(raw, id);
335
+ }
336
+ // --- Xrefs ---
337
+ async getXrefsById(id, dbname, ctx) {
338
+ let path = `/xrefs/id/${encodeURIComponent(id)}`;
339
+ if (dbname)
340
+ path += `?external_db=${encodeURIComponent(dbname)}`;
341
+ const raw = await this.fetchWithRetry(path, ctx);
342
+ if (!Array.isArray(raw))
343
+ return [];
344
+ return raw.map(normalizeXref);
345
+ }
346
+ // --- Species ---
347
+ async listSpecies(division, ctx) {
348
+ let path = '/info/species';
349
+ if (division)
350
+ path += `?division=${encodeURIComponent(division)}`;
351
+ const raw = await this.fetchWithRetry(path, ctx);
352
+ return normalizeSpecies(raw);
353
+ }
354
+ }
355
+ // --- Init/accessor pattern ---
356
+ let _service;
357
+ export function initEnsemblService(config, storage) {
358
+ _service = new EnsemblService(config, storage);
359
+ }
360
+ export function getEnsemblService() {
361
+ if (!_service) {
362
+ throw new Error('EnsemblService not initialized — call initEnsemblService() in setup()');
363
+ }
364
+ return _service;
365
+ }
366
+ //# sourceMappingURL=ensembl-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensembl-service.js","sourceRoot":"","sources":["../../../src/services/ensembl/ensembl-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,289 @@
1
+ /**
2
+ * @fileoverview Ensembl REST API response types confirmed against live API payloads.
3
+ * @module services/ensembl/types
4
+ */
5
+ export type RawGeneRecord = {
6
+ id: string;
7
+ display_name?: string;
8
+ description?: string;
9
+ biotype?: string;
10
+ species?: string;
11
+ seq_region_name?: string;
12
+ start?: number;
13
+ end?: number;
14
+ strand?: number;
15
+ assembly_name?: string;
16
+ Transcript?: RawTranscriptSummary[];
17
+ is_canonical?: number;
18
+ version?: number;
19
+ object_type?: string;
20
+ logic_name?: string;
21
+ db_type?: string;
22
+ source?: string;
23
+ };
24
+ export type RawTranscriptSummary = {
25
+ id: string;
26
+ display_name?: string;
27
+ biotype?: string;
28
+ is_canonical?: number;
29
+ start?: number;
30
+ end?: number;
31
+ strand?: number;
32
+ length?: number;
33
+ Parent?: string;
34
+ object_type?: string;
35
+ };
36
+ export type RawTranscriptRecord = {
37
+ id: string;
38
+ display_name?: string;
39
+ biotype?: string;
40
+ is_canonical?: number;
41
+ start?: number;
42
+ end?: number;
43
+ strand?: number;
44
+ length?: number;
45
+ Parent?: string;
46
+ species?: string;
47
+ seq_region_name?: string;
48
+ assembly_name?: string;
49
+ Exon?: Array<{
50
+ id: string;
51
+ start: number;
52
+ end: number;
53
+ strand: number;
54
+ }>;
55
+ object_type?: string;
56
+ db_type?: string;
57
+ source?: string;
58
+ version?: number;
59
+ };
60
+ export type RawSequenceRecord = {
61
+ id: string;
62
+ seq: string;
63
+ molecule?: string;
64
+ desc?: string;
65
+ version?: number;
66
+ query?: string;
67
+ };
68
+ export type RawOverlapFeature = {
69
+ id?: string;
70
+ external_name?: string;
71
+ biotype?: string;
72
+ feature_type?: string;
73
+ seq_region_name?: string;
74
+ start?: number;
75
+ end?: number;
76
+ strand?: number;
77
+ assembly_name?: string;
78
+ description?: string;
79
+ consequence_type?: string;
80
+ clinical_significance?: string[];
81
+ alleles?: string[];
82
+ source?: string;
83
+ };
84
+ export type RawVepTranscriptConsequence = {
85
+ transcript_id?: string;
86
+ gene_id?: string;
87
+ gene_symbol?: string;
88
+ consequence_terms?: string[];
89
+ impact?: string;
90
+ biotype?: string;
91
+ strand?: number;
92
+ amino_acids?: string;
93
+ codons?: string;
94
+ hgvsc?: string;
95
+ hgvsp?: string;
96
+ protein_id?: string;
97
+ sift?: {
98
+ prediction: string;
99
+ score: number;
100
+ };
101
+ polyphen?: {
102
+ prediction: string;
103
+ score: number;
104
+ };
105
+ };
106
+ export type RawColocatedVariant = {
107
+ id?: string;
108
+ allele_string?: string;
109
+ clinical_significance?: string[];
110
+ frequencies?: Record<string, unknown>;
111
+ pubmed?: number[];
112
+ somatic?: number;
113
+ };
114
+ export type RawVepRecord = {
115
+ input?: string;
116
+ allele_string?: string;
117
+ start?: number;
118
+ end?: number;
119
+ strand?: number;
120
+ seq_region_name?: string;
121
+ assembly_name?: string;
122
+ most_severe_consequence?: string;
123
+ transcript_consequences?: RawVepTranscriptConsequence[];
124
+ colocated_variants?: RawColocatedVariant[];
125
+ };
126
+ export type RawHomologyEntry = {
127
+ id: string;
128
+ species?: string;
129
+ type?: string;
130
+ perc_id?: number;
131
+ perc_pos?: number;
132
+ taxonomy_level?: string;
133
+ target?: {
134
+ id?: string;
135
+ species?: string;
136
+ perc_id?: number;
137
+ perc_pos?: number;
138
+ };
139
+ };
140
+ export type RawHomologyResponse = {
141
+ data?: Array<{
142
+ id: string;
143
+ homologies?: RawHomologyEntry[];
144
+ }>;
145
+ };
146
+ export type RawXrefEntry = {
147
+ dbname?: string;
148
+ db_display_name?: string;
149
+ primary_id?: string;
150
+ display_id?: string;
151
+ description?: string;
152
+ info_type?: string;
153
+ synonyms?: string[];
154
+ version?: string;
155
+ };
156
+ export type RawSpeciesInfo = {
157
+ name?: string;
158
+ display_name?: string;
159
+ common_name?: string;
160
+ taxon_id?: string;
161
+ assembly?: string;
162
+ division?: string;
163
+ groups?: string[];
164
+ aliases?: string[];
165
+ accession?: string;
166
+ strain?: string;
167
+ };
168
+ export type RawSpeciesResponse = {
169
+ species?: RawSpeciesInfo[];
170
+ };
171
+ export type EnsemblErrorEnvelope = {
172
+ error: string;
173
+ };
174
+ export type GeneRecord = {
175
+ id: string;
176
+ species?: string;
177
+ displayName?: string;
178
+ description?: string;
179
+ biotype?: string;
180
+ chromosome?: string;
181
+ start?: number;
182
+ end?: number;
183
+ strand?: number;
184
+ assemblyName?: string;
185
+ transcripts?: TranscriptSummary[];
186
+ };
187
+ export type TranscriptSummary = {
188
+ id: string;
189
+ displayName?: string;
190
+ biotype?: string;
191
+ isCanonical: boolean;
192
+ start?: number;
193
+ end?: number;
194
+ strand?: number;
195
+ lengthInBp?: number;
196
+ };
197
+ export type TranscriptRecord = {
198
+ id: string;
199
+ parentGeneId?: string;
200
+ displayName?: string;
201
+ biotype?: string;
202
+ isCanonical: boolean;
203
+ species?: string;
204
+ chromosome?: string;
205
+ start?: number;
206
+ end?: number;
207
+ strand?: number;
208
+ assemblyName?: string;
209
+ lengthInBp?: number;
210
+ };
211
+ export type SequenceRecord = {
212
+ id: string;
213
+ type: string;
214
+ seq: string;
215
+ lengthInBp: number;
216
+ description?: string;
217
+ };
218
+ export type OverlapFeature = {
219
+ id?: string;
220
+ name?: string;
221
+ featureType: string;
222
+ biotype?: string;
223
+ chromosome: string;
224
+ start: number;
225
+ end: number;
226
+ strand?: number;
227
+ description?: string;
228
+ consequenceType?: string;
229
+ clinicalSignificance?: string[];
230
+ };
231
+ export type VepConsequence = {
232
+ transcriptId?: string;
233
+ geneId?: string;
234
+ geneSymbol?: string;
235
+ consequenceTerms: string[];
236
+ impact?: string;
237
+ biotype?: string;
238
+ hgvsc?: string;
239
+ hgvsp?: string;
240
+ aminoAcids?: string;
241
+ sift?: {
242
+ prediction: string;
243
+ score: number;
244
+ };
245
+ polyphen?: {
246
+ prediction: string;
247
+ score: number;
248
+ };
249
+ };
250
+ export type ColocatedVariant = {
251
+ id?: string;
252
+ alleleString?: string;
253
+ clinicalSignificance?: string[];
254
+ pubmed?: number[];
255
+ };
256
+ export type VepRecord = {
257
+ input?: string;
258
+ chromosome?: string;
259
+ start?: number;
260
+ end?: number;
261
+ assemblyName?: string;
262
+ mostSevereConsequence?: string;
263
+ transcriptConsequences: VepConsequence[];
264
+ colocatedVariants: ColocatedVariant[];
265
+ };
266
+ export type HomologyEntry = {
267
+ targetId: string;
268
+ targetSpecies?: string;
269
+ type?: string;
270
+ percId?: number;
271
+ percPos?: number;
272
+ taxonomyLevel?: string;
273
+ };
274
+ export type XrefEntry = {
275
+ dbname?: string;
276
+ dbDisplayName?: string;
277
+ primaryId?: string;
278
+ displayId?: string;
279
+ description?: string;
280
+ };
281
+ export type SpeciesInfo = {
282
+ name: string;
283
+ displayName?: string;
284
+ commonName?: string;
285
+ taxonId?: string;
286
+ assembly?: string;
287
+ division?: string;
288
+ };
289
+ //# sourceMappingURL=types.d.ts.map