[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N0YP6DC27NGADZB72VD4WD":3,"skill-same:01M6N0YP6DC27NGADZB72VD4WD":98},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":54,"updatedAt":55,"install":56,"resources":69},"01M6N0YP6DC27NGADZB72VD4WD","ngrok-unofficial-webhook-skill",null,"Start an ngrok tunnel to receive incoming webhooks and process them via the LLM. Use when the user asks to listen for webhooks, set up a webhook endpoint, start ngrok, or when another skill (like Zoom RTMS Meeting Assistant) needs a public webhook URL. Receives webhook payloads and lets the LLM decide how to handle them.","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"ngrok unofficial webhook skill","ngrok","webhook","another skill","for","rtms","meeting","URL","zoom","via","how to","zoom rtms","webhooks","up","use","process","payloads","decide","how","SET","2026-11-10 10:12:30",false,"---\nname: ngrok-unofficial-webhook-skill\ndescription: Start an ngrok tunnel to receive incoming webhooks and process them via the LLM. Use when the user asks to listen for webhooks, set up a webhook endpoint, start ngrok, or when another skill (like Zoom RTMS Meeting Assistant) needs a public webhook URL. Receives webhook payloads and lets the LLM decide how to handle them.\n---\n\n# Ngrok Webhook Listener\n\nStart a public webhook endpoint via ngrok. Incoming webhooks are auto-routed to matching skills or presented to the user for manual handling.\n\n## Prerequisites\n\n```bash\ncd skills\u002Fngrok-unofficial-webhook-skill\nnpm install\n```\n\n## Environment Variables\n\nSet in the skill's `.env` file (copy from `.env.example`).\n\n**Required:**\n- `NGROK_AUTHTOKEN` — ngrok auth token from https:\u002F\u002Fdashboard.ngrok.com\n\n**Optional:**\n- `NGROK_DOMAIN` — stable ngrok domain for consistent URLs\n- `WEBHOOK_PORT` — local port (default: `4040`)\n- `WEBHOOK_PATH` — webhook path (default: `\u002Fwebhook`)\n- `OPENCLAW_BIN` — path to openclaw binary (default: `openclaw`)\n- `OPENCLAW_NOTIFY_CHANNEL` — notification channel (default: `whatsapp`)\n- `OPENCLAW_NOTIFY_TARGET` — phone number \u002F target for notifications\n\n## Usage\n\n### Start the webhook listener\n\nRun as a **background process**:\n\n```bash\ncd skills\u002Fngrok-unofficial-webhook-skill\nnode scripts\u002Fwebhook-server.js\n```\n\nThe server prints its public URL to stderr:\n```\nNGROK_URL=https:\u002F\u002Fxxxx.ngrok-free.app\nWebhook endpoint: https:\u002F\u002Fxxxx.ngrok-free.app\u002Fwebhook\n```\n\nFor long-running use, launch with `nohup`:\n```bash\nnohup node scripts\u002Fwebhook-server.js >> \u002Ftmp\u002Fngrok-webhook.log 2>&1 &\n```\n\n### What happens when a webhook arrives\n\n1. The server immediately responds **200 OK** to the sender\n2. It discovers installed skills that declare `webhookEvents` in their `skill.json`\n3. **Auto-routing** (no user intervention needed):\n   - If a matching skill has `forwardPort` → HTTP POST to the local service\n   - If a matching skill has `webhookCommands` → runs the configured shell command\n4. **Manual routing** (user decides):\n   - If no auto-route is available, sends a WhatsApp notification with the payload and a numbered list of matching skills\n   - User replies with their choice\n\n### Skill discovery\n\nSkills opt into webhook handling by adding `webhookEvents` to their `skill.json`:\n\n```json\n{\n  \"openclaw\": {\n    \"webhookEvents\": [\"meeting.rtms_started\", \"meeting.rtms_stopped\"],\n    \"forwardPort\": 4048,\n    \"forwardPath\": \"\u002F\"\n  }\n}\n```\n\nFor command-based auto-handling (no running service required):\n\n```json\n{\n  \"openclaw\": {\n    \"webhookEvents\": [\"recording.completed\"],\n    \"webhookCommands\": {\n      \"recording.completed\": {\n        \"command\": \"python3 scripts\u002Fdownload.py {{meeting_id}}\",\n        \"description\": \"Download cloud recording\",\n        \"meetingIdPath\": \"payload.object.id\"\n      }\n    }\n  }\n}\n```\n\n- `command` — shell command to run; `{{meeting_id}}` is replaced with the extracted value\n- `meetingIdPath` — dot-separated path to extract the meeting ID from the webhook payload\n- `description` — human-readable description for notifications\n\nThe ngrok skill scans all sibling skill folders for `skill.json` files with these fields.\n\n### Stdout output\n\nThe server also writes each webhook as a JSON line to **stdout** for process polling:\n\n```json\n{\n  \"id\": \"uuid\",\n  \"timestamp\": \"ISO-8601\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fwebhook\",\n  \"query\": {},\n  \"body\": {}\n}\n```\n\n### Health check\n\n```bash\ncurl http:\u002F\u002Flocalhost:4040\u002Fhealth\n```\n\n### Stop the listener\n\nKill the background process when done.\n\n## Integration with Zoom\n\nTypical flow:\n1. Start this webhook listener → get ngrok URL\n2. Configure the ngrok URL in your Zoom Marketplace app's webhook settings\n3. When RTMS starts, Zoom sends `meeting.rtms_started` → auto-forwarded to the RTMS Meeting Assistant\n4. When RTMS stops, Zoom sends `meeting.rtms_stopped` → auto-forwarded, triggers cleanup\n","# Ngrok Webhook Listener\n\nStart a public webhook endpoint via ngrok. Incoming webhooks are auto-routed to matching skills or presented to the user for manual handling.\n\n## Prerequisites\n\n```bash\ncd skills\u002Fngrok-unofficial-webhook-skill\nnpm install\n```\n\n## Environment Variables\n\nSet in the skill's `.env` file (copy from `.env.example`).\n\n**Required:**\n- `NGROK_AUTHTOKEN` — ngrok auth token from https:\u002F\u002Fdashboard.ngrok.com\n\n**Optional:**\n- `NGROK_DOMAIN` — stable ngrok domain for consistent URLs\n- `WEBHOOK_PORT` — local port (default: `4040`)\n- `WEBHOOK_PATH` — webhook path (default: `\u002Fwebhook`)\n- `OPENCLAW_BIN` — path to openclaw binary (default: `openclaw`)\n- `OPENCLAW_NOTIFY_CHANNEL` — notification channel (default: `whatsapp`)\n- `OPENCLAW_NOTIFY_TARGET` — phone number \u002F target for notifications\n\n## Usage\n\n### Start the webhook listener\n\nRun as a **background process**:\n\n```bash\ncd skills\u002Fngrok-unofficial-webhook-skill\nnode scripts\u002Fwebhook-server.js\n```\n\nThe server prints its public URL to stderr:\n```\nNGROK_URL=https:\u002F\u002Fxxxx.ngrok-free.app\nWebhook endpoint: https:\u002F\u002Fxxxx.ngrok-free.app\u002Fwebhook\n```\n\nFor long-running use, launch with `nohup`:\n```bash\nnohup node scripts\u002Fwebhook-server.js >> \u002Ftmp\u002Fngrok-webhook.log 2>&1 &\n```\n\n### What happens when a webhook arrives\n\n1. The server immediately responds **200 OK** to the sender\n2. It discovers installed skills that declare `webhookEvents` in their `skill.json`\n3. **Auto-routing** (no user intervention needed):\n   - If a matching skill has `forwardPort` → HTTP POST to the local service\n   - If a matching skill has `webhookCommands` → runs the configured shell command\n4. **Manual routing** (user decides):\n   - If no auto-route is available, sends a WhatsApp notification with the payload and a numbered list of matching skills\n   - User replies with their choice\n\n### Skill discovery\n\nSkills opt into webhook handling by adding `webhookEvents` to their `skill.json`:\n\n```json\n{\n  \"openclaw\": {\n    \"webhookEvents\": [\"meeting.rtms_started\", \"meeting.rtms_stopped\"],\n    \"forwardPort\": 4048,\n    \"forwardPath\": \"\u002F\"\n  }\n}\n```\n\nFor command-based auto-handling (no running service required):\n\n```json\n{\n  \"openclaw\": {\n    \"webhookEvents\": [\"recording.completed\"],\n    \"webhookCommands\": {\n      \"recording.completed\": {\n        \"command\": \"python3 scripts\u002Fdownload.py {{meeting_id}}\",\n        \"description\": \"Download cloud recording\",\n        \"meetingIdPath\": \"payload.object.id\"\n      }\n    }\n  }\n}\n```\n\n- `command` — shell command to run; `{{meeting_id}}` is replaced with the extracted value\n- `meetingIdPath` — dot-separated path to extract the meeting ID from the webhook payload\n- `description` — human-readable description for notifications\n\nThe ngrok skill scans all sibling skill folders for `skill.json` files with these fields.\n\n### Stdout output\n\nThe server also writes each webhook as a JSON line to **stdout** for process polling:\n\n```json\n{\n  \"id\": \"uuid\",\n  \"timestamp\": \"ISO-8601\",\n  \"method\": \"POST\",\n  \"path\": \"\u002Fwebhook\",\n  \"query\": {},\n  \"body\": {}\n}\n```\n\n### Health check\n\n```bash\ncurl http:\u002F\u002Flocalhost:4040\u002Fhealth\n```\n\n### Stop the listener\n\nKill the background process when done.\n\n## Integration with Zoom\n\nTypical flow:\n1. Start this webhook listener → get ngrok URL\n2. Configure the ngrok URL in your Zoom Marketplace app's webhook settings\n3. When RTMS starts, Zoom sends `meeting.rtms_started` → auto-forwarded to the RTMS Meeting Assistant\n4. When RTMS stops, Zoom sends `meeting.rtms_stopped` → auto-forwarded, triggers cleanup\n",{"name":5,"description":7},"main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill ngrok-unofficial-webhook-skill",{"tool":62,"command":63},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill ngrok-unofficial-webhook-skill",{"tool":65,"command":66},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill ngrok-unofficial-webhook-skill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002FSKILL.md",true,[70,76,80,84,88,94],{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"_meta.json","REFERENCE","参考文档",848,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002F_meta.json",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"package-lock.json",37149,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002Fpackage-lock.json",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"package.json",194,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002Fpackage.json",{"path":85,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":86,"sourceHtmlUrl":87},"README.md",4222,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002FREADME.md",{"path":89,"resourceType":90,"resourceTypeDesc":91,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fwebhook-server.js","SCRIPT","脚本",9977,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002Fscripts\u002Fwebhook-server.js",{"path":95,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":96,"sourceHtmlUrl":97},"skill.json",839,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fngrok-unofficial-webhook-skill\u002Fskill.json",[99,122,154,165,175,204],{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":43},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[101,106,107,108,109,110,37,111,112,113,114,115,116,117,118,119,120,121],"safe","ethereum","defi","Optimization","user","Wallet","base","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":123,"name":124,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":136,"publishedAt":43},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[127,130,131],{"categoryNo":128,"categoryName":129,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[137,138,139,140,141,142,143,108,144,111,145,146,147,148,149,150,151,152,153],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":155,"name":156,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":43},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[159,160,161],{"categoryNo":128,"categoryName":129,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},[137,163,164,138,139,140,141,142,143,108,144,111,146,147,148,149,150,151,152,153],"api skill","zerion api skill",{"skillNo":166,"name":167,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":168,"categories":169,"keywords":173,"publishedAt":43},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[170,171,172],{"categoryNo":128,"categoryName":129,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},[140,137,174,138,139,141,142,108,144,111,145,146,147,148,149,150,151,152,153],"zerion api mcp",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":184,"publishedAt":43},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[181],{"categoryNo":182,"categoryName":183,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000040","财务",[185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,27],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","https","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":211,"publishedAt":43},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[210],{"categoryNo":182,"categoryName":183,"taxonomyType":134,"taxonomyTypeDesc":135},[185,186,188,212,213,214,215,216,36,196,217,218,219,220,221,222,223,224,153,203],"cli","homebrew","find","check","brew","local","get","stock","link","trending","sf","quotes","ln"]