@cyanheads/protein-mcp-server 0.1.4 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +7 -6
  4. package/changelog/0.2.x/0.2.0.md +25 -0
  5. package/changelog/0.2.x/0.2.1.md +16 -0
  6. package/dist/mcp-server/tools/definitions/_schemas.d.ts +1 -0
  7. package/dist/mcp-server/tools/definitions/_schemas.d.ts.map +1 -1
  8. package/dist/mcp-server/tools/definitions/_schemas.js +6 -1
  9. package/dist/mcp-server/tools/definitions/_schemas.js.map +1 -1
  10. package/dist/mcp-server/tools/definitions/analyze-collection.tool.d.ts +1 -0
  11. package/dist/mcp-server/tools/definitions/analyze-collection.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/analyze-collection.tool.js +3 -1
  13. package/dist/mcp-server/tools/definitions/analyze-collection.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/compare-structures.tool.d.ts +12 -1
  15. package/dist/mcp-server/tools/definitions/compare-structures.tool.d.ts.map +1 -1
  16. package/dist/mcp-server/tools/definitions/compare-structures.tool.js +70 -11
  17. package/dist/mcp-server/tools/definitions/compare-structures.tool.js.map +1 -1
  18. package/dist/mcp-server/tools/definitions/find-similar.tool.d.ts +6 -0
  19. package/dist/mcp-server/tools/definitions/find-similar.tool.d.ts.map +1 -1
  20. package/dist/mcp-server/tools/definitions/find-similar.tool.js +42 -19
  21. package/dist/mcp-server/tools/definitions/find-similar.tool.js.map +1 -1
  22. package/dist/mcp-server/tools/definitions/get-annotations.tool.d.ts.map +1 -1
  23. package/dist/mcp-server/tools/definitions/get-annotations.tool.js +4 -2
  24. package/dist/mcp-server/tools/definitions/get-annotations.tool.js.map +1 -1
  25. package/dist/mcp-server/tools/definitions/get-structure.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/get-structure.tool.js +3 -3
  27. package/dist/mcp-server/tools/definitions/get-structure.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/definitions/search-structures.tool.d.ts +1 -0
  29. package/dist/mcp-server/tools/definitions/search-structures.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/search-structures.tool.js +3 -1
  31. package/dist/mcp-server/tools/definitions/search-structures.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/track-ligands.tool.d.ts.map +1 -1
  33. package/dist/mcp-server/tools/definitions/track-ligands.tool.js +16 -4
  34. package/dist/mcp-server/tools/definitions/track-ligands.tool.js.map +1 -1
  35. package/dist/services/alignment/alignment-service.d.ts +8 -0
  36. package/dist/services/alignment/alignment-service.d.ts.map +1 -1
  37. package/dist/services/alignment/alignment-service.js +24 -0
  38. package/dist/services/alignment/alignment-service.js.map +1 -1
  39. package/dist/services/foldseek/foldseek-service.d.ts +15 -1
  40. package/dist/services/foldseek/foldseek-service.d.ts.map +1 -1
  41. package/dist/services/foldseek/foldseek-service.js +30 -0
  42. package/dist/services/foldseek/foldseek-service.js.map +1 -1
  43. package/package.json +4 -4
  44. package/server.json +3 -3
package/AGENTS.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** protein-mcp-server
4
- **Version:** 0.1.4
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
4
+ **Version:** 0.2.1
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.10`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
8
  **Zod:** ^4.4.3
package/CLAUDE.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Developer Protocol
2
2
 
3
3
  **Server:** protein-mcp-server
4
- **Version:** 0.1.4
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.9`
4
+ **Version:** 0.2.1
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.10.10`
6
6
  **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/sdk` ^1.29.0
8
8
  **Zod:** ^4.4.3
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.1.4-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/protein-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/protein-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/protein-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.2.1-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/protein-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^1.29.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/protein-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/protein-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^6.0.3-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.3.2-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -37,7 +37,7 @@ Seven tools spanning the structure-research arc — discover, fetch, find homolo
37
37
  | `protein_get_structure` | Fetch metadata and coordinate-file URLs by ID — experimental (PDB), predicted (AlphaFold), or best-available — with batch partial success and optional coordinate inlining. |
38
38
  | `protein_find_similar` | Find sequence homologs (RCSB mmseqs2) or fold homologs (Foldseek) from a sequence, PDB ID, or UniProt accession. |
39
39
  | `protein_track_ligands` | Resolve ligand names/formulas to component IDs, find structures containing a ligand, or map binding-site residues. |
