@restforgejs/mcp-server 1.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.
Files changed (135) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +149 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +7 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/env-parser.d.ts +30 -0
  7. package/dist/lib/env-parser.js +150 -0
  8. package/dist/lib/env-parser.js.map +1 -0
  9. package/dist/lib/exec.d.ts +29 -0
  10. package/dist/lib/exec.js +38 -0
  11. package/dist/lib/exec.js.map +1 -0
  12. package/dist/server.d.ts +1 -0
  13. package/dist/server.js +220 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/tools/codegen/create-dashboard.d.ts +2 -0
  16. package/dist/tools/codegen/create-dashboard.js +256 -0
  17. package/dist/tools/codegen/create-dashboard.js.map +1 -0
  18. package/dist/tools/codegen/create-endpoint.d.ts +2 -0
  19. package/dist/tools/codegen/create-endpoint.js +263 -0
  20. package/dist/tools/codegen/create-endpoint.js.map +1 -0
  21. package/dist/tools/codegen/dbschema-generate-ddl.d.ts +2 -0
  22. package/dist/tools/codegen/dbschema-generate-ddl.js +187 -0
  23. package/dist/tools/codegen/dbschema-generate-ddl.js.map +1 -0
  24. package/dist/tools/codegen/dbschema-init.d.ts +2 -0
  25. package/dist/tools/codegen/dbschema-init.js +158 -0
  26. package/dist/tools/codegen/dbschema-init.js.map +1 -0
  27. package/dist/tools/codegen/dbschema-introspect.d.ts +2 -0
  28. package/dist/tools/codegen/dbschema-introspect.js +241 -0
  29. package/dist/tools/codegen/dbschema-introspect.js.map +1 -0
  30. package/dist/tools/codegen/dbschema-migrate.d.ts +2 -0
  31. package/dist/tools/codegen/dbschema-migrate.js +219 -0
  32. package/dist/tools/codegen/dbschema-migrate.js.map +1 -0
  33. package/dist/tools/codegen/dbschema-models.d.ts +2 -0
  34. package/dist/tools/codegen/dbschema-models.js +146 -0
  35. package/dist/tools/codegen/dbschema-models.js.map +1 -0
  36. package/dist/tools/codegen/dbschema-validate.d.ts +2 -0
  37. package/dist/tools/codegen/dbschema-validate.js +153 -0
  38. package/dist/tools/codegen/dbschema-validate.js.map +1 -0
  39. package/dist/tools/codegen/describe-table.d.ts +2 -0
  40. package/dist/tools/codegen/describe-table.js +259 -0
  41. package/dist/tools/codegen/describe-table.js.map +1 -0
  42. package/dist/tools/codegen/diff-payload.d.ts +2 -0
  43. package/dist/tools/codegen/diff-payload.js +165 -0
  44. package/dist/tools/codegen/diff-payload.js.map +1 -0
  45. package/dist/tools/codegen/generate-payload.d.ts +2 -0
  46. package/dist/tools/codegen/generate-payload.js +145 -0
  47. package/dist/tools/codegen/generate-payload.js.map +1 -0
  48. package/dist/tools/codegen/get-dashboard-catalog.d.ts +2 -0
  49. package/dist/tools/codegen/get-dashboard-catalog.js +213 -0
  50. package/dist/tools/codegen/get-dashboard-catalog.js.map +1 -0
  51. package/dist/tools/codegen/get-dbschema-catalog.d.ts +2 -0
  52. package/dist/tools/codegen/get-dbschema-catalog.js +244 -0
  53. package/dist/tools/codegen/get-dbschema-catalog.js.map +1 -0
  54. package/dist/tools/codegen/get-field-validation-catalog.d.ts +2 -0
  55. package/dist/tools/codegen/get-field-validation-catalog.js +186 -0
  56. package/dist/tools/codegen/get-field-validation-catalog.js.map +1 -0
  57. package/dist/tools/codegen/get-query-declarative-catalog.d.ts +2 -0
  58. package/dist/tools/codegen/get-query-declarative-catalog.js +200 -0
  59. package/dist/tools/codegen/get-query-declarative-catalog.js.map +1 -0
  60. package/dist/tools/codegen/index.d.ts +2 -0
  61. package/dist/tools/codegen/index.js +43 -0
  62. package/dist/tools/codegen/index.js.map +1 -0
  63. package/dist/tools/codegen/list-tables.d.ts +2 -0
  64. package/dist/tools/codegen/list-tables.js +220 -0
  65. package/dist/tools/codegen/list-tables.js.map +1 -0
  66. package/dist/tools/codegen/sync-payload.d.ts +2 -0
  67. package/dist/tools/codegen/sync-payload.js +177 -0
  68. package/dist/tools/codegen/sync-payload.js.map +1 -0
  69. package/dist/tools/codegen/validate-dashboard-payload.d.ts +2 -0
  70. package/dist/tools/codegen/validate-dashboard-payload.js +239 -0
  71. package/dist/tools/codegen/validate-dashboard-payload.js.map +1 -0
  72. package/dist/tools/codegen/validate-payload.d.ts +2 -0
  73. package/dist/tools/codegen/validate-payload.js +166 -0
  74. package/dist/tools/codegen/validate-payload.js.map +1 -0
  75. package/dist/tools/codegen/validate-sql.d.ts +2 -0
  76. package/dist/tools/codegen/validate-sql.js +270 -0
  77. package/dist/tools/codegen/validate-sql.js.map +1 -0
  78. package/dist/tools/health/index.d.ts +2 -0
  79. package/dist/tools/health/index.js +5 -0
  80. package/dist/tools/health/index.js.map +1 -0
  81. package/dist/tools/health/ping.d.ts +2 -0
  82. package/dist/tools/health/ping.js +68 -0
  83. package/dist/tools/health/ping.js.map +1 -0
  84. package/dist/tools/runtime/check-launcher-exists.d.ts +2 -0
  85. package/dist/tools/runtime/check-launcher-exists.js +111 -0
  86. package/dist/tools/runtime/check-launcher-exists.js.map +1 -0
  87. package/dist/tools/runtime/check-status.d.ts +2 -0
  88. package/dist/tools/runtime/check-status.js +417 -0
  89. package/dist/tools/runtime/check-status.js.map +1 -0
  90. package/dist/tools/runtime/detect-config.d.ts +2 -0
  91. package/dist/tools/runtime/detect-config.js +130 -0
  92. package/dist/tools/runtime/detect-config.js.map +1 -0
  93. package/dist/tools/runtime/detect-project.d.ts +2 -0
  94. package/dist/tools/runtime/detect-project.js +132 -0
  95. package/dist/tools/runtime/detect-project.js.map +1 -0
  96. package/dist/tools/runtime/generate-launcher.d.ts +2 -0
  97. package/dist/tools/runtime/generate-launcher.js +438 -0
  98. package/dist/tools/runtime/generate-launcher.js.map +1 -0
  99. package/dist/tools/runtime/index.d.ts +2 -0
  100. package/dist/tools/runtime/index.js +15 -0
  101. package/dist/tools/runtime/index.js.map +1 -0
  102. package/dist/tools/runtime/validate-preflight.d.ts +2 -0
  103. package/dist/tools/runtime/validate-preflight.js +209 -0
  104. package/dist/tools/runtime/validate-preflight.js.map +1 -0
  105. package/dist/tools/setup/create-folder.d.ts +2 -0
  106. package/dist/tools/setup/create-folder.js +138 -0
  107. package/dist/tools/setup/create-folder.js.map +1 -0
  108. package/dist/tools/setup/get-config-schema.d.ts +2 -0
  109. package/dist/tools/setup/get-config-schema.js +158 -0
  110. package/dist/tools/setup/get-config-schema.js.map +1 -0
  111. package/dist/tools/setup/get-init-template.d.ts +2 -0
  112. package/dist/tools/setup/get-init-template.js +130 -0
  113. package/dist/tools/setup/get-init-template.js.map +1 -0
  114. package/dist/tools/setup/index.d.ts +2 -0
  115. package/dist/tools/setup/index.js +21 -0
  116. package/dist/tools/setup/index.js.map +1 -0
  117. package/dist/tools/setup/init-config.d.ts +2 -0
  118. package/dist/tools/setup/init-config.js +120 -0
  119. package/dist/tools/setup/init-config.js.map +1 -0
  120. package/dist/tools/setup/install-package.d.ts +2 -0
  121. package/dist/tools/setup/install-package.js +133 -0
  122. package/dist/tools/setup/install-package.js.map +1 -0
  123. package/dist/tools/setup/read-env.d.ts +2 -0
  124. package/dist/tools/setup/read-env.js +138 -0
  125. package/dist/tools/setup/read-env.js.map +1 -0
  126. package/dist/tools/setup/update-env.d.ts +2 -0
  127. package/dist/tools/setup/update-env.js +176 -0
  128. package/dist/tools/setup/update-env.js.map +1 -0
  129. package/dist/tools/setup/validate-config.d.ts +2 -0
  130. package/dist/tools/setup/validate-config.js +138 -0
  131. package/dist/tools/setup/validate-config.js.map +1 -0
  132. package/dist/tools/setup/write-env.d.ts +2 -0
  133. package/dist/tools/setup/write-env.js +168 -0
  134. package/dist/tools/setup/write-env.js.map +1 -0
  135. package/package.json +60 -0
