@joinquest/mcp-integration 0.1.0 → 0.1.2

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
@@ -16,7 +16,7 @@ stdio MCP server for **game developers** integrating with JoinQuest. Exposes dev
16
16
  "joinquest-integration": {
17
17
  "type": "stdio",
18
18
  "command": "npx",
19
- "args": ["-y", "@joinquest/mcp-integration", "joinquest-integration-mcp-cursor"],
19
+ "args": ["--yes", "--package", "@joinquest/mcp-integration", "joinquest-integration-mcp-cursor"],
20
20
  "env": {
21
21
  "JOINQUEST_API_KEY": "lq_dev_..."
22
22
  }
@@ -79,6 +79,7 @@ Maintainers: `./scripts/publish-joinquest-mcp.sh` (requires npm login + `@joinqu
79
79
  | `joinquest_integration_get_discovery_prompt` | Agent interview script |
80
80
  | `joinquest_integration_get_catalog_tag_taxonomy` | Valid tag IDs |
81
81
  | `joinquest_integration_list_my_games` | Owner's games + visibility |
82
+ | `joinquest_integration_register_game` | Register a new game (confirm fields with developer first) |
82
83
  | `joinquest_integration_get_game_checks` | Checklist + metadata |
83
84
  | `joinquest_integration_run_game_checks` | Run manifest / provision / JWT suite |
84
85
  | `joinquest_integration_update_game_metadata` | Save catalog copy + tags |
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from 'node:child_process'
4
+ import { fileURLToPath } from 'node:url'
5
+ import { dirname, join } from 'node:path'
6
+
7
+ // Cursor injects ELECTRON_RUN_AS_NODE and a bundled node on PATH, which breaks stdio MCP.
8
+ delete process.env.ELECTRON_RUN_AS_NODE
9
+
10
+ const root = join(dirname(fileURLToPath(import.meta.url)), '..')
11
+ const entry = join(root, 'src/index.js')
12
+ const node = process.env.JOINQUEST_NODE || process.execPath
13
+
14
+ const child = spawn(node, [entry], { stdio: 'inherit', env: process.env })
15
+ child.on('exit', (code, signal) => {
16
+ if (signal) {
17
+ process.kill(process.pid, signal)
18
+ return
19
+ }
20
+ process.exit(code ?? 1)
21
+ })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joinquest/mcp-integration",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "JoinQuest integration MCP server for game developer agents",
5
5
  "type": "module",
6
6
  "private": false,
@@ -30,8 +30,9 @@
30
30
  "access": "public"
31
31
  },
32
32
  "bin": {
33
+ "mcp-integration": "src/index.js",
33
34
  "joinquest-integration-mcp": "src/index.js",
34
- "joinquest-integration-mcp-cursor": "bin/joinquest-integration-mcp-cursor"
35
+ "joinquest-integration-mcp-cursor": "bin/joinquest-integration-mcp-cursor.js"
35
36
  },
36
37
  "scripts": {
37
38
  "start": "node src/index.js",
package/src/graphql.js CHANGED
@@ -143,4 +143,21 @@ export const MUTATIONS = {
143
143
  }
144
144
  }
145
145
  `,
146
+ registerMyGame: `
147
+ mutation RegisterMyGame($input: RegisterMyGameInput!) {
148
+ registerMyGame(input: $input) {
149
+ connected
150
+ connectError
151
+ webhookSecret
152
+ serviceToken
153
+ game {
154
+ id
155
+ slug
156
+ name
157
+ visibility
158
+ apiBaseUrl
159
+ }
160
+ }
161
+ }
162
+ `,
146
163
  }
package/src/tools.js CHANGED
@@ -92,6 +92,51 @@ export function registerJoinQuestIntegrationTools(server, config) {
92
92
  },
93
93
  )
94
94
 
95
+ server.registerTool(
96
+ 'joinquest_integration_register_game',
97
+ {
98
+ description:
99
+ 'Register a new game on JoinQuest for the authenticated developer. JoinQuest probes the public HTTPS apiBaseUrl (healthz + game-modes). Confirm field values with the developer before calling. Returns game id, visibility, serviceToken, webhookSecret, and connectError if the API is unreachable.',
100
+ inputSchema: z.object({
101
+ name: z.string().describe('Display name'),
102
+ slug: z.string().describe('Lowercase URL slug (unique on JoinQuest)'),
103
+ shortDescription: z.string().describe('Initial catalog card blurb (~1–2 sentences)'),
104
+ apiBaseUrl: z
105
+ .string()
106
+ .describe('Public HTTPS origin for the game API, e.g. https://mygame.example.com'),
107
+ contactEmail: z.string().describe('Email for review notifications'),
108
+ websiteUrl: z.string().optional().describe('Optional marketing or docs URL'),
109
+ communityUrl: z.string().optional().describe('Optional Discord or community URL'),
110
+ }),
111
+ },
112
+ async ({
113
+ name,
114
+ slug,
115
+ shortDescription,
116
+ apiBaseUrl,
117
+ contactEmail,
118
+ websiteUrl,
119
+ communityUrl,
120
+ }) => {
121
+ const input = {
122
+ name,
123
+ slug,
124
+ shortDescription,
125
+ apiBaseUrl,
126
+ contactEmail,
127
+ }
128
+ if (websiteUrl !== undefined) {
129
+ input.websiteUrl = websiteUrl
130
+ }
131
+ if (communityUrl !== undefined) {
132
+ input.communityUrl = communityUrl
133
+ }
134
+
135
+ const data = await gql(MUTATIONS.registerMyGame, { input })
136
+ return textResult(data.registerMyGame)
137
+ },
138
+ )
139
+
95
140
  server.registerTool(
96
141
  'joinquest_integration_get_game_checks',
97
142
  {
@@ -1,11 +0,0 @@
1
- #!/bin/bash
2
- # Cursor injects ELECTRON_RUN_AS_NODE and a bundled node on PATH, which breaks stdio MCP.
3
- set -eu
4
-
5
- unset ELECTRON_RUN_AS_NODE
6
- export PATH="/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:${PATH:-}"
7
-
8
- DIR="$(cd "$(dirname "$0")" && pwd)"
9
- NODE="${JOINQUEST_NODE:-$(command -v node)}"
10
-
11
- exec "$NODE" "$DIR/../src/index.js"