horizon-mcp 1.5.5 → 1.7.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 (166) hide show
  1. package/README.md +25 -9
  2. package/dist/prompts/explain-feature.d.ts.map +1 -1
  3. package/dist/prompts/explain-feature.js +5 -1
  4. package/dist/prompts/explain-feature.js.map +1 -1
  5. package/dist/prompts/integrate-feature.d.ts.map +1 -1
  6. package/dist/prompts/integrate-feature.js +5 -1
  7. package/dist/prompts/integrate-feature.js.map +1 -1
  8. package/dist/resources/index.d.ts.map +1 -1
  9. package/dist/resources/index.js +30 -2
  10. package/dist/resources/index.js.map +1 -1
  11. package/dist/tools/__tests__/admin-validated-config.test.d.ts +2 -0
  12. package/dist/tools/__tests__/admin-validated-config.test.d.ts.map +1 -0
  13. package/dist/tools/__tests__/admin-validated-config.test.js +198 -0
  14. package/dist/tools/__tests__/admin-validated-config.test.js.map +1 -0
  15. package/dist/tools/__tests__/admin-validated-evidence.test.d.ts +2 -0
  16. package/dist/tools/__tests__/admin-validated-evidence.test.d.ts.map +1 -0
  17. package/dist/tools/__tests__/admin-validated-evidence.test.js +459 -0
  18. package/dist/tools/__tests__/admin-validated-evidence.test.js.map +1 -0
  19. package/dist/tools/__tests__/api-client.test.js +40 -0
  20. package/dist/tools/__tests__/api-client.test.js.map +1 -1
  21. package/dist/tools/__tests__/gift-codes.test.d.ts +2 -0
  22. package/dist/tools/__tests__/gift-codes.test.d.ts.map +1 -0
  23. package/dist/tools/__tests__/gift-codes.test.js +80 -0
  24. package/dist/tools/__tests__/gift-codes.test.js.map +1 -0
  25. package/dist/tools/__tests__/leaderboard.test.js +8 -0
  26. package/dist/tools/__tests__/leaderboard.test.js.map +1 -1
  27. package/dist/tools/__tests__/player-profile.test.d.ts +2 -0
  28. package/dist/tools/__tests__/player-profile.test.d.ts.map +1 -0
  29. package/dist/tools/__tests__/player-profile.test.js +121 -0
  30. package/dist/tools/__tests__/player-profile.test.js.map +1 -0
  31. package/dist/tools/__tests__/tool-metadata.test.js +243 -9
  32. package/dist/tools/__tests__/tool-metadata.test.js.map +1 -1
  33. package/dist/tools/__tests__/validated-actions.test.d.ts +2 -0
  34. package/dist/tools/__tests__/validated-actions.test.d.ts.map +1 -0
  35. package/dist/tools/__tests__/validated-actions.test.js +541 -0
  36. package/dist/tools/__tests__/validated-actions.test.js.map +1 -0
  37. package/dist/tools/admin/_utils.d.ts +13 -3
  38. package/dist/tools/admin/_utils.d.ts.map +1 -1
  39. package/dist/tools/admin/_utils.js +15 -23
  40. package/dist/tools/admin/_utils.js.map +1 -1
  41. package/dist/tools/admin/cloud-save.d.ts.map +1 -1
  42. package/dist/tools/admin/cloud-save.js +79 -24
  43. package/dist/tools/admin/cloud-save.js.map +1 -1
  44. package/dist/tools/admin/crashes.d.ts.map +1 -1
  45. package/dist/tools/admin/crashes.js +107 -42
  46. package/dist/tools/admin/crashes.js.map +1 -1
  47. package/dist/tools/admin/email-templates.d.ts.map +1 -1
  48. package/dist/tools/admin/email-templates.js +109 -28
  49. package/dist/tools/admin/email-templates.js.map +1 -1
  50. package/dist/tools/admin/feedback.d.ts.map +1 -1
  51. package/dist/tools/admin/feedback.js +25 -7
  52. package/dist/tools/admin/feedback.js.map +1 -1
  53. package/dist/tools/admin/gift-codes.d.ts.map +1 -1
  54. package/dist/tools/admin/gift-codes.js +116 -33
  55. package/dist/tools/admin/gift-codes.js.map +1 -1
  56. package/dist/tools/admin/index.d.ts.map +1 -1
  57. package/dist/tools/admin/index.js +4 -0
  58. package/dist/tools/admin/index.js.map +1 -1
  59. package/dist/tools/admin/leaderboard.d.ts.map +1 -1
  60. package/dist/tools/admin/leaderboard.js +71 -15
  61. package/dist/tools/admin/leaderboard.js.map +1 -1
  62. package/dist/tools/admin/localization.d.ts +4 -0
  63. package/dist/tools/admin/localization.d.ts.map +1 -1
  64. package/dist/tools/admin/localization.js +85 -29
  65. package/dist/tools/admin/localization.js.map +1 -1
  66. package/dist/tools/admin/news.d.ts +7 -3
  67. package/dist/tools/admin/news.d.ts.map +1 -1
  68. package/dist/tools/admin/news.js +134 -35
  69. package/dist/tools/admin/news.js.map +1 -1
  70. package/dist/tools/admin/projects.d.ts +6 -2
  71. package/dist/tools/admin/projects.d.ts.map +1 -1
  72. package/dist/tools/admin/projects.js +104 -39
  73. package/dist/tools/admin/projects.js.map +1 -1
  74. package/dist/tools/admin/remote-config.d.ts +6 -1
  75. package/dist/tools/admin/remote-config.d.ts.map +1 -1
  76. package/dist/tools/admin/remote-config.js +87 -29
  77. package/dist/tools/admin/remote-config.js.map +1 -1
  78. package/dist/tools/admin/smtp.d.ts +1 -1
  79. package/dist/tools/admin/smtp.d.ts.map +1 -1
  80. package/dist/tools/admin/smtp.js +60 -18
  81. package/dist/tools/admin/smtp.js.map +1 -1
  82. package/dist/tools/admin/user-logs.d.ts.map +1 -1
  83. package/dist/tools/admin/user-logs.js +15 -6
  84. package/dist/tools/admin/user-logs.js.map +1 -1
  85. package/dist/tools/admin/users.d.ts.map +1 -1
  86. package/dist/tools/admin/users.js +88 -29
  87. package/dist/tools/admin/users.js.map +1 -1
  88. package/dist/tools/admin/validated-actions-config.d.ts +20 -0
  89. package/dist/tools/admin/validated-actions-config.d.ts.map +1 -0
  90. package/dist/tools/admin/validated-actions-config.js +278 -0
  91. package/dist/tools/admin/validated-actions-config.js.map +1 -0
  92. package/dist/tools/admin/validated-actions.d.ts +48 -0
  93. package/dist/tools/admin/validated-actions.d.ts.map +1 -0
  94. package/dist/tools/admin/validated-actions.js +352 -0
  95. package/dist/tools/admin/validated-actions.js.map +1 -0
  96. package/dist/tools/api-client.d.ts +13 -3
  97. package/dist/tools/api-client.d.ts.map +1 -1
  98. package/dist/tools/api-client.js +29 -5
  99. package/dist/tools/api-client.js.map +1 -1
  100. package/dist/tools/auth.d.ts.map +1 -1
  101. package/dist/tools/auth.js +64 -39
  102. package/dist/tools/auth.js.map +1 -1
  103. package/dist/tools/cloud-save.d.ts.map +1 -1
  104. package/dist/tools/cloud-save.js +35 -23
  105. package/dist/tools/cloud-save.js.map +1 -1
  106. package/dist/tools/connection.d.ts.map +1 -1
  107. package/dist/tools/connection.js +12 -6
  108. package/dist/tools/connection.js.map +1 -1
  109. package/dist/tools/crash-reporting.d.ts.map +1 -1
  110. package/dist/tools/crash-reporting.js +30 -21
  111. package/dist/tools/crash-reporting.js.map +1 -1
  112. package/dist/tools/email-sending.d.ts.map +1 -1
  113. package/dist/tools/email-sending.js +39 -31
  114. package/dist/tools/email-sending.js.map +1 -1
  115. package/dist/tools/feedback.d.ts.map +1 -1
  116. package/dist/tools/feedback.js +16 -11
  117. package/dist/tools/feedback.js.map +1 -1
  118. package/dist/tools/gift-codes.d.ts.map +1 -1
  119. package/dist/tools/gift-codes.js +33 -21
  120. package/dist/tools/gift-codes.js.map +1 -1
  121. package/dist/tools/index.d.ts.map +1 -1
  122. package/dist/tools/index.js +4 -0
  123. package/dist/tools/index.js.map +1 -1
  124. package/dist/tools/leaderboard.d.ts.map +1 -1
  125. package/dist/tools/leaderboard.js +75 -43
  126. package/dist/tools/leaderboard.js.map +1 -1
  127. package/dist/tools/localization.d.ts.map +1 -1
  128. package/dist/tools/localization.js +33 -20
  129. package/dist/tools/localization.js.map +1 -1
  130. package/dist/tools/news.d.ts.map +1 -1
  131. package/dist/tools/news.js +10 -8
  132. package/dist/tools/news.js.map +1 -1
  133. package/dist/tools/output-schemas.d.ts +66 -0
  134. package/dist/tools/output-schemas.d.ts.map +1 -0
  135. package/dist/tools/output-schemas.js +137 -0
  136. package/dist/tools/output-schemas.js.map +1 -0
  137. package/dist/tools/player-profile.d.ts +10 -0
  138. package/dist/tools/player-profile.d.ts.map +1 -0
  139. package/dist/tools/player-profile.js +105 -0
  140. package/dist/tools/player-profile.js.map +1 -0
  141. package/dist/tools/remote-config.d.ts.map +1 -1
  142. package/dist/tools/remote-config.js +21 -12
  143. package/dist/tools/remote-config.js.map +1 -1
  144. package/dist/tools/tool-helpers.d.ts +78 -3
  145. package/dist/tools/tool-helpers.d.ts.map +1 -1
  146. package/dist/tools/tool-helpers.js +95 -5
  147. package/dist/tools/tool-helpers.js.map +1 -1
  148. package/dist/tools/user-logs.d.ts.map +1 -1
  149. package/dist/tools/user-logs.js +13 -9
  150. package/dist/tools/user-logs.js.map +1 -1
  151. package/dist/tools/validated-actions.d.ts +88 -0
  152. package/dist/tools/validated-actions.d.ts.map +1 -0
  153. package/dist/tools/validated-actions.js +432 -0
  154. package/dist/tools/validated-actions.js.map +1 -0
  155. package/package.json +2 -1
  156. package/src/resources/api/app-api.md +186 -10
  157. package/src/resources/docs/auth.md +1 -1
  158. package/src/resources/docs/cloud-save.md +11 -1
  159. package/src/resources/docs/gift-codes.md +24 -3
  160. package/src/resources/docs/leaderboard.md +41 -9
  161. package/src/resources/docs/overview.md +3 -1
  162. package/src/resources/docs/player-profile.md +195 -0
  163. package/src/resources/docs/validated-actions.md +402 -0
  164. package/src/resources/quickstart/godot.md +31 -0
  165. package/src/resources/quickstart/unity.md +37 -0
  166. package/src/resources/quickstart/unreal.md +34 -1
