{"id":"3d827498-fbf0-4c6e-89c1-98d6b510ca06","shortId":"yJwGdT","kind":"skill","title":"azure-communication-chat-java","tagline":"Build real-time chat applications with thread management, messaging, participants, and read receipts.","description":"# Azure Communication Chat (Java)\n\nBuild real-time chat applications with thread management, messaging, participants, and read receipts.\n\n## Installation\n\n```xml\n<dependency>\n    <groupId>com.azure</groupId>\n    <artifactId>azure-communication-chat</artifactId>\n    <version>1.6.0</version>\n</dependency>\n```\n\n## Client Creation\n\n```java\nimport com.azure.communication.chat.ChatClient;\nimport com.azure.communication.chat.ChatClientBuilder;\nimport com.azure.communication.chat.ChatThreadClient;\nimport com.azure.communication.common.CommunicationTokenCredential;\n\n// ChatClient requires a CommunicationTokenCredential (user access token)\nString endpoint = \"https://<resource>.communication.azure.com\";\nString userAccessToken = \"<user-access-token>\";\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(userAccessToken);\n\nChatClient chatClient = new ChatClientBuilder()\n    .endpoint(endpoint)\n    .credential(credential)\n    .buildClient();\n\n// Async client\nChatAsyncClient chatAsyncClient = new ChatClientBuilder()\n    .endpoint(endpoint)\n    .credential(credential)\n    .buildAsyncClient();\n```\n\n## Key Concepts\n\n| Class | Purpose |\n|-------|---------|\n| `ChatClient` | Create/delete chat threads, get thread clients |\n| `ChatThreadClient` | Operations within a thread (messages, participants, receipts) |\n| `ChatParticipant` | User in a chat thread with display name |\n| `ChatMessage` | Message content, type, sender info, timestamps |\n| `ChatMessageReadReceipt` | Read receipt tracking per participant |\n\n## Create Chat Thread\n\n```java\nimport com.azure.communication.chat.models.*;\nimport com.azure.communication.common.CommunicationUserIdentifier;\nimport java.util.ArrayList;\nimport java.util.List;\n\n// Define participants\nList<ChatParticipant> participants = new ArrayList<>();\n\nChatParticipant participant1 = new ChatParticipant()\n    .setCommunicationIdentifier(new CommunicationUserIdentifier(\"<user-id-1>\"))\n    .setDisplayName(\"Alice\");\n\nChatParticipant participant2 = new ChatParticipant()\n    .setCommunicationIdentifier(new CommunicationUserIdentifier(\"<user-id-2>\"))\n    .setDisplayName(\"Bob\");\n\nparticipants.add(participant1);\nparticipants.add(participant2);\n\n// Create thread\nCreateChatThreadOptions options = new CreateChatThreadOptions(\"Project Discussion\")\n    .setParticipants(participants);\n\nCreateChatThreadResult result = chatClient.createChatThread(options);\nString threadId = result.getChatThread().getId();\n\n// Get thread client for operations\nChatThreadClient threadClient = chatClient.getChatThreadClient(threadId);\n```\n\n## Send Messages\n\n```java\n// Send text message\nSendChatMessageOptions messageOptions = new SendChatMessageOptions()\n    .setContent(\"Hello, team!\")\n    .setSenderDisplayName(\"Alice\")\n    .setType(ChatMessageType.TEXT);\n\nSendChatMessageResult sendResult = threadClient.sendMessage(messageOptions);\nString messageId = sendResult.getId();\n\n// Send HTML message\nSendChatMessageOptions htmlOptions = new SendChatMessageOptions()\n    .setContent(\"<strong>Important:</strong> Meeting at 3pm\")\n    .setType(ChatMessageType.HTML);\n\nthreadClient.sendMessage(htmlOptions);\n```\n\n## Get Messages\n\n```java\nimport com.azure.core.util.paging.PagedIterable;\n\n// List all messages\nPagedIterable<ChatMessage> messages = threadClient.listMessages();\n\nfor (ChatMessage message : messages) {\n    System.out.println(\"ID: \" + message.getId());\n    System.out.println(\"Type: \" + message.getType());\n    System.out.println(\"Content: \" + message.getContent().getMessage());\n    System.out.println(\"Sender: \" + message.getSenderDisplayName());\n    System.out.println(\"Created: \" + message.getCreatedOn());\n    \n    // Check if edited or deleted\n    if (message.getEditedOn() != null) {\n        System.out.println(\"Edited: \" + message.getEditedOn());\n    }\n    if (message.getDeletedOn() != null) {\n        System.out.println(\"Deleted: \" + message.getDeletedOn());\n    }\n}\n\n// Get specific message\nChatMessage message = threadClient.getMessage(messageId);\n```\n\n## Update and Delete Messages\n\n```java\n// Update message\nUpdateChatMessageOptions updateOptions = new UpdateChatMessageOptions()\n    .setContent(\"Updated message content\");\n\nthreadClient.updateMessage(messageId, updateOptions);\n\n// Delete message\nthreadClient.deleteMessage(messageId);\n```\n\n## Manage Participants\n\n```java\n// List participants\nPagedIterable<ChatParticipant> participants = threadClient.listParticipants();\n\nfor (ChatParticipant participant : participants) {\n    CommunicationUserIdentifier user = \n        (CommunicationUserIdentifier) participant.getCommunicationIdentifier();\n    System.out.println(\"User: \" + user.getId());\n    System.out.println(\"Display Name: \" + participant.getDisplayName());\n}\n\n// Add participants\nList<ChatParticipant> newParticipants = new ArrayList<>();\nnewParticipants.add(new ChatParticipant()\n    .setCommunicationIdentifier(new CommunicationUserIdentifier(\"<new-user-id>\"))\n    .setDisplayName(\"Charlie\")\n    .setShareHistoryTime(OffsetDateTime.now().minusDays(7))); // Share last 7 days\n\nthreadClient.addParticipants(newParticipants);\n\n// Remove participant\nCommunicationUserIdentifier userToRemove = new CommunicationUserIdentifier(\"<user-id>\");\nthreadClient.removeParticipant(userToRemove);\n```\n\n## Read Receipts\n\n```java\n// Send read receipt\nthreadClient.sendReadReceipt(messageId);\n\n// Get read receipts\nPagedIterable<ChatMessageReadReceipt> receipts = threadClient.listReadReceipts();\n\nfor (ChatMessageReadReceipt receipt : receipts) {\n    System.out.println(\"Message ID: \" + receipt.getChatMessageId());\n    System.out.println(\"Read by: \" + receipt.getSenderCommunicationIdentifier());\n    System.out.println(\"Read at: \" + receipt.getReadOn());\n}\n```\n\n## Typing Notifications\n\n```java\nimport com.azure.communication.chat.models.TypingNotificationOptions;\n\n// Send typing notification\nTypingNotificationOptions typingOptions = new TypingNotificationOptions()\n    .setSenderDisplayName(\"Alice\");\n\nthreadClient.sendTypingNotificationWithResponse(typingOptions, Context.NONE);\n\n// Simple typing notification\nthreadClient.sendTypingNotification();\n```\n\n## Thread Operations\n\n```java\n// Get thread properties\nChatThreadProperties properties = threadClient.getProperties();\nSystem.out.println(\"Topic: \" + properties.getTopic());\nSystem.out.println(\"Created: \" + properties.getCreatedOn());\n\n// Update topic\nthreadClient.updateTopic(\"New Project Discussion Topic\");\n\n// Delete thread\nchatClient.deleteChatThread(threadId);\n```\n\n## List Threads\n\n```java\n// List all chat threads for the user\nPagedIterable<ChatThreadItem> threads = chatClient.listChatThreads();\n\nfor (ChatThreadItem thread : threads) {\n    System.out.println(\"Thread ID: \" + thread.getId());\n    System.out.println(\"Topic: \" + thread.getTopic());\n    System.out.println(\"Last message: \" + thread.getLastMessageReceivedOn());\n}\n```\n\n## Pagination\n\n```java\nimport com.azure.core.http.rest.PagedResponse;\n\n// Paginate through messages\nint maxPageSize = 10;\nListChatMessagesOptions listOptions = new ListChatMessagesOptions()\n    .setMaxPageSize(maxPageSize);\n\nPagedIterable<ChatMessage> pagedMessages = threadClient.listMessages(listOptions);\n\npagedMessages.iterableByPage().forEach(page -> {\n    System.out.println(\"Page status code: \" + page.getStatusCode());\n    page.getElements().forEach(msg -> \n        System.out.println(\"Message: \" + msg.getContent().getMessage()));\n});\n```\n\n## Error Handling\n\n```java\nimport com.azure.core.exception.HttpResponseException;\n\ntry {\n    threadClient.sendMessage(messageOptions);\n} catch (HttpResponseException e) {\n    switch (e.getResponse().getStatusCode()) {\n        case 401:\n            System.out.println(\"Unauthorized - check token\");\n            break;\n        case 403:\n            System.out.println(\"Forbidden - user not in thread\");\n            break;\n        case 404:\n            System.out.println(\"Thread not found\");\n            break;\n        default:\n            System.out.println(\"Error: \" + e.getMessage());\n    }\n}\n```\n\n## Message Types\n\n| Type | Description |\n|------|-------------|\n| `TEXT` | Regular chat message |\n| `HTML` | HTML-formatted message |\n| `TOPIC_UPDATED` | System message - topic changed |\n| `PARTICIPANT_ADDED` | System message - participant joined |\n| `PARTICIPANT_REMOVED` | System message - participant left |\n\n## Environment Variables\n\n```bash\nAZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com\nAZURE_COMMUNICATION_USER_TOKEN=<user-access-token>\n```\n\n## Best Practices\n\n1. **Token Management** - User tokens expire; implement refresh logic with `CommunicationTokenRefreshOptions`\n2. **Pagination** - Use `listMessages(options)` with `maxPageSize` for large threads\n3. **Share History** - Set `shareHistoryTime` when adding participants to control message visibility\n4. **Message Types** - Filter system messages (`PARTICIPANT_ADDED`, etc.) from user messages\n5. **Read Receipts** - Send receipts only when messages are actually viewed by user\n\n## Trigger Phrases\n\n- \"chat application Java\", \"real-time messaging Java\"\n- \"chat thread\", \"chat participants\", \"chat messages\"\n- \"read receipts\", \"typing notifications\"\n- \"Azure Communication Services chat\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["azure","communication","chat","java","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents"],"capabilities":["skill","source-sickn33","skill-azure-communication-chat-java","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-communication-chat-java","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34928 github stars · SKILL.md body (9,596 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T18:50:29.417Z","embedding":null,"createdAt":"2026-04-18T21:32:13.239Z","updatedAt":"2026-04-24T18:50:29.417Z","lastSeenAt":"2026-04-24T18:50:29.417Z","tsv":"'1':599 '1.6.0':45 '10':488 '2':610 '3':620 '3pm':237 '4':632 '401':529 '403':536 '404':545 '5':644 '7':359,362 'access':62 'action':693 'actual':653 'ad':575,626,639 'add':342 'alic':161,216,417 'applic':11,29,660,687 'arraylist':152,347 'ask':731 'async':83 'azur':2,20,42,589,593,677 'azure-communication-chat':41 'azure-communication-chat-java':1 'bash':588 'best':597 'bob':170 'boundari':739 'break':534,543,550 'build':6,24 'buildasynccli':93 'buildclient':82 'case':528,535,544 'catch':522 'chang':573 'charli':355 'chat':4,10,22,28,44,100,117,136,456,561,659,667,669,671,680 'chatasynccli':85,86 'chatclient':57,74,75,98 'chatclient.createchatthread':187 'chatclient.deletechatthread':449 'chatclient.getchatthreadclient':200 'chatclient.listchatthreads':463 'chatclientbuild':77,88 'chatmessag':122,254,293 'chatmessagereadreceipt':129,389 'chatmessagetype.html':239 'chatmessagetype.text':218 'chatparticip':113,153,156,162,165,328,350 'chatthreadcli':105,198 'chatthreaditem':465 'chatthreadproperti':431 'check':273,532 'clarif':733 'class':96 'clear':706 'client':46,84,104,195 'code':505 'com.azure':40 'com.azure.communication.chat.chatclient':50 'com.azure.communication.chat.chatclientbuilder':52 'com.azure.communication.chat.chatthreadclient':54 'com.azure.communication.chat.models':140 'com.azure.communication.chat.models.typingnotificationoptions':408 'com.azure.communication.common.communicationtokencredential':56 'com.azure.communication.common.communicationuseridentifier':142 'com.azure.core.exception.httpresponseexception':518 'com.azure.core.http.rest.pagedresponse':482 'com.azure.core.util.paging.pagediterable':246 'communic':3,21,43,590,594,678 'communication.azure.com':66,592 'communicationtokencredenti':60,69,72 'communicationtokenrefreshopt':609 'communicationuseridentifi':159,168,331,333,353,368,371 'concept':95 'content':124,264,311 'context.none':420 'control':629 'creat':135,175,271,438 'create/delete':99 'createchatthreadopt':177,180 'createchatthreadresult':185 'creation':47 'credenti':70,80,81,91,92 'criteria':742 'day':363 'default':551 'defin':147 'delet':277,288,299,315,447 'describ':694,710 'descript':558 'discuss':182,445 'display':120,339 'e':524 'e.getmessage':554 'e.getresponse':526 'edit':275,282 'endpoint':65,78,79,89,90,591 'environ':586,722 'environment-specif':721 'error':514,553 'etc':640 'execut':689 'expert':727 'expir':604 'filter':635 'forbidden':538 'foreach':500,508 'format':566 'found':549 'get':102,193,242,290,382,428 'getid':192 'getmessag':266,513 'getstatuscod':527 'handl':515 'hello':213 'histori':622 'html':227,563,565 'html-format':564 'htmloption':230,241 'httpresponseexcept':523 'id':258,394,470 'implement':605 'import':49,51,53,55,139,141,143,145,234,245,407,481,517 'info':127 'input':736 'instal':38 'int':486 'java':5,23,48,138,204,244,301,321,376,406,427,453,480,516,661,666 'java.util.arraylist':144 'java.util.list':146 'join':579 'key':94 'larg':618 'last':361,476 'left':585 'limit':698 'list':149,247,322,344,451,454 'listchatmessagesopt':489,492 'listmessag':613 'listopt':490,498 'logic':607 'manag':14,32,319,601 'match':707 'maxpages':487,494,616 'meet':235 'messag':15,33,110,123,203,207,228,243,249,251,255,256,292,294,300,303,310,316,393,477,485,511,555,562,567,571,577,583,630,633,637,643,651,665,672 'message.getcontent':265 'message.getcreatedon':272 'message.getdeletedon':285,289 'message.geteditedon':279,283 'message.getid':259 'message.getsenderdisplayname':269 'message.gettype':262 'messageid':224,296,313,318,381 'messageopt':209,222,521 'minusday':358 'miss':744 'msg':509 'msg.getcontent':512 'name':121,340 'new':71,76,87,151,155,158,164,167,179,210,231,306,346,349,352,370,414,443,491 'newparticip':345,365 'newparticipants.add':348 'notif':405,411,423,676 'null':280,286 'offsetdatetime.now':357 'oper':106,197,426 'option':178,188,614 'output':716 'overview':697 'page':501,503 'page.getelements':507 'page.getstatuscode':506 'pagediter':250,324,385,461,495 'pagedmessag':496 'pagedmessages.iterablebypage':499 'pagin':479,483,611 'particip':16,34,111,134,148,150,184,320,323,325,329,330,343,367,574,578,580,584,627,638,670 'participant.getcommunicationidentifier':334 'participant.getdisplayname':341 'participant1':154,172 'participant2':163,174 'participants.add':171,173 'per':133 'permiss':737 'phrase':658 'practic':598 'project':181,444 'properti':430,432 'properties.getcreatedon':439 'properties.gettopic':436 'purpos':97 'read':18,36,130,374,378,383,397,401,645,673 'real':8,26,663 'real-tim':7,25,662 'receipt':19,37,112,131,375,379,384,386,390,391,646,648,674 'receipt.getchatmessageid':395 'receipt.getreadon':403 'receipt.getsendercommunicationidentifier':399 'refresh':606 'regular':560 'remov':366,581 'requir':58,735 'result':186 'result.getchatthread':191 'review':728 'safeti':738 'scope':709 'send':202,205,226,377,409,647 'sendchatmessageopt':208,211,229,232 'sendchatmessageresult':219 'sender':126,268 'sendresult':220 'sendresult.getid':225 'servic':679 'set':623 'setcommunicationidentifi':157,166,351 'setcont':212,233,308 'setdisplaynam':160,169,354 'setmaxpages':493 'setparticip':183 'setsenderdisplaynam':215,416 'setsharehistorytim':356 'settyp':217,238 'share':360,621 'sharehistorytim':624 'simpl':421 'skill':685,701 'skill-azure-communication-chat-java' 'source-sickn33' 'specif':291,723 'status':504 'stop':729 'string':64,67,189,223 'substitut':719 'success':741 'switch':525 'system':570,576,582,636 'system.out.println':257,260,263,267,270,281,287,335,338,392,396,400,434,437,468,472,475,502,510,530,537,546,552 'task':705 'team':214 'test':725 'text':206,559 'thread':13,31,101,103,109,118,137,176,194,425,429,448,452,457,462,466,467,469,542,547,619,668 'thread.getid':471 'thread.getlastmessagereceivedon':478 'thread.gettopic':474 'threadclient':199 'threadclient.addparticipants':364 'threadclient.deletemessage':317 'threadclient.getmessage':295 'threadclient.getproperties':433 'threadclient.listmessages':252,497 'threadclient.listparticipants':326 'threadclient.listreadreceipts':387 'threadclient.removeparticipant':372 'threadclient.sendmessage':221,240,520 'threadclient.sendreadreceipt':380 'threadclient.sendtypingnotification':424 'threadclient.sendtypingnotificationwithresponse':418 'threadclient.updatemessage':312 'threadclient.updatetopic':442 'threadid':190,201,450 'time':9,27,664 'timestamp':128 'token':63,533,596,600,603 'topic':435,441,446,473,568,572 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'track':132 'treat':714 'tri':519 'trigger':657 'type':125,261,404,410,422,556,557,634,675 'typingnotificationopt':412,415 'typingopt':413,419 'unauthor':531 'updat':297,302,309,440,569 'updatechatmessageopt':304,307 'updateopt':305,314 'use':612,683,699 'user':61,114,332,336,460,539,595,602,642,656 'user.getid':337 'useraccesstoken':68,73 'usertoremov':369,373 'valid':724 'variabl':587 'view':654 'visibl':631 'within':107 'workflow':691 'xml':39","prices":[{"id":"82340809-6b86-40b5-b4bd-78a6c4dbe331","listingId":"3d827498-fbf0-4c6e-89c1-98d6b510ca06","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:32:13.239Z"}],"sources":[{"listingId":"3d827498-fbf0-4c6e-89c1-98d6b510ca06","source":"github","sourceId":"sickn33/antigravity-awesome-skills/azure-communication-chat-java","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-communication-chat-java","isPrimary":false,"firstSeenAt":"2026-04-18T21:32:13.239Z","lastSeenAt":"2026-04-24T18:50:29.417Z"}],"details":{"listingId":"3d827498-fbf0-4c6e-89c1-98d6b510ca06","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"azure-communication-chat-java","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34928,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"17c997afaacca8b99237c1a07ccc6bbec44dd266","skill_md_path":"skills/azure-communication-chat-java/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/azure-communication-chat-java"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"azure-communication-chat-java","description":"Build real-time chat applications with thread management, messaging, participants, and read receipts."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/azure-communication-chat-java"},"updatedAt":"2026-04-24T18:50:29.417Z"}}