@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,27 @@
1
+ /**
2
+ * @fileoverview Server-specific configuration parsed from environment variables.
3
+ * Every value is optional with a public-endpoint default — the server runs out
4
+ * of the box with no env file. No API keys: all upstreams are keyless.
5
+ * @module config/server-config
6
+ */
7
+ import { z } from '@cyanheads/mcp-ts-core';
8
+ declare const ServerConfigSchema: z.ZodObject<{
9
+ rcsbSearchBaseUrl: z.ZodDefault<z.ZodString>;
10
+ rcsbDataBaseUrl: z.ZodDefault<z.ZodString>;
11
+ rcsbFilesBaseUrl: z.ZodDefault<z.ZodString>;
12
+ rcsbAlignmentBaseUrl: z.ZodDefault<z.ZodString>;
13
+ beaconsBaseUrl: z.ZodDefault<z.ZodString>;
14
+ alphafoldBaseUrl: z.ZodDefault<z.ZodString>;
15
+ foldseekBaseUrl: z.ZodDefault<z.ZodString>;
16
+ uniprotBaseUrl: z.ZodDefault<z.ZodString>;
17
+ interproBaseUrl: z.ZodDefault<z.ZodString>;
18
+ asyncPollTimeoutMs: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
19
+ maxBatchIds: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
20
+ maxCompareStructures: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
21
+ facetBucketCap: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
22
+ fanoutConcurrency: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
23
+ }, z.core.$strip>;
24
+ export type ServerConfig = z.infer<typeof ServerConfigSchema>;
25
+ export declare function getServerConfig(): ServerConfig;
26
+ export {};
27
+ //# sourceMappingURL=server-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-config.d.ts","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAG3C,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;iBAkFtB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAgB,eAAe,IAAI,YAAY,CAkB9C"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @fileoverview Server-specific configuration parsed from environment variables.
3
+ * Every value is optional with a public-endpoint default — the server runs out
4
+ * of the box with no env file. No API keys: all upstreams are keyless.
5
+ * @module config/server-config
6
+ */
7
+ import { z } from '@cyanheads/mcp-ts-core';
8
+ import { parseEnvConfig } from '@cyanheads/mcp-ts-core/config';
9
+ const ServerConfigSchema = z.object({
10
+ rcsbSearchBaseUrl: z
11
+ .string()
12
+ .url()
13
+ .default('https://search.rcsb.org')
14
+ .describe('Base URL for the RCSB Search API v2.'),
15
+ rcsbDataBaseUrl: z
16
+ .string()
17
+ .url()
18
+ .default('https://data.rcsb.org')
19
+ .describe('Base URL for the RCSB Data API (REST + GraphQL).'),
20
+ rcsbFilesBaseUrl: z
21
+ .string()
22
+ .url()
23
+ .default('https://files.rcsb.org')
24
+ .describe('Base URL for RCSB coordinate-file downloads.'),
25
+ rcsbAlignmentBaseUrl: z
26
+ .string()
27
+ .url()
28
+ .default('https://alignment.rcsb.org')
29
+ .describe('Base URL for the RCSB Structural Comparison (alignment) service.'),
30
+ beaconsBaseUrl: z
31
+ .string()
32
+ .url()
33
+ .default('https://www.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api')
34
+ .describe('Base URL for the 3D-Beacons federated structure API.'),
35
+ alphafoldBaseUrl: z
36
+ .string()
37
+ .url()
38
+ .default('https://alphafold.ebi.ac.uk')
39
+ .describe('Base URL for the AlphaFold Protein Structure Database API.'),
40
+ foldseekBaseUrl: z
41
+ .string()
42
+ .url()
43
+ .default('https://search.foldseek.com')
44
+ .describe('Base URL for the Foldseek structural-similarity search service.'),
45
+ uniprotBaseUrl: z
46
+ .string()
47
+ .url()
48
+ .default('https://rest.uniprot.org')
49
+ .describe('Base URL for the UniProt REST API.'),
50
+ interproBaseUrl: z
51
+ .string()
52
+ .url()
53
+ .default('https://www.ebi.ac.uk/interpro/api')
54
+ .describe('Base URL for the InterPro REST API.'),
55
+ asyncPollTimeoutMs: z.coerce
56
+ .number()
57
+ .int()
58
+ .min(1000)
59
+ .default(30_000)
60
+ .describe('Max wall-clock to poll an async job (alignment / Foldseek) before returning a "still computing" result.'),
61
+ maxBatchIds: z.coerce
62
+ .number()
63
+ .int()
64
+ .min(1)
65
+ .max(100)
66
+ .default(25)
67
+ .describe('Cap on the number of IDs accepted by protein_get_structure in one batch.'),
68
+ maxCompareStructures: z.coerce
69
+ .number()
70
+ .int()
71
+ .min(2)
72
+ .max(25)
73
+ .default(10)
74
+ .describe('Cap on structures per protein_compare_structures call (bounds pairwise fan-out).'),
75
+ facetBucketCap: z.coerce
76
+ .number()
77
+ .int()
78
+ .min(1)
79
+ .max(500)
80
+ .default(50)
81
+ .describe('Default cap on buckets returned per protein_analyze_collection dimension.'),
82
+ fanoutConcurrency: z.coerce
83
+ .number()
84
+ .int()
85
+ .min(1)
86
+ .max(16)
87
+ .default(5)
88
+ .describe('Max concurrent upstream requests for per-ID / per-pair fan-out.'),
89
+ });
90
+ let _config;
91
+ export function getServerConfig() {
92
+ _config ??= parseEnvConfig(ServerConfigSchema, {
93
+ rcsbSearchBaseUrl: 'RCSB_SEARCH_BASE_URL',
94
+ rcsbDataBaseUrl: 'RCSB_DATA_BASE_URL',
95
+ rcsbFilesBaseUrl: 'RCSB_FILES_BASE_URL',
96
+ rcsbAlignmentBaseUrl: 'RCSB_ALIGNMENT_BASE_URL',
97
+ beaconsBaseUrl: 'BEACONS_BASE_URL',
98
+ alphafoldBaseUrl: 'ALPHAFOLD_BASE_URL',
99
+ foldseekBaseUrl: 'FOLDSEEK_BASE_URL',
100
+ uniprotBaseUrl: 'UNIPROT_BASE_URL',
101
+ interproBaseUrl: 'INTERPRO_BASE_URL',
102
+ asyncPollTimeoutMs: 'PROTEIN_ASYNC_POLL_TIMEOUT_MS',
103
+ maxBatchIds: 'PROTEIN_MAX_BATCH_IDS',
104
+ maxCompareStructures: 'PROTEIN_MAX_COMPARE_STRUCTURES',
105
+ facetBucketCap: 'PROTEIN_FACET_BUCKET_CAP',
106
+ fanoutConcurrency: 'PROTEIN_FANOUT_CONCURRENCY',
107
+ });
108
+ return _config;
109
+ }
110
+ //# sourceMappingURL=server-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-config.js","sourceRoot":"","sources":["../../src/config/server-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview protein-mcp-server MCP server entry point. Federates experimental
4
+ * (PDB) and predicted (AlphaFold / 3D-Beacons) protein structures behind one tool
5
+ * surface; initializes the six upstream services in setup().
6
+ * @module index
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @fileoverview protein-mcp-server MCP server entry point. Federates experimental
4
+ * (PDB) and predicted (AlphaFold / 3D-Beacons) protein structures behind one tool
5
+ * surface; initializes the six upstream services in setup().
6
+ * @module index
7
+ */
8
+ import { createApp } from '@cyanheads/mcp-ts-core';
9
+ import { getServerConfig } from './config/server-config.js';
10
+ import { afSummaryResource, pdbSummaryResource } from './mcp-server/resources/definitions/index.js';
11
+ import { analyzeCollection, compareStructures, findSimilar, getAnnotations, getStructure, searchStructures, trackLigands, } from './mcp-server/tools/definitions/index.js';
12
+ import { initAlignmentService } from './services/alignment/alignment-service.js';
13
+ import { initAlphaFoldService } from './services/alphafold/alphafold-service.js';
14
+ import { initBeaconsService } from './services/beacons/beacons-service.js';
15
+ import { initFoldseekService } from './services/foldseek/foldseek-service.js';
16
+ import { initRcsbService } from './services/rcsb/rcsb-service.js';
17
+ import { initUniProtService } from './services/uniprot/uniprot-service.js';
18
+ await createApp({
19
+ name: 'protein-mcp-server',
20
+ title: 'protein-mcp-server',
21
+ tools: [
22
+ searchStructures,
23
+ getStructure,
24
+ findSimilar,
25
+ trackLigands,
26
+ compareStructures,
27
+ analyzeCollection,
28
+ getAnnotations,
29
+ ],
30
+ resources: [pdbSummaryResource, afSummaryResource],
31
+ prompts: [],
32
+ // Public, keyless data server — serve the full inventory to unauthenticated callers.
33
+ landing: { requireAuth: false },
34
+ instructions: 'protein-mcp-server — federated protein structure & function research over experimental (PDB) and ' +
35
+ 'predicted (AlphaFold) structures. No API keys required.\n' +
36
+ '- protein_search_structures: find structures by text, sequence, or organism/method/resolution; optional facet breakdown\n' +
37
+ '- protein_get_structure: fetch metadata + coordinate URLs for PDB IDs or UniProt accessions (batch, partial success)\n' +
38
+ '- protein_find_similar: sequence (mmseqs2) or structure (Foldseek) similarity search\n' +
39
+ '- protein_track_ligands: resolve ligands, find structures containing them, or map binding-site residues\n' +
40
+ '- protein_compare_structures: pairwise TM-align / jFATCAT over 2–10 structures\n' +
41
+ '- protein_analyze_collection: server-side facet distributions and trends over the PDB\n' +
42
+ '- protein_get_annotations: UniProt features + InterPro domains/GO terms',
43
+ setup(core) {
44
+ const serverConfig = getServerConfig();
45
+ initRcsbService(core.config, core.storage, serverConfig);
46
+ initAlphaFoldService(core.config, core.storage, serverConfig);
47
+ initBeaconsService(core.config, core.storage, serverConfig);
48
+ initUniProtService(core.config, core.storage, serverConfig);
49
+ initAlignmentService(core.config, core.storage, serverConfig);
50
+ initFoldseekService(core.config, core.storage, serverConfig);
51
+ },
52
+ });
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACpG,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,MAAM,SAAS,CAAC;IACd,IAAI,EAAE,oBAAoB;IAC1B,KAAK,EAAE,oBAAoB;IAC3B,KAAK,EAAE;QACL,gBAAgB;QAChB,YAAY;QACZ,WAAW;QACX,YAAY;QACZ,iBAAiB;QACjB,iBAAiB;QACjB,cAAc;KACf;IACD,SAAS,EAAE,CAAC,kBAAkB,EAAE,iBAAiB,CAAC;IAClD,OAAO,EAAE,EAAE;IACX,qFAAqF;IACrF,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE;IAC/B,YAAY,EACV,mGAAmG;QACnG,2DAA2D;QAC3D,2HAA2H;QAC3H,wHAAwH;QACxH,wFAAwF;QACxF,2GAA2G;QAC3G,kFAAkF;QAClF,yFAAyF;QACzF,yEAAyE;IAC3E,KAAK,CAAC,IAAI;QACR,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;QACvC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACzD,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9D,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5D,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC5D,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC9D,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview af://{uniprot} — predicted-structure summary for a UniProt
3
+ * accession (mean pLDDT, confidence-band fractions, model URLs, version) from the
4
+ * AlphaFold DB. The injectable-context twin of protein_get_structure for
5
+ * source: predicted.
6
+ * @module mcp-server/resources/definitions/af-summary.resource
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ export declare const afSummaryResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
10
+ uniprot: z.ZodString;
11
+ }, z.core.$strip>, z.ZodObject<{
12
+ uniprotAccession: z.ZodString;
13
+ entryId: z.ZodOptional<z.ZodString>;
14
+ meanPlddt: z.ZodOptional<z.ZodNumber>;
15
+ confidenceBuckets: z.ZodOptional<z.ZodObject<{
16
+ veryLow: z.ZodNumber;
17
+ low: z.ZodNumber;
18
+ confident: z.ZodNumber;
19
+ veryHigh: z.ZodNumber;
20
+ }, z.core.$strip>>;
21
+ organism: z.ZodOptional<z.ZodString>;
22
+ uniprotDescription: z.ZodOptional<z.ZodString>;
23
+ modelVersion: z.ZodOptional<z.ZodNumber>;
24
+ cifUrl: z.ZodOptional<z.ZodString>;
25
+ pdbUrl: z.ZodOptional<z.ZodString>;
26
+ bcifUrl: z.ZodOptional<z.ZodString>;
27
+ paeDocUrl: z.ZodOptional<z.ZodString>;
28
+ }, z.core.$strip>, undefined>;
29
+ //# sourceMappingURL=af-summary.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"af-summary.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/af-summary.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;6BAmD5B,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @fileoverview af://{uniprot} — predicted-structure summary for a UniProt
3
+ * accession (mean pLDDT, confidence-band fractions, model URLs, version) from the
4
+ * AlphaFold DB. The injectable-context twin of protein_get_structure for
5
+ * source: predicted.
6
+ * @module mcp-server/resources/definitions/af-summary.resource
7
+ */
8
+ import { resource, z } from '@cyanheads/mcp-ts-core';
9
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
10
+ import { getAlphaFoldService } from '../../../services/alphafold/alphafold-service.js';
11
+ export const afSummaryResource = resource('af://{uniprot}', {
12
+ name: 'alphafold-structure-summary',
13
+ title: 'AlphaFold structure summary',
14
+ description: 'Predicted-structure summary for a UniProt accession from AlphaFold DB: mean pLDDT, confidence-band fractions, model URLs, and version.',
15
+ mimeType: 'application/json',
16
+ params: z.object({
17
+ uniprot: z.string().describe('UniProt accession (e.g. P69905).'),
18
+ }),
19
+ output: z.object({
20
+ uniprotAccession: z.string().describe('UniProt accession.'),
21
+ entryId: z.string().optional().describe('AlphaFold model entry ID (e.g. AF-P69905-F1).'),
22
+ meanPlddt: z.number().optional().describe('Mean pLDDT confidence (0–100).'),
23
+ confidenceBuckets: z
24
+ .object({
25
+ veryLow: z.number().describe('Fraction with pLDDT < 50.'),
26
+ low: z.number().describe('Fraction with pLDDT 50–70.'),
27
+ confident: z.number().describe('Fraction with pLDDT 70–90.'),
28
+ veryHigh: z.number().describe('Fraction with pLDDT > 90.'),
29
+ })
30
+ .optional()
31
+ .describe('Residue fractions per confidence band.'),
32
+ organism: z.string().optional().describe('Source organism.'),
33
+ uniprotDescription: z.string().optional().describe('UniProt protein description.'),
34
+ modelVersion: z.number().optional().describe('AlphaFold model version.'),
35
+ cifUrl: z.string().optional().describe('mmCIF coordinate file URL.'),
36
+ pdbUrl: z.string().optional().describe('PDB-format coordinate file URL.'),
37
+ bcifUrl: z.string().optional().describe('Binary CIF coordinate file URL.'),
38
+ paeDocUrl: z.string().optional().describe('Predicted Aligned Error documentation URL.'),
39
+ }),
40
+ async handler(params, ctx) {
41
+ const model = await getAlphaFoldService().getPrediction(params.uniprot, ctx);
42
+ if (!model)
43
+ throw notFound(`No AlphaFold model found for ${params.uniprot.toUpperCase()}`, {
44
+ uniprot: params.uniprot,
45
+ });
46
+ return {
47
+ uniprotAccession: model.uniprotAccession,
48
+ ...(model.entryId ? { entryId: model.entryId } : {}),
49
+ ...(typeof model.meanPlddt === 'number' ? { meanPlddt: model.meanPlddt } : {}),
50
+ ...(model.confidenceBuckets ? { confidenceBuckets: model.confidenceBuckets } : {}),
51
+ ...(model.organism ? { organism: model.organism } : {}),
52
+ ...(model.uniprotDescription ? { uniprotDescription: model.uniprotDescription } : {}),
53
+ ...(typeof model.modelVersion === 'number' ? { modelVersion: model.modelVersion } : {}),
54
+ ...(model.cifUrl ? { cifUrl: model.cifUrl } : {}),
55
+ ...(model.pdbUrl ? { pdbUrl: model.pdbUrl } : {}),
56
+ ...(model.bcifUrl ? { bcifUrl: model.bcifUrl } : {}),
57
+ ...(model.paeDocUrl ? { paeDocUrl: model.paeDocUrl } : {}),
58
+ };
59
+ },
60
+ });
61
+ //# sourceMappingURL=af-summary.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"af-summary.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/af-summary.resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Barrel export for all protein-mcp-server resource definitions.
3
+ * @module mcp-server/resources/definitions/index
4
+ */
5
+ export { afSummaryResource } from './af-summary.resource.js';
6
+ export { pdbSummaryResource } from './pdb-summary.resource.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Barrel export for all protein-mcp-server resource definitions.
3
+ * @module mcp-server/resources/definitions/index
4
+ */
5
+ export { afSummaryResource } from './af-summary.resource.js';
6
+ export { pdbSummaryResource } from './pdb-summary.resource.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview pdb://{entry_id} — experimental structure summary (title, method,
3
+ * resolution, organism, ligands, chains). The injectable-context twin of
4
+ * protein_get_structure for source: experimental.
5
+ * @module mcp-server/resources/definitions/pdb-summary.resource
6
+ */
7
+ import { z } from '@cyanheads/mcp-ts-core';
8
+ export declare const pdbSummaryResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
9
+ entry_id: z.ZodString;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ id: z.ZodString;
12
+ title: z.ZodOptional<z.ZodString>;
13
+ methods: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ resolution: z.ZodOptional<z.ZodNumber>;
15
+ molecularWeight: z.ZodOptional<z.ZodNumber>;
16
+ releaseDate: z.ZodOptional<z.ZodString>;
17
+ organisms: z.ZodArray<z.ZodString>;
18
+ polymerEntities: z.ZodArray<z.ZodObject<{
19
+ entityId: z.ZodString;
20
+ description: z.ZodOptional<z.ZodString>;
21
+ organism: z.ZodOptional<z.ZodString>;
22
+ chains: z.ZodOptional<z.ZodArray<z.ZodString>>;
23
+ sequenceLength: z.ZodOptional<z.ZodNumber>;
24
+ }, z.core.$strip>>;
25
+ ligands: z.ZodArray<z.ZodObject<{
26
+ compId: z.ZodString;
27
+ name: z.ZodOptional<z.ZodString>;
28
+ formula: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>>;
30
+ }, z.core.$strip>, undefined>;
31
+ //# sourceMappingURL=pdb-summary.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdb-summary.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pdb-summary.resource.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIrD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;6BA+D7B,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @fileoverview pdb://{entry_id} — experimental structure summary (title, method,
3
+ * resolution, organism, ligands, chains). The injectable-context twin of
4
+ * protein_get_structure for source: experimental.
5
+ * @module mcp-server/resources/definitions/pdb-summary.resource
6
+ */
7
+ import { resource, z } from '@cyanheads/mcp-ts-core';
8
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
9
+ import { getRcsbService } from '../../../services/rcsb/rcsb-service.js';
10
+ export const pdbSummaryResource = resource('pdb://{entry_id}', {
11
+ name: 'pdb-structure-summary',
12
+ title: 'PDB structure summary',
13
+ description: 'Experimental structure summary for a PDB entry: title, method, resolution, organism, chains, and bound ligands.',
14
+ mimeType: 'application/json',
15
+ params: z.object({
16
+ entry_id: z.string().describe('PDB entry ID (e.g. 4HHB).'),
17
+ }),
18
+ output: z.object({
19
+ id: z.string().describe('PDB entry ID.'),
20
+ title: z.string().optional().describe('Structure title.'),
21
+ methods: z.array(z.string()).optional().describe('Experimental method(s).'),
22
+ resolution: z.number().optional().describe('Resolution in Å.'),
23
+ molecularWeight: z.number().optional().describe('Structure molecular weight (kDa).'),
24
+ releaseDate: z.string().optional().describe('Initial release date (ISO 8601).'),
25
+ organisms: z.array(z.string()).describe('Source organisms.'),
26
+ polymerEntities: z
27
+ .array(z
28
+ .object({
29
+ entityId: z.string().describe('Polymer entity ID.'),
30
+ description: z.string().optional().describe('Entity description.'),
31
+ organism: z.string().optional().describe('Source organism.'),
32
+ chains: z.array(z.string()).optional().describe('Author chain IDs.'),
33
+ sequenceLength: z.number().optional().describe('Residue count.'),
34
+ })
35
+ .describe('A modeled polymer entity (chain group).'))
36
+ .describe('Modeled polymer entities.'),
37
+ ligands: z
38
+ .array(z
39
+ .object({
40
+ compId: z.string().describe('Chemical component ID.'),
41
+ name: z.string().optional().describe('Chemical name.'),
42
+ formula: z.string().optional().describe('Molecular formula.'),
43
+ })
44
+ .describe('A bound ligand (non-polymer chemical component).'))
45
+ .describe('Bound ligands.'),
46
+ }),
47
+ async handler(params, ctx) {
48
+ const [meta] = await getRcsbService().getEntries([params.entry_id], ctx);
49
+ if (!meta)
50
+ throw notFound(`No PDB entry found for ${params.entry_id.toUpperCase()}`, {
51
+ entryId: params.entry_id,
52
+ });
53
+ return {
54
+ id: meta.id,
55
+ ...(meta.title ? { title: meta.title } : {}),
56
+ ...(meta.methods && meta.methods.length > 0 ? { methods: meta.methods } : {}),
57
+ ...(typeof meta.resolution === 'number' ? { resolution: meta.resolution } : {}),
58
+ ...(typeof meta.molecularWeight === 'number'
59
+ ? { molecularWeight: meta.molecularWeight }
60
+ : {}),
61
+ ...(meta.releaseDate ? { releaseDate: meta.releaseDate } : {}),
62
+ organisms: meta.organisms,
63
+ polymerEntities: meta.polymerEntities,
64
+ ligands: meta.ligands,
65
+ };
66
+ },
67
+ });
68
+ //# sourceMappingURL=pdb-summary.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdb-summary.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/pdb-summary.resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Shared Zod output schemas and helpers for the facet breakdown
3
+ * surfaced by `protein_analyze_collection` and `protein_search_structures`. Nesting
4
+ * is bounded to two levels (a dimension's buckets may each carry one child
5
+ * dimension), matching the deepest cross-tab the facet engine produces.
6
+ * @module mcp-server/tools/definitions/_schemas
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ import type { FacetDimension } from '../../../services/rcsb/types.js';
10
+ /** A facet dimension and its buckets. */
11
+ export declare const facetDimensionSchema: z.ZodObject<{
12
+ dimension: z.ZodString;
13
+ buckets: z.ZodArray<z.ZodObject<{
14
+ label: z.ZodString;
15
+ count: z.ZodNumber;
16
+ children: z.ZodOptional<z.ZodArray<z.ZodObject<{
17
+ dimension: z.ZodString;
18
+ buckets: z.ZodArray<z.ZodObject<{
19
+ label: z.ZodString;
20
+ count: z.ZodNumber;
21
+ }, z.core.$strip>>;
22
+ }, z.core.$strip>>>;
23
+ }, z.core.$strip>>;
24
+ truncated: z.ZodOptional<z.ZodBoolean>;
25
+ }, z.core.$strip>;
26
+ export type FacetDimensionOutput = z.infer<typeof facetDimensionSchema>;
27
+ /** Project a domain {@link FacetDimension} to the output shape, capping buckets. */
28
+ export declare function toFacetOutput(facet: FacetDimension, cap: number): FacetDimensionOutput;
29
+ /** Render a list of facet dimensions to markdown lines for `format()` parity. */
30
+ export declare function renderFacets(facets: FacetDimensionOutput[]): string[];
31
+ //# sourceMappingURL=_schemas.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview Shared Zod output schemas and helpers for the facet breakdown
3
+ * surfaced by `protein_analyze_collection` and `protein_search_structures`. Nesting
4
+ * is bounded to two levels (a dimension's buckets may each carry one child
5
+ * dimension), matching the deepest cross-tab the facet engine produces.
6
+ * @module mcp-server/tools/definitions/_schemas
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ /** A flat (leaf) facet bucket. */
10
+ const leafBucketSchema = z
11
+ .object({
12
+ label: z.string().describe('Bucket value — category, numeric bin start, or period.'),
13
+ count: z.number().describe('Number of entries in the bucket.'),
14
+ })
15
+ .describe('A leaf aggregation bucket: a value and its entry count.');
16
+ /** A child (nested) facet dimension within a cross-tab bucket. */
17
+ const childDimensionSchema = z
18
+ .object({
19
+ dimension: z.string().describe('Nested dimension name.'),
20
+ buckets: z.array(leafBucketSchema).describe('Nested buckets within the parent bucket.'),
21
+ })
22
+ .describe('A nested cross-tab dimension within a parent bucket.');
23
+ /** A top-level facet bucket, optionally carrying a nested cross-tab dimension. */
24
+ const bucketSchema = z
25
+ .object({
26
+ label: z.string().describe('Bucket value — category, numeric bin start, or period.'),
27
+ count: z.number().describe('Number of entries in the bucket.'),
28
+ children: z
29
+ .array(childDimensionSchema)
30
+ .optional()
31
+ .describe('Nested dimension breakdown for cross-tabs (present only for multidimensional facets).'),
32
+ })
33
+ .describe('A top-level aggregation bucket, optionally cross-tabbed by a nested dimension.');
34
+ /** A facet dimension and its buckets. */
35
+ export const facetDimensionSchema = z
36
+ .object({
37
+ dimension: z
38
+ .string()
39
+ .describe('Friendly dimension name (e.g. method, organism, release_year).'),
40
+ buckets: z.array(bucketSchema).describe('Aggregation buckets, count-descending for terms.'),
41
+ truncated: z
42
+ .boolean()
43
+ .optional()
44
+ .describe('True when buckets were capped by the per-dimension bucket limit.'),
45
+ })
46
+ .describe('A facet dimension and its aggregation buckets.');
47
+ /** Project a domain {@link FacetDimension} to the output shape, capping buckets. */
48
+ export function toFacetOutput(facet, cap) {
49
+ const truncated = facet.buckets.length > cap;
50
+ return {
51
+ dimension: facet.dimension,
52
+ buckets: facet.buckets.slice(0, cap).map((b) => ({
53
+ label: b.label,
54
+ count: b.count,
55
+ ...(b.children
56
+ ? {
57
+ children: b.children.map((c) => ({
58
+ dimension: c.dimension,
59
+ buckets: c.buckets.slice(0, cap).map((cb) => ({ label: cb.label, count: cb.count })),
60
+ })),
61
+ }
62
+ : {}),
63
+ })),
64
+ ...(truncated ? { truncated: true } : {}),
65
+ };
66
+ }
67
+ /** Render a list of facet dimensions to markdown lines for `format()` parity. */
68
+ export function renderFacets(facets) {
69
+ const lines = [];
70
+ for (const f of facets) {
71
+ lines.push(`\n**${f.dimension}**${f.truncated ? ' (truncated)' : ''}`);
72
+ for (const b of f.buckets) {
73
+ lines.push(`- ${b.label}: ${b.count}`);
74
+ for (const c of b.children ?? []) {
75
+ const inner = c.buckets.map((cb) => `${cb.label}: ${cb.count}`).join(', ');
76
+ lines.push(` - ${c.dimension} → ${inner}`);
77
+ }
78
+ }
79
+ }
80
+ return lines;
81
+ }
82
+ //# sourceMappingURL=_schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_schemas.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/_schemas.ts"],"names":[],"mappings":"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"}