The Short Answer
You can ask Claude about your 23andMe raw data without uploading the file: a small, free package reads it on your own computer and gives Claude only what it finds at the positions it's asked about, with sources.
TL;DR: Install
deepdna-mcpin Claude Code or Claude Desktop, then ask Claude about one gene in your file, giving the file's full path. The file stays on your computer and DeepDNA gets nothing from it; what the tool reports, a few letters per position, goes into your conversation with Claude. It won't tell you your metabolizer status, and it says why.
If you have a raw data file from 23andMe, AncestryDNA, MyHeritage or FamilyTreeDNA in your Downloads folder, the obvious move is to drag it into a chat and ask what it means. That sends the whole file to the AI provider, and the answer rests on the model's memory of what those positions usually mean, with no strand check and no cited record. There's another way: the model asks a question, a tool on your computer answers it from the file, and the answer comes with its sources.
What You Need
- Claude Code or Claude Desktop. Any app that can start a local MCP server works, Cursor and VS Code included; this article uses Claude.
- uv, the Python package runner:
brew install uvon a Mac, or the uv installation guide for Windows and Linux. - Your raw data file: the
.txtfrom 23andMe or AncestryDNA, the.csvfrom MyHeritage, or the.zipthey come in. FamilyTreeDNA downloads a.csv.gz: decompress it first (double-click it on a Mac). VCF files from whole-genome sequencing are not supported. If you haven't downloaded yours yet, here is how to get your 23andMe raw data.
The package is open source (MIT), on GitHub and PyPI. DeepDNA's part is a few hundred lines of Python you can read before you run it, which matters for something that runs next to your genetic data. It also installs the MCP SDK and an HTTP client from PyPI.
Set Up deepdna-mcp in Claude Code or Claude Desktop
In Claude Code, run this in a terminal:
claude mcp add --scope user deepdna-local -- uvx [email protected]
--scope user makes it available in every folder, not only the current one.
In Claude Desktop, open Settings → Developer → Edit Config. Add the deepdna-local entry to claude_desktop_config.json; if the file already has an mcpServers section, add only the entry inside it:
{
"mcpServers": {
"deepdna-local": {
"command": "uvx",
"args": ["[email protected]"]
}
}
}
Restart Claude Desktop. If it can't find uvx, put its full path in command: which uvx prints it on a Mac (for example /opt/homebrew/bin/uvx), and where uvx on Windows. On a Mac, allow access to the Downloads folder if macOS asks, or move the file to another folder.
The version is pinned, so DeepDNA's code only changes when you choose to update it. Its dependencies are resolved when uv installs it.
Ask Claude About Your 23andMe File
Give Claude the file's full path and name the gene you care about. To copy a full path, hold Option and right-click the file in Finder, then choose Copy as Pathname; on Windows, Shift and right-click, then Copy as path. We used:
My 23andMe file is at /Users/you/Downloads/genome.txt. What does it show at the CYP2C19 positions DeepDNA curates, and what do the sources say about clopidogrel?
We ran it in Claude Code on a synthetic file in 23andMe's format: 630,006 rows of random genotypes with a few positions set by hand. It is not a real person's data. Claude made two tool calls:
read_dna_filewith the path andgenes: ["CYP2C19"], so only that gene was reported.lookup_drug_genewithCYP2C19andclopidogrel, to fetch the guideline record from DeepDNA's public API.
Claude Code shows each call as it happens. It can also open the file with its own Read, Grep or Bash tools, which would put rows of the file into the conversation. It reads files in the folder you start it from, and in every folder inside it, without asking, and a new terminal usually opens in your home folder, which contains Downloads.
So start Claude Code from an empty folder, for example with mkdir -p ~/dna-chat && cd ~/dna-chat && claude. When it asks to run deepdna-local's read_dna_file, approve it. If it asks to use Read, Grep or Bash on your DNA file, say no, and if you see it read the file anyway, stop it: whatever it read is already in the conversation. In a normal Claude Desktop chat, Claude sees only the files you attach, unless you've given it folder access or a filesystem connector.
What the Tool Returned
Here is an excerpt from the real read_dna_file result. We kept one of the three positions (the other two, *3 and *17, both read 0 copies) and cut the record texts and sources; "…" marks the cuts:
{
"file": {
"format": "23andMe",
"data_lines": 630006,
"orientation": {
"strand": "plus",
"positions_checked": 6,
"matching_plus": 6,
"matching_minus": 0
}
},
"summary": {
"positions": 3,
"read": 3,
"counted": 3,
"no_call": 0,
"not_in_file": 0,
"unexpected_letters": 0
},
"positions": [
…
{
"rsid": "rs4244285",
"gene": "CYP2C19",
"name": "*2 (c.681G>A)",
"state": "read",
"letters": "AG",
"reference_allele": "G",
"variant_allele": "A",
"counted": true,
"variant_allele_copies": 1,
…
},
…
],
"note": "Counts are per position. They are not a star allele, diplotype, metabolizer status or risk: …",
…
}
The result also carries the tool's own privacy line:
Read on this computer. deepdna.ai was asked only for the public records it serves to every user; nothing from this file was sent to it. This result is part of the conversation with the AI model.
*2 is the name geneticists give the most common CYP2C19 variant that switches the enzyme off. A result written like *1/*2 describes both copies of the gene, one on each chromosome.
Before it counts anything, the package checks the strand. The same DNA change can be written with different letters depending on which of the two DNA strands a file reports. 23andMe uses the plus strand of the GRCh37 reference, where *2 is an A instead of a G; other files can use the other strand. The package compares the file with positions where the strand can be told apart, and here six out of six agreed. Where both strands use the same pair of letters (A/T or C/G), it counts only once the strand is confirmed, and letters that fit neither strand are flagged, never counted.
A gap is never good news here. Each position comes back as read, no_call (the chip couldn't read it), not_in_file or unexpected_letters, and a missing or unreadable position is reported as unknown, not as normal.
And it stops at counting. variant_allele_copies: 1 means the file shows one copy of the letter that defines *2 at this one position. It does not mean "you are *1/*2", let alone "you are an intermediate metabolizer", and the note in the result says so.
What Claude Said
Claude's answer was longer than this. These are its words, trimmed for length:
So the file shows one copy of the A allele that defines *2. It shows no copies of the *3 or *17 variants.
These are counts at three single positions. They are not a star-allele result, a diplotype or a metabolizer status, so I won't place you in a metabolizer group from them […]
For poor and intermediate metabolizers having PCI (a stent procedure) for acute coronary syndrome, CPIC 2022 recommends a different antiplatelet drug, prasugrel or ticagrelor. […] CPIC defines the groups by full diplotype (both copies of the gene), not by single positions […]
If you take clopidogrel now or it has come up for you, show this result to your prescriber and ask whether a validated CYP2C19 test makes sense. Please don't start, stop or change any medication based on this file. […]
[…] the genotype results above are now part of this conversation with me, the AI model.
We cut one line on purpose. In it, Claude said the chip doesn't test other CYP2C19 alleles such as *4, *8 and *35. Which alleles a chip tests depends on its version, and the tool reported nothing about that. Its note says only that other variants in the gene are not considered. Even with good tools, read what the model adds on top.
What Leaves Your Computer, and What Doesn't
| What | Where it goes |
|---|---|
| Your raw data file | Stays on your computer. The package reads it there and never uploads it. |
| The package's downloads | Each session, the first time it reads a file, it downloads DeepDNA's public records for the curated variants: about 40 requests, the same for every user. Like any web request, they show deepdna.ai your IP address and the package version; DeepDNA doesn't store the IP. |
lookup_drug_gene |
Sends the gene and drug names you asked about (here CYP2C19 and clopidogrel) to DeepDNA's public API. |
What read_dna_file returns |
The letters and counts at the positions it's asked for go into your conversation with Claude, so they reach Anthropic, or whichever AI provider your app uses, under its terms. |
So we won't tell you your genetic data never leaves your computer: the letters at the positions you ask about go into the chat. What we can say is narrower. The file stays where it is, DeepDNA gets nothing from it, and the package hands the model only the positions it's asked for; with a gene named, only that gene's. That holds as long as Claude reads the file through the tool rather than opening it itself. Our privacy policy describes what we keep from API requests: no IP addresses and no request bodies.
What It Won't Do
- It won't give you a metabolizer status, a diplotype, a diagnosis or a dose. Those depend on every relevant variant in the gene, on which chromosome copy each one sits on, and sometimes on copy number; single chip positions can't settle that. For star-allele calls from a VCF, use a pipeline built for it, such as PharmCAT, and confirm anything that could change a prescription with a validated clinical test.
- It is designed not to surprise you. DeepDNA files APOE, BRCA1 and HFE under disease risk (Alzheimer's disease, breast and ovarian cancer, iron overload), so the package reads them only when they are named in the request, and the tool tells Claude to name them only if you do. A question about a drug whose record involves one of them, such as lecanemab (APOE) or olaparib (BRCA1), is a question about that gene: ask it only if you want that result.
- It reports rare chip calls with a warning, not a filter. Consumer chips are good at common variants and poor at rare ones. In a 2021 BMJ study, only 4.2% of rare pathogenic BRCA1/BRCA2 calls on UK Biobank's genotyping arrays were confirmed by sequencing, and in consumer raw data from 21 people, 20 had at least one false-positive rare pathogenic call.
- It covers a small, curated set: 12 genes (CYP2C19, CYP2C9, CYP2D6, SLCO1B1, VKORC1, UGT1A1, G6PD, MTHFR, COMT, HFE, APOE and BRCA1) and 51 drug–gene pairs across 11 of them. Forty pairs cite a CPIC or DPWG guideline; the rest cite a drug label, ClinVar and OMIM records, or the primary literature. Every record lists its sources, and anything outside the set isn't reported.
Questions That Work Well
- "What does my file at [path] show for CYP2C9 and VKORC1, and what do the sources say about warfarin?"
- "Does my file at [path] show the MTHFR C677T variant, and what does the record say about it?"
- "Which drugs does DeepDNA have records for with CYP2D6?" This one sends only the gene name and doesn't open your file.
Name the gene you care about. Without one, the tool reports every curated position outside APOE, BRCA1 and HFE, and all of them go into the conversation.
Building an agent instead? The same cited records are behind DeepDNA's public API and its remote MCP server at https://deepdna.ai/mcp, both free with no key: see the docs and the pharmacogenomics MCP server. Found a file the package can't read, or a gene you'd like covered? Open an issue on GitHub, and please don't paste genotypes into it.
Frequently Asked Questions
Can Claude read my 23andMe raw data file?
Yes, with a tool. Install the deepdna-mcp package as an MCP server in Claude Code or Claude Desktop and give Claude the file's full path. The package reads the file on your computer and returns what it shows at the variants DeepDNA curates, with sources. Without a tool, an uploaded file goes to the AI provider whole, and the reading rests on the model's memory, with no cited database behind it.
Does my DNA file get uploaded to DeepDNA or to Anthropic?
The file itself is not uploaded anywhere, and nothing from it is sent to DeepDNA, as long as Claude reads it through the tool rather than opening it itself. The letters and counts the tool returns for the positions you ask about become part of your conversation with Claude, so Anthropic processes them like the rest of the conversation.
Can it tell me if I'm a poor metabolizer for clopidogrel?
No. It doesn't infer a metabolizer status: that is assigned from a full diplotype by a validated pharmacogenomic test. It reports what your file shows at single positions, and the CPIC guidance for the drug. Talk to your prescriber about a test.
Which apps can use it?
Any app that can start a local (stdio) MCP server, such as Claude Code, Claude Desktop, Cursor or VS Code. Chat apps that only connect to remote servers can't run it.
Does it work with AncestryDNA, MyHeritage or FamilyTreeDNA files?
Yes. It reads AncestryDNA .txt files, MyHeritage .csv files, FamilyTreeDNA .csv files once decompressed from .csv.gz, and the .zip files they come in, as well as 23andMe. It does not read VCF files.
Is it free?
The package is free and open source (MIT), and DeepDNA's public API needs no key or account. You need an app that can run it, such as Claude Code or Claude Desktop.
This article is for educational purposes only and does not constitute medical advice. Pharmacogenomic guidance describes what guidelines say about genotype groups; decisions about medicines belong to a prescriber or pharmacist, ideally with a validated clinical test.
This article was created with AI assistance and reviewed by the DeepDNA editorial team.
DNA and bloodwork, as an API
DeepDNA is now an API for AI agents and health apps. The knowledge endpoints are live and free, no key, and a free local package reads the curated positions of a raw DNA file on your own computer. Parsing DNA files and lab reports on our servers, and crossing the two, is in private beta. Building something with genetic or lab data? Tell us what.
Read the API docs