@realmkeep/mcp 0.1.0 → 0.2.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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # @realmkeep/mcp
2
2
 
3
3
  Lets an AI assistant (Claude, Codex, Cursor) fill in a Realmkeep game listing for you.
4
- It creates and edits a **draft**. You open the link it gives you, add images and press
5
- Submit, so the site's spam and review checks still apply.
4
+ It creates and edits a **draft**, images included. You open the link it gives you, check it
5
+ and press Submit, so the site's spam and review checks still apply.
6
6
 
7
7
  1. Create an account-wide API key at `/dashboard/api-keys`. Keys scoped to one listing
8
8
  cannot create new listings.
@@ -39,5 +39,18 @@ env = { REALMKEEP_API_KEY = "rk_your_key" }
39
39
 
40
40
  `REALMKEEP_URL` overrides the site address (default `https://realmkeep.gg`).
41
41
 
42
- Tools: `list_taxonomy`, `list_listings`, `create_listing_draft`, `get_listing`,
43
- `update_listing`. The API is documented at `/docs/api`.
42
+ ## Tools
43
+
44
+ Every tool writes drafts only. None of them submits a listing: the person does that in the
45
+ dashboard, so the site's checks still apply.
46
+
47
+ | Tool | Parameters | What it does |
48
+ | --- | --- | --- |
49
+ | `list_taxonomy` | none | Lists the platforms, genres, themes, engines and player modes a listing can carry. |
50
+ | `list_listings` | none | Lists the account's listings with id, name and state. |
51
+ | `create_listing_draft` | `name` | Creates a draft from a game name and returns it with a `missing` list. |
52
+ | `get_listing` | `id` | Reads one listing: every field, its links and terms, and what is still missing. |
53
+ | `upload_listing_image` | `listingId`, `path`, `role` (`banner`, `logo` or `screenshot`), `altText` | Reads an image file from your computer and uploads it to a draft. A banner or logo replaces the existing one, screenshots are added. PNG, JPEG, WebP or AVIF up to 8 MB; `altText` is required. Refused once the listing is submitted. |
54
+ | `update_listing` | `id`, then any of `name`, `tagline`, `descriptionMarkdown`, `playUrl`, `contactEmail`, `launchStatus`, `nsfw`, `links`, `platforms`, `genres`, `themes`, `engines`, `playerModes` and the other listing fields | Fills in a subset of a draft. Send only what changes, `null` clears an optional field. Refused once the listing is submitted. |
55
+
56
+ The API behind them is documented at `/docs/api`, and described in `/openapi.json`.
package/dist/client.d.ts CHANGED
@@ -15,6 +15,8 @@ export declare class RealmkeepError extends Error {
15
15
  }
16
16
  export interface RealmkeepClient {
17
17
  request(method: string, path: string, body?: unknown): Promise<unknown>;
18
+ /** POST a multipart form, for the one endpoint that takes a file. */
19
+ upload(path: string, form: FormData): Promise<unknown>;
18
20
  }
19
21
  export declare function createClient(options: ClientOptions): RealmkeepClient;
