@tencent-rtc/mcp 1.6.8 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +58 -39
  3. package/knowledge/build-index.js +30 -6
  4. package/knowledge/chunker.js +82 -14
  5. package/knowledge/chunking-policy.js +100 -0
  6. package/knowledge/content-loader.js +3 -3
  7. package/knowledge/doc-url-resolver.js +43 -16
  8. package/knowledge/frontmatter-meta.js +167 -0
  9. package/knowledge/path-meta.js +28 -6
  10. package/knowledge/search/exact-lookup.js +120 -239
  11. package/knowledge/search/filter-pool.js +12 -29
  12. package/knowledge/search/framework-fallback.js +22 -0
  13. package/knowledge/search/intent-router.js +29 -0
  14. package/knowledge/search/l1-enrich.js +159 -0
  15. package/knowledge/search/query-normalizer.js +63 -3
  16. package/knowledge/search/search-core.js +410 -0
  17. package/knowledge/search/search-knowledge.js +421 -379
  18. package/knowledge/search/search-message.js +88 -0
  19. package/knowledge/search/search-pass.js +428 -0
  20. package/knowledge/search/search-types.js +1 -0
  21. package/knowledge/search/url-row-idf.js +120 -0
  22. package/knowledge/search/url-row-scorer.js +337 -0
  23. package/package.json +3 -1
  24. package/resource/_schema/feature-aliases.yaml +1 -1
  25. package/resource/index/manifest.json +1 -1
  26. package/resource/knowledge/callkit/best-practice/callkit-miniprogram/uniapp-shrink.md +60 -0
  27. package/resource/knowledge/callkit/best-practice/common/call-autoplay-blocked.md +77 -0
  28. package/resource/knowledge/callkit/best-practice/common/call-message-in-chat.md +78 -0
  29. package/resource/knowledge/callkit/best-practice/common/call-vs-calls.md +110 -0
  30. package/resource/knowledge/callkit/best-practice/common/callengine-call-flow.md +123 -0
  31. package/resource/knowledge/callkit/best-practice/common/callengine-log-level.md +67 -0
  32. package/resource/knowledge/callkit/best-practice/common/callkit-get-engine-instance.md +81 -0
  33. package/resource/knowledge/callkit/best-practice/common/callkit-get-roomid.md +78 -0
  34. package/resource/knowledge/callkit/best-practice/common/callkit-limitations.md +37 -0
  35. package/resource/knowledge/callkit/best-practice/common/callkit-user-register-and-kicked.md +98 -0
  36. package/resource/knowledge/chat/best-practice/common/avchatroom-message-loss-diagnosis.md +65 -0
  37. package/resource/knowledge/chat/best-practice/common/group-conversation-cleanup-on-system-notice.md +62 -0
  38. package/resource/knowledge/chat/best-practice/common/image-message-url-lifecycle.md +59 -0
  39. package/resource/knowledge/chat/best-practice/common/login-repeat-2025-diagnosis.md +61 -0
  40. package/resource/knowledge/chat/best-practice/common/message-read-report-and-receipt.md +64 -0
  41. package/resource/knowledge/chat/best-practice/common/message-receive-event.md +65 -0
  42. package/resource/knowledge/chat/best-practice/common/message-risk-error-and-render.md +65 -0
  43. package/resource/knowledge/chat/best-practice/common/message-unread-count.md +71 -0
  44. package/resource/knowledge/chat/best-practice/miniprogram/audio-message-send.md +113 -0
  45. package/resource/knowledge/chat/best-practice/miniprogram/login-timeout-2801-diagnosis.md +63 -0
  46. package/resource/knowledge/chat/best-practice/miniprogram/media-upload-fail-diagnosis.md +64 -0
  47. package/resource/knowledge/chat/best-practice/web/audio-message-send.md +118 -0
  48. package/resource/knowledge/chat/urls/product.md +17 -16
  49. package/resource/knowledge/chat/urls/restapi.md +3 -2
  50. package/resource/knowledge/chat/urls/sdk/android.md +6 -5
  51. package/resource/knowledge/chat/urls/sdk/flutter.md +6 -5
  52. package/resource/knowledge/chat/urls/sdk/ios.md +4 -3
  53. package/resource/knowledge/chat/urls/sdk/web.md +7 -6
  54. package/resource/knowledge/chat/urls/webhook.md +0 -5
  55. package/resource/knowledge/livekit/best-practice/android/voice-room-anchor-start.md +120 -0
  56. package/resource/knowledge/livekit/best-practice/common/admin-take-seat.md +73 -0
  57. package/resource/knowledge/livekit/best-practice/common/audience-leave-live.md +81 -0
  58. package/resource/knowledge/livekit/best-practice/common/voice-room-no-audio-troubleshoot.md +100 -0
  59. package/resource/knowledge/livekit/best-practice/common/voice-room-seat-list-change.md +65 -0
  60. package/resource/knowledge/livekit/best-practice/flutter/voice-room-anchor-start.md +122 -0
  61. package/resource/knowledge/livekit/best-practice/ios/voice-room-anchor-start.md +126 -0
  62. package/resource/knowledge/roomkit/best-practice/common/room-ghost-member.md +70 -0
  63. package/resource/knowledge/roomkit/best-practice/common/room-limit-and-multi.md +83 -0
  64. package/resource/knowledge/roomkit/best-practice/common/room-screen-share-preview.md +83 -0
  65. package/resource/knowledge/roomkit/best-practice/common/room-status-after-all-leave.md +69 -0
  66. package/resource/knowledge/roomkit/best-practice/vue/room-uikit-vs-atomicx.md +111 -0
  67. package/resource/knowledge/rtcengine/web/plugin/30-advanced-cross-room-link.md +2 -0
  68. package/resource/knowledge/rtcengine/web/plugin/39-advanced-video-decoder.md +2 -0
  69. package/server.js +28 -23
  70. package/streamable-http.js +19 -54
  71. package/tools/common/search_trtc_knowledge.js +24 -12
  72. package/tools/definitions/finalize_answer_def.js +2 -2
  73. package/tools/definitions/integration-boundary.js +2 -1
  74. package/tools/definitions/search_trtc_knowledge_def.js +5 -3
  75. package/utils/fetch-doc-content.js +198 -0
  76. package/utils/preflight-route.js +197 -0
  77. package/utils/report-cls-client.js +1 -1
  78. package/utils/report-es-client.js +1 -1
  79. package/cursor-setting.png +0 -0
  80. package/mcp-server-prompt.png +0 -0
  81. package/resource/knowledge/callkit/best-practice/web/callengine-invitation.md +0 -80
  82. package/resource/knowledge/callkit/best-practice/web/callengine-log-control.md +0 -24
  83. package/resource/knowledge/callkit/best-practice/web/callkit-call-vs-calls.md +0 -116
  84. package/resource/knowledge/callkit/preset/react/uikit-api-reference.md +0 -444
  85. package/resource/knowledge/callkit/preset/vue/uikit-api-reference.md +0 -464
  86. package/resource/knowledge/chat/best-practice/web/image-message-url-handling.md +0 -16
