Agent skill

Structuring Radiology Reports

by maziyarpanahi in maziyarpanahi/openmed

Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER.

Apache-2.0Auto-check passedResearch & Science

Install Structuring Radiology Reports

skills CLI
$ npx skills add maziyarpanahi/openmed --skill structuring-radiology-reports -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install maziyarpanahi/openmed structuring-radiology-reports --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/maziyarpanahi/openmed.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/structuring-radiology-reports .claude/skills/structuring-radiology-reports && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
structuring-radiology-reports
GitHub stars
5.5k
Token cost
~2.2k tokens
SKILL.md length
702 words
Files
1
Skills in repo
74
Repo updated
First seen
Licence
Apache-2.0

At a glance

Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER.

  • Works in 7 steps: De-identify first.… → Split sections by the standard headers… → Run analyze_text for anatomy and finding… → …
  • The user has a CT/MRI/X-ray/ultrasound/mammography report and needs the sections split (technique
  • SKILL.md covers When to use, Quick start, Workflow and Hand-off to / from OpenMed, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Structuring Radiology Reports is an agent skill from maziyarpanahi/openmed. Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER. Use when the user has a CT/MRI/X-ray/ultrasound/mammography report and needs the sections split (technique, comparison, findings, impression), lesion measurements and laterality captured, BI-RADS / Lung-RADS assessment categories pulled, or incidental findings and recommended follow-up tracked. Trigger keywords: radiology report, findings…

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Research & Science, covering Clinical and healthcare research. The repository describes itself as: Local-first healthcare AI: clinical NER & HIPAA PII de-identification that runs 100% on-device. 2,200+ medical models, 21 languages, Apple MLX + Python, no cloud, no patient data…. The licence is Apache-2.0.

When your agent uses it

  • The user has a CT/MRI/X-ray/ultrasound/mammography report and needs the sections split (technique
  • Lesion measurements and laterality captured
  • BI-RADS / Lung-RADS assessment categories pulled
  • Incidental findings and recommended follow-up tracked

Example prompts

  • “Use the structuring-radiology-reports skill to convert free-text radiology narratives into structured findings and impression — with measurements…”
  • “/structuring-radiology-reports”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. De-identify first. openmed.deidentify(report, policy=...); structure
  2. Split sections by the standard headers (TECHNIQUE, COMPARISON, FINDINGS,
  3. Run analyze_text for anatomy and finding entities; capture measurements
  4. Build one structured finding per observation: `{anatomy, finding,
  5. Pull the assessment category (BI-RADS 0-6, Lung-RADS 1-4X) from the
  6. Flag incidental findings — findings unrelated to the exam indication — and
  7. Map toward RadLex / DICOM-SR if you need coded interoperability, and

What it can do on your machine

Read from SKILL.md and the folder at commit 6b1bb2c. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are python).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • acr.org
    • radlex.org
    • dicomstandard.org
    • rsna.org
    • hl7.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Structuring Radiology Reports loads about 2.2k tokens when it runs. Until then it costs about 227 tokens; SKILL.md has 702 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~227
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from maziyarpanahi/openmed at commit 6b1bb2c, republished under its Apache-2.0 licence (© maziyarpanahi). 702 words, ~2,196 tokens.

Download SKILL.mdSave it as .claude/skills/structuring-radiology-reports/SKILL.md (or your agent's skills folder).
name
structuring-radiology-reports
description
Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER. Use when the user has a CT/MRI/X-ray/ultrasound/mammography report and needs the sections split (technique, comparison, findings, impression), lesion measurements and laterality captured, BI-RADS / Lung-RADS assessment categories pulled, or incidental findings and recommended follow-up tracked. Trigger keywords: radiology report, findings, impression, RadLex, DICOM-SR, BI-RADS, Lung-RADS, ACR, laterality, measurement, nodule, incidental finding, follow-up, structured reporting. Pairs after OpenMed: run openmed.analyze_text on the report (Anatomy/Disease/measurement entities), then assemble structured findings. De-identify the report first. Decision-support only — not a diagnostic medical device.
license
Apache-2.0
metadata.project
OpenMed
metadata.category
imaging-ocr
metadata.pairs
after
metadata.version
1.0

Structuring radiology reports

A radiology report is prose, but its meaning is structured: a technique, a comparison, a list of findings (each with anatomy, laterality, and a measurement), and an impression that may carry an assessment category (BI-RADS, Lung-RADS) and a follow-up recommendation. This skill turns the narrative into that structure so findings are trackable — especially incidental findings that need downstream follow-up.

OpenMed extracts the anatomy, disease/finding, and measurement spans on-device; this skill organizes them into sectioned, coded findings. It is decision-support, not a diagnostic device — every structured finding must be attributable back to its source sentence for radiologist review.

When to use

  • You have a CT/MRI/X-ray/US/mammography report and need {technique, comparison, findings[], impression} with measurements and laterality.
  • You must capture BI-RADS (breast) or Lung-RADS (lung screening) assessment categories and the recommended action.
  • You need to track incidental findings and the follow-up interval/modality the report recommends.
  • You are mapping findings toward RadLex terms or a DICOM-SR structured report.

Quick start

python
import openmed

report = (
    "TECHNIQUE: CT chest without contrast.\n"
    "COMPARISON: CT 2023-11-02.\n"
    "FINDINGS: A 8 mm solid nodule is noted in the right upper lobe, "
    "unchanged. No pleural effusion.\n"
    "IMPRESSION: 8 mm right upper lobe nodule, stable. Lung-RADS 2. "
    "Recommend annual low-dose CT screening."
)

# 1) De-identify the report on-device first (synthetic example shown).
deid = openmed.deidentify(report, policy="hipaa_safe_harbor")
text = deid.deidentified_text

# 2) Run NER for anatomy / finding / measurement spans.
ents = openmed.analyze_text(
    text,
    model_name="anatomy_detection_superclinical",   # Anatomy category
    output_format="dict",
)["entities"]

# 3) Split sections by header, then attach entities + measurements per finding.
import re
SECTION = re.compile(r"(?im)^(TECHNIQUE|COMPARISON|FINDINGS|IMPRESSION)\s*:")
sections, last, name = {}, 0, None
for m in SECTION.finditer(text):
    if name: sections[name] = text[last:m.start()].strip()
    name, last = m.group(1).upper(), m.end()
if name: sections[name] = text[last:].strip()

structured = {
    "technique": sections.get("TECHNIQUE"),
    "comparison": sections.get("COMPARISON"),
    "findings": _split_findings(sections.get("FINDINGS", "")),   # one per sentence
    "impression": sections.get("IMPRESSION"),
    "measurements": re.findall(r"\b\d+(?:\.\d+)?\s?(?:mm|cm)\b", text),
    "laterality": sorted({w for w in ("right", "left", "bilateral")
                          if re.search(rf"\b{w}\b", text, re.I)}),
    "assessment": (re.search(r"\b(?:BI-RADS|Lung-RADS)\s*\d[A-C]?\b", text, re.I)
                   or [None])[0] if re.search(r"RADS", text, re.I) else None,
    "follow_up": _extract_followup(sections.get("IMPRESSION", "")),
}

_split_findings / _extract_followup are your sentence splitter and a recommendation matcher ("recommend …", "follow-up in N months"); keep each finding tied to its source sentence offsets.

Workflow

  1. De-identify first. openmed.deidentify(report, policy=...); structure from deidentified_text. Patient name, MRN, accession, and dates go before anything is stored or shared.
  2. Split sections by the standard headers (TECHNIQUE, COMPARISON, FINDINGS, IMPRESSION; also HISTORY/INDICATION). Reports vary — fall back to position if headers are missing.
  3. Run analyze_text for anatomy and finding entities; capture measurements ("8 mm", "1.2 cm") and laterality ("right", "left", "bilateral") near each finding.
  4. Build one structured finding per observation: {anatomy, finding, laterality, measurement, change_vs_prior, source_offsets}. "Unchanged", "stable", "increased", "new" capture temporal change against the comparison.
  5. Pull the assessment category (BI-RADS 0-6, Lung-RADS 1-4X) from the impression and the recommended follow-up (modality + interval).
  6. Flag incidental findings — findings unrelated to the exam indication — and route them to a follow-up tracker so they aren't lost.
  7. Map toward RadLex / DICOM-SR if you need coded interoperability, and surface the whole structure to a radiologist for verification.

Hand-off to / from OpenMed

OpenMed's analyze_text returns a dict; result["entities"] items carry text, label, confidence, start, end.

  • From extracting-clinical-entities: Anatomy and Disease/finding entities populate each structured finding; keep offsets so every field traces to a source sentence.
  • From extracting-lab-tables / OCR: if the report is a scan, OCR it first (openmed.multimodal.ocr.ocr), then run NER on the recognized text.
  • From segmenting-clinical-sections: reuse section detection if your reports don't use canonical headers.
  • To building-patient-timelines: dated findings + change-vs-prior feed a longitudinal view (e.g. nodule size over time).
  • To extracting-dicom-metadata: pair the structured findings with the study's DICOM metadata when assembling a DICOM-SR object.
  • De-identify with deidentifying-clinical-text (openmed.deidentify) before any export. Everything runs on-device.
Show full SKILL.md (260 more words)Show less

Edge cases & gotchas

  • Negation and uncertainty change meaning. "No pleural effusion" and "cannot exclude metastasis" are findings about absence/uncertainty — don't record them as positive findings. Use resolving-clinical-context (openmed.clinical) for negation/hedging before asserting a finding.
  • Laterality errors are clinically dangerous. "Right" vs "left" must bind to the correct finding; a misattributed side can drive wrong-site decisions. Tie laterality to the nearest anatomy span by offset, not document-wide.
  • Measurements need their unit and axis. "8 mm" vs "0.8 cm" are equal; a bare "8" is ambiguous. Capture the unit; for masses, capture all reported dimensions ("2.1 x 1.4 cm"), not just the first.
  • Assessment categories have controlled value sets. BI-RADS 0-6 and Lung-RADS 1, 2, 3, 4A, 4B, 4X each map to a defined management action — don't invent or round categories; pull the literal value from the impression.
  • Incidental findings get lost. A renal cyst mentioned in a chest CT is the classic missed follow-up. Explicitly separate incidental from indication-related findings and push incidentals to a tracker.
  • The impression is the actionable summary, but findings may contain detail the impression omits — structure both, and prefer the impression for follow-up/assessment.
  • Decision-support disclaimer. This is not a diagnostic medical device; it organizes text a radiologist authored. Every structured field must be reviewable against its source. Do not auto-act on a derived category or follow-up without clinician sign-off.

Standards & references

© maziyarpanahi, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/structuring-radiology-reports of maziyarpanahi/openmed.

Open the folder on GitHubat commit 6b1bb2c

Compare with similar skills

Structuring Radiology Reports next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Structuring Radiology Reports compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Structuring Radiology Reports this skillmaziyarpanahi/openmed5.5k—~2.2kAutomated safety check: PassApache-2.0
Clinical Trials Databasegoogle-deepmind/science-skills3.2k2 repos~3.2kAutomated safety check: PassApache-2.0
CHARLS Paper Reproduction Guidexjtulyc/MedgeClaw6171 repos~1.8kAutomated safety check: PassNone
Biomedical Analysis Dispatchxjtulyc/MedgeClaw6171 repos~2kAutomated safety check: PassNone
Research Proposalluwill/research-skills858—~4.4kAutomated safety check: NotesNone
Medical Imaging ReviewLeonChaoX/qinyan-academic-skills9433 repos~1.1kAutomated safety check: NotesMIT

Similar skills

  • Clinical Trials Database

    google-deepmind/science-skills

    Query ClinicalTrials.gov via APIv2. An agent skill from google-deepmind/science-skills.

    3.2k GitHub starsUsed in 2 repos~3.2k tokens
    Research & ScienceAuto-check passed
  • Guides an agent through reproducing papers built on the CHARLS health and retirement survey, from variable mapping to cognition, depression and isolation scores.

    617 GitHub starsUsed in 1 repo~1.8k tokens
    Research & ScienceAuto-check passed
  • Routes bioinformatics, drug discovery, clinical and multi-omics tasks from a chat interface to Claude Code sessions running K-Dense scientific skills, with a live dashboard per task.

    617 GitHub starsUsed in 1 repo~2k tokens
    Research & ScienceAuto-check passed
  • Research Proposal

    luwill/research-skills

    A skill your agent uses when the user asks to write or draft a PhD / doctoral research proposal, research plan, 研究计划书, or 开题报告 — a forward-looking plan of background, gap, research questions…

    858 GitHub stars~4.4k tokensUpdated 9 days ago
    Research & ScienceAuto-check: notes
  • Medical Imaging Review

    LeonChaoX/qinyan-academic-skills

    Write comprehensive literature reviews for medical imaging AI research.

    943 GitHub starsUsed in 3 repos~1.1k tokens
    Research & ScienceAuto-check: notes
  • Drug Research

    lamm-mit/scienceclaw

    Generates comprehensive drug research reports with compound disambiguation, evidence grading, and mandatory completeness sections.

    244 GitHub starsUsed in 3 repos~1.7k tokens
    Research & ScienceAuto-check passed

More from maziyarpanahi/openmed

All 74 skills in this repo
  • Checks OpenMed de-identified clinical text against the 18 HIPAA Safe Harbor identifier categories and reports gaps and residual re-identification risk.

    5.5k GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • OpenMed Model Card Writer

    maziyarpanahi/openmed

    Fills in a model card for an OpenMed clinical NER or de-identification model from its evaluation reports: intended use, metrics, subgroups and limitations.

    5.5k GitHub stars~1.8k tokensUpdated yesterday
    Auto-check passed
  • Walks a data pipeline against the HIPAA Privacy and Security Rule checklist and produces a gap report before it processes patient data.

    5.5k GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • ICD-10 Coding Assistant

    maziyarpanahi/openmed

    Suggests candidate ICD-10-CM diagnosis and ICD-10-PCS procedure codes for clinical text extracted by OpenMed, with rationale for a certified coder to review.

    5.5k GitHub stars~2k tokensUpdated yesterday
    Auto-check passed
  • OpenMed ETL to OMOP CDM

    maziyarpanahi/openmed

    Maps OpenMed-extracted, terminology-coded conditions, drugs and measurements into OMOP CDM v5.4 tables for OHDSI and ATLAS analytics.

    5.5k GitHub stars~1.9k tokensUpdated yesterday
    Auto-check passed
  • Extracting SDOH and Z-Codes

    maziyarpanahi/openmed

    Finds social risks such as housing instability or food insecurity in clinical notes and proposes matching ICD-10-CM Z-codes for a coder to confirm.

    5.5k GitHub stars~1.9k tokensUpdated yesterday
    Auto-check passed

Questions about Structuring Radiology Reports

What does Structuring Radiology Reports do?

Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER. Structuring Radiology Reports is an agent skill from maziyarpanahi/openmed. Converts free-text radiology narratives into structured findings and impression — with measurements, laterality, anatomy, and follow-up recommendations — after OpenMed NER.

When should I use Structuring Radiology Reports?

Structuring Radiology Reports fits situations like: the user has a CT/MRI/X-ray/ultrasound/mammography report and needs the sections split (technique; lesion measurements and laterality captured; BI-RADS / Lung-RADS assessment categories pulled; incidental findings and recommended follow-up tracked.

How do I install Structuring Radiology Reports in Claude Code?

Run `npx skills add maziyarpanahi/openmed --skill structuring-radiology-reports -a claude-code`. Or copy the skill folder (skills/structuring-radiology-reports in maziyarpanahi/openmed) into .claude/skills/structuring-radiology-reports in your project. Claude Code loads it when a task matches its description.

How do I install Structuring Radiology Reports in Codex?

Run `npx skills add maziyarpanahi/openmed --skill structuring-radiology-reports -a codex`. Or copy the skill folder (skills/structuring-radiology-reports in maziyarpanahi/openmed) into .agents/skills/structuring-radiology-reports in your project. Codex loads it when a task matches its description.

Can I use Structuring Radiology Reports in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add maziyarpanahi/openmed --skill structuring-radiology-reports -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/structuring-radiology-reports, .gemini/skills/structuring-radiology-reports, .github/skills/structuring-radiology-reports and .opencode/skills/structuring-radiology-reports in your project.

What does Structuring Radiology Reports need to run?

SKILL.md names no scripts, command-line tools or credentials: Structuring Radiology Reports is instructions for the agent only. Our summary lists: Python 3.

Does Structuring Radiology Reports access the network?

SKILL.md names 5 domains. As links in the text: acr.org, radlex.org, dicomstandard.org, rsna.org and hl7.org. This is read from the text; nothing was executed.

Is Structuring Radiology Reports safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Structuring Radiology Reports use?

Structuring Radiology Reports is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Structuring Radiology Reports use?

About 2.2k tokens (SKILL.md is roughly 8.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Structuring Radiology Reports?

Skills that share tags, products or a category with Structuring Radiology Reports: Clinical Trials Database (google-deepmind/science-skills, 3.2k stars), CHARLS Paper Reproduction Guide (xjtulyc/MedgeClaw, 617 stars), Biomedical Analysis Dispatch (xjtulyc/MedgeClaw, 617 stars) and Research Proposal (luwill/research-skills, 858 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Structuring Radiology Reports?

maziyarpanahi (a GitHub user) maintains it in maziyarpanahi/openmed, which has 5,493 GitHub stars. The repository holds 74 skills in this directory. The repository was last updated on October 9, 2026.

Source: maziyarpanahi/openmed on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.