@cyanheads/interpro-mcp-server 0.0.0-stage → 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.
- package/AGENTS.md +375 -0
- package/CLAUDE.md +375 -0
- package/Dockerfile +186 -0
- package/LICENSE +201 -0
- package/README.md +263 -2
- package/changelog/0.1.x/0.1.1.md +20 -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 +177 -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 +192 -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 +130 -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 +100 -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 +184 -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 +155 -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/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 +182 -0
- package/dist/services/interpro/schemas.d.ts.map +1 -0
- package/dist/services/interpro/schemas.js +215 -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 +103 -4
- package/server.json +85 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Clan metadata, budget-bounded relationship slices, and paged members.
|
|
3
|
+
* @module mcp-server/tools/definitions/interpro-get-clan.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { BUDGET_LABEL, fitWithinBudget } from '../../../services/interpro/budget.js';
|
|
8
|
+
import { continuation, decodeCursor, encodeCursor, pageGuidance, } from '../../../services/interpro/cursors.js';
|
|
9
|
+
import { formatInterpro, normalizeImages, projectWikipediaThumbnails, } from '../../../services/interpro/format.js';
|
|
10
|
+
import { getInterproService } from '../../../services/interpro/interpro-service.js';
|
|
11
|
+
import { orderRelationships, RelationshipGraphSchema, sliceRelationships, } from '../../../services/interpro/relationships.js';
|
|
12
|
+
import { resolveClan } from '../../../services/interpro/routing.js';
|
|
13
|
+
import { AccessionSchema, detailSchema, EntrySummarySchema, JsonValueSchema, listSchema, optionalString, PageSchema, } from '../../../services/interpro/schemas.js';
|
|
14
|
+
import { UPSTREAM_ERRORS } from '../../../services/interpro/upstream-errors.js';
|
|
15
|
+
const MAX_LIMIT = 100;
|
|
16
|
+
const ClanSourceSchema = z.enum(['pfam', 'cdd', 'pirsf']).describe('Set database.');
|
|
17
|
+
const ClanMetadataSchema = z
|
|
18
|
+
.object({
|
|
19
|
+
accession: z.string().describe('Upstream set accession.'),
|
|
20
|
+
source_database: z.string().describe('Upstream set database.'),
|
|
21
|
+
})
|
|
22
|
+
.catchall(JsonValueSchema);
|
|
23
|
+
const MemberSchema = z
|
|
24
|
+
.object({
|
|
25
|
+
metadata: EntrySummarySchema.describe('Complete member entry metadata.'),
|
|
26
|
+
sets: z.array(JsonValueSchema).describe('Complete upstream set associations.'),
|
|
27
|
+
})
|
|
28
|
+
.catchall(JsonValueSchema);
|
|
29
|
+
const RelationshipsPageSchema = z.object({
|
|
30
|
+
totalNodes: z.number().int().nonnegative().describe('Nodes in the complete graph.'),
|
|
31
|
+
totalLinks: z.number().int().nonnegative().describe('Links in the complete graph.'),
|
|
32
|
+
offset: z
|
|
33
|
+
.number()
|
|
34
|
+
.int()
|
|
35
|
+
.nonnegative()
|
|
36
|
+
.describe('Requested relationshipOffset: position of the first returned item among every node sorted by accession, followed by every link sorted by source, target, and method.'),
|
|
37
|
+
returnedNodes: z.number().int().nonnegative().describe('Nodes in this slice.'),
|
|
38
|
+
returnedLinks: z.number().int().nonnegative().describe('Links in this slice.'),
|
|
39
|
+
hasMore: z.boolean().describe('Whether nodes or links remain after this slice.'),
|
|
40
|
+
nextOffset: z
|
|
41
|
+
.number()
|
|
42
|
+
.int()
|
|
43
|
+
.nonnegative()
|
|
44
|
+
.optional()
|
|
45
|
+
.describe('relationshipOffset of the next slice; present only when hasMore is true.'),
|
|
46
|
+
});
|
|
47
|
+
/** Retrieve one clan and a page of members under one shared deadline. */
|
|
48
|
+
export const interproGetClan = tool('interpro_get_clan', {
|
|
49
|
+
title: 'InterPro clan metadata and members',
|
|
50
|
+
description: 'Retrieve a Pfam, CDD, or PIRSF clan/set and a cursor page of member entries; optionally include its relationship graph, returned in slices that fit the response budget and paged with relationshipOffset.',
|
|
51
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
52
|
+
auth: ['tool:interpro_get_clan:read'],
|
|
53
|
+
input: z.object({
|
|
54
|
+
accession: AccessionSchema.describe('Set accession, such as CL0016 (Pfam), cl21453 (CDD), or PIRSF000047; no URL syntax.'),
|
|
55
|
+
sourceDatabase: optionalString(ClanSourceSchema).describe('Inferred from uppercase CL (Pfam), lowercase cl (CDD), or PIRSF; supply explicitly for mixed-case CL prefixes.'),
|
|
56
|
+
includeRelationships: z
|
|
57
|
+
.boolean()
|
|
58
|
+
.default(false)
|
|
59
|
+
.describe('Include the relationship graph, one slice per call that fits the response budget; defaults to false.'),
|
|
60
|
+
relationshipOffset: z
|
|
61
|
+
.number()
|
|
62
|
+
.int()
|
|
63
|
+
.min(0)
|
|
64
|
+
.default(0)
|
|
65
|
+
.describe('Position of the first relationship item to return, counting nodes, then links; defaults to 0. A value above 0 requires includeRelationships: true; pass relationshipsPage.nextOffset to continue.'),
|
|
66
|
+
includeThumbnail: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.default(false)
|
|
69
|
+
.describe('Include each Wikipedia thumbnail image, base64 data often tens of KB; defaults to false.'),
|
|
70
|
+
limit: z
|
|
71
|
+
.number()
|
|
72
|
+
.int()
|
|
73
|
+
.min(1)
|
|
74
|
+
.max(MAX_LIMIT)
|
|
75
|
+
.default(20)
|
|
76
|
+
.describe('Member page size from 1 to 100; defaults to 20.'),
|
|
77
|
+
cursor: optionalString(z.string().trim().max(4096)).describe('Opaque nextCursor with unchanged accession, sourceDatabase, and includeRelationships; limit, relationshipOffset, and includeThumbnail may change.'),
|
|
78
|
+
}),
|
|
79
|
+
output: z.object({
|
|
80
|
+
accession: z.string().describe('Canonical requested clan accession.'),
|
|
81
|
+
sourceDatabase: ClanSourceSchema,
|
|
82
|
+
clan: ClanMetadataSchema.describe('Complete metadata, with relationships and Wikipedia thumbnails omitted unless requested; requested relationships hold the slice relationshipsPage locates.'),
|
|
83
|
+
relationshipsIncluded: z.boolean().describe('Whether relationship projection was requested.'),
|
|
84
|
+
relationshipsPage: RelationshipsPageSchema.optional().describe('Position and totals of the relationship slice; present only when includeRelationships is true.'),
|
|
85
|
+
members: z
|
|
86
|
+
.array(MemberSchema.describe('Complete upstream member record.'))
|
|
87
|
+
.describe('Complete upstream member records.'),
|
|
88
|
+
page: PageSchema.describe('Member continuation and total.'),
|
|
89
|
+
url: z.string().describe('Canonical InterPro clan website URL.'),
|
|
90
|
+
sourceUrl: z.string().describe('Official clan metadata API source URL.'),
|
|
91
|
+
}),
|
|
92
|
+
enrichment: {
|
|
93
|
+
notice: z
|
|
94
|
+
.string()
|
|
95
|
+
.optional()
|
|
96
|
+
.describe('Next relationship slice call, omitted relationships or thumbnails, or empty-page guidance.'),
|
|
97
|
+
totalCount: z.number().optional().describe('Total matching members.'),
|
|
98
|
+
truncated: z.boolean().optional().describe('More members remain.'),
|
|
99
|
+
shown: z.number().int().optional().describe('Members returned in this page.'),
|
|
100
|
+
cap: z.number().int().optional().describe('Requested member page size.'),
|
|
101
|
+
effectiveQuery: z
|
|
102
|
+
.string()
|
|
103
|
+
.optional()
|
|
104
|
+
.describe('Applied canonical target, relationship, and thumbnail selection.'),
|
|
105
|
+
},
|
|
106
|
+
errors: [
|
|
107
|
+
{
|
|
108
|
+
reason: 'database_mismatch',
|
|
109
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
110
|
+
when: 'Explicit database conflicts with accession routing.',
|
|
111
|
+
retryable: false,
|
|
112
|
+
recovery: 'Retry interpro_get_clan with sourceDatabase pfam for uppercase CL, cdd for lowercase cl, or pirsf for PIRSF; supply pfam or cdd explicitly for mixed-case CL prefixes.',
|
|
113
|
+
thrownBy: 'service',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
reason: 'accession_source_unknown',
|
|
117
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
118
|
+
when: 'Accession has no inferred or explicit database.',
|
|
119
|
+
retryable: false,
|
|
120
|
+
recovery: 'Retry interpro_get_clan with sourceDatabase pfam for uppercase CL, cdd for lowercase cl, or pirsf for PIRSF; supply pfam or cdd explicitly for mixed-case CL prefixes.',
|
|
121
|
+
thrownBy: 'service',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
reason: 'relationships_not_requested',
|
|
125
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
126
|
+
when: 'relationshipOffset above 0 is supplied without includeRelationships: true; 0 is accepted as a no-op.',
|
|
127
|
+
retryable: false,
|
|
128
|
+
recovery: 'Repeat interpro_get_clan with includeRelationships: true to page the relationship graph, or omit relationshipOffset.',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
reason: 'clan_not_found',
|
|
132
|
+
code: JsonRpcErrorCode.NotFound,
|
|
133
|
+
when: 'Set metadata returns 204 or 404.',
|
|
134
|
+
retryable: false,
|
|
135
|
+
recovery: 'Read set_info with interpro_get_entry, then retry interpro_get_clan with that accession and database.',
|
|
136
|
+
thrownBy: 'service',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
reason: 'entry_withdrawn',
|
|
140
|
+
code: JsonRpcErrorCode.NotFound,
|
|
141
|
+
when: 'Entry or set returns 410.',
|
|
142
|
+
retryable: false,
|
|
143
|
+
recovery: 'Call interpro_search_entries for a current replacement; consult interpro_list_reference with topic databases for source names.',
|
|
144
|
+
thrownBy: 'service',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
reason: 'invalid_cursor',
|
|
148
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
149
|
+
when: 'Cursor decoding or scope fails, or upstream rejects continuation.',
|
|
150
|
+
retryable: false,
|
|
151
|
+
recovery: 'Repeat the same tool without cursor to restart pagination, keeping the intended filters.',
|
|
152
|
+
thrownBy: 'service',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
reason: 'upstream_shape_invalid',
|
|
156
|
+
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
157
|
+
when: 'Upstream JSON, structure, or continuation is incompatible.',
|
|
158
|
+
retryable: false,
|
|
159
|
+
recovery: 'Retry the same tool later; call interpro_list_reference with topic release to check upstream availability.',
|
|
160
|
+
thrownBy: 'service',
|
|
161
|
+
},
|
|
162
|
+
...UPSTREAM_ERRORS,
|
|
163
|
+
],
|
|
164
|
+
async handler(input, ctx) {
|
|
165
|
+
if (input.relationshipOffset > 0 && !input.includeRelationships)
|
|
166
|
+
throw ctx.fail('relationships_not_requested', `relationshipOffset ${input.relationshipOffset} pages the relationship graph, which this call did not request.`);
|
|
167
|
+
const target = resolveClan(input.accession, input.sourceDatabase);
|
|
168
|
+
// includeThumbnail shapes only the clan metadata reread on every page, so it stays out of scope.
|
|
169
|
+
const scope = { ...target, includeRelationships: input.includeRelationships };
|
|
170
|
+
const cursor = decodeCursor(input.cursor, 'interpro_get_clan', scope);
|
|
171
|
+
const service = getInterproService();
|
|
172
|
+
const call = service.begin(ctx);
|
|
173
|
+
const detail = await service.request(call, ['set', target.sourceDatabase, target.accession], {}, detailSchema(ClanMetadataSchema), { missing: { reason: 'clan_not_found', ...target } });
|
|
174
|
+
if (!detail.data)
|
|
175
|
+
throw ctx.fail('upstream_shape_invalid', 'Clan metadata response is missing.');
|
|
176
|
+
const response = await service.request(call, ['entry', target.sourceDatabase, 'set', target.sourceDatabase, target.accession], { page_size: input.limit, cursor }, listSchema(MemberSchema), { continuation: cursor !== undefined });
|
|
177
|
+
const thumbnails = projectWikipediaThumbnails(detail.data.metadata, input.includeThumbnail, 'interpro_get_clan');
|
|
178
|
+
const { relationships: graph, ...clan } = normalizeImages(thumbnails.metadata);
|
|
179
|
+
const members = normalizeImages(response.data?.results ?? []);
|
|
180
|
+
const next = continuation(response.data?.next ?? null, new Set(cursor ? [cursor] : []));
|
|
181
|
+
const page = {
|
|
182
|
+
total: response.data?.count ?? 0,
|
|
183
|
+
returned: members.length,
|
|
184
|
+
limit: input.limit,
|
|
185
|
+
hasMore: next !== undefined,
|
|
186
|
+
...(next ? { nextCursor: encodeCursor('interpro_get_clan', scope, next) } : {}),
|
|
187
|
+
};
|
|
188
|
+
ctx.enrich.total(page.total);
|
|
189
|
+
ctx.enrich.echo(JSON.stringify({ ...scope, includeThumbnail: input.includeThumbnail }));
|
|
190
|
+
const result = (clanValue, relationshipsPage) => ({
|
|
191
|
+
...target,
|
|
192
|
+
clan: clanValue,
|
|
193
|
+
relationshipsIncluded: input.includeRelationships,
|
|
194
|
+
...(relationshipsPage ? { relationshipsPage } : {}),
|
|
195
|
+
members,
|
|
196
|
+
page,
|
|
197
|
+
url: `https://www.ebi.ac.uk/interpro/set/${target.sourceDatabase}/${encodeURIComponent(target.accession)}/`,
|
|
198
|
+
sourceUrl: detail.sourceUrl,
|
|
199
|
+
});
|
|
200
|
+
const notices = [];
|
|
201
|
+
let output = result(clan);
|
|
202
|
+
if (!input.includeRelationships)
|
|
203
|
+
notices.push('Relationships are omitted; set includeRelationships=true to page the relationship graph.');
|
|
204
|
+
else {
|
|
205
|
+
const parsed = RelationshipGraphSchema.safeParse(graph);
|
|
206
|
+
if (!parsed.success)
|
|
207
|
+
throw ctx.fail('upstream_shape_invalid', 'Clan relationships lack node and link arrays.');
|
|
208
|
+
const ordered = orderRelationships(parsed.data);
|
|
209
|
+
const offset = input.relationshipOffset;
|
|
210
|
+
const total = (ordered?.nodes.length ?? 0) + (ordered?.links.length ?? 0);
|
|
211
|
+
const sliceAt = (count) => sliceRelationships(ordered, offset, count);
|
|
212
|
+
const withSlice = ({ relationships, page: slicePage }) => result(relationships === undefined ? clan : { ...clan, relationships }, slicePage);
|
|
213
|
+
const fit = fitWithinBudget(Math.max(0, total - offset), (n) => withSlice(sliceAt(n)));
|
|
214
|
+
const slice = sliceAt(fit.count);
|
|
215
|
+
output = fit.output;
|
|
216
|
+
const { totalNodes, totalLinks, returnedNodes, returnedLinks, nextOffset } = slice.page;
|
|
217
|
+
if (!total)
|
|
218
|
+
notices.push('InterPro returned no relationship nodes or links for this clan.');
|
|
219
|
+
else if (offset >= total)
|
|
220
|
+
notices.push(`relationshipOffset ${offset} is past the end of the relationship graph (${totalNodes} nodes and ${totalLinks} links, ${total} items); repeat interpro_get_clan with a relationshipOffset below ${total}, or 0 to start over.`);
|
|
221
|
+
if (fit.oversized) {
|
|
222
|
+
const roomier = [
|
|
223
|
+
...(input.includeThumbnail ? ['includeThumbnail: false'] : []),
|
|
224
|
+
...(input.limit > 1 ? ['a smaller limit'] : []),
|
|
225
|
+
];
|
|
226
|
+
notices.push(`The clan metadata and member page leave no room in the ${BUDGET_LABEL}, so this slice holds one item and exceeds it${roomier.length ? `; repeat with ${roomier.join(' or ')} for larger slices` : ''}.`);
|
|
227
|
+
}
|
|
228
|
+
if (nextOffset !== undefined) {
|
|
229
|
+
const nextCall = {
|
|
230
|
+
accession: target.accession,
|
|
231
|
+
sourceDatabase: target.sourceDatabase,
|
|
232
|
+
includeRelationships: true,
|
|
233
|
+
relationshipOffset: nextOffset,
|
|
234
|
+
limit: input.limit,
|
|
235
|
+
...(input.includeThumbnail ? { includeThumbnail: true } : {}),
|
|
236
|
+
...(input.cursor ? { cursor: input.cursor } : {}),
|
|
237
|
+
};
|
|
238
|
+
notices.push(`This relationship slice holds items ${offset} to ${nextOffset - 1} of ${total}, nodes first, then links (${returnedNodes} of ${totalNodes} nodes, ${returnedLinks} of ${totalLinks} links). Continue with interpro_get_clan ${JSON.stringify(nextCall)}${input.limit > 1 ? '; a smaller limit leaves more of the response budget to each slice' : ''}.`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (thumbnails.notice)
|
|
242
|
+
notices.push(thumbnails.notice);
|
|
243
|
+
if (!members.length)
|
|
244
|
+
notices.push('This member page is empty; the clan metadata remains available.');
|
|
245
|
+
if (next) {
|
|
246
|
+
notices.push(pageGuidance('interpro_get_clan', 'members', input.limit, MAX_LIMIT));
|
|
247
|
+
ctx.enrich.truncated({
|
|
248
|
+
shown: members.length,
|
|
249
|
+
cap: input.limit,
|
|
250
|
+
guidance: notices.join(' '),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
else if (notices.length)
|
|
254
|
+
ctx.enrich.notice(notices.join(' '));
|
|
255
|
+
return output;
|
|
256
|
+
},
|
|
257
|
+
format: formatInterpro,
|
|
258
|
+
});
|
|
259
|
+
//# sourceMappingURL=interpro-get-clan.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpro-get-clan.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/interpro-get-clan.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Complete InterPro and member entry metadata.
|
|
3
|
+
* @module mcp-server/tools/definitions/interpro-get-entry.tool
|
|
4
|
+
*/
|
|
5
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
/** Retrieve one complete entry with deterministic accession routing. */
|
|
8
|
+
export declare const interproGetEntry: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
9
|
+
accession: z.ZodString;
|
|
10
|
+
sourceDatabase: z.ZodPreprocess<z.ZodOptional<z.ZodEnum<{
|
|
11
|
+
antifam: "antifam";
|
|
12
|
+
cathgene3d: "cathgene3d";
|
|
13
|
+
cdd: "cdd";
|
|
14
|
+
hamap: "hamap";
|
|
15
|
+
interpro: "interpro";
|
|
16
|
+
ncbifam: "ncbifam";
|
|
17
|
+
panther: "panther";
|
|
18
|
+
pfam: "pfam";
|
|
19
|
+
pirsf: "pirsf";
|
|
20
|
+
prints: "prints";
|
|
21
|
+
profile: "profile";
|
|
22
|
+
prosite: "prosite";
|
|
23
|
+
sfld: "sfld";
|
|
24
|
+
smart: "smart";
|
|
25
|
+
ssf: "ssf";
|
|
26
|
+
}>>, unknown>;
|
|
27
|
+
includeThumbnail: z.ZodDefault<z.ZodBoolean>;
|
|
28
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
29
|
+
accession: z.ZodString;
|
|
30
|
+
sourceDatabase: z.ZodEnum<{
|
|
31
|
+
antifam: "antifam";
|
|
32
|
+
cathgene3d: "cathgene3d";
|
|
33
|
+
cdd: "cdd";
|
|
34
|
+
hamap: "hamap";
|
|
35
|
+
interpro: "interpro";
|
|
36
|
+
ncbifam: "ncbifam";
|
|
37
|
+
panther: "panther";
|
|
38
|
+
pfam: "pfam";
|
|
39
|
+
pirsf: "pirsf";
|
|
40
|
+
prints: "prints";
|
|
41
|
+
profile: "profile";
|
|
42
|
+
prosite: "prosite";
|
|
43
|
+
sfld: "sfld";
|
|
44
|
+
smart: "smart";
|
|
45
|
+
ssf: "ssf";
|
|
46
|
+
}>;
|
|
47
|
+
entry: z.ZodObject<{
|
|
48
|
+
accession: z.ZodString;
|
|
49
|
+
source_database: z.ZodString;
|
|
50
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
51
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
52
|
+
short: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
53
|
+
}, z.core.$catchall<z.ZodJSONSchema>>>>;
|
|
54
|
+
}, z.core.$catchall<z.ZodJSONSchema>>;
|
|
55
|
+
url: z.ZodString;
|
|
56
|
+
sourceUrl: z.ZodString;
|
|
57
|
+
}, z.core.$strip>, readonly [{
|
|
58
|
+
readonly reason: "database_mismatch";
|
|
59
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
60
|
+
readonly when: "Explicit database conflicts with accession routing.";
|
|
61
|
+
readonly retryable: false;
|
|
62
|
+
readonly recovery: "Call interpro_list_reference with topic accession_patterns, then retry with the matching sourceDatabase.";
|
|
63
|
+
readonly thrownBy: "service";
|
|
64
|
+
}, {
|
|
65
|
+
readonly reason: "accession_source_unknown";
|
|
66
|
+
readonly code: JsonRpcErrorCode.ValidationError;
|
|
67
|
+
readonly when: "Accession has no inferred or explicit database.";
|
|
68
|
+
readonly retryable: false;
|
|
69
|
+
readonly recovery: "Call interpro_list_reference with topic accession_patterns, or supply the sourceDatabase reported by interpro_search_entries.";
|
|
70
|
+
readonly thrownBy: "service";
|
|
71
|
+
}, {
|
|
72
|
+
readonly reason: "entry_not_found";
|
|
73
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
74
|
+
readonly when: "Entry detail returns 204 or 404, or the accession is a set accession.";
|
|
75
|
+
readonly retryable: false;
|
|
76
|
+
readonly recovery: "Call interpro_search_entries in the correct database, or interpro_list_reference with topic accession_patterns.";
|
|
77
|
+
readonly thrownBy: "service";
|
|
78
|
+
}, {
|
|
79
|
+
readonly reason: "entry_withdrawn";
|
|
80
|
+
readonly code: JsonRpcErrorCode.NotFound;
|
|
81
|
+
readonly when: "Entry or set returns 410.";
|
|
82
|
+
readonly retryable: false;
|
|
83
|
+
readonly recovery: "Call interpro_search_entries for a current replacement; consult interpro_list_reference with topic databases for source names.";
|
|
84
|
+
readonly thrownBy: "service";
|
|
85
|
+
}, {
|
|
86
|
+
readonly reason: "upstream_shape_invalid";
|
|
87
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
88
|
+
readonly when: "Upstream JSON, structure, or continuation is incompatible.";
|
|
89
|
+
readonly retryable: false;
|
|
90
|
+
readonly recovery: "Retry the same tool later; call interpro_list_reference with topic release to check upstream availability.";
|
|
91
|
+
readonly thrownBy: "service";
|
|
92
|
+
}, {
|
|
93
|
+
readonly reason: 'upstream_response_too_large';
|
|
94
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
95
|
+
readonly when: 'An upstream response exceeds 4 MiB.';
|
|
96
|
+
readonly retryable: false;
|
|
97
|
+
readonly recovery: 'Retry list tools with a smaller limit, or retrieve individual members with interpro_get_entry instead of a large clan.';
|
|
98
|
+
readonly thrownBy: 'service';
|
|
99
|
+
}, {
|
|
100
|
+
readonly reason: 'upstream_rejected';
|
|
101
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
102
|
+
readonly when: 'InterPro returns an unhandled redirect or client rejection.';
|
|
103
|
+
readonly retryable: false;
|
|
104
|
+
readonly recovery: 'Retry the same tool later; call interpro_list_reference with topic release to check upstream availability.';
|
|
105
|
+
readonly thrownBy: 'service';
|
|
106
|
+
}, {
|
|
107
|
+
readonly reason: 'upstream_unavailable';
|
|
108
|
+
readonly code: JsonRpcErrorCode.ServiceUnavailable;
|
|
109
|
+
readonly when: 'InterPro has a network or server failure; HTTP 501 is not retryable.';
|
|
110
|
+
readonly retryable: true;
|
|
111
|
+
readonly recovery: 'Retry the same tool later; call interpro_list_reference with topic release to check upstream availability.';
|
|
112
|
+
readonly thrownBy: 'service';
|
|
113
|
+
}, {
|
|
114
|
+
readonly reason: 'upstream_timeout';
|
|
115
|
+
readonly code: JsonRpcErrorCode.Timeout;
|
|
116
|
+
readonly when: 'InterPro returns HTTP 408/504 or an attempt exceeds its deadline.';
|
|
117
|
+
readonly retryable: true;
|
|
118
|
+
readonly recovery: 'Retry with a smaller limit where available, then repeat the same tool after waiting.';
|
|
119
|
+
readonly thrownBy: 'service';
|
|
120
|
+
}, {
|
|
121
|
+
readonly reason: 'upstream_rate_limited';
|
|
122
|
+
readonly code: JsonRpcErrorCode.RateLimited;
|
|
123
|
+
readonly when: 'InterPro returns HTTP 429.';
|
|
124
|
+
readonly retryable: true;
|
|
125
|
+
readonly recovery: 'Wait for retryAfter when supplied, then repeat the same tool with fewer concurrent calls.';
|
|
126
|
+
readonly thrownBy: 'service';
|
|
127
|
+
}], {
|
|
128
|
+
readonly notice: z.ZodOptional<z.ZodString>;
|
|
129
|
+
}>;
|
|
130
|
+
//# sourceMappingURL=interpro-get-entry.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpro-get-entry.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/interpro-get-entry.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAiBjE,wEAAwE;AACxE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6G3B,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Complete InterPro and member entry metadata.
|
|
3
|
+
* @module mcp-server/tools/definitions/interpro-get-entry.tool
|
|
4
|
+
*/
|
|
5
|
+
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { formatInterpro, normalizeImages, projectWikipediaThumbnails, } from '../../../services/interpro/format.js';
|
|
8
|
+
import { getInterproService } from '../../../services/interpro/interpro-service.js';
|
|
9
|
+
import { resolveEntry } from '../../../services/interpro/routing.js';
|
|
10
|
+
import { AccessionSchema, detailSchema, EntryMetadataSchema, optionalString, SourceDatabaseSchema, } from '../../../services/interpro/schemas.js';
|
|
11
|
+
import { UPSTREAM_ERRORS } from '../../../services/interpro/upstream-errors.js';
|
|
12
|
+
/** Retrieve one complete entry with deterministic accession routing. */
|
|
13
|
+
export const interproGetEntry = tool('interpro_get_entry', {
|
|
14
|
+
title: 'InterPro entry metadata',
|
|
15
|
+
description: 'Retrieve one InterPro or member-database entry, including description, hierarchy, member signatures, GO terms, literature, cross-references, clan membership, and coverage counters.',
|
|
16
|
+
annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
|
|
17
|
+
auth: ['tool:interpro_get_entry:read'],
|
|
18
|
+
input: z.object({
|
|
19
|
+
accession: AccessionSchema.describe('InterPro or member-database entry accession, such as IPR011615 or PF00870; no URL syntax.'),
|
|
20
|
+
sourceDatabase: optionalString(SourceDatabaseSchema).describe('Database slug; inferred from standard accession prefixes when omitted.'),
|
|
21
|
+
includeThumbnail: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.default(false)
|
|
24
|
+
.describe('Include each Wikipedia thumbnail image, base64 data often hundreds of KB; defaults to false.'),
|
|
25
|
+
}),
|
|
26
|
+
output: z.object({
|
|
27
|
+
accession: z.string().describe('Canonical requested accession.'),
|
|
28
|
+
sourceDatabase: SourceDatabaseSchema,
|
|
29
|
+
entry: EntryMetadataSchema.describe('Complete upstream metadata, preserving sparse annotations; Wikipedia thumbnails are omitted unless includeThumbnail is true.'),
|
|
30
|
+
url: z.string().describe('Canonical InterPro website URL.'),
|
|
31
|
+
sourceUrl: z.string().describe('Official API source URL.'),
|
|
32
|
+
}),
|
|
33
|
+
enrichment: {
|
|
34
|
+
notice: z
|
|
35
|
+
.string()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('Omitted Wikipedia thumbnail size and how to include it.'),
|
|
38
|
+
},
|
|
39
|
+
errors: [
|
|
40
|
+
{
|
|
41
|
+
reason: 'database_mismatch',
|
|
42
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
43
|
+
when: 'Explicit database conflicts with accession routing.',
|
|
44
|
+
retryable: false,
|
|
45
|
+
recovery: 'Call interpro_list_reference with topic accession_patterns, then retry with the matching sourceDatabase.',
|
|
46
|
+
thrownBy: 'service',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
reason: 'accession_source_unknown',
|
|
50
|
+
code: JsonRpcErrorCode.ValidationError,
|
|
51
|
+
when: 'Accession has no inferred or explicit database.',
|
|
52
|
+
retryable: false,
|
|
53
|
+
recovery: 'Call interpro_list_reference with topic accession_patterns, or supply the sourceDatabase reported by interpro_search_entries.',
|
|
54
|
+
thrownBy: 'service',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
reason: 'entry_not_found',
|
|
58
|
+
code: JsonRpcErrorCode.NotFound,
|
|
59
|
+
when: 'Entry detail returns 204 or 404, or the accession is a set accession.',
|
|
60
|
+
retryable: false,
|
|
61
|
+
recovery: 'Call interpro_search_entries in the correct database, or interpro_list_reference with topic accession_patterns.',
|
|
62
|
+
thrownBy: 'service',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
reason: 'entry_withdrawn',
|
|
66
|
+
code: JsonRpcErrorCode.NotFound,
|
|
67
|
+
when: 'Entry or set returns 410.',
|
|
68
|
+
retryable: false,
|
|
69
|
+
recovery: 'Call interpro_search_entries for a current replacement; consult interpro_list_reference with topic databases for source names.',
|
|
70
|
+
thrownBy: 'service',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
reason: 'upstream_shape_invalid',
|
|
74
|
+
code: JsonRpcErrorCode.ServiceUnavailable,
|
|
75
|
+
when: 'Upstream JSON, structure, or continuation is incompatible.',
|
|
76
|
+
retryable: false,
|
|
77
|
+
recovery: 'Retry the same tool later; call interpro_list_reference with topic release to check upstream availability.',
|
|
78
|
+
thrownBy: 'service',
|
|
79
|
+
},
|
|
80
|
+
...UPSTREAM_ERRORS,
|
|
81
|
+
],
|
|
82
|
+
async handler(input, ctx) {
|
|
83
|
+
const target = resolveEntry(input.accession, input.sourceDatabase);
|
|
84
|
+
const service = getInterproService();
|
|
85
|
+
const response = await service.request(service.begin(ctx), ['entry', target.sourceDatabase, target.accession], {}, detailSchema(EntryMetadataSchema), { missing: { reason: 'entry_not_found', ...target } });
|
|
86
|
+
if (!response.data)
|
|
87
|
+
throw ctx.fail('upstream_shape_invalid', 'Entry metadata response is missing.');
|
|
88
|
+
const { metadata, notice } = projectWikipediaThumbnails(response.data.metadata, input.includeThumbnail, 'interpro_get_entry');
|
|
89
|
+
if (notice)
|
|
90
|
+
ctx.enrich.notice(notice);
|
|
91
|
+
return {
|
|
92
|
+
...target,
|
|
93
|
+
entry: normalizeImages(metadata),
|
|
94
|
+
url: `https://www.ebi.ac.uk/interpro/entry/${target.sourceDatabase}/${encodeURIComponent(target.accession)}/`,
|
|
95
|
+
sourceUrl: response.sourceUrl,
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
format: formatInterpro,
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=interpro-get-entry.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpro-get-entry.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/interpro-get-entry.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EACL,cAAc,EACd,eAAe,EACf,0BAA0B,GAC3B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE;IACzD,KAAK,EAAE,yBAAyB;IAChC,WAAW,EACT,sLAAsL;IACxL,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAC9E,IAAI,EAAE,CAAC,8BAA8B,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,SAAS,EAAE,eAAe,CAAC,QAAQ,CACjC,2FAA2F,CAC5F;QACD,cAAc,EAAE,cAAc,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAC3D,wEAAwE,CACzE;QACD,gBAAgB,EAAE,CAAC;aAChB,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,8FAA8F,CAC/F;KACJ,CAAC;IACF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAChE,cAAc,EAAE,oBAAoB;QACpC,KAAK,EAAE,mBAAmB,CAAC,QAAQ,CACjC,8HAA8H,CAC/H;QACD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC3D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;KAC3D,CAAC;IACF,UAAU,EAAE;QACV,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yDAAyD,CAAC;KACvE;IACD,MAAM,EAAE;QACN;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,qDAAqD;YAC3D,SAAS,EAAE,KAAK;YAChB,QAAQ,EACN,0GAA0G;YAC5G,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,0BAA0B;YAClC,IAAI,EAAE,gBAAgB,CAAC,eAAe;YACtC,IAAI,EAAE,iDAAiD;YACvD,SAAS,EAAE,KAAK;YAChB,QAAQ,EACN,+HAA+H;YACjI,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,uEAAuE;YAC7E,SAAS,EAAE,KAAK;YAChB,QAAQ,EACN,iHAAiH;YACnH,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2BAA2B;YACjC,SAAS,EAAE,KAAK;YAChB,QAAQ,EACN,gIAAgI;YAClI,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,wBAAwB;YAChC,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,4DAA4D;YAClE,SAAS,EAAE,KAAK;YAChB,QAAQ,EACN,4GAA4G;YAC9G,QAAQ,EAAE,SAAS;SACpB;QACD,GAAG,eAAe;KACnB;IACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CACpC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAClB,CAAC,OAAO,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,EAClD,EAAE,EACF,YAAY,CAAC,mBAAmB,CAAC,EACjC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,EAAE,CACtD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI;YAChB,MAAM,GAAG,CAAC,IAAI,CAAC,wBAAwB,EAAE,qCAAqC,CAAC,CAAC;QAClF,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,0BAA0B,CACrD,QAAQ,CAAC,IAAI,CAAC,QAAQ,EACtB,KAAK,CAAC,gBAAgB,EACtB,oBAAoB,CACrB,CAAC;QACF,IAAI,MAAM;YAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO;YACL,GAAG,MAAM;YACT,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC;YAChC,GAAG,EAAE,wCAAwC,MAAM,CAAC,cAAc,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;YAC7G,SAAS,EAAE,QAAQ,CAAC,SAAS;SAC9B,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,cAAc;CACvB,CAAC,CAAC"}
|