Skip to content

Spec 006: hosting reactome-mcp - #209

Merged
adamjohnwright merged 2 commits into
mainfrom
spec/mcp-hosting
Sep 14, 2026
Merged

adamjohnwright merged 2 commits into
mainfrom
spec/mcp-hosting

Conversation

@adamjohnwright

Copy link
Copy Markdown
Contributor

Three questions answered: is it the right server, does it have what we want, and where should it run.

A correction I owe

Spec 005 called reactome-mcp "just a prototype". That was the GitHub description field, not the code. It registers 40+ tools and 10 resources across the Content and Analysis Services, and 1.4.0 fetches the graph schema live via APOC, cached per session.

That stale sentence was an argument against adopting it. Second time this week I trusted a description over the thing itself.

It has the capability that justifies the work

Analysis. Gene list in, over-representation out, with p-values, FDR and found/not-found identifiers. No bundle at any freshness produces that — it is a computation over the user's list, not a lookup of stored text.

Direct Neo4j stays off, verifiably — not by convention:

// Graph database tools — only when NEO4J_URI is set
if (isNeo4jConfigured()) {
  registerCypherTools(server);
}

With the variable unset, the Cypher tools are absent from the tool list, not merely disabled. The model cannot see them.

The alternatives

Six Reactome MCP servers exist. Ours is the most recently pushed and the only one Reactome controls — depending on a third party for the interface to our own knowledgebase would be the strange choice. tc2fh/reactome-db-mcp goes direct to MySQL, which is exactly the coupling you ruled out.

The blocker is transport, and it is in the other repo

reactome-mcp is stdio-onlysrc/index.ts constructs a StdioServerTransport and nothing else. That is a local subprocess protocol: one client, one process, over pipes. It cannot be publicly accessible as written.

The fix is supported, not custom: the SDK ships server/streamableHttp, and the existing ^1.12.0 pin already resolves to 1.30.0, which has it.

Hosting it beats spawning it on every axis:

subprocess (#127) hosted over HTTP
Node.js in our Python image required not needed
process supervision ours to write none
other MCP clients one per chatbot process anyone

That last row is why it is worth doing properly: a hosted reactome-mcp is a Reactome service, not a chatbot implementation detail. Which is the instinct behind running it alongside the website.

Two decisions

D1 — who adds Streamable HTTP to reactome-mcp? It blocks everything and lives in that repository.

D2 — where does it run? Recommendation: alongside the website, public, rate-limited. The chatbot then becomes its first client rather than its owner.

Recorded as unverified: nobody has run it from here. Every number is a count of code, not a measurement of behaviour. A plan should open by running it once.

🤖 Generated with Claude Code

adamjohnwright and others added 2 commits September 14, 2026 13:59
Three questions: is it the right server, does it have what we want, and
where should it run.

It is, and I owe a correction. Spec 005 called it "just a prototype" --
that was the GitHub description field, not the code. It registers 40+
tools and 10 resources across the Content and Analysis Services, and
1.4.0 fetches the graph schema live via APOC. The stale sentence was an
argument against adopting it, which is the second time this week a
description was trusted over the thing itself.

Analysis is the capability that justifies the work and it is there:
gene list in, over-representation out, with p-values and FDR. No bundle
at any freshness produces that, because it is a computation over the
user's list rather than a lookup.

Direct Neo4j stays off, and verifiably rather than by convention: the
Cypher tools are registered inside `if (isNeo4jConfigured())`, so with
NEO4J_URI unset they are absent from the tool list, not merely disabled.

Five other Reactome MCP servers exist; ours is the most recently pushed
and the only one Reactome controls. Depending on a third party for the
interface to our own knowledgebase would be the strange choice.

The blocker is transport. reactome-mcp is stdio-only, which is a local
subprocess protocol -- one client, one process, over pipes. It cannot be
publicly accessible as written. The SDK ships server/streamableHttp and
the existing ^1.12.0 pin already resolves to a version that has it, so
the change is supported rather than custom, and it belongs in that
repository.

Hosting it rather than spawning it removes Node from our Python image,
removes process supervision, and makes it useful to any MCP client
instead of one chatbot process -- which is the argument for running it
alongside the website.

Recorded as unverified: nobody has run it from here. Every number is a
count of code, not a measurement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
D3, settled: reactome-mcp stays in its own repository. Hosting does not
change that, because HTTP is an additional transport rather than a
replacement -- main() branches on an environment variable, so stdio and
HTTP coexist in one codebase. The people who clone it and point Claude
at it keep working unchanged, and the two modes serve different users:
cloning is the only route to the Cypher tools, which need a local Neo4j.

A separate repository is right independently of hosting anyway:
different toolchain, different audience, different cadence. Deployment
configuration is not a reason to merge -- the manifest belongs to
whoever operates it and points at a built image.

D4, deferred: npm publishing would give local users npx instead of
clone-plus-build, but it is being done once across reactome-mcp, the
website and the other repositories together. Publishing one in
isolation sets a precedent the rest must match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adamjohnwright
adamjohnwright merged commit 42d48a9 into main Sep 14, 2026
10 checks passed
@adamjohnwright
adamjohnwright deleted the spec/mcp-hosting branch September 14, 2026 14:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant