@basicbit/vrchat-mcp 0.1.0

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 (230) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +266 -0
  4. package/assets/logo.svg +39 -0
  5. package/dist/bin/cli.js +4 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/package.json +109 -0
  8. package/dist/src/auth/cookieStore.js +136 -0
  9. package/dist/src/auth/cookieStore.js.map +1 -0
  10. package/dist/src/auth/index.js +398 -0
  11. package/dist/src/auth/index.js.map +1 -0
  12. package/dist/src/config/defaults.json +58 -0
  13. package/dist/src/config/index.js +405 -0
  14. package/dist/src/config/index.js.map +1 -0
  15. package/dist/src/core/client.js +262 -0
  16. package/dist/src/core/client.js.map +1 -0
  17. package/dist/src/core/generatedToolOverrides.js +104 -0
  18. package/dist/src/core/generatedToolOverrides.js.map +1 -0
  19. package/dist/src/core/generatedToolSkips.js +28 -0
  20. package/dist/src/core/generatedToolSkips.js.map +1 -0
  21. package/dist/src/core/operationSchemas.js +102 -0
  22. package/dist/src/core/operationSchemas.js.map +1 -0
  23. package/dist/src/core/readToolRegistry.js +93 -0
  24. package/dist/src/core/readToolRegistry.js.map +1 -0
  25. package/dist/src/core/readTools.js +197 -0
  26. package/dist/src/core/readTools.js.map +1 -0
  27. package/dist/src/core/spec.js +137 -0
  28. package/dist/src/core/spec.js.map +1 -0
  29. package/dist/src/core/writeToolRegistry.js +113 -0
  30. package/dist/src/core/writeToolRegistry.js.map +1 -0
  31. package/dist/src/generated/vrchat-schemas.js +3326 -0
  32. package/dist/src/generated/vrchat-schemas.js.map +1 -0
  33. package/dist/src/index.js +31 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/infra/logger.js +26 -0
  36. package/dist/src/infra/logger.js.map +1 -0
  37. package/dist/src/models/avatars.js +22 -0
  38. package/dist/src/models/avatars.js.map +1 -0
  39. package/dist/src/models/events.js +115 -0
  40. package/dist/src/models/events.js.map +1 -0
  41. package/dist/src/models/friends.js +148 -0
  42. package/dist/src/models/friends.js.map +1 -0
  43. package/dist/src/models/groups.js +228 -0
  44. package/dist/src/models/groups.js.map +1 -0
  45. package/dist/src/models/instances.js +56 -0
  46. package/dist/src/models/instances.js.map +1 -0
  47. package/dist/src/models/invites.js +34 -0
  48. package/dist/src/models/invites.js.map +1 -0
  49. package/dist/src/models/notifications.js +62 -0
  50. package/dist/src/models/notifications.js.map +1 -0
  51. package/dist/src/models/status.js +50 -0
  52. package/dist/src/models/status.js.map +1 -0
  53. package/dist/src/models/statusPage.js +84 -0
  54. package/dist/src/models/statusPage.js.map +1 -0
  55. package/dist/src/models/users.js +113 -0
  56. package/dist/src/models/users.js.map +1 -0
  57. package/dist/src/models/vrcx.js +144 -0
  58. package/dist/src/models/vrcx.js.map +1 -0
  59. package/dist/src/models/worlds.js +150 -0
  60. package/dist/src/models/worlds.js.map +1 -0
  61. package/dist/src/resources/friendsChanges.js +44 -0
  62. package/dist/src/resources/friendsChanges.js.map +1 -0
  63. package/dist/src/resources/friendsSnapshot.js +69 -0
  64. package/dist/src/resources/friendsSnapshot.js.map +1 -0
  65. package/dist/src/resources/index.js +9 -0
  66. package/dist/src/resources/index.js.map +1 -0
  67. package/dist/src/resources/subscriptions.js +39 -0
  68. package/dist/src/resources/subscriptions.js.map +1 -0
  69. package/dist/src/schemas/auth.js +3 -0
  70. package/dist/src/schemas/auth.js.map +1 -0
  71. package/dist/src/schemas/call.js +13 -0
  72. package/dist/src/schemas/call.js.map +1 -0
  73. package/dist/src/schemas/read.js +58 -0
  74. package/dist/src/schemas/read.js.map +1 -0
  75. package/dist/src/schemas/write.js +18 -0
  76. package/dist/src/schemas/write.js.map +1 -0
  77. package/dist/src/services/api/client.js +66 -0
  78. package/dist/src/services/api/client.js.map +1 -0
  79. package/dist/src/services/api/index.js +2 -0
  80. package/dist/src/services/api/index.js.map +1 -0
  81. package/dist/src/services/avatars/index.js +24 -0
  82. package/dist/src/services/avatars/index.js.map +1 -0
  83. package/dist/src/services/cache.js +158 -0
  84. package/dist/src/services/cache.js.map +1 -0
  85. package/dist/src/services/events/curated.js +229 -0
  86. package/dist/src/services/events/curated.js.map +1 -0
  87. package/dist/src/services/events/index.js +3 -0
  88. package/dist/src/services/events/index.js.map +1 -0
  89. package/dist/src/services/events/utils.js +75 -0
  90. package/dist/src/services/events/utils.js.map +1 -0
  91. package/dist/src/services/friends/changes.js +246 -0
  92. package/dist/src/services/friends/changes.js.map +1 -0
  93. package/dist/src/services/friends/curated.js +497 -0
  94. package/dist/src/services/friends/curated.js.map +1 -0
  95. package/dist/src/services/friends/fetch.js +69 -0
  96. package/dist/src/services/friends/fetch.js.map +1 -0
  97. package/dist/src/services/friends/index.js +5 -0
  98. package/dist/src/services/friends/index.js.map +1 -0
  99. package/dist/src/services/friends/match.js +98 -0
  100. package/dist/src/services/friends/match.js.map +1 -0
  101. package/dist/src/services/groups/allowlist.js +19 -0
  102. package/dist/src/services/groups/allowlist.js.map +1 -0
  103. package/dist/src/services/groups/curated.js +343 -0
  104. package/dist/src/services/groups/curated.js.map +1 -0
  105. package/dist/src/services/groups/index.js +3 -0
  106. package/dist/src/services/groups/index.js.map +1 -0
  107. package/dist/src/services/instances/curated.js +80 -0
  108. package/dist/src/services/instances/curated.js.map +1 -0
  109. package/dist/src/services/instances/index.js +3 -0
  110. package/dist/src/services/instances/index.js.map +1 -0
  111. package/dist/src/services/instances/read.js +14 -0
  112. package/dist/src/services/instances/read.js.map +1 -0
  113. package/dist/src/services/invites/curated.js +90 -0
  114. package/dist/src/services/invites/curated.js.map +1 -0
  115. package/dist/src/services/invites/index.js +2 -0
  116. package/dist/src/services/invites/index.js.map +1 -0
  117. package/dist/src/services/notifications/curated.js +54 -0
  118. package/dist/src/services/notifications/curated.js.map +1 -0
  119. package/dist/src/services/notifications/index.js +2 -0
  120. package/dist/src/services/notifications/index.js.map +1 -0
  121. package/dist/src/services/pipeline/events.js +40 -0
  122. package/dist/src/services/pipeline/events.js.map +1 -0
  123. package/dist/src/services/pipeline/handlers.js +21 -0
  124. package/dist/src/services/pipeline/handlers.js.map +1 -0
  125. package/dist/src/services/pipeline/index.js +4 -0
  126. package/dist/src/services/pipeline/index.js.map +1 -0
  127. package/dist/src/services/pipeline/manager.js +143 -0
  128. package/dist/src/services/pipeline/manager.js.map +1 -0
  129. package/dist/src/services/status/curated.js +53 -0
  130. package/dist/src/services/status/curated.js.map +1 -0
  131. package/dist/src/services/status/index.js +2 -0
  132. package/dist/src/services/status/index.js.map +1 -0
  133. package/dist/src/services/statusPage/curated.js +397 -0
  134. package/dist/src/services/statusPage/curated.js.map +1 -0
  135. package/dist/src/services/statusPage/index.js +2 -0
  136. package/dist/src/services/statusPage/index.js.map +1 -0
  137. package/dist/src/services/users/curated.js +124 -0
  138. package/dist/src/services/users/curated.js.map +1 -0
  139. package/dist/src/services/users/groups.js +54 -0
  140. package/dist/src/services/users/groups.js.map +1 -0
  141. package/dist/src/services/users/index.js +3 -0
  142. package/dist/src/services/users/index.js.map +1 -0
  143. package/dist/src/services/vrcx/db.js +13 -0
  144. package/dist/src/services/vrcx/db.js.map +1 -0
  145. package/dist/src/services/vrcx/gamelog.js +125 -0
  146. package/dist/src/services/vrcx/gamelog.js.map +1 -0
  147. package/dist/src/services/vrcx/index.js +5 -0
  148. package/dist/src/services/vrcx/index.js.map +1 -0
  149. package/dist/src/services/vrcx/memos.js +51 -0
  150. package/dist/src/services/vrcx/memos.js.map +1 -0
  151. package/dist/src/services/vrcx/paths.js +133 -0
  152. package/dist/src/services/vrcx/paths.js.map +1 -0
  153. package/dist/src/services/vrcx/relationships.js +138 -0
  154. package/dist/src/services/vrcx/relationships.js.map +1 -0
  155. package/dist/src/services/vrcx/shared.js +173 -0
  156. package/dist/src/services/vrcx/shared.js.map +1 -0
  157. package/dist/src/services/vrcx/status.js +54 -0
  158. package/dist/src/services/vrcx/status.js.map +1 -0
  159. package/dist/src/services/worlds/index.js +256 -0
  160. package/dist/src/services/worlds/index.js.map +1 -0
  161. package/dist/src/tools/auth.js +44 -0
  162. package/dist/src/tools/auth.js.map +1 -0
  163. package/dist/src/tools/cache.js +61 -0
  164. package/dist/src/tools/cache.js.map +1 -0
  165. package/dist/src/tools/curated/avatars.js +57 -0
  166. package/dist/src/tools/curated/avatars.js.map +1 -0
  167. package/dist/src/tools/curated/events.js +212 -0
  168. package/dist/src/tools/curated/events.js.map +1 -0
  169. package/dist/src/tools/curated/friends.js +168 -0
  170. package/dist/src/tools/curated/friends.js.map +1 -0
  171. package/dist/src/tools/curated/groups.js +368 -0
  172. package/dist/src/tools/curated/groups.js.map +1 -0
  173. package/dist/src/tools/curated/instances.js +35 -0
  174. package/dist/src/tools/curated/instances.js.map +1 -0
  175. package/dist/src/tools/curated/invites.js +78 -0
  176. package/dist/src/tools/curated/invites.js.map +1 -0
  177. package/dist/src/tools/curated/notifications.js +35 -0
  178. package/dist/src/tools/curated/notifications.js.map +1 -0
  179. package/dist/src/tools/curated/status.js +44 -0
  180. package/dist/src/tools/curated/status.js.map +1 -0
  181. package/dist/src/tools/curated/statusPage.js +27 -0
  182. package/dist/src/tools/curated/statusPage.js.map +1 -0
  183. package/dist/src/tools/curated/users.js +201 -0
  184. package/dist/src/tools/curated/users.js.map +1 -0
  185. package/dist/src/tools/curated/vrcx/gamelog.js +80 -0
  186. package/dist/src/tools/curated/vrcx/gamelog.js.map +1 -0
  187. package/dist/src/tools/curated/vrcx/index.js +11 -0
  188. package/dist/src/tools/curated/vrcx/index.js.map +1 -0
  189. package/dist/src/tools/curated/vrcx/memos.js +105 -0
  190. package/dist/src/tools/curated/vrcx/memos.js.map +1 -0
  191. package/dist/src/tools/curated/vrcx/relationships.js +86 -0
  192. package/dist/src/tools/curated/vrcx/relationships.js.map +1 -0
  193. package/dist/src/tools/curated/vrcx/status.js +43 -0
  194. package/dist/src/tools/curated/vrcx/status.js.map +1 -0
  195. package/dist/src/tools/curated/worlds.js +162 -0
  196. package/dist/src/tools/curated/worlds.js.map +1 -0
  197. package/dist/src/tools/generated.js +19 -0
  198. package/dist/src/tools/generated.js.map +1 -0
  199. package/dist/src/tools/raw.js +49 -0
  200. package/dist/src/tools/raw.js.map +1 -0
  201. package/dist/src/tools/read/common.js +58 -0
  202. package/dist/src/tools/read/common.js.map +1 -0
  203. package/dist/src/tools/read/system.js +19 -0
  204. package/dist/src/tools/read/system.js.map +1 -0
  205. package/dist/src/tools/registerAllTools.js +41 -0
  206. package/dist/src/tools/registerAllTools.js.map +1 -0
  207. package/dist/src/tools/write/common.js +10 -0
  208. package/dist/src/tools/write/common.js.map +1 -0
  209. package/dist/src/utils/json.js +53 -0
  210. package/dist/src/utils/json.js.map +1 -0
  211. package/dist/src/utils/schema.js +14 -0
  212. package/dist/src/utils/schema.js.map +1 -0
  213. package/dist/src/utils/stableStringify.js +36 -0
  214. package/dist/src/utils/stableStringify.js.map +1 -0
  215. package/dist/src/utils/strings.js +7 -0
  216. package/dist/src/utils/strings.js.map +1 -0
  217. package/dist/src/utils/toolAnnotations.js +17 -0
  218. package/dist/src/utils/toolAnnotations.js.map +1 -0
  219. package/dist/src/utils/toolNames.js +13 -0
  220. package/dist/src/utils/toolNames.js.map +1 -0
  221. package/dist/src/utils/toolResponses.js +12 -0
  222. package/dist/src/utils/toolResponses.js.map +1 -0
  223. package/docs/architecture.md +46 -0
  224. package/docs/curated-tools.md +132 -0
  225. package/docs/design-notes.md +48 -0
  226. package/docs/evals.md +129 -0
  227. package/docs/tools-guide.md +27 -0
  228. package/docs/tools.md +13849 -0
  229. package/docs/vrcx.md +69 -0
  230. package/package.json +109 -0