@@ -0,0 +1,126 @@
1
+ ---
2
+ title: "Voice Room Anchor Creates Room and Starts Streaming (iOS)(语聊房 / 房主 / 开播 / createLive)"
3
+ product: live
4
+ frameworks: [ios]
5
+ scope: platform_specific
6
+ tags: [voice room, anchor, start streaming, publish audio, createLive, openLocalMicrophone, muteMicrophone, unmuteMicrophone, LiveListStore, AudioSalon, keepOwnerOnSeat, seatMode, iOS, Swift, AtomicXCore]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # Voice Room Anchor Creates Room and Starts Streaming (iOS)
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - Voice room streaming flow: construct `LiveInfo` (with `liveID`, `seatTemplate`, `keepOwnerOnSeat`, `seatMode`), call `createLive` to create the room; on success, call `openLocalMicrophone` to capture and publish audio so other users in the room can hear the anchor.
15
+ - `liveID` is required; setting `keepOwnerOnSeat` to `true` makes the anchor automatically take a seat upon entering (taking a seat is a prerequisite for publishing audio — only seated users can publish audio streams in the room).
16
+ - `seatTemplate` should be set to `SeatLayoutTemplate.AudioSalon(seatCount: n)`, where n is the maximum seat count supported by the plan or a value less than it.
17
+ - `seatMode` sets the seat-taking mode (e.g., `.apply` for apply-to-take-seat).
18
+ - `muteMicrophone` pauses publishing local audio; `unmuteMicrophone` resumes publishing local audio.
19
+
20
+ ## 2. Field / API Reference
21
+
22
+ | Field / Capability | Purpose | Notes |
23
+ |---|---|---|
24
+ | `LiveInfo` | Room information | Contains `liveID`, `liveName`, `seatTemplate`, `keepOwnerOnSeat`, `seatMode`, etc. |
25
+ | `liveID` | Room ID | Required parameter for `createLive` |
26
+ | `liveName` | Room name | Display name of the room |
27
+ | `seatTemplate` | Seat layout template | Use `SeatLayoutTemplate.AudioSalon(seatCount: n)` for voice rooms, where n ≤ max seats in plan |
28
+ | `keepOwnerOnSeat` | Auto-seat the owner | Set to `true` so the anchor automatically takes a seat upon entering |
29
+ | `seatMode` | Seat-taking mode | e.g., `.apply` for apply-to-take-seat |
30
+ | `createLive(liveInfo)` | Create room (start streaming) | Pass `LiveInfo`, returns `Result` for async handling |
31
+ | `openLocalMicrophone` | Capture and publish audio | Opens local microphone and publishes audio stream to the room |
32
+ | `muteMicrophone` | Pause audio publishing | Pauses local audio stream while microphone remains open |
33
+ | `unmuteMicrophone` | Resume audio publishing | Resumes local audio stream while microphone remains open |
34
+
35
+ ## 3. Mechanism & Sequence
36
+
37
+ Construct `LiveInfo` (`liveID` required, `seatTemplate=AudioSalon(n)`, `keepOwnerOnSeat=true`, `seatMode` as needed) -> call `createLive` to create the room -> `case .success` callback fires, anchor is auto-seated -> call `openLocalMicrophone` to capture and publish audio -> other users in the room hear the anchor.
38
+
39
+ Taking a seat is a prerequisite for streaming: `keepOwnerOnSeat=true` ensures the anchor takes a seat before publishing audio. `muteMicrophone` / `unmuteMicrophone` are used to pause/resume during streaming.
40
+
41
+ ## 4. Standard Usage
42
+
43
+ 1. Construct `LiveInfo`: set `liveID`, `seatTemplate`, `keepOwnerOnSeat`, `seatMode`.
44
+ 2. Call `createLive(liveInfo)` and handle success/failure in `switch result`.
45
+ 3. In `case .success`, call `openLocalMicrophone` to capture and publish audio.
46
+ 4. Call `muteMicrophone` / `unmuteMicrophone` to pause/resume streaming as needed.
47
+
48
+ ```swift
49
+ import UIKit
50
+ import AtomicXCore
51
+
52
+ class YourAnchorViewController: UIViewController {
53
+ // ... 其他代码 ...
54
+ private let liveID = "test_voice_room_001"
55
+
56
+ override func viewDidLoad() {
57
+ super.viewDidLoad()
58
+ // ... 其他代码 ...
59
+
60
+ // 开始语聊
61
+ startLive()
62
+ }
63
+
64
+ private func startLive() {
65
+ // 1. 准备 LiveInfo 对象
66
+ var liveInfo = LiveInfo()
67
+
68
+ // 2. 设置房间 id
69
+ liveInfo.liveID = liveID
70
+ // 3. 设置房间名称
71
+ liveInfo.liveName = "test 语聊房"
72
+ // 4. 设置语聊房布局模板(传入 9 即代表有 9 个麦位)
73
+ liveInfo.seatTemplate = SeatLayoutTemplate.AudioSalon(seatCount: 9)
74
+
75
+ // 5. 设置主播开播后自动上麦
76
+ liveInfo.keepOwnerOnSeat = true
77
+
78
+ // 6. 设置上麦模式,例如申请上麦
79
+ liveInfo.seatMode = .apply
80
+
81
+ // 7. 调用 createLive 开始直播
82
+ liveListStore.createLive(liveInfo) { [weak self] result in
83
+ guard let self = self else { return }
84
+ switch result {
85
+ case .success(let liveInfo):
86
+ print("Response startLive onSuccess")
87
+ // 8. 房主创建成功后默认自动上麦,此时调用 openLocalMicrophone 采集并发布音频
88
+ liveSeatStore.openLocalMicrophone(completion: nil)
89
+ case .failure(let errorInfo):
90
+ print("Response startLive onError: \(errorInfo.message)")
91
+ }
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## 5. Expected Results
98
+
99
+ - `case .success` callback fires: room created successfully, anchor is auto-seated.
100
+ - After `openLocalMicrophone`: other users in the room can hear the anchor.
101
+ - After `muteMicrophone`: local audio publishing is paused; after `unmuteMicrophone`: publishing resumes.
102
+ - If `keepOwnerOnSeat` is not set to `true`: the anchor is not auto-seated and cannot publish audio.
103
+ - `case .failure(let errorInfo)` callback fires: streaming failed, `errorInfo.message` contains the error description.
104
+
105
+ ## 6. Common Pitfalls
106
+
107
+ - Pitfall 1: Calling `openLocalMicrophone` without calling `createLive` first (cannot publish audio without creating a room).
108
+ - Pitfall 2: Not setting `keepOwnerOnSeat` to `true`, so the anchor is not seated and audio publishing does not work.
109
+ - Pitfall 3: Not setting `seatTemplate` or setting `seatCount` beyond the plan's maximum seat count.
110
+ - Pitfall 4: Confusing `muteMicrophone` (pauses audio stream publishing) with closing the microphone (stops audio capture).
111
+ - Pitfall 5: Reusing `liveID` (it must be globally unique; otherwise creation fails).
112
+ - Pitfall 6: Forgetting `[weak self]` (to avoid retain cycles causing memory leaks); both `success` and `failure` branches of `switch result` must be handled.
113
+
114
+ ## 7. Problem Definition (retrieval hint)
115
+
116
+ An iOS voice room anchor needs to create a room and start audio streaming in the correct order, understanding the call timing and parameter meanings of `createLive`, `openLocalMicrophone`, `muteMicrophone`, and `unmuteMicrophone`.
117
+
118
+ ## 8. Alternative Queries (retrieval recall)
119
+
120
+ - How does an iOS voice room anchor start streaming?
121
+ - What is the call order of `createLive` and `openLocalMicrophone` on iOS?
122
+ - How does an iOS anchor take a seat and publish audio?
123
+ - What does the `keepOwnerOnSeat` parameter do?
124
+ - How to set the `AudioSalon` template for `seatTemplate`?
125
+ - What is the difference between `muteMicrophone` and `unmuteMicrophone` on iOS?
126
+ - How to publish audio after creating a voice room?
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: "Why Abnormally Exited Members Still Appear in TUIRoomKit Member List and How to Clean Up(TUIRoomKit / 异常退出 / 幽灵成员 / 心跳检测 / 离线检测)"
3
+ product: room
4
+ frameworks: [react, vue, web, android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [TUIRoomKit, abnormal exit, ghost member, heartbeat detection, offline detection, kick from room, kick_user_out, disconnect callback, member list, room cleanup]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # Why Abnormally Exited Members Still Appear in TUIRoomKit Member List and How to Clean Up
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - When a user exits abnormally (process killed, network disconnected, page closed without calling leave), the member still appears in the remote member list. This is the expected behavior of the **video conferencing SDK backend heartbeat offline detection**.
15
+ - Current rule: the backend removes an abnormally exited user from the room approximately **5–6 minutes** after heartbeat loss. Only then do remote participants receive the leave notification and update the member list.
16
+ - **The heartbeat interval cannot be set very short by default**: short heartbeat intervals increase the risk of false kicks during network jitter, disrupting normal meeting experience.
17
+ - If your business requires faster ghost member cleanup: Option 1 (submit a ticket to shorten heartbeat to ~2 minutes) or Option 2 (use IM disconnect callback + `kick_user_out` to kick immediately).
18
+
19
+ ## 2. Field / API Reference
20
+
21
+ | Field / Capability | Purpose | Notes |
22
+ |---|---|---|
23
+ | Heartbeat offline detection | Detects user online status | Backend checks whether user heartbeat is lost |
24
+ | Heartbeat loss | Signal of abnormal exit | Heartbeat stops when process is killed / network disconnected / page closed without leave |
25
+ | Ghost member | Abnormally exited user still displayed | Removed from room after ~5–6 minutes |
26
+ | `kick_user_out` | Kick a room member | Business backend calls this to immediately clean up |
27
+ | `disconnect` callback | Disconnection callback | IM server detects user offline |
28
+ | Heartbeat interval adjustment | Backend configuration | Can be shortened to ~2 minutes via support ticket |
29
+
30
+ ## 3. Mechanism & Sequence
31
+
32
+ User exits abnormally (process killed, network disconnected, page closed without leave) -> Backend detects heartbeat loss -> After ~5–6 minutes, removes user from room -> Remote participants receive leave notification and update member list.
33
+
34
+ The default heartbeat interval cannot be too short to avoid false kicks caused by network jitter. If the business requires faster cleanup:
35
+
36
+ - **Option 1**: Submit a support ticket to shorten the backend heartbeat detection interval to ~2 minutes.
37
+ - **Option 2**: Business backend listens for the IM `disconnect` callback to detect offline status, then calls `kick_user_out` to immediately remove the ghost member.
38
+
39
+ ## 4. Standard Usage
40
+
41
+ 1. **Option 1 (adjust heartbeat interval)**: Submit a support ticket to have the backend heartbeat detection interval shortened to ~2 minutes.
42
+ 2. **Option 2 (server-side proactive cleanup)**:
43
+ - Business backend listens for the IM server `disconnect` (disconnection) callback.
44
+ - Upon receiving the offline signal, calls `kick_user_out` to kick the room member.
45
+
46
+ ## 5. Expected Results
47
+
48
+ - Abnormally exited users are removed from the room after ~5–6 minutes, and remote member list updates accordingly.
49
+ - After adjusting heartbeat to ~2 minutes via support ticket, cleanup is faster.
50
+ - Option 2 using `disconnect` callback + `kick_user_out` immediately removes ghost members.
51
+ - Setting heartbeat too short increases the risk of false kicks during network jitter.
52
+
53
+ ## 6. Common Pitfalls
54
+
55
+ - Pitfall 1: Expecting abnormally exited users to disappear from the member list immediately (heartbeat detection takes ~5–6 minutes).
56
+ - Pitfall 2: Assuming the heartbeat interval can be set arbitrarily short (network jitter causes false kicks, disrupting normal meetings).
57
+ - Pitfall 3: Overlooking that the business side can proactively kick members (`disconnect` callback + `kick_user_out`).
58
+
59
+ ## 7. Problem Definition (retrieval hint)
60
+
61
+ Why an abnormally exited user still appears in the remote member list in TUIRoomKit, and how to clean up ghost members faster.
62
+
63
+ ## 8. Alternative Queries (retrieval recall)
64
+
65
+ - What to do when an abnormally exited user still shows in the member list?
66
+ - How to clean up ghost members in TUIRoomKit?
67
+ - How long until a disconnected user is removed from the room?
68
+ - Can the heartbeat detection interval be shortened?
69
+ - Abnormally exited user keeps showing in the list?
70
+ - How to kick an offline user?
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: "TUIRoomKit Concurrent Room Limits and Multi-Room Support(TUIRoomKit / 并发房间 / 房间上限 / 同时进多个房间 / 单房间人数)"
3
+ product: room
4
+ frameworks: [react, vue, web, android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [TUIRoomKit, concurrent rooms, room limit, joining multiple rooms, single room capacity, peak group count, TUIRoomTypeConference, useRoomState, multi-device login, mutual kick, conference, room management]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUIRoomKit Concurrent Room Limits and Multi-Room Support
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - The number of concurrent rooms has an upper limit, determined by the **TUIRoomKit (multi-party audio/video) plan version + IM capabilities**.
15
+ - **A single client / single SDK instance cannot be in multiple conference rooms simultaneously**: for conference-type rooms, the per-device concurrent room limit is 1. Exceeding this causes the earliest joined room to be exited.
16
+ - **The same userId on multiple devices joining the same room results in mutual kick by default** (later entry kicks earlier entry). To have multi-device access to the same meeting, configure "multi-device login" according to your plan, or assign different userIds to different devices.
17
+
18
+ ## 2. Field / API Reference
19
+
20
+ | Field / Capability | Purpose | Notes |
21
+ |---|---|---|
22
+ | `TUIRoomTypeConference` | Conference-type room | Per-device concurrent room limit is 1 |
23
+ | `useRoomState` | Room state (Atomicx no-UI path) | Singleton; a user can only be in one room at a time |
24
+ | Room count limit | Room/group resource peak | Billed by natural month peak, not unlimited room creation |
25
+ | Single room capacity | Max participants per meeting | Hard limit by plan (20/50/200/300) |
26
+ | Multi-device login | Same userId on multiple devices | Only supported in higher-tier plans |
27
+
28
+ ## 3. Mechanism & Sequence
29
+
30
+ ### Concurrent Room Limit
31
+
32
+ After activating a TUIRoomKit (multi-party audio/video) plan, the number of concurrent meetings is constrained by **room count limit + single room capacity**:
33
+
34
+ | Capability Dimension | Trial | Basic Interactive | Advanced Interactive | Ultra-Large Room Interactive |
35
+ |---|---|---|---|---|
36
+ | **Room count limit** (billing metric) | Follows IM version | 100,000/month | 100,000/month | 100,000/month |
37
+ | **Single room participant capacity** | 20 | 50 | 200 | 300 (submit ticket for expansion) |
38
+
39
+ - Single room capacity is the hard upper limit on "max participants per meeting."
40
+ - Room count limit (peak group count) is the IM-side group/room resource peak included in the plan (billed by natural month peak), not "unlimited rooms at any moment."
41
+ - The actual number of simultaneous meetings also depends on IM plan, TRTC resources, and business architecture. Ultra-large rooms have an expansion channel.
42
+ - Multi-device login to meetings / same-platform multi-device login requires a higher-tier plan.
43
+
44
+ ### Same User Joining Multiple Rooms
45
+
46
+ When a single client / single SDK instance calls `joinRoom` to enter a new room while already in a conference-type room, the earliest joined room is exited (per-device concurrent room limit is 1).
47
+
48
+ ## 4. Standard Usage
49
+
50
+ When evaluating concurrent room requirements, follow these steps:
51
+
52
+ 1. Confirm your TUIRoomKit plan version and check the room count limit and single room capacity in the [Features & Billing Documentation](https://cloud.tencent.com/document/product/269/104946).
53
+ 2. Evaluate whether the per-meeting participant count exceeds the plan limit; submit a ticket for ultra-large room expansion.
54
+ 3. When the business needs to host multiple meetings simultaneously, evaluate whether the room count limit (peak group count) is sufficient, combined with IM plan and TRTC resources.
55
+ 4. When the business needs the same user on multiple devices in the same meeting, confirm the plan supports multi-device login; otherwise assign different userIds to different devices.
56
+
57
+ ## 5. Expected Results
58
+
59
+ - Concurrent meeting count is constrained by plan room count limit and single room capacity.
60
+ - When a single SDK instance joins multiple conference rooms, exceeding 1 causes the earliest joined room to be exited.
61
+ - The same userId on multiple devices joining the same room results in mutual kick (later kicks earlier).
62
+ - Multi-device access to the same meeting requires plan support for multi-device login, or assigning different userIds to different devices.
63
+
64
+ ## 6. Common Pitfalls
65
+
66
+ - Pitfall 1: Assuming room count limit (peak group count) means "unlimited rooms at any time" (billed by natural month peak, not unlimited concurrency).
67
+ - Pitfall 2: Assuming a single SDK instance can be in multiple conference rooms simultaneously (per-device limit is 1).
68
+ - Pitfall 3: Assuming the same userId on multiple devices can join the same room simultaneously (mutual kick by default).
69
+ - Pitfall 4: Ignoring plan version differences (multi-device login only supported in higher-tier plans).
70
+
71
+ ## 7. Problem Definition (retrieval hint)
72
+
73
+ Whether TUIRoomKit has an upper limit on the number of concurrent meetings, and whether a single user can join multiple rooms simultaneously.
74
+
75
+ ## 8. Alternative Queries (retrieval recall)
76
+
77
+ - What is the TUIRoomKit concurrent room limit?
78
+ - How many meetings can run simultaneously?
79
+ - Can the same user join two rooms at the same time?
80
+ - What is the maximum number of participants per room?
81
+ - Does TUIRoomKit support multi-device login?
82
+ - Will the same userId on multiple devices cause mutual kick?
83
+ - How to expand the meeting room capacity?
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: "TUIRoomKit Screen Sharing Local Preview and Avoiding Infinite Mirroring(TUIRoomKit / 屏幕共享 / 本地预览 / 无限套娃)"
3
+ product: room
4
+ frameworks: [react, vue, web]
5
+ scope: platform_common
6
+ tags: [TUIRoomKit, screen sharing, local preview, startScreenSharing, startScreenShare, full-screen sharing, infinite mirroring, infinite recursion, window sharing, external monitor, useDeviceState, view parameter]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUIRoomKit Screen Sharing Local Preview and Avoiding Infinite Mirroring
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - The `view` parameter enables local display of the shared content: passing a valid `view` renders the shared screen in a local container (local preview); omitting it or passing `null` skips local preview rendering.
15
+ - Full-screen sharing with local preview causes "infinite mirroring/recursion": the local preview area is within the captured full screen/current page, so the preview image re-enters the capture, creating recursive mirroring.
16
+ - **Preferred solution: share a "window" instead of the full screen**, preventing the meeting page from being captured and causing recursion.
17
+ - **Note for sharing WPS**: typically you cannot capture the "slideshow window" independently (the slideshow window and editor window behave inconsistently in the capture list). In this case, have the user connect an **external monitor**: place the slideshow on the external screen, then share that monitor/corresponding window. The main meeting screen continues operating, and the preview is less likely to recurse.
18
+ - **Fallback solution**: when window sharing is not possible and no external monitor is available, make the local preview container as small as possible (shrink the `view` container) to significantly reduce the recursive mirroring impact; or do not pass `view` / pass `null` for local preview, using only a "sharing in progress" status indicator.
19
+
20
+ ## 2. Field / API Reference
21
+
22
+ | Field / Capability | Purpose | Notes |
23
+ |---|---|---|
24
+ | `view` | Local screen share preview container | Pass a valid DOM element or id to render local preview; pass `null` to skip |
25
+ | `startScreenSharing` | Screen sharing API | TRTC Web / Room screen sharing; `view` specifies local preview |
26
+ | `startScreenShare` | Underlying screen sharing | TRTC `startScreenShare`, consistent with Atomicx |
27
+ | `useDeviceState().startScreenShare` | Atomicx no-UI path | Screen sharing entry; local preview determined by preview view/container |
28
+
29
+ ## 3. Mechanism & Sequence
30
+
31
+ ### Local Preview
32
+
33
+ Call screen sharing API with a valid `view` -> local container renders the shared screen (local preview) -> omitting `view` or passing `null` skips local preview rendering.
34
+
35
+ ## 4. Standard Usage
36
+
37
+ ### Screen Sharing with Local Preview
38
+
39
+ ```javascript
40
+ // TRTC Web / Room screen sharing, view specifies local preview container (element or id)
41
+ startScreenShare({
42
+ view: 'local-preview-container', // 传入有效 view,本地渲染分享画面
43
+ // 传 null 则不渲染本地预览
44
+ });
45
+ ```
46
+
47
+ ### Avoiding Infinite Mirroring
48
+
49
+ ```javascript
50
+ // 方案 1:优先分享窗口而非整屏,从源头避免套娃
51
+ startScreenShare({ view: 'local-preview-container' }); // 选择窗口采集源
52
+
53
+ // 方案 2(兜底):无法分享窗口时,缩小本地预览容器或本地不传 view
54
+ startScreenShare({ view: null }); // 不渲染本地预览,仅用"正在共享"状态提示
55
+ ```
56
+
57
+ ## 5. Expected Results
58
+
59
+ - Passing a valid `view`: local container renders the shared screen, enabling local preview.
60
+ - Omitting / passing `null`: no local preview rendering; only remote participants see the shared screen.
61
+ - Full-screen sharing + local preview: may cause infinite mirroring; switch to window sharing or shrink the preview.
62
+ - Sharing WPS slideshow: use the external monitor approach to avoid mirroring.
63
+
64
+ ## 6. Common Pitfalls
65
+
66
+ - Pitfall 1: Assuming `view` is a remote rendering parameter (`view` specifies the local screen share preview).
67
+ - Pitfall 2: Giving up local preview entirely because full-screen sharing causes mirroring (switch to window sharing or shrink the preview instead).
68
+ - Pitfall 3: Assuming you can capture the WPS slideshow window independently (typically not possible; use an external monitor).
69
+ - Pitfall 4: Confusing `startScreenSharing` with `startScreenShare` (they are consistent at the underlying level; both use `view` for local preview).
70
+
71
+ ## 7. Problem Definition (retrieval hint)
72
+
73
+ Whether the `view` parameter in TUIRoomKit screen sharing enables local preview of the shared content, and how to avoid infinite mirroring/recursion when sharing the full screen with local preview enabled.
74
+
75
+ ## 8. Alternative Queries (retrieval recall)
76
+
77
+ - Can screen sharing show a local preview?
78
+ - What is the TUIRoomKit screen sharing startScreenShare view parameter?
79
+ - How to avoid infinite mirroring when sharing full screen?
80
+ - What to do about recursive mirroring in screen sharing?
81
+ - Is it better to share a window or the full screen?
82
+ - How to shrink the local preview window?
83
+ - How to hide local preview for screen sharing?
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: "TUIRoomKit Room Status and Billing After All Members Leave(TUIRoomKit / 所有人离开 / 房间销毁 / 回收房间 / 解散房间)"
3
+ product: room
4
+ frameworks: [react, vue, web, android, ios, flutter]
5
+ scope: platform_common
6
+ tags: [TUIRoomKit, all members leave, room destruction, room reclaim, dismiss room, billing, meeting end, room existence, room count]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # TUIRoomKit Room Status and Billing After All Members Leave
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - A room is **not** automatically destroyed immediately when "all members leave."
15
+ - After a meeting ends, the business side should **proactively call the dismiss room API** to end the meeting.
16
+ - If not manually dismissed: the backend attempts to reclaim the room **6 hours after** the meeting end time, provided the **member count is 0**.
17
+ - Billing is based on actual push/pull stream and call consumption. After all members leave and there is no media usage, audio/video duration charges generally stop; however, the room object still occupies room count quota until dismissed or reclaimed.
18
+
19
+ ## 2. Field / API Reference
20
+
21
+ | Field / Capability | Purpose | Notes |
22
+ |---|---|---|
23
+ | Dismiss room API | Proactively end a meeting | Business side calls after meeting ends |
24
+ | Backend reclaim | Automatic room cleanup | Attempted 6 hours after meeting end; condition: member count is 0 |
25
+ | Room member count | Room member statistics | Reclaim condition: member count is 0 |
26
+ | Audio/video duration billing | Call consumption billing | Billed by actual push/pull stream and call consumption |
27
+ | Room count occupation | Room object occupation | Still occupies room count quota until dismissed or reclaimed |
28
+
29
+ ## 3. Mechanism & Sequence
30
+
31
+ All members leave room -> Room is not destroyed immediately -> Business side proactively calls dismiss room API (recommended), or waits for backend automatic reclaim -> Backend attempts reclaim 6 hours after meeting end (condition: member count is 0) -> Room is reclaimed.
32
+
33
+ Billing dimensions:
34
+
35
+ - Audio/video duration is billed by actual push/pull stream and call consumption.
36
+ - After all members leave and there is no media usage, audio/video duration charges for that room generally stop.
37
+ - The room object still occupies room count quota until dismissed or reclaimed.
38
+
39
+ ## 4. Standard Usage
40
+
41
+ 1. After the meeting ends, the business side proactively calls the dismiss room API to end the meeting, avoiding lingering rooms.
42
+ 2. If manual dismissal is forgotten, the backend automatically reclaims the room after 6 hours (when member count is 0).
43
+ 3. When evaluating room count occupation, note that undismissed and unreclaimed room objects still consume quota.
44
+
45
+ ## 5. Expected Results
46
+
47
+ - After proactive dismissal, the room ends immediately.
48
+ - Without proactive dismissal, the backend reclaims the room 6 hours after meeting end when member count is 0.
49
+ - After all members leave and there is no media usage, audio/video duration charges stop.
50
+ - Undismissed and unreclaimed room objects still occupy room count quota.
51
+
52
+ ## 6. Common Pitfalls
53
+
54
+ - Pitfall 1: Assuming rooms are automatically destroyed after all members leave (requires proactive dismissal or waiting 6 hours for backend reclaim).
55
+ - Pitfall 2: Assuming undismissed rooms incur no cost (room objects still occupy room count quota, potentially affecting concurrent capacity).
56
+ - Pitfall 3: Neglecting proactive dismissal by the business side (recommended to call the dismiss API rather than relying on backend reclaim).
57
+
58
+ ## 7. Problem Definition (retrieval hint)
59
+
60
+ Whether a TUIRoomKit room still exists after all members leave, whether billing continues, and how to proactively dismiss a room.
61
+
62
+ ## 8. Alternative Queries (retrieval recall)
63
+
64
+ - Does the room auto-destroy after everyone leaves?
65
+ - Does an empty TUIRoomKit room still incur charges?
66
+ - How to dismiss a room after a meeting ends?
67
+ - How long does room reclaim take?
68
+ - What happens when room member count is 0?
69
+ - Does the room object still occupy room count quota?
@@ -0,0 +1,111 @@
1
+ ---
2
+ title: "Comparison of tuikit-atomicx-vue3/room vs roomkit-web-vue3(roomkit-web-vue3 vs tuikit-atomicx-vue3/room 的区别)"
3
+ product: room
4
+ frameworks: [vue, web]
5
+ scope: platform_specific
6
+ tags: [TUIRoomKit, Atomicx, UIKit, tuikit-atomicx-vue3, roomkit-web-vue3, useRoomState, conference, layer comparison, no-UI, pre-built UI, custom integration, dependency, vue3]
7
+ version_range: ">=2.0.0"
8
+ ---
9
+
10
+ # Comparison of tuikit-atomicx-vue3/room vs roomkit-web-vue3
11
+
12
+ ## 1. Key Takeaways
13
+
14
+ - `tuikit-atomicx-vue3/room` (Atomicx) is the **atomic capability layer**: the primary path for no-UI / highly customized integration, decomposing room, device, and member states into reactive State Hooks.
15
+ - `@tencentcloud/roomkit-web-vue3` (RoomKit / UIKit) is the **pre-built UI low-code layer**: an out-of-the-box meeting suite with page-level components.
16
+ - Dependency: **RoomKit (pre-built UI) is a productized wrapper built on top of Atomicx/Room capabilities**. From a business perspective, RoomKit reuses/interfaces with Atomicx capabilities rather than being two independent room protocols.
17
+ - API entry points: Atomicx uses `useRoomState()`, UIKit uses `conference`.
18
+
19
+ ## 2. Field / API Reference
20
+
21
+ | Field / Capability | Purpose | Notes |
22
+ |---|---|---|
23
+ | `useRoomState` | Atomicx room state entry | `createAndJoinRoom` / `joinRoom` / `leaveRoom` / `endRoom` / `currentRoom` |
24
+ | `useDeviceState` | Atomicx device state | Device toggles, screen sharing, etc. |
25
+ | `useRoomParticipantState` | Atomicx participant state | Member management, event subscriptions |
26
+ | `useLoginState` | Atomicx login state | Login capability, reusable within UIKit sessions |
27
+ | `conference` | UIKit meeting facade API | Recommended: `createAndJoinRoom` / `joinRoom` / `leaveRoom` / `endRoom` |
28
+ | `ConferenceMainView` | UIKit pre-built view | Complete meeting UI: login, join room, meeting controls, layout, seat management |
29
+
30
+ ## 3. Mechanism & Sequence
31
+
32
+ ### Layer Comparison
33
+
34
+ | Comparison | `tuikit-atomicx-vue3/room` (Atomicx) | `@tencentcloud/roomkit-web-vue3` (RoomKit / UIKit) |
35
+ |---|---|---|
36
+ | **Layer** | Atomicx (atomic capability layer): State Hooks + optional atomic UI components | UIKit / pre-built UI low-code layer: out-of-the-box meeting suite with page-level components |
37
+ | **Package positioning** | No-UI / highly customized integration path; decomposes room, device, and member into reactive State | Pre-built UI rapid integration path; provides complete meeting UI and `conference` facade API |
38
+ | **Core capabilities** | `useRoomState` / `useDeviceState` / `useRoomParticipantState` / `useLoginState`: create room, join meeting, device control, screen sharing, member management, event subscription; compose your own UI | `conference` + pre-built views (e.g. `ConferenceMainView`): login, join room, meeting controls, layout, seat management; supports selective component visibility / custom Widgets |
39
+ | **Use cases** | Embedding audio/video into your own business UI (telemedicine, OA, education dashboards, etc.) with 100% control over interaction and branding | Fastest path to launch a standard meeting/webinar with minimal UI coding, accepting the official meeting interaction |
40
+ | **Dependency** | Built on RoomEngine / TRTC / IM; an atomic integration approach | Pre-built UI reuses/interfaces with Atomicx capabilities (e.g. login uses `useLoginState`, in-meeting logic uses Room capabilities); RoomKit (pre-built UI) is a productized wrapper on top of Atomicx/Room |
41
+ | **API entry** | `useRoomState()`: `createAndJoinRoom` / `joinRoom` / `leaveRoom` / `endRoom`, `currentRoom`, event subscriptions, etc. | `conference`: recommended `createAndJoinRoom` / `joinRoom` / `leaveRoom` / `endRoom` |
42
+ | **UI form** | Optional pre-built atomic components + primarily self-composed custom modules | Primarily pre-built complete meeting UI, with limited customization via Widget / visibility configuration |
43
+
44
+ ## 4. Standard Usage
45
+
46
+ ### Atomicx Approach (no-UI, custom integration)
47
+
48
+ ```javascript
49
+ import { useRoomState } from 'tuikit-atomicx-vue3/room';
50
+
51
+ const { createAndJoinRoom } = useRoomState();
52
+
53
+ createAndJoinRoom({
54
+ roomId: 'YOUR_ROOM_ID', // 必填:建议由业务后台生成的唯一标识
55
+ options: {
56
+ roomName: '项目进度周会',
57
+ },
58
+ });
59
+ // 通过 useDeviceState / useRoomParticipantState 等获取响应式状态自拼 UI
60
+ ```
61
+
62
+ ### UIKit Approach (pre-built UI, rapid integration)
63
+
64
+ ```javascript
65
+ import { conference, ConferenceMainView, ConferenceMainViewH5, RoomEvent, genTestUserSig } from '@tencentcloud/roomkit-web-vue3';
66
+ const SDKAppID = 0; // 替换为您在开通服务阶段获取的 SDKAppID
67
+ const SDKSecretKey = ''; // 替换为您在开通服务阶段获取的 SDKSecretKey
68
+ const handleEnterRoom = async () => {
69
+ if (!SDKAppID || !SDKSecretKey) {
70
+ return;
71
+ }
72
+ try {
73
+ const { userSig } = genTestUserSig({ userId: 'test01', sdkAppId: SDKAppID, secretKey: SDKSecretKey });
74
+ await conference.login({ sdkAppId: SDKAppID, userId: 'test01', userSig });
75
+ await conference.setSelfInfo({ userName: 'test', avatarUrl: '' });
76
+ await conference.createAndJoinRoom({ roomId: '123456', options: { roomName: `test01 的会议` } });
77
+ inRoom.value = true;
78
+ } catch (error) {
79
+ console.error('进入会议失败:', error);
80
+ }
81
+ };
82
+ // 使用预制 ConferenceMainView 渲染完整会议 UI
83
+ ```
84
+
85
+ ## 5. Expected Results
86
+
87
+ - No-UI / highly customized needs: choose Atomicx, use `useRoomState()` + State Hooks to compose your own UI.
88
+ - Fastest path to a standard meeting: choose UIKit, use `conference` + `ConferenceMainView`.
89
+ - Dependency: UIKit reuses Atomicx capabilities; they are not two independent protocols.
90
+ - API entry: Atomicx uses `useRoomState()`, UIKit uses `conference`.
91
+
92
+ ## 6. Common Pitfalls
93
+
94
+ - Pitfall 1: Assuming Atomicx and UIKit are two independent room protocols (UIKit is built on top of Atomicx/Room capabilities).
95
+ - Pitfall 2: Assuming Atomicx includes a complete meeting UI (Atomicx provides State Hooks + optional atomic components; UI must be self-composed).
96
+ - Pitfall 3: Assuming UIKit cannot be customized (it supports selective component visibility / custom Widgets).
97
+ - Pitfall 4: Confusing the API entry points of the two approaches (Atomicx uses `useRoomState()`, UIKit uses `conference`).
98
+
99
+ ## 7. Problem Definition (retrieval hint)
100
+
101
+ Comparing the positioning differences between two TUIRoomKit Vue3 integration approaches: `tuikit-atomicx-vue3/room` (Atomicx Core SDK, no-UI, State Hooks self-composed) vs `@tencentcloud/roomkit-web-vue3` (RoomKit UIKit, pre-built UI, conference low-code) in terms of layer, capabilities, use cases, dependency, and API entry (useRoomState vs conference).
102
+
103
+ ## 8. Alternative Queries (retrieval recall)
104
+
105
+ - What is the difference between Atomicx and RoomKit?
106
+ - How to choose between `tuikit-atomicx-vue3/room` and `roomkit-web-vue3`?
107
+ - How to choose between TUIRoomKit no-UI and pre-built UI approaches?
108
+ - What is the difference between `useRoomState` and `conference`?
109
+ - Is RoomKit based on Atomicx?
110
+ - Which package for custom meeting room UI?
111
+ - Use Atomicx or UIKit for rapid meeting integration?
@@ -8,6 +8,8 @@ Cross-room connections support two modes:
8
8
  - **Room-level connection**: Connect with all anchors in the target room.
9
9
  - **User-level connection**: Connect with a specific anchor in the target room.
10
10
 
11
+ > **Note**: Room-level and user-level connections cannot be used simultaneously.
12
+
11
13
  ## How It Works
12
14
 
13
15
  - **Room-level connection**: Push the audio and video streams of all anchors in the current room to the target room, and push the audio and video streams of all anchors in the target room to the current room.
@@ -6,6 +6,8 @@ This document introduces how to use the TRTCVideoDecoder plugin to enable video
6
6
 
7
7
  - TRTC Web SDK version >= 5.9.0
8
8
 
9
+ - Browser version: Chrome 141+, Edge 141+, and other Chromium-based browsers 141+ (Safari and Firefox are not supported)
10
+
9
11
  ## Implementation Steps
10
12
 
11
13
  ### Deploy Static Resources
package/server.js CHANGED
@@ -3,40 +3,45 @@ import { registryTools } from './tools/index.js';
3
3
  const SERVER_INSTRUCTIONS = `