@@ -0,0 +1,270 @@
1
+ import { z } from 'zod';
2
+ import { access } from 'node:fs/promises';
3
+ import { resolve, join } from 'node:path';
4
+ import { execProcess } from '../../lib/exec.js';
5
+ function truncateSql(sql) {
6
+ return sql.length > 100 ? `${sql.substring(0, 100)}...` : sql;
7
+ }
8
+ export function registerCodegenValidateSql(server) {
9
+ server.registerTool('codegen_validate_sql', {
10
+ title: 'Validate SQL Query',
11
+ description: `Validate a SELECT (or WITH/CTE) SQL statement against the live database — checks syntax, column references, function existence, type compatibility, and JOIN resolution — by wrapping restforge query:validate. Live introspection — the CLI runs EXPLAIN against the configured database without executing any rows.
12
+
13
+ USE WHEN:
14
+ - The user asks "is this SQL valid?", "check my SQL", "validate this query", "cek SQL ini bener atau salah"
15
+ - Before invoking 'codegen_create_dashboard' with widget queries — to verify each widget SQL passes against the live database before committing the payload file
16
+ - After authoring a complex SQL (multi-table JOIN, CTE, window function) — to catch column reference errors, ambiguous columns, dialect-specific function mismatches before runtime
17
+ - The user reports a dashboard widget failed at runtime with a database error — to confirm whether the SQL is the cause and identify the specific error code/message
18
+ - Iterating on SQL: validate, fix, re-validate (the tool is idempotent and read-only)
19
+ - After 'codegen_describe_table' suggested column names but the user wants a final correctness check on a draft SQL
20
+
21
+ DO NOT USE FOR:
22
+ - Validating the JSON shape of a payload file -> use 'codegen_validate_payload' or 'codegen_validate_dashboard_payload'
23
+ - Checking whether the SQL result shape matches a widget query key's expected shape (scalar/object/array) -> out of scope; that is checked by the dashboard payload validator separately
24
+ - Running INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/TRUNCATE — these statements are rejected before any database connection is opened (this tool is read-only)
25
+ - Listing tables in the database -> use 'codegen_list_tables'
26
+ - Describing a table's columns/PK/FK -> use 'codegen_describe_table'
27
+ - Performance/query plan analysis -> out of scope; the tool only reports validation pass/fail, not the query plan
28
+
29
+ Cross-reference: this tool complements 'codegen_list_tables' and 'codegen_describe_table'. Use list/describe to ground SQL on the live schema, then validate-sql to confirm the composed SQL is correct before commit.
30
+
31
+ This tool runs: npx restforge query:validate --config=<config> --sql=<sql> --pretty=false in the given cwd.
32
+ The CLI runs EXPLAIN (PostgreSQL/MySQL) or EXPLAIN PLAN FOR (Oracle) against the configured database, without executing any rows.
33
+
34
+ Preconditions:
35
+ - The project must have @restforgejs/platform installed in node_modules (>= 2.4.8 for query:validate support).
36
+ - The config file (default 'db-connection.env') must exist in the project (or in cwd/config/) and contain valid database credentials. The CLI auto-fallbacks to the config/ subfolder if the file is not found at the top level.
37
+
38
+ PRESENTATION GUIDANCE:
39
+ - Match the user's language. If the user writes in Indonesian, respond in Indonesian.
40
+ - Never mention internal tool names in the reply to the user. Describe actions by what they do (e.g. "validate the SQL", "list the database tables").
41
+ - Speak in plain language. For success: confirm the SQL is valid in one sentence. For failure: summarise the error category in plain language (e.g. "the column 'x' doesn't exist in this table"), and suggest the next action (revise SQL based on error, re-validate).
42
+ - This is a live introspection: the tool actively runs EXPLAIN against the database. The result reflects the database state at query time. Zero rows are executed; the planner only parses and resolves references.
43
+ - For SELECT-only rejection (when the SQL starts with INSERT/UPDATE/DELETE/etc), explain that the validator is read-only by design and ask the user to revise to a SELECT statement.
44
+ - Error codes are dialect-specific: Postgres uses 5-char SQLSTATE (e.g. '42703'), MySQL uses ER_* names or numeric errno, Oracle uses 'ORA-XXXXX'. When relevant, mention the category in plain language (column not found, ambiguous reference, function mismatch, etc) instead of citing the raw code.
45
+ - When a precondition is not met (e.g. the package is not installed), frame it as a question or next-step suggestion rather than an error.`,
46
+ inputSchema: {
47
+ cwd: z
48
+ .string()
49
+ .min(1)
50
+ .describe('Absolute path of the project folder (must contain node_modules/@restforgejs/platform and the config file)'),
51
+ config: z
52
+ .string()
53
+ .min(1)
54
+ .default('db-connection.env')
55
+ .describe('Config file name relative to the project, used by the CLI to connect to the database'),
56
+ sql: z
57
+ .string()
58
+ .min(1)
59
+ .describe('SQL string to validate. Must be a SELECT or WITH (CTE) statement. Other statements (INSERT/UPDATE/DELETE/DROP/ALTER/CREATE/TRUNCATE) are rejected before any database connection is opened.'),
60
+ },
61
+ annotations: {
62
+ title: 'Validate SQL Query',
63
+ readOnlyHint: true,
64
+ idempotentHint: true,
65
+ },
66
+ }, async ({ cwd, config, sql }) => {
67
+ const projectCwd = resolve(cwd);
68
+ const sqlPreview = truncateSql(sql);
69
+ // Branch A: Precondition check — @restforgejs/platform must be present in node_modules.
70
+ // Treated as a non-error precondition per the authoring guide §3.4.
71
+ try {
72
+ await access(join(projectCwd, 'node_modules', '@restforgejs', 'platform'));
73
+ }
74
+ catch {
75
+ return {
76
+ content: [
77
+ {
78
+ type: 'text',
79
+ text: `Precondition not met: the RESTForge package is not installed in this project.
80
+
81
+ Project path: ${projectCwd}
82
+ Expected location: node_modules/@restforgejs/platform
83
+ Requested config: ${config}
84
+ Requested sql (first 100 chars): ${sqlPreview}
85
+
86
+ For the assistant:
87
+ - The user needs to install the RESTForge package before SQL validation can run.
88
+ - Suggest installing the package first, then retry validating the SQL.
89
+ - When explaining to the user, say something like "the RESTForge package isn't installed yet — should I install it first?". Do not mention internal tool names.`,
90
+ },
91
+ ],
92
+ isError: false,
93
+ };
94
+ }
95
+ // Run CLI with --pretty=false (compact); the MCP layer re-formats JSON for output.
96
+ const cliArgs = [
97
+ 'restforge',
98
+ 'query:validate',
99
+ `--config=${config}`,
100
+ `--sql=${sql}`,
101
+ '--pretty=false',
102
+ ];
103
+ const result = await execProcess('npx', cliArgs, {
104
+ cwd: projectCwd,
105
+ timeout: 30_000,
106
+ env: { NODE_ENV: 'production' },
107
+ stripFinalNewline: true,
108
+ });
109
+ // Branch D: SELECT-only rejection — non-error guidance per Q6.
110
+ // Detected via stderr substring (CLI exits 1 with stable error prefix).
111
+ if (!result.success && result.stderr.includes('Only SELECT or WITH')) {
112
+ return {
113
+ content: [
114
+ {
115
+ type: 'text',
116
+ text: `SQL was rejected before validation: only SELECT or WITH (CTE) statements are allowed.
117
+
118
+ Project path: ${projectCwd}
119
+ Config: ${config}
120
+ Submitted SQL (first 100 chars): ${sqlPreview}
121
+
122
+ For the assistant:
123
+ - The validator only accepts read-only SELECT or WITH statements. Statements like INSERT, UPDATE, DELETE, DROP, ALTER, CREATE, TRUNCATE are rejected before any database connection is opened.
124
+ - This is a guardrail to prevent accidental data mutation during validation.
125
+ - Tell the user that the SQL is not a SELECT/WITH statement. Suggest revising to a SELECT statement and retry.
126
+ - If the user actually intended to run a non-SELECT statement (e.g. data migration), this validator is the wrong tool — they should run the SQL directly via their database client. Do not attempt to bypass this check.
127
+ - Match the user's language. Do not mention internal tool names.`,
128
+ },
129
+ ],
130
+ isError: false,
131
+ };
132
+ }
133
+ // Branch E: Other CLI failure — real error per §3.4.
134
+ if (!result.success) {
135
+ return {
136
+ content: [
137
+ {
138
+ type: 'text',
139
+ text: `Failed to validate the SQL.
140
+
141
+ Project path: ${projectCwd}
142
+ Config: ${config}
143
+ Submitted SQL (first 100 chars): ${sqlPreview}
144
+ Command: ${result.command}
145
+ Exit code: ${result.exitCode}
146
+
147
+ --- CLI output ---
148
+ stdout:
149
+ ${result.stdout}
150
+
151
+ stderr:
152
+ ${result.stderr}
153
+ --- end CLI output ---
154
+
155
+ For the assistant:
156
+ - Tell the user that SQL validation did not complete successfully.
157
+ - Summarise the most likely cause from the CLI output in plain language. Common causes:
158
+ * Config file not found — suggest verifying the path and that the file exists in the project (or in cwd/config/).
159
+ * Database connection failed — suggest verifying the credentials, that the host is reachable, and that the port is open.
160
+ * Unknown command 'query:validate' — the installed RESTForge version may be older than this CLI subcommand; suggest upgrading the package (requires @restforgejs/platform >= 2.4.8).
161
+ - Do not paste the raw stdout/stderr unless the user explicitly asks. Do not mention internal tool names.
162
+ - Offer to retry once the underlying issue is resolved.`,
163
+ },
164
+ ],
165
+ isError: true,
166
+ };
167
+ }
168
+ // Branch F: JSON parse failure — real error per §3.4 (CLI succeeded but produced invalid output).
169
+ let parsed;
170
+ try {
171
+ parsed = JSON.parse(result.stdout);
172
+ }
173
+ catch (err) {
174
+ const msg = err instanceof Error ? err.message : String(err);
175
+ return {
176
+ content: [
177
+ {
178
+ type: 'text',
179
+ text: `Failed to parse the SQL validation result as JSON.
180
+
181
+ Project path: ${projectCwd}
182
+ Config: ${config}
183
+ Reason: ${msg}
184
+
185
+ --- Raw stdout ---
186
+ ${result.stdout}
187
+ --- end Raw stdout ---
188
+
189
+ For the assistant:
190
+ - The CLI returned output that is not valid JSON.
191
+ - Summarise this to the user in plain language; do not paste the raw stdout unless they explicitly ask.
192
+ - Suggest checking that the installed RESTForge package version is compatible (requires @restforgejs/platform >= 2.4.8). Do not mention internal tool names.`,
193
+ },
194
+ ],
195
+ isError: true,
196
+ };
197
+ }
198
+ // Defensive labeled facts: if the JSON shape changes upstream, fall back to 'unknown' / 'n/a'
199
+ // rather than crashing. Mirror the catalog tools pattern.
200
+ const root = (parsed ?? {});
201
+ const ok = root.ok === true;
202
+ const databaseType = typeof root.database === 'string' ? root.database : 'unknown';
203
+ const errorObj = (root.error ?? {});
204
+ const errorCode = typeof errorObj.code === 'string' ? errorObj.code : 'n/a';
205
+ const errorMessage = typeof errorObj.message === 'string' ? errorObj.message : 'n/a';
206
+ const errorHint = typeof errorObj.hint === 'string' ? errorObj.hint : 'n/a';
207
+ const prettyJson = JSON.stringify(parsed, null, 2);
208
+ // Branch B: success — SQL valid (ok: true).
209
+ if (ok) {
210
+ return {
211
+ content: [
212
+ {
213
+ type: 'text',
214
+ text: `SQL validation succeeded — the statement is syntactically and semantically valid against the live database schema.
215
+
216
+ Project path: ${projectCwd}
217
+ Config: ${config}
218
+ Database: ${databaseType}
219
+ ok: true
220
+
221
+ --- Validation Result (JSON) ---
222
+ ${prettyJson}
223
+ --- end Validation Result (JSON) ---
224
+
225
+ For the assistant:
226
+ - Confirm to the user that the SQL is valid. Mention the database type in plain language.
227
+ - This is a read-only operation: it ran EXPLAIN against the database without executing the query (zero rows touched).
228
+ - The validation only checks: syntax, column references, function existence, type compatibility, JOIN resolution. It does NOT check business semantics (e.g. whether the result shape matches a widget query key's expected shape — that is checked by the dashboard payload validator separately).
229
+ - Match the user's language.`,
230
+ },
231
+ ],
232
+ };
233
+ }
234
+ // Branch C: success — SQL invalid (ok: false). Tool ran successfully; negative validation result is normal.
235
+ return {
236
+ content: [
237
+ {
238
+ type: 'text',
239
+ text: `SQL validation reported an error — the statement is not valid against the live database schema.
240
+
241
+ Project path: ${projectCwd}
242
+ Config: ${config}
243
+ Database: ${databaseType}
244
+ ok: false
245
+ errorCode: ${errorCode}
246
+ errorMessage: ${errorMessage}
247
+ errorHint: ${errorHint}
248
+
249
+ --- Validation Result (JSON) ---
250
+ ${prettyJson}
251
+ --- end Validation Result (JSON) ---
252
+
253
+ For the assistant:
254
+ - Tell the user that the SQL did not pass validation. Summarise the error in plain language.
255
+ - Common error categories (Postgres SQLSTATE prefix):
256
+ * 42703 (undefined_column) — a referenced column does not exist; suggest using the table-describe action to verify column names
257
+ * 42702 (ambiguous_column) — column reference is ambiguous between multiple tables; suggest qualifying with table alias
258
+ * 42883 (undefined_function) — function does not exist or argument types do not match; check dialect-specific function names
259
+ * 42P01 (undefined_table) — referenced table does not exist; suggest using the table-list action
260
+ * 42601 (syntax_error) — SQL syntax issue
261
+ - For MySQL/Oracle, error.code uses different conventions (MySQL ER_*/errno, Oracle ORA-XXXXX).
262
+ - Do not paste the raw JSON unless the user explicitly asks. Do not mention internal tool names.
263
+ - Suggest revising the SQL based on the error and re-validating.
264
+ - Match the user's language.`,
265
+ },
266
+ ],
267
+ };
268
+ });
269
+ }
270
+ //# sourceMappingURL=validate-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-sql.js","sourceRoot":"","sources":["../../../src/tools/codegen/validate-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerHealthTools(server: McpServer, version: string): void;
@@ -0,0 +1,5 @@
1
+ import { registerHealthPing } from './ping.js';
2
+ export function registerHealthTools(server, version) {
3
+ registerHealthPing(server, version);
4
+ }
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/health/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,OAAe;IACpE,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerHealthPing(server: McpServer, version: string): void;
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ export function registerHealthPing(server, version) {
3
+ server.registerTool('health_ping', {
4
+ title: 'Health Ping',
5
+ description: `Simple smoke test tool to verify the MCP server is up and responsive.
6
+ Not related to RESTForge operations — purely for verifying MCP transport.
7
+
8
+ USE WHEN:
9
+ - Verifying that the MCP server itself is reachable and responsive
10
+ - Checking if the server can receive and respond to tool calls
11
+ - Diagnosing whether a problem is in the MCP transport layer or in a specific tool
12
+ - The user asks things like "ping the MCP server", "is the MCP server alive",
13
+ "cek MCP server", "MCP server jalan tidak", "test the MCP connection",
14
+ "apakah MCP-nya nyala", "smoke test the server"
15
+
16
+ DO NOT USE FOR:
17
+ - Validating the RESTForge license or database connection -> use 'setup_validate_config'
18
+ - Reading the active configuration of a project -> use 'setup_read_env'
19
+ - Anything related to RESTForge state, configuration, or project setup
20
+
21
+ This tool runs in-process: it does not touch the filesystem, network, or any RESTForge component.
22
+ Output: "pong" with ISO 8601 timestamp and server version, plus the optional echoed message.
23
+
24
+ PRESENTATION GUIDANCE:
25
+ - Match the user's language. If the user writes in Indonesian, respond in Indonesian.
26
+ - Never mention internal tool names in the reply to the user. Describe actions by what they do (e.g. "verify the MCP server is responsive", "validate the configuration").
27
+ - Speak in plain language. Confirm that the MCP server is responsive and report the timestamp and server version.
28
+ - Keep the reply concise; this is a smoke test, not a diagnostic dump.`,
29
+ inputSchema: {
30
+ message: z
31
+ .string()
32
+ .optional()
33
+ .describe('Optional message to echo back in the response'),
34
+ },
35
+ annotations: {
36
+ title: 'Health Ping',
37
+ readOnlyHint: true,
38
+ idempotentHint: true,
39
+ },
40
+ }, async ({ message }) => {
41
+ const timestamp = new Date().toISOString();
42
+ // Success: one-line summary + labeled facts per §3.5.
43
+ const facts = [
44
+ `Response: pong`,
45
+ `Timestamp: ${timestamp}`,
46
+ `Server version: ${version}`,
47
+ ];
48
+ if (message) {
49
+ facts.push(`Echo: ${message}`);
50
+ }
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: `MCP server is up and responsive.
56
+
57
+ ${facts.join('\n')}
58
+
59
+ For the assistant:
60
+ - Confirm to the user that the MCP server is reachable and report the timestamp and server version in plain language.
61
+ - ${message ? 'The optional message was echoed back; mention it briefly if relevant.' : 'No echo message was supplied.'}
62
+ - Keep the reply concise. Do not mention internal tool names.`,
63
+ },
64
+ ],
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../src/tools/health/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,OAAe;IACnE,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;uEAuBoD;QACjE,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,+CAA+C,CAAC;SAC7D;QACD,WAAW,EAAE;YACX,KAAK,EAAE,aAAa;YACpB,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,IAAI;SACrB;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,sDAAsD;QACtD,MAAM,KAAK,GAAG;YACZ,gBAAgB;YAChB,cAAc,SAAS,EAAE;YACzB,mBAAmB,OAAO,EAAE;SAC7B,CAAC;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE;;EAEhB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;;;IAId,OAAO,CAAC,CAAC,CAAC,uEAAuE,CAAC,CAAC,CAAC,+BAA+B;8DACzD;iBACnD;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerRuntimeCheckLauncherExists(server: McpServer): void;
@@ -0,0 +1,111 @@
1
+ import { z } from 'zod';
2
+ import { access } from 'node:fs/promises';
3
+ import { resolve, join } from 'node:path';
4
+ const LAUNCHER_FILES = {
5
+ windows: {
6
+ start: 'server-start.bat',
7
+ stop: 'server-stop.bat',
8
+ },
9
+ linux: {
10
+ start: 'server-start.sh',
11
+ stop: 'server-stop.sh',
12
+ },
13
+ };
14
+ const ECOSYSTEM_FILE = 'ecosystem.config.js';
15
+ function getLauncherFiles(os, mode) {
16
+ const files = [LAUNCHER_FILES[os].start, LAUNCHER_FILES[os].stop];
17
+ if (mode === 'pm2') {
18
+ files.push(ECOSYSTEM_FILE);
19
+ }
20
+ return files;
21
+ }
22
+ export function registerRuntimeCheckLauncherExists(server) {
23
+ server.registerTool('runtime_check_launcher_exists', {
24
+ title: 'Check Launcher File Existence',
25
+ description: `Check whether the launcher files that would be produced by 'runtime_generate_launcher' already exist in the project root. Read-only — does not create or overwrite anything.
26
+
27
+ USE WHEN:
28
+ - Before invoking 'runtime_generate_launcher' — to detect potential overwrites and ask the user for confirmation
29
+ - The user wants to know which files would be created without committing
30
+ - The user is debugging an existing setup and wants to confirm what files exist
31
+
32
+ DO NOT USE FOR:
33
+ - Generating launcher files -> use 'runtime_generate_launcher'
34
+ - Reading the content of an existing launcher -> use generic Read tools
35
+ - Checking if the server is currently running -> use 'runtime_check_status'
36
+
37
+ The list of files depends on os + mode (file names are FIXED, not user-customisable):
38
+ - windows + host: server-start.bat, server-stop.bat
39
+ - windows + pm2: server-start.bat, server-stop.bat, ecosystem.config.js
40
+ - linux + host: server-start.sh, server-stop.sh
41
+ - linux + pm2: server-start.sh, server-stop.sh, ecosystem.config.js
42
+
43
+ PRESENTATION GUIDANCE:
44
+ - Match the user's language.
45
+ - Never mention internal tool names.
46
+ - When at least one file already exists, ask the user whether to overwrite (then call generate with overwrite=true).
47
+ - Do not echo the JSON unless explicitly asked.`,
48
+ inputSchema: {
49
+ cwd: z.string().min(1).describe('Absolute path of the project folder root'),
50
+ os: z.enum(['windows', 'linux']).describe('Target OS for the launcher'),
51
+ mode: z.enum(['host', 'pm2']).describe('Runtime mode'),
52
+ },
53
+ annotations: {
54
+ title: 'Check Launcher Files',
55
+ readOnlyHint: true,
56
+ idempotentHint: true,
57
+ },
58
+ }, async ({ cwd, os, mode }) => {
59
+ const projectCwd = resolve(cwd);
60
+ const files = getLauncherFiles(os, mode);
61
+ const checked = await Promise.all(files.map(async (f) => {
62
+ const path = join(projectCwd, f);
63
+ let exists = false;
64
+ try {
65
+ await access(path);
66
+ exists = true;
67
+ }
68
+ catch {
69
+ exists = false;
70
+ }
71
+ return { path, exists };
72
+ }));
73
+ const anyExists = checked.some((c) => c.exists);
74
+ const envelope = {
75
+ cwd: projectCwd,
76
+ os,
77
+ mode,
78
+ files: checked,
79
+ any_exists: anyExists,
80
+ };
81
+ const prettyJson = JSON.stringify(envelope, null, 2);
82
+ const summary = anyExists
83
+ ? 'One or more launcher files already exist in the project root.'
84
+ : 'No conflicting launcher files. Safe to generate.';
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: `${summary}
90
+
91
+ Project path: ${projectCwd}
92
+ OS: ${os}
93
+ Mode: ${mode}
94
+
95
+ --- Existence Check (JSON) ---
96
+ ${prettyJson}
97
+ --- end Existence Check (JSON) ---
98
+
99
+ For the assistant:
100
+ - ${anyExists
101
+ ? 'Some files would be overwritten. Ask the user whether to overwrite (then call generate with overwrite: true).'
102
+ : 'No files would be overwritten. The user can proceed to generate.'}
103
+ - File names are fixed: server-start.{bat|sh}, server-stop.{bat|sh}, plus ecosystem.config.js for PM2 mode.
104
+ - Match the user's language.`,
105
+ },
106
+ ],
107
+ isError: false,
108
+ };
109
+ });
110
+ }
111
+ //# sourceMappingURL=check-launcher-exists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-launcher-exists.js","sourceRoot":"","sources":["../../../src/tools/runtime/check-launcher-exists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerRuntimeCheckStatus(server: McpServer): void;