eli5
Explain a topic like I'm a 5 year old. Use when the user types /eli5 <topic> or asks for a…
Import contacts (address book entries) into TRES Finance from a CSV or XLSX file. Use this skill whenever the user wants to import, upload, or bulk-add contacts, address labels, or address book entries into TRES — whether from a file they filled in after using the
$ npx -y skills add anthropics/claude-plugins-community --skill tres-import-contacts --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/tres-import-contactsContext preview
The summary Claude sees to decide when to auto-load this skill.
Import contacts (address book entries) into TRES Finance from a CSV or XLSX file. Use this skill whenever the user wants to import, upload, or bulk-add contacts, address labels, or address book entries into TRES — whether from a file they filled in after using the
name: tres-import-contacts description: "Import contacts (address book entries) into TRES Finance from a CSV or XLSX file. Use this skill whenever the user wants to import, upload, or bulk-add contacts, address labels, or address book entries into TRES — whether from a file they filled in after using the export-3rd-party-contacts skill, or from any CSV/XLSX that maps addresses to names. Trigger phrases include: 'import contacts', 'upload contacts', 'add contacts from file', 'import address book', 'load contacts into TRES', 'bulk label addresses', 'import the contacts file', 'upload the filled contacts sheet'. Also trigger when the user says something like 'I filled in the contacts file, now import it' or 'here is my contacts spreadsheet, please upload it to TRES'. Do NOT trigger for exporting or extracting unidentified addresses — that's the export-3rd-party-contacts skill. Do NOT trigger for viewing or searching the existing address book."
Read a user-provided CSV or XLSX file containing address-to-name mappings and import them as contacts into the TRES address book. This is the second half of the contacts workflow: the user previously exported unidentified addresses (via the export skill), filled in names and tags, and now wants to push those labels back into TRES.
All GraphQL calls use the **user-tres-finance** MCP server (`execute` tool).
The file should have these columns (header names are matched case-insensitively):
| Contact Name | Contact Address | Contact Tag | |---|---|---| | Binance Hot Wallet | 0xABC... | Exchange | | Vendor X | 0xDEF... | Vendor |
The column order doesn't matter — the skill matches by header name. The file may contain additional columns (like the "Address details" enrichment columns from the export skill) — those are ignored.
Call `get_viewer` (no arguments) to confirm the session is active and note the organization name.
The user will provide a CSV or XLSX file. Detect the format from the file extension.
**For XLSX files:** Use Python with `openpyxl==3.1.5`. If not installed, stop and display: > "openpyxl is not installed. Please run: `python3 -m venv .venv && .venv/bin/pip install openpyxl==3.1.5`"
**For CSV files:** Use Python's built-in `csv` module.
For each row:
1. **Skip if Contact Name is blank or missing** — the user hasn't identified this address yet, so there's nothing to import. 2. **Skip if Contact Address is blank or missing** — can't label an address that doesn't exist. 3. **Trim whitespace** from name, address, and tag values. 4. **Parse tags**: if Contact Tag contains commas, split into multiple tags. Trim each tag. Remove empty strings. 5. **Deduplicate by address** (case-insensitive): if the same address appears multiple times, keep the last occurrence (the user likely corrected it). Warn about duplicates.
After filtering, report to the user:
Then show a preview table of the first 10 rows that will be imported (address, name, tags) and ask the user to confirm before proceeding.
For small imports (<50 rows), skip this step and go straight to importing — fetching the entire address book for a handful of contacts adds unnecessary delay.
For larger imports, fetch the current address book to identify which addresses already have labels. This helps the user understand what will be created vs. updated.
query AddressBook($limit: Int, $offset: Int) {
customAccountNameLabel(limit: $limit, offset: $offset) {
results {
originalIdentifier
labelValue
tags
}
totalCount
}
}Paginate through all results (500 at a time). Build a lookup dictionary keyed by `originalIdentifier.lower()`.
Compare against the import list and report:
**Important**: `setCustomAccountNameLabelTags` is a **replace** operation, not append. If a contact currently has tags `["Exchange", "Custodian"]` and the import file has `["Vendor"]`, the old tags will be overwritten. Warn the user about this for any contacts being updated that already have tags.
Present this breakdown to the user before proceeding. If there are updates, list a few examples showing old name → new name so the user can sanity-check.
For each validated row, make two API calls:
**5a. Set the contact name:**
mut
Community-contributed plugins for Claude Cowork and Claude Code.
Repo: anthropics/claude-plugins-community
Explain a topic like I'm a 5 year old. Use when the user types /eli5 <topic> or asks for a…
Write an implementation plan as one interactive HTML page - a tree of claims (why › what ›…
Use the `quickdesign` CLI to generate AI media — UGC promo videos, image edits, product…
Use only when the user explicitly asks for a TestDino audit of Playwright automated test…
Use when the user wants to check TestDino connection status, validate their PAT, discover…
Use when the user wants to manage a manual execution run or update case-level results inside…