@cyanheads/protein-mcp-server 0.1.0

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 (109) hide show
  1. package/AGENTS.md +416 -0
  2. package/CLAUDE.md +416 -0
  3. package/Dockerfile +121 -0
  4. package/LICENSE +201 -0
  5. package/README.md +321 -0
  6. package/changelog/0.1.x/0.1.0.md +21 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/config/server-config.d.ts +27 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +110 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +53 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/af-summary.resource.d.ts +29 -0
  17. package/dist/mcp-server/resources/definitions/af-summary.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/af-summary.resource.js +61 -0
  19. package/dist/mcp-server/resources/definitions/af-summary.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/definitions/index.d.ts +7 -0
  21. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/definitions/index.js +7 -0
  23. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  24. package/dist/mcp-server/resources/definitions/pdb-summary.resource.d.ts +31 -0
  25. package/dist/mcp-server/resources/definitions/pdb-summary.resource.d.ts.map +1 -0
  26. package/dist/mcp-server/resources/definitions/pdb-summary.resource.js +68 -0
  27. package/dist/mcp-server/resources/definitions/pdb-summary.resource.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/_schemas.d.ts +31 -0
  29. package/dist/mcp-server/tools/definitions/_schemas.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/_schemas.js +82 -0
  31. package/dist/mcp-server/tools/definitions/_schemas.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/analyze-collection.tool.d.ts +61 -0
  33. package/dist/mcp-server/tools/definitions/analyze-collection.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/analyze-collection.tool.js +115 -0
  35. package/dist/mcp-server/tools/definitions/analyze-collection.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/compare-structures.tool.d.ts +49 -0
  37. package/dist/mcp-server/tools/definitions/compare-structures.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/compare-structures.tool.js +168 -0
  39. package/dist/mcp-server/tools/definitions/compare-structures.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/find-similar.tool.d.ts +67 -0
  41. package/dist/mcp-server/tools/definitions/find-similar.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/find-similar.tool.js +274 -0
  43. package/dist/mcp-server/tools/definitions/find-similar.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/get-annotations.tool.d.ts +58 -0
  45. package/dist/mcp-server/tools/definitions/get-annotations.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/get-annotations.tool.js +180 -0
  47. package/dist/mcp-server/tools/definitions/get-annotations.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/get-structure.tool.d.ts +78 -0
  49. package/dist/mcp-server/tools/definitions/get-structure.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/get-structure.tool.js +365 -0
  51. package/dist/mcp-server/tools/definitions/get-structure.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/index.d.ts +12 -0
  53. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/index.js +12 -0
  55. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/search-structures.tool.d.ts +71 -0
  57. package/dist/mcp-server/tools/definitions/search-structures.tool.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/search-structures.tool.js +216 -0
  59. package/dist/mcp-server/tools/definitions/search-structures.tool.js.map +1 -0
  60. package/dist/mcp-server/tools/definitions/track-ligands.tool.d.ts +59 -0
  61. package/dist/mcp-server/tools/definitions/track-ligands.tool.d.ts.map +1 -0
  62. package/dist/mcp-server/tools/definitions/track-ligands.tool.js +195 -0
  63. package/dist/mcp-server/tools/definitions/track-ligands.tool.js.map +1 -0
  64. package/dist/services/alignment/alignment-service.d.ts +56 -0
  65. package/dist/services/alignment/alignment-service.d.ts.map +1 -0
  66. package/dist/services/alignment/alignment-service.js +129 -0
  67. package/dist/services/alignment/alignment-service.js.map +1 -0
  68. package/dist/services/alphafold/alphafold-service.d.ts +57 -0
  69. package/dist/services/alphafold/alphafold-service.d.ts.map +1 -0
  70. package/dist/services/alphafold/alphafold-service.js +84 -0
  71. package/dist/services/alphafold/alphafold-service.js.map +1 -0
  72. package/dist/services/beacons/beacons-service.d.ts +52 -0
  73. package/dist/services/beacons/beacons-service.d.ts.map +1 -0
  74. package/dist/services/beacons/beacons-service.js +63 -0
  75. package/dist/services/beacons/beacons-service.js.map +1 -0
  76. package/dist/services/foldseek/foldseek-service.d.ts +71 -0
  77. package/dist/services/foldseek/foldseek-service.d.ts.map +1 -0
  78. package/dist/services/foldseek/foldseek-service.js +131 -0
  79. package/dist/services/foldseek/foldseek-service.js.map +1 -0
  80. package/dist/services/rcsb/facets.d.ts +50 -0
  81. package/dist/services/rcsb/facets.d.ts.map +1 -0
  82. package/dist/services/rcsb/facets.js +59 -0
  83. package/dist/services/rcsb/facets.js.map +1 -0
  84. package/dist/services/rcsb/rcsb-service.d.ts +81 -0
  85. package/dist/services/rcsb/rcsb-service.d.ts.map +1 -0
  86. package/dist/services/rcsb/rcsb-service.js +473 -0
  87. package/dist/services/rcsb/rcsb-service.js.map +1 -0
  88. package/dist/services/rcsb/types.d.ts +150 -0
  89. package/dist/services/rcsb/types.d.ts.map +1 -0
  90. package/dist/services/rcsb/types.js +8 -0
  91. package/dist/services/rcsb/types.js.map +1 -0
  92. package/dist/services/shared/async.d.ts +41 -0
  93. package/dist/services/shared/async.d.ts.map +1 -0
  94. package/dist/services/shared/async.js +64 -0
  95. package/dist/services/shared/async.js.map +1 -0
  96. package/dist/services/shared/http.d.ts +54 -0
  97. package/dist/services/shared/http.d.ts.map +1 -0
  98. package/dist/services/shared/http.js +115 -0
  99. package/dist/services/shared/http.js.map +1 -0
  100. package/dist/services/shared/identifiers.d.ts +12 -0
  101. package/dist/services/shared/identifiers.d.ts.map +1 -0
  102. package/dist/services/shared/identifiers.js +23 -0
  103. package/dist/services/shared/identifiers.js.map +1 -0
  104. package/dist/services/uniprot/uniprot-service.d.ts +65 -0
  105. package/dist/services/uniprot/uniprot-service.d.ts.map +1 -0
  106. package/dist/services/uniprot/uniprot-service.js +146 -0
  107. package/dist/services/uniprot/uniprot-service.js.map +1 -0
  108. package/package.json +106 -0
  109. package/server.json +99 -0