package/README.md CHANGED
@@ -30,7 +30,7 @@ Add to your MCP client configuration (Claude Desktop, Cursor, etc.):
30
30
 
31
31
  ## Features
32
32
 
33
- ### Resources (16 docs)
33
+ ### Resources (18 docs)
34
34
 
35
35
  Documentation resources are served directly from the MCP server. No API key required.
36
36
 
@@ -38,12 +38,14 @@ Documentation resources are served directly from the MCP server. No API key requ
38
38
  |-----|-------------|
39
39
  | `horizon://overview` | What is horizOn, core concepts (Account vs User), features, tier system, API structure, and SDKs |
40
40
  | `horizon://docs/auth` | Authentication methods (Anonymous, Email, Google), endpoints, SDK code examples, and common errors |
41
- | `horizon://docs/leaderboard` | Leaderboard score submission, top entries, user rank, entries around user, with SDK examples |
41
+ | `horizon://docs/leaderboard` | Leaderboard score submission, top entries, user rank, entries around user, player profile per entry, validated only boards, with SDK examples |
42
42
  | `horizon://docs/cloud-save` | Cloud save/load for JSON and binary data, tier size limits, SDK examples |
43
43
  | `horizon://docs/remote-config` | Server-side key-value configuration: feature flags, game balance, A/B testing. SDK examples |
