interpro-mcp-server
Provides Wikipedia thumbnail images for InterPro entries and clans when the includeThumbnail option is enabled.
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 or a PDB entry's chains to annotations with residue coordinates, walk Pfam, CDD, and PIRSF clans, find proteins that carry a signature, and scan a raw protein sequence. Runs over STDIO, Streamable HTTP, or the public hosted endpoint above, with no credentials to configure; starting new InterProScan jobs needs an operator-set contact email (see Configuration).
Tools
Tool | Description |
| Find InterPro entries by GO annotation, or InterPro entries and member signatures by text, entry type, or integrating accession |
| Read one entry's description, hierarchy, member signatures, GO terms, literature, cross-references, clan membership, and coverage counters |
| Map a UniProt protein's domains, families, repeats, and functional sites to sequence coordinates, optionally at one residue |
| Read a Pfam, CDD, or PIRSF set and page through its members, optionally with its relationship graph |
| Find UniProt proteins carrying an entry, defaulting to reviewed human proteins, optionally within one proteome |
| Map signatures onto the protein chains of one PDB entry, in chain, author, and UniProt numbering |
| Find domain, family, and site matches for a raw protein sequence: precalculated for UniParc sequences, otherwise an InterProScan job |
| Read the status and matches of an InterProScan job started by |
| Decode database slugs, entry types, accession patterns, common taxon IDs, and the current InterPro release |
Related MCP server: mcp-uniprot
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 accessionCursor-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_clanOptional
sectionsselects fromdescription,hierarchy,member_databases,go_terms,literature,cross_references,wikipedia,counters, andoverlaps_with. Core metadata and unknown upstream fields remain; omittedsectionsreturns full detailOptional 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 listWikipedia thumbnails are omitted unless
includeThumbnail: true, and a notice reports what was left outentry.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 suppliedA 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 regionsincludeResidueAnnotations: 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 provenanceLarge 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 rulesDiscontinuous 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 inqueryOptional
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 cursorsOptional
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 cursorsCursor-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 arraysOptional
proteomeId(UPplus nine digits, case-insensitive, canonicalized uppercase; for exampleprotein.proteomefrominterpro_get_protein_domains) intersects one UniProt proteome with every other selection.taxonIdstill applies, including its9606default, and a proteome returns proteins only whentaxonIdis its organism or an ancestor. Echoed inquery; keep it unchanged when following cursors. Rows then carry the upstreamproteomesarray, and architecture rows adddetailAvailability.proteomesNo hits is a success with a notice, since the API answers an unknown entry, an unknown taxon, an unknown proteome, and an empty intersection the same way
interpro_get_structure_domains tool
pdbIdrequired: a four-character PDB ID such as1tsr, case-insensitive (accessionis accepted as an alias); extendedpdb_0000…IDs are not supported. Optionalchainrestricts the map to one protein chain, case-sensitive (Aandadiffer); nucleic-acid chains are not listedEach match lists its chain records in
structures, joined byentry. A record carries locations in chain numbering (start/end, 1-based) beside author numbering (auth_start/auth_end, which can benullor skip), UniProt numbering, and the chain-to-UniProt residue map;proteinisnullfor chains with no UniProt mappingInterPro nests at most 20 chain records per match.
chainRecordLimitReachedflags a match at that limit, which may cover chains not returned; setchainto read one chain completelySegments hold whole matches within a 100,000-byte response budget; follow
coverage.nextCursoruntilhasMoreisfalse. The first segment carriesstructure(metadata, including the proteinchains)A DNA-only entry succeeds with no matches and a notice; an unknown or obsolete ID fails as
structure_not_found, and a chain outside the structure's protein chains aschain_not_foundwithavailableChains
interpro_scan_sequence tool
sequencerequired: one protein sequence as residue letters, optionally after a single FASTA header line (up to 100,000 characters). Case, spaces, and line breaks are ignored; digits, gaps, and stop symbols (*) are rejected, as are empty input and multiple FASTA recordsSequences already in UniParc return precalculated matches at once (
source: "precalculated"). Any other sequence starts one InterProScan 6 job through the EBI Job Dispatcher (source: "interproscan"), which commonly runs about ten minutes, so the usual first result for a novel sequence is ajobIdwith statussubmitted,queued, orrunningwaitSeconds(0-35, default 30) sets how long a newly started job is awaited before returning itsjobId. Repeating a sequence whose job is still running returns the samejobId(tracked per server process); at most 25 jobs are in flight per process, beyond which the call fails asrate_limitedwithretryAfterWithout
INTERPRO_SCAN_EMAILset, only precalculated matches are available and any other sequence fails asscan_not_configured(see Configuration). The hosted endpoint does not set itMatches are InterProScan records verbatim, sorted by earliest location, 1-based and inclusive, in segments of whole records within a 100,000-byte budget; follow
coverage.nextCursorwith the samesequence. This tool is not read-only: a call can start a job
interpro_get_scan_result tool
jobIdrequired, as returned byinterpro_scan_sequence;waitSeconds(0-35, default 30) waits for a pending job, and0checks its status onceReturns
status: "finished"with matches,queuedorrunningwith no matches (check again later), plusinterproVersionandinterproscanVersionfor a finished job. Large results continue bycoverage.nextCursorwith the samejobIdJobs and results expire seven days after submission; an unknown or expired job fails as
scan_not_found, and a job that ended in error asscan_failed, both pointing back tointerpro_scan_sequence
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 locallyOne process-wide request pacer at one upstream request per second for the InterPro API, a 50-second budget per tool call covering pacing, retries, and every request, and a 4 MiB cap on upstream responses
Sequence scanning checks the keyless Matches API for precalculated results before submitting an InterProScan 6 job, and reuses a running job for a repeated sequence
Upstream HTTP/1.1 client that handles the API's bodyless 204 responses, which native
fetchrejects on NodeSparse 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 dataOpaque 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 hintCoordinates describe sequence annotation, not pathogenicity or clinical significance
Publishes the
interpro-guideagent skill (identifier chains, gates, and chain/author/UniProt numbering) over MCP and in plugin installs, the npm package, and the Docker image
Getting started
Connect to the hosted instance, no install:
claude mcp add --transport http interpro-mcp-server https://interpro.caseyjhand.com/mcpOr run it locally:
claude mcp add interpro-mcp-server -- npx -y @cyanheads/interpro-mcp-serverFor other clients, add this to the MCP config file:
{
"mcpServers": {
"interpro-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/interpro-mcp-server"]
}
}
}No API key is needed. For Docker or a source build, see Running the server.
Configuration
The InterPro API is keyless. The server defines one optional variable, and these framework variables are the ones most often set:
Variable | Description | Default |
| Optional contact address the EBI Job Dispatcher requires to submit InterProScan jobs. Unset, | unset |
| Transport: |
|
| HTTP server port. |
|
| HTTP server host. |
|
| HTTP endpoint path. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
See .env.example for the common framework overrides.
Running the server
Local development
Requires Bun v1.4.0 or higher (or Node.js v24+).
Clone and install:
git clone https://github.com/cyanheads/interpro-mcp-server.git cd interpro-mcp-server && bun install cp .env.example .env # optional; the server needs no keysBuild and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/interpro-mcp-server:latestThe image defaults to HTTP transport, stateless session mode, and logs to /var/log/interpro-mcp-server. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/interpro-mcp-server:latest"]. To build locally, docker build -t interpro-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Server-specific environment parsing ( |
| Tool definitions ( |
| InterPro service: HTTP/1.1 adapter, pacer and deadlines, accession routing, cursors, schemas, and the shared result formatter. |
| Sequence parsing, the precalculated lookup, InterProScan job submission and polling, and scan result segmentation. |
| Published agent skill ( |
| Unit and integration tests, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches, with no
try/catchin tool logicUse
ctx.logfor request-scoped loggingRegister new tools in the
createApp()array insrc/index.tsWrap 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 testLicense
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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Query STRING interactions, enrichment, annotations, homology, and PPI networks.
Protein research over UniProtKB: search by function, fetch curated records, map IDs, proteomes.
Look up genes, sequences, variants, homologs, and cross-database xrefs from Ensembl REST.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides seamless access to UniProtKB protein database, enabling queries for protein entries, sequences, Gene Ontology annotations, full-text search, and ID mapping across 200+ database types.553 PyPI2MIT
- AlicenseNot gradedqualityCmaintenanceProvides access to UniProt protein sequence and function knowledge base, enabling search and retrieval of protein entries, proteomes, taxonomy, and feature annotations.308 npmMIT
- AlicenseAqualityDmaintenanceProvides access to EMBL-EBI bioinformatics data including InterPro domains, Pfam families, protein features, and taxonomy through a unified tool.11MIT
- FlicenseNot gradedqualityCmaintenanceProvides protein family, domain, and functional annotation using InterProScan, supporting local or API backends.-