npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@hovatar/platlas-mcp

v0.1.0

Published

MCP server for PLATLAS — a GWAS/pheWAS atlas of 1167 phenotypes across 5 ancestry groups on GRCh38.

Downloads

20

Readme

platlas-mcp

An MCP server for PLATLAS — a pleiotropy atlas of 1,167 phenotypes × ~60M GRCh38 variants across five ancestry groups. It lets an AI assistant query the atlas directly: single-variant pheWAS, batch triage of a candidate list, ancestry comparison, and trait-first locus lookup.

Read-only. Three dependencies. No build step.


Install

Requires Node.js 20+. Nothing to clone — npx fetches the server on demand.

Claude Code

claude mcp add platlas -- npx -y @hovatar/platlas-mcp

Claude Desktop

~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "platlas": {
      "command": "npx",
      "args": ["-y", "@hovatar/platlas-mcp"]
    }
  }
}

From source

Useful if you want to read or modify the tools:

git clone https://github.com/Hovatar/platlas-mcp.git ~/platlas-mcp
cd ~/platlas-mcp && npm install
claude mcp add platlas -- node ~/platlas-mcp/src/index.js

Verify it connected

Ask your assistant: "Using PLATLAS, what traits is 16:53767042:T:C associated with?" — expect ~104 phenotypes led by Body Mass Index. If it answers without calling a tool, it is not connected.

Configuration

| variable | default | purpose | |---|---|---| | PLATLAS_API_BASE | https://platlas.hovatar.app | point at a local instance, e.g. http://localhost:8899 | | PLATLAS_TIMEOUT_MS | 60000 | per-request timeout |


Tools

| tool | answers | |---|---| | platlas_find_traits | "what's the id for LDL cholesterol?" — start here when the user names a trait in words | | platlas_variant_phewas | "what traits is this variant associated with?" | | platlas_screen_variants | "rank these 200 candidate variants" | | platlas_compare_ancestries | "is this effect European-specific?" | | platlas_trait_loci | "what loci does type 2 diabetes have in EUR?" |

Every result opens with a CENSUS block giving whole-result totals before any row, so truncation can never be mistaken for the full answer, and closes with a HOW TO READ THIS footer. Tables are TSV — cheap in tokens and pasteable into R or pandas unchanged.


What this data will not tell you

These are properties of the atlas, not limitations of the server, and the tools state each one where it matters rather than letting a model infer otherwise.

Absence is not a null result. Summary statistics are retained only where p < 1e-4. There is no sub-threshold baseline. A phenotype missing from a result was not necessarily tested and null — its statistics may simply not have been retained. scope="tested" and platlas_compare_ancestries separate the four real states: significant, sub-threshold, not-retained, and never-released.

"EUR only" is usually study design. 609 of 1,167 phenotypes were released in exactly one ancestry group (608 of them EUR-only); only 47 exist in all five. Per-group coverage is EUR 1,154, ALL 558, AFR 328, EAS 93, AMR 61. A signal appearing only in Europeans is far more often a statement about what was run than about biology.

ALL is not a population. It is the trans-ancestry MR-MEGA meta-analysis — not the union of the other four, and not independent replication.

Loci are distance-clumped, not LD-clumped. 500 kb windows, no reference panel, no r². Two independent signals within 500 kb collapse into one; two variants further apart appear separately even in LD. The locus count is an approximation, never a causal-variant count.

No rsIDs, no gene symbols. rsid and nearest_gene are null on every row. Variants are addressable only as chr:pos:ref:alt on GRCh38 autosomes 1–22, and allele order is part of the key — 16:53767042:T:C exists, 16:53767042:C:T does not. Given an rsID or a gene name, the tools refuse rather than guess coordinates.

Phecodes are hierarchical and correlated. Phe_250 is the parent of Phe_250_2. A variant significant across six diabetes phecodes has one signal, not six; results flag this.

The phenotype catalog's own population list is unreliable. It overstates for 556 phenotypes (naming SAS for 412, which is in no release) and understates for 558. Ancestry availability is read only from the release metadata.


Development

PLATLAS_API_BASE=http://localhost:8899 npm test

Tests hit a live PLATLAS; they assert shape and invariants rather than exact counts, so a data refresh does not break them.