44
44
  | `horizon://docs/localization` | Server-side localized strings across 15 languages: per-key translations, single/all fetch, available languages. SDK examples |
45
45
  | `horizon://docs/news` | In-game news and announcements with language filtering. SDK examples |
46
- | `horizon://docs/gift-codes` | Gift code validation and redemption for promotional rewards. SDK examples |
46
+ | `horizon://docs/gift-codes` | Gift code validation and redemption for promotional rewards, including cosmetic unlocks via grants. SDK examples |
47
+ | `horizon://docs/player-profile` | Player avatar, frame and badges from a per-project cosmetics catalog, unlocks via gift code grants, profile in leaderboard entries. SDK examples |
48
+ | `horizon://docs/validated-actions` | Server-checked runs: single-use run tickets with a server seed, SHA-256 input log hash, server-only rules, validated only leaderboards, server-owned player state, start context, evidence upload, admin evidence review with sus packages and package export, rejection codes. SDK examples |
47
49
  | `horizon://docs/feedback` | Bug reports, feature requests, and general feedback submission. SDK examples |
48
50
  | `horizon://docs/user-logs` | Server-side event and error tracking. Requires BASIC tier or higher. SDK examples |
49
51
  | `horizon://docs/crash-reporting` | Crash report submission, session tracking, fingerprinting, breadcrumbs, and auto-regression detection. SDK examples |
@@ -53,11 +55,13 @@ Documentation resources are served directly from the MCP server. No API key requ
53
55
  | `horizon://quickstart/unity` | Step-by-step guide to integrate horizOn in Unity with C# examples |
54
56
  | `horizon://quickstart/unreal` | Step-by-step guide to integrate horizOn in Unreal Engine 5.5+ with the official horizOn SDK plugin. C++ and Blueprint examples |
55
57
 
56
- ### Tools (28 tools)
58
+ ### Tools (34 tools)
57
59
 
58
60
  Live API tools that call the horizOn backend. Requires a valid API key.
59
61
 
