horizon-mcp 1.1.0 → 1.3.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.
- package/README.md +56 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +14 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/tools/__tests__/admin-api-client.test.d.ts +2 -0
- package/dist/tools/__tests__/admin-api-client.test.d.ts.map +1 -0
- package/dist/tools/__tests__/admin-api-client.test.js +67 -0
- package/dist/tools/__tests__/admin-api-client.test.js.map +1 -0
- package/dist/tools/__tests__/admin-e2e.test.d.ts +2 -0
- package/dist/tools/__tests__/admin-e2e.test.d.ts.map +1 -0
- package/dist/tools/__tests__/admin-e2e.test.js +19 -0
- package/dist/tools/__tests__/admin-e2e.test.js.map +1 -0
- package/dist/tools/admin/_utils.d.ts +25 -0
- package/dist/tools/admin/_utils.d.ts.map +1 -0
- package/dist/tools/admin/_utils.js +59 -0
- package/dist/tools/admin/_utils.js.map +1 -0
- package/dist/tools/admin/cloud-save.d.ts +13 -0
- package/dist/tools/admin/cloud-save.d.ts.map +1 -0
- package/dist/tools/admin/cloud-save.js +154 -0
- package/dist/tools/admin/cloud-save.js.map +1 -0
- package/dist/tools/admin/crashes.d.ts +19 -0
- package/dist/tools/admin/crashes.d.ts.map +1 -0
- package/dist/tools/admin/crashes.js +249 -0
- package/dist/tools/admin/crashes.js.map +1 -0
- package/dist/tools/admin/email-templates.d.ts +13 -0
- package/dist/tools/admin/email-templates.d.ts.map +1 -0
- package/dist/tools/admin/email-templates.js +203 -0
- package/dist/tools/admin/email-templates.js.map +1 -0
- package/dist/tools/admin/feedback.d.ts +14 -0
- package/dist/tools/admin/feedback.d.ts.map +1 -0
- package/dist/tools/admin/feedback.js +73 -0
- package/dist/tools/admin/feedback.js.map +1 -0
- package/dist/tools/admin/gift-codes.d.ts +14 -0
- package/dist/tools/admin/gift-codes.d.ts.map +1 -0
- package/dist/tools/admin/gift-codes.js +289 -0
- package/dist/tools/admin/gift-codes.js.map +1 -0
- package/dist/tools/admin/index.d.ts +10 -0
- package/dist/tools/admin/index.d.ts.map +1 -0
- package/dist/tools/admin/index.js +40 -0
- package/dist/tools/admin/index.js.map +1 -0
- package/dist/tools/admin/leaderboard.d.ts +14 -0
- package/dist/tools/admin/leaderboard.d.ts.map +1 -0
- package/dist/tools/admin/leaderboard.js +164 -0
- package/dist/tools/admin/leaderboard.js.map +1 -0
- package/dist/tools/admin/news.d.ts +14 -0
- package/dist/tools/admin/news.d.ts.map +1 -0
- package/dist/tools/admin/news.js +238 -0
- package/dist/tools/admin/news.js.map +1 -0
- package/dist/tools/admin/projects.d.ts +16 -0
- package/dist/tools/admin/projects.d.ts.map +1 -0
- package/dist/tools/admin/projects.js +217 -0
- package/dist/tools/admin/projects.js.map +1 -0
- package/dist/tools/admin/remote-config.d.ts +13 -0
- package/dist/tools/admin/remote-config.d.ts.map +1 -0
- package/dist/tools/admin/remote-config.js +184 -0
- package/dist/tools/admin/remote-config.js.map +1 -0
- package/dist/tools/admin/smtp.d.ts +20 -0
- package/dist/tools/admin/smtp.d.ts.map +1 -0
- package/dist/tools/admin/smtp.js +178 -0
- package/dist/tools/admin/smtp.js.map +1 -0
- package/dist/tools/admin/user-logs.d.ts +12 -0
- package/dist/tools/admin/user-logs.d.ts.map +1 -0
- package/dist/tools/admin/user-logs.js +56 -0
- package/dist/tools/admin/user-logs.js.map +1 -0
- package/dist/tools/admin/users.d.ts +15 -0
- package/dist/tools/admin/users.d.ts.map +1 -0
- package/dist/tools/admin/users.js +172 -0
- package/dist/tools/admin/users.js.map +1 -0
- package/dist/tools/admin-api-client.d.ts +13 -0
- package/dist/tools/admin-api-client.d.ts.map +1 -0
- package/dist/tools/admin-api-client.js +20 -0
- package/dist/tools/admin-api-client.js.map +1 -0
- package/dist/tools/api-client.d.ts +10 -2
- package/dist/tools/api-client.d.ts.map +1 -1
- package/dist/tools/api-client.js +51 -10
- package/dist/tools/api-client.js.map +1 -1
- package/dist/tools/email-sending.d.ts +3 -0
- package/dist/tools/email-sending.d.ts.map +1 -0
- package/dist/tools/email-sending.js +71 -0
- package/dist/tools/email-sending.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
- package/src/resources/docs/email-sending.md +172 -0
package/README.md
CHANGED
|
@@ -94,6 +94,62 @@ Workflow prompts that guide AI assistants through common horizOn tasks.
|
|
|
94
94
|
|
|
95
95
|
Resources (documentation) work without an API key. Only the live API tools require authentication.
|
|
96
96
|
|
|
97
|
+
## Admin Tools (v1.2+)
|
|
98
|
+
|
|
99
|
+
With an **Account-API-Key** (creatable in your horizOn Dashboard -> API Keys -> Create -> **MCP Account Key**), the MCP server exposes additional tools that let Claude manage your entire dashboard -- projects, remote config, news, email templates, gift codes, users, leaderboards, cloud-save data, crash reports, feedback, user logs, and SMTP.
|
|
100
|
+
|
|
101
|
+
### How to get your Account API Key
|
|
102
|
+
|
|
103
|
+
1. Log in to your [horizOn Dashboard](https://horizon.pm/dashboard)
|
|
104
|
+
2. Navigate to **API Keys** in the sidebar
|
|
105
|
+
3. Click **Create API Key**
|
|
106
|
+
4. Select **MCP Account Key** as the key type
|
|
107
|
+
5. Give your key a name (e.g. "My MCP Server")
|
|
108
|
+
6. Click **Create** -- your key will be shown **once**. Copy it immediately.
|
|
109
|
+
7. Add the key to your MCP configuration (see Setup below)
|
|
110
|
+
|
|
111
|
+
### Setup
|
|
112
|
+
|
|
113
|
+
Add both keys to your MCP client configuration:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"mcpServers": {
|
|
118
|
+
"horizOn": {
|
|
119
|
+
"command": "npx",
|
|
120
|
+
"args": ["-y", "horizon-mcp"],
|
|
121
|
+
"env": {
|
|
122
|
+
"HORIZON_API_KEY": "your-project-key (for player-facing tools)",
|
|
123
|
+
"HORIZON_ACCOUNT_API_KEY": "your-account-key (for dashboard tools)"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Both can be set together or individually. Admin tools only register when the account key is set -- otherwise the server exposes only the original player-facing tools.
|
|
131
|
+
|
|
132
|
+
### Scope
|
|
133
|
+
|
|
134
|
+
Admin tools inherit your account's tier (FREE/BASIC/PRO/ENTERPRISE) -- they grant no extra privileges. Platform-admin-only endpoints (Blog, Banner, System-Config) are automatically unreachable. A handful of ultra-sensitive endpoints (account deletion, credentials change, key management itself, subscription cancel) require a dashboard session and cannot be called via the account key.
|
|
135
|
+
|
|
136
|
+
### Tool Groups
|
|
137
|
+
|
|
138
|
+
| Prefix | Description |
|
|
139
|
+
|--------|-------------|
|
|
140
|
+
| `horizon_admin_projects_*` | Project API key management (create/update/regenerate/revoke/delete) |
|
|
141
|
+
| `horizon_admin_remoteconfig_*` | Remote config CRUD |
|
|
142
|
+
| `horizon_admin_news_*` | Multilingual news (titles/messages as `{lang: content}`) |
|
|
143
|
+
| `horizon_admin_emailtemplates_*` | Multilingual email templates with variables |
|
|
144
|
+
| `horizon_admin_giftcodes_*` | Gift code CRUD + revoke |
|
|
145
|
+
| `horizon_admin_users_*` | User management + statistics (no full-list needed) |
|
|
146
|
+
| `horizon_admin_leaderboard_*` | Leaderboard entries + statistics |
|
|
147
|
+
| `horizon_admin_cloudsave_*` | Cloud save data + statistics |
|
|
148
|
+
| `horizon_admin_crashes_*` | Crash groups, reports, statistics |
|
|
149
|
+
| `horizon_admin_feedback_*` | Read user feedback |
|
|
150
|
+
| `horizon_admin_userlogs_*` | Read user logs |
|
|
151
|
+
| `horizon_admin_smtp_*` | Account SMTP configuration (password always returned masked) |
|
|
152
|
+
|
|
97
153
|
## What is horizOn?
|
|
98
154
|
|
|
99
155
|
horizOn is a multi-tenant Backend-as-a-Service platform built for game and app developers. It provides a managed backend so developers can focus on building their game or app instead of server infrastructure.
|
|
@@ -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,
|
|
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,CA2T5D"}
|
package/dist/resources/index.js
CHANGED
|
@@ -204,6 +204,20 @@ export function registerAllResources(server) {
|
|
|
204
204
|
},
|
|
205
205
|
],
|
|
206
206
|
}));
|
|
207
|
+
// Email Sending
|
|
208
|
+
server.registerResource("docs-email-sending", "horizon://docs/email-sending", {
|
|
209
|
+
title: "Email Sending",
|
|
210
|
+
description: "Transactional and event-based email delivery to registered users. Templates, scheduling, status tracking, and SMTP integration. SDK examples.",
|
|
211
|
+
mimeType: "text/markdown",
|
|
212
|
+
}, () => ({
|
|
213
|
+
contents: [
|
|
214
|
+
{
|
|
215
|
+
uri: "horizon://docs/email-sending",
|
|
216
|
+
mimeType: "text/markdown",
|
|
217
|
+
text: loadDoc("docs/email-sending.md"),
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
}));
|
|
207
221
|
// Quickstart: Unreal
|
|
208
222
|
server.registerResource("quickstart-unreal", "horizon://quickstart/unreal", {
|
|
209
223
|
title: "Unreal Engine Quickstart",
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-client.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-api-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach, vi } from "vitest";
|
|
2
|
+
import { createAdminApiClientFromEnv } from "../admin-api-client.js";
|
|
3
|
+
import { HorizonApiClient } from "../api-client.js";
|
|
4
|
+
function mockFetchResponse(body, init) {
|
|
5
|
+
const status = init?.status ?? 200;
|
|
6
|
+
const ok = init?.ok ?? (status >= 200 && status < 300);
|
|
7
|
+
return vi.fn().mockResolvedValue({
|
|
8
|
+
ok,
|
|
9
|
+
status,
|
|
10
|
+
json: async () => body,
|
|
11
|
+
text: async () => (typeof body === "string" ? body : JSON.stringify(body)),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
describe("createAdminApiClientFromEnv", () => {
|
|
15
|
+
const originalKey = process.env.HORIZON_ACCOUNT_API_KEY;
|
|
16
|
+
const originalUrl = process.env.HORIZON_BASE_URL;
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
if (originalKey !== undefined) {
|
|
19
|
+
process.env.HORIZON_ACCOUNT_API_KEY = originalKey;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
delete process.env.HORIZON_ACCOUNT_API_KEY;
|
|
23
|
+
}
|
|
24
|
+
if (originalUrl !== undefined) {
|
|
25
|
+
process.env.HORIZON_BASE_URL = originalUrl;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
delete process.env.HORIZON_BASE_URL;
|
|
29
|
+
}
|
|
30
|
+
vi.unstubAllGlobals();
|
|
31
|
+
});
|
|
32
|
+
it("returns null without HORIZON_ACCOUNT_API_KEY", () => {
|
|
33
|
+
delete process.env.HORIZON_ACCOUNT_API_KEY;
|
|
34
|
+
expect(createAdminApiClientFromEnv()).toBeNull();
|
|
35
|
+
});
|
|
36
|
+
it("returns a HorizonApiClient when HORIZON_ACCOUNT_API_KEY is set", () => {
|
|
37
|
+
process.env.HORIZON_ACCOUNT_API_KEY = "test";
|
|
38
|
+
const client = createAdminApiClientFromEnv();
|
|
39
|
+
expect(client).not.toBeNull();
|
|
40
|
+
expect(client).toBeInstanceOf(HorizonApiClient);
|
|
41
|
+
});
|
|
42
|
+
it("uses X-Account-API-Key header for requests", async () => {
|
|
43
|
+
process.env.HORIZON_ACCOUNT_API_KEY = "test-key";
|
|
44
|
+
process.env.HORIZON_BASE_URL = "https://example.com";
|
|
45
|
+
const fakeFetch = mockFetchResponse({ ok: true });
|
|
46
|
+
vi.stubGlobal("fetch", fakeFetch);
|
|
47
|
+
const client = createAdminApiClientFromEnv();
|
|
48
|
+
await client.get("/api/v1/admin/ping");
|
|
49
|
+
expect(fakeFetch).toHaveBeenCalledTimes(1);
|
|
50
|
+
const [url, options] = fakeFetch.mock.calls[0];
|
|
51
|
+
expect(url).toBe("https://example.com/api/v1/admin/ping");
|
|
52
|
+
expect(options.headers["X-Account-API-Key"]).toBe("test-key");
|
|
53
|
+
expect(options.headers["X-API-Key"]).toBeUndefined();
|
|
54
|
+
expect(options.headers["Content-Type"]).toBe("application/json");
|
|
55
|
+
});
|
|
56
|
+
it("defaults baseUrl to https://horizon.pm", async () => {
|
|
57
|
+
process.env.HORIZON_ACCOUNT_API_KEY = "k";
|
|
58
|
+
delete process.env.HORIZON_BASE_URL;
|
|
59
|
+
const fakeFetch = mockFetchResponse({});
|
|
60
|
+
vi.stubGlobal("fetch", fakeFetch);
|
|
61
|
+
const client = createAdminApiClientFromEnv();
|
|
62
|
+
await client.get("/api/v1/admin/ping");
|
|
63
|
+
const [url] = fakeFetch.mock.calls[0];
|
|
64
|
+
expect(url).toBe("https://horizon.pm/api/v1/admin/ping");
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=admin-api-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-client.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-api-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-e2e.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-e2e.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { createAdminApiClientFromEnv } from "../admin-api-client.js";
|
|
3
|
+
const hasEnv = !!process.env.HORIZON_ACCOUNT_API_KEY;
|
|
4
|
+
describe.skipIf(!hasEnv)("admin api e2e", () => {
|
|
5
|
+
it("GET /admin/api-keys with keyType=PROJECT returns successfully", async () => {
|
|
6
|
+
const client = createAdminApiClientFromEnv();
|
|
7
|
+
const result = await client.get("/api/v1/admin/api-keys", {
|
|
8
|
+
keyType: "PROJECT",
|
|
9
|
+
size: "1",
|
|
10
|
+
});
|
|
11
|
+
expect(result).toBeDefined();
|
|
12
|
+
});
|
|
13
|
+
it("GET /admin/user-management/statistics returns stats shape", async () => {
|
|
14
|
+
const client = createAdminApiClientFromEnv();
|
|
15
|
+
const result = (await client.get("/api/v1/admin/user-management/statistics"));
|
|
16
|
+
expect(result).toHaveProperty("totalUsers");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=admin-e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-e2e.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/admin-e2e.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;AAErD,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,2BAA2B,EAAG,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE;YACxD,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,GAAG;SACV,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,GAAG,2BAA2B,EAAG,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAC9B,0CAA0C,CAC3C,CAAQ,CAAC;QACV,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for admin-tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the player-side helpers in ../tool-helpers.ts but tailored
|
|
5
|
+
* for the account-key surface:
|
|
6
|
+
*
|
|
7
|
+
* - getAdminClient() — lazy factory, returns null when unconfigured
|
|
8
|
+
* - noAdminClientResponse() — consistent error when the key is missing
|
|
9
|
+
* - jsonResponse() — pretty-print arbitrary JSON payloads
|
|
10
|
+
* - errorResponse() — surface thrown errors to the caller
|
|
11
|
+
*/
|
|
12
|
+
type ToolContent = {
|
|
13
|
+
type: "text";
|
|
14
|
+
text: string;
|
|
15
|
+
};
|
|
16
|
+
type ToolResult = {
|
|
17
|
+
content: ToolContent[];
|
|
18
|
+
isError?: boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function getAdminClient(): import("../api-client.js").HorizonApiClient | null;
|
|
21
|
+
export declare function noAdminClientResponse(): ToolResult;
|
|
22
|
+
export declare function jsonResponse<T>(data: T): ToolResult;
|
|
23
|
+
export declare function errorResponse(error: unknown): ToolResult;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=_utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.d.ts","sourceRoot":"","sources":["../../../src/tools/admin/_utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAClD,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhE,wBAAgB,cAAc,uDAE7B;AAED,wBAAgB,qBAAqB,IAAI,UAAU,CAWlD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CASnD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAmBxD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for admin-tool handlers.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the player-side helpers in ../tool-helpers.ts but tailored
|
|
5
|
+
* for the account-key surface:
|
|
6
|
+
*
|
|
7
|
+
* - getAdminClient() — lazy factory, returns null when unconfigured
|
|
8
|
+
* - noAdminClientResponse() — consistent error when the key is missing
|
|
9
|
+
* - jsonResponse() — pretty-print arbitrary JSON payloads
|
|
10
|
+
* - errorResponse() — surface thrown errors to the caller
|
|
11
|
+
*/
|
|
12
|
+
import { createAdminApiClientFromEnv } from "../admin-api-client.js";
|
|
13
|
+
import { HorizonApiError } from "../api-client.js";
|
|
14
|
+
export function getAdminClient() {
|
|
15
|
+
return createAdminApiClientFromEnv();
|
|
16
|
+
}
|
|
17
|
+
export function noAdminClientResponse() {
|
|
18
|
+
return {
|
|
19
|
+
content: [
|
|
20
|
+
{
|
|
21
|
+
type: "text",
|
|
22
|
+
text: "HORIZON_ACCOUNT_API_KEY is not configured. Admin tools require an account-level API key.",
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
isError: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function jsonResponse(data) {
|
|
29
|
+
return {
|
|
30
|
+
content: [
|
|
31
|
+
{
|
|
32
|
+
type: "text",
|
|
33
|
+
text: JSON.stringify(data, null, 2),
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function errorResponse(error) {
|
|
39
|
+
let message;
|
|
40
|
+
if (error instanceof HorizonApiError) {
|
|
41
|
+
message = `horizOn API error (HTTP ${error.status}): ${error.body}`;
|
|
42
|
+
}
|
|
43
|
+
else if (error instanceof Error) {
|
|
44
|
+
message = `Error: ${error.message}`;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
message = `Unknown error: ${String(error)}`;
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
content: [
|
|
51
|
+
{
|
|
52
|
+
type: "text",
|
|
53
|
+
text: message,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
isError: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=_utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_utils.js","sourceRoot":"","sources":["../../../src/tools/admin/_utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKnD,MAAM,UAAU,cAAc;IAC5B,OAAO,2BAA2B,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EACF,0FAA0F;aAC7F;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAI,IAAO;IACrC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAe,CAAC;IACpB,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO,GAAG,2BAA2B,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,GAAG,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,kBAAkB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,OAAO;aACd;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin tools for managing cloud saves.
|
|
3
|
+
*
|
|
4
|
+
* Cloud saves are per-user, per-project blobs produced by the runtime
|
|
5
|
+
* app's save API. These tools wrap the /api/v1/admin/cloud-save
|
|
6
|
+
* endpoints so callers can list, fetch, update, delete and inspect
|
|
7
|
+
* statistics/limits from the MCP surface.
|
|
8
|
+
*
|
|
9
|
+
* All tools require HORIZON_ACCOUNT_API_KEY.
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
12
|
+
export declare function registerAdminCloudSaveTools(server: McpServer): void;
|
|
13
|
+
//# sourceMappingURL=cloud-save.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-save.d.ts","sourceRoot":"","sources":["../../../src/tools/admin/cloud-save.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkLnE"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin tools for managing cloud saves.
|
|
3
|
+
*
|
|
4
|
+
* Cloud saves are per-user, per-project blobs produced by the runtime
|
|
5
|
+
* app's save API. These tools wrap the /api/v1/admin/cloud-save
|
|
6
|
+
* endpoints so callers can list, fetch, update, delete and inspect
|
|
7
|
+
* statistics/limits from the MCP surface.
|
|
8
|
+
*
|
|
9
|
+
* All tools require HORIZON_ACCOUNT_API_KEY.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from "zod/v4";
|
|
12
|
+
import { getAdminClient, noAdminClientResponse, jsonResponse, errorResponse, } from "./_utils.js";
|
|
13
|
+
export function registerAdminCloudSaveTools(server) {
|
|
14
|
+
server.registerTool("horizon_admin_cloudsave_list", {
|
|
15
|
+
title: "List Cloud Saves",
|
|
16
|
+
description: "Lists cloud saves for the authenticated account, optionally filtered by project API key. Default sort is createdAt DESC.",
|
|
17
|
+
inputSchema: {
|
|
18
|
+
projectApiKeyId: z
|
|
19
|
+
.string()
|
|
20
|
+
.uuid()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Optional UUID of the project API key to filter saves by"),
|
|
23
|
+
page: z.number().int().min(0).default(0).describe("0-based page index"),
|
|
24
|
+
size: z
|
|
25
|
+
.number()
|
|
26
|
+
.int()
|
|
27
|
+
.min(1)
|
|
28
|
+
.max(100)
|
|
29
|
+
.default(20)
|
|
30
|
+
.describe("items per page (1-100)"),
|
|
31
|
+
},
|
|
32
|
+
}, async ({ projectApiKeyId, page, size }) => {
|
|
33
|
+
const client = getAdminClient();
|
|
34
|
+
if (!client)
|
|
35
|
+
return noAdminClientResponse();
|
|
36
|
+
try {
|
|
37
|
+
const params = {
|
|
38
|
+
page: String(page),
|
|
39
|
+
size: String(size),
|
|
40
|
+
};
|
|
41
|
+
if (projectApiKeyId !== undefined)
|
|
42
|
+
params.apiKeyId = projectApiKeyId;
|
|
43
|
+
const result = await client.get("/api/v1/admin/cloud-save", params);
|
|
44
|
+
return jsonResponse(result);
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
return errorResponse(e);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
server.registerTool("horizon_admin_cloudsave_get", {
|
|
51
|
+
title: "Get Cloud Save",
|
|
52
|
+
description: "Fetches a single cloud save by its UUID, including the full saveData payload.",
|
|
53
|
+
inputSchema: {
|
|
54
|
+
id: z.string().uuid().describe("UUID of the cloud save to fetch"),
|
|
55
|
+
},
|
|
56
|
+
}, async ({ id }) => {
|
|
57
|
+
const client = getAdminClient();
|
|
58
|
+
if (!client)
|
|
59
|
+
return noAdminClientResponse();
|
|
60
|
+
try {
|
|
61
|
+
const result = await client.get(`/api/v1/admin/cloud-save/${id}`);
|
|
62
|
+
return jsonResponse(result);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
return errorResponse(e);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
server.registerTool("horizon_admin_cloudsave_update", {
|
|
69
|
+
title: "Update Cloud Save",
|
|
70
|
+
description: "Replaces the saveData of an existing cloud save. The backend enforces both a hard 300KB request limit and a soft per-tier byte limit.",
|
|
71
|
+
inputSchema: {
|
|
72
|
+
id: z.string().uuid().describe("UUID of the cloud save to update"),
|
|
73
|
+
data: z
|
|
74
|
+
.string()
|
|
75
|
+
.min(1)
|
|
76
|
+
.max(300000)
|
|
77
|
+
.describe("New save data (plain string or Base64, <= 300000 chars / ~300KB)"),
|
|
78
|
+
},
|
|
79
|
+
}, async ({ id, data }) => {
|
|
80
|
+
const client = getAdminClient();
|
|
81
|
+
if (!client)
|
|
82
|
+
return noAdminClientResponse();
|
|
83
|
+
try {
|
|
84
|
+
const result = await client.put(`/api/v1/admin/cloud-save/${id}`, { saveData: data });
|
|
85
|
+
return jsonResponse(result);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return errorResponse(e);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
server.registerTool("horizon_admin_cloudsave_delete", {
|
|
92
|
+
title: "Delete Cloud Save",
|
|
93
|
+
description: "Soft-deletes a cloud save. Deleted saves are no longer accessible to end-users and disappear from list results.",
|
|
94
|
+
inputSchema: {
|
|
95
|
+
id: z.string().uuid().describe("UUID of the cloud save to delete"),
|
|
96
|
+
},
|
|
97
|
+
}, async ({ id }) => {
|
|
98
|
+
const client = getAdminClient();
|
|
99
|
+
if (!client)
|
|
100
|
+
return noAdminClientResponse();
|
|
101
|
+
try {
|
|
102
|
+
const result = await client.delete(`/api/v1/admin/cloud-save/${id}`);
|
|
103
|
+
return jsonResponse(result);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
return errorResponse(e);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
server.registerTool("horizon_admin_cloudsave_getStats", {
|
|
110
|
+
title: "Get Cloud Save Statistics",
|
|
111
|
+
description: "Returns aggregated cloud save statistics for the authenticated account (totals, storage used in bytes/KB/MB, average size, per-project breakdown). Note: the current backend endpoint is account-scoped; projectApiKeyId is reserved for forward-compat.",
|
|
112
|
+
inputSchema: {
|
|
113
|
+
projectApiKeyId: z
|
|
114
|
+
.string()
|
|
115
|
+
.uuid()
|
|
116
|
+
.optional()
|
|
117
|
+
.describe("Optional UUID of the project API key. Currently ignored by the backend; kept for forward-compat."),
|
|
118
|
+
},
|
|
119
|
+
}, async () => {
|
|
120
|
+
const client = getAdminClient();
|
|
121
|
+
if (!client)
|
|
122
|
+
return noAdminClientResponse();
|
|
123
|
+
try {
|
|
124
|
+
const result = await client.get("/api/v1/admin/cloud-save/statistics");
|
|
125
|
+
return jsonResponse(result);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
return errorResponse(e);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
server.registerTool("horizon_admin_cloudsave_getLimits", {
|
|
132
|
+
title: "Get Cloud Save Limits",
|
|
133
|
+
description: "Returns the cloud save limits and current usage for the authenticated account (role, max bytes per save, current count, current storage used). Note: the current backend endpoint is account-scoped; projectApiKeyId is reserved for forward-compat.",
|
|
134
|
+
inputSchema: {
|
|
135
|
+
projectApiKeyId: z
|
|
136
|
+
.string()
|
|
137
|
+
.uuid()
|
|
138
|
+
.optional()
|
|
139
|
+
.describe("Optional UUID of the project API key. Currently ignored by the backend; kept for forward-compat."),
|
|
140
|
+
},
|
|
141
|
+
}, async () => {
|
|
142
|
+
const client = getAdminClient();
|
|
143
|
+
if (!client)
|
|
144
|
+
return noAdminClientResponse();
|
|
145
|
+
try {
|
|
146
|
+
const result = await client.get("/api/v1/admin/cloud-save/limits");
|
|
147
|
+
return jsonResponse(result);
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
return errorResponse(e);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=cloud-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-save.js","sourceRoot":"","sources":["../../../src/tools/admin/cloud-save.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin tools for crash reporting.
|
|
3
|
+
*
|
|
4
|
+
* Crash reports are grouped by a deduplication hash on the backend so
|
|
5
|
+
* "crash groups" represent unique crash signatures with many
|
|
6
|
+
* occurrences. These tools wrap the /api/v1/admin/crash-reports
|
|
7
|
+
* endpoints and cover:
|
|
8
|
+
* - listing and fetching crash groups
|
|
9
|
+
* - updating group status and notes
|
|
10
|
+
* - listing occurrences per group
|
|
11
|
+
* - fetching a specific report
|
|
12
|
+
* - account-level stats
|
|
13
|
+
* - deleting a group (soft delete)
|
|
14
|
+
*
|
|
15
|
+
* All tools require HORIZON_ACCOUNT_API_KEY.
|
|
16
|
+
*/
|
|
17
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
18
|
+
export declare function registerAdminCrashesTools(server: McpServer): void;
|
|
19
|
+
//# sourceMappingURL=crashes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crashes.d.ts","sourceRoot":"","sources":["../../../src/tools/admin/crashes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsRjE"}
|