40
- | `protein_compare_structures` | Structurally align 2–10 structures (TM-align / jFATCAT) to a reference or as a full pairwise matrix. |
40
+ | `protein_compare_structures` | Structurally align multiple structures (TM-align / jFATCAT) to a reference or as a full pairwise matrix. |
41
41
  | `protein_analyze_collection` | Profile the PDB into distributions and trends with server-side facets — counts, histograms, timelines, and cross-tabs. |
42
42
  | `protein_get_annotations` | Fetch UniProt features and natural variants plus InterPro domain/family memberships with GO terms. |
43
43
 
@@ -72,7 +72,7 @@ Find structurally or evolutionarily related proteins, by sequence or by fold.
72
72
  - `by: sequence` runs a synchronous RCSB mmseqs2 search; `by: structure` runs an asynchronous Foldseek search against experimental and predicted databases
73
73
  - Query from a raw one-letter sequence, a PDB ID, or a UniProt accession
74
74
  - Foldseek targets default to `pdb100` + `afdb50`; override via `databases` (e.g. `afdb-swissprot`, `BFVD`)
75
- - Async jobs that exceed the poll budget return `status: computing` with a ticket — re-call to resume
75
+ - Async jobs that exceed the poll budget return `status: computing` with a `ticketId` — re-call with `ticket_id` set to that value to poll the same job instead of resubmitting
76
76
  - Each hit names the engine and source database it came from
77
77
 
78
78
  ---
@@ -90,12 +90,13 @@ Ligand discovery and binding-site analysis across the PDB.
90
90
 
91
91
  ### `protein_compare_structures`
92
92
 
93
- Structural alignment of 2–10 structures via the RCSB Structural Comparison service.
93
+ Structural alignment of multiple structures (up to the configured `PROTEIN_MAX_COMPARE_STRUCTURES` cap) via the RCSB Structural Comparison service.
94
94
 
95
95
  - Methods: `tm-align`, `fatcat-rigid`, `fatcat-flexible`
96
96
  - `reference: first` aligns every structure to the first; `reference: all_pairs` computes the full pairwise matrix
97
97
  - Optional per-structure `chain` restricts the alignment to a single chain