60
- `horizon_submit_score`, `horizon_save_cloud_data` and `horizon_load_cloud_data` also need the player's session: sign in first and pass the returned `accessToken` as `sessionToken`.
62
+ `horizon_submit_score`, `horizon_save_cloud_data`, `horizon_load_cloud_data`, `horizon_redeem_gift_code`, `horizon_get_profile`, `horizon_set_profile`, `horizon_start_run`, `horizon_submit_validated`, `horizon_get_state` and `horizon_upload_evidence` also need the player's session: sign in first and pass the returned `accessToken` as `sessionToken`.
63
+
64
+ Every tool declares MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`), so clients can tell reads from writes. Destructive tools are `horizon_save_cloud_data` (replaces the save), `horizon_set_profile` (replaces the whole profile), `horizon_submit_validated` (consumes the ticket, can spend balances) and `horizon_cancel_email`. The read tools that return an object also declare an `outputSchema` and return `structuredContent` next to the JSON text. Each description names when to use the tool, which sibling to use instead, what it returns and how to recover from its errors.
61
65
 
62
66
  | Tool | Description |
63
67
  |------|-------------|
@@ -68,8 +72,8 @@ Live API tools that call the horizOn backend. Requires a valid API key.
68
72
  | `horizon_signin_anonymous` | Sign in with an anonymous token |
69
73
  | `horizon_check_auth` | Check whether a user session is still valid |
70
74
  | `horizon_list_leaderboards` | List available leaderboard boards for multi-board calls |
71
- | `horizon_submit_score` | Submit a score to the leaderboard |
72
- | `horizon_get_leaderboard_top` | Get the top leaderboard entries, optionally by board key |
75
+ | `horizon_submit_score` | Submit a score to the leaderboard (403 `VALIDATED_SUBMIT_REQUIRED` on validated only boards) |
76
+ | `horizon_get_leaderboard_top` | Get the top leaderboard entries with each player's profile, optionally by board key |
73
77
  | `horizon_get_user_rank` | Get a user's leaderboard rank, optionally by board key |
74
78
  | `horizon_get_leaderboard_around` | Get leaderboard entries around a user's position, optionally by board key |
75
79
  | `horizon_save_cloud_data` | Save cloud data for a user |
@@ -81,7 +85,13 @@ Live API tools that call the horizOn backend. Requires a valid API key.
81
85
  | `horizon_get_localization_languages` | List the languages that have localizations for the app |
82
86
  | `horizon_get_news` | Get news articles with optional language filtering |
83
87
  | `horizon_validate_gift_code` | Validate a gift code without redeeming it |
84
- | `horizon_redeem_gift_code` | Redeem a gift code for a user |
88
+ | `horizon_redeem_gift_code` | Redeem a gift code for a user (returns `grantedUnlocks` for codes with cosmetic grants) |
89
+ | `horizon_get_profile` | Get a player's profile (avatar, frame, badges), unlocks and the cosmetics catalog |
90
+ | `horizon_set_profile` | Replace a player's whole profile (avatar, frame, up to 3 badges) |
91
+ | `horizon_start_run` | Start a server-checked run: single-use ticket with a server seed, optionally bound to a board and with a start context (game, content, simulation and replay format versions, content digest, initial state as base64) |
92
+ | `horizon_submit_validated` | Submit a run result with the ticket and the SHA-256 input log hash (given, or computed locally from base64 bytes or text), optionally with `earned` server-owned values; returns `sus` (accepted but over a soft threshold); rejections name their `code` |
93
+ | `horizon_get_state` | Read the player's server-owned values (balance, earned today, daily cap per value key); read only |
94
+ | `horizon_upload_evidence` | Upload the input log (text or base64, encoded locally) of a run whose submit result asked for evidence; rejections name their `code` |
85
95
  | `horizon_submit_feedback` | Submit user feedback (bug reports, feature requests) |
86
96
  | `horizon_create_log` | Create a server-side log entry (INFO, WARN, ERROR) |
87
97
  | `horizon_create_crash_report` | Submit a crash report (grouped by fingerprint, with regression detection) |
@@ -112,7 +122,7 @@ Resources (documentation) work without an API key. Only the live API tools requi
112
122
 
113
123
  ## Admin Tools (v1.2+)
114
124
 
115
- With an **Account Key** (creatable in your horizOn Dashboard -> API Keys -> Create -> **Account Key**), the MCP server exposes additional tools that let Claude manage your dashboard -- projects, remote config, news, email templates, gift codes, users, leaderboards, cloud-save data, crash reports, feedback, user logs, and SMTP.
125
+ With an **Account Key** (creatable in your horizOn Dashboard -> API Keys -> Create -> **Account Key**), the MCP server exposes additional tools that let Claude manage your dashboard -- projects, remote config, news, email templates, gift codes, users, leaderboards, cloud-save data, crash reports, feedback, user logs, SMTP, and Validated Actions (rules, runs, player values and the evidence review).
116
126
 
117
127
  ### How to get your Account Key
118
128
 
@@ -153,6 +163,8 @@ When a key is project-scoped, the backend enforces that scope on direct HTTP cal
153
163
 
154
164
  ### Tool Groups
155
165
 
166
+ Admin tools carry the same annotations as the player tools: list, get and statistics tools are read only, update and delete tools are marked destructive.
167
+
156
168
  | Prefix | Description |
157
169
  |--------|-------------|
158
170
  | `horizon_admin_projects_*` | Project API key management (create/update/regenerate/revoke/delete) |
@@ -167,6 +179,8 @@ When a key is project-scoped, the backend enforces that scope on direct HTTP cal
167
179
  | `horizon_admin_feedback_*` | Read user feedback |
168
180
  | `horizon_admin_userlogs_*` | Read user logs |
169
181
  | `horizon_admin_smtp_*` | Account SMTP configuration (password always returned masked) |
182
+ | `horizon_admin_validated_evidence_*` | Validated Actions evidence review: list (top N records or, with `sus: true`, sus packages), quota, metadata (with `susPackage`), log download (base64 or hashes only), package export (ZIP written to a local file, with the integrity headers), delete |
183
+ | `horizon_admin_validated_rules_*`, `_usage_get`, `_runs_list`, `_state_*` | Validated Actions configuration: rule set per Project API key (get, replace, delete), run capacity of the hour, recent runs with rejection codes (filter `sus`), server-owned player values (read, support correction) |
170
184
 
171
185
  ## What is horizOn?
172
186
 
@@ -181,6 +195,8 @@ Core features:
181
195
  - Localization
182
196
  - News and Announcements
183
197
  - Gift Codes
198
+ - Player Profile (avatar, frame, badges)
199
+ - Validated Actions (server-checked runs, validated only leaderboards, server-owned currency)
184
200
  - User Feedback
185
201
  - User Logs
186
202
  - Crash Reporting
@@ -1 +1 @@
1
- {"version":3,"file":"explain-feature.d.ts","sourceRoot":"","sources":["../../src/prompts/explain-feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8BpE"}
1
+ {"version":3,"file":"explain-feature.d.ts","sourceRoot":"","sources":["../../src/prompts/explain-feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkCpE"}
@@ -10,11 +10,15 @@ export function registerExplainFeaturePrompt(server) {
10
10
  "leaderboard",
11
11
  "cloud-save",
12
12
  "remote-config",
13
+ "localization",
13
14
  "news",
14
15
  "gift-codes",
16
+ "player-profile",
17
+ "validated-actions",
15
18
  "feedback",
16
19
  "user-logs",
17
20
  "crash-reporting",
21
+ "email-sending",
18
22
  ])
19
23
  .describe("The feature to explain"),
20
24
  },
@@ -24,7 +28,7 @@ export function registerExplainFeaturePrompt(server) {
24
28
  role: "user",
25
29
  content: {
26
30
  type: "text",
27
- text: `Explain the horizOn "${feature}" feature in detail.\n\nPlease:\n1. Read the documentation (resource: horizon://docs/${feature})\n2. Explain what it does and when to use it\n3. Show the API endpoints and their parameters\n4. Provide code examples for Godot, Unity, and REST\n5. List tier limits and restrictions\n6. Share best practices and common pitfalls`,
31
+ text: `Explain the horizOn "${feature}" feature in detail.\n\nPlease:\n1. Read the documentation (resource: horizon://docs/${feature})\n2. Explain what it does and when to use it\n3. Show the API endpoints and their parameters\n4. Provide code examples for Godot, Unity, Unreal and REST\n5. List tier limits and restrictions\n6. Share best practices and common pitfalls`,
28
32
  },