@@ -0,0 +1,274 @@
1
+ /**
2
+ * @fileoverview protein_find_similar — find structurally or evolutionarily related
3
+ * proteins. by:sequence runs a synchronous RCSB mmseqs2 search; by:structure runs
4
+ * an async Foldseek search against experimental + predicted databases (submit →
5
+ * poll → bounded timeout, returning "still computing" rather than blocking).
6
+ * @module mcp-server/tools/definitions/find-similar.tool
7
+ */
8
+ import { tool, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ import { getServerConfig } from '../../../config/server-config.js';
11
+ import { getAlphaFoldService } from '../../../services/alphafold/alphafold-service.js';
12
+ import { getFoldseekService } from '../../../services/foldseek/foldseek-service.js';
13
+ import { getRcsbService } from '../../../services/rcsb/rcsb-service.js';
14
+ import { fetchText } from '../../../services/shared/http.js';
15
+ import { entryIdOf, isPdbId, isUniProtAccession } from '../../../services/shared/identifiers.js';
16
+ import { getUniProtService } from '../../../services/uniprot/uniprot-service.js';
17
+ const DEFAULT_FOLDSEEK_DBS = ['pdb100', 'afdb50'];
18
+ const FOLDSEEK_MODE = '3diaa';
19
+ const inputSchema = z.object({
20
+ by: z
21
+ .enum(['sequence', 'structure'])
22
+ .describe('Similarity axis: sequence (mmseqs2) or structure (Foldseek).'),
23
+ sequence: z
24
+ .string()
25
+ .optional()
26
+ .describe('One-letter amino-acid sequence to search from (by:sequence).'),
27
+ pdb_id: z.string().optional().describe('PDB entry ID to derive the query from.'),
28
+ uniprot: z.string().optional().describe('UniProt accession to derive the query from.'),
29
+ databases: z
30
+ .array(z.string())
31
+ .optional()
32
+ .describe('Foldseek target databases (by:structure). Default pdb100 + afdb50. e.g. afdb-swissprot, BFVD.'),
33
+ max_evalue: z
34
+ .number()
35
+ .positive()
36
+ .optional()
37
+ .describe('Maximum E-value (by:sequence). Default 1.'),
38
+ min_identity: z
39
+ .number()
40
+ .min(0)
41
+ .max(1)
42
+ .optional()
43
+ .describe('Minimum sequence identity 0–1 (by:sequence). Default 0.'),
44
+ limit: z.number().int().min(1).max(100).default(25).describe('Maximum hits to return (1–100).'),
45
+ });
46
+ const outputSchema = z.object({
47
+ by: z.enum(['sequence', 'structure']).describe('Echoed similarity axis.'),
48
+ engine: z.string().describe('The engine that answered (e.g. "RCSB mmseqs2", "Foldseek").'),
49
+ status: z
50
+ .enum(['complete', 'computing'])
51
+ .describe('complete with hits, or computing (async, re-call to resume).'),
52
+ ticketId: z
53
+ .string()
54
+ .optional()
55
+ .describe('Async job ticket ID when status is computing (by:structure).'),
56
+ hits: z
57
+ .array(z
58
+ .object({
59
+ id: z.string().describe('Hit identifier (PDB entry/entity ID or UniProt accession).'),
60
+ source: z
61
+ .enum(['experimental', 'predicted'])
62
+ .describe('Whether the hit is an experimental or predicted structure.'),
63
+ score: z.number().optional().describe('Relevance / alignment score.'),
64
+ evalue: z.number().optional().describe('Alignment E-value (structure hits).'),
65
+ identity: z
66
+ .number()
67
+ .optional()
68
+ .describe('Sequence identity 0–1 over the alignment (structure hits).'),
69
+ database: z
70
+ .string()
71
+ .optional()
72
+ .describe('Source database the hit came from (structure hits).'),
73
+ title: z.string().optional().describe('Structure title (enriched sequence hits).'),
74
+ organism: z.string().optional().describe('Source organism (enriched sequence hits).'),
75
+ uniprotAccession: z
76
+ .string()
77
+ .optional()
78
+ .describe('UniProt accession (predicted structure hits).'),
79
+ })
80
+ .describe('A similar protein, with alignment scores when available.'))
81
+ .describe('Similar proteins, best first.'),
82
+ });
83
+ const enrichmentShape = {
84
+ totalCount: z
85
+ .number()
86
+ .optional()
87
+ .describe('Total upstream matches before pagination (by:sequence).'),
88
+ notice: z.string().optional().describe('Advisory note (still computing, empty results).'),
89
+ };
90
+ export const findSimilar = tool('protein_find_similar', {
91
+ title: 'protein-mcp-server: find similar',
92
+ description: 'Find structurally or evolutionarily related proteins. by:"sequence" runs an RCSB mmseqs2 ' +
93
+ 'sequence-similarity search (synchronous) over a sequence — supplied directly, or pulled from a PDB ID ' +
94
+ 'or UniProt accession. by:"structure" runs a Foldseek fold-similarity search (asynchronous) against ' +
95
+ 'experimental and predicted databases; if the job is still computing when the poll budget elapses, the ' +
96
+ 'response reports status "computing" with a ticket — re-call to resume. Output names the engine and ' +
97
+ 'database each hit came from.',
98
+ annotations: { readOnlyHint: true, openWorldHint: true },
99
+ errors: [
100
+ {
101
+ reason: 'missing_query',
102
+ code: JsonRpcErrorCode.InvalidParams,
103
+ when: 'None of sequence, pdb_id, or uniprot was provided.',
104
+ recovery: 'Provide a raw sequence, a PDB entry ID, or a UniProt accession to search from.',
105
+ },
106
+ {
107
+ reason: 'no_sequence',
108
+ code: JsonRpcErrorCode.NotFound,
109
+ when: 'A sequence could not be resolved from the given PDB ID or UniProt accession.',
110
+ recovery: 'Verify the identifier, or pass a raw one-letter sequence directly via the sequence parameter.',
111
+ },
112
+ {
113
+ reason: 'search_failed',
114
+ code: JsonRpcErrorCode.ServiceUnavailable,
115
+ when: 'The Foldseek search service rejected or failed the structure job.',
116
+ retryable: true,
117
+ recovery: 'Retry shortly; if it persists, verify the source structure has coordinates via protein_get_structure.',
118
+ },
119
+ ],
120
+ input: inputSchema,
121
+ output: outputSchema,
122
+ enrichment: enrichmentShape,
123
+ handler(input, ctx) {
124
+ const cfg = getServerConfig();
125
+ if (input.by === 'sequence')
126
+ return runSequence(input, cfg.facetBucketCap, ctx);
127
+ return runStructure(input, cfg.asyncPollTimeoutMs, ctx);
128
+ },
129
+ format: (result) => {
130
+ const lines = [`## ${result.engine} (by:${result.by}) — ${result.status}`];
131
+ if (result.ticketId)
132
+ lines.push(`**Ticket:** ${result.ticketId} — re-call to resume.`);
133
+ for (const h of result.hits) {
134
+ lines.push(`\n### ${h.id} _(${h.source})_`);
135
+ if (h.title)
136
+ lines.push(h.title);
137
+ const parts = [
138
+ typeof h.score === 'number' ? `**Score:** ${h.score}` : null,
139
+ typeof h.evalue === 'number' ? `**E-value:** ${h.evalue}` : null,
140
+ typeof h.identity === 'number' ? `**Identity:** ${h.identity}` : null,
141
+ h.database ? `**DB:** ${h.database}` : null,
142
+ h.organism ? `**Organism:** ${h.organism}` : null,
143
+ h.uniprotAccession ? `**UniProt:** ${h.uniprotAccession}` : null,
144
+ ].filter(Boolean);
145
+ if (parts.length > 0)
146
+ lines.push(parts.join(' | '));
147
+ }
148
+ return [{ type: 'text', text: lines.join('\n') }];
149
+ },
150
+ });
151
+ async function runSequence(input, enrichLimit, ctx) {
152
+ const rcsb = getRcsbService();
153
+ const sequence = await resolveSequence(input, ctx);
154
+ const result = await rcsb.searchSequence(sequence, {
155
+ ...(typeof input.max_evalue === 'number' ? { maxEvalue: input.max_evalue } : {}),
156
+ ...(typeof input.min_identity === 'number' ? { minIdentity: input.min_identity } : {}),
157
+ limit: input.limit,
158
+ }, ctx);
159
+ const entryIds = [...new Set(result.hits.map((h) => entryIdOf(h.id)))].slice(0, enrichLimit);
160
+ const metaById = new Map();
161
+ if (entryIds.length > 0) {
162
+ for (const meta of await rcsb.getEntries(entryIds, ctx))
163
+ metaById.set(meta.id, meta);
164
+ }
165
+ ctx.enrich.total(result.total);
166
+ if (result.hits.length === 0)
167
+ ctx.enrich.notice('No sequence-similar entries found. Lower min_identity or raise max_evalue.');
168
+ return {
169
+ by: 'sequence',
170
+ engine: 'RCSB mmseqs2',
171
+ status: 'complete',
172
+ hits: result.hits.map((h) => {
173
+ const meta = metaById.get(entryIdOf(h.id));
174
+ return {
175
+ id: h.id,
176
+ source: 'experimental',
177
+ score: h.score,
178
+ ...(meta?.title ? { title: meta.title } : {}),
179
+ ...(meta?.organisms[0] ? { organism: meta.organisms[0] } : {}),
180
+ };
181
+ }),
182
+ };
183
+ }
184
+ async function runStructure(input, timeoutMs, ctx) {
185
+ const { content, fileName } = await resolveCoordinateFile(input, ctx);
186
+ const outcome = await getFoldseekService().search({
187
+ fileContent: content,
188
+ fileName,
189
+ databases: input.databases && input.databases.length > 0 ? input.databases : DEFAULT_FOLDSEEK_DBS,
190
+ mode: FOLDSEEK_MODE,
191
+ limit: input.limit,
192
+ timeoutMs,
193
+ }, ctx);
194
+ if (outcome.status === 'failed') {
195
+ throw ctx.fail('search_failed', `Foldseek search failed: ${outcome.error}`, {
196
+ recovery: {
197
+ hint: 'Retry shortly; if it persists, confirm the source structure has coordinates.',
198
+ },
199
+ });
200
+ }
201
+ if (outcome.status === 'computing') {
202
+ ctx.enrich.notice(`Foldseek job still computing (ticket ${outcome.ticketId}). Re-call protein_find_similar to resume.`);
203
+ return {
204
+ by: 'structure',
205
+ engine: 'Foldseek',
206
+ status: 'computing',
207
+ ticketId: outcome.ticketId,
208
+ hits: [],
209
+ };
210
+ }
211
+ if (outcome.hits.length === 0)
212
+ ctx.enrich.notice('Foldseek returned no fold-similar hits in the selected databases.');
213
+ return {
214
+ by: 'structure',
215
+ engine: 'Foldseek',
216
+ status: 'complete',
217
+ hits: outcome.hits.map((h) => ({
218
+ id: h.pdbId ?? h.uniprotAccession ?? h.target,
219
+ source: h.targetType === 'alphafold' ? 'predicted' : 'experimental',
220
+ ...(typeof h.score === 'number' ? { score: h.score } : {}),
221
+ ...(typeof h.evalue === 'number' ? { evalue: h.evalue } : {}),
222
+ ...(typeof h.sequenceIdentity === 'number' ? { identity: h.sequenceIdentity } : {}),
223
+ database: h.database,
224
+ ...(h.uniprotAccession ? { uniprotAccession: h.uniprotAccession } : {}),
225
+ })),
226
+ };
227
+ }
228
+ /** Resolve a query sequence from a direct sequence, PDB ID, or UniProt accession. */
229
+ async function resolveSequence(input, ctx) {
230
+ if (input.sequence)
231
+ return input.sequence.replace(/\s+/g, '');
232
+ if (input.pdb_id) {
233
+ const seq = await getRcsbService().getSequence(input.pdb_id, ctx);
234
+ if (!seq)
235
+ throw ctx.fail('no_sequence', `No protein sequence found for PDB entry ${input.pdb_id.toUpperCase()}.`);
236
+ return seq.sequence;
237
+ }
238
+ if (input.uniprot) {
239
+ const seq = await getUniProtService().getSequence(input.uniprot, ctx);
240
+ if (!seq)
241
+ throw ctx.fail('no_sequence', `No sequence found for UniProt accession ${input.uniprot.toUpperCase()}.`);
242
+ return seq;
243
+ }
244
+ throw ctx.fail('missing_query', 'Provide a sequence, pdb_id, or uniprot to search from.');
245
+ }
246
+ /** Resolve a query coordinate file (PDB-format text) from a PDB ID or UniProt accession. */
247
+ async function resolveCoordinateFile(input, ctx) {
248
+ const rcsb = getRcsbService();
249
+ if (input.pdb_id && isPdbId(input.pdb_id)) {
250
+ const id = input.pdb_id.toUpperCase();
251
+ const content = await fetchCoordinateText(rcsb.coordinateFileUrl(id, 'pdb'), ctx);
252
+ return { content, fileName: `${id}.pdb` };
253
+ }
254
+ if (input.uniprot && isUniProtAccession(input.uniprot)) {
255
+ const model = await getAlphaFoldService().getPrediction(input.uniprot, ctx);
256
+ if (!model?.pdbUrl) {
257
+ throw ctx.fail('no_sequence', `No predicted model with coordinates found for ${input.uniprot.toUpperCase()}.`);
258
+ }
259
+ return {
260
+ content: await fetchCoordinateText(model.pdbUrl, ctx),
261
+ fileName: `${input.uniprot.toUpperCase()}.pdb`,
262
+ };
263
+ }
264
+ throw ctx.fail('missing_query', 'by:structure requires a pdb_id or uniprot accession to derive coordinates.');
265
+ }
266
+ function fetchCoordinateText(url, ctx) {
267
+ return fetchText(url, ctx, {
268
+ operation: 'findSimilar.fetchCoordinates',
269
+ label: 'Coordinate file',
270
+ baseDelayMs: 400,
271
+ maxRetries: 1,
272
+ });
273
+ }
274
+ //# sourceMappingURL=find-similar.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-similar.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/find-similar.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @fileoverview protein_get_annotations — sequence & functional annotation for a
3
+ * protein: UniProt features (domains, binding sites, PTMs, variants) and InterPro
4
+ * domain/family memberships with GO terms. Keyed by UniProt accession; resolves a
5
+ * PDB ID to its accession when needed.
6
+ * @module mcp-server/tools/definitions/get-annotations.tool
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ export declare const getAnnotations: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
11
+ uniprot: z.ZodOptional<z.ZodString>;
12
+ pdb_id: z.ZodOptional<z.ZodString>;
13
+ include: z.ZodDefault<z.ZodEnum<{
14
+ all: "all";
15
+ features: "features";
16
+ domains: "domains";
17
+ variants: "variants";
18
+ }>>;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ accession: z.ZodString;
21
+ proteinName: z.ZodOptional<z.ZodString>;
22
+ geneNames: z.ZodArray<z.ZodString>;
23
+ organism: z.ZodOptional<z.ZodString>;
24
+ function: z.ZodOptional<z.ZodString>;
25
+ sequenceLength: z.ZodOptional<z.ZodNumber>;
26
+ features: z.ZodOptional<z.ZodArray<z.ZodObject<{
27
+ type: z.ZodString;
28
+ description: z.ZodOptional<z.ZodString>;
29
+ start: z.ZodOptional<z.ZodNumber>;
30
+ end: z.ZodOptional<z.ZodNumber>;
31
+ }, z.core.$strip>>>;
32
+ variants: z.ZodOptional<z.ZodArray<z.ZodObject<{
33
+ type: z.ZodString;
34
+ description: z.ZodOptional<z.ZodString>;
35
+ start: z.ZodOptional<z.ZodNumber>;
36
+ end: z.ZodOptional<z.ZodNumber>;
37
+ }, z.core.$strip>>>;
38
+ domains: z.ZodOptional<z.ZodArray<z.ZodObject<{
39
+ accession: z.ZodString;
40
+ name: z.ZodString;
41
+ type: z.ZodString;
42
+ memberDatabases: z.ZodArray<z.ZodString>;
43
+ goTerms: z.ZodArray<z.ZodObject<{
44
+ id: z.ZodString;
45
+ name: z.ZodString;
46
+ category: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>>;
48
+ }, z.core.$strip>>>;
49
+ }, z.core.$strip>, readonly [{
50
+ readonly reason: "no_uniprot_mapping";
51
+ readonly code: JsonRpcErrorCode.NotFound;
52
+ readonly when: "A PDB ID has no UniProt cross-reference (e.g. nucleic-acid-only entry), or neither uniprot nor pdb_id was provided.";
53
+ readonly recovery: "Pass a UniProt accession directly, or use protein_search_structures to find a structure with a modeled protein chain.";
54
+ }], {
55
+ readonly resolvedFrom: z.ZodOptional<z.ZodString>;
56
+ readonly notice: z.ZodOptional<z.ZodString>;
57
+ }>;
58
+ //# sourceMappingURL=get-annotations.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-annotations.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-annotations.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AA4CjE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwIzB,CAAC"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * @fileoverview protein_get_annotations — sequence & functional annotation for a
3
+ * protein: UniProt features (domains, binding sites, PTMs, variants) and InterPro
4
+ * domain/family memberships with GO terms. Keyed by UniProt accession; resolves a
5
+ * PDB ID to its accession when needed.
6
+ * @module mcp-server/tools/definitions/get-annotations.tool
7
+ */
8
+ import { tool, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ import { getRcsbService } from '../../../services/rcsb/rcsb-service.js';
11
+ import { isUniProtAccession } from '../../../services/shared/identifiers.js';
12
+ import { getUniProtService } from '../../../services/uniprot/uniprot-service.js';
13
+ const featureSchema = z
14
+ .object({
15
+ type: z.string().describe('Feature type (e.g. Domain, Binding site, Modified residue).'),
16
+ description: z.string().optional().describe('Feature description.'),
17
+ start: z.number().optional().describe('Start residue (1-based).'),
18
+ end: z.number().optional().describe('End residue (1-based).'),
19
+ })
20
+ .describe('A sequence feature or natural variant over a residue range.');
21
+ const domainSchema = z
22
+ .object({
23
+ accession: z.string().describe('InterPro accession (e.g. IPR000001).'),
24
+ name: z.string().describe('Domain/family name.'),
25
+ type: z.string().describe('Entry type (e.g. domain, family, homologous_superfamily).'),
26
+ memberDatabases: z
27
+ .array(z.string())
28
+ .describe('Contributing member databases (e.g. pfam, profile).'),
29
+ goTerms: z
30
+ .array(z
31
+ .object({
32
+ id: z.string().describe('GO term ID (e.g. GO:0005515).'),
33
+ name: z.string().describe('GO term name.'),
34
+ category: z
35
+ .string()
36
+ .optional()
37
+ .describe('GO aspect (molecular_function, biological_process, …).'),
38
+ })
39
+ .describe('An associated Gene Ontology term.'))
40
+ .describe('Associated GO terms.'),
41
+ })
42
+ .describe('An InterPro domain/family membership with GO terms.');
43
+ export const getAnnotations = tool('protein_get_annotations', {
44
+ title: 'protein-mcp-server: get annotations',
45
+ description: 'Sequence and functional annotation for a protein: UniProt features (domains, binding sites, PTMs), ' +
46
+ 'natural variants, and InterPro domain/family memberships (Pfam, PROSITE, …) with GO terms. Provide a ' +
47
+ "UniProt accession directly, or a PDB ID — it is resolved to its UniProt accession via the structure's " +
48
+ 'sequence cross-reference. Use the "include" parameter to scope which annotation classes are fetched.',
49
+ annotations: { readOnlyHint: true, openWorldHint: true },
50
+ errors: [
51
+ {
52
+ reason: 'no_uniprot_mapping',
53
+ code: JsonRpcErrorCode.NotFound,
54
+ when: 'A PDB ID has no UniProt cross-reference (e.g. nucleic-acid-only entry), or neither uniprot nor pdb_id was provided.',
55
+ recovery: 'Pass a UniProt accession directly, or use protein_search_structures to find a structure with a modeled protein chain.',
56
+ },
57
+ ],
58
+ input: z.object({
59
+ uniprot: z
60
+ .string()
61
+ .optional()
62
+ .describe('UniProt accession (e.g. P69905). Takes precedence over pdb_id.'),
63
+ pdb_id: z
64
+ .string()
65
+ .optional()
66
+ .describe('PDB entry ID; resolved to a UniProt accession via cross-reference.'),
67
+ include: z
68
+ .enum(['features', 'domains', 'variants', 'all'])
69
+ .default('all')
70
+ .describe('Which annotation classes to fetch: features, domains (InterPro), variants, or all.'),
71
+ }),
72
+ output: z.object({
73
+ accession: z.string().describe('UniProt accession the annotations describe.'),
74
+ proteinName: z.string().optional().describe('Recommended protein name.'),
75
+ geneNames: z.array(z.string()).describe('Gene names.'),
76
+ organism: z.string().optional().describe('Source organism scientific name.'),
77
+ function: z.string().optional().describe('UniProt function summary.'),
78
+ sequenceLength: z.number().optional().describe('Sequence length in residues.'),
79
+ features: z.array(featureSchema).optional().describe('Structural/functional features.'),
80
+ variants: z.array(featureSchema).optional().describe('Natural sequence variants.'),
81
+ domains: z.array(domainSchema).optional().describe('InterPro domain/family memberships.'),
82
+ }),
83
+ enrichment: {
84
+ resolvedFrom: z
85
+ .string()
86
+ .optional()
87
+ .describe('PDB ID the accession was resolved from, when applicable.'),
88
+ notice: z.string().optional().describe('Advisory note (e.g. no variants present).'),
89
+ },
90
+ async handler(input, ctx) {
91
+ const uniprot = getUniProtService();
92
+ const rcsb = getRcsbService();
93
+ let accession = input.uniprot?.toUpperCase();
94
+ let resolvedFrom;
95
+ if (!accession && input.pdb_id) {
96
+ const accessions = await rcsb.resolveUniprot(input.pdb_id, ctx);
97
+ accession = accessions[0];
98
+ resolvedFrom = input.pdb_id.toUpperCase();
99
+ }
100
+ if (!accession) {
101
+ throw ctx.fail('no_uniprot_mapping', 'Provide a UniProt accession, or a PDB ID with a modeled protein chain.');
102
+ }
103
+ if (!isUniProtAccession(accession)) {
104
+ throw ctx.fail('no_uniprot_mapping', `"${accession}" is not a valid UniProt accession.`);
105
+ }
106
+ const include = input.include;
107
+ const wantInterPro = include === 'domains' || include === 'all';
108
+ const [entry, interpro] = await Promise.all([
109
+ uniprot.getEntry(accession, include, ctx),
110
+ wantInterPro ? uniprot.getInterPro(accession, ctx) : Promise.resolve([]),
111
+ ]);
112
+ const features = entry.features.filter((f) => f.category === 'feature');
113
+ const variants = entry.features.filter((f) => f.category === 'variant');
114
+ const wantFeatures = include === 'features' || include === 'all';
115
+ const wantVariants = include === 'variants' || include === 'all';
116
+ if (resolvedFrom)
117
+ ctx.enrich({ resolvedFrom });
118
+ return {
119
+ accession: entry.accession,
120
+ ...(entry.proteinName ? { proteinName: entry.proteinName } : {}),
121
+ geneNames: entry.geneNames,
122
+ ...(entry.organism ? { organism: entry.organism } : {}),
123
+ ...(entry.function ? { function: entry.function } : {}),
124
+ ...(typeof entry.sequenceLength === 'number' ? { sequenceLength: entry.sequenceLength } : {}),
125
+ ...(wantFeatures ? { features: toFeatureOutput(features) } : {}),
126
+ ...(wantVariants ? { variants: toFeatureOutput(variants) } : {}),
127
+ ...(wantInterPro ? { domains: interpro } : {}),
128
+ };
129
+ },
130
+ format: (result) => {
131
+ const lines = [
132
+ `## ${result.accession}${result.proteinName ? ` — ${result.proteinName}` : ''}`,
133
+ ];
134
+ const head = [
135
+ result.geneNames.length > 0 ? `**Genes:** ${result.geneNames.join(', ')}` : null,
136
+ result.organism ? `**Organism:** ${result.organism}` : null,
137
+ typeof result.sequenceLength === 'number' ? `**Length:** ${result.sequenceLength} aa` : null,
138
+ ].filter(Boolean);
139
+ if (head.length > 0)
140
+ lines.push(head.join(' | '));
141
+ if (result.function)
142
+ lines.push(`\n**Function:** ${result.function}`);
143
+ if (result.features && result.features.length > 0) {
144
+ lines.push(`\n### Features (${result.features.length})`);
145
+ for (const f of result.features)
146
+ lines.push(`- ${renderFeature(f)}`);
147
+ }
148
+ if (result.variants && result.variants.length > 0) {
149
+ lines.push(`\n### Variants (${result.variants.length})`);
150
+ for (const v of result.variants)
151
+ lines.push(`- ${renderFeature(v)}`);
152
+ }
153
+ if (result.domains && result.domains.length > 0) {
154
+ lines.push(`\n### InterPro domains (${result.domains.length})`);
155
+ for (const d of result.domains) {
156
+ lines.push(`- **${d.accession}** ${d.name} _(${d.type})_ — ${d.memberDatabases.join(', ') || 'no member DBs'}`);
157
+ for (const g of d.goTerms)
158
+ lines.push(` - ${g.id} ${g.name}${g.category ? ` [${g.category}]` : ''}`);
159
+ }
160
+ }
161
+ return [{ type: 'text', text: lines.join('\n') }];
162
+ },
163
+ });
164
+ function toFeatureOutput(features) {
165
+ return features.map((f) => ({
166
+ type: f.type,
167
+ ...(f.description ? { description: f.description } : {}),
168
+ ...(typeof f.start === 'number' ? { start: f.start } : {}),
169
+ ...(typeof f.end === 'number' ? { end: f.end } : {}),
170
+ }));
171
+ }
172
+ function renderFeature(f) {
173
+ const range = f.start != null
174
+ ? f.end != null && f.end !== f.start
175
+ ? `${f.start}–${f.end}`
176
+ : `${f.start}`
177
+ : '';
178
+ return `**${f.type}**${range ? ` [${range}]` : ''}${f.description ? `: ${f.description}` : ''}`;
179
+ }
180
+ //# sourceMappingURL=get-annotations.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-annotations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-annotations.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @fileoverview protein_get_structure — fetch experimental, predicted, or
3
+ * best-available structures by ID. Batches up to N experimental IDs in one RCSB
4
+ * GraphQL call with per-ID partial success (`failed[]`). Optionally inlines
5
+ * coordinate-file content; when that overflows a byte budget it returns a
6
+ * per-structure section outline for targeted re-call instead of truncating.
7
+ * @module mcp-server/tools/definitions/get-structure.tool
8
+ */
9
+ import { z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ export declare const getStructure: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
12
+ ids: z.ZodArray<z.ZodString>;
13
+ source: z.ZodDefault<z.ZodEnum<{
14
+ experimental: "experimental";
15
+ predicted: "predicted";
16
+ best_available: "best_available";
17
+ }>>;
18
+ include_coords: z.ZodDefault<z.ZodBoolean>;
19
+ sections: z.ZodOptional<z.ZodArray<z.ZodString>>;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ structures: z.ZodArray<z.ZodObject<{
22
+ id: z.ZodString;
23
+ source: z.ZodEnum<{
24
+ experimental: "experimental";
25
+ predicted: "predicted";
26
+ }>;
27
+ title: z.ZodOptional<z.ZodString>;
28
+ method: z.ZodOptional<z.ZodString>;
29
+ resolution: z.ZodOptional<z.ZodNumber>;
30
+ organism: z.ZodOptional<z.ZodString>;
31
+ provider: z.ZodOptional<z.ZodString>;
32
+ meanPlddt: z.ZodOptional<z.ZodNumber>;
33
+ confidenceBuckets: z.ZodOptional<z.ZodObject<{
34
+ veryLow: z.ZodNumber;
35
+ low: z.ZodNumber;
36
+ confident: z.ZodNumber;
37
+ veryHigh: z.ZodNumber;
38
+ }, z.core.$strip>>;
39
+ paeDocUrl: z.ZodOptional<z.ZodString>;
40
+ coordinateUrls: z.ZodObject<{
41
+ cif: z.ZodOptional<z.ZodString>;
42
+ pdb: z.ZodOptional<z.ZodString>;
43
+ bcif: z.ZodOptional<z.ZodString>;
44
+ }, z.core.$strip>;
45
+ coordinateFormat: z.ZodOptional<z.ZodEnum<{
46
+ cif: "cif";
47
+ pdb: "pdb";
48
+ bcif: "bcif";
49
+ }>>;
50
+ coordinates: z.ZodOptional<z.ZodString>;
51
+ }, z.core.$strip>>;
52
+ failed: z.ZodArray<z.ZodObject<{
53
+ id: z.ZodString;
54
+ reason: z.ZodString;
55
+ }, z.core.$strip>>;
56
+ overflow: z.ZodOptional<z.ZodObject<{
57
+ sections: z.ZodArray<z.ZodObject<{
58
+ id: z.ZodString;
59
+ bytes: z.ZodNumber;
60
+ }, z.core.$strip>>;
61
+ notice: z.ZodString;
62
+ }, z.core.$strip>>;
63
+ }, z.core.$strip>, readonly [{
64
+ readonly reason: "mixed_id_types";
65
+ readonly code: JsonRpcErrorCode.InvalidParams;
66
+ readonly when: "The batch mixes PDB IDs and UniProt accessions under a single source that cannot serve both.";
67
+ readonly recovery: "Split the call by source: PDB IDs with source experimental, UniProt accessions with source predicted or best_available.";
68
+ }, {
69
+ readonly reason: "all_failed";
70
+ readonly code: JsonRpcErrorCode.NotFound;
71
+ readonly when: "No requested ID resolved to a structure.";
72
+ readonly recovery: "Verify ID formats (PDB IDs are 4 chars; UniProt accessions match the standard pattern) or locate IDs via protein_search_structures.";
73
+ }], {
74
+ readonly requested: z.ZodNumber;
75
+ readonly resolved: z.ZodNumber;
76
+ readonly notice: z.ZodOptional<z.ZodString>;
77
+ }>;
78
+ //# sourceMappingURL=get-structure.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-structure.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-structure.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAsB,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAwDjE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+NvB,CAAC"}