[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FG7CS486NYSH55KE8835EY":3,"skill-same:01M6FG7CS486NYSH55KE8835EY":58},{"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":18,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":38,"repositoryHtmlUrl":39,"repositoryHomepageUrl":40,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M6FG7CS486NYSH55KE8835EY","bun-redis",null,"Use when working with Redis in Bun (ioredis, Upstash), caching, pub\u002Fsub, session storage, or key-value operations.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fbun-redis\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29],"redis","bun","bun redis","storage","session","operations","use","caching","upstash","with","key-value","2026-11-10 10:12:30",false,"---\nname: bun-redis\ndescription: Use when working with Redis in Bun (ioredis, Upstash), caching, pub\u002Fsub, session storage, or key-value operations.\nlicense: MIT\n---\n\n# Bun Redis\n\nRedis integration with Bun using popular Redis clients.\n\n## Client Options\n\n| Client | Best For | Install |\n|--------|----------|---------|\n| `ioredis` | Self-hosted Redis | `bun add ioredis` |\n| `@upstash\u002Fredis` | Serverless\u002FEdge | `bun add @upstash\u002Fredis` |\n| `redis` | Official Node client | `bun add redis` |\n\n## ioredis Setup\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Default connection\nconst redis = new Redis();\n\n\u002F\u002F With options\nconst redis = new Redis({\n  host: \"localhost\",\n  port: 6379,\n  password: \"secret\",\n  db: 0,\n});\n\n\u002F\u002F Connection string\nconst redis = new Redis(\"redis:\u002F\u002F:password@localhost:6379\u002F0\");\n\n\u002F\u002F TLS connection\nconst redis = new Redis({\n  host: \"redis.example.com\",\n  port: 6380,\n  tls: {},\n});\n```\n\n## Basic Operations\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis();\n\n\u002F\u002F Strings\nawait redis.set(\"name\", \"Alice\");\nawait redis.set(\"count\", \"100\");\nawait redis.setex(\"temp\", 60, \"expires in 60s\"); \u002F\u002F With TTL\n\nconst name = await redis.get(\"name\"); \u002F\u002F \"Alice\"\nconst count = await redis.incr(\"count\"); \u002F\u002F 101\nawait redis.del(\"name\");\n\n\u002F\u002F Check existence\nconst exists = await redis.exists(\"name\"); \u002F\u002F 0 or 1\n\n\u002F\u002F TTL\nawait redis.expire(\"key\", 3600); \u002F\u002F Set 1 hour TTL\nconst ttl = await redis.ttl(\"key\"); \u002F\u002F Get remaining TTL\n```\n\n## Data Structures\n\n### Hashes\n\n```typescript\n\u002F\u002F Set hash fields\nawait redis.hset(\"user:1\", {\n  name: \"Alice\",\n  email: \"alice@example.com\",\n  age: \"30\",\n});\n\n\u002F\u002F Get single field\nconst name = await redis.hget(\"user:1\", \"name\");\n\n\u002F\u002F Get all fields\nconst user = await redis.hgetall(\"user:1\");\n\u002F\u002F { name: \"Alice\", email: \"...\", age: \"30\" }\n\n\u002F\u002F Increment field\nawait redis.hincrby(\"user:1\", \"visits\", 1);\n```\n\n### Lists\n\n```typescript\n\u002F\u002F Add to list\nawait redis.rpush(\"queue\", \"task1\", \"task2\");\nawait redis.lpush(\"queue\", \"urgent\");\n\n\u002F\u002F Pop from list\nconst task = await redis.lpop(\"queue\"); \u002F\u002F \"urgent\"\nconst blocking = await redis.blpop(\"queue\", 5); \u002F\u002F Wait 5s\n\n\u002F\u002F Range\nconst items = await redis.lrange(\"queue\", 0, -1);\n```\n\n### Sets\n\n```typescript\n\u002F\u002F Add members\nawait redis.sadd(\"tags\", \"javascript\", \"typescript\", \"bun\");\n\n\u002F\u002F Check membership\nconst isMember = await redis.sismember(\"tags\", \"bun\"); \u002F\u002F 1\n\n\u002F\u002F Get all members\nconst tags = await redis.smembers(\"tags\");\n\n\u002F\u002F Set operations\nawait redis.sinter(\"tags1\", \"tags2\"); \u002F\u002F Intersection\nawait redis.sunion(\"tags1\", \"tags2\"); \u002F\u002F Union\n```\n\n### Sorted Sets\n\n```typescript\n\u002F\u002F Add with scores\nawait redis.zadd(\"leaderboard\", 100, \"alice\", 200, \"bob\", 150, \"charlie\");\n\n\u002F\u002F Get by rank\nconst top3 = await redis.zrevrange(\"leaderboard\", 0, 2, \"WITHSCORES\");\n\n\u002F\u002F Get by score range\nconst highScores = await redis.zrangebyscore(\"leaderboard\", 100, 200);\n\n\u002F\u002F Increment score\nawait redis.zincrby(\"leaderboard\", 50, \"alice\");\n```\n\n## JSON (RedisJSON)\n\n```typescript\n\u002F\u002F Requires RedisJSON module\nawait redis.call(\"JSON.SET\", \"user:1\", \"$\", JSON.stringify({\n  name: \"Alice\",\n  settings: { theme: \"dark\" },\n}));\n\nconst user = await redis.call(\"JSON.GET\", \"user:1\");\nconst settings = await redis.call(\"JSON.GET\", \"user:1\", \"$.settings\");\n```\n\n## Pub\u002FSub\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Publisher\nconst pub = new Redis();\n\n\u002F\u002F Subscriber\nconst sub = new Redis();\n\n\u002F\u002F Subscribe to channel\nsub.subscribe(\"notifications\", (err, count) => {\n  console.log(`Subscribed to ${count} channels`);\n});\n\n\u002F\u002F Handle messages\nsub.on(\"message\", (channel, message) => {\n  console.log(`${channel}: ${message}`);\n});\n\n\u002F\u002F Publish\nawait pub.publish(\"notifications\", JSON.stringify({\n  type: \"alert\",\n  message: \"Hello!\",\n}));\n\n\u002F\u002F Pattern subscribe\nsub.psubscribe(\"user:*\");\nsub.on(\"pmessage\", (pattern, channel, message) => {\n  console.log(`${pattern} -> ${channel}: ${message}`);\n});\n```\n\n## Transactions\n\n```typescript\n\u002F\u002F Multi\u002FExec\nconst results = await redis\n  .multi()\n  .set(\"key1\", \"value1\")\n  .set(\"key2\", \"value2\")\n  .incr(\"counter\")\n  .exec();\n\n\u002F\u002F Pipeline (no atomicity, better performance)\nconst pipeline = redis.pipeline();\npipeline.set(\"key1\", \"value1\");\npipeline.set(\"key2\", \"value2\");\npipeline.incr(\"counter\");\nconst results = await pipeline.exec();\n```\n\n## Upstash Redis (Serverless)\n\n```typescript\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst redis = new Redis({\n  url: process.env.UPSTASH_REDIS_REST_URL,\n  token: process.env.UPSTASH_REDIS_REST_TOKEN,\n});\n\n\u002F\u002F Same API as ioredis\nawait redis.set(\"key\", \"value\");\nconst value = await redis.get(\"key\");\n\n\u002F\u002F With automatic JSON serialization\nawait redis.set(\"user\", { name: \"Alice\", age: 30 });\nconst user = await redis.get\u003C{ name: string; age: number }>(\"user\");\n```\n\n## Caching Patterns\n\n### Cache-Aside\n\n```typescript\nasync function getUser(id: string) {\n  \u002F\u002F Check cache\n  const cached = await redis.get(`user:${id}`);\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from database\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n\n  \u002F\u002F Cache for 1 hour\n  if (user) {\n    await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n  }\n\n  return user;\n}\n```\n\n### Write-Through\n\n```typescript\nasync function updateUser(id: string, data: UserUpdate) {\n  \u002F\u002F Update database\n  await db.update(users).set(data).where(eq(users.id, id));\n\n  \u002F\u002F Update cache\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n\n  return user;\n}\n```\n\n### Rate Limiting\n\n```typescript\nasync function rateLimit(key: string, limit: number, window: number) {\n  const current = await redis.incr(key);\n\n  if (current === 1) {\n    await redis.expire(key, window);\n  }\n\n  return current \u003C= limit;\n}\n\n\u002F\u002F Usage\nconst allowed = await rateLimit(`rate:${userId}`, 100, 60);\nif (!allowed) {\n  throw new Error(\"Rate limit exceeded\");\n}\n```\n\n## Session Storage\n\n```typescript\nimport { Hono } from \"hono\";\nimport Redis from \"ioredis\";\nimport { v4 as uuid } from \"uuid\";\n\nconst redis = new Redis();\nconst app = new Hono();\n\napp.use(\"*\", async (c, next) => {\n  const sessionId = c.req.header(\"X-Session-Id\") || uuid();\n  const session = await redis.hgetall(`session:${sessionId}`);\n\n  c.set(\"session\", session);\n  c.set(\"sessionId\", sessionId);\n\n  await next();\n\n  \u002F\u002F Save session\n  const updatedSession = c.get(\"session\");\n  if (Object.keys(updatedSession).length > 0) {\n    await redis.hset(`session:${sessionId}`, updatedSession);\n    await redis.expire(`session:${sessionId}`, 86400); \u002F\u002F 24h\n  }\n});\n```\n\n## Common Errors\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `ECONNREFUSED` | Redis not running | Start Redis server |\n| `NOAUTH` | Authentication required | Provide password |\n| `WRONGTYPE` | Wrong data type | Check key type |\n| `OOM` | Out of memory | Configure maxmemory |\n\n## When to Load References\n\nLoad `references\u002Fclustering.md` when:\n- Redis Cluster setup\n- Sentinel configuration\n- High availability patterns\n\nLoad `references\u002Flua-scripts.md` when:\n- Custom Lua scripts\n- Atomic operations\n- Complex transactions\n","# Bun Redis\n\nRedis integration with Bun using popular Redis clients.\n\n## Client Options\n\n| Client | Best For | Install |\n|--------|----------|---------|\n| `ioredis` | Self-hosted Redis | `bun add ioredis` |\n| `@upstash\u002Fredis` | Serverless\u002FEdge | `bun add @upstash\u002Fredis` |\n| `redis` | Official Node client | `bun add redis` |\n\n## ioredis Setup\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Default connection\nconst redis = new Redis();\n\n\u002F\u002F With options\nconst redis = new Redis({\n  host: \"localhost\",\n  port: 6379,\n  password: \"secret\",\n  db: 0,\n});\n\n\u002F\u002F Connection string\nconst redis = new Redis(\"redis:\u002F\u002F:password@localhost:6379\u002F0\");\n\n\u002F\u002F TLS connection\nconst redis = new Redis({\n  host: \"redis.example.com\",\n  port: 6380,\n  tls: {},\n});\n```\n\n## Basic Operations\n\n```typescript\nimport Redis from \"ioredis\";\n\nconst redis = new Redis();\n\n\u002F\u002F Strings\nawait redis.set(\"name\", \"Alice\");\nawait redis.set(\"count\", \"100\");\nawait redis.setex(\"temp\", 60, \"expires in 60s\"); \u002F\u002F With TTL\n\nconst name = await redis.get(\"name\"); \u002F\u002F \"Alice\"\nconst count = await redis.incr(\"count\"); \u002F\u002F 101\nawait redis.del(\"name\");\n\n\u002F\u002F Check existence\nconst exists = await redis.exists(\"name\"); \u002F\u002F 0 or 1\n\n\u002F\u002F TTL\nawait redis.expire(\"key\", 3600); \u002F\u002F Set 1 hour TTL\nconst ttl = await redis.ttl(\"key\"); \u002F\u002F Get remaining TTL\n```\n\n## Data Structures\n\n### Hashes\n\n```typescript\n\u002F\u002F Set hash fields\nawait redis.hset(\"user:1\", {\n  name: \"Alice\",\n  email: \"alice@example.com\",\n  age: \"30\",\n});\n\n\u002F\u002F Get single field\nconst name = await redis.hget(\"user:1\", \"name\");\n\n\u002F\u002F Get all fields\nconst user = await redis.hgetall(\"user:1\");\n\u002F\u002F { name: \"Alice\", email: \"...\", age: \"30\" }\n\n\u002F\u002F Increment field\nawait redis.hincrby(\"user:1\", \"visits\", 1);\n```\n\n### Lists\n\n```typescript\n\u002F\u002F Add to list\nawait redis.rpush(\"queue\", \"task1\", \"task2\");\nawait redis.lpush(\"queue\", \"urgent\");\n\n\u002F\u002F Pop from list\nconst task = await redis.lpop(\"queue\"); \u002F\u002F \"urgent\"\nconst blocking = await redis.blpop(\"queue\", 5); \u002F\u002F Wait 5s\n\n\u002F\u002F Range\nconst items = await redis.lrange(\"queue\", 0, -1);\n```\n\n### Sets\n\n```typescript\n\u002F\u002F Add members\nawait redis.sadd(\"tags\", \"javascript\", \"typescript\", \"bun\");\n\n\u002F\u002F Check membership\nconst isMember = await redis.sismember(\"tags\", \"bun\"); \u002F\u002F 1\n\n\u002F\u002F Get all members\nconst tags = await redis.smembers(\"tags\");\n\n\u002F\u002F Set operations\nawait redis.sinter(\"tags1\", \"tags2\"); \u002F\u002F Intersection\nawait redis.sunion(\"tags1\", \"tags2\"); \u002F\u002F Union\n```\n\n### Sorted Sets\n\n```typescript\n\u002F\u002F Add with scores\nawait redis.zadd(\"leaderboard\", 100, \"alice\", 200, \"bob\", 150, \"charlie\");\n\n\u002F\u002F Get by rank\nconst top3 = await redis.zrevrange(\"leaderboard\", 0, 2, \"WITHSCORES\");\n\n\u002F\u002F Get by score range\nconst highScores = await redis.zrangebyscore(\"leaderboard\", 100, 200);\n\n\u002F\u002F Increment score\nawait redis.zincrby(\"leaderboard\", 50, \"alice\");\n```\n\n## JSON (RedisJSON)\n\n```typescript\n\u002F\u002F Requires RedisJSON module\nawait redis.call(\"JSON.SET\", \"user:1\", \"$\", JSON.stringify({\n  name: \"Alice\",\n  settings: { theme: \"dark\" },\n}));\n\nconst user = await redis.call(\"JSON.GET\", \"user:1\");\nconst settings = await redis.call(\"JSON.GET\", \"user:1\", \"$.settings\");\n```\n\n## Pub\u002FSub\n\n```typescript\nimport Redis from \"ioredis\";\n\n\u002F\u002F Publisher\nconst pub = new Redis();\n\n\u002F\u002F Subscriber\nconst sub = new Redis();\n\n\u002F\u002F Subscribe to channel\nsub.subscribe(\"notifications\", (err, count) => {\n  console.log(`Subscribed to ${count} channels`);\n});\n\n\u002F\u002F Handle messages\nsub.on(\"message\", (channel, message) => {\n  console.log(`${channel}: ${message}`);\n});\n\n\u002F\u002F Publish\nawait pub.publish(\"notifications\", JSON.stringify({\n  type: \"alert\",\n  message: \"Hello!\",\n}));\n\n\u002F\u002F Pattern subscribe\nsub.psubscribe(\"user:*\");\nsub.on(\"pmessage\", (pattern, channel, message) => {\n  console.log(`${pattern} -> ${channel}: ${message}`);\n});\n```\n\n## Transactions\n\n```typescript\n\u002F\u002F Multi\u002FExec\nconst results = await redis\n  .multi()\n  .set(\"key1\", \"value1\")\n  .set(\"key2\", \"value2\")\n  .incr(\"counter\")\n  .exec();\n\n\u002F\u002F Pipeline (no atomicity, better performance)\nconst pipeline = redis.pipeline();\npipeline.set(\"key1\", \"value1\");\npipeline.set(\"key2\", \"value2\");\npipeline.incr(\"counter\");\nconst results = await pipeline.exec();\n```\n\n## Upstash Redis (Serverless)\n\n```typescript\nimport { Redis } from \"@upstash\u002Fredis\";\n\nconst redis = new Redis({\n  url: process.env.UPSTASH_REDIS_REST_URL,\n  token: process.env.UPSTASH_REDIS_REST_TOKEN,\n});\n\n\u002F\u002F Same API as ioredis\nawait redis.set(\"key\", \"value\");\nconst value = await redis.get(\"key\");\n\n\u002F\u002F With automatic JSON serialization\nawait redis.set(\"user\", { name: \"Alice\", age: 30 });\nconst user = await redis.get\u003C{ name: string; age: number }>(\"user\");\n```\n\n## Caching Patterns\n\n### Cache-Aside\n\n```typescript\nasync function getUser(id: string) {\n  \u002F\u002F Check cache\n  const cached = await redis.get(`user:${id}`);\n  if (cached) {\n    return JSON.parse(cached);\n  }\n\n  \u002F\u002F Fetch from database\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n\n  \u002F\u002F Cache for 1 hour\n  if (user) {\n    await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n  }\n\n  return user;\n}\n```\n\n### Write-Through\n\n```typescript\nasync function updateUser(id: string, data: UserUpdate) {\n  \u002F\u002F Update database\n  await db.update(users).set(data).where(eq(users.id, id));\n\n  \u002F\u002F Update cache\n  const user = await db.query.users.findFirst({\n    where: eq(users.id, id),\n  });\n  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));\n\n  return user;\n}\n```\n\n### Rate Limiting\n\n```typescript\nasync function rateLimit(key: string, limit: number, window: number) {\n  const current = await redis.incr(key);\n\n  if (current === 1) {\n    await redis.expire(key, window);\n  }\n\n  return current \u003C= limit;\n}\n\n\u002F\u002F Usage\nconst allowed = await rateLimit(`rate:${userId}`, 100, 60);\nif (!allowed) {\n  throw new Error(\"Rate limit exceeded\");\n}\n```\n\n## Session Storage\n\n```typescript\nimport { Hono } from \"hono\";\nimport Redis from \"ioredis\";\nimport { v4 as uuid } from \"uuid\";\n\nconst redis = new Redis();\nconst app = new Hono();\n\napp.use(\"*\", async (c, next) => {\n  const sessionId = c.req.header(\"X-Session-Id\") || uuid();\n  const session = await redis.hgetall(`session:${sessionId}`);\n\n  c.set(\"session\", session);\n  c.set(\"sessionId\", sessionId);\n\n  await next();\n\n  \u002F\u002F Save session\n  const updatedSession = c.get(\"session\");\n  if (Object.keys(updatedSession).length > 0) {\n    await redis.hset(`session:${sessionId}`, updatedSession);\n    await redis.expire(`session:${sessionId}`, 86400); \u002F\u002F 24h\n  }\n});\n```\n\n## Common Errors\n\n| Error | Cause | Fix |\n|-------|-------|-----|\n| `ECONNREFUSED` | Redis not running | Start Redis server |\n| `NOAUTH` | Authentication required | Provide password |\n| `WRONGTYPE` | Wrong data type | Check key type |\n| `OOM` | Out of memory | Configure maxmemory |\n\n## When to Load References\n\nLoad `references\u002Fclustering.md` when:\n- Redis Cluster setup\n- Sentinel configuration\n- High availability patterns\n\nLoad `references\u002Flua-scripts.md` when:\n- Custom Lua scripts\n- Atomic operations\n- Complex transactions\n",{"name":5,"license":15,"description":7},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fsecondsky\u002Fclaude-skills\u002Fbun-redis",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill bun-redis",{"tool":50,"command":51},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill bun-redis",{"tool":53,"command":54},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill bun-redis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fsecondsky\u002Fclaude-skills\u002Fbun-redis\u002FSKILL.md",true,[],[59,73,83,92,98,105],{"skillNo":60,"name":61,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":69,"publishedAt":30},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[64],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[70,71,72],"model","model hierarchy","model hierarchy skill",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":79,"publishedAt":30},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[78],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},[80,81,82],"MCP","zoom","zoom mcp",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":30},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[89,90,91,81],"sdk","zoom apps sdk","apps",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":30},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[94],{"skillNo":99,"name":100,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":104,"publishedAt":30},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[103],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},[100],{"skillNo":106,"name":107,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":30},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[107]]