29
33
  },
30
34
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"explain-feature.js","sourceRoot":"","sources":["../../src/prompts/explain-feature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CAAC,iBAAiB,EAAE;QACvC,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC;gBACJ,MAAM;gBACN,aAAa;gBACb,YAAY;gBACZ,eAAe;gBACf,MAAM;gBACN,YAAY;gBACZ,UAAU;gBACV,WAAW;gBACX,iBAAiB;aAClB,CAAC;iBACD,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACnB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wBAAwB,OAAO,wFAAwF,OAAO,uOAAuO;iBAC5W;aACF;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"explain-feature.js","sourceRoot":"","sources":["../../src/prompts/explain-feature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,UAAU,4BAA4B,CAAC,MAAiB;IAC5D,MAAM,CAAC,cAAc,CAAC,iBAAiB,EAAE;QACvC,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,oDAAoD;QACjE,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC;gBACJ,MAAM;gBACN,aAAa;gBACb,YAAY;gBACZ,eAAe;gBACf,cAAc;gBACd,MAAM;gBACN,YAAY;gBACZ,gBAAgB;gBAChB,mBAAmB;gBACnB,UAAU;gBACV,WAAW;gBACX,iBAAiB;gBACjB,eAAe;aAChB,CAAC;iBACD,QAAQ,CAAC,wBAAwB,CAAC;SACtC;KACF,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACnB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,wBAAwB,OAAO,wFAAwF,OAAO,8OAA8O;iBACnX;aACF;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"integrate-feature.d.ts","sourceRoot":"","sources":["../../src/prompts/integrate-feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkCtE"}
1
+ {"version":3,"file":"integrate-feature.d.ts","sourceRoot":"","sources":["../../src/prompts/integrate-feature.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsCtE"}
@@ -10,11 +10,15 @@ export function registerIntegrateFeaturePrompt(server) {
10
10
  "leaderboard",
11
11
  "cloud-save",
12
12
  "remote-config",
13
+ "localization",
13
14
  "news",
14
15
  "gift-codes",
16
+ "player-profile",
17
+ "validated-actions",
15
18
  "feedback",
16
19
  "user-logs",
17
20
  "crash-reporting",
21
+ "email-sending",
18
22
  ])
19
23
  .describe("The horizOn feature to integrate"),
20
24
  engine: z
@@ -27,7 +31,7 @@ export function registerIntegrateFeaturePrompt(server) {
27
31
  role: "user",
28
32
  content: {
29
33
  type: "text",
30
- text: `I want to integrate the horizOn "${feature}" feature into my ${engine} project.\n\nPlease:\n1. Read the horizOn documentation for this feature (resource: horizon://docs/${feature})\n2. Read the ${engine} quickstart guide (resource: horizon://quickstart/${engine})\n3. Generate complete, production-ready integration code\n4. Include error handling and best practices\n5. Show how to test it works using the horizOn MCP tools\n\nUse the horizOn SDK for ${engine === "godot" ? "Godot (GDScript)" : engine === "unity" ? "Unity (C#)" : "Unreal Engine (C++ and Blueprints)"}`,
34
+ text: `I want to integrate the horizOn "${feature}" feature into my ${engine} project.\n\nPlease:\n1. Read the horizOn documentation for this feature (resource: horizon://docs/${feature})\n2. Read the ${engine} quickstart guide (resource: horizon://quickstart/${engine})\n3. Generate complete, production-ready integration code\n4. Include error handling and best practices\n5. Show how to test it works using the horizOn MCP tools (the matching horizon_* tools; the documentation lists them)\n\nUse the horizOn SDK for ${engine === "godot" ? "Godot (GDScript)" : engine === "unity" ? "Unity (C#)" : "Unreal Engine (C++ and Blueprints)"}`,
31
35
  },
32
36
  },
33
37
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"integrate-feature.js","sourceRoot":"","sources":["../../src/prompts/integrate-feature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE;QACzC,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,+EAA+E;QACjF,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC;gBACJ,MAAM;gBACN,aAAa;gBACb,YAAY;gBACZ,eAAe;gBACf,MAAM;gBACN,YAAY;gBACZ,UAAU;gBACV,WAAW;gBACX,iBAAiB;aAClB,CAAC;iBACD,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;iBAClC,QAAQ,CAAC,iBAAiB,CAAC;SAC/B;KACF,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oCAAoC,OAAO,qBAAqB,MAAM,sGAAsG,OAAO,kBAAkB,MAAM,qDAAqD,MAAM,iMAAiM,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,oCAAoC,EAAE;iBAClkB;aACF;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"integrate-feature.js","sourceRoot":"","sources":["../../src/prompts/integrate-feature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,MAAM,UAAU,8BAA8B,CAAC,MAAiB;IAC9D,MAAM,CAAC,cAAc,CAAC,mBAAmB,EAAE;QACzC,KAAK,EAAE,2BAA2B;QAClC,WAAW,EACT,+EAA+E;QACjF,UAAU,EAAE;YACV,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC;gBACJ,MAAM;gBACN,aAAa;gBACb,YAAY;gBACZ,eAAe;gBACf,cAAc;gBACd,MAAM;gBACN,YAAY;gBACZ,gBAAgB;gBAChB,mBAAmB;gBACnB,UAAU;gBACV,WAAW;gBACX,iBAAiB;gBACjB,eAAe;aAChB,CAAC;iBACD,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;iBAClC,QAAQ,CAAC,iBAAiB,CAAC;SAC/B;KACF,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3B,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,oCAAoC,OAAO,qBAAqB,MAAM,sGAAsG,OAAO,kBAAkB,MAAM,qDAAqD,MAAM,8PAA8P,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,oCAAoC,EAAE;iBAC/nB;aACF;SACF;KACF,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BpE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgV5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0BpE;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0X5D"}
@@ -53,7 +53,7 @@ export function registerAllResources(server) {
53
53
  // Leaderboards
54
54
  server.registerResource("docs-leaderboard", "horizon://docs/leaderboard", {
55
55
  title: "Leaderboards",
56
- description: "Leaderboard score submission, top entries, user rank, entries around user, with SDK examples.",
56
+ description: "Leaderboard score submission, top entries, user rank, entries around user, player profile per entry, validated only boards, with SDK examples.",
57
57
  mimeType: "text/markdown",
58
58
  }, () => ({
59
59
  contents: [
@@ -123,7 +123,7 @@ export function registerAllResources(server) {
123
123
  // Gift Codes
124
124
  server.registerResource("docs-gift-codes", "horizon://docs/gift-codes", {
125
125
  title: "Gift Codes",
126
- description: "Gift code validation and redemption for promotional rewards. SDK examples.",
126
+ description: "Gift code validation and redemption for promotional rewards, including cosmetic unlocks via grants. SDK examples.",
127
127
  mimeType: "text/markdown",
128
128
  }, () => ({
129
129
  contents: [
@@ -134,6 +134,34 @@ export function registerAllResources(server) {
134
134
  },
135
135
  ],
136
136
  }));
137
+ // Player Profile
138
+ server.registerResource("docs-player-profile", "horizon://docs/player-profile", {
139
+ title: "Player Profile",
140
+ description: "Player avatar, frame and badges from a per-project cosmetics catalog, unlocks via gift code grants, profile in leaderboard entries. SDK examples.",
141
+ mimeType: "text/markdown",
142
+ }, () => ({
143
+ contents: [
144
+ {
145
+ uri: "horizon://docs/player-profile",
146
+ mimeType: "text/markdown",
147
+ text: loadDoc("docs/player-profile.md"),
148
+ },
149
+ ],
150
+ }));
151
+ // Validated Actions
152
+ server.registerResource("docs-validated-actions", "horizon://docs/validated-actions", {
153
+ title: "Validated Actions",
154
+ description: "Server-checked runs: single-use run tickets with a server seed, SHA-256 input log hash, server-only rules, validated only leaderboards, server-owned player state (currency, daily caps), run start context, evidence upload (input log), admin evidence review with sus packages and package export, rejection codes. SDK examples.",
155
+ mimeType: "text/markdown",
156
+ }, () => ({
157
+ contents: [
158
+ {
159
+ uri: "horizon://docs/validated-actions",
160
+ mimeType: "text/markdown",
161
+ text: loadDoc("docs/validated-actions.md"),
162
+ },
163
+ ],
164
+ }));
137
165
  // Feedback
138
166
  server.registerResource("docs-feedback", "horizon://docs/feedback", {
139
167
  title: "User Feedback",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=admin-validated-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-validated-config.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-validated-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,198 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
4
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
5
+ import { registerAdminValidatedActionsConfigTools } from "../admin/validated-actions-config.js";
6
+ // Contract checked against horizOn-Server AdminValidatedActionsController and
7
+ // AdminPlayerStateController (develop f55c3bc) on 2026-09-30. Never call a live API here.
8
+ const BASE = "https://validated.test.invalid";
9
+ const PROJECT_KEY = "11111111-1111-4111-8111-111111111111";
10
+ const USER_ID = "0d7e2f4a-9c1b-4a55-8e0e-3f6a4a8a3d11";
11
+ describe("admin validated actions config tools over MCP", () => {
12
+ let server;
13
+ let client;
14
+ let request;
15
+ beforeEach(async () => {
16
+ vi.stubEnv("HORIZON_ACCOUNT_API_KEY", "test-account-key");
17
+ vi.stubEnv("HORIZON_BASE_URL", BASE);
18
+ request = vi.fn().mockResolvedValue(new Response(JSON.stringify({ ok: true })));
19
+ vi.stubGlobal("fetch", request);
20
+ server = new McpServer({ name: "test", version: "1.0.0" });
21
+ registerAdminValidatedActionsConfigTools(server);
22
+ client = new Client({ name: "test", version: "1.0.0" });
23
+ const [a, b] = InMemoryTransport.createLinkedPair();
24
+ await Promise.all([server.connect(a), client.connect(b)]);
25
+ });
26
+ afterEach(async () => {
27
+ await client.close();
28
+ await server.close();
29
+ vi.unstubAllEnvs();
30
+ vi.unstubAllGlobals();
31
+ });
32
+ function lastCall() {
33
+ const [url, options] = request.mock.calls[request.mock.calls.length - 1];
34
+ return { url: new URL(url), options };
35
+ }
36
+ it("registers the seven config tools with matching annotations", async () => {
37
+ const { tools } = await client.listTools();
38
+ expect(tools.map((t) => t.name).sort()).toEqual([
39
+ "horizon_admin_validated_rules_delete",
40
+ "horizon_admin_validated_rules_get",
41
+ "horizon_admin_validated_rules_set",
42
+ "horizon_admin_validated_runs_list",
43
+ "horizon_admin_validated_state_correct",
44
+ "horizon_admin_validated_state_get",
45
+ "horizon_admin_validated_usage_get",
46
+ ]);
47
+ const byName = new Map(tools.map((t) => [t.name, t]));
48
+ for (const name of ["horizon_admin_validated_rules_set", "horizon_admin_validated_rules_delete", "horizon_admin_validated_state_correct"]) {
49
+ expect(byName.get(name)?.annotations?.destructiveHint, name).toBe(true);
50
+ }
51
+ for (const name of ["horizon_admin_validated_rules_get", "horizon_admin_validated_usage_get", "horizon_admin_validated_runs_list", "horizon_admin_validated_state_get"]) {
52
+ expect(byName.get(name)?.annotations?.readOnlyHint, name).toBe(true);
53
+ }
54
+ });
55
+ it("reads the rules of a project key with the account key header", async () => {
56
+ const result = (await client.callTool({
57
+ name: "horizon_admin_validated_rules_get",
58
+ arguments: { projectApiKeyId: PROJECT_KEY },
59
+ }));
60
+ expect(result.isError).not.toBe(true);
61
+ const { url, options } = lastCall();
62
+ expect(url.origin + url.pathname).toBe(`${BASE}/api/v1/admin/validated-actions/rules`);
63
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY });
64
+ expect(options.method).toBe("GET");
65
+ expect(options.headers["X-Account-API-Key"]).toBe("test-account-key");
66
+ });
67
+ it("replaces the rules with {apiKeyId, rules} as the body", async () => {
68
+ const rules = { formatVersion: 1, defaults: { maxScore: 1000000, minDurationSeconds: 30 } };
69
+ await client.callTool({
70
+ name: "horizon_admin_validated_rules_set",
71
+ arguments: { projectApiKeyId: PROJECT_KEY, rules },
72
+ });
73
+ const { url, options } = lastCall();
74
+ expect(url.pathname).toBe("/api/v1/admin/validated-actions/rules");
75
+ expect(options.method).toBe("PUT");
76
+ expect(JSON.parse(options.body)).toEqual({ apiKeyId: PROJECT_KEY, rules });
77
+ });
78
+ it("deletes the rules with apiKeyId as query parameter and reports it", async () => {
79
+ request.mockResolvedValueOnce(new Response(null, { status: 204 }));
80
+ const result = (await client.callTool({
81
+ name: "horizon_admin_validated_rules_delete",
82
+ arguments: { projectApiKeyId: PROJECT_KEY },
83
+ }));
84
+ const { url, options } = lastCall();
85
+ expect(url.pathname).toBe("/api/v1/admin/validated-actions/rules");
86
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY });
87
+ expect(options.method).toBe("DELETE");
88
+ expect(JSON.parse(result.content[0].text)).toEqual({ projectApiKeyId: PROJECT_KEY, deleted: true });
89
+ });
90
+ it("reads the usage without parameters", async () => {
91
+ const usage = { runsThisHour: 112, runsPerHourLimit: 300, windowStartsAt: "2026-09-29T14:00:00Z", windowEndsAt: "2026-09-29T15:00:00Z" };
92
+ request.mockResolvedValueOnce(new Response(JSON.stringify(usage)));
93
+ const result = (await client.callTool({ name: "horizon_admin_validated_usage_get", arguments: {} }));
94
+ const { url } = lastCall();
95
+ expect(url.pathname).toBe("/api/v1/admin/validated-actions/usage");
96
+ expect(url.search).toBe("");
97
+ expect(JSON.parse(result.content[0].text)).toEqual(usage);
98
+ });
99
+ it("lists runs with apiKeyId, limit and the optional status", async () => {
100
+ await client.callTool({
101
+ name: "horizon_admin_validated_runs_list",
102
+ arguments: { projectApiKeyId: PROJECT_KEY, status: "REJECTED", limit: 10 },
103
+ });
104
+ let { url } = lastCall();
105
+ expect(url.pathname).toBe("/api/v1/admin/validated-actions/runs");
106
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY, limit: "10", status: "REJECTED" });
107
+ await client.callTool({ name: "horizon_admin_validated_runs_list", arguments: { projectApiKeyId: PROJECT_KEY } });
108
+ ({ url } = lastCall());
109
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY, limit: "50" });
110
+ });
111
+ it("lists only sus runs with sus true and passes the E911 run fields through", async () => {
112
+ const runs = {
113
+ runs: [
114
+ {
115
+ runId: "5b0b6c1e-8d0f-4c55-9b0e-0e6a4a8a3d11",
116
+ status: "ACCEPTED",
117
+ sus: true,
118
+ packageStatus: "ARCHIVED",
119
+ startContext: "STORED",
120
+ },
121
+ ],
122
+ };
123
+ request.mockResolvedValueOnce(new Response(JSON.stringify(runs)));
124
+ const result = (await client.callTool({
125
+ name: "horizon_admin_validated_runs_list",
126
+ arguments: { projectApiKeyId: PROJECT_KEY, sus: true },
127
+ }));
128
+ let { url } = lastCall();
129
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY, limit: "50", sus: "true" });
130
+ expect(JSON.parse(result.content[0].text)).toEqual(runs);
131
+ await client.callTool({ name: "horizon_admin_validated_runs_list", arguments: { projectApiKeyId: PROJECT_KEY, sus: false } });
132
+ ({ url } = lastCall());
133
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY, limit: "50" });
134
+ });
135
+ it("rejects an unknown run status before any request", async () => {
136
+ const result = (await client.callTool({
137
+ name: "horizon_admin_validated_runs_list",
138
+ arguments: { projectApiKeyId: PROJECT_KEY, status: "DONE" },
139
+ }));
140
+ expect(result.isError).toBe(true);
141
+ expect(request).not.toHaveBeenCalled();
142
+ });
143
+ it("reads a player's state with and without the project filter", async () => {
144
+ await client.callTool({ name: "horizon_admin_validated_state_get", arguments: { userId: USER_ID } });
145
+ let { url, options } = lastCall();
146
+ expect(url.pathname).toBe(`/api/v1/admin/validated-actions/state/${USER_ID}`);
147
+ expect(url.search).toBe("");
148
+ expect(options.method).toBe("GET");
149
+ await client.callTool({ name: "horizon_admin_validated_state_get", arguments: { userId: USER_ID, projectApiKeyId: PROJECT_KEY } });
150
+ ({ url } = lastCall());
151
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY });
152
+ });
153
+ it("corrects balances with values and note, apiKeyId as query parameter", async () => {
154
+ await client.callTool({
155
+ name: "horizon_admin_validated_state_correct",
156
+ arguments: {
157
+ userId: USER_ID,
158
+ projectApiKeyId: PROJECT_KEY,
159
+ values: [{ key: "gold", balance: 1250 }],
160
+ note: "Refund for ticket 4711",
161
+ },
162
+ });
163
+ const { url, options } = lastCall();
164
+ expect(url.pathname).toBe(`/api/v1/admin/validated-actions/state/${USER_ID}`);
165
+ expect(Object.fromEntries(url.searchParams)).toEqual({ apiKeyId: PROJECT_KEY });
166
+ expect(options.method).toBe("PUT");
167
+ expect(JSON.parse(options.body)).toEqual({
168
+ values: [{ key: "gold", balance: 1250 }],
169
+ note: "Refund for ticket 4711",
170
+ });
171
+ });
172
+ it("leaves out a blank note and refuses a negative balance", async () => {
173
+ await client.callTool({
174
+ name: "horizon_admin_validated_state_correct",
175
+ arguments: { userId: USER_ID, values: [{ key: "gold", balance: 0 }], note: " " },
176
+ });
177
+ const { url, options } = lastCall();
178
+ expect(url.search).toBe("");
179
+ expect(JSON.parse(options.body)).toEqual({ values: [{ key: "gold", balance: 0 }] });
180
+ request.mockClear();
181
+ const result = (await client.callTool({
182
+ name: "horizon_admin_validated_state_correct",
183
+ arguments: { userId: USER_ID, values: [{ key: "gold", balance: -1 }] },
184
+ }));
185
+ expect(result.isError).toBe(true);
186
+ expect(request).not.toHaveBeenCalled();
187
+ });
188
+ it("names the server code of an error", async () => {
189
+ request.mockResolvedValueOnce(new Response(JSON.stringify({ code: "UNKNOWN_VALUE_KEY", message: "values[0].key" }), { status: 400 }));
190
+ const result = (await client.callTool({
191
+ name: "horizon_admin_validated_state_correct",
192
+ arguments: { userId: USER_ID, values: [{ key: "gems", balance: 5 }] },
193
+ }));
194
+ expect(result.isError).toBe(true);
195
+ expect(result.content[0].text).toContain("UNKNOWN_VALUE_KEY");
196
+ });
197
+ });
198
+ //# sourceMappingURL=admin-validated-config.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-validated-config.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-validated-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=admin-validated-evidence.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-validated-evidence.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-validated-evidence.test.ts"],"names":[],"mappings":""}