98
- - Each pair is an independent async job, fanned out with a concurrency cap and per-pair partial success — a pair still computing when the budget elapses returns `status: computing` with its job UUID, and a failed pair degrades its row without sinking the others
98
+ - Each pair is an independent async job, fanned out with a concurrency cap and per-pair partial success — a pair still computing when the budget elapses returns `status: computing` with its job `uuid`, and a failed pair degrades its row without sinking the others
99
+ - Re-call with a matching `{ a, b, uuid }` entry in `resume[]` (copied from a prior response's `pairs[]`) to poll a computing pair's job instead of resubmitting
99
100
  - Returns TM-score, RMSD, and aligned-residue count per pair
100
101
 
101
102
  ---
@@ -146,7 +147,7 @@ Protein-specific:
146
147
  - One federated surface over experimental (PDB) and predicted (AlphaFold / 3D-Beacons) structures — search, fetch, and compare treat both universes the same
147
148
  - Keyless across every upstream — RCSB, AlphaFold DB, 3D-Beacons, UniProt, InterPro, and Foldseek, no API keys to provision
148
149
  - Corpus analytics run server-side on RCSB's facet engine — distributions, histograms, and cross-tabs in one call, no row pull and no SQL workspace
149
- - Async alignment and Foldseek jobs poll within a bounded budget and hand back a resumable ticket instead of blocking
150
+ - Async alignment and Foldseek jobs poll within a bounded budget and hand back a job ticket (`ticketId` / per-pair `uuid`) instead of blocking — re-call with `ticket_id` or a `resume[]` entry to poll the same job instead of resubmitting
150
151
 
151
152
  Agent-friendly output:
152
153
 
@@ -0,0 +1,25 @@
1
+ ---
2
+ summary: "Resume protein_find_similar and protein_compare_structures jobs by ticket/UUID instead of resubmitting; compare_structures structures cap widened to the configured 2–25 range with a truncation notice; dependency refresh clears a moderate js-yaml advisory."
3
+ breaking: false
4
+ security: true
5
+ ---
6
+
7
+ # 0.2.0 — 2026-07-03
8
+
9
+ ## Added
10
+
11
+ - **`protein_find_similar`** — new optional `ticket_id` input. When set on a `by:"structure"` call, polls the existing Foldseek job instead of resolving coordinates and submitting a new search; `pdb_id`/`uniprot`/`databases` are ignored. New error reason `ticket_not_found` when the ticket is invalid or expired. ([#8](https://github.com/cyanheads/protein-mcp-server/issues/8))
12
+ - **`protein_compare_structures`** — new optional `resume` input: an array of `{ a, b, uuid }` entries copied from a prior response's `pairs[]`. A pair whose labels match a `resume` entry (order- and case-insensitive) polls the given UUID instead of submitting a fresh alignment job; unmatched pairs still submit fresh. New error reason `resume_pair_unmatched` when a `resume` entry's labels don't match any pair generated from `structures` + `reference`. ([#8](https://github.com/cyanheads/protein-mcp-server/issues/8))
13
+ - **`AlignmentService.resumePair`** / **`FoldseekService.resume`** — service-level resume methods backing the two tools above. Both reuse the existing polling step and never throw; `resumePair` treats a `404` as `computing` (the RCSB alignment API returns the same 404 for an expired UUID and a job still in flight, so it can't safely report not-found), while `resume` distinguishes a Foldseek `400 "invalid ID"` as a genuine `not_found`.
14
+
15
+ ## Changed
16
+
17
+ - **`protein_compare_structures`** — `structures` cap widened from a hardcoded `.max(10)` to `.max(25)`, matching the existing `PROTEIN_MAX_COMPARE_STRUCTURES` config ceiling (2–25, default 10). A request exceeding the configured cap now surfaces a truncation notice (previously silent). Tool and field descriptions reworded off the hardcoded "2–10" language to describe the configured cap. ([#11](https://github.com/cyanheads/protein-mcp-server/issues/11))
18
+ - **Dependencies:**
19
+ - `@cyanheads/mcp-ts-core` ^0.10.9 → ^0.10.10
20
+ - `@biomejs/biome` 2.5.1 → 2.5.2 (dev)
21
+ - `@types/node` 26.0.0 → 26.1.0 (dev)
22
+
23
+ ## Security
24
+
25
+ - **`js-yaml`** — the dependency refresh (`@cyanheads/mcp-ts-core` bump + lockfile re-resolve) moves the transitive `js-yaml` resolution from 3.14.2 to 3.15.0, clearing [GHSA-h67p-54hq-rp68](https://github.com/advisories/GHSA-h67p-54hq-rp68) (quadratic-complexity ReDoS in `js-yaml < 3.15.0`). `bun audit`: 1 moderate → 0.
@@ -0,0 +1,16 @@
1
+ ---
2
+ summary: "Nested cross-tab facet children now carry a truncated flag; declared error recovery hints reach the wire; protein_track_ligands binding_site honors limit."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.2.1 — 2026-07-03
8
+
9
+ ## Added
10
+
11
+ - **`protein_analyze_collection` / `protein_search_structures`** — nested cross-tab facet child dimensions now carry a `truncated` boolean when their bucket list is capped by `bucket_limit`; `renderFacets` appends `(truncated)` to the nested line in `content[]`. ([#13](https://github.com/cyanheads/protein-mcp-server/issues/13))
12
+
13
+ ## Fixed
14
+
15
+ - **`protein_track_ligands` `binding_site`** — now caps returned instances to `limit` and emits a truncation notice, instead of returning every instance regardless of `limit`. ([#9](https://github.com/cyanheads/protein-mcp-server/issues/9))
16
+ - **Declared recovery hints** — `errors[].recovery` now reaches the wire (`data.recovery.hint`, mirrored into `content[]`) at throw sites across `protein_search_structures`, `protein_get_annotations`, `protein_get_structure`, `protein_find_similar`, `protein_track_ligands`, and `protein_analyze_collection`. ([#10](https://github.com/cyanheads/protein-mcp-server/issues/10))
@@ -19,6 +19,7 @@ export declare const facetDimensionSchema: z.ZodObject<{
19
19
  label: z.ZodString;
20
20
  count: z.ZodNumber;
21
21
  }, z.core.$strip>>;
22
+ truncated: z.ZodOptional<z.ZodBoolean>;
22
23
  }, z.core.$strip>>>;
23
24
  }, z.core.$strip>>;
24
25
  truncated: z.ZodOptional<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"_schemas.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_schemas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgC/D,yCAAyC;AACzC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;iBAW4B,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAkBtF;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAarE"}
1
+ {"version":3,"file":"_schemas.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_schemas.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAoC/D,yCAAyC;AACzC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;iBAW4B,CAAC;AAE9D,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAExE,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAmBtF;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,CAarE"}
@@ -18,6 +18,10 @@ const childDimensionSchema = z
18
18
  .object({
19
19
  dimension: z.string().describe('Nested dimension name.'),
20
20
  buckets: z.array(leafBucketSchema).describe('Nested buckets within the parent bucket.'),
21
+ truncated: z
22
+ .boolean()
23
+ .optional()
24
+ .describe('True when this nested bucket list was capped by the per-dimension bucket limit.'),
21
25
  })
22
26
  .describe('A nested cross-tab dimension within a parent bucket.');
23
27
  /** A top-level facet bucket, optionally carrying a nested cross-tab dimension. */
@@ -57,6 +61,7 @@ export function toFacetOutput(facet, cap) {
57
61
  children: b.children.map((c) => ({
58
62
  dimension: c.dimension,
59
63
  buckets: c.buckets.slice(0, cap).map((cb) => ({ label: cb.label, count: cb.count })),
64
+ ...(c.buckets.length > cap ? { truncated: true } : {}),
60
65
  })),
61
66
  }
62
67
  : {}),
@@ -73,7 +78,7 @@ export function renderFacets(facets) {
73
78
  lines.push(`- ${b.label}: ${b.count}`);
74
79
  for (const c of b.children ?? []) {
75
80
  const inner = c.buckets.map((cb) => `${cb.label}: ${cb.count}`).join(', ');
76
- lines.push(` - ${c.dimension} → ${inner}`);
81
+ lines.push(` - ${c.dimension} → ${inner}${c.truncated ? ' (truncated)' : ''}`);
77
82
  }
78
83
  }
79
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"_schemas.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_schemas.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_schemas.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,7 @@ export declare const analyzeCollection: import("@cyanheads/mcp-ts-core").ToolDef
45
45
  label: z.ZodString;
46
46
  count: z.ZodNumber;
47
47
  }, z.core.$strip>>;
48
+ truncated: z.ZodOptional<z.ZodBoolean>;
48
49
  }, z.core.$strip>>>;
49
50
  }, z.core.$strip>>;
50
51
  truncated: z.ZodOptional<z.ZodBoolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-collection.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-collection.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAOjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsH5B,CAAC"}
1
+ {"version":3,"file":"analyze-collection.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-collection.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAOjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyH5B,CAAC"}
@@ -86,7 +86,9 @@ export const analyzeCollection = tool('protein_analyze_collection', {
86
86
  : 'experimental';
87
87
  const [primary, secondary] = input.group_by;
88
88
  if (!primary)
89
- throw ctx.fail('unknown_dimension', 'group_by requires at least one dimension.');
89
+ throw ctx.fail('unknown_dimension', 'group_by requires at least one dimension.', {
90
+ ...ctx.recoveryFor('unknown_dimension'),
91
+ });
90
92
  const spec = buildFacetSpec(primary, input.interval, secondary);
91
93
  const { total, facets } = await rcsb.analyzeFacets({
92
94
  ...(input.query ? { text: input.query } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-collection.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-collection.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze-collection.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/analyze-collection.tool.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@
6
6
  * @module mcp-server/tools/definitions/compare-structures.tool
7
7
  */
8
8
  import { z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
9
10
  export declare const compareStructures: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
10
11
  structures: z.ZodArray<z.ZodObject<{
11
12
  pdb_id: z.ZodString;
@@ -21,6 +22,11 @@ export declare const compareStructures: import("@cyanheads/mcp-ts-core").ToolDef
21
22
  "fatcat-flexible": "fatcat-flexible";
22
23
  }>>;
23
24
  timeout_s: z.ZodOptional<z.ZodNumber>;
25
+ resume: z.ZodOptional<z.ZodArray<z.ZodObject<{
26
+ a: z.ZodString;
27
+ b: z.ZodString;
28
+ uuid: z.ZodString;
29
+ }, z.core.$strip>>>;
24
30
  }, z.core.$strip>, z.ZodObject<{
25
31
  method: z.ZodString;
26
32
  reference: z.ZodEnum<{
@@ -41,7 +47,12 @@ export declare const compareStructures: import("@cyanheads/mcp-ts-core").ToolDef
41
47
  uuid: z.ZodOptional<z.ZodString>;
42
48
  error: z.ZodOptional<z.ZodString>;
43
49
  }, z.core.$strip>>;
44
- }, z.core.$strip>, undefined, {
50
+ }, z.core.$strip>, readonly [{
51
+ readonly reason: "resume_pair_unmatched";
52
+ readonly code: JsonRpcErrorCode.InvalidParams;
53
+ readonly when: "A resume entry's a/b labels don't match any pair generated from structures + reference.";
54
+ readonly recovery: "Copy each resume entry's a, b, and uuid verbatim from a prior response's pairs[], and keep structures and reference unchanged between calls.";
55
+ }], {
45
56
  readonly pairsTotal: z.ZodNumber;
46
57
  readonly computing: z.ZodNumber;
47
58
  readonly notice: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"compare-structures.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/compare-structures.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAmEjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6F5B,CAAC"}
1
+ {"version":3,"file":"compare-structures.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/compare-structures.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgGjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgI5B,CAAC"}
@@ -6,6 +6,7 @@
6
6
  * @module mcp-server/tools/definitions/compare-structures.tool
7
7
  */
8
8
  import { tool, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
9
10
  import { getServerConfig } from '../../../config/server-config.js';
10
11
  import { getAlignmentService } from '../../../services/alignment/alignment-service.js';
11
12
  import { mapWithConcurrency } from '../../../services/shared/async.js';
@@ -21,8 +22,8 @@ const inputSchema = z.object({
21
22
  })
22
23
  .describe('A structure to align, by PDB entry ID with optional chain.'))
23
24
  .min(2)
24
- .max(10)
25
- .describe('The 2–10 structures to compare.'),
25
+ .max(25)
26
+ .describe('The structures to compare, up to the configured batch cap (excess is dropped with a notice).'),
26
27
  reference: z
27
28
  .enum(['first', 'all_pairs'])
28
29
  .default('first')
@@ -38,6 +39,25 @@ const inputSchema = z.object({
38
39
  .max(120)
39
40
  .optional()
40
41
  .describe('Poll budget per pair in seconds before returning "computing". Defaults to the server setting.'),
42
+ resume: z
43
+ .array(z
44
+ .object({
45
+ a: z
46
+ .string()
47
+ .min(1)
48
+ .describe('First structure label (entry or entry.chain) of a pair from a prior response.'),
49
+ b: z
50
+ .string()
51
+ .min(1)
52
+ .describe('Second structure label (entry or entry.chain) of a pair from a prior response.'),
53
+ uuid: z
54
+ .string()
55
+ .min(1)
56
+ .describe('Alignment job UUID returned for that pair by a prior call.'),
57
+ })
58
+ .describe('A prior pair to resume by UUID instead of resubmitting.'))
59
+ .optional()
60
+ .describe("Resume tickets from a prior call: for each pair whose labels match an entry here, poll the existing UUID instead of submitting a new alignment job. Copy a, b, and uuid verbatim from a prior response's pairs[]; keep structures and reference unchanged."),
41
61
  });
42
62
  const outputSchema = z.object({
43
63
  method: z.string().describe('Alignment method used.'),
@@ -62,13 +82,22 @@ const outputSchema = z.object({
62
82
  });
63
83
  export const compareStructures = tool('protein_compare_structures', {
64
84
  title: 'protein-mcp-server: compare structures',
65
- description: 'Structurally align 2–10 structures via the RCSB Structural Comparison service (TM-align / jFATCAT). ' +
66
- 'reference:"first" aligns every structure to the first; reference:"all_pairs" computes the full pairwise ' +
67
- 'matrix. Each pair is an independent async alignment job, fanned out with a concurrency cap and per-pair ' +
68
- 'partial success — a pair still computing when the budget elapses returns status "computing" with its ' +
69
- 'job UUID (re-call to resume), and a failed pair degrades its row without sinking the others. Returns ' +
70
- 'TM-score, RMSD, and aligned-residue count per pair.',
85
+ description: 'Structurally align multiple structures (up to the configured batch cap) via the RCSB Structural ' +
86
+ 'Comparison service (TM-align / jFATCAT). reference:"first" aligns every structure to the first; ' +
87
+ 'reference:"all_pairs" computes the full pairwise matrix. Each pair is an independent async alignment ' +
88
+ 'job, fanned out with a concurrency cap and per-pair partial success — a pair still computing when the ' +
89
+ 'budget elapses returns status "computing" with its job UUID, and a failed pair degrades its row without ' +
90
+ "sinking the others. Re-call with a matching entry in resume[] to poll a computing pair's UUID instead " +
91
+ 'of resubmitting. Returns TM-score, RMSD, and aligned-residue count per pair.',
71
92
  annotations: { readOnlyHint: true, openWorldHint: true },
93
+ errors: [
94
+ {
95
+ reason: 'resume_pair_unmatched',
96
+ code: JsonRpcErrorCode.InvalidParams,
97
+ when: "A resume entry's a/b labels don't match any pair generated from structures + reference.",
98
+ recovery: "Copy each resume entry's a, b, and uuid verbatim from a prior response's pairs[], and keep structures and reference unchanged between calls.",
99
+ },
100
+ ],
72
101
  input: inputSchema,
73
102
  output: outputSchema,
74
103
  enrichment: {
@@ -79,12 +108,33 @@ export const compareStructures = tool('protein_compare_structures', {
79
108
  async handler(input, ctx) {
80
109
  const cfg = getServerConfig();
81
110
  const structures = input.structures.slice(0, cfg.maxCompareStructures);
111
+ const notices = [];
112
+ if (input.structures.length > cfg.maxCompareStructures) {
113
+ notices.push(`Capped at ${cfg.maxCompareStructures} structures; ${input.structures.length - cfg.maxCompareStructures} ignored.`);
114
+ }
82
115
  const timeoutMs = input.timeout_s ? input.timeout_s * 1000 : cfg.asyncPollTimeoutMs;
83
116
  const method = input.method;
84
117
  const pairs = buildPairs(structures, input.reference);
118
+ // Map each supplied resume ticket to a pair. A ticket that matches no pair in
119
+ // the current structures/reference set is a client error — fail loudly rather
120
+ // than silently resubmit and burn a fresh alignment job.
121
+ const resumeByPair = new Map();
122
+ if (input.resume?.length) {
123
+ const validKeys = new Set(pairs.map(([a, b]) => pairKey(label(a), label(b))));
124
+ for (const r of input.resume) {
125
+ const key = pairKey(r.a, r.b);
126
+ if (!validKeys.has(key)) {
127
+ throw ctx.fail('resume_pair_unmatched', `Resume entry ${r.a} ↔ ${r.b} matches no pair in the current structures/reference set.`, { ...ctx.recoveryFor('resume_pair_unmatched') });
128
+ }
129
+ resumeByPair.set(key, r.uuid);
130
+ }
131
+ }
85
132
  const alignment = getAlignmentService();
86
133
  const rows = await mapWithConcurrency(pairs, cfg.fanoutConcurrency, async ([a, b]) => {
87
- const outcome = await alignment.comparePair(toCompare(a), toCompare(b), method, timeoutMs, ctx);
134
+ const resumeUuid = resumeByPair.get(pairKey(label(a), label(b)));
135
+ const outcome = resumeUuid
136
+ ? await alignment.resumePair(resumeUuid, timeoutMs, ctx)
137
+ : await alignment.comparePair(toCompare(a), toCompare(b), method, timeoutMs, ctx);
88
138
  const base = { a: label(a), b: label(b) };
89
139
  if (outcome.status === 'complete') {
90
140
  return {
@@ -109,9 +159,11 @@ export const compareStructures = tool('protein_compare_structures', {
109
159
  const failed = rows.filter((r) => r.status === 'failed').length;
110
160
  ctx.enrich({ pairsTotal: rows.length, computing });
111
161
  if (computing > 0 || failed > 0) {
112
- ctx.enrich.notice(`${computing} pair(s) still computing${failed > 0 ? `, ${failed} failed` : ''}. ` +
113
- `Re-call to resume computing pairs (cold alignment jobs typically finish within 30–60 s).`);
162
+ notices.push(`${computing} pair(s) still computing${failed > 0 ? `, ${failed} failed` : ''}. ` +
163
+ `Re-call with a resume entry per pair (copy a, b, uuid from the pairs above) to poll existing jobs — cold alignment jobs typically finish within 30–60 s.`);
114
164
  }
165
+ if (notices.length > 0)
166
+ ctx.enrich.notice(notices.join(' '));
115
167
  return { method, reference: input.reference, pairs: rows };
116
168
  },
117
169
  format: (result) => {
@@ -165,4 +217,11 @@ function toCompare(s) {
165
217
  function label(s) {
166
218
  return s.chain ? `${s.pdb_id.toUpperCase()}.${s.chain}` : s.pdb_id.toUpperCase();
167
219
  }
220
+ /**
221
+ * Canonical, order- and case-insensitive key for a pair of structure labels, so a
222
+ * resume entry matches its pair regardless of which side the client copied first.
223
+ */
224
+ function pairKey(a, b) {
225
+ return [a.toUpperCase(), b.toUpperCase()].sort().join('');
226
+ }
168
227
  //# sourceMappingURL=compare-structures.tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"compare-structures.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/compare-structures.tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compare-structures.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/compare-structures.tool.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare const findSimilar: import("@cyanheads/mcp-ts-core").ToolDefinitio
15
15
  sequence: z.ZodOptional<z.ZodString>;
16
16
  pdb_id: z.ZodOptional<z.ZodString>;
17
17
  uniprot: z.ZodOptional<z.ZodString>;
18
+ ticket_id: z.ZodOptional<z.ZodString>;
18
19
  databases: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
20
  max_evalue: z.ZodOptional<z.ZodNumber>;
20
21
  min_identity: z.ZodOptional<z.ZodNumber>;
@@ -60,6 +61,11 @@ export declare const findSimilar: import("@cyanheads/mcp-ts-core").ToolDefinitio
60
61
  readonly when: "The Foldseek search service rejected or failed the structure job.";
61
62
  readonly retryable: true;
62
63
  readonly recovery: "Retry shortly; if it persists, verify the source structure has coordinates via protein_get_structure.";
64
+ }, {
65
+ readonly reason: "ticket_not_found";
66
+ readonly code: JsonRpcErrorCode.NotFound;
67
+ readonly when: "The supplied ticket_id was rejected by Foldseek as an invalid or expired ticket.";
68
+ readonly recovery: "Tickets expire once results age out; drop ticket_id and re-run the by:structure search from pdb_id or uniprot to get a fresh one.";
63
69
  }], {
64
70
  totalCount: z.ZodOptional<z.ZodNumber>;
65
71
  notice: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"find-similar.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/find-similar.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA6B,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAkGjE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DtB,CAAC"}
1
+ {"version":3,"file":"find-similar.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/find-similar.tool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA6B,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAwGjE,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuEtB,CAAC"}
@@ -26,6 +26,10 @@ const inputSchema = z.object({
26
26
  .describe('One-letter amino-acid sequence to search from (by:sequence).'),
27
27
  pdb_id: z.string().optional().describe('PDB entry ID to derive the query from.'),
28
28
  uniprot: z.string().optional().describe('UniProt accession to derive the query from.'),
29
+ ticket_id: z
30
+ .string()
31
+ .optional()
32
+ .describe('Foldseek ticket ID from a prior by:structure response whose status was "computing". When set, polls that existing job instead of submitting a new search (by:structure only) — pdb_id/uniprot/databases are ignored.'),
29
33
  databases: z
30
34
  .array(z.string())
31
35
  .optional()
@@ -48,7 +52,7 @@ const outputSchema = z.object({
48
52
  engine: z.string().describe('The engine that answered (e.g. "RCSB mmseqs2", "Foldseek").'),
49
53
  status: z
50
54
  .enum(['complete', 'computing'])
51
- .describe('complete with hits, or computing (async, re-call to resume).'),
55
+ .describe('complete with hits, or computing (async re-call with ticket_id to resume).'),
52
56
  ticketId: z
53
57
  .string()
54
58
  .optional()
@@ -93,8 +97,8 @@ export const findSimilar = tool('protein_find_similar', {
93
97
  'sequence-similarity search (synchronous) over a sequence — supplied directly, or pulled from a PDB ID ' +
94
98
  'or UniProt accession. by:"structure" runs a Foldseek fold-similarity search (asynchronous) against ' +
95
99
  '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.',
100
+ 'response reports status "computing" with a ticket — re-call with ticket_id set to that value to resume ' +
101
+ 'the same job instead of resubmitting. Output names the engine and database each hit came from.',
98
102
  annotations: { readOnlyHint: true, openWorldHint: true },
99
103
  errors: [
100
104
  {
@@ -116,6 +120,12 @@ export const findSimilar = tool('protein_find_similar', {
116
120
  retryable: true,
117
121
  recovery: 'Retry shortly; if it persists, verify the source structure has coordinates via protein_get_structure.',
118
122
  },
123
+ {
124
+ reason: 'ticket_not_found',
125
+ code: JsonRpcErrorCode.NotFound,
126
+ when: 'The supplied ticket_id was rejected by Foldseek as an invalid or expired ticket.',
127
+ recovery: 'Tickets expire once results age out; drop ticket_id and re-run the by:structure search from pdb_id or uniprot to get a fresh one.',
128
+ },
119
129
  ],
120
130
  input: inputSchema,
121
131
  output: outputSchema,
@@ -129,7 +139,7 @@ export const findSimilar = tool('protein_find_similar', {
129
139
  format: (result) => {
130
140
  const lines = [`## ${result.engine} (by:${result.by}) — ${result.status}`];
131
141
  if (result.ticketId)
132
- lines.push(`**Ticket:** ${result.ticketId} — re-call to resume.`);
142
+ lines.push(`**Ticket:** ${result.ticketId} — re-call with ticket_id to resume.`);
133
143
  for (const h of result.hits) {
134
144
  lines.push(`\n### ${h.id} _(${h.source})_`);
135
145
  if (h.title)
@@ -182,15 +192,26 @@ async function runSequence(input, enrichLimit, ctx) {
182
192
  };
183
193
  }
184
194
  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);
195
+ const foldseek = getFoldseekService();
196
+ let outcome;
197
+ if (input.ticket_id) {
198
+ // Resume path: poll the existing ticket, skipping coordinate resolution + submit.
199
+ outcome = await foldseek.resume({ ticketId: input.ticket_id, limit: input.limit, timeoutMs }, ctx);
200
+ }
201
+ else {
202
+ const { content, fileName } = await resolveCoordinateFile(input, ctx);
203
+ outcome = await foldseek.search({
204
+ fileContent: content,
205
+ fileName,
206
+ databases: input.databases && input.databases.length > 0 ? input.databases : DEFAULT_FOLDSEEK_DBS,
207
+ mode: FOLDSEEK_MODE,
208
+ limit: input.limit,
209
+ timeoutMs,
210
+ }, ctx);
211
+ }
212
+ if (outcome.status === 'not_found') {
213
+ throw ctx.fail('ticket_not_found', `Foldseek ticket ${outcome.ticketId} is invalid or expired.`, { ...ctx.recoveryFor('ticket_not_found') });
214
+ }
194
215
  if (outcome.status === 'failed') {
195
216
  throw ctx.fail('search_failed', `Foldseek search failed: ${outcome.error}`, {
196
217
  recovery: {
@@ -199,7 +220,7 @@ async function runStructure(input, timeoutMs, ctx) {
199
220
  });
200
221
  }
201
222
  if (outcome.status === 'computing') {
202
- ctx.enrich.notice(`Foldseek job still computing (ticket ${outcome.ticketId}). Re-call protein_find_similar to resume.`);
223
+ ctx.enrich.notice(`Foldseek job still computing (ticket ${outcome.ticketId}). Re-call protein_find_similar with ticket_id set to "${outcome.ticketId}" to resume.`);
203
224
  return {
204
225
  by: 'structure',
205
226
  engine: 'Foldseek',
@@ -232,16 +253,18 @@ async function resolveSequence(input, ctx) {
232
253
  if (input.pdb_id) {
233
254
  const seq = await getRcsbService().getSequence(input.pdb_id, ctx);
234
255
  if (!seq)
235
- throw ctx.fail('no_sequence', `No protein sequence found for PDB entry ${input.pdb_id.toUpperCase()}.`);
256
+ throw ctx.fail('no_sequence', `No protein sequence found for PDB entry ${input.pdb_id.toUpperCase()}.`, { ...ctx.recoveryFor('no_sequence') });
236
257
  return seq.sequence;
237
258
  }
238
259
  if (input.uniprot) {
239
260
  const seq = await getUniProtService().getSequence(input.uniprot, ctx);
240
261
  if (!seq)
241
- throw ctx.fail('no_sequence', `No sequence found for UniProt accession ${input.uniprot.toUpperCase()}.`);
262
+ throw ctx.fail('no_sequence', `No sequence found for UniProt accession ${input.uniprot.toUpperCase()}.`, { ...ctx.recoveryFor('no_sequence') });
242
263
  return seq;
243
264
  }
244
- throw ctx.fail('missing_query', 'Provide a sequence, pdb_id, or uniprot to search from.');
265
+ throw ctx.fail('missing_query', 'Provide a sequence, pdb_id, or uniprot to search from.', {
266
+ ...ctx.recoveryFor('missing_query'),
267
+ });
245
268
  }
246
269
  /** Resolve a query coordinate file (PDB-format text) from a PDB ID or UniProt accession. */
247
270
  async function resolveCoordinateFile(input, ctx) {
@@ -254,14 +277,14 @@ async function resolveCoordinateFile(input, ctx) {
254
277
  if (input.uniprot && isUniProtAccession(input.uniprot)) {
255
278
  const model = await getAlphaFoldService().getPrediction(input.uniprot, ctx);
256
279
  if (!model?.pdbUrl) {
257
- throw ctx.fail('no_sequence', `No predicted model with coordinates found for ${input.uniprot.toUpperCase()}.`);
280
+ throw ctx.fail('no_sequence', `No predicted model with coordinates found for ${input.uniprot.toUpperCase()}.`, { ...ctx.recoveryFor('no_sequence') });
258
281
  }
259
282
  return {
260
283
  content: await fetchCoordinateText(model.pdbUrl, ctx),
261
284
  fileName: `${input.uniprot.toUpperCase()}.pdb`,
262
285
  };
263
286
  }
264
- throw ctx.fail('missing_query', 'by:structure requires a pdb_id or uniprot accession to derive coordinates.');
287
+ throw ctx.fail('missing_query', 'by:structure requires a pdb_id or uniprot accession to derive coordinates.', { ...ctx.recoveryFor('missing_query') });
265
288
  }
266
289
  function fetchCoordinateText(url, ctx) {
267
290
  return fetchText(url, ctx, {