Skip to content
Back to skills

Csv Fx Normalize

ASecurity

Normalize a CSV's EUR amounts to USD using live FX rates, with a graceful offline fallback. Use to convert or normalize a currency column in tabular data.

  • 2 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added October 3, 2026
ai-agentspythonbashapi

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned October 4, 2026

npx -y skills add yaniv-golan/cowork-harness --skill csv-fx-normalize --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Csv Fx Normalize?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Csv Fx Normalize
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/yaniv-golan-csv-fx-normalize/badge)](https://www.skillsdirectory.com/skills/yaniv-golan-csv-fx-normalize)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: csv-fx-normalize
description: Normalize a CSV's EUR amounts to USD using live FX rates, with a graceful offline fallback. Use to convert or normalize a currency column in tabular data.
---

# csv-fx-normalize

Converts EUR amounts in a CSV to USD using a live exchange rate, via a **bundled
producer script** (`scripts/normalize.py`). The skill's job genuinely needs the
network — fetching the rate — so this is also the worked example of **degrading
gracefully under a sealed network**: in Cowork (default-deny egress) the rate fetch
is blocked, and the skill falls back to reporting amounts in their source currency,
clearly flagged. It never fails or hangs because the network is sealed.

## When to use

The user has a CSV with a EUR-denominated `amount_eur` column and wants it normalized
to USD.

## How to run

1. Locate the CSV. Default for this example: `uploads/sales_eur.csv`.
2. Run the bundled producer (reachable via `${CLAUDE_PLUGIN_ROOT}`):

   ```bash
   S="${CLAUDE_PLUGIN_ROOT}/skills/csv-fx-normalize/scripts/normalize.py"
   [ -f "$S" ] || S="$(find /sessions/*/mnt/.local-plugins /sessions/*/mnt/.remote-plugins \
     -path '*/skills/csv-fx-normalize/scripts/normalize.py' 2>/dev/null | head -1)"
   python3 "$S" uploads/sales_eur.csv outputs
   ```

   In Cowork's default host-loop mode the bash tool rewrites the host path the agent writes in
   for `${CLAUDE_PLUGIN_ROOT}` to the plugin's mount inside the VM, so the first line finds the
   script; the second line is the fallback for a Desktop older than 1.40609.0, or a plugin whose
   mount path the rewrite skips, and finds the script at that mount.

   It makes one outbound call — to a public FX API — to get the EUR→USD rate. If that
   call is blocked (as it is under Cowork's default-deny egress), it falls back to the
   source currency. Either way it writes `outputs/normalized.json` and
   `outputs/summary.md` and prints a one-line summary.
3. Read `outputs/summary.md` and tell the user whether the amounts were **converted to
   USD** or it **fell back to source currency (offline)**, plus the path to the JSON.

## Constraints

- Standard library only; the **one** network call is the FX fetch, and it must degrade
  gracefully when blocked — that's the property this skill demonstrates.
- Treat `outputs/` as write-once for the deliverable.

Files in this skill

  • SKILL.md2.2 KB
  • scripts/normalize.py4.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.