[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718DYR6Z6TYJNN0ZBZ81SQF":3,"skill-same:01M718DYR6Z6TYJNN0ZBZ81SQF":79},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":6,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":6,"updatedAt":64,"install":65,"resources":78},"01M718DYR6Z6TYJNN0ZBZ81SQF","tres-import-contacts",null,"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\u002FXLSX 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.","anthropics\u002Fclaude-plugins-community","anthropics","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F76263028?v=4","01M697XGDPXJAVQ8391V2BCYTE","Anthropic","01M718C1RS4JJFM9KNJMTCAYJG",4856,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-import-contacts\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000040","财务","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"tres import contacts","contacts","import","maps","upload","file","when","load","Existing","use","now","labels","entries","trigger","spreadsheet","for","xlsx","extracting","do","bulk","2026-11-10 10:12:30",false,"---\nname: tres-import-contacts\ndescription: \"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\u002FXLSX 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.\"\n---\n\n# TRES Finance — Import Contacts from CSV\u002FXLSX\n\n## Goal\n\nRead 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.\n\n## MCP Server\n\nAll GraphQL calls use the **user-tres-finance** MCP server (`execute` tool).\n\n## Expected File Format\n\nThe file should have these columns (header names are matched case-insensitively):\n\n| Contact Name | Contact Address | Contact Tag |\n|---|---|---|\n| Binance Hot Wallet | 0xABC... | Exchange |\n| Vendor X | 0xDEF... | Vendor |\n\n- **Contact Name** — the label to assign to the address (required for import; rows without a name are skipped)\n- **Contact Address** — the blockchain address (required)\n- **Contact Tag** — optional tag(s) for the contact. Multiple tags can be separated by commas (e.g. `Exchange, Custodian`)\n\nThe 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.\n\n## Workflow\n\n### Step 1 — Authenticate\n\nCall `get_viewer` (no arguments) to confirm the session is active and note the organization name.\n\n### Step 2 — Read and parse the file\n\nThe user will provide a CSV or XLSX file. Detect the format from the file extension.\n\n**For XLSX files:**\nUse Python with `openpyxl==3.1.5`. If not installed, stop and display:\n> \"openpyxl is not installed. Please run: `python3 -m venv .venv && .venv\u002Fbin\u002Fpip install openpyxl==3.1.5`\"\n\n- If the workbook has multiple sheets, look for one named \"Contacts\" (case-insensitive). If not found, use the first sheet.\n- Read the header row to find the column indices for \"Contact Name\", \"Contact Address\", and \"Contact Tag\" (match case-insensitively, trim whitespace).\n- Read all data rows.\n- Filter out trailing empty rows — openpyxl sometimes reads extra `None` rows at the bottom of the sheet. Skip any row where all cells are `None` or empty strings.\n\n**For CSV files:**\nUse Python's built-in `csv` module.\n\n- Open the file with `encoding='utf-8-sig'` to handle the BOM (byte-order mark) that Excel adds when saving CSVs. Without this, the first header may appear as `\\ufeffContact Name` and won't match.\n- Try comma delimiter first. If the header row doesn't contain the expected columns, retry with semicolon delimiter (common in European-locale Excel exports).\n- Read the header row to find column indices, same matching logic as above.\n- Read all data rows.\n\n### Step 3 — Validate and filter\n\nFor each row:\n\n1. **Skip if Contact Name is blank or missing** — the user hasn't identified this address yet, so there's nothing to import.\n2. **Skip if Contact Address is blank or missing** — can't label an address that doesn't exist.\n3. **Trim whitespace** from name, address, and tag values.\n4. **Parse tags**: if Contact Tag contains commas, split into multiple tags. Trim each tag. Remove empty strings.\n5. **Deduplicate by address** (case-insensitive): if the same address appears multiple times, keep the last occurrence (the user likely corrected it). Warn about duplicates.\n\nAfter filtering, report to the user:\n- Total rows in the file\n- Rows skipped (blank name)\n- Rows to import\n- Any duplicates found\n\nThen show a preview table of the first 10 rows that will be imported (address, name, tags) and ask the user to confirm before proceeding.\n\n### Step 4 — Check existing contacts (only for imports with 50+ rows)\n\nFor small imports (\u003C50 rows), skip this step and go straight to importing — fetching the entire address book for a handful of contacts adds unnecessary delay.\n\nFor 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.\n\n```graphql\nquery AddressBook($limit: Int, $offset: Int) {\n  customAccountNameLabel(limit: $limit, offset: $offset) {\n    results {\n      originalIdentifier\n      labelValue\n      tags\n    }\n    totalCount\n  }\n}\n```\n\nPaginate through all results (500 at a time). Build a lookup dictionary keyed by `originalIdentifier.lower()`.\n\nCompare against the import list and report:\n- **New contacts** — addresses not in the current address book\n- **Updates** — addresses that already exist but will get a new name or tags\n\n**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.\n\nPresent 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.\n\n### Step 5 — Import contacts\n\nFor each validated row, make two API calls:\n\n**5a. Set the contact name:**\n\n```graphql\nmutation SetContactName($identifier: String, $labelValue: String) {\n  setCustomAccountName(identifier: $identifier, labelValue: $labelValue) {\n    accountTxsSummary {\n      accountIdentifier\n      displayName\n    }\n  }\n}\n```\n\nVariables:\n```json\n{\n  \"identifier\": \"\u003Cthe address>\",\n  \"labelValue\": \"\u003Cthe contact name>\"\n}\n```\n\n**5b. Set tags (only if the row has tags):**\n\n```graphql\nmutation SetContactTags($identifier: String!, $tags: [String]!) {\n  setCustomAccountNameLabelTags(identifier: $identifier, tags: $tags) {\n    accountTxsSummary {\n      accountIdentifier\n      displayName\n    }\n  }\n}\n```\n\nVariables:\n```json\n{\n  \"identifier\": \"\u003Cthe address>\",\n  \"tags\": [\"Exchange\", \"Custodian\"]\n}\n```\n\n**Batching strategy:** The API doesn't have a bulk endpoint. For small imports (\u003C20 contacts), fire all name mutations in parallel, then all tag mutations in parallel — this is fast and safe. For larger imports, process in batches of 10 parallel calls to avoid overwhelming the API, and show progress to the user every 25 contacts (e.g. \"Imported 25\u002F142...\").\n\n**Error handling:** If a mutation fails for a specific address, log the error and continue with the next row. Don't stop the entire import. Collect all failures for the summary.\n\n### Step 6 — Summary\n\nAfter all mutations complete, present a summary:\n\n- Total contacts imported successfully (name set)\n- Total contacts with tags set\n- Any failures (list the address and error message)\n\nIf there were failures, suggest the user can retry by running the skill again with the same file — already-imported contacts will just be updated (the mutation is idempotent for names).\n\n## Edge Cases\n\n- **File has no header row**: If the first row doesn't contain recognizable column names, tell the user the expected format and ask them to fix the file.\n- **File has wrong columns**: If \"Contact Address\" column can't be found, the file isn't usable. Report which columns were found and what's expected.\n- **Empty file**: If the file has headers but no data rows, tell the user.\n- **All names blank**: If every row has a blank Contact Name, tell the user — they probably uploaded the unfilled template by mistake.\n- **Very large files (>500 rows)**: Warn the user this will take a while and ask for confirmation.\n- **Special characters in names**: Pass through as-is — TRES handles unicode in labels.\n- **Mixed case addresses**: The `setCustomAccountName` mutation accepts addresses as-is. Don't normalize case — pass the original value from the file.\n- **Tag with extra spaces**: `\" Exchange , Custodian \"` → trim to `[\"Exchange\", \"Custodian\"]`.\n- **Address not in any transaction**: The mutations work even for addresses that TRES has never seen in a transaction — they create the address book entry regardless.\n- **Tags overwrite**: `setCustomAccountNameLabelTags` replaces existing tags entirely. If the user only wants to add tags, they would need to merge with existing tags first (the skill does not do this automatically — it's a replace operation). Flag this to the user when updating existing contacts that already have tags.\n- **CSV BOM prefix**: Excel-saved CSVs include a UTF-8 BOM (`\\ufeff`) that corrupts the first column header. Always open CSVs with `encoding='utf-8-sig'`.\n- **Semicolon-delimited CSVs**: European Excel exports use `;` instead of `,`. If comma parsing doesn't find the expected headers, retry with semicolon.\n- **Trailing empty rows in XLSX**: openpyxl reads empty rows at the end of the sheet. Skip rows where all values are `None` or empty.\n","# TRES Finance — Import Contacts from CSV\u002FXLSX\n\n## Goal\n\nRead 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.\n\n## MCP Server\n\nAll GraphQL calls use the **user-tres-finance** MCP server (`execute` tool).\n\n## Expected File Format\n\nThe file should have these columns (header names are matched case-insensitively):\n\n| Contact Name | Contact Address | Contact Tag |\n|---|---|---|\n| Binance Hot Wallet | 0xABC... | Exchange |\n| Vendor X | 0xDEF... | Vendor |\n\n- **Contact Name** — the label to assign to the address (required for import; rows without a name are skipped)\n- **Contact Address** — the blockchain address (required)\n- **Contact Tag** — optional tag(s) for the contact. Multiple tags can be separated by commas (e.g. `Exchange, Custodian`)\n\nThe 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.\n\n## Workflow\n\n### Step 1 — Authenticate\n\nCall `get_viewer` (no arguments) to confirm the session is active and note the organization name.\n\n### Step 2 — Read and parse the file\n\nThe user will provide a CSV or XLSX file. Detect the format from the file extension.\n\n**For XLSX files:**\nUse Python with `openpyxl==3.1.5`. If not installed, stop and display:\n> \"openpyxl is not installed. Please run: `python3 -m venv .venv && .venv\u002Fbin\u002Fpip install openpyxl==3.1.5`\"\n\n- If the workbook has multiple sheets, look for one named \"Contacts\" (case-insensitive). If not found, use the first sheet.\n- Read the header row to find the column indices for \"Contact Name\", \"Contact Address\", and \"Contact Tag\" (match case-insensitively, trim whitespace).\n- Read all data rows.\n- Filter out trailing empty rows — openpyxl sometimes reads extra `None` rows at the bottom of the sheet. Skip any row where all cells are `None` or empty strings.\n\n**For CSV files:**\nUse Python's built-in `csv` module.\n\n- Open the file with `encoding='utf-8-sig'` to handle the BOM (byte-order mark) that Excel adds when saving CSVs. Without this, the first header may appear as `\\ufeffContact Name` and won't match.\n- Try comma delimiter first. If the header row doesn't contain the expected columns, retry with semicolon delimiter (common in European-locale Excel exports).\n- Read the header row to find column indices, same matching logic as above.\n- Read all data rows.\n\n### Step 3 — Validate and filter\n\nFor each row:\n\n1. **Skip if Contact Name is blank or missing** — the user hasn't identified this address yet, so there's nothing to import.\n2. **Skip if Contact Address is blank or missing** — can't label an address that doesn't exist.\n3. **Trim whitespace** from name, address, and tag values.\n4. **Parse tags**: if Contact Tag contains commas, split into multiple tags. Trim each tag. Remove empty strings.\n5. **Deduplicate by address** (case-insensitive): if the same address appears multiple times, keep the last occurrence (the user likely corrected it). Warn about duplicates.\n\nAfter filtering, report to the user:\n- Total rows in the file\n- Rows skipped (blank name)\n- Rows to import\n- Any duplicates found\n\nThen show a preview table of the first 10 rows that will be imported (address, name, tags) and ask the user to confirm before proceeding.\n\n### Step 4 — Check existing contacts (only for imports with 50+ rows)\n\nFor small imports (\u003C50 rows), skip this step and go straight to importing — fetching the entire address book for a handful of contacts adds unnecessary delay.\n\nFor 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.\n\n```graphql\nquery AddressBook($limit: Int, $offset: Int) {\n  customAccountNameLabel(limit: $limit, offset: $offset) {\n    results {\n      originalIdentifier\n      labelValue\n      tags\n    }\n    totalCount\n  }\n}\n```\n\nPaginate through all results (500 at a time). Build a lookup dictionary keyed by `originalIdentifier.lower()`.\n\nCompare against the import list and report:\n- **New contacts** — addresses not in the current address book\n- **Updates** — addresses that already exist but will get a new name or tags\n\n**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.\n\nPresent 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.\n\n### Step 5 — Import contacts\n\nFor each validated row, make two API calls:\n\n**5a. Set the contact name:**\n\n```graphql\nmutation SetContactName($identifier: String, $labelValue: String) {\n  setCustomAccountName(identifier: $identifier, labelValue: $labelValue) {\n    accountTxsSummary {\n      accountIdentifier\n      displayName\n    }\n  }\n}\n```\n\nVariables:\n```json\n{\n  \"identifier\": \"\u003Cthe address>\",\n  \"labelValue\": \"\u003Cthe contact name>\"\n}\n```\n\n**5b. Set tags (only if the row has tags):**\n\n```graphql\nmutation SetContactTags($identifier: String!, $tags: [String]!) {\n  setCustomAccountNameLabelTags(identifier: $identifier, tags: $tags) {\n    accountTxsSummary {\n      accountIdentifier\n      displayName\n    }\n  }\n}\n```\n\nVariables:\n```json\n{\n  \"identifier\": \"\u003Cthe address>\",\n  \"tags\": [\"Exchange\", \"Custodian\"]\n}\n```\n\n**Batching strategy:** The API doesn't have a bulk endpoint. For small imports (\u003C20 contacts), fire all name mutations in parallel, then all tag mutations in parallel — this is fast and safe. For larger imports, process in batches of 10 parallel calls to avoid overwhelming the API, and show progress to the user every 25 contacts (e.g. \"Imported 25\u002F142...\").\n\n**Error handling:** If a mutation fails for a specific address, log the error and continue with the next row. Don't stop the entire import. Collect all failures for the summary.\n\n### Step 6 — Summary\n\nAfter all mutations complete, present a summary:\n\n- Total contacts imported successfully (name set)\n- Total contacts with tags set\n- Any failures (list the address and error message)\n\nIf there were failures, suggest the user can retry by running the skill again with the same file — already-imported contacts will just be updated (the mutation is idempotent for names).\n\n## Edge Cases\n\n- **File has no header row**: If the first row doesn't contain recognizable column names, tell the user the expected format and ask them to fix the file.\n- **File has wrong columns**: If \"Contact Address\" column can't be found, the file isn't usable. Report which columns were found and what's expected.\n- **Empty file**: If the file has headers but no data rows, tell the user.\n- **All names blank**: If every row has a blank Contact Name, tell the user — they probably uploaded the unfilled template by mistake.\n- **Very large files (>500 rows)**: Warn the user this will take a while and ask for confirmation.\n- **Special characters in names**: Pass through as-is — TRES handles unicode in labels.\n- **Mixed case addresses**: The `setCustomAccountName` mutation accepts addresses as-is. Don't normalize case — pass the original value from the file.\n- **Tag with extra spaces**: `\" Exchange , Custodian \"` → trim to `[\"Exchange\", \"Custodian\"]`.\n- **Address not in any transaction**: The mutations work even for addresses that TRES has never seen in a transaction — they create the address book entry regardless.\n- **Tags overwrite**: `setCustomAccountNameLabelTags` replaces existing tags entirely. If the user only wants to add tags, they would need to merge with existing tags first (the skill does not do this automatically — it's a replace operation). Flag this to the user when updating existing contacts that already have tags.\n- **CSV BOM prefix**: Excel-saved CSVs include a UTF-8 BOM (`\\ufeff`) that corrupts the first column header. Always open CSVs with `encoding='utf-8-sig'`.\n- **Semicolon-delimited CSVs**: European Excel exports use `;` instead of `,`. If comma parsing doesn't find the expected headers, retry with semicolon.\n- **Trailing empty rows in XLSX**: openpyxl reads empty rows at the end of the sheet. Skip rows where all values are `None` or empty.\n",{"name":5,"description":7},"main","163301d1904c0a994539f5226ce0fcd65b8652bf","tres-finance-plugin\u002Fskills\u002Ftres-import-contacts",357,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community","https:\u002F\u002Fgithub.com\u002Fanthropics","https:\u002F\u002Fanthropic.com","2026-11-10 15:47:08",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add anthropics\u002Fclaude-plugins-community --skill tres-import-contacts",{"tool":71,"command":72},"bunx","bunx skills add anthropics\u002Fclaude-plugins-community --skill tres-import-contacts",{"tool":74,"command":75},"pnpm","pnpm dlx skills add anthropics\u002Fclaude-plugins-community --skill tres-import-contacts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-import-contacts\u002FSKILL.md",true,[],[80,108,126,150,174,198],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":52},"01M718G9QZ4B2DJVEB3MAW5ZB1","tres-wallets-upload","Upload and onboard multiple on-chain wallets or exchange accounts into Tres Finance. Use this skill whenever the user wants to add wallets, onboard wallets, import wallets, upload wallet addresses, ingest wallets, or connect exchanges into Tres — whether from a file (CSV\u002FExcel) or by typing them manually. This skill guides Claude through the full flow: wallet type selection → input collection → validation → preview with editable HTML table → exchange credential collection (if exchange) → user confirmation → batch creation via the TRES MCP API. Always trigger this skill for wallet onboarding, wallet data ingestion, or any request to \"add wallets to Tres\".","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-wallets-upload\u002FSKILL.md",[86,87,88],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[90,91,36,92,93,94,95,96,48,97,98,99,100,101,102,103,104,105,106,107],"wallets","tres wallets upload","typing","ingestion","Wallet","chain","creation","selection","MCP","confirmation","connect","collection","preview","api","batch","guides","on-chain","request",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":52},"01M718G5RD9064Z574RQ4SEY38","tres-upload-tx-header-validation","The exact column header names required by the TRES Finance bulk transaction CSV upload. Use whenever building, fixing, or validating the header row of a TRES manual transaction or sub-transaction upload CSV — especially after an upload fails with \"Missing required column(s): ...\". Trigger phrases include: 'fix my CSV headers', 'bulk transaction upload failed', 'missing required columns', 'validate TRES upload CSV', 'transaction CSV template headers'. This skill is ONLY about the header naming convention; it does not cover row values or upload workflow. Do NOT trigger for contacts import CSV (use tres-import-contacts), wallet upload CSV (use tres-wallets-upload), or general CSV parsing unrelated to bulk TX upload headers.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-upload-tx-header-validation\u002FSKILL.md",[],[115,36,116,51,50,34,94,117,47,118,45,119,120,121,122,41,123,124,33,125],"tres upload tx header validation","validation","parsing","manual","fix","missing","general","only","workflow","csv","with",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":133,"publishedAt":52},"01M718G1F3DBWTX5H9RWPHHB4F","tres-tx-story","Analyze a blockchain transaction by its hash using TRES Finance MCP and generate a visual flow diagram showing all asset movements, followed by a plain-language explanation of what happened. Use this skill whenever the user provides a transaction hash and asks to \"analyze\", \"explain\", \"visualize\", \"diagram\", \"show me what happened in\", or \"tell the story of\" a transaction. Also trigger when the user pastes a tx hash (long hex string starting with 0x) and asks anything about it. Always use this skill for transaction hash analysis — do not attempt to answer from memory alone.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-tx-story\u002FSKILL.md",[132],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[134,135,136,137,138,98,38,139,140,141,142,143,144,145,146,147,148,50,149,47],"tres tx story","Story","show","memory","hex","show me","analysis","analyze","me","diagram","generate","flow","asset","blockchain","STRING","visualize",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":157,"publishedAt":52},"01M718FW5ST9J56WY4TJ5G5A7X","tres-settings-management","Manage Organization Settings and Platform Settings via the TRES MCP GraphQL API. Use when users ask about org settings, platform settings, configuration, feature flags, enable\u002Fdisable platforms, balance diff, commit strategy, cost basis, ERP, pricing, sync boundaries, or any setting read\u002Fwrite operation. Trigger phrases include \"get settings\", \"show settings\", \"update settings\", \"change settings\", \"enable platform\", \"disable platform\", \"balance diff\", \"commit strategy\", \"cost basis strategy\", \"set min sync date\", \"configure\", \"turn on\", \"turn off\".","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-settings-management\u002FSKILL.md",[156],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[158,159,160,161,136,162,98,38,163,164,165,103,166,167,168,169,170,171,172,173],"tres settings management","settings","management","SET","get","configure","ask","commit","change","organization","update","read","write","sync","mcp graphql","flags",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":182,"publishedAt":52},"01M718FND35X9DPTNR7JTX2YX8","tres-rollup-rules","Analyze an organization's sub-transaction patterns in TRES Finance, identify groups of repetitive transactions, and propose data-driven rollup rules that consolidate them into one aggregated entry per interval (daily or monthly) for cleaner ERP integration. Also lists and deletes rollup rules. Trigger this skill whenever the user asks about rollup rules, transaction aggregation, consolidating transactions, reducing transaction noise, rolling up gas fees, rolling up staking rewards, rolling up micro-transactions, or collapsing many small ledger entries into fewer summary entries. Also trigger on \"create a rollup rule\", \"suggest rollup rules\", \"what should I roll up\", \"show my rollup rules\", \"delete a rollup rule\", \"aggregate transactions\", \"too many transactions\", \"reduce transaction count\", \"roll up fees\", \"daily rollup\", \"monthly rollup\". If a wallet has too many transactions, high-frequency activity, or noisy ledger entries, proactively suggest rollup rules. For computing the EXACT impact of a single already-specified rule or reviewing submitted\u002Fpending rules, use the tres-rollup-review skill instead.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-rollup-rules\u002FSKILL.md",[180,181],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[183,184,185,136,186,94,187,98,188,189,190,191,192,141,193,194,195,196,167,197],"tres rollup rules","Rules","rollup","gas","up","impact","reduce","Connector","review","consolidate","create","transactions","delete","data-driven","activity",{"skillNo":199,"name":200,"nameZh":6,"description":201,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":202,"categories":203,"keywords":206,"publishedAt":52},"01M718FFX3KV2JRFVS2RCM719D","tres-rollup-review","Compute the EXACT sub-transaction impact of a rollup rule in TRES Finance — every filter applied — and flag genuine problems (zero matches, overlap, config mistakes) before the rule is created. Two modes. Mode A: a pre-create quality gate invoked by the tres-rollup-rules skill to vet proposed candidate rules. Mode B: standalone review of a rule someone submitted or of existing PENDING rules. Trigger this skill when the user says \"review this rollup rule\", \"what would this rollup rule actually match\", \"preview the rollup impact\", \"how many transactions would this rule catch\", \"is this rollup rule valid\", \"validate my rollup rule\", \"check my pending rollup rules\", or \"review the rollup requests\". Do NOT use this to design or propose new rollups — that is tres-rollup-rules. This skill only measures impact and flags issues; it never executes mutations.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fclaude-plugins-community\u002Fblob\u002Fmain\u002Ftres-finance-plugin\u002Fskills\u002Ftres-rollup-review\u002FSKILL.md",[204,205],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[191,207,185,208,209,210,211,212,122,213,98,188,38,102,214,190,215,216,193,217],"tres rollup review","standalone","never","mode","issues","design","new","candidate","filter","valid","catch"]