@@ -0,0 +1,84 @@
1
+ import { z } from 'zod';
2
+ export const StatusPageOverviewInputSchema = z.object({
3
+ recentHours: z.number().int().min(1).max(720).optional(),
4
+ maxItems: z.number().int().min(1).max(20).optional(),
5
+ includeGraphs: z.boolean().optional(),
6
+ });
7
+ export const StatusPageInfoSchema = z.object({
8
+ id: z.string().optional(),
9
+ name: z.string().optional(),
10
+ url: z.string().optional(),
11
+ timeZone: z.string().optional(),
12
+ updatedAt: z.string().optional(),
13
+ });
14
+ export const StatusPageOverallStatusSchema = z.object({
15
+ up: z.boolean(),
16
+ indicator: z.string().optional(),
17
+ description: z.string().optional(),
18
+ });
19
+ export const StatusPageComponentSchema = z.object({
20
+ id: z.string(),
21
+ name: z.string(),
22
+ status: z.string(),
23
+ });
24
+ export const StatusPageMetricSchema = z.object({
25
+ key: z.string(),
26
+ title: z.string(),
27
+ unit: z.string(),
28
+ current: z.number().nullable(),
29
+ min: z.number().nullable(),
30
+ max: z.number().nullable(),
31
+ samples: z.number().int().min(0),
32
+ windowStart: z.string().optional(),
33
+ windowEnd: z.string().optional(),
34
+ overlayCurrent: z.number().nullable().optional(),
35
+ overlayMin: z.number().nullable().optional(),
36
+ overlayMax: z.number().nullable().optional(),
37
+ });
38
+ export const StatusPageIncidentSchema = z.object({
39
+ id: z.string(),
40
+ name: z.string(),
41
+ status: z.string().optional(),
42
+ impact: z.string().optional(),
43
+ shortlink: z.string().optional(),
44
+ startedAt: z.string().optional(),
45
+ updatedAt: z.string().optional(),
46
+ resolvedAt: z.string().optional(),
47
+ });
48
+ export const StatusPageMaintenanceSchema = z.object({
49
+ id: z.string(),
50
+ name: z.string(),
51
+ status: z.string().optional(),
52
+ impact: z.string().optional(),
53
+ shortlink: z.string().optional(),
54
+ scheduledFor: z.string().optional(),
55
+ scheduledUntil: z.string().optional(),
56
+ updatedAt: z.string().optional(),
57
+ });
58
+ export const StatusPageOverviewOutputSchema = z.object({
59
+ checkedAt: z.string(),
60
+ recentHours: z.number().int().min(1),
61
+ maxItems: z.number().int().min(1),
62
+ page: StatusPageInfoSchema,
63
+ status: StatusPageOverallStatusSchema,
64
+ components: z.object({
65
+ total: z.number().int().min(0),
66
+ nonOperational: z.number().int().min(0),
67
+ nonOperationalItems: z.array(StatusPageComponentSchema),
68
+ }),
69
+ graphs: z.array(StatusPageMetricSchema),
70
+ incidents: z.object({
71
+ unresolvedCount: z.number().int().min(0),
72
+ unresolved: z.array(StatusPageIncidentSchema),
73
+ recentCount: z.number().int().min(0),
74
+ recent: z.array(StatusPageIncidentSchema),
75
+ }),
76
+ maintenances: z.object({
77
+ activeCount: z.number().int().min(0),
78
+ active: z.array(StatusPageMaintenanceSchema),
79
+ upcomingCount: z.number().int().min(0),
80
+ upcoming: z.array(StatusPageMaintenanceSchema),
81
+ }),
82
+ notes: z.array(z.string()),
83
+ });
84
+ //# sourceMappingURL=statusPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusPage.js","sourceRoot":"","sources":["../../../src/models/statusPage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import { z } from 'zod';
2
+ import { schemas } from '../generated/vrchat-schemas.js';
3
+ import { GroupPageSchema, GroupSummarySchema } from './groups.js';
4
+ export const UserShapeSchema = z.object({
5
+ fields: z.array(z.string()).optional(),
6
+ compact: z.boolean().optional(),
7
+ maxArrayLength: z.number().int().positive().optional(),
8
+ });
9
+ export const SelfProfileViewSchema = z.enum(['summary', 'presence', 'profile']);
10
+ export const CurrentUserProfileInputSchema = UserShapeSchema.extend({
11
+ view: SelfProfileViewSchema.optional(),
12
+ includeGroups: z.boolean().optional(),
13
+ groupPageSize: z.number().int().min(1).max(100).optional(),
14
+ groupMaxPages: z.number().int().min(1).max(50).optional(),
15
+ groupOffset: z.number().int().min(0).optional(),
16
+ });
17
+ export const DEFAULT_SELF_FIELDS = [
18
+ 'id',
19
+ 'displayName',
20
+ 'username',
21
+ 'status',
22
+ 'statusDescription',
23
+ 'statusEmoji',
24
+ 'location',
25
+ 'last_login',
26
+ 'last_platform',
27
+ 'userIcon',
28
+ 'profilePicOverride',
29
+ 'currentAvatarImageUrl',
30
+ 'currentAvatarThumbnailImageUrl',
31
+ 'bio',
32
+ 'bioLinks',
33
+ 'tags',
34
+ 'developerType',
35
+ 'state',
36
+ 'twoFactorAuthEnabled',
37
+ ];
38
+ export const SUMMARY_SELF_FIELDS = [
39
+ 'id',
40
+ 'displayName',
41
+ 'username',
42
+ 'status',
43
+ 'statusDescription',
44
+ 'location',
45
+ 'last_login',
46
+ 'last_platform',
47
+ 'userIcon',
48
+ 'currentAvatarThumbnailImageUrl',
49
+ ];
50
+ export const PRESENCE_SELF_FIELDS = [
51
+ 'id',
52
+ 'displayName',
53
+ 'status',
54
+ 'statusDescription',
55
+ 'statusEmoji',
56
+ 'location',
57
+ 'last_login',
58
+ 'last_platform',
59
+ ];
60
+ export const UserGroupsOutputSchema = z.object({
61
+ userId: schemas.UserID,
62
+ pageSize: z.number().int().min(1),
63
+ maxPages: z.number().int().min(1),
64
+ totalGroups: z.number().int().min(0),
65
+ truncated: z.boolean(),
66
+ stale: z.boolean(),
67
+ page: GroupPageSchema,
68
+ groups: z.array(GroupSummarySchema),
69
+ });
70
+ export const UserProfileInputSchema = UserShapeSchema.extend({
71
+ userId: schemas.UserID.optional(),
72
+ username: z.string().optional(),
73
+ includeGroups: z.boolean().optional(),
74
+ groupPageSize: z.number().int().min(1).max(100).optional(),
75
+ groupMaxPages: z.number().int().min(1).max(50).optional(),
76
+ groupOffset: z.number().int().min(0).optional(),
77
+ });
78
+ export const VrcxMemoSchema = z.object({
79
+ editedAt: z.string().nullable(),
80
+ memo: z.string().nullable(),
81
+ });
82
+ export const UserProfileOutputSchema = z.object({
83
+ userId: schemas.UserID,
84
+ user: schemas.User.partial(),
85
+ groups: UserGroupsOutputSchema.optional(),
86
+ vrcxMemo: VrcxMemoSchema.optional(),
87
+ });
88
+ export const ProfileUpdateInputSchema = schemas.UpdateUserRequest.pick({
89
+ bio: true,
90
+ bioLinks: true,
91
+ pronouns: true,
92
+ userIcon: true,
93
+ isBoopingEnabled: true,
94
+ contentFilters: true,
95
+ }).strict();
96
+ export const PROFILE_UPDATE_FIELDS = [
97
+ ...DEFAULT_SELF_FIELDS,
98
+ 'pronouns',
99
+ 'isBoopingEnabled',
100
+ 'contentFilters',
101
+ ];
102
+ export const ProfileUpdateOutputSchema = z.object({
103
+ userId: schemas.UserID,
104
+ user: schemas.CurrentUser.partial(),
105
+ });
106
+ export const UserGroupsInputSchema = z.object({
107
+ userId: schemas.UserID.optional(),
108
+ username: z.string().optional(),
109
+ pageSize: z.number().int().min(1).max(100).optional(),
110
+ maxPages: z.number().int().min(1).max(50).optional(),
111
+ offset: z.number().int().min(0).optional(),
112
+ });
113
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/models/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { z } from 'zod';
2
+ import { schemas } from '../generated/vrchat-schemas.js';
3
+ export const VrcxPathSourceSchema = z.enum(['config', 'vrcx_json', 'default', 'unknown']);
4
+ export const VrcxPathInfoSchema = z.object({
5
+ path: z.string().nullable(),
6
+ exists: z.boolean(),
7
+ source: VrcxPathSourceSchema,
8
+ });
9
+ export const VrcxStatusInputSchema = z.object({});
10
+ export const VrcxStatusOutputSchema = z.object({
11
+ enabled: z.boolean(),
12
+ available: z.boolean(),
13
+ db: VrcxPathInfoSchema,
14
+ worldDb: VrcxPathInfoSchema,
15
+ vrcxJson: z.object({
16
+ path: z.string().nullable(),
17
+ exists: z.boolean(),
18
+ }),
19
+ activeUserId: schemas.UserID.nullable(),
20
+ userPrefix: z.string().nullable(),
21
+ databaseVersion: z.number().int().nullable(),
22
+ warnings: z.array(z.string()).optional(),
23
+ });
24
+ export const VrcxUserMemoInputSchema = z.object({
25
+ userId: schemas.UserID,
26
+ });
27
+ export const VrcxUserMemoOutputSchema = z.object({
28
+ userId: schemas.UserID,
29
+ editedAt: z.string().nullable(),
30
+ memo: z.string().nullable(),
31
+ });
32
+ export const VrcxWorldMemoInputSchema = z.object({
33
+ worldId: schemas.WorldID,
34
+ });
35
+ export const VrcxWorldMemoOutputSchema = z.object({
36
+ worldId: schemas.WorldID,
37
+ editedAt: z.string().nullable(),
38
+ memo: z.string().nullable(),
39
+ });
40
+ export const VrcxAvatarMemoInputSchema = z.object({
41
+ avatarId: schemas.AvatarID,
42
+ });
43
+ export const VrcxAvatarMemoOutputSchema = z.object({
44
+ avatarId: schemas.AvatarID,
45
+ editedAt: z.string().nullable(),
46
+ memo: z.string().nullable(),
47
+ });
48
+ export const VrcxRecentWorldVisitsInputSchema = z.object({
49
+ daysBack: z.number().int().min(1).max(365).optional(),
50
+ limit: z.number().int().min(1).max(1000).optional(),
51
+ });
52
+ export const VrcxWorldVisitSchema = z.object({
53
+ rowId: z.number().int(),
54
+ createdAt: z.string(),
55
+ location: z.string(),
56
+ worldId: schemas.WorldID.optional(),
57
+ worldName: z.string().optional(),
58
+ groupName: z.string().nullable().optional(),
59
+ groupId: schemas.GroupID.optional(),
60
+ accessType: z.string().optional(),
61
+ region: z.string().optional(),
62
+ timeMs: z.number().int().min(0).optional(),
63
+ });
64
+ export const VrcxRecentWorldVisitsOutputSchema = z.object({
65
+ from: z.string(),
66
+ limit: z.number().int().min(1),
67
+ total: z.number().int().min(0),
68
+ truncated: z.boolean(),
69
+ visits: z.array(VrcxWorldVisitSchema),
70
+ });
71
+ export const VrcxRecentInstanceSessionsInputSchema = z.object({
72
+ daysBack: z.number().int().min(1).max(365).optional(),
73
+ limit: z.number().int().min(1).max(1000).optional(),
74
+ });
75
+ export const VrcxInstanceSessionSchema = z.object({
76
+ rowId: z.number().int(),
77
+ location: z.string(),
78
+ joinTime: z.string().nullable(),
79
+ leaveTime: z.string(),
80
+ durationMs: z.number().int().min(0),
81
+ worldId: schemas.WorldID.optional(),
82
+ worldName: z.string().optional(),
83
+ groupName: z.string().nullable().optional(),
84
+ groupId: schemas.GroupID.optional(),
85
+ accessType: z.string().optional(),
86
+ region: z.string().optional(),
87
+ });
88
+ export const VrcxRecentInstanceSessionsOutputSchema = z.object({
89
+ from: z.string(),
90
+ limit: z.number().int().min(1),
91
+ total: z.number().int().min(0),
92
+ truncated: z.boolean(),
93
+ activeUserId: schemas.UserID.optional(),
94
+ sessions: z.array(VrcxInstanceSessionSchema),
95
+ });
96
+ export const VrcxUserRelationshipSummaryInputSchema = z.object({
97
+ userId: schemas.UserID.optional(),
98
+ displayName: z.string().min(1).optional(),
99
+ });
100
+ export const VrcxUserRelationshipSummaryOutputSchema = z.object({
101
+ query: z.object({
102
+ userId: schemas.UserID.optional(),
103
+ displayName: z.string().optional(),
104
+ }),
105
+ resolvedBy: z.enum(['userId', 'displayName', 'none']),
106
+ resolvedUserId: schemas.UserID.nullable(),
107
+ displayName: z.string().nullable(),
108
+ lastSeen: z.string().nullable(),
109
+ joinCount: z.number().int().min(0),
110
+ timeSpentMs: z.number().int().min(0),
111
+ timeSpentHours: z.number().min(0),
112
+ hasData: z.boolean(),
113
+ });
114
+ export const VrcxUserRelationshipSessionsInputSchema = z.object({
115
+ userId: schemas.UserID.optional(),
116
+ displayName: z.string().min(1).optional(),
117
+ limit: z.number().int().min(1).max(500).optional(),
118
+ });
119
+ export const VrcxUserRelationshipSessionsOutputSchema = z.object({
120
+ query: z.object({
121
+ userId: schemas.UserID.optional(),
122
+ displayName: z.string().optional(),
123
+ }),
124
+ resolvedBy: z.enum(['userId', 'displayName', 'none']),
125
+ resolvedUserId: schemas.UserID.nullable(),
126
+ total: z.number().int().min(0),
127
+ limit: z.number().int().min(1),
128
+ truncated: z.boolean(),
129
+ sessions: z.array(z.object({
130
+ rowId: z.number().int(),
131
+ location: z.string(),
132
+ joinTime: z.string().nullable(),
133
+ leaveTime: z.string(),
134
+ durationMs: z.number().int().min(0),
135
+ worldId: schemas.WorldID.optional(),
136
+ worldName: z.string().optional(),
137
+ groupName: z.string().nullable().optional(),
138
+ groupId: schemas.GroupID.optional(),
139
+ accessType: z.string().optional(),
140
+ region: z.string().optional(),
141
+ displayName: z.string().optional(),
142
+ })),
143
+ });
144
+ //# sourceMappingURL=vrcx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vrcx.js","sourceRoot":"","sources":["../../../src/models/vrcx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { z } from 'zod';
2
+ import { schemas } from '../generated/vrchat-schemas.js';
3
+ export const WorldShapeSchema = z.object({
4
+ fields: z.array(z.string()).optional(),
5
+ compact: z.boolean().optional(),
6
+ maxArrayLength: z.number().int().positive().optional(),
7
+ });
8
+ export const WorldSummarySchema = z.object({
9
+ worldId: schemas.WorldID,
10
+ name: z.string(),
11
+ authorId: schemas.UserID.optional(),
12
+ authorName: z.string().optional(),
13
+ capacity: z.number().int().optional(),
14
+ visits: z.number().int().optional(),
15
+ favorites: z.number().int().optional(),
16
+ heat: z.number().int().optional(),
17
+ popularity: z.number().int().optional(),
18
+ releaseStatus: z.string().optional(),
19
+ updatedAt: z.string().optional(),
20
+ tags: z.array(z.string()).optional(),
21
+ favoriteGroup: schemas.FavoriteGroupID.optional(),
22
+ favoriteId: schemas.FavoriteID.optional(),
23
+ });
24
+ export const WorldInstancesSummarySchema = z.object({
25
+ totalInstances: z.number().int().min(0),
26
+ totalOccupants: z.number().int().min(0),
27
+ countsByAccess: z.record(z.string(), z.number().int().min(0)),
28
+ countsByRegion: z.record(z.string(), z.number().int().min(0)),
29
+ });
30
+ export const WorldPageSchema = z.object({
31
+ pages: z.number().int().min(0),
32
+ items: z.number().int().min(0),
33
+ pageSize: z.number().int().min(1),
34
+ offsetStart: z.number().int().min(0),
35
+ truncated: z.boolean(),
36
+ });
37
+ export const WorldSearchInputSchema = z.object({
38
+ query: z.string(),
39
+ pageSize: z.number().int().min(1).max(100).optional(),
40
+ maxPages: z.number().int().min(1).max(50).optional(),
41
+ maxItems: z.number().int().min(1).optional(),
42
+ offset: z.number().int().min(0).optional(),
43
+ featured: z.boolean().optional(),
44
+ sort: z.string().optional(),
45
+ order: z.string().optional(),
46
+ tag: z.string().optional(),
47
+ notag: z.string().optional(),
48
+ releaseStatus: z.string().optional(),
49
+ maxUnityVersion: z.string().optional(),
50
+ minUnityVersion: z.string().optional(),
51
+ platform: z.string().optional(),
52
+ includeTags: z.boolean().optional(),
53
+ });
54
+ export const WorldFavoritesInputSchema = z.object({
55
+ query: z.string().optional(),
56
+ pageSize: z.number().int().min(1).max(100).optional(),
57
+ maxPages: z.number().int().min(1).max(50).optional(),
58
+ maxItems: z.number().int().min(1).optional(),
59
+ offset: z.number().int().min(0).optional(),
60
+ featured: z.boolean().optional(),
61
+ sort: z.string().optional(),
62
+ order: z.string().optional(),
63
+ tag: z.string().optional(),
64
+ notag: z.string().optional(),
65
+ releaseStatus: z.string().optional(),
66
+ maxUnityVersion: z.string().optional(),
67
+ minUnityVersion: z.string().optional(),
68
+ platform: z.string().optional(),
69
+ userId: schemas.UserID.optional(),
70
+ includeTags: z.boolean().optional(),
71
+ });
72
+ export const WorldProfileInputSchema = WorldShapeSchema.extend({
73
+ worldId: schemas.WorldID.optional(),
74
+ name: z.string().optional(),
75
+ });
76
+ export const WorldInstancesInputSchema = z.object({
77
+ worldId: schemas.WorldID.optional(),
78
+ name: z.string().optional(),
79
+ });
80
+ export const WorldSearchOutputSchema = z.object({
81
+ query: z.string(),
82
+ total: z.number().int().min(0),
83
+ stale: z.boolean(),
84
+ page: WorldPageSchema.optional(),
85
+ worlds: z.array(WorldSummarySchema),
86
+ notes: z.array(z.string()).optional(),
87
+ });
88
+ export const WorldFavoritesOutputSchema = z.object({
89
+ total: z.number().int().min(0),
90
+ stale: z.boolean(),
91
+ page: WorldPageSchema.optional(),
92
+ worlds: z.array(WorldSummarySchema),
93
+ notes: z.array(z.string()).optional(),
94
+ });
95
+ export const WorldProfileOutputSchema = z.object({
96
+ worldId: schemas.WorldID,
97
+ resolvedBy: z.enum(['id', 'name']),
98
+ stale: z.boolean(),
99
+ world: schemas.World.partial(),
100
+ vrcxMemo: z
101
+ .object({
102
+ editedAt: z.string().nullable(),
103
+ memo: z.string().nullable(),
104
+ })
105
+ .optional(),
106
+ });
107
+ export const WorldInstancesOverviewOutputSchema = z.object({
108
+ worldId: schemas.WorldID,
109
+ resolvedBy: z.enum(['id', 'name']),
110
+ stale: z.boolean(),
111
+ instances: WorldInstancesSummarySchema,
112
+ });
113
+ export function normalizeWorldName(value) {
114
+ return value.trim().toLowerCase();
115
+ }
116
+ function toOptionalInt(value) {
117
+ if (typeof value !== 'number' || !Number.isFinite(value))
118
+ return undefined;
119
+ return Math.floor(value);
120
+ }
121
+ function toOptionalStringArray(value) {
122
+ if (!Array.isArray(value))
123
+ return undefined;
124
+ const tags = value.filter((entry) => typeof entry === 'string' && entry.length > 0);
125
+ return tags.length > 0 ? tags : undefined;
126
+ }
127
+ export function buildWorldSummary(world) {
128
+ const worldId = world.id ?? undefined;
129
+ const name = world.name ?? undefined;
130
+ if (!worldId || !name)
131
+ return null;
132
+ const tags = toOptionalStringArray(world.tags);
133
+ return {
134
+ worldId,
135
+ name,
136
+ authorId: world.authorId ?? undefined,
137
+ authorName: world.authorName ?? undefined,
138
+ capacity: toOptionalInt(world.capacity),
139
+ visits: toOptionalInt(world.visits),
140
+ favorites: toOptionalInt(world.favorites),
141
+ heat: toOptionalInt(world.heat),
142
+ popularity: toOptionalInt(world.popularity),
143
+ releaseStatus: world.releaseStatus ?? undefined,
144
+ updatedAt: world.updated_at ?? undefined,
145
+ tags,
146
+ favoriteGroup: world.favoriteGroup ?? undefined,
147
+ favoriteId: world.favoriteId ?? undefined,
148
+ };
149
+ }
150
+ //# sourceMappingURL=worlds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worlds.js","sourceRoot":"","sources":["../../../src/models/worlds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { friendsChangeStore } from '../services/friends/changes.js';
3
+ export const FRIENDS_CHANGES_URI = 'vrchat://friends/changes';
4
+ function parseNumber(value, fallback) {
5
+ if (Array.isArray(value))
6
+ return parseNumber(value[0], fallback);
7
+ if (typeof value === 'string') {
8
+ const parsed = Number(value);
9
+ if (Number.isFinite(parsed) && parsed >= 0)
10
+ return Math.floor(parsed);
11
+ }
12
+ return fallback;
13
+ }
14
+ export function registerFriendsChangesResource(server) {
15
+ const template = new ResourceTemplate(`${FRIENDS_CHANGES_URI}{?after,limit}`, {
16
+ list: undefined,
17
+ });
18
+ server.registerResource('vrchat_friends_changes', template, {
19
+ title: 'VRChat friend change feed',
20
+ description: 'Delta feed for friend changes (online/offline/location/add/remove). Use resources/subscribe for updates.',
21
+ }, (uri, variables) => {
22
+ const after = parseNumber(variables.after ?? uri.searchParams.get('after'), 0);
23
+ const limit = parseNumber(variables.limit ?? uri.searchParams.get('limit'), 200);
24
+ const snapshot = friendsChangeStore.snapshot(after, limit);
25
+ const payload = {
26
+ resource: 'friends_changes',
27
+ after: snapshot.after,
28
+ nextAfter: snapshot.nextAfter,
29
+ truncated: snapshot.truncated,
30
+ changedIds: snapshot.changedIds,
31
+ events: snapshot.events,
32
+ };
33
+ return {
34
+ contents: [
35
+ {
36
+ uri: uri.toString(),
37
+ mimeType: 'application/json',
38
+ text: JSON.stringify(payload, null, 2),
39
+ },
40
+ ],
41
+ };
42
+ });
43
+ }
44
+ //# sourceMappingURL=friendsChanges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"friendsChanges.js","sourceRoot":"","sources":["../../../src/resources/friendsChanges.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,CAAC,MAAM,mBAAmB,GAAG,0BAA0B,CAAC;AAE9D,SAAS,WAAW,CAAC,KAAc,EAAE,QAAgB;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,mBAAmB,gBAAgB,EAAE;QAC5E,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;IAEH,MAAM,CAAC,gBAAgB,CACrB,wBAAwB,EACxB,QAAQ,EACR;QACE,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,0GAA0G;KAC7G,EACD,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/E,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG;YACd,QAAQ,EAAE,iBAAiB;YAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;oBACnB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;iBACvC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { fetchFriendsWithMeta } from '../services/friends/fetch.js';
3
+ export const FRIENDS_SNAPSHOT_URI = 'vrchat://friends/snapshot';
4
+ function parseNumber(value, fallback) {
5
+ if (Array.isArray(value))
6
+ return parseNumber(value[0], fallback);
7
+ if (typeof value === 'string') {
8
+ const parsed = Number(value);
9
+ if (Number.isFinite(parsed) && parsed >= 0)
10
+ return Math.floor(parsed);
11
+ }
12
+ return fallback;
13
+ }
14
+ function parseBoolean(value, fallback) {
15
+ if (Array.isArray(value))
16
+ return parseBoolean(value[0], fallback);
17
+ if (typeof value === 'boolean')
18
+ return value;
19
+ if (typeof value === 'string') {
20
+ const normalized = value.toLowerCase();
21
+ if (['true', '1', 'yes', 'on'].includes(normalized))
22
+ return true;
23
+ if (['false', '0', 'no', 'off'].includes(normalized))
24
+ return false;
25
+ }
26
+ return fallback;
27
+ }
28
+ function clamp(value, min, max) {
29
+ return Math.min(Math.max(value, min), max);
30
+ }
31
+ export function registerFriendsSnapshotResource(server) {
32
+ const template = new ResourceTemplate(`${FRIENDS_SNAPSHOT_URI}{?includeOffline,pageSize,maxPages}`, {
33
+ list: undefined,
34
+ });
35
+ server.registerResource('vrchat_friends_snapshot', template, {
36
+ title: 'VRChat friends snapshot',
37
+ description: 'Snapshot of the friends list (cache-backed). Subscribe to receive update notifications.',
38
+ }, async (uri, variables) => {
39
+ const includeOffline = parseBoolean(variables.includeOffline ?? uri.searchParams.get('includeOffline'), true);
40
+ const pageSize = clamp(parseNumber(variables.pageSize ?? uri.searchParams.get('pageSize'), 100), 1, 100);
41
+ const maxPages = clamp(parseNumber(variables.maxPages ?? uri.searchParams.get('maxPages'), 200), 1, 500);
42
+ const { friends, meta } = await fetchFriendsWithMeta({
43
+ includeOffline,
44
+ pageSize,
45
+ maxPages,
46
+ });
47
+ const payload = {
48
+ resource: 'friends_snapshot',
49
+ includeOffline,
50
+ pageSize,
51
+ maxPages,
52
+ totalFriends: friends.length,
53
+ truncated: meta.truncated,
54
+ stale: meta.stale,
55
+ segments: meta.segments,
56
+ friends,
57
+ };
58
+ return {
59
+ contents: [
60
+ {
61
+ uri: uri.toString(),
62
+ mimeType: 'application/json',
63
+ text: JSON.stringify(payload, null, 2),
64
+ },
65
+ ],
66
+ };
67
+ });
68
+ }
69
+ //# sourceMappingURL=friendsSnapshot.js.map