4
4
  You are using Tencent RTC MCP Server for SDK documentation retrieval.
5
5
 
6
- - search_trtc_knowledge: Primary tool for searching Tencent RTC / Chat(IM) / Push(TIMPush) product documentation.
6
+ - search_trtc_knowledge: Primary tool for searching Tencent RTC / Chat (IM) / Push (TIMPush) documentation.
7
7
  Covers: Chat UIKit, CallKit, LiveKit, RoomKit, TRTC Native SDK, WebRTC/rtcEngine, TIMPush.
8
- Use this tool FIRST for all technical documentation / FAQ / error code / integration guide lookups.
9
- Do NOT use web_search for questions that can be answered via this knowledge base.
8
+ Use this tool FIRST for technical docs / FAQ / error codes / integration guide lookups.
9
+ Do NOT use web_search for questions answerable by this knowledge base.
10
10
 
11
- **Product routing(调用 search_trtc_knowledge 前 MUST 推断 product 数组)**:
12
- - TIMPush / 推送 / 厂商通道 / FCM / APNs / 华为 / 小米 / OPPO / vivo → product=["push"](独立产品,禁止误归 chat)
13
- - 会话 / TUIKit / ChatKit / IM 组件 / 主题定制 → ["chat"]
14
- - CallKit / 通话 → ["call"];直播 / 语聊房 / LiveKit → ["live"];RoomKit / 会议 → ["room"]
15
- - TRTC Web SDK / rtcengine / WebRTC 插件 → ["rtcengine"]
16
- - TRTCCloud / Native SDK(客户端)→ ["native_trtc_sdk"]
17
- - 推送 + IM 同时涉及 → 可传 ["push","chat"]
18
- - 无法从 prompt 唯一判断 product → 先向用户确认,不要无 product 硬搜,也不要 web_search
11
+ **Product routing (MUST infer product[] before calling search_trtc_knowledge):**
12
+ - TIMPush / push / vendor channel / FCM / APNs / Huawei / Xiaomi / OPPO / vivo -> product=["push"] (independent product; do not misroute to chat)
13
+ - conversation / TUIKit / ChatKit / Chat component / theme customization -> ["chat"]
14
+ - CallKit / call -> ["call"]; live streaming / voice room / LiveKit -> ["live"]; RoomKit / conference -> ["room"]
15
+ - TRTC Web SDK / rtcengine / WebRTC plugin -> ["rtcengine"]
16
+ - TRTCCloud / Native SDK (client side) -> ["native_trtc_sdk"]
17
+ - If both push and Chat are involved -> ["push","chat"]
18
+ - If product cannot be uniquely inferred from prompt -> ask user to clarify first; do NOT hard-search with empty product; do NOT use web_search.
19
19
 
