A Claude Skill for connecting to and analyzing personal health records via SMART on FHIR
SaferSkills independently audited health-skillz (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 3 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 3 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Health Skillz helps people collect SMART on FHIR records from patient portals, review/export them locally, and optionally share them with AI using end-to-end encrypted upload.
docs/design/DESIGN.mdAGENTS.mdThis README intentionally stays high-level. API contracts, data structures, security model, and protocol details are documented in docs/design/DESIGN.md.
A live instance is available at [health-skillz.joshuamandel.com](https://health-skillz.joshuamandel.com).
Epic sandbox test credentials:
fhircamilaepicepic1git clone https://github.com/jmandel/health-skillz
cd health-skillz
bun install
cp config.json.example config.local.json
# Edit config.local.json with your base URL and client IDs
bun run setup
mkdir -p static data
ln -snf "$(pwd)/brands" static/brands
CONFIG_PATH=./config.local.json bun run devHealth check:
curl -sS http://localhost:8000/healthIf you use a different port, update the URL accordingly.
The server reads CONFIG_PATH (defaults to ./config.json).
Minimum fields you should verify in the selected config file:
server.portserver.baseURLbrands[].clientIdbrands[].redirectURL (or default ${baseURL}/connect/callback)Run examples:
CONFIG_PATH=./config.local.json bun run dev
CONFIG_PATH=./config.local.json bun run startFor Epic:
${baseURL}/connect/callback)patient/*.rsbun run dev # watch mode
bun run start # production-style local run
bun run build:brands # fetch/build provider directory assets
bun run generate-jwks # generate JWKS files
bun run setup # brands + jwkssrc/ Bun server + React client
skill/ Skill templates, scripts, references
scripts/ Build and maintenance scripts
docs/ Design and planning docs
static/ Served static assets (e.g., brands)
data/ Local runtime data (SQLite, generated files)MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.