Reported issues for protein-mcp-server
Pod holds 23 of 54 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.
Back to protein-mcp-server.
Most discussed
feat(search): add retrieval for bounded RCSB result sets
Use case
protein_search_structures, protein_find_similar with by: "sequence", and protein_track_ligands with mode: "structures_with_ligand" expose totalCount but accept only limit. A caller cannot request a later RCSB page without leaving the server.
Proposed behavior
Add an optional start input to those three RCSB-backed result modes. start is a zero-based result offset, defaults to 0, and combines with the existing limit (1–100). The name matches RCSB Search AP
Read the thread · 2026-08-17 · closed · 2 comments
feat(protein_analyze_collection): disclose combined cross-tab bucket size
Use case
protein_analyze_collection applies the same bucket_limit cap independently to the parent dimension and to the nested cross-tab child, so a two-dimension group_by can return up to cap² buckets. At the default cap of 50 that is up to 2,500 buckets in one response; at the maximum it is larger still.
Each position honestly discloses its own truncation — the parent dimension carries truncated, and so does each child — so nothing is hidden from a caller who inspects every leve
Read the thread · 2026-08-17 · closed · 2 comments
bug(protein_analyze_collection): group_by accepts the same dimension twice
Server version
0.4.2
mcp-ts-core version
^0.11.5
Runtime
Bun
Runtime version
Bun 1.3.14
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_analyze_collection accepts the same dimension twice in group_by. {"group_by": ["method", "method"]} passes schema validation and reaches buildFacetSpec('method', interval, 'method'), which builds a method facet nested inside itself and sends that to RCSB.
Verified live against RCSB, the self-ne
Read the thread · 2026-08-16 · closed · 2 comments
feat(facets): nested cross-tab child is single-valued, not an array
Use case
The facet output schema advertises buckets[].children as an unbounded array of nested dimensions, but no code path can produce more than one element. Three independent bounds enforce that:
FacetSpec.child(src/services/rcsb/rcsb-service.ts) is a single optional spec, not a list.toRcsbFacetrequests exactly one nested facet:if (spec.child) facet.facets = [toRcsbFacet(spec.child)].normalizeBucketsreads only index 0 of the upstream response and wraps the result
Read the thread · 2026-08-16 · closed · 2 comments
enhancement(protein_track_ligands): structures_with_ligand score is a constant; sort is undocumented
protein_track_ligands mode structures_with_ligand returns a score on every entry that carries no signal, and an ordering that isn't stated.
Observed
{ mode: "structures_with_ligand", comp_id: "HEM", limit: 8 } → every row scores 1.00, ordered by PDB ID ascending (101M, 102M, 103M … — myoglobins ahead of any hemoglobin). Containment is boolean (an entry either has the component or doesn't), so RCSB's relevance score is uniform and the column is noise; the PDB-ascending order is
Read the thread · 2026-07-03 · closed · 2 comments
enhancement(protein_find_similar): sequence hits return entity IDs that don't chain into other tools
protein_find_similar emits a different hit-ID format per mode, and the by:"sequence" format doesn't match the bare entry IDs the rest of the server uses — so feeding a sequence hit into protein_get_structure requires the caller to strip a suffix.
Observed
by:"sequence"→ polymer-entity IDs like1A00_1(raw mmseqs2h.id).by:"structure"→ bare entry IDs (1A00) or UniProt accessions (h.pdbId ?? h.uniprotAccession).protein_search_structuresand `protein_get_structur
Read the thread · 2026-07-03 · closed · 2 comments
enhancement(protein_track_ligands): find_ligand buries the canonical component for common names
protein_track_ligands mode find_ligand relays RCSB's chemical-name search ranking unchanged, which sorts by name-string match. For a common query the canonical component sinks below near-namesakes, and a find_ligand → structures_with_ligand chain on the top hit then silently resolves the wrong ligand.
Observed
{ mode: "find_ligand", query: "heme", limit: 10 } ranks HEM (protoporphyrin IX + Fe — the heme of hemoglobin, myoglobin, cytochromes) last of ten, below HEC, HEA, `
Read the thread · 2026-07-03 · closed · 2 comments
bug(protein_get_structure): best_available returns one coordinate format where experimental returns three
Server version
0.3.0
mcp-ts-core version
0.10.10
Runtime
Bun
Runtime version
Bun 1.3.x
Transport
stdio
Description
For an experimental pick, source: "best_available" and source: "experimental" resolve to the same PDB entry but expose different coordinate URLs. fetchExperimental builds all three formats from the entry ID (coordinateUrls: { cif, pdb, bcif } via rcsb.coordinateFileUrl), whereas fetchBest derives a single URL from the 3D-Beacons `modelU
Read the thread · 2026-07-03 · closed · 2 comments
Most recent
bug(protein_search_structures): sequence-only controls are silently ignored
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_search_structures accepts min_identity and max_evalue without sequence, then silently runs the non-sequence query. A malformed workflow therefore looks filtered even though neither threshold affects the result.
Steps to reproduce
- Call
protein_search_structureswith `{ "q
Read the thread · 2026-08-31 · open · 0 comments
bug(protein_analyze_collection): zero-match scopes omit the declared notice
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_analyze_collection returns an empty success for a zero-match scope without the empty-scope advisory declared by its enrichment contract. The result is technically distinguishable through total: 0, but it gives no recovery guidance.
Steps to reproduce
- Call `protein_analyze_coll
Read the thread · 2026-08-31 · open · 0 comments
docs(tools): make catalog descriptions caller-facing
The MCP catalog mixes user-facing contracts with implementation mechanics and audience assumptions. Examples include protein_analyze_collection describing a single upstream call and "no row pull," protein_compare_structures describing its internal fanout/concurrency cap, and an output field saying it lets "an agent" cite a structure.
Related: #38
Proposal
Keep provider identity, limits, partial-success behavior, and resume semantics. Remove API-call counts, internal routing/fanout deta
Read the thread · 2026-08-31 · open · 0 comments
bug(protein_find_similar): completed Foldseek results have no retrieval path
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_find_similar silently slices completed Foldseek results to limit. The response has no total, truncation flag, offset, or reusable completed-job ticket, so hits beyond that cap cannot be retrieved through the server.
Related: #41
Steps to reproduce
- Call
protein_find_similar
Read the thread · 2026-08-31 · open · 0 comments
bug(protein_search_structures): truncated facets omit recovery guidance
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_search_structures marks a capped facet as truncated: true, but its enrichment omits the promised truncation advisory and gives no route to the remaining buckets.
Related: #13, #41
Steps to reproduce
- Call
protein_search_structureswith `{ "query": "kinase", "facets": ["organ
Read the thread · 2026-08-31 · open · 0 comments
bug(protein_analyze_collection): interval is silently ignored for incompatible dimensions
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_analyze_collection.interval is accepted for every group_by shape, but it only reaches the top-level facet when that facet is a histogram. A terms-only call silently drops it, and a numeric/date child in a cross-tab keeps its default interval.
Related: #15
Steps to reproduce
- C
Read the thread · 2026-08-31 · open · 0 comments
bug(protein_track_ligands): formula queries run as name searches
Server version
0.5.3
mcp-ts-core version
^0.12.3
Runtime
Bun
Runtime version
Bun 1.4.0 / Node v26.5.0
Transport
HTTP (Streamable HTTP)
OS
macOS 26.1
Description
protein_track_ligands advertises find_ligand.query as a chemical name or formula, but formula input is handled as a name search. A caller can receive chemically unrelated component IDs with no indication that the declared formula path was not applied.
Related: #17
Steps to reproduce
Read the thread · 2026-08-31 · open · 0 comments
bug(rcsb): surface GraphQL errors returned with partial data
Server version
0.5.2
mcp-ts-core version
^0.12.3
Runtime
Bun / Node.js
Runtime version
Bun ≥1.3.0 / Node ≥24.0.0
Transport
stdio / HTTP (Streamable HTTP)
OS
macOS 26.1
Description
RcsbService.graphql() returns body.data before inspecting body.errors. A GraphQL response carrying both fields is therefore treated as a complete success even when the upstream reports field-level failures. Callers cannot distinguish metadata omitted because it is genuinel
Read the thread · 2026-08-30 · open · 1 comment
bug(protein_analyze_collection): declared unknown_dimension error is unreachable and describes a different condition than it guards
protein_analyze_collection advertises an unknown_dimension error reason in its outputSchema, but no input can produce it, and the condition the code guards is not the condition the contract documents.
The declared contract
src/mcp-server/tools/definitions/analyze-collection.tool.ts:
{
reason: 'unknown_dimension',
code: JsonRpcErrorCode.InvalidParams,
when: 'A group_by value is outside the supported dimension set.',
recovery: 'Use a supported dimension: method, organism,
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/47) · 2026-08-25 · open · 0 comments
### bug(protein_get_annotations): missing uniprot and pdb_id surfaces as no_uniprot_mapping NotFound instead of a validation error
### Server version
0.5.1
### mcp-ts-core version
^0.11.5
### Runtime
Bun
### Runtime version
Bun 1.3.x
### Transport
http
### Description
`protein_get_annotations` takes `uniprot` or `pdb_id`, both optional, with no schema-level one-of constraint. When neither is supplied the handler falls through to the post-resolution `!accession` check in `get-annotations.tool.ts` and throws `no_uniprot_mapping` (`-32001` NotFound) with the message "Provide a UniProt accession, or a PDB ID with a m
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/46) · 2026-08-22 · open · 0 comments
### feat(structure metadata): expose chain namespaces through existing surfaces
### Use case
`protein_compare_structures` takes `structures[].chain` as a `label_asym_id`, and no surface on this server emits a `label_asym_id`. `pdb://{entry_id}` exposes author chains only (`polymerEntities[].chains` is populated from `auth_asym_ids`), and `protein_get_structure` exposes no chain metadata at all. For any entry where the two namespaces differ, a per-chain alignment cannot be set up without leaving the server to look the mapping up.
In RCSB entry `6QNR`, polymer entity `6QNR_
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/45) · 2026-08-17 · open · 0 comments
### bug(protein_find_similar): sequence metadata enrichment silently stops at 50 hits
### Server version
0.5.2
### mcp-ts-core version
^0.12.3
### Runtime
Bun
### Runtime version
Bun 1.4.0 / Node v26.5.0
### Transport
HTTP (Streamable HTTP)
### OS
macOS 26.1
### Description
`protein_find_similar` with `by: "sequence"` passes `facetBucketCap` to `runSequence()`. That configuration belongs only to `protein_analyze_collection`, but `runSequence()` uses it to slice de-duplicated PDB entry IDs before its one batched `getEntries()` call. With the default cap of 50 and `lim
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/44) · 2026-08-17 · closed · 1 comment
### bug(protein_get_structure): capped batches lose the cap warning and original count
### Server version
0.5.1
### mcp-ts-core version
^0.11.5
### Runtime
Bun
### Runtime version
Bun 1.3.14 / Node v26.5.0
### Transport
HTTP (Streamable HTTP)
### OS
macOS 26.1
### Description
`protein_get_structure` writes three independent advisories — batch cap, coordinate overflow, and partial failure — to `ctx.enrich.notice`, which is last-write-wins in the framework (`enrich.notice` assigns `store.values.notice = text`). The handler calls it in that order, so a partial failure er
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/43) · 2026-08-17 · open · 0 comments
### bug(protein_get_structure): coordinate inlining bypasses the response budget
### Server version
0.5.1
### mcp-ts-core version
^0.11.5
### Runtime
Bun
### Runtime version
Bun 1.3.14 / Node v26.5.0
### Transport
HTTP (Streamable HTTP)
### OS
macOS 26.1
### Description
Two defects in `protein_get_structure`'s coordinate inlining, both in the same block.
**1. A single coordinate file bypasses the overflow guard entirely.** The guard fires only when `withCoords.length > 1`, so one file inlines at any size. `4HHB.cif` is 772,198 bytes — 32× the 24,000-byte `DEFAU
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/42) · 2026-08-17 · open · 0 comments
### bug(protein_search_structures): method and resolution filters cannot stand alone
### Server version
0.5.2
### mcp-ts-core version
^0.12.3
### Runtime
Bun / Node.js
### Runtime version
Bun ≥1.3.0 / Node ≥24.0.0
### Transport
stdio / HTTP (Streamable HTTP)
### OS
macOS 26.1
### Description
`protein_search_structures` rejects method-only and resolution-only requests before they reach RCSB. Its `no_criteria` guard recognizes only `query`, `sequence`, and `organism`, although the handler maps `method` and `max_resolution` into `StructureSearchParams` and `buildQuery(
[Read the thread](https://github.com/cyanheads/protein-mcp-server/issues/40) · 2026-08-17 · closed · 1 comment
The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/protein-mcp-server/issues).