20
22
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACxE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,CAmCpE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;gBADZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACvE,qEAAqE;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACvD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,eAAe,CA2CpE"}
package/dist/client.js CHANGED
@@ -16,31 +16,33 @@ export class RealmkeepError extends Error {
16
16
  export function createClient(options) {
17
17
  const doFetch = options.fetch ?? fetch;
18
18
  const base = options.baseUrl.replace(/\/$/, '');
19
+ async function send(path, init, headers) {
20
+ const response = await doFetch(`${base}/api/v1${path}`, {
21
+ ...init,
22
+ headers: {
23
+ authorization: `Bearer ${options.apiKey}`,
24
+ accept: 'application/json',
25
+ ...headers,
26
+ },
27
+ });
28
+ const text = await response.text();
29
+ let json;
30
+ try {
31
+ json = text === '' ? null : JSON.parse(text);
32
+ }
33
+ catch {
34
+ json = null;
35
+ }
36
+ if (!response.ok) {
37
+ const error = json?.error;
38
+ throw new RealmkeepError(response.status, error?.code ?? 'http_error', error?.message ?? `Realmkeep answered ${response.status}`);
39
+ }
40
+ return json;
41
+ }
19
42
  return {
20
- async request(method, path, body) {
21
- const response = await doFetch(`${base}/api/v1${path}`, {
22
- method,
23
- headers: {
24
- authorization: `Bearer ${options.apiKey}`,
25
- 'content-type': 'application/json',
26
- accept: 'application/json',
27
- },
28
- ...(body === undefined ? {} : { body: JSON.stringify(body) }),
29
- });
30
- const text = await response.text();
31
- let json;
32
- try {
33
- json = text === '' ? null : JSON.parse(text);
34
- }
35
- catch {
36
- json = null;
37
- }
38
- if (!response.ok) {
39
- const error = json?.error;
40
- throw new RealmkeepError(response.status, error?.code ?? 'http_error', error?.message ?? `Realmkeep answered ${response.status}`);
41
- }
42
- return json;
43
- },
43
+ request: (method, path, body) => send(path, { method, ...(body === undefined ? {} : { body: JSON.stringify(body) }) }, { 'content-type': 'application/json' }),
44
+ // No content-type here: fetch sets it, with the boundary, from the FormData.
45
+ upload: (path, form) => send(path, { method: 'POST', body: form }, {}),
44
46
  };
45
47
  }
46
48
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B;IACA;IAFX,YACW,MAAc,EACd,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAJL,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAMD,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE/C,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI;YAC9B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,EAAE;gBACtD,MAAM;gBACN,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;oBACzC,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;aAC9D,CAAC,CAAA;YAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAClC,IAAI,IAAa,CAAA;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,IAAI,CAAA;YACb,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAI,IAA+D,EAAE,KAAK,CAAA;gBACrF,MAAM,IAAI,cAAc,CACtB,QAAQ,CAAC,MAAM,EACf,KAAK,EAAE,IAAI,IAAI,YAAY,EAC3B,KAAK,EAAE,OAAO,IAAI,sBAAsB,QAAQ,CAAC,MAAM,EAAE,CAC1D,CAAA;YACH,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAE5B;IACA;IAFX,YACW,MAAc,EACd,IAAY,EACrB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;QAJL,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAQ;QAIrB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAQD,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAA;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAE/C,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,IAAiB,EAAE,OAA+B;QAClF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,UAAU,IAAI,EAAE,EAAE;YACtD,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE;gBACzC,MAAM,EAAE,kBAAkB;gBAC1B,GAAG,OAAO;aACX;SACF,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QAClC,IAAI,IAAa,CAAA;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAI,IAA+D,EAAE,KAAK,CAAA;YACrF,MAAM,IAAI,cAAc,CACtB,QAAQ,CAAC,MAAM,EACf,KAAK,EAAE,IAAI,IAAI,YAAY,EAC3B,KAAK,EAAE,OAAO,IAAI,sBAAsB,QAAQ,CAAC,MAAM,EAAE,CAC1D,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAC9B,IAAI,CACF,IAAI,EACJ,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EACzE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CACvC;QACH,6EAA6E;QAC7E,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;KACvE,CAAA;AACH,CAAC"}
package/dist/server.js CHANGED
@@ -2,7 +2,7 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { RealmkeepError } from './client.js';
3
3
  import { tools } from './tools.js';
4
4
  export function createServer(client) {
5
- const server = new McpServer({ name: 'realmkeep', version: '0.1.0' });
5
+ const server = new McpServer({ name: 'realmkeep', version: '0.2.0' });
6
6
  for (const tool of tools) {
7
7
  server.tool(tool.name, tool.description, tool.shape, async (args) => {
8
8
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkBlD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoChB,CAAA;AAEV,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,CAAC,CAAC,WAAW,CAAA;IACpB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9E;AAKD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAiDhC,CAAA"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAkBlD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoChB,CAAA;AAEV,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,CAAC,CAAC,WAAW,CAAA;IACpB,GAAG,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC9E;AAgBD,eAAO,MAAM,KAAK,EAAE,SAAS,IAAI,EAmFhC,CAAA"}
package/dist/tools.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { readFile, stat } from 'node:fs/promises';
2
+ import { basename, extname } from 'node:path';
1
3
  import { z } from 'zod';
2
4
  /**
3
5
  * The tools an AI assistant gets. Each is a single API call and returns the site's own
@@ -47,7 +49,16 @@ export const listingFields = {
47
49
  engines: TERMS.describe('At most one engine'),
48
50
  playerModes: TERMS,
49
51
  };
50
- const HAND_OVER = 'You cannot submit a listing or upload images. When the draft is filled in, give the person the dashboardUrl so they can add images and press Submit.';
52
+ const HAND_OVER = 'You cannot submit a listing. When the draft is filled in, give the person the dashboardUrl so they can check it and press Submit.';
53
+ const IMAGE_TYPES = {
54
+ '.png': 'image/png',
55
+ '.jpg': 'image/jpeg',
56
+ '.jpeg': 'image/jpeg',
57
+ '.webp': 'image/webp',
58
+ '.avif': 'image/avif',
59
+ };
60
+ /** The size the site accepts, checked here so a huge file is not read into memory first. */
61
+ const MAX_IMAGE_BYTES = 8 * 1024 * 1024;
51
62
  export const tools = [
52
63
  {
53
64
  name: 'list_taxonomy',
@@ -73,6 +84,39 @@ export const tools = [
73
84
  shape: { id: z.string().describe('Listing id') },
74
85
  run: (client, args) => client.request('GET', `/listings/${encodeURIComponent(String(args['id']))}`),
75
86
  },
87
+ {
88
+ name: 'upload_listing_image',
89
+ description: 'Upload an image from a file on this computer to a draft listing. role is banner (wide, at least 1600 px across), logo (square, at least 512 px) or screenshot (at least 1600 px across). A banner or logo replaces the existing one; screenshots are added. altText is required: describe what the image shows. PNG, JPEG, WebP or AVIF up to 8 MB. Only drafts accept uploads.',
90
+ shape: {
91
+ listingId: z.string().describe('Listing id'),
92
+ path: z.string().describe('Path of the image file on the local machine'),
93
+ role: z.enum(['banner', 'logo', 'screenshot']),
94
+ altText: z.string().describe('What the image shows, up to 300 characters'),
95
+ },
96
+ run: async (client, args) => {
97
+ const path = String(args['path']);
98
+ const type = IMAGE_TYPES[extname(path).toLowerCase()];
99
+ if (type === undefined) {
100
+ throw new Error('The file must be a .png, .jpg, .jpeg, .webp or .avif image');
101
+ }
102
+ const info = await stat(path);
103
+ if (!info.isFile()) {
104
+ throw new Error('The path must be a regular image file');
105
+ }
106
+ if (info.size > MAX_IMAGE_BYTES) {
107
+ throw new Error('The file is larger than 8 MB. Save it at a lower quality and try again.');
108
+ }
109
+ const bytes = await readFile(path);
110
+ if (bytes.byteLength > MAX_IMAGE_BYTES) {
111
+ throw new Error('The file is larger than 8 MB. Save it at a lower quality and try again.');
112
+ }
113
+ const form = new FormData();
114
+ form.set('file', new File([new Uint8Array(bytes)], basename(path), { type }));
115
+ form.set('role', String(args['role']));
116
+ form.set('altText', String(args['altText']));
117
+ return client.upload(`/listings/${encodeURIComponent(String(args['listingId']))}/media`, form);
118
+ },
119
+ },
76
120
  {
77
121
  name: 'update_listing',
78
122
  description: `Fill in any subset of a draft listing. Send only the fields you want to change; null clears an optional field. Only drafts can be changed. ${HAND_OVER}`,
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@realmkeep/mcp",
3
- "version": "0.1.0",
3
+ "mcpName": "io.github.mortek/realmkeep",
4
+ "version": "0.2.0",
4
5
  "description": "MCP server that lets an AI assistant fill in a Realmkeep game listing as a draft",
5
6
  "type": "module",
6
7
  "main": "./dist/index.js",