io.github.cyanheads/interpro-mcp-server
Search InterPro entries, map domains onto proteins and PDB structures, and scan raw sequences.
Que pouvez-vous faire avec io.github.cyanheads/interpro-mcp-server ?
- 15 database slugs (
interpro,pfam,prosite,profile,smart,cdd,panther,cathgene3d,ssf,ncbifam,hamap,prints,pirsf,sfld,antifam) and 11 entry types, with the entry database inferred from standard accession prefixes and ... - One process-wide request pacer at one upstream request per second, a 50-second budget per tool call covering pacing, retries, and every request, and a 4 MiB cap on upstream responses
- Upstream HTTP/1.1 client that handles the API's bodyless 204 responses, which native
fetchrejects on Node - Sparse upstream metadata passes through as
nullor omitted rather than filled in content[]carries the complete output as compact JSON plus an index of every URL as a link and every image as an image, so clients that read only one surface get the same data- Opaque cursors bound to their query, with a notice naming the exact next call whenever a result is partial
- Typed failure reasons (
entry_not_found,invalid_cursor,upstream_rate_limited, and others) each paired with a recovery hint - Coordinates describe sequence annotation, not pathogenicity or clinical significance
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
claude mcp add --transport http interpro-mcp-server 'https://interpro.caseyjhand.com/mcp'
{
"mcpServers": {
"interpro-mcp-server": {
"type": "http",
"url": "https://interpro.caseyjhand.com/mcp"
}
}
}
@cyanheads/interpro-mcp-serverclaude mcp add interpro-mcp-server -e 'MCP_LOG_LEVEL=info' -e 'INTERPRO_SCAN_EMAIL=<INTERPRO_SCAN_EMAIL>' -- npx -y @cyanheads/interpro-mcp-server@0.2.0
{
"mcpServers": {
"interpro-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/interpro-mcp-server@0.2.0"
],
"env": {
"MCP_LOG_LEVEL": "info",
"INTERPRO_SCAN_EMAIL": "<INTERPRO_SCAN_EMAIL>"
}
}
}
}
Variables d'environnement
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').INTERPRO_SCAN_EMAILContact email the EBI Job Dispatcher requires to submit InterProScan jobs. Optional: without it interpro_scan_sequence still returns precalculated matches for sequences already in UniParc and fails other sequences as scan_not_configured, and interpro_get_scan_result still reads existing jobs. EBI stores the address with job data for seven days, and one address covers every caller of the server.
@cyanheads/interpro-mcp-serverclaude mcp add interpro-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -e 'INTERPRO_SCAN_EMAIL=<INTERPRO_SCAN_EMAIL>' -- npx -y @cyanheads/interpro-mcp-server@0.2.0
{
"mcpServers": {
"interpro-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/interpro-mcp-server@0.2.0"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info",
"INTERPRO_SCAN_EMAIL": "<INTERPRO_SCAN_EMAIL>"
}
}
}
}
Variables d'environnement
MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').INTERPRO_SCAN_EMAILContact email the EBI Job Dispatcher requires to submit InterProScan jobs. Optional: without it interpro_scan_sequence still returns precalculated matches for sequences already in UniParc and fails other sequences as scan_not_configured, and interpro_get_scan_result still reads existing jobs. EBI stores the address with job data for seven days, and one address covers every caller of the server.
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
@cyanheads/interpro-mcp-server
Search InterPro entries, map protein domains and functional sites, and find proteins by domain via MCP. STDIO or Streamable HTTP.
6 Tools
Public Hosted Server: https://interpro.caseyjhand.com/mcp
Overview
Protein families, domains, repeats, and functional sites from InterPro and the member databases it integrates (Pfam, PROSITE, SMART, CDD, PANTHER, and others), read through the keyless EMBL-EBI InterPro API. Search entries, read their full metadata, map a UniProt protein's annotations to residue coordinates, walk Pfam, CDD, and PIRSF clans, and find proteins that carry a signature. Runs over STDIO, Streamable HTTP, or the public hosted endpoint above, with no credentials to configure.
Tools
| Tool | Description |
|---|---|
interpro_search_entries | Find InterPro entries by GO annotation, or InterPro entries and member signatures by text, entry type, or integrating accession |
interpro_get_entry | Read one entry's description, hierarchy, member signatures, GO terms, literature, cross-references, clan membership, and coverage counters |
interpro_get_protein_domains | Map a UniProt protein's domains, families, repeats, and functional sites to sequence coordinates, optionally at one residue |
interpro_get_clan | Read a Pfam, CDD, or PIRSF set and page through its members, optionally with its relationship graph |
interpro_find_proteins_by_domain | Find UniProt proteins carrying an entry, defaulting to reviewed human proteins |
interpro_list_reference | Decode database slugs, entry types, accession patterns, common taxon IDs, and the current InterPro release |
Capability reference
interpro_search_entries tool
sourceDatabase(defaultinterpro) plus optionalquery(1-300 characters),entryType,goTerm(GO:0003677form),goCategory(P,F,C), andintegratedInto(anIPRaccession, member databases only); no filter is required, so omitting all of them browses the databasegoTermandgoCategoryrequiresourceDatabase: "interpro"; choose one GO filter per call. Combining them fails before network access because upstream ignores the category when a term is supplied. For member signatures, search InterPro with the GO filter, then readmember_databaseswithinterpro_get_entryor search the member database withintegratedIntoset to the matching InterPro accession- Cursor-paged, positive integer
limitcapped at 100 (default 20); larger requests are clamped with a notice. Returnsentries,page(total,returned,limit,hasMore,nextCursor), and the appliedquery;page.limitis the effective page size
interpro_get_entry tool
accessionrequired;sourceDatabaseis inferred from standard accession prefixes when omitted. A set accession (CL…) fails asentry_not_foundand points tointerpro_get_clan- Optional
sectionsselects fromdescription,hierarchy,member_databases,go_terms,literature,cross_references,wikipedia,counters, andoverlaps_with. Core metadata and unknown upstream fields remain; omittedsectionsreturns full detail - Optional positive integer
overlapLimitpages completeoverlaps_withrecords;overlapOffsetrequires it, starts at zero, and advances usingoverlapsPage.nextOffset. Paging requires overlaps to be retained. Selection and omissions are disclosed; absent or null overlap data stays distinct from an empty list - Wikipedia thumbnails are omitted unless
includeThumbnail: true, and a notice reports what was left out entry.descriptionTextadds readable text with paragraph, list, and table boundaries alongside the unchanged sourceentry.description, including its HTML and annotation flags. It is omitted when description is excluded or no readable text is supplied- A withdrawn record fails as
entry_withdrawnwith its deletion date and short name
interpro_get_protein_domains tool
- Canonical six- or ten-character UniProt
accession(no isoform suffix); optionalresiduePosition(1-based, inclusive) keeps every match with a fragment covering it, with all of that match's fragments intact;includeExtraFeaturesadds predicted features such as disorder and transmembrane regions includeResidueAnnotations: trueaddsresidueAnnotations, the provider's functional rule annotations. A residue filter keeps each whole rule with any fragment covering the position, preserving descriptions, residue letters, locations, and provenance- Large maps arrive in segments of whole records within a 100,000-byte response budget: matches, requested extra features, then requested residue rules. Follow
coverage.nextCursoruntilhasMoreisfalse. The first segment carries protein metadata; an empty segment cannot establish that nothing is annotated. Residue annotations are omitted until their stage is reached, while{}means that stage returned no selected rules - Discontinuous fragments, models, and upstream scores are kept as returned;
residue_out_of_rangeandprotein_not_foundare typed failures
interpro_get_clan tool
accessionfor a Pfam (CL0016), CDD (cl21453), or PIRSF (PIRSF000047) set, withsourceDatabase(pfam,cdd,pirsf) inferred from the prefix; members page bycursor, with positive integerlimitcapped at 100 (default 20). Larger requests are clamped with a notice;page.limitreports the effective sizeincludeRelationships: trueadds the relationship graph in slices that fit the response budget;relationshipsPage.nextOffsetgoes back in asrelationshipOffset, which needsincludeRelationshipssetincludeThumbnailworks as oninterpro_get_entry; a missing set isclan_not_found
interpro_find_proteins_by_domain tool
accessionplus optionalsourceDatabase;taxonId(NCBI, default9606) andreviewedOnly(defaulttrue;falsecovers reviewed and unreviewed proteins) are echoed inquery- Optional
isFragmentselects proteins annotated as fragments (true) or not annotated as fragments (false); omit it to include both. False does not establish sequence completeness. Explicit selections appear inqueryand must stay unchanged when following cursors - Optional
architectureIdacceptsprotein.ida_accessionfrominterpro_get_protein_domains: a 40-character hexadecimal identifier, normalized lowercase. Equality means the provider's Pfam architecture grouping, not equivalent function. Keep it unchanged when following cursors - Cursor-paged, positive integer
limitcapped at 50 (default 20); larger requests are clamped with a notice, andpage.limitis the effective size. Ordinary results keep the protein summary, matched entry locations, taxon lineage, and nativeextra_fields.is_fragmentannotation; missing or null status remains unknown. Architecture-filtered rows retain nativeextra_fields.ida_idwhen supplied and usedetailAvailabilityto distinguish unavailable entry/taxon details from actual empty arrays - No hits is a success with a notice, since the API answers an unknown entry, an unknown taxon, and an empty intersection the same way
interpro_list_reference tool
topicrequired:databases,entry_types,accession_patterns,taxa, orrelease. The first four are local and make no network call;taxalists common examples, not every taxonreleasereads the current InterPro version, date, and per-database entry counts, and fails asrelease_changedif the two upstream responses disagree on the version
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
InterPro-specific:
- 15 database slugs (
interpro,pfam,prosite,profile,smart,cdd,panther,cathgene3d,ssf,ncbifam,hamap,prints,pirsf,sfld,antifam) and 11 entry types, with the entry database inferred from standard accession prefixes and conflicting routes rejected locally - One process-wide request pacer at one upstream request per second, a 50-second budget per tool call covering pacing, retries, and every request, and a 4 MiB cap on upstream responses
- Upstream HTTP/1.1 client that handles the API's bodyless 204 responses, which native
fetchrejects on Node - Sparse upstream metadata passes through as
nullor omitted rather than filled in
Agent-friendly output:
content[]carries the complete output as compact JSON plus an index of every URL as a link and every image as an image, so clients that read only one surface get the same data- Opaque cursors bound to their query, with a notice naming the exact next call whenever a result is partial
- Typed failure reasons (
entry_not_found,invalid_cursor,upstream_rate_limited, and others) each paired with a recovery hint - Coordinates describe sequence annotation, not pathogenicity or clinical significance
Getting started
Public Hosted Instance
A public instance is available at https://interpro.caseyjhand.com/mcp — no installation required. It serves Streamable HTTP; each client takes its own config shape.
For Claude Code:
claude mcp add --transport http interpro-mcp-server https://interpro.caseyjhand.com/mcp
For Cline (cline_mcp_settings.json):
{
"mcpServers": {
"interpro-mcp-server": {
"type": "streamableHttp",
"url": "https://interpro.caseyjhand.com/mcp"
}
}
}
For Cursor (mcp.json):
{
"mcpServers": {
"interpro-mcp-server": {
"url": "https://interpro.caseyjhand.com/mcp"
}
}
}
Claude Desktop adds remote servers under Settings → Connectors.
Self-Hosted / Local
Add the following to your MCP client configuration file. No API key is needed.
{
"mcpServers": {
"interpro-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/interpro-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"interpro-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/interpro-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"interpro-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/interpro-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
Installation
- Clone the repository:
git clone https://github.com/cyanheads/interpro-mcp-server.git
- Navigate into the directory:
cd interpro-mcp-server
- Install dependencies:
bun install
- Configure environment (optional):
cp .env.example .env
Configuration
The server defines no variables of its own; the InterPro API is keyless. These framework variables are the ones most often set:
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_HTTP_HOST | HTTP server host. | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path. | /mcp |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. With auth on, each tool requires its tool:<tool_name>:read scope. | none |
MCP_LOG_LEVEL | Log level (debug, info, notice, warning, error). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for the common framework overrides.
Running the server
Local development
- Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio - Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point: registers the tools and starts the InterPro service. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Six tools. |
src/services/interpro | InterPro service: HTTP/1.1 adapter, pacer and deadlines, accession routing, cursors, schemas, and the shared result formatter. |
tests/ | Unit and integration tests, mirroring the src/ structure. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches, with no
try/catchin tool logic - Use
ctx.logfor request-scoped logging - Register new tools in the
createApp()array insrc/index.ts - Wrap external API calls: validate raw, normalize to the domain type, return the output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Data comes from InterPro and its member databases through the EMBL-EBI API. Licensing varies by member database, so attribute InterPro and the originating database; see InterPro's license page and the EMBL-EBI terms of use.
Questions fréquentes
Qu'est-ce que io.github.cyanheads/interpro-mcp-server ?
Search InterPro entries, map domains onto proteins and PDB structures, and scan raw sequences.
Comment installer io.github.cyanheads/interpro-mcp-server ?
Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http interpro-mcp-server 'https://interpro.caseyjhand.com/mcp'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour io.github.cyanheads/interpro-mcp-server ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
io.github.cyanheads/interpro-mcp-server est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient io.github.cyanheads/interpro-mcp-server ?
Il est publié par cyanheads. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.