[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BB1K2VM4GTMHY8MBJS1PQ":3,"skill-same:01M69BB1K2VM4GTMHY8MBJS1PQ":66},{"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":26,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":43,"ownerDescription":44,"updatedAt":45,"install":46,"resources":59},"01M69BB1K2VM4GTMHY8MBJS1PQ","membership-card-pdf",null,"Generate a printable BlastPass membership card as a PDF. Use when an associate or member asks to print, reprint, or replace a BlastPass membership card. The skill takes the member details returned by the Membership MCP (get_membership) and generates and runs a short Python (reportlab) snippet that renders a CR80-sized membership card to a real PDF file. It only renders the card from already-retrieved values — it never looks anything up or invents data.","microsoft\u002Fnew-copilot-studio-tech-guide-kr","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BAPAFGG5SHJ812JZDC3AR",0,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Farchive\u002Fstore-solution\u002Fskills\u002Fmembership-card-pdf\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31],"PDF","membership card pdf","MCP","python","generate","2026-11-10 10:12:30",false,"---\nname: membership-card-pdf\ndescription: Generate a printable BlastPass membership card as a PDF. Use when an associate or member asks to print, reprint, or replace a BlastPass membership card. The skill takes the member details returned by the Membership MCP (get_membership) and generates and runs a short Python (reportlab) snippet that renders a CR80-sized membership card to a real PDF file. It only renders the card from already-retrieved values — it never looks anything up or invents data.\n---\n\n# BlastPass Membership Card PDF Generator\n\nThis skill produces a **printable BlastPass membership card** — the simplest\nfile-generation flow in the demo. You take the member record you already pulled\nfrom the **Membership MCP** (`get_membership`), then **generate and run a short\nPython snippet** that renders a styled card to a **PDF** using `reportlab`.\n\nNever invent a member, tier, or serial number — every value on the card comes from\nthe `get_membership` result. This skill only *draws* the card; it does not decide\nanything.\n\n## When to use\n\nUse this skill when the associate asks to **print \u002F reprint \u002F replace** a BlastPass\nmembership card for a known member. The only prerequisite is a single\n`get_membership(customer_id)` call on the Membership MCP. There is no policy lookup,\nno calculation, and no other agent involved — that is what makes this the\nentry-level scenario.\n\n## Inputs (all from the Membership MCP `get_membership` result)\n\n| Card field | Source field |\n| --- | --- |\n| `member_name` | `member_name` |\n| `member_id` | `customer_id` |\n| `tier` | `tier` |\n| `tier_code` | `tier_code` (`plus` \\| `extra` \\| `mega`) — drives the accent color & perks |\n| `console_serial` | `console_serial` |\n| `member_since` | `activation_date` |\n| `valid_through` | `term_end_date` |\n| `status` | `status` |\n\nThe `tier_code` selects the card's accent color, header badge, and the perks line\nprinted beneath the card:\n\n- `plus` → blue, \"PLUS\", 5% off + 10 BlastPoints\u002F$1\n- `extra` → purple, \"PLUS EXTRA\", 10% off + 20% BlastPoints bonus\n- `mega` → orange, \"MEGA!!!\", 15% off + 50% BlastPoints + day-one exclusives\n\n## Workflow\n\n### 1. Pull the member record\n\nCall `get_membership` with the `mega-blast-customer-id` (e.g. `MEGA-BLAST-2048`).\nMap its fields into the `card` dict below. Do **not** add fields the MCP didn't\nreturn.\n\n### 2. Generate and run this Python to render the PDF\n\nFill the `card` dict with the confirmed values and run the snippet. It writes\n`blastpass_card.pdf` to the working directory; report that path back to the\nassociate.\n\n```python\nfrom reportlab.lib.pagesizes import LETTER\nfrom reportlab.lib.units import inch\nfrom reportlab.lib import colors\nfrom reportlab.pdfgen import canvas\n\n# --- confirmed values (filled from the Membership MCP get_membership call) ---\ncard = {\n    \"member_name\": \"Sam Sparkle\",\n    \"member_id\": \"MEGA-BLAST-2048\",\n    \"tier\": \"BlastPass Plus Extra MEGA!!!\",\n    \"tier_code\": \"mega\",            # plus | extra | mega\n    \"console_serial\": \"OMEGA-9B1C-2048\",\n    \"member_since\": \"2026-05-30\",   # activation_date\n    \"valid_through\": \"2027-05-30\",  # term_end_date\n    \"status\": \"active\",\n}\n\n# Tier styling: accent color, a short badge for the header, and the perks blurb.\nTIERS = {\n    \"plus\":  (\"#3aa0ff\", \"PLUS\",\n              \"Free 2-day shipping  |  5% off accessories  |  10 BlastPoints \u002F $1\"),\n    \"extra\": (\"#9b51e0\", \"PLUS EXTRA\",\n              \"Free next-day shipping  |  10% off accessories  |  +20% BlastPoints bonus\"),\n    \"mega\":  (\"#ff7a18\", \"MEGA!!!\",\n              \"Same-day delivery  |  15% off everything  |  +50% BlastPoints  |  Day-one exclusives\"),\n}\naccent_hex, tier_badge, perks = TIERS.get(card[\"tier_code\"], TIERS[\"plus\"])\naccent = colors.HexColor(accent_hex)\nink = colors.HexColor(\"#1b1030\")\n\n# Card geometry: a standard CR80 card (3.375 x 2.125 in) centered on the page.\nPAGE_W, PAGE_H = LETTER\nCARD_W, CARD_H = 3.375 * inch, 2.125 * inch\nx0 = (PAGE_W - CARD_W) \u002F 2\ny0 = (PAGE_H - CARD_H) \u002F 2\n\nc = canvas.Canvas(\"blastpass_card.pdf\", pagesize=LETTER)\n\n# Cut guide\nc.setStrokeColor(colors.HexColor(\"#cccccc\"))\nc.setDash(2, 2)\nc.rect(x0 - 6, y0 - 6, CARD_W + 12, CARD_H + 12)\nc.setDash()\n\n# Card body\nc.setFillColor(ink)\nc.roundRect(x0, y0, CARD_W, CARD_H, 10, stroke=0, fill=1)\n# Accent header band\nc.setFillColor(accent)\nc.roundRect(x0, y0 + CARD_H - 0.55 * inch, CARD_W, 0.55 * inch, 10, stroke=0, fill=1)\nc.rect(x0, y0 + CARD_H - 0.55 * inch, CARD_W, 0.18 * inch, stroke=0, fill=1)  # square the bottom of the band\n\n# Brand + tier badge\nc.setFillColor(colors.white)\nc.setFont(\"Helvetica-Bold\", 14)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 0.37 * inch, \"BlastBox Omega\")\n# Tier badge pill on the right of the header band\nc.setFont(\"Helvetica-Bold\", 8)\nbadge_w = c.stringWidth(tier_badge, \"Helvetica-Bold\", 8) + 0.18 * inch\nbx_badge = x0 + CARD_W - 0.22 * inch - badge_w\nc.setFillColor(colors.Color(1, 1, 1, alpha=0.22))\nc.roundRect(bx_badge, y0 + CARD_H - 0.42 * inch, badge_w, 0.20 * inch, 4, stroke=0, fill=1)\nc.setFillColor(colors.white)\nc.drawCentredString(bx_badge + badge_w \u002F 2, y0 + CARD_H - 0.36 * inch, tier_badge)\n\n# Member name\nc.setFillColor(colors.white)\nc.setFont(\"Helvetica-Bold\", 13)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 0.85 * inch, card[\"member_name\"])\n\n# Member id (mono, spaced)\nc.setFillColor(accent)\nc.setFont(\"Courier-Bold\", 12)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 1.08 * inch, card[\"member_id\"])\n\n# Detail rows\ndetails = [\n    (\"MEMBER SINCE\", card[\"member_since\"]),\n    (\"VALID THROUGH\", card[\"valid_through\"]),\n    (\"CONSOLE S\u002FN\", card[\"console_serial\"]),\n]\ndy = y0 + CARD_H - 1.30 * inch\nfor label, val in details:\n    c.setFillColor(colors.HexColor(\"#9d90bd\"))\n    c.setFont(\"Helvetica\", 6)\n    c.drawString(x0 + 0.22 * inch, dy, label)\n    c.setFillColor(colors.white)\n    c.setFont(\"Helvetica-Bold\", 8)\n    c.drawString(x0 + 1.05 * inch, dy, str(val))\n    dy -= 0.17 * inch\n\n# Faux barcode strip (deterministic from the member id)\nbx = x0 + 0.22 * inch\nby = y0 + 0.13 * inch\nc.setFillColor(colors.white)\nimport hashlib\nseed = int(hashlib.md5(card[\"member_id\"].encode()).hexdigest(), 16)\nw = 0.0\ni = 0\nwhile w \u003C CARD_W - 0.44 * inch:\n    bar = 0.012 * inch + ((seed >> (i % 32)) & 0x3) * 0.006 * inch\n    if i % 2 == 0:\n        c.rect(bx + w, by, bar, 0.13 * inch, stroke=0, fill=1)\n    w += bar\n    i += 1\n\n# Perks footer (printed under the card, not on it)\nc.setFillColor(colors.HexColor(\"#555555\"))\nc.setFont(\"Helvetica-Oblique\", 8)\nc.drawCentredString(PAGE_W \u002F 2, y0 - 0.45 * inch, perks)\nc.setFont(\"Helvetica\", 7)\nc.drawCentredString(PAGE_W \u002F 2, y0 - 0.62 * inch,\n                    \"Present this card in-store or scan at checkout. Lost cards can be reprinted at any BlastBox desk.\")\n\nc.showPage()\nc.save()\nprint(\"WROTE blastpass_card.pdf\")\n```\n\n### 3. Hand back the file\n\nTell the associate the card was generated (`blastpass_card.pdf`) and read back the\nmember name, tier, and member ID so they can confirm it before handing it over.\n\n## Notes\n\n- The reference renderer lives next to this file as `card_pdf.py` and is validated\n  against the four mock members in the Membership MCP.\n- The barcode is decorative (deterministic from the member ID) — it is not a real\n  scannable symbology.\n- All data is mock; the card is for demo purposes only.\n","# BlastPass Membership Card PDF Generator\n\nThis skill produces a **printable BlastPass membership card** — the simplest\nfile-generation flow in the demo. You take the member record you already pulled\nfrom the **Membership MCP** (`get_membership`), then **generate and run a short\nPython snippet** that renders a styled card to a **PDF** using `reportlab`.\n\nNever invent a member, tier, or serial number — every value on the card comes from\nthe `get_membership` result. This skill only *draws* the card; it does not decide\nanything.\n\n## When to use\n\nUse this skill when the associate asks to **print \u002F reprint \u002F replace** a BlastPass\nmembership card for a known member. The only prerequisite is a single\n`get_membership(customer_id)` call on the Membership MCP. There is no policy lookup,\nno calculation, and no other agent involved — that is what makes this the\nentry-level scenario.\n\n## Inputs (all from the Membership MCP `get_membership` result)\n\n| Card field | Source field |\n| --- | --- |\n| `member_name` | `member_name` |\n| `member_id` | `customer_id` |\n| `tier` | `tier` |\n| `tier_code` | `tier_code` (`plus` \\| `extra` \\| `mega`) — drives the accent color & perks |\n| `console_serial` | `console_serial` |\n| `member_since` | `activation_date` |\n| `valid_through` | `term_end_date` |\n| `status` | `status` |\n\nThe `tier_code` selects the card's accent color, header badge, and the perks line\nprinted beneath the card:\n\n- `plus` → blue, \"PLUS\", 5% off + 10 BlastPoints\u002F$1\n- `extra` → purple, \"PLUS EXTRA\", 10% off + 20% BlastPoints bonus\n- `mega` → orange, \"MEGA!!!\", 15% off + 50% BlastPoints + day-one exclusives\n\n## Workflow\n\n### 1. Pull the member record\n\nCall `get_membership` with the `mega-blast-customer-id` (e.g. `MEGA-BLAST-2048`).\nMap its fields into the `card` dict below. Do **not** add fields the MCP didn't\nreturn.\n\n### 2. Generate and run this Python to render the PDF\n\nFill the `card` dict with the confirmed values and run the snippet. It writes\n`blastpass_card.pdf` to the working directory; report that path back to the\nassociate.\n\n```python\nfrom reportlab.lib.pagesizes import LETTER\nfrom reportlab.lib.units import inch\nfrom reportlab.lib import colors\nfrom reportlab.pdfgen import canvas\n\n# --- confirmed values (filled from the Membership MCP get_membership call) ---\ncard = {\n    \"member_name\": \"Sam Sparkle\",\n    \"member_id\": \"MEGA-BLAST-2048\",\n    \"tier\": \"BlastPass Plus Extra MEGA!!!\",\n    \"tier_code\": \"mega\",            # plus | extra | mega\n    \"console_serial\": \"OMEGA-9B1C-2048\",\n    \"member_since\": \"2026-05-30\",   # activation_date\n    \"valid_through\": \"2027-05-30\",  # term_end_date\n    \"status\": \"active\",\n}\n\n# Tier styling: accent color, a short badge for the header, and the perks blurb.\nTIERS = {\n    \"plus\":  (\"#3aa0ff\", \"PLUS\",\n              \"Free 2-day shipping  |  5% off accessories  |  10 BlastPoints \u002F $1\"),\n    \"extra\": (\"#9b51e0\", \"PLUS EXTRA\",\n              \"Free next-day shipping  |  10% off accessories  |  +20% BlastPoints bonus\"),\n    \"mega\":  (\"#ff7a18\", \"MEGA!!!\",\n              \"Same-day delivery  |  15% off everything  |  +50% BlastPoints  |  Day-one exclusives\"),\n}\naccent_hex, tier_badge, perks = TIERS.get(card[\"tier_code\"], TIERS[\"plus\"])\naccent = colors.HexColor(accent_hex)\nink = colors.HexColor(\"#1b1030\")\n\n# Card geometry: a standard CR80 card (3.375 x 2.125 in) centered on the page.\nPAGE_W, PAGE_H = LETTER\nCARD_W, CARD_H = 3.375 * inch, 2.125 * inch\nx0 = (PAGE_W - CARD_W) \u002F 2\ny0 = (PAGE_H - CARD_H) \u002F 2\n\nc = canvas.Canvas(\"blastpass_card.pdf\", pagesize=LETTER)\n\n# Cut guide\nc.setStrokeColor(colors.HexColor(\"#cccccc\"))\nc.setDash(2, 2)\nc.rect(x0 - 6, y0 - 6, CARD_W + 12, CARD_H + 12)\nc.setDash()\n\n# Card body\nc.setFillColor(ink)\nc.roundRect(x0, y0, CARD_W, CARD_H, 10, stroke=0, fill=1)\n# Accent header band\nc.setFillColor(accent)\nc.roundRect(x0, y0 + CARD_H - 0.55 * inch, CARD_W, 0.55 * inch, 10, stroke=0, fill=1)\nc.rect(x0, y0 + CARD_H - 0.55 * inch, CARD_W, 0.18 * inch, stroke=0, fill=1)  # square the bottom of the band\n\n# Brand + tier badge\nc.setFillColor(colors.white)\nc.setFont(\"Helvetica-Bold\", 14)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 0.37 * inch, \"BlastBox Omega\")\n# Tier badge pill on the right of the header band\nc.setFont(\"Helvetica-Bold\", 8)\nbadge_w = c.stringWidth(tier_badge, \"Helvetica-Bold\", 8) + 0.18 * inch\nbx_badge = x0 + CARD_W - 0.22 * inch - badge_w\nc.setFillColor(colors.Color(1, 1, 1, alpha=0.22))\nc.roundRect(bx_badge, y0 + CARD_H - 0.42 * inch, badge_w, 0.20 * inch, 4, stroke=0, fill=1)\nc.setFillColor(colors.white)\nc.drawCentredString(bx_badge + badge_w \u002F 2, y0 + CARD_H - 0.36 * inch, tier_badge)\n\n# Member name\nc.setFillColor(colors.white)\nc.setFont(\"Helvetica-Bold\", 13)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 0.85 * inch, card[\"member_name\"])\n\n# Member id (mono, spaced)\nc.setFillColor(accent)\nc.setFont(\"Courier-Bold\", 12)\nc.drawString(x0 + 0.22 * inch, y0 + CARD_H - 1.08 * inch, card[\"member_id\"])\n\n# Detail rows\ndetails = [\n    (\"MEMBER SINCE\", card[\"member_since\"]),\n    (\"VALID THROUGH\", card[\"valid_through\"]),\n    (\"CONSOLE S\u002FN\", card[\"console_serial\"]),\n]\ndy = y0 + CARD_H - 1.30 * inch\nfor label, val in details:\n    c.setFillColor(colors.HexColor(\"#9d90bd\"))\n    c.setFont(\"Helvetica\", 6)\n    c.drawString(x0 + 0.22 * inch, dy, label)\n    c.setFillColor(colors.white)\n    c.setFont(\"Helvetica-Bold\", 8)\n    c.drawString(x0 + 1.05 * inch, dy, str(val))\n    dy -= 0.17 * inch\n\n# Faux barcode strip (deterministic from the member id)\nbx = x0 + 0.22 * inch\nby = y0 + 0.13 * inch\nc.setFillColor(colors.white)\nimport hashlib\nseed = int(hashlib.md5(card[\"member_id\"].encode()).hexdigest(), 16)\nw = 0.0\ni = 0\nwhile w \u003C CARD_W - 0.44 * inch:\n    bar = 0.012 * inch + ((seed >> (i % 32)) & 0x3) * 0.006 * inch\n    if i % 2 == 0:\n        c.rect(bx + w, by, bar, 0.13 * inch, stroke=0, fill=1)\n    w += bar\n    i += 1\n\n# Perks footer (printed under the card, not on it)\nc.setFillColor(colors.HexColor(\"#555555\"))\nc.setFont(\"Helvetica-Oblique\", 8)\nc.drawCentredString(PAGE_W \u002F 2, y0 - 0.45 * inch, perks)\nc.setFont(\"Helvetica\", 7)\nc.drawCentredString(PAGE_W \u002F 2, y0 - 0.62 * inch,\n                    \"Present this card in-store or scan at checkout. Lost cards can be reprinted at any BlastBox desk.\")\n\nc.showPage()\nc.save()\nprint(\"WROTE blastpass_card.pdf\")\n```\n\n### 3. Hand back the file\n\nTell the associate the card was generated (`blastpass_card.pdf`) and read back the\nmember name, tier, and member ID so they can confirm it before handing it over.\n\n## Notes\n\n- The reference renderer lives next to this file as `card_pdf.py` and is validated\n  against the four mock members in the Membership MCP.\n- The barcode is decorative (deterministic from the member ID) — it is not a real\n  scannable symbology.\n- All data is mock; the card is for demo purposes only.\n",{"name":5,"description":7},"main","82f9c0b1b1bacfd0fdabdc9cc717bc8849d185ec","sample\u002Farchive\u002Fstore-solution\u002Fskills\u002Fmembership-card-pdf",1,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-04 09:40:30",{"source":8,"skillName":5,"commands":47,"prompt":57,"zipAvailable":58},[48,51,54],{"tool":49,"command":50},"npx","npx skills add microsoft\u002Fnew-copilot-studio-tech-guide-kr --skill membership-card-pdf",{"tool":52,"command":53},"bunx","bunx skills add microsoft\u002Fnew-copilot-studio-tech-guide-kr --skill membership-card-pdf",{"tool":55,"command":56},"pnpm","pnpm dlx skills add microsoft\u002Fnew-copilot-studio-tech-guide-kr --skill membership-card-pdf","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Farchive\u002Fstore-solution\u002Fskills\u002Fmembership-card-pdf\u002FSKILL.md",true,[60],{"path":61,"resourceType":62,"resourceTypeDesc":63,"sizeBytes":64,"sourceHtmlUrl":65},"card_pdf.py","SCRIPT","脚本",4184,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Farchive\u002Fstore-solution\u002Fskills\u002Fmembership-card-pdf\u002Fcard_pdf.py",[67,77,86,96,109,116],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":74,"publishedAt":32},"01M69BBNKA733YFENEN2JV629D","slip-pdf-generator","Generate a printable BlastBox return \u002F RMA \u002F exchange slip as a PDF for the associate to hand to the customer. Use at the end of a return, warranty swap, membership cancellation, or upgrade once all amounts are final. The skill runs a bundled Python script that renders the confirmed slip values into a real PDF file.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Fsolution\u002Fsrc\u002FBlastBoxAgents\u002Fbotcomponents\u002Fcra24a45_skill_md_d925ad573675\u002Ffiledata\u002FSKILL.md",[73],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[75,27,30,76,31],"slip pdf generator","customer",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":32},"01M69BBKZ5BCFW611KF1WG5RQQ","points-reconciliation","Reconcile a customer's BlastPoints loyalty balance after a complex visit (purchases, returns, promo multipliers, expiry) and convert the net balance to store credit. Use when an associate asks about a member's points, or after a return that should claw back previously earned points. The skill runs a bundled Python script that applies the base earn rate, promo multipliers, tier bonus, clawbacks, and expiry, then prints a points ledger and the redeemable store-credit value.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Fsolution\u002Fsrc\u002FBlastBoxAgents\u002Fbotcomponents\u002Fcra24a45_skill_md_4e6ebf925ae8\u002Ffiledata\u002FSKILL.md",[],[84,30,76,85],"points reconciliation","claw",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":93,"publishedAt":32},"01M69BBJ8SMZ4CY7TA6R7TTEBY","prorated-refund-calculator","Calculate the exact prorated refund when a customer cancels a BlastPass membership, and the net settlement when a defective unit is traded up to a pricier model. Use after the Store Policy Agent confirms the refund rule and the Membership MCP has returned the membership details. The skill runs a bundled Python script so the arithmetic is exact.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Fsolution\u002Fsrc\u002FBlastBoxAgents\u002Fbotcomponents\u002Fcra24a45_skill_md_30aa9a7b2b7c\u002Ffiledata\u002FSKILL.md",[92],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[94,95,76,30,29],"prorated refund calculator","policy",{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":106,"publishedAt":32},"01M69BBGFGN30E47RJSP2GGDZQ","membership-card-png","Generate a digital BlastPass membership card as a PNG image by running the bundled card_png.py script. Use when a member self-serves a lost\u002Fstolen\u002Fdamaged card replacement, or any time a card needs to be shown on screen (vs. printed). The skill takes the member details returned by the Membership MCP (get_membership) plus the new_card_serial returned by reissue_card and passes them as command-line flags to a bundled Python (matplotlib) script that renders a CR80-sized membership card to a real PNG. It only renders the card from already-retrieved values — it never looks anything up or invents data.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Fsolution\u002Fsrc\u002FBlastBoxAgents\u002Fbotcomponents\u002FDefault_draft_IsBewO.file.SKILL.md\u002Ffiledata\u002FSKILL.md",[102,105],{"categoryNo":103,"categoryName":104,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[107,31,30,108,29],"membership card png","image",{"skillNo":110,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":115,"publishedAt":32},"01M69BBEKS0MQ7NGABMZJH80YW","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Farchive\u002Fstore-solution\u002Fsrc\u002Fbotcomponents\u002FDefault_draft_IsBewO.file.SKILL.md\u002Ffiledata\u002FSKILL.md",[113,114],{"categoryNo":103,"categoryName":104,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[107,31,30,108,29],{"skillNo":117,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":121,"publishedAt":32},"01M69BBCTR19H23S9D12T2K68E","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fnew-copilot-studio-tech-guide-kr\u002Fblob\u002Fmain\u002Fsample\u002Farchive\u002Fstore-solution\u002Fskills\u002Fslip-pdf-generator\u002FSKILL.md",[120],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[75,27,31,76,30]]