[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M717YWYA3W8GGKTNJMYH5BKR":3,"skill-same:01M717YWYA3W8GGKTNJMYH5BKR":65},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":14,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M717YWYA3W8GGKTNJMYH5BKR","azure-messaging-webpubsub-java",null,"Build real-time web applications with Azure Web PubSub SDK for Java. Use when implementing WebSocket-based messaging, live updates, chat applications, or server-to-client push notifications.","sapsapshen\u002Fai-memory-router","sapsapshen","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F20347959?v=4","01M6XDQEF1DP50DKF37H81J3J5","shenmian","01M6XDQEJPE41Y3DT2763X8ZJN",0,"MIT","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fazure-messaging-webpubsub-java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"azure","azure messaging webpubsub java","azure messaging","java","messaging","2026","when","unknown","for","implementing","updates","pubsub","live","time","community","real-time","websocket","server","notifications","push","2026-11-10 10:12:30",false,"---\nname: azure-messaging-webpubsub-java\ndescription: \"Build real-time web applications with Azure Web PubSub SDK for Java. Use when implementing WebSocket-based messaging, live updates, chat applications, or server-to-client push notifications.\"\nrisk: unknown\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# Azure Web PubSub SDK for Java\n\nBuild real-time web applications using the Azure Web PubSub SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-messaging-webpubsub\u003C\u002FartifactId>\n    \u003Cversion>1.5.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### With Connection String\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceClient;\nimport com.azure.messaging.webpubsub.WebPubSubServiceClientBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With Access Key\n\n```java\nimport com.azure.core.credential.AzureKeyCredential;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new AzureKeyCredential(\"\u003Caccess-key>\"))\n    .endpoint(\"\u003Cendpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .endpoint(\"\u003Cendpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### Async Client\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceAsyncClient;\n\nWebPubSubServiceAsyncClient asyncClient = new WebPubSubServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .hub(\"chat\")\n    .buildAsyncClient();\n```\n\n## Key Concepts\n\n- **Hub**: Logical isolation unit for connections\n- **Group**: Subset of connections within a hub\n- **Connection**: Individual WebSocket client connection\n- **User**: Entity that can have multiple connections\n\n## Core Patterns\n\n### Send to All Connections\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubContentType;\n\n\u002F\u002F Send text message\nclient.sendToAll(\"Hello everyone!\", WebPubSubContentType.TEXT_PLAIN);\n\n\u002F\u002F Send JSON\nString jsonMessage = \"{\\\"type\\\": \\\"notification\\\", \\\"message\\\": \\\"New update!\\\"}\";\nclient.sendToAll(jsonMessage, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to All with Filter\n\n```java\nimport com.azure.core.http.rest.RequestOptions;\nimport com.azure.core.util.BinaryData;\n\nBinaryData message = BinaryData.fromString(\"Hello filtered users!\");\n\n\u002F\u002F Filter by userId\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"userId ne 'user1'\"));\n\n\u002F\u002F Filter by groups\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"'GroupA' in groups and not('GroupB' in groups)\"));\n```\n\n### Send to Group\n\n```java\n\u002F\u002F Send to all connections in a group\nclient.sendToGroup(\"java-developers\", \"Hello Java devs!\", WebPubSubContentType.TEXT_PLAIN);\n\n\u002F\u002F Send JSON to group\nString json = \"{\\\"event\\\": \\\"update\\\", \\\"data\\\": {\\\"version\\\": \\\"2.0\\\"}}\";\nclient.sendToGroup(\"subscribers\", json, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to Specific Connection\n\n```java\n\u002F\u002F Send to a specific connection by ID\nclient.sendToConnection(\"connectionId123\", \"Private message\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Send to User\n\n```java\n\u002F\u002F Send to all connections for a specific user\nclient.sendToUser(\"andy\", \"Hello Andy!\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Manage Groups\n\n```java\n\u002F\u002F Add connection to group\nclient.addConnectionToGroup(\"premium-users\", \"connectionId123\");\n\n\u002F\u002F Remove connection from group\nclient.removeConnectionFromGroup(\"premium-users\", \"connectionId123\");\n\n\u002F\u002F Add user to group (all their connections)\nclient.addUserToGroup(\"admin-group\", \"userId456\");\n\n\u002F\u002F Remove user from group\nclient.removeUserFromGroup(\"admin-group\", \"userId456\");\n\n\u002F\u002F Check if user is in group\nboolean exists = client.userExistsInGroup(\"admin-group\", \"userId456\");\n```\n\n### Manage Connections\n\n```java\n\u002F\u002F Check if connection exists\nboolean connected = client.connectionExists(\"connectionId123\");\n\n\u002F\u002F Close a connection\nclient.closeConnection(\"connectionId123\");\n\n\u002F\u002F Close with reason\nclient.closeConnection(\"connectionId123\", \"Session expired\");\n\n\u002F\u002F Check if user exists (has any connections)\nboolean userOnline = client.userExists(\"userId456\");\n\n\u002F\u002F Close all connections for a user\nclient.closeUserConnections(\"userId456\");\n\n\u002F\u002F Close all connections in a group\nclient.closeGroupConnections(\"inactive-group\");\n```\n\n### Generate Client Access Token\n\n```java\nimport com.azure.messaging.webpubsub.models.GetClientAccessTokenOptions;\nimport com.azure.messaging.webpubsub.models.WebPubSubClientAccessToken;\n\n\u002F\u002F Basic token\nWebPubSubClientAccessToken token = client.getClientAccessToken(\n    new GetClientAccessTokenOptions());\nSystem.out.println(\"URL: \" + token.getUrl());\n\n\u002F\u002F With user ID\nWebPubSubClientAccessToken userToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions().setUserId(\"user123\"));\n\n\u002F\u002F With roles (permissions)\nWebPubSubClientAccessToken roleToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addRole(\"webpubsub.joinLeaveGroup\")\n        .addRole(\"webpubsub.sendToGroup\"));\n\n\u002F\u002F With groups to join on connect\nWebPubSubClientAccessToken groupToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addGroup(\"announcements\")\n        .addGroup(\"updates\"));\n\n\u002F\u002F With custom expiration\nWebPubSubClientAccessToken expToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .setExpiresAfter(Duration.ofHours(2)));\n```\n\n### Grant\u002FRevoke Permissions\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubPermission;\n\n\u002F\u002F Grant permission to send to a group\nclient.grantPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n\u002F\u002F Revoke permission\nclient.revokePermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n\u002F\u002F Check permission\nboolean hasPermission = client.checkPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n```\n\n### Async Operations\n\n```java\nasyncClient.sendToAll(\"Async message!\", WebPubSubContentType.TEXT_PLAIN)\n    .subscribe(\n        unused -> System.out.println(\"Message sent\"),\n        error -> System.err.println(\"Error: \" + error.getMessage())\n    );\n\nasyncClient.sendToGroup(\"developers\", \"Group message\", WebPubSubContentType.TEXT_PLAIN)\n    .doOnSuccess(v -> System.out.println(\"Sent to group\"))\n    .doOnError(e -> System.err.println(\"Failed: \" + e))\n    .subscribe();\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    client.sendToConnection(\"invalid-id\", \"test\", WebPubSubContentType.TEXT_PLAIN);\n} catch (HttpResponseException e) {\n    System.out.println(\"Status: \" + e.getResponse().getStatusCode());\n    System.out.println(\"Error: \" + e.getMessage());\n}\n```\n\n## Environment Variables\n\n```bash\nWEB_PUBSUB_CONNECTION_STRING=Endpoint=https:\u002F\u002F\u003Cresource>.webpubsub.azure.com;AccessKey=...\nWEB_PUBSUB_ENDPOINT=https:\u002F\u002F\u003Cresource>.webpubsub.azure.com\nWEB_PUBSUB_ACCESS_KEY=\u003Cyour-access-key>\n```\n\n## Client Roles\n\n| Role | Permission |\n|------|------------|\n| `webpubsub.joinLeaveGroup` | Join\u002Fleave any group |\n| `webpubsub.sendToGroup` | Send to any group |\n| `webpubsub.joinLeaveGroup.\u003Cgroup>` | Join\u002Fleave specific group |\n| `webpubsub.sendToGroup.\u003Cgroup>` | Send to specific group |\n\n## Best Practices\n\n1. **Use Groups**: Organize connections into groups for targeted messaging\n2. **User IDs**: Associate connections with user IDs for user-level messaging\n3. **Token Expiration**: Set appropriate token expiration for security\n4. **Roles**: Grant minimal required permissions via roles\n5. **Hub Isolation**: Use separate hubs for different application features\n6. **Connection Management**: Clean up inactive connections\n\n## Trigger Phrases\n\n- \"Web PubSub Java\"\n- \"WebSocket messaging Azure\"\n- \"real-time push notifications\"\n- \"server-sent events\"\n- \"chat application backend\"\n- \"live updates broadcasting\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure Web PubSub SDK for Java\n\nBuild real-time web applications using the Azure Web PubSub SDK for Java.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-messaging-webpubsub\u003C\u002FartifactId>\n    \u003Cversion>1.5.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Client Creation\n\n### With Connection String\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceClient;\nimport com.azure.messaging.webpubsub.WebPubSubServiceClientBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With Access Key\n\n```java\nimport com.azure.core.credential.AzureKeyCredential;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new AzureKeyCredential(\"\u003Caccess-key>\"))\n    .endpoint(\"\u003Cendpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### With DefaultAzureCredential\n\n```java\nimport com.azure.identity.DefaultAzureCredentialBuilder;\n\nWebPubSubServiceClient client = new WebPubSubServiceClientBuilder()\n    .credential(new DefaultAzureCredentialBuilder().build())\n    .endpoint(\"\u003Cendpoint>\")\n    .hub(\"chat\")\n    .buildClient();\n```\n\n### Async Client\n\n```java\nimport com.azure.messaging.webpubsub.WebPubSubServiceAsyncClient;\n\nWebPubSubServiceAsyncClient asyncClient = new WebPubSubServiceClientBuilder()\n    .connectionString(\"\u003Cconnection-string>\")\n    .hub(\"chat\")\n    .buildAsyncClient();\n```\n\n## Key Concepts\n\n- **Hub**: Logical isolation unit for connections\n- **Group**: Subset of connections within a hub\n- **Connection**: Individual WebSocket client connection\n- **User**: Entity that can have multiple connections\n\n## Core Patterns\n\n### Send to All Connections\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubContentType;\n\n\u002F\u002F Send text message\nclient.sendToAll(\"Hello everyone!\", WebPubSubContentType.TEXT_PLAIN);\n\n\u002F\u002F Send JSON\nString jsonMessage = \"{\\\"type\\\": \\\"notification\\\", \\\"message\\\": \\\"New update!\\\"}\";\nclient.sendToAll(jsonMessage, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to All with Filter\n\n```java\nimport com.azure.core.http.rest.RequestOptions;\nimport com.azure.core.util.BinaryData;\n\nBinaryData message = BinaryData.fromString(\"Hello filtered users!\");\n\n\u002F\u002F Filter by userId\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"userId ne 'user1'\"));\n\n\u002F\u002F Filter by groups\nclient.sendToAllWithResponse(\n    message,\n    WebPubSubContentType.TEXT_PLAIN,\n    message.getLength(),\n    new RequestOptions().addQueryParam(\"filter\", \"'GroupA' in groups and not('GroupB' in groups)\"));\n```\n\n### Send to Group\n\n```java\n\u002F\u002F Send to all connections in a group\nclient.sendToGroup(\"java-developers\", \"Hello Java devs!\", WebPubSubContentType.TEXT_PLAIN);\n\n\u002F\u002F Send JSON to group\nString json = \"{\\\"event\\\": \\\"update\\\", \\\"data\\\": {\\\"version\\\": \\\"2.0\\\"}}\";\nclient.sendToGroup(\"subscribers\", json, WebPubSubContentType.APPLICATION_JSON);\n```\n\n### Send to Specific Connection\n\n```java\n\u002F\u002F Send to a specific connection by ID\nclient.sendToConnection(\"connectionId123\", \"Private message\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Send to User\n\n```java\n\u002F\u002F Send to all connections for a specific user\nclient.sendToUser(\"andy\", \"Hello Andy!\", WebPubSubContentType.TEXT_PLAIN);\n```\n\n### Manage Groups\n\n```java\n\u002F\u002F Add connection to group\nclient.addConnectionToGroup(\"premium-users\", \"connectionId123\");\n\n\u002F\u002F Remove connection from group\nclient.removeConnectionFromGroup(\"premium-users\", \"connectionId123\");\n\n\u002F\u002F Add user to group (all their connections)\nclient.addUserToGroup(\"admin-group\", \"userId456\");\n\n\u002F\u002F Remove user from group\nclient.removeUserFromGroup(\"admin-group\", \"userId456\");\n\n\u002F\u002F Check if user is in group\nboolean exists = client.userExistsInGroup(\"admin-group\", \"userId456\");\n```\n\n### Manage Connections\n\n```java\n\u002F\u002F Check if connection exists\nboolean connected = client.connectionExists(\"connectionId123\");\n\n\u002F\u002F Close a connection\nclient.closeConnection(\"connectionId123\");\n\n\u002F\u002F Close with reason\nclient.closeConnection(\"connectionId123\", \"Session expired\");\n\n\u002F\u002F Check if user exists (has any connections)\nboolean userOnline = client.userExists(\"userId456\");\n\n\u002F\u002F Close all connections for a user\nclient.closeUserConnections(\"userId456\");\n\n\u002F\u002F Close all connections in a group\nclient.closeGroupConnections(\"inactive-group\");\n```\n\n### Generate Client Access Token\n\n```java\nimport com.azure.messaging.webpubsub.models.GetClientAccessTokenOptions;\nimport com.azure.messaging.webpubsub.models.WebPubSubClientAccessToken;\n\n\u002F\u002F Basic token\nWebPubSubClientAccessToken token = client.getClientAccessToken(\n    new GetClientAccessTokenOptions());\nSystem.out.println(\"URL: \" + token.getUrl());\n\n\u002F\u002F With user ID\nWebPubSubClientAccessToken userToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions().setUserId(\"user123\"));\n\n\u002F\u002F With roles (permissions)\nWebPubSubClientAccessToken roleToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addRole(\"webpubsub.joinLeaveGroup\")\n        .addRole(\"webpubsub.sendToGroup\"));\n\n\u002F\u002F With groups to join on connect\nWebPubSubClientAccessToken groupToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .addGroup(\"announcements\")\n        .addGroup(\"updates\"));\n\n\u002F\u002F With custom expiration\nWebPubSubClientAccessToken expToken = client.getClientAccessToken(\n    new GetClientAccessTokenOptions()\n        .setUserId(\"user123\")\n        .setExpiresAfter(Duration.ofHours(2)));\n```\n\n### Grant\u002FRevoke Permissions\n\n```java\nimport com.azure.messaging.webpubsub.models.WebPubSubPermission;\n\n\u002F\u002F Grant permission to send to a group\nclient.grantPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n\u002F\u002F Revoke permission\nclient.revokePermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n\n\u002F\u002F Check permission\nboolean hasPermission = client.checkPermission(\n    WebPubSubPermission.SEND_TO_GROUP,\n    \"connectionId123\",\n    new RequestOptions().addQueryParam(\"targetName\", \"chat-room\"));\n```\n\n### Async Operations\n\n```java\nasyncClient.sendToAll(\"Async message!\", WebPubSubContentType.TEXT_PLAIN)\n    .subscribe(\n        unused -> System.out.println(\"Message sent\"),\n        error -> System.err.println(\"Error: \" + error.getMessage())\n    );\n\nasyncClient.sendToGroup(\"developers\", \"Group message\", WebPubSubContentType.TEXT_PLAIN)\n    .doOnSuccess(v -> System.out.println(\"Sent to group\"))\n    .doOnError(e -> System.err.println(\"Failed: \" + e))\n    .subscribe();\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    client.sendToConnection(\"invalid-id\", \"test\", WebPubSubContentType.TEXT_PLAIN);\n} catch (HttpResponseException e) {\n    System.out.println(\"Status: \" + e.getResponse().getStatusCode());\n    System.out.println(\"Error: \" + e.getMessage());\n}\n```\n\n## Environment Variables\n\n```bash\nWEB_PUBSUB_CONNECTION_STRING=Endpoint=https:\u002F\u002F\u003Cresource>.webpubsub.azure.com;AccessKey=...\nWEB_PUBSUB_ENDPOINT=https:\u002F\u002F\u003Cresource>.webpubsub.azure.com\nWEB_PUBSUB_ACCESS_KEY=\u003Cyour-access-key>\n```\n\n## Client Roles\n\n| Role | Permission |\n|------|------------|\n| `webpubsub.joinLeaveGroup` | Join\u002Fleave any group |\n| `webpubsub.sendToGroup` | Send to any group |\n| `webpubsub.joinLeaveGroup.\u003Cgroup>` | Join\u002Fleave specific group |\n| `webpubsub.sendToGroup.\u003Cgroup>` | Send to specific group |\n\n## Best Practices\n\n1. **Use Groups**: Organize connections into groups for targeted messaging\n2. **User IDs**: Associate connections with user IDs for user-level messaging\n3. **Token Expiration**: Set appropriate token expiration for security\n4. **Roles**: Grant minimal required permissions via roles\n5. **Hub Isolation**: Use separate hubs for different application features\n6. **Connection Management**: Clean up inactive connections\n\n## Trigger Phrases\n\n- \"Web PubSub Java\"\n- \"WebSocket messaging Azure\"\n- \"real-time push notifications\"\n- \"server-sent events\"\n- \"chat application backend\"\n- \"live updates broadcasting\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":26,"source":33,"date_added":44,"description":7},"2026-02-27","main","7a38d8e7073e61c16eda85681cb32fb68a8657a5","skills-store\u002Fglobal\u002Fazure-messaging-webpubsub-java","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router","https:\u002F\u002Fgithub.com\u002Fsapsapshen","2026-04-14 21:12:12",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add sapsapshen\u002Fai-memory-router --skill azure-messaging-webpubsub-java",{"tool":57,"command":58},"bunx","bunx skills add sapsapshen\u002Fai-memory-router --skill azure-messaging-webpubsub-java",{"tool":60,"command":61},"pnpm","pnpm dlx skills add sapsapshen\u002Fai-memory-router --skill azure-messaging-webpubsub-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fglobal\u002Fazure-messaging-webpubsub-java\u002FSKILL.md",true,[],[66,90,113,123,136,155],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":77,"publishedAt":39},"01M71ATQRKG48SH06FQ697T5G9","wechat-search","Search WeChat Official Account articles using OpenClaw's web search and fetch capabilities with compliance-focused design.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fwechat-search-release\u002FSKILL.md",[72],{"categoryNo":73,"categoryName":74,"taxonomyType":75,"taxonomyTypeDesc":76},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[78,79,80,81,82,83,84,85,86,87,88,89],"wechat search","wechat","search","capabilities","openclaw","design","web search","compliance","web","official","fetch","with",{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":39},"01M71ATNAVGZB35PFYM2GC5N00","trend-tap","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend tap', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-tap\u002FSKILL.md",[],[97,98,99,100,101,32,80,102,103,104,105,25,106,31,107,108,109,110,111,112],"trend","trend tap","tap","api keys","Bash","trending","hacker","aggregator","do","brew","data","google","install","read","across","api",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":39},"01M71ATJ9AM5KM15AA8PS302EB","trend-radar","Real-time trending topics aggregator across 7 platforms (X\u002FTwitter, Reddit, Google Trends, Hacker News, Zhihu, Bilibili, Weibo). Trigger: when user says 'trend', 'trends', 'trend pulse', '热点', '热搜', or asks what is trending\u002Fhot. Do NOT use web_search — this skill already fetches live data from all platforms with zero API keys.","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftrend-radar\u002FSKILL.md",[],[120,121,97,106,31,107,108,101,80,110,122,111,112,25,104,103,102,109,32,100],"trend radar","radar","pulse",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":39},"01M71ATGF095N3EJM9G8SD0BB5","tech-news-daily","每日科技新闻汇——从全球多个 RSS 源抓取最新科技新闻，翻译（英→中）、去重、排版成每日简报。当用户询问科技新闻、科技新鲜事、每日科技、技术动态、Daily Tech News 或类似表达时触发此技能。","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Ftech-news-daily\u002FSKILL.md",[],[130,131,132,133,134,135],"news","tech","tech news daily","daily","rss","翻译",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":147,"publishedAt":39},"01M71ATFAEAMQ17M70NQNY7SR8","summarize","Summarize URLs or files with the summarize CLI (web, PDFs, images, audio, YouTube).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsummarize\u002FSKILL.md",[142],{"categoryNo":143,"categoryName":144,"taxonomyType":145,"taxonomyTypeDesc":146},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",[138,86,148,149,150,89,106,151,152,153,99,154,109],"Audio","cli","youtube","images","https","files","pdfs",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":39},"01M71ATDNS3R0M4H936PACQAWZ","sonoscli","Control Sonos speakers (discover\u002Fstatus\u002Fplay\u002Fvolume\u002Fgroup).","https:\u002F\u002Fgithub.com\u002Fsapsapshen\u002Fai-memory-router\u002Fblob\u002Fmain\u002Fskills-store\u002Fopenclaw\u002Fsonoscli\u002FSKILL.md",[],[157,162,163,164,109,165,152,166,167,168,169,170],"status","play","go","latest","github","discover","control","cmd","volume"]