@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
package/docs/vrcx.md ADDED
@@ -0,0 +1,69 @@
1
+ # VRCX Integration Notes
2
+
3
+ This repo includes optional read-only tooling to pull _local_ context from the VRCX SQLite database.
4
+
5
+ The goal is to expose information that VRChat's public API does not provide (e.g. local memos, your join/leave history, and time-spent estimates), while avoiding sensitive material (cookies, stored credentials).
6
+
7
+ ## Default locations
8
+
9
+ VRCX stores its primary database under the user's application data directory.
10
+
11
+ - Windows: `%APPDATA%\\VRCX\\VRCX.sqlite3`
12
+ - macOS (common): `~/Library/Application Support/VRCX/VRCX.sqlite3`
13
+ - Linux (common): `~/.config/VRCX/VRCX.sqlite3` (some builds use `~/.local/share/VRCX`)
14
+
15
+ VRCX also stores a small JSON settings file:
16
+
17
+ - Windows: `%APPDATA%\\VRCX\\VRCX.json`
18
+
19
+ The `VRCX.json` key `VRCX_DatabaseLocation` can override the DB path.
20
+
21
+ VRCX may also create `VRCX-WorldData.db` in the same directory.
22
+
23
+ ## Key tables (high-level)
24
+
25
+ Useful (non-secret) tables commonly present:
26
+
27
+ - `memos`, `world_memos`, `avatar_memos` (your local notes)
28
+ - `gamelog_location` (your recent world/instance visits)
29
+ - `gamelog_join_leave` (player join/leave events; used by VRCX to estimate time spent)
30
+ - `favorite_world`, `favorite_avatar`, `cache_world`, `cache_avatar`
31
+
32
+ Sensitive / do-not-expose tables:
33
+
34
+ - `cookies` (session cookies)
35
+ - `configs` contains keys like `config:savedcredentials` (may include credentials/cookies)
36
+ - Only a small allowlist of safe keys should be read (e.g. `config:lastuserloggedin`, `config:vrcx_databaseversion`).
37
+
38
+ Per-user tables (prefixed):
39
+
40
+ VRCX creates user-specific tables using a prefix derived from the logged-in VRChat userId.
41
+ The prefix is roughly `userId` with `-` and `_` removed.
42
+
43
+ Examples:
44
+
45
+ - `<prefix>_notes`
46
+ - `<prefix>_friend_log_current`
47
+ - `<prefix>_friend_log_history`
48
+ - `<prefix>_feed_*`
49
+
50
+ ## “Time spent with someone” (how VRCX derives it)
51
+
52
+ VRCX uses `gamelog_join_leave` entries.
53
+
54
+ - `type = 'OnPlayerLeft'` rows often include a `time` column representing how long that player was present before leaving.
55
+ - `created_at` is the leave timestamp.
56
+ - Join timestamp can be approximated as: `joinTime = created_at - time`.
57
+
58
+ This enables tools to provide:
59
+
60
+ - relationship summary: total time spent, last seen, count of distinct instances
61
+ - relationship sessions: recent per-session breakdown (bounded by limit)
62
+
63
+ ## Tooling philosophy
64
+
65
+ - Read-only by default.
66
+ - Small, curated outputs.
67
+ - No raw SQL passthrough.
68
+ - Never return `cookies` or sensitive `configs` keys.
69
+ - History-heavy tools are separate or explicitly bounded by limits.
package/package.json ADDED
@@ -0,0 +1,109 @@
1
+ {
2
+ "name": "@basicbit/vrchat-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for VRChat friends, worlds, groups, events, notifications, and VRCX history.",
5
+ "type": "module",
6
+ "main": "dist/src/index.js",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "bin": {
11
+ "vrchat-mcp": "dist/bin/cli.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "assets/logo.svg",
16
+ "docs/architecture.md",
17
+ "docs/curated-tools.md",
18
+ "docs/design-notes.md",
19
+ "docs/evals.md",
20
+ "docs/tools-guide.md",
21
+ "docs/tools.md",
22
+ "docs/vrcx.md",
23
+ "README.md",
24
+ "CHANGELOG.md",
25
+ "LICENSE"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "dev": "tsx src/index.ts",
31
+ "lint": "eslint . --ext .ts,.tsx,.mts --max-warnings=0",
32
+ "lint:fix": "npm run lint -- --fix",
33
+ "format": "prettier --write .",
34
+ "format:check": "prettier --check .",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "test:coverage": "vitest run --coverage",
38
+ "test:e2e": "vitest run test/e2e",
39
+ "test:e2e:live": "vitest run test/e2e/live.test.ts",
40
+ "test:evals": "vitest run test/evals",
41
+ "smoke:live": "tsx scripts/live-smoke.ts",
42
+ "check": "npm run lint && npm run typecheck && npm test",
43
+ "mcp:login": "tsx scripts/mcp-client.ts login",
44
+ "mcp:status": "tsx scripts/mcp-client.ts status",
45
+ "mcp:logout": "tsx scripts/mcp-client.ts logout",
46
+ "mcp:list-tools": "tsx scripts/mcp-client.ts list-tools",
47
+ "mcp:call": "tsx scripts/mcp-client.ts call",
48
+ "generate:schemas": "openapi-zod-client specs/vrchat-openapi.yaml -o src/generated/vrchat-schemas.ts -t scripts/templates/openapi-schemas.hbs --export-schemas -p .prettierrc.json && tsx scripts/postprocess-schemas.ts src/generated/vrchat-schemas.ts",
49
+ "generate:test-schemas": "openapi-zod-client test/fixtures/spec.yaml -o test/generated/mock-schemas.ts -t scripts/templates/openapi-schemas.hbs --export-schemas -p .prettierrc.json && tsx scripts/postprocess-schemas.ts test/generated/mock-schemas.ts",
50
+ "generate:tools-docs": "tsx scripts/generate-tools-docs.ts",
51
+ "mcpo": "uvx mcpo --port 8000 --api-key \"top-secret\" -- npx tsx src/index.ts",
52
+ "start": "node dist/bin/cli.js",
53
+ "metrics:scc": "tsx scripts/metrics/scc.ts",
54
+ "metrics:lizard": "tsx scripts/metrics/lizard.ts",
55
+ "metrics": "npm run metrics:scc && npm run metrics:lizard"
56
+ },
57
+ "engines": {
58
+ "node": ">=22.19.0"
59
+ },
60
+ "keywords": [
61
+ "vrchat",
62
+ "mcp",
63
+ "modelcontextprotocol",
64
+ "model-context-protocol",
65
+ "claude",
66
+ "opencode",
67
+ "vrchat-api",
68
+ "vrcx"
69
+ ],
70
+ "repository": {
71
+ "type": "git",
72
+ "url": "git+https://github.com/BASIC-BIT/vrchat-mcp.git"
73
+ },
74
+ "bugs": {
75
+ "url": "https://github.com/BASIC-BIT/vrchat-mcp/issues"
76
+ },
77
+ "homepage": "https://github.com/BASIC-BIT/vrchat-mcp#readme",
78
+ "license": "MIT",
79
+ "devDependencies": {
80
+ "@apidevtools/json-schema-ref-parser": "^15.3.5",
81
+ "@eslint/js": "^10.0.1",
82
+ "@types/better-sqlite3": "^7.6.13",
83
+ "@types/node": "^25.0.3",
84
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
85
+ "@typescript-eslint/parser": "^8.50.0",
86
+ "@vitest/coverage-v8": "^4.0.16",
87
+ "ajv-formats": "^3.0.1",
88
+ "eslint": "^10.3.0",
89
+ "eslint-config-prettier": "^10.1.8",
90
+ "eslint-plugin-sonarjs": "^4.0.3",
91
+ "globals": "^17.6.0",
92
+ "mock-json-schema": "^1.1.2",
93
+ "openapi-backend": "^5.15.0",
94
+ "openapi-zod-client": "^1.18.3",
95
+ "prettier": "^3.7.4",
96
+ "tsx": "^4.21.0",
97
+ "typescript": "^6.0.3",
98
+ "vitest": "^4.0.16"
99
+ },
100
+ "dependencies": {
101
+ "@modelcontextprotocol/sdk": "^1.29.0",
102
+ "better-sqlite3": "^12.6.2",
103
+ "keytar": "^7.9.0",
104
+ "tough-cookie": "^6.0.0",
105
+ "undici": "^8.2.0",
106
+ "yaml": "^2.8.4",
107
+ "zod": "^4.2.1"
108
+ }
109
+ }