@engramx/mcp 0.1.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/LICENSE +190 -0
- package/README.md +166 -0
- package/dist/connect-config.d.ts +51 -0
- package/dist/connect-config.js +108 -0
- package/dist/connect-config.js.map +1 -0
- package/dist/connect-config.test.d.ts +1 -0
- package/dist/connect-config.test.js +49 -0
- package/dist/connect-config.test.js.map +1 -0
- package/dist/connect.d.ts +1 -0
- package/dist/connect.js +89 -0
- package/dist/connect.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/profile-tools.d.ts +3 -0
- package/dist/profile-tools.js +144 -0
- package/dist/profile-tools.js.map +1 -0
- package/dist/resources.d.ts +3 -0
- package/dist/resources.js +22 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +52 -0
- package/dist/server.js.map +1 -0
- package/dist/tool-schemas.d.ts +46 -0
- package/dist/tool-schemas.js +70 -0
- package/dist/tool-schemas.js.map +1 -0
- package/dist/tool-schemas.json +136 -0
- package/dist/tools.d.ts +3 -0
- package/dist/tools.js +313 -0
- package/dist/tools.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +30 -0
- package/dist/utils.js.map +1 -0
- package/package.json +40 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { toSerializable } from './utils.js';
|
|
3
|
+
function jsonText(value) {
|
|
4
|
+
return JSON.stringify(toSerializable(value), null, 2);
|
|
5
|
+
}
|
|
6
|
+
const MAX_PATH_LENGTH = 1024;
|
|
7
|
+
const E8S_PER_ICP = 100_000_000;
|
|
8
|
+
function validatePath(p) {
|
|
9
|
+
if (!p || p.length === 0)
|
|
10
|
+
return 'Path cannot be empty';
|
|
11
|
+
if (p.length > MAX_PATH_LENGTH)
|
|
12
|
+
return 'Path exceeds maximum length';
|
|
13
|
+
if (p.includes('\0'))
|
|
14
|
+
return 'Path contains null byte';
|
|
15
|
+
if (p.includes('..'))
|
|
16
|
+
return 'Path traversal sequences not allowed';
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
export function registerTools(server, engram) {
|
|
20
|
+
// 1. engram_read_memory
|
|
21
|
+
server.tool('engram_read_memory', 'Read a memory file from the engram (e.g. "MEMORY.md", "memory/2026-02-11.md"). Returns content, version, and last modified timestamp.', { path: z.string().describe('File path in the engram') }, async ({ path }) => {
|
|
22
|
+
const pathErr = validatePath(path);
|
|
23
|
+
if (pathErr)
|
|
24
|
+
return { content: [{ type: 'text', text: pathErr }], isError: true };
|
|
25
|
+
try {
|
|
26
|
+
const file = await engram.readMemory(path);
|
|
27
|
+
return {
|
|
28
|
+
content: [
|
|
29
|
+
{
|
|
30
|
+
type: 'text',
|
|
31
|
+
text: jsonText({
|
|
32
|
+
path: file.path,
|
|
33
|
+
content: file.content,
|
|
34
|
+
version: file.version,
|
|
35
|
+
lastModifiedAt: file.lastModifiedAt,
|
|
36
|
+
}),
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
return {
|
|
43
|
+
content: [
|
|
44
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
45
|
+
],
|
|
46
|
+
isError: true,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
// (engram_write_memory removed: writeMemory is owner-only by design — operators
|
|
51
|
+
// are append-only. Owner uses the dashboard at engramx.ai or the canister IDL
|
|
52
|
+
// directly via Internet Identity.)
|
|
53
|
+
// 2. engram_append_memory
|
|
54
|
+
server.tool('engram_append_memory', 'Append content to a memory file. Creates the file if it does not exist. Cannot modify owner-protected paths.', {
|
|
55
|
+
path: z.string().describe('File path'),
|
|
56
|
+
content: z.string().describe('Content to append'),
|
|
57
|
+
}, async ({ path, content }) => {
|
|
58
|
+
const pathErr = validatePath(path);
|
|
59
|
+
if (pathErr)
|
|
60
|
+
return { content: [{ type: 'text', text: pathErr }], isError: true };
|
|
61
|
+
try {
|
|
62
|
+
const version = await engram.appendMemory(path, content);
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: 'text', text: jsonText({ path, version }) }],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
71
|
+
],
|
|
72
|
+
isError: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// 3. engram_list_memory_files
|
|
77
|
+
server.tool('engram_list_memory_files', 'List all memory files stored in the engram. Returns path, version, and last modified timestamp for each file.', async () => {
|
|
78
|
+
try {
|
|
79
|
+
const files = await engram.listMemoryFiles();
|
|
80
|
+
return {
|
|
81
|
+
content: [{ type: 'text', text: jsonText(files) }],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
return {
|
|
86
|
+
content: [
|
|
87
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
88
|
+
],
|
|
89
|
+
isError: true,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
// 5. engram_read_memory_batch
|
|
94
|
+
server.tool('engram_read_memory_batch', 'Read multiple memory files in a single call. More efficient than multiple engram_read_memory calls.',
|
|
95
|
+
// Cap matches the canister's MAX_BATCH_READ_PATHS (50) and tool-schemas.json maxItems —
|
|
96
|
+
// a larger batch would pass zod here only to be rejected wholesale canister-side.
|
|
97
|
+
{ paths: z.array(z.string()).max(50).describe('Array of file paths to read (max 50)') }, async ({ paths }) => {
|
|
98
|
+
try {
|
|
99
|
+
for (const p of paths) {
|
|
100
|
+
const pathErr = validatePath(p);
|
|
101
|
+
if (pathErr)
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: 'text', text: `Invalid path "${p}": ${pathErr}` }],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const results = await engram.readMemoryBatch(paths);
|
|
108
|
+
const serialized = results.map(([path, fileOrError]) => {
|
|
109
|
+
if (fileOrError instanceof Error) {
|
|
110
|
+
return { path, error: fileOrError.message };
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
path,
|
|
114
|
+
content: fileOrError.content,
|
|
115
|
+
version: fileOrError.version,
|
|
116
|
+
lastModifiedAt: fileOrError.lastModifiedAt,
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
return {
|
|
120
|
+
content: [{ type: 'text', text: jsonText(serialized) }],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
return {
|
|
125
|
+
content: [
|
|
126
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
127
|
+
],
|
|
128
|
+
isError: true,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// 6. engram_memory_history
|
|
133
|
+
server.tool('engram_memory_history', 'Get the version history of a memory file, showing all modifications with timestamps and operation types.', { path: z.string().describe('File path') }, async ({ path }) => {
|
|
134
|
+
const pathErr = validatePath(path);
|
|
135
|
+
if (pathErr)
|
|
136
|
+
return { content: [{ type: 'text', text: pathErr }], isError: true };
|
|
137
|
+
try {
|
|
138
|
+
const history = await engram.getMemoryHistory(path);
|
|
139
|
+
return {
|
|
140
|
+
content: [{ type: 'text', text: jsonText(history) }],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
147
|
+
],
|
|
148
|
+
isError: true,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
// 7. engram_wallet_balance
|
|
153
|
+
server.tool('engram_wallet_balance', 'Check the engram canister cycles balance (canister fuel).', async () => {
|
|
154
|
+
try {
|
|
155
|
+
const cycles = await engram.walletBalance();
|
|
156
|
+
// Match HTTP MCP shape: {cyclesBalance: <number-or-string>}
|
|
157
|
+
// BigInt serialized via jsonText becomes a string representation.
|
|
158
|
+
return {
|
|
159
|
+
content: [
|
|
160
|
+
{
|
|
161
|
+
type: 'text',
|
|
162
|
+
text: jsonText({ cyclesBalance: cycles }),
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return {
|
|
169
|
+
content: [
|
|
170
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
171
|
+
],
|
|
172
|
+
isError: true,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
// NOTE: there is intentionally no `engram_transfer` tool. Operators are
|
|
177
|
+
// append-only and have zero owner-level fund control; the only money-moving
|
|
178
|
+
// canister method is the owner-only `ownerWithdraw`, which is never exposed on
|
|
179
|
+
// the operator MCP surface. (Removed: it called a non-existent
|
|
180
|
+
// `operatorTransfer` method and advertised a `wallet.spend` capability that
|
|
181
|
+
// contradicts the operator invariant.)
|
|
182
|
+
// 9. engram_status
|
|
183
|
+
server.tool('engram_status', 'Get engram canister health and status: memory file count, operator count, cycles balance, version, and more.', async () => {
|
|
184
|
+
try {
|
|
185
|
+
const status = await engram.status();
|
|
186
|
+
return {
|
|
187
|
+
content: [{ type: 'text', text: jsonText(status) }],
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
194
|
+
],
|
|
195
|
+
isError: true,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
// engram_read_audit_log
|
|
200
|
+
server.tool('engram_read_audit_log', 'Read the engram audit log. Returns timestamped entries of all operations performed on the engram.', {
|
|
201
|
+
fromIndex: z.number().optional().describe('Starting index (default: 0)'),
|
|
202
|
+
limit: z
|
|
203
|
+
.number()
|
|
204
|
+
.min(1)
|
|
205
|
+
.max(1000)
|
|
206
|
+
.optional()
|
|
207
|
+
.default(100)
|
|
208
|
+
.describe('Max entries to return (default: 100)'),
|
|
209
|
+
}, async ({ fromIndex, limit }) => {
|
|
210
|
+
try {
|
|
211
|
+
const entries = await engram.readAuditLog(fromIndex ?? 0, limit);
|
|
212
|
+
return {
|
|
213
|
+
content: [{ type: 'text', text: jsonText(entries) }],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
return {
|
|
218
|
+
content: [
|
|
219
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
220
|
+
],
|
|
221
|
+
isError: true,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
// === ic402 Service Marketplace ===
|
|
226
|
+
server.tool('engram_list_services', 'List available paid services registered on this engram.', {}, async () => {
|
|
227
|
+
try {
|
|
228
|
+
const services = await engram.listServices();
|
|
229
|
+
return { content: [{ type: 'text', text: jsonText(services) }] };
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
return {
|
|
233
|
+
content: [
|
|
234
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
235
|
+
],
|
|
236
|
+
isError: true,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
server.tool('engram_submit_service_request', 'Submit a paid service request. Returns a job ID for polling.', {
|
|
241
|
+
serviceId: z.string().describe('ID of the service to request'),
|
|
242
|
+
params: z.string().describe('Request parameters (will be UTF-8 encoded)'),
|
|
243
|
+
}, async ({ serviceId, params }) => {
|
|
244
|
+
try {
|
|
245
|
+
// Auto-pay: builds the x402 payment (ICRC-2 approve + retry) so a paid request
|
|
246
|
+
// actually settles. The plain submitServiceRequest sends no sig and can never complete.
|
|
247
|
+
const result = await engram.submitServiceRequestWithPayment(serviceId, new TextEncoder().encode(params));
|
|
248
|
+
return { content: [{ type: 'text', text: jsonText(result) }] };
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return {
|
|
252
|
+
content: [
|
|
253
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
254
|
+
],
|
|
255
|
+
isError: true,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
server.tool('engram_get_job_result', 'Poll a service job until it reaches a terminal status. Returns the full job object.', {
|
|
260
|
+
jobId: z.string().describe('Job ID to poll'),
|
|
261
|
+
maxAttempts: z.number().optional().describe('Max polling attempts (default 30)'),
|
|
262
|
+
}, async ({ jobId, maxAttempts }) => {
|
|
263
|
+
try {
|
|
264
|
+
const job = await engram.pollJobResult(jobId, maxAttempts ?? 30);
|
|
265
|
+
return { content: [{ type: 'text', text: jsonText(job) }] };
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
return {
|
|
269
|
+
content: [
|
|
270
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
271
|
+
],
|
|
272
|
+
isError: true,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
server.tool('engram_dispute_job', 'Dispute a completed job (for BuyerConfirm verification method).', {
|
|
277
|
+
jobId: z.string().describe('Job ID to dispute'),
|
|
278
|
+
reason: z.string().describe('Reason for the dispute'),
|
|
279
|
+
}, async ({ jobId, reason }) => {
|
|
280
|
+
try {
|
|
281
|
+
await engram.disputeJob(jobId, reason);
|
|
282
|
+
return { content: [{ type: 'text', text: `Disputed job ${jobId}` }] };
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
return {
|
|
286
|
+
content: [
|
|
287
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
288
|
+
],
|
|
289
|
+
isError: true,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
server.tool('engram_confirm_job', 'Confirm a completed job result (for BuyerConfirm verification), releasing payment to the operator.', {
|
|
294
|
+
jobId: z.string().describe('Job ID to confirm'),
|
|
295
|
+
}, async ({ jobId }) => {
|
|
296
|
+
try {
|
|
297
|
+
await engram.confirmJob(jobId);
|
|
298
|
+
return { content: [{ type: 'text', text: `Confirmed job ${jobId}` }] };
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
return {
|
|
302
|
+
content: [
|
|
303
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
304
|
+
],
|
|
305
|
+
isError: true,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
// (engram_sign_typed_data removed: signTypedData is owner-only — cryptographic
|
|
310
|
+
// signing as the agent's ERC-8004 identity is a value-bearing operation that
|
|
311
|
+
// operators must not be able to perform. Owner uses dashboard or canister IDL.)
|
|
312
|
+
}
|
|
313
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
package/dist/utils.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert BigInt values in an object to strings for JSON serialization.
|
|
3
|
+
* Uses string representation to avoid precision loss for values > 2^53.
|
|
4
|
+
*/
|
|
5
|
+
export function toSerializable(value) {
|
|
6
|
+
if (value === null || value === undefined)
|
|
7
|
+
return value;
|
|
8
|
+
// Always stringify BigInt: stable type per field for the model + no precision loss.
|
|
9
|
+
if (typeof value === 'bigint') {
|
|
10
|
+
return value.toString();
|
|
11
|
+
}
|
|
12
|
+
if (typeof value === 'object' &&
|
|
13
|
+
'toText' in value &&
|
|
14
|
+
typeof value['toText'] === 'function') {
|
|
15
|
+
return value.toText();
|
|
16
|
+
}
|
|
17
|
+
if (value instanceof Uint8Array)
|
|
18
|
+
return Array.from(value);
|
|
19
|
+
if (Array.isArray(value))
|
|
20
|
+
return value.map(toSerializable);
|
|
21
|
+
if (typeof value === 'object') {
|
|
22
|
+
const obj = {};
|
|
23
|
+
for (const [k, v] of Object.entries(value)) {
|
|
24
|
+
obj[k] = toSerializable(v);
|
|
25
|
+
}
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,oFAAoF;IACpF,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QACjB,OAAQ,KAAiC,CAAC,QAAQ,CAAC,KAAK,UAAU,EAClE,CAAC;QACD,OAAQ,KAAkC,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@engramx/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server for EngramX — persistent, decentralized agent memory",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "EngramX <developer@engramx.ai>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/vhew/engramx",
|
|
10
|
+
"directory": "integrations/mcp"
|
|
11
|
+
},
|
|
12
|
+
"type": "module",
|
|
13
|
+
"main": "dist/index.js",
|
|
14
|
+
"types": "dist/index.d.ts",
|
|
15
|
+
"bin": {
|
|
16
|
+
"engramx-mcp": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"@icp-sdk/core": "^5.4.0",
|
|
27
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
28
|
+
"zod": "^4.4.3",
|
|
29
|
+
"@engramx/client": "^0.1.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^25.9.2",
|
|
33
|
+
"typescript": "^6.0.3"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsc",
|
|
37
|
+
"start": "node dist/index.js",
|
|
38
|
+
"test": "vitest run"
|
|
39
|
+
}
|
|
40
|
+
}
|