Search InterPro entries, map protein domains and functional sites, and find proteins by domain.
One address for any MCP client. No sign-in needed on this server.
6 read
Grouped by tool name. At most: only reads or looks up information.
Odel charges nothing per call. The publisher may charge for its own service.
Search InterPro entries, map protein domains and functional sites, and find proteins by domain via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://interpro.caseyjhand.com/mcp
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.
| 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 |
interpro_search_entries toolsourceDatabase (default interpro) plus optional query (1-300 characters), entryType, goTerm (GO:0003677 form), goCategory (P, F, C), and integratedInto (an IPR accession, member databases only); no filter is required, so omitting all of them browses the databasegoTerm and goCategory require sourceDatabase: "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 read member_databases with interpro_get_entry or search the member database with integratedInto set to the matching InterPro accessionlimit capped at 100 (default 20); larger requests are clamped with a notice. Returns entries, page (total, returned, limit, hasMore, nextCursor), and the applied query; page.limit is the effective page sizeinterpro_get_entry toolaccession required; sourceDatabase is inferred from standard accession prefixes when omitted. A set accession (CL…) fails as entry_not_found and points to interpro_get_clansections selects from description, hierarchy, member_databases, go_terms, literature, cross_references, wikipedia, counters, and overlaps_with. Core metadata and unknown upstream fields remain; omitted sections returns full detailoverlapLimit pages complete overlaps_with records; overlapOffset requires it, starts at zero, and advances using overlapsPage.nextOffset. Paging requires overlaps to be retained. Selection and omissions are disclosed; absent or null overlap data stays distinct from an empty listincludeThumbnail: true, and a notice reports what was left outentry.descriptionText adds readable text with paragraph, list, and table boundaries alongside the unchanged source entry.description, including its HTML and annotation flags. It is omitted when description is excluded or no readable text is suppliedentry_withdrawn with its deletion date and short nameinterpro_get_protein_domains toolaccession (no isoform suffix); optional residuePosition (1-based, inclusive) keeps every match with a fragment covering it, with all of that match's fragments intact; includeExtraFeatures adds predicted features such as disorder and transmembrane regionsincludeResidueAnnotations: true adds residueAnnotations, 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 provenancecoverage.nextCursor until hasMore is false. 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 rulesresidue_out_of_range and protein_not_found are typed failuresinterpro_get_clan toolaccession for a Pfam (CL0016), CDD (cl21453), or PIRSF (PIRSF000047) set, with sourceDatabase (pfam, cdd, pirsf) inferred from the prefix; members page by cursor, with positive integer limit capped at 100 (default 20). Larger requests are clamped with a notice; page.limit reports the effective sizeincludeRelationships: true adds the relationship graph in slices that fit the response budget; relationshipsPage.nextOffset goes back in as relationshipOffset, which needs includeRelationships setincludeThumbnail works as on interpro_get_entry; a missing set is clan_not_foundinterpro_find_proteins_by_domain toolaccession plus optional sourceDatabase; taxonId (NCBI, default 9606) and reviewedOnly (default true; false covers reviewed and unreviewed proteins) are echoed in queryisFragment selects 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 in query and must stay unchanged when following cursorsarchitectureId accepts protein.ida_accession from interpro_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 cursorslimit capped at 50 (default 20); larger requests are clamped with a notice, and page.limit is the effective size. Ordinary results keep the protein summary, matched entry locations, taxon lineage, and native extra_fields.is_fragment annotation; missing or null status remains unknown. Architecture-filtered rows retain native extra_fields.ida_id when supplied and use detailAvailability to distinguish unavailable entry/taxon details from actual empty arraysinterpro_list_reference tooltopic required: databases, entry_types, accession_patterns, taxa, or release. The first four are local and make no network call; taxa lists common examples, not every taxonrelease reads the current InterPro version, date, and per-database entry counts, and fails as release_changed if the two upstream responses disagree on the versionBuilt 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:
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 locallyfetch rejects on Nodenull or omitted rather than filled inAgent-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 dataentry_not_found, invalid_cursor, upstream_rate_limited, and others) each paired with a recovery hintA 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.
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
git clone https://github.com/cyanheads/interpro-mcp-server.git
cd interpro-mcp-server
bun install
cp .env.example .env
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.
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
| 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. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped loggingcreateApp() array in src/index.tsIssues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
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.