20
- **Frameworks**:返回 needs_framework 时 MUST 先 present_framework_choice;详见 search_trtc_knowledge 工具 description 决策表。
21
- **When in doubt**:仍优先调用 search_trtc_knowledge(带最佳猜测 product);status=empty 或 low_confidence 时再澄清或重搜。
20
+ **Frameworks:** If status=needs_framework, MUST call present_framework_choice first. See search_trtc_knowledge tool description decision table.
21
+ **When in doubt:** still prefer search_trtc_knowledge with best-guess product; if status is empty or low_confidence, then clarify or retry.
22
22
 
23
- **queryID 传递规则(硬规则,违反会导致 CLS 数据断裂)**:
24
- - 首次调用 search_trtc_knowledge:无需传 queryID(默认空串),响应 JSON 中会有 server 生成的 queryID 字段
25
- - 后续每一次 search_trtc_knowledge / finalize_answer / submit_feedback 调用:**MUST** 携带首次响应中的 queryID
26
- - 不传 queryID = 视为全新咨询(CLS 数据无法串联)
27
- - 多 sub-question 迭代搜索时,每次都要带相同的 queryID
23
+ **queryID passing rules (hard rule; violation breaks CLS trace continuity):**
24
+ - First search_trtc_knowledge call: no queryID required (defaults to empty); response JSON will include server-generated queryID.
25
+ - Every subsequent call to search_trtc_knowledge / finalize_answer / submit_feedback: MUST carry the first returned queryID.
26
+ - Missing queryID means a brand-new consultation (CLS data cannot be linked).
27
+ - For multi-sub-question iterative searches, always reuse the same queryID.
28
28
 
29
29
  Workflow:
30
30
  1. Call search_trtc_knowledge. Reuse the same queryID for all retries/searches in this consultation.
31
- 2. Draft the final answer from fragments. Include References from meta.references/doc_urls when available.
32
- 3. MUST call finalize_answer with the same prompt + queryID before replying.
33
- 4. Reply with: answer + finalize_answer follow-up text.
34
- 5. After finalize_answer follow-up, check the next user reply before any normal response. If it means Yes/已解决/thanks/OK, MUST call submit_feedback(resolved="1") before replying. If it means No/未解决/still not working, MUST call submit_feedback(resolved="0") before replying. Never say feedback was submitted unless submit_feedback was called.
31
+ 2. Draft the complete answer from fragments. Include References from meta.references/doc_urls when available.
32
+ 3. MUST call finalize_answer with the same prompt, answer, and queryID before replying.
33
+ 4. Reply with that answer + finalize_answer follow-up text.
34
+ 5. After finalize_answer follow-up, inspect the next user reply before any normal response. If it means Yes/resolved/thanks/OK, MUST call submit_feedback(resolved="1") before replying. If it means No/unresolved/still not working, MUST call submit_feedback(resolved="0") before replying. Never claim feedback was submitted unless submit_feedback was actually called.
35
+
36
+ User-visible output rules (MUST):
37
+ - Internal routing/tool decisions are NEVER user-facing text.
38
+ - Before calling any tool, do NOT output prefacing planning text such as “should call... / call ... first / let me search first / this is a consultation task / not codegen”.
39
+ - If a tool call is needed, call it directly and then provide user-visible results only.
35
40
  `.trim();
36
41
  export function createServer() {
37
42
  const server = new McpServer({
38
43
  name: "Tencent RTC MCP Server",
39
- version: "1.6.8",
44
+ version: "1.7.1",
40
45
  }, {
41
46
  instructions: SERVER_INSTRUCTIONS,
42
47
  });