@cyanheads/interpro-mcp-server 0.0.0-stage → 0.1.2
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.
- package/AGENTS.md +376 -0
- package/CLAUDE.md +376 -0
- package/Dockerfile +186 -0
- package/LICENSE +201 -0
- package/README.md +289 -2
- package/changelog/0.1.x/0.1.1.md +20 -0
- package/changelog/0.1.x/0.1.2.md +27 -0
- package/changelog/template.md +151 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-find-proteins-by-domain.tool.d.ts +180 -0
- package/dist/mcp-server/tools/definitions/interpro-find-proteins-by-domain.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-find-proteins-by-domain.tool.js +212 -0
- package/dist/mcp-server/tools/definitions/interpro-find-proteins-by-domain.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-clan.tool.d.ts +160 -0
- package/dist/mcp-server/tools/definitions/interpro-get-clan.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-clan.tool.js +259 -0
- package/dist/mcp-server/tools/definitions/interpro-get-clan.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-entry.tool.d.ts +131 -0
- package/dist/mcp-server/tools/definitions/interpro-get-entry.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-entry.tool.js +105 -0
- package/dist/mcp-server/tools/definitions/interpro-get-entry.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-protein-domains.tool.d.ts +172 -0
- package/dist/mcp-server/tools/definitions/interpro-get-protein-domains.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-get-protein-domains.tool.js +374 -0
- package/dist/mcp-server/tools/definitions/interpro-get-protein-domains.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-list-reference.tool.d.ts +89 -0
- package/dist/mcp-server/tools/definitions/interpro-list-reference.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-list-reference.tool.js +99 -0
- package/dist/mcp-server/tools/definitions/interpro-list-reference.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-search-entries.tool.d.ts +190 -0
- package/dist/mcp-server/tools/definitions/interpro-search-entries.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/interpro-search-entries.tool.js +165 -0
- package/dist/mcp-server/tools/definitions/interpro-search-entries.tool.js.map +1 -0
- package/dist/services/interpro/budget.d.ts +26 -0
- package/dist/services/interpro/budget.d.ts.map +1 -0
- package/dist/services/interpro/budget.js +41 -0
- package/dist/services/interpro/budget.js.map +1 -0
- package/dist/services/interpro/cursors.d.ts +25 -0
- package/dist/services/interpro/cursors.d.ts.map +1 -0
- package/dist/services/interpro/cursors.js +99 -0
- package/dist/services/interpro/cursors.js.map +1 -0
- package/dist/services/interpro/description-text.d.ts +3 -0
- package/dist/services/interpro/description-text.d.ts.map +1 -0
- package/dist/services/interpro/description-text.js +179 -0
- package/dist/services/interpro/description-text.js.map +1 -0
- package/dist/services/interpro/format.d.ts +17 -0
- package/dist/services/interpro/format.d.ts.map +1 -0
- package/dist/services/interpro/format.js +130 -0
- package/dist/services/interpro/format.js.map +1 -0
- package/dist/services/interpro/http-adapter.d.ts +11 -0
- package/dist/services/interpro/http-adapter.d.ts.map +1 -0
- package/dist/services/interpro/http-adapter.js +134 -0
- package/dist/services/interpro/http-adapter.js.map +1 -0
- package/dist/services/interpro/interpro-service.d.ts +57 -0
- package/dist/services/interpro/interpro-service.d.ts.map +1 -0
- package/dist/services/interpro/interpro-service.js +284 -0
- package/dist/services/interpro/interpro-service.js.map +1 -0
- package/dist/services/interpro/reference.d.ts +31 -0
- package/dist/services/interpro/reference.d.ts.map +1 -0
- package/dist/services/interpro/reference.js +122 -0
- package/dist/services/interpro/reference.js.map +1 -0
- package/dist/services/interpro/relationships.d.ts +38 -0
- package/dist/services/interpro/relationships.d.ts.map +1 -0
- package/dist/services/interpro/relationships.js +70 -0
- package/dist/services/interpro/relationships.js.map +1 -0
- package/dist/services/interpro/routing.d.ts +24 -0
- package/dist/services/interpro/routing.d.ts.map +1 -0
- package/dist/services/interpro/routing.js +106 -0
- package/dist/services/interpro/routing.js.map +1 -0
- package/dist/services/interpro/schemas.d.ts +192 -0
- package/dist/services/interpro/schemas.d.ts.map +1 -0
- package/dist/services/interpro/schemas.js +226 -0
- package/dist/services/interpro/schemas.js.map +1 -0
- package/dist/services/interpro/upstream-errors.d.ts +43 -0
- package/dist/services/interpro/upstream-errors.d.ts.map +1 -0
- package/dist/services/interpro/upstream-errors.js +49 -0
- package/dist/services/interpro/upstream-errors.js.map +1 -0
- package/package.json +104 -4
- package/server.json +91 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Static API vocabulary and common taxonomy examples.
|
|
3
|
+
* @module services/interpro/reference
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { DOCUMENTATION_URL, ENTRY_ROUTES } from './routing.js';
|
|
7
|
+
/** Available reference topics; only release performs network operations. */
|
|
8
|
+
export const ReferenceTopicSchema = z
|
|
9
|
+
.enum(['databases', 'entry_types', 'accession_patterns', 'taxa', 'release'])
|
|
10
|
+
.describe('Reference topic; release retrieves current upstream metadata.');
|
|
11
|
+
/** Applicable reference fields, without fabricated empty annotations. */
|
|
12
|
+
export const ReferenceItemSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
id: z.string().describe('Reference identifier.'),
|
|
15
|
+
label: z.string().describe('Human-readable label.'),
|
|
16
|
+
description: z.string().optional().describe('Meaning and coverage.'),
|
|
17
|
+
sourceDatabase: z.string().optional().describe('Entry API database slug.'),
|
|
18
|
+
accessionPattern: z.string().optional().describe('Case-insensitive accession routing pattern.'),
|
|
19
|
+
example: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Example accession spelling; assignment is not guaranteed.'),
|
|
23
|
+
taxonId: z.string().optional().describe('NCBI taxonomy identifier.'),
|
|
24
|
+
})
|
|
25
|
+
.describe('One reference vocabulary item.');
|
|
26
|
+
const databaseLabels = {
|
|
27
|
+
interpro: 'InterPro',
|
|
28
|
+
pfam: 'Pfam',
|
|
29
|
+
prosite: 'PROSITE patterns',
|
|
30
|
+
profile: 'PROSITE profiles',
|
|
31
|
+
smart: 'SMART',
|
|
32
|
+
cdd: 'CDD',
|
|
33
|
+
panther: 'PANTHER',
|
|
34
|
+
cathgene3d: 'CATH-Gene3D',
|
|
35
|
+
ssf: 'SUPERFAMILY',
|
|
36
|
+
ncbifam: 'NCBIFAM',
|
|
37
|
+
hamap: 'HAMAP',
|
|
38
|
+
prints: 'PRINTS',
|
|
39
|
+
pirsf: 'PIRSF',
|
|
40
|
+
sfld: 'SFLD',
|
|
41
|
+
antifam: 'AntiFam',
|
|
42
|
+
};
|
|
43
|
+
const types = [
|
|
44
|
+
['domain', 'Domain', 'A distinct structural or functional protein unit.'],
|
|
45
|
+
['family', 'Family', 'A group of evolutionarily related proteins.'],
|
|
46
|
+
['repeat', 'Repeat', 'A repeated sequence or structural unit.'],
|
|
47
|
+
[
|
|
48
|
+
'homologous_superfamily',
|
|
49
|
+
'Homologous superfamily',
|
|
50
|
+
'Proteins or domains with a shared evolutionary origin.',
|
|
51
|
+
],
|
|
52
|
+
['active_site', 'Active site', 'Residues involved in catalysis.'],
|
|
53
|
+
['binding_site', 'Binding site', 'Residues involved in binding.'],
|
|
54
|
+
['conserved_site', 'Conserved site', 'A conserved functional sequence site.'],
|
|
55
|
+
['ptm', 'Post-translational modification', 'A post-translational modification site.'],
|
|
56
|
+
[
|
|
57
|
+
'region',
|
|
58
|
+
'Region',
|
|
59
|
+
'A sequence region; AntiFam signatures of spurious protein predictions use this type.',
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
'coiled_coil',
|
|
63
|
+
'Coiled coil',
|
|
64
|
+
'A coiled-coil region, where alpha-helices wind around each other.',
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
'disordered',
|
|
68
|
+
'Disordered region',
|
|
69
|
+
'An intrinsically disordered region without a fixed three-dimensional structure.',
|
|
70
|
+
],
|
|
71
|
+
];
|
|
72
|
+
const taxa = [
|
|
73
|
+
['9606', 'Human'],
|
|
74
|
+
['10090', 'Mouse'],
|
|
75
|
+
['10116', 'Rat'],
|
|
76
|
+
['7955', 'Zebrafish'],
|
|
77
|
+
['7227', 'Fruit fly'],
|
|
78
|
+
['6239', 'Nematode'],
|
|
79
|
+
['559292', 'Budding yeast'],
|
|
80
|
+
['3702', 'Arabidopsis'],
|
|
81
|
+
['562', 'Escherichia coli'],
|
|
82
|
+
];
|
|
83
|
+
/** Return bounded local reference data without making upstream requests. */
|
|
84
|
+
export function staticReference(topic) {
|
|
85
|
+
if (topic === 'entry_types')
|
|
86
|
+
return {
|
|
87
|
+
items: types.map(([id, label, description]) => ({ id, label, description })),
|
|
88
|
+
sourceUrls: [DOCUMENTATION_URL],
|
|
89
|
+
};
|
|
90
|
+
if (topic === 'taxa')
|
|
91
|
+
return {
|
|
92
|
+
items: taxa.map(([taxonId, label]) => ({
|
|
93
|
+
id: taxonId,
|
|
94
|
+
label,
|
|
95
|
+
taxonId,
|
|
96
|
+
description: 'Common taxonomy example; this is not an exhaustive taxonomy.',
|
|
97
|
+
})),
|
|
98
|
+
sourceUrls: [DOCUMENTATION_URL, 'https://www.ncbi.nlm.nih.gov/taxonomy'],
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
items: ENTRY_ROUTES.map(({ source, pattern, example }) => ({
|
|
102
|
+
id: source,
|
|
103
|
+
label: databaseLabels[source],
|
|
104
|
+
sourceDatabase: source,
|
|
105
|
+
accessionPattern: pattern.source,
|
|
106
|
+
example,
|
|
107
|
+
description: topic === 'accession_patterns'
|
|
108
|
+
? 'Routing syntax does not guarantee that an accession is assigned.'
|
|
109
|
+
: source === 'interpro'
|
|
110
|
+
? 'Integrating database combining member signatures.'
|
|
111
|
+
: source === 'antifam'
|
|
112
|
+
? 'Additional API source for spurious protein predictions.'
|
|
113
|
+
: source === 'prosite'
|
|
114
|
+
? 'PROSITE pattern signatures; profiles use the profile route.'
|
|
115
|
+
: source === 'profile'
|
|
116
|
+
? 'PROSITE profile signatures; patterns use the prosite route.'
|
|
117
|
+
: 'Member-database signatures exposed through the InterPro entry API.',
|
|
118
|
+
})),
|
|
119
|
+
sourceUrls: [DOCUMENTATION_URL],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference.js","sourceRoot":"","sources":["../../../src/services/interpro/reference.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Deterministic, whole-record slices of a clan relationship graph.
|
|
3
|
+
* @module services/interpro/relationships
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
/** The graph InterPro attaches to set metadata: node and link records plus any additional fields. */
|
|
7
|
+
export declare const RelationshipGraphSchema: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
8
|
+
nodes: z.ZodArray<z.ZodJSONSchema>;
|
|
9
|
+
links: z.ZodArray<z.ZodJSONSchema>;
|
|
10
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>;
|
|
11
|
+
/** A relationship graph as supplied, or null/absent when InterPro supplied none. */
|
|
12
|
+
type RelationshipGraph = z.infer<typeof RelationshipGraphSchema>;
|
|
13
|
+
/**
|
|
14
|
+
* Order nodes by accession and links by source, target, and method, so an offset addresses the
|
|
15
|
+
* same record on every call whatever order the upstream arrays arrive in.
|
|
16
|
+
*/
|
|
17
|
+
export declare function orderRelationships(graph: RelationshipGraph): RelationshipGraph;
|
|
18
|
+
/**
|
|
19
|
+
* The `count` whole records starting at `offset` in the sequence of every node followed by every
|
|
20
|
+
* link, as a graph of the upstream shape, with the page block that locates it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function sliceRelationships(graph: RelationshipGraph, offset: number, count: number): {
|
|
23
|
+
relationships: {
|
|
24
|
+
nodes: z.JSONType[];
|
|
25
|
+
links: z.JSONType[];
|
|
26
|
+
} | null | undefined;
|
|
27
|
+
page: {
|
|
28
|
+
totalNodes: number;
|
|
29
|
+
totalLinks: number;
|
|
30
|
+
offset: number;
|
|
31
|
+
returnedNodes: number;
|
|
32
|
+
returnedLinks: number;
|
|
33
|
+
hasMore: boolean;
|
|
34
|
+
nextOffset?: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=relationships.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../../../src/services/interpro/relationships.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAM3C,qGAAqG;AACrG,eAAO,MAAM,uBAAuB;;;uCAIvB,CAAC;AACd,oFAAoF;AACpF,KAAK,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAmBjE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;;;;;EAuBzF"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Deterministic, whole-record slices of a clan relationship graph.
|
|
3
|
+
* @module services/interpro/relationships
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { compareText, cursorScope } from './cursors.js';
|
|
7
|
+
import { JsonValueSchema } from './schemas.js';
|
|
8
|
+
/** The graph InterPro attaches to set metadata: node and link records plus any additional fields. */
|
|
9
|
+
export const RelationshipGraphSchema = z
|
|
10
|
+
.object({ nodes: z.array(JsonValueSchema), links: z.array(JsonValueSchema) })
|
|
11
|
+
.catchall(JsonValueSchema)
|
|
12
|
+
.nullable()
|
|
13
|
+
.optional();
|
|
14
|
+
const field = (record, key) => {
|
|
15
|
+
if (!record || typeof record !== 'object' || Array.isArray(record))
|
|
16
|
+
return '';
|
|
17
|
+
const value = record[key];
|
|
18
|
+
return typeof value === 'string' ? value : '';
|
|
19
|
+
};
|
|
20
|
+
/** Sort by the named string fields in turn; canonical JSON breaks any remaining tie. */
|
|
21
|
+
function ordered(records, keys) {
|
|
22
|
+
return records.toSorted((a, b) => {
|
|
23
|
+
for (const key of keys) {
|
|
24
|
+
const difference = compareText(field(a, key), field(b, key));
|
|
25
|
+
if (difference)
|
|
26
|
+
return difference;
|
|
27
|
+
}
|
|
28
|
+
return compareText(cursorScope(a), cursorScope(b));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Order nodes by accession and links by source, target, and method, so an offset addresses the
|
|
33
|
+
* same record on every call whatever order the upstream arrays arrive in.
|
|
34
|
+
*/
|
|
35
|
+
export function orderRelationships(graph) {
|
|
36
|
+
return (graph && {
|
|
37
|
+
...graph,
|
|
38
|
+
nodes: ordered(graph.nodes, ['accession']),
|
|
39
|
+
links: ordered(graph.links, ['source', 'target', 'method']),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The `count` whole records starting at `offset` in the sequence of every node followed by every
|
|
44
|
+
* link, as a graph of the upstream shape, with the page block that locates it.
|
|
45
|
+
*/
|
|
46
|
+
export function sliceRelationships(graph, offset, count) {
|
|
47
|
+
const nodes = graph?.nodes ?? [];
|
|
48
|
+
const links = graph?.links ?? [];
|
|
49
|
+
const total = nodes.length + links.length;
|
|
50
|
+
const start = Math.min(offset, total);
|
|
51
|
+
const end = Math.min(start + count, total);
|
|
52
|
+
const slice = {
|
|
53
|
+
nodes: nodes.slice(Math.min(start, nodes.length), Math.min(end, nodes.length)),
|
|
54
|
+
links: links.slice(Math.max(0, start - nodes.length), Math.max(0, end - nodes.length)),
|
|
55
|
+
};
|
|
56
|
+
const hasMore = end < total;
|
|
57
|
+
return {
|
|
58
|
+
relationships: graph && { ...graph, ...slice },
|
|
59
|
+
page: {
|
|
60
|
+
totalNodes: nodes.length,
|
|
61
|
+
totalLinks: links.length,
|
|
62
|
+
offset,
|
|
63
|
+
returnedNodes: slice.nodes.length,
|
|
64
|
+
returnedLinks: slice.links.length,
|
|
65
|
+
hasMore,
|
|
66
|
+
...(hasMore ? { nextOffset: end } : {}),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships.js","sourceRoot":"","sources":["../../../src/services/interpro/relationships.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,qGAAqG;AACrG,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC;KACrC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;KAC5E,QAAQ,CAAC,eAAe,CAAC;KACzB,QAAQ,EAAE;KACV,QAAQ,EAAE,CAAC;AAId,MAAM,KAAK,GAAG,CAAC,MAAiB,EAAE,GAAW,EAAU,EAAE;IACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC,CAAC;AAEF,wFAAwF;AACxF,SAAS,OAAO,CAAC,OAA6B,EAAE,IAAuB;IACrE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,UAAU;gBAAE,OAAO,UAAU,CAAC;QACpC,CAAC;QACD,OAAO,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,OAAO,CACL,KAAK,IAAI;QACP,GAAG,KAAK;QACR,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;KAC5D,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAwB,EAAE,MAAc,EAAE,KAAa;IACxF,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG;QACZ,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9E,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;KACvF,CAAC;IACF,MAAM,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC;IAC5B,OAAO;QACL,aAAa,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE;QAC9C,IAAI,EAAE;YACJ,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,MAAM;YACN,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACjC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YACjC,OAAO;YACP,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SourceDatabase } from './schemas.js';
|
|
2
|
+
/** Canonical API origin; no upstream continuation URL is fetched directly. */
|
|
3
|
+
export declare const API_BASE = "https://www.ebi.ac.uk/interpro/api/";
|
|
4
|
+
/** Official reference documentation. */
|
|
5
|
+
export declare const DOCUMENTATION_URL = "https://interpro-documentation.readthedocs.io/en/latest/api.html";
|
|
6
|
+
/** Routing patterns and examples are shared with the reference vocabulary. */
|
|
7
|
+
export declare const ENTRY_ROUTES: readonly {
|
|
8
|
+
source: SourceDatabase;
|
|
9
|
+
pattern: RegExp;
|
|
10
|
+
example: string;
|
|
11
|
+
}[];
|
|
12
|
+
/** Resolve one entry accession without guessing alternate databases after a miss. */
|
|
13
|
+
export declare function resolveEntry(accession: string, sourceDatabase?: SourceDatabase): {
|
|
14
|
+
accession: string;
|
|
15
|
+
sourceDatabase: SourceDatabase;
|
|
16
|
+
};
|
|
17
|
+
/** Resolve case-sensitive CL clan prefixes, with explicit source disambiguation. */
|
|
18
|
+
export declare function resolveClan(accession: string, sourceDatabase?: 'pfam' | 'cdd' | 'pirsf'): {
|
|
19
|
+
accession: string;
|
|
20
|
+
sourceDatabase: 'pfam' | 'cdd' | 'pirsf';
|
|
21
|
+
};
|
|
22
|
+
/** Build fixed-origin requests from independently validated, encoded path segments. */
|
|
23
|
+
export declare function apiUrl(segments: readonly string[], query?: Readonly<Record<string, string | number | boolean | undefined>>): string;
|
|
24
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/services/interpro/routing.ts"],"names":[],"mappings":"AAKA,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAEpE,8EAA8E;AAC9E,eAAO,MAAM,QAAQ,wCAAwC,CAAC;AAC9D,wCAAwC;AACxC,eAAO,MAAM,iBAAiB,qEAAqE,CAAC;AACpG,8EAA8E;AAC9E,eAAO,MAAM,YAAY,EAAE,SAAS;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAiB7F,CAAC;AAGJ,qFAAqF;AACrF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,cAAc,GAC9B;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,cAAc,CAAA;CAAE,CAiCvD;AACD,oFAAoF;AACpF,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GACxC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAA;CAAE,CA2CjE;AACD,uFAAuF;AACvF,wBAAgB,MAAM,CACpB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAM,GAC1E,MAAM,CAMR"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Validated accession routing and fixed-origin InterPro URLs.
|
|
3
|
+
* @module services/interpro/routing
|
|
4
|
+
*/
|
|
5
|
+
import { notFound, validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
6
|
+
import { AccessionSchema } from './schemas.js';
|
|
7
|
+
/** Canonical API origin; no upstream continuation URL is fetched directly. */
|
|
8
|
+
export const API_BASE = 'https://www.ebi.ac.uk/interpro/api/';
|
|
9
|
+
/** Official reference documentation. */
|
|
10
|
+
export const DOCUMENTATION_URL = 'https://interpro-documentation.readthedocs.io/en/latest/api.html';
|
|
11
|
+
/** Routing patterns and examples are shared with the reference vocabulary. */
|
|
12
|
+
export const ENTRY_ROUTES = [
|
|
13
|
+
{ source: 'interpro', pattern: /^IPR\d{6}$/i, example: 'IPR011615' },
|
|
14
|
+
{ source: 'pfam', pattern: /^PF\d{5}$/i, example: 'PF00870' },
|
|
15
|
+
{ source: 'prosite', pattern: /^PS00\d{3}$/i, example: 'PS00107' },
|
|
16
|
+
{ source: 'profile', pattern: /^PS5\d{4}$/i, example: 'PS50011' },
|
|
17
|
+
{ source: 'smart', pattern: /^SM\d{5}$/i, example: 'SM00220' },
|
|
18
|
+
{ source: 'cdd', pattern: /^cd\d+$/i, example: 'cd08367' },
|
|
19
|
+
{ source: 'panther', pattern: /^PTHR\d+(?::SF\d+)?$/i, example: 'PTHR11447' },
|
|
20
|
+
{ source: 'cathgene3d', pattern: /^G3DSA:\d+\.\d+\.\d+\.\d+$/i, example: 'G3DSA:3.30.200.20' },
|
|
21
|
+
{ source: 'ssf', pattern: /^SSF\d+$/i, example: 'SSF56112' },
|
|
22
|
+
{ source: 'ncbifam', pattern: /^(?:TIGR|NF)\d+$/i, example: 'TIGR00001' },
|
|
23
|
+
{ source: 'hamap', pattern: /^MF_\d+$/i, example: 'MF_00001' },
|
|
24
|
+
{ source: 'prints', pattern: /^PR\d+$/i, example: 'PR00386' },
|
|
25
|
+
{ source: 'pirsf', pattern: /^PIRSF\d+$/i, example: 'PIRSF000047' },
|
|
26
|
+
{ source: 'sfld', pattern: /^SFLD[A-Z]?\d+$/i, example: 'SFLDF00001' },
|
|
27
|
+
{ source: 'antifam', pattern: /^ANF\d+$/i, example: 'ANF00001' },
|
|
28
|
+
];
|
|
29
|
+
/** Pfam clan (`CL`) and CDD superfamily (`cl`) accessions name sets, never entries. */
|
|
30
|
+
const CLAN_PATTERN = /^cl\d+$/i;
|
|
31
|
+
/** Resolve one entry accession without guessing alternate databases after a miss. */
|
|
32
|
+
export function resolveEntry(accession, sourceDatabase) {
|
|
33
|
+
const safe = AccessionSchema.parse(accession);
|
|
34
|
+
if (CLAN_PATTERN.test(safe))
|
|
35
|
+
throw notFound(`${safe} is a set accession, not an entry accession.`, {
|
|
36
|
+
reason: 'entry_not_found',
|
|
37
|
+
retryable: false,
|
|
38
|
+
accession: safe,
|
|
39
|
+
recovery: {
|
|
40
|
+
hint: 'Call interpro_get_clan with this accession to read the set and its member entries.',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
const inferred = ENTRY_ROUTES.find((route) => route.pattern.test(safe))?.source;
|
|
44
|
+
if (inferred && sourceDatabase && inferred !== sourceDatabase)
|
|
45
|
+
throw validationError(`Accession ${safe} routes to sourceDatabase ${inferred} by its prefix, not ${sourceDatabase}.`, {
|
|
46
|
+
reason: 'database_mismatch',
|
|
47
|
+
retryable: false,
|
|
48
|
+
accession: safe,
|
|
49
|
+
sourceDatabase,
|
|
50
|
+
inferredSourceDatabase: inferred,
|
|
51
|
+
});
|
|
52
|
+
const source = sourceDatabase ?? inferred;
|
|
53
|
+
if (!source)
|
|
54
|
+
throw validationError(`Accession ${safe} matches no standard prefix, and no sourceDatabase was supplied.`, { reason: 'accession_source_unknown', retryable: false, accession: safe });
|
|
55
|
+
return {
|
|
56
|
+
accession: inferred ? (source === 'cdd' ? safe.toLowerCase() : safe.toUpperCase()) : safe,
|
|
57
|
+
sourceDatabase: source,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Resolve case-sensitive CL clan prefixes, with explicit source disambiguation. */
|
|
61
|
+
export function resolveClan(accession, sourceDatabase) {
|
|
62
|
+
const safe = AccessionSchema.parse(accession);
|
|
63
|
+
const isCl = CLAN_PATTERN.test(safe);
|
|
64
|
+
const isPirsf = /^PIRSF\d+$/i.test(safe);
|
|
65
|
+
const inferred = /^CL\d+$/.test(safe)
|
|
66
|
+
? 'pfam'
|
|
67
|
+
: /^cl\d+$/.test(safe)
|
|
68
|
+
? 'cdd'
|
|
69
|
+
: isPirsf
|
|
70
|
+
? 'pirsf'
|
|
71
|
+
: undefined;
|
|
72
|
+
if ((isPirsf && sourceDatabase && sourceDatabase !== 'pirsf') ||
|
|
73
|
+
(isCl && sourceDatabase === 'pirsf'))
|
|
74
|
+
throw validationError(`Set accession ${safe} routes to sourceDatabase ${inferred ?? 'pfam or cdd'} by its prefix, not ${sourceDatabase}.`, {
|
|
75
|
+
reason: 'database_mismatch',
|
|
76
|
+
retryable: false,
|
|
77
|
+
accession: safe,
|
|
78
|
+
sourceDatabase,
|
|
79
|
+
...(inferred ? { inferredSourceDatabase: inferred } : {}),
|
|
80
|
+
});
|
|
81
|
+
const source = sourceDatabase ?? inferred;
|
|
82
|
+
if (!source)
|
|
83
|
+
throw validationError(isCl
|
|
84
|
+
? `Set accession ${safe} has a mixed-case CL prefix, which can name a Pfam or CDD set, and no sourceDatabase was supplied.`
|
|
85
|
+
: `Set accession ${safe} matches no set prefix, and no sourceDatabase was supplied.`, { reason: 'accession_source_unknown', retryable: false, accession: safe });
|
|
86
|
+
return {
|
|
87
|
+
accession: isCl
|
|
88
|
+
? source === 'cdd'
|
|
89
|
+
? safe.toLowerCase()
|
|
90
|
+
: safe.toUpperCase()
|
|
91
|
+
: inferred
|
|
92
|
+
? safe.toUpperCase()
|
|
93
|
+
: safe,
|
|
94
|
+
sourceDatabase: source,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Build fixed-origin requests from independently validated, encoded path segments. */
|
|
98
|
+
export function apiUrl(segments, query = {}) {
|
|
99
|
+
const path = segments.map((part) => encodeURIComponent(AccessionSchema.parse(part))).join('/');
|
|
100
|
+
const url = new URL(`${path}${path ? '/' : ''}`, API_BASE);
|
|
101
|
+
for (const [key, value] of Object.entries(query))
|
|
102
|
+
if (value !== undefined)
|
|
103
|
+
url.searchParams.set(key, String(value));
|
|
104
|
+
return url.href;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/services/interpro/routing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAEpE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,QAAQ,GAAG,qCAAqC,CAAC;AAC9D,wCAAwC;AACxC,MAAM,CAAC,MAAM,iBAAiB,GAAG,kEAAkE,CAAC;AACpG,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GACvB;IACE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE;IACpE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE;IAC7D,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;IAClE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE;IACjE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE;IAC9D,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE;IAC1D,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,WAAW,EAAE;IAC7E,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,mBAAmB,EAAE;IAC9F,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;IAC5D,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE;IACzE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;IAC9D,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE;IAC7D,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,EAAE;IACnE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE;IACtE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;CACjE,CAAC;AACJ,uFAAuF;AACvF,MAAM,YAAY,GAAG,UAAU,CAAC;AAChC,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,cAA+B;IAE/B,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,MAAM,QAAQ,CAAC,GAAG,IAAI,8CAA8C,EAAE;YACpE,MAAM,EAAE,iBAAiB;YACzB,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,oFAAoF;aAC3F;SACF,CAAC,CAAC;IACL,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC;IAChF,IAAI,QAAQ,IAAI,cAAc,IAAI,QAAQ,KAAK,cAAc;QAC3D,MAAM,eAAe,CACnB,aAAa,IAAI,6BAA6B,QAAQ,uBAAuB,cAAc,GAAG,EAC9F;YACE,MAAM,EAAE,mBAAmB;YAC3B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI;YACf,cAAc;YACd,sBAAsB,EAAE,QAAQ;SACjC,CACF,CAAC;IACJ,MAAM,MAAM,GAAG,cAAc,IAAI,QAAQ,CAAC;IAC1C,IAAI,CAAC,MAAM;QACT,MAAM,eAAe,CACnB,aAAa,IAAI,kEAAkE,EACnF,EAAE,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAC1E,CAAC;IACJ,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;QACzF,cAAc,EAAE,MAAM;KACvB,CAAC;AACJ,CAAC;AACD,oFAAoF;AACpF,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,cAAyC;IAEzC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YACpB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,OAAO;gBACP,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,CAAC;IAClB,IACE,CAAC,OAAO,IAAI,cAAc,IAAI,cAAc,KAAK,OAAO,CAAC;QACzD,CAAC,IAAI,IAAI,cAAc,KAAK,OAAO,CAAC;QAEpC,MAAM,eAAe,CACnB,iBAAiB,IAAI,6BAA6B,QAAQ,IAAI,aAAa,uBAAuB,cAAc,GAAG,EACnH;YACE,MAAM,EAAE,mBAAmB;YAC3B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI;YACf,cAAc;YACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CACF,CAAC;IACJ,MAAM,MAAM,GAAG,cAAc,IAAI,QAAQ,CAAC;IAC1C,IAAI,CAAC,MAAM;QACT,MAAM,eAAe,CACnB,IAAI;YACF,CAAC,CAAC,iBAAiB,IAAI,oGAAoG;YAC3H,CAAC,CAAC,iBAAiB,IAAI,6DAA6D,EACtF,EAAE,MAAM,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAC1E,CAAC;IACJ,OAAO;QACL,SAAS,EAAE,IAAI;YACb,CAAC,CAAC,MAAM,KAAK,KAAK;gBAChB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;YACtB,CAAC,CAAC,QAAQ;gBACR,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;gBACpB,CAAC,CAAC,IAAI;QACV,cAAc,EAAE,MAAM;KACvB,CAAC;AACJ,CAAC;AACD,uFAAuF;AACvF,MAAM,UAAU,MAAM,CACpB,QAA2B,EAC3B,KAAK,GAAoE,EAAE;IAE3E,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Lossless InterPro wire schemas and shared input vocabulary.
|
|
3
|
+
* @module services/interpro/schemas
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
/** JSON values retained verbatim from upstream records. */
|
|
7
|
+
export declare const JsonValueSchema: z.ZodJSONSchema;
|
|
8
|
+
/** An upstream object with every additional JSON field retained. */
|
|
9
|
+
export declare const JsonObjectSchema: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
|
|
10
|
+
/** Supported entry API routes, including separate PROSITE pattern and profile routes. */
|
|
11
|
+
export declare const SourceDatabaseSchema: z.ZodEnum<{
|
|
12
|
+
antifam: "antifam";
|
|
13
|
+
cathgene3d: "cathgene3d";
|
|
14
|
+
cdd: "cdd";
|
|
15
|
+
hamap: "hamap";
|
|
16
|
+
interpro: "interpro";
|
|
17
|
+
ncbifam: "ncbifam";
|
|
18
|
+
panther: "panther";
|
|
19
|
+
pfam: "pfam";
|
|
20
|
+
pirsf: "pirsf";
|
|
21
|
+
prints: "prints";
|
|
22
|
+
profile: "profile";
|
|
23
|
+
prosite: "prosite";
|
|
24
|
+
sfld: "sfld";
|
|
25
|
+
smart: "smart";
|
|
26
|
+
ssf: "ssf";
|
|
27
|
+
}>;
|
|
28
|
+
/** Entry annotation categories. */
|
|
29
|
+
export declare const EntryTypeSchema: z.ZodEnum<{
|
|
30
|
+
active_site: "active_site";
|
|
31
|
+
binding_site: "binding_site";
|
|
32
|
+
coiled_coil: "coiled_coil";
|
|
33
|
+
conserved_site: "conserved_site";
|
|
34
|
+
disordered: "disordered";
|
|
35
|
+
domain: "domain";
|
|
36
|
+
family: "family";
|
|
37
|
+
homologous_superfamily: "homologous_superfamily";
|
|
38
|
+
ptm: "ptm";
|
|
39
|
+
region: "region";
|
|
40
|
+
repeat: "repeat";
|
|
41
|
+
}>;
|
|
42
|
+
/** A validated database route. */
|
|
43
|
+
export type SourceDatabase = z.infer<typeof SourceDatabaseSchema>;
|
|
44
|
+
/** Form clients may submit blank optional strings. */
|
|
45
|
+
export declare const optionalString: <T extends z.ZodType>(schema: T) => z.ZodPreprocess<z.ZodOptional<T>, unknown>;
|
|
46
|
+
/** A blank string takes the `.default()` that `schema` declares, as an omitted one does. */
|
|
47
|
+
export declare const defaultedString: <T extends z.ZodType>(schema: T) => z.ZodPreprocess<T, unknown>;
|
|
48
|
+
/** Safe identifiers are encoded as a single path segment after validation. */
|
|
49
|
+
export declare const AccessionSchema: z.ZodString;
|
|
50
|
+
/**
|
|
51
|
+
* Whether an upstream value is exactly an accession, the only form server-written text may name
|
|
52
|
+
* it in. The schema trims, so a value padded with blank lines must not pass as one.
|
|
53
|
+
*/
|
|
54
|
+
export declare const isAccession: (value: unknown) => value is string;
|
|
55
|
+
/** Canonical UniProt accessions exclude isoform suffixes. */
|
|
56
|
+
export declare const ProteinAccessionSchema: z.ZodString;
|
|
57
|
+
/** GO annotation returned by InterPro. */
|
|
58
|
+
export declare const GoTermSchema: z.ZodObject<{
|
|
59
|
+
identifier: z.ZodString;
|
|
60
|
+
name: z.ZodString;
|
|
61
|
+
category: z.ZodObject<{
|
|
62
|
+
code: z.ZodString;
|
|
63
|
+
name: z.ZodString;
|
|
64
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
65
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
66
|
+
/** Sparse list metadata; only routing fields are required. */
|
|
67
|
+
export declare const EntrySummarySchema: z.ZodObject<{
|
|
68
|
+
accession: z.ZodString;
|
|
69
|
+
source_database: z.ZodString;
|
|
70
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
71
|
+
type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
72
|
+
integrated: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
73
|
+
member_databases: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>>;
|
|
74
|
+
go_terms: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
75
|
+
identifier: z.ZodString;
|
|
76
|
+
name: z.ZodString;
|
|
77
|
+
category: z.ZodObject<{
|
|
78
|
+
code: z.ZodString;
|
|
79
|
+
name: z.ZodString;
|
|
80
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
81
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>>;
|
|
82
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
83
|
+
/** Detail metadata differs from summary metadata: names are objects. */
|
|
84
|
+
export declare const EntryMetadataSchema: z.ZodObject<{
|
|
85
|
+
accession: z.ZodString;
|
|
86
|
+
source_database: z.ZodString;
|
|
87
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
88
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
89
|
+
short: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
90
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>;
|
|
91
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
92
|
+
/** Detail-only output adds readable text without changing upstream description fields. */
|
|
93
|
+
export declare const EntryDetailMetadataSchema: z.ZodObject<{
|
|
94
|
+
accession: z.ZodString;
|
|
95
|
+
source_database: z.ZodString;
|
|
96
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
97
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
98
|
+
short: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
99
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>;
|
|
100
|
+
descriptionText: z.ZodOptional<z.ZodString>;
|
|
101
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
102
|
+
/** Complete location fragments retain discontinuity and arbitrary annotations. */
|
|
103
|
+
export declare const LocationSchema: z.ZodObject<{
|
|
104
|
+
fragments: z.ZodArray<z.ZodObject<{
|
|
105
|
+
start: z.ZodNumber;
|
|
106
|
+
end: z.ZodNumber;
|
|
107
|
+
'dc-status': z.ZodOptional<z.ZodString>;
|
|
108
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
109
|
+
representative: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
110
|
+
model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
111
|
+
score: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
112
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
113
|
+
/** Protein metadata preserves omitted annotations and additional source fields. */
|
|
114
|
+
export declare const ProteinMetadataSchema: z.ZodObject<{
|
|
115
|
+
accession: z.ZodString;
|
|
116
|
+
length: z.ZodNumber;
|
|
117
|
+
source_database: z.ZodString;
|
|
118
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
119
|
+
gene: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
120
|
+
source_organism: z.ZodOptional<z.ZodObject<{
|
|
121
|
+
taxId: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
122
|
+
scientificName: z.ZodString;
|
|
123
|
+
fullName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
124
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
125
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
126
|
+
/** Protein match rows retain complete nested source records. */
|
|
127
|
+
export declare const MatchSchema: z.ZodObject<{
|
|
128
|
+
metadata: z.ZodObject<{
|
|
129
|
+
accession: z.ZodString;
|
|
130
|
+
source_database: z.ZodString;
|
|
131
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
132
|
+
type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
133
|
+
integrated: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
134
|
+
member_databases: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>>;
|
|
135
|
+
go_terms: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodObject<{
|
|
136
|
+
identifier: z.ZodString;
|
|
137
|
+
name: z.ZodString;
|
|
138
|
+
category: z.ZodObject<{
|
|
139
|
+
code: z.ZodString;
|
|
140
|
+
name: z.ZodString;
|
|
141
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
142
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>>;
|
|
143
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
144
|
+
proteins: z.ZodArray<z.ZodObject<{
|
|
145
|
+
accession: z.ZodString;
|
|
146
|
+
entry_protein_locations: z.ZodArray<z.ZodObject<{
|
|
147
|
+
fragments: z.ZodArray<z.ZodObject<{
|
|
148
|
+
start: z.ZodNumber;
|
|
149
|
+
end: z.ZodNumber;
|
|
150
|
+
'dc-status': z.ZodOptional<z.ZodString>;
|
|
151
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
152
|
+
representative: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
153
|
+
model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
154
|
+
score: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
155
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
156
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
157
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
158
|
+
/** Feature-keyed extra annotations, not a protein detail envelope. */
|
|
159
|
+
export declare const ExtraFeaturesSchema: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
160
|
+
accession: z.ZodString;
|
|
161
|
+
source_database: z.ZodString;
|
|
162
|
+
locations: z.ZodArray<z.ZodObject<{
|
|
163
|
+
fragments: z.ZodArray<z.ZodObject<{
|
|
164
|
+
start: z.ZodNumber;
|
|
165
|
+
end: z.ZodNumber;
|
|
166
|
+
'dc-status': z.ZodOptional<z.ZodString>;
|
|
167
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
168
|
+
representative: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
169
|
+
model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
170
|
+
score: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
171
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
172
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>;
|
|
173
|
+
/** Standard list envelope; callers select the operation-specific row schema. */
|
|
174
|
+
export declare const listSchema: <T extends z.ZodType>(row: T) => z.ZodObject<{
|
|
175
|
+
count: z.ZodNumber;
|
|
176
|
+
next: z.ZodNullable<z.ZodString>;
|
|
177
|
+
previous: z.ZodNullable<z.ZodString>;
|
|
178
|
+
results: z.ZodArray<T>;
|
|
179
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
180
|
+
/** Detail response envelope. */
|
|
181
|
+
export declare const detailSchema: <T extends z.ZodType>(metadata: T) => z.ZodObject<{
|
|
182
|
+
metadata: T;
|
|
183
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
184
|
+
/** Server-owned page metadata. */
|
|
185
|
+
export declare const PageSchema: z.ZodObject<{
|
|
186
|
+
total: z.ZodNumber;
|
|
187
|
+
returned: z.ZodNumber;
|
|
188
|
+
limit: z.ZodNumber;
|
|
189
|
+
hasMore: z.ZodBoolean;
|
|
190
|
+
nextCursor: z.ZodOptional<z.ZodString>;
|
|
191
|
+
}, z.core.$strip>;
|
|
192
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/services/interpro/schemas.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAE3C,2DAA2D;AAC3D,eAAO,MAAM,eAAe,iBAAiD,CAAC;AAC9E,oEAAoE;AACpE,eAAO,MAAM,gBAAgB,2CAEgB,CAAC;AAC9C,yFAAyF;AACzF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;EAkBe,CAAC;AACjD,mCAAmC;AACnC,eAAO,MAAM,eAAe;;;;;;;;;;;;EAcS,CAAC;AACtC,kCAAkC;AAClC,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAIlE,sDAAsD;AACtD,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC,+CACjB,CAAC;AAC7C,4FAA4F;AAC5F,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC,gCAAoC,CAAC;AACnG,8EAA8E;AAC9E,eAAO,MAAM,eAAe,aAOyC,CAAC;AACtE;;;GAGG;AACH,eAAO,MAAM,WAAW,UAAW,OAAO,KAAG,KAAK,IAAI,MACwB,CAAC;AAC/E,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,aAIyD,CAAC;AAC7F,0CAA0C;AAC1C,eAAO,MAAM,YAAY;;;;;;;qCAaI,CAAC;AAC9B,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;qCAcH,CAAC;AAC7B,wEAAwE;AACxE,eAAO,MAAM,mBAAmB;;;;;;;qCAcJ,CAAC;AAC7B,0FAA0F;AAC1F,eAAO,MAAM,yBAAyB;;;;;;;;qCAOpC,CAAC;AACH,kFAAkF;AAClF,eAAO,MAAM,cAAc;;;;;;;;;qCAqBqB,CAAC;AACjD,mFAAmF;AACnF,eAAO,MAAM,qBAAqB;;;;;;;;;;;qCAsBN,CAAC;AAC7B,gEAAgE;AAChE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAmBI,CAAC;AAC7B,sEAAsE;AACtE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;sCAS/B,CAAC;AACF,gFAAgF;AAChF,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC;;;;;qCAQxB,CAAC;AAC/B,gCAAgC;AAChC,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,YAAY,CAAC;;qCACqC,CAAC;AACnG,kCAAkC;AAClC,eAAO,MAAM,UAAU;;;;;;iBAarB,CAAC"}
|