@innerstacklabs/neuralingual-mcp 0.2.0 → 0.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.
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Neuralingual User MCP Server
4
+ *
5
+ * MCP server for AI assistant integration. Authenticates via stored JWT
6
+ * from `neuralingual login`. Provides ~18 tools for library management,
7
+ * creation, rendering, sharing, and YAML set file round-tripping.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=user-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-mcp.d.ts","sourceRoot":"","sources":["../src/user-mcp.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
@@ -0,0 +1,552 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Neuralingual User MCP Server
4
+ *
5
+ * MCP server for AI assistant integration. Authenticates via stored JWT
6
+ * from `neuralingual login`. Provides ~18 tools for library management,
7
+ * creation, rendering, sharing, and YAML set file round-tripping.
8
+ */
9
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
11
+ import { writeFileSync, existsSync, mkdirSync } from 'fs';
12
+ import { homedir } from 'os';
13
+ import { join } from 'path';
14
+ import { z } from 'zod';
15
+ import { UserApiClient } from './user-client.js';
16
+ import { loadAuth } from './auth-store.js';
17
+ import { serializeSetFile, parseSetFile } from './set-file.js';
18
+ import { API_BASE_URLS } from './types.js';
19
+ const SERVER_NAME = 'neuralingual';
20
+ const SERVER_VERSION = '0.2.0';
21
+ const AUDIO_CACHE_DIR = join(homedir(), '.config', 'neuralingual', 'audio');
22
+ const toneSchema = z.enum(['grounded', 'open', 'mystical']).optional();
23
+ // ── Helpers ────────────────────────────────────────────────────────────────
24
+ function textResult(text) {
25
+ return { content: [{ type: 'text', text }] };
26
+ }
27
+ function errorResult(message) {
28
+ return { content: [{ type: 'text', text: message }], isError: true };
29
+ }
30
+ const NOT_LOGGED_IN = 'Not logged in. Run `neuralingual login` first.';
31
+ function getClient() {
32
+ try {
33
+ return UserApiClient.fromAuth();
34
+ }
35
+ catch {
36
+ throw new Error(NOT_LOGGED_IN);
37
+ }
38
+ }
39
+ async function withClient(fn) {
40
+ try {
41
+ return await fn(getClient());
42
+ }
43
+ catch (err) {
44
+ const msg = err instanceof Error ? err.message : String(err);
45
+ return errorResult(msg);
46
+ }
47
+ }
48
+ /**
49
+ * Resolve a short/truncated intent ID to the full ID via library lookup.
50
+ * Supports exact match and unique prefix match.
51
+ */
52
+ async function resolveIntentId(client, shortId) {
53
+ const { items } = await client.getLibrary();
54
+ const exact = items.find((i) => i.intent.id === shortId);
55
+ if (exact)
56
+ return exact.intent.id;
57
+ const prefixMatches = items.filter((i) => i.intent.id.startsWith(shortId));
58
+ if (prefixMatches.length === 1)
59
+ return prefixMatches[0].intent.id;
60
+ if (prefixMatches.length > 1) {
61
+ throw new Error(`Ambiguous ID "${shortId}" matches ${prefixMatches.length} sets. Use a longer prefix or the full ID.`);
62
+ }
63
+ throw new Error('Practice set not found. Use nl_library to see available sets.');
64
+ }
65
+ /**
66
+ * Fetch set file data for YAML export. Maps user intent detail to SetFileData.
67
+ */
68
+ async function fetchSetFileData(client, intentId) {
69
+ const { intent } = await client.getIntent(intentId);
70
+ if (!intent) {
71
+ throw new Error('Practice set not found. Use nl_library to see available sets.');
72
+ }
73
+ const latestSet = intent.affirmationSets[0];
74
+ const affirmations = (latestSet?.affirmations ?? []).map((a, idx) => ({
75
+ id: a.id,
76
+ setId: latestSet?.id ?? '',
77
+ text: a.text,
78
+ tone: a.tone,
79
+ intensity: 3,
80
+ length: a.text.length < 60 ? 'short' : 'medium',
81
+ tags: [],
82
+ weight: 3,
83
+ isFavorite: false,
84
+ isEnabled: a.isEnabled,
85
+ orderIndex: idx,
86
+ createdAt: '',
87
+ updatedAt: '',
88
+ }));
89
+ const latestSetId = latestSet?.id;
90
+ const latestConfig = (latestSetId
91
+ ? intent.renderConfigs.find((rc) => rc.affirmationSetId === latestSetId)
92
+ : intent.renderConfigs[0]) ?? null;
93
+ const renderConfig = latestConfig
94
+ ? {
95
+ id: latestConfig.id,
96
+ intentId: intent.id,
97
+ affirmationSetId: latestConfig.affirmationSetId,
98
+ voiceId: latestConfig.voiceId,
99
+ voiceProvider: latestConfig.voiceProvider,
100
+ sessionContext: latestConfig.sessionContext,
101
+ paceWpm: latestConfig.paceWpm,
102
+ durationSeconds: latestConfig.durationSeconds,
103
+ backgroundAudioPath: latestConfig.backgroundAudioPath,
104
+ backgroundVolume: latestConfig.backgroundVolume,
105
+ affirmationRepeatCount: latestConfig.affirmationRepeatCount,
106
+ includePreamble: latestConfig.includePreamble,
107
+ playAll: latestConfig.playAll,
108
+ createdAt: latestConfig.createdAt,
109
+ updatedAt: latestConfig.updatedAt,
110
+ }
111
+ : null;
112
+ const mappedIntent = {
113
+ id: intent.id,
114
+ userId: '',
115
+ title: intent.title,
116
+ emoji: intent.emoji,
117
+ rawText: intent.rawText,
118
+ tonePreference: intent.tonePreference ?? null,
119
+ sessionContext: intent.sessionContext,
120
+ isCatalog: false,
121
+ catalogSlug: null,
122
+ catalogCategory: null,
123
+ catalogSubtitle: null,
124
+ catalogDescription: null,
125
+ catalogOrder: null,
126
+ createdAt: intent.createdAt,
127
+ updatedAt: intent.updatedAt,
128
+ archivedAt: null,
129
+ };
130
+ return { intent: mappedIntent, affirmations, renderConfig };
131
+ }
132
+ /**
133
+ * Apply a YAML set file to an existing practice set.
134
+ */
135
+ async function applySetFile(client, intentId, content, originalData) {
136
+ const parsed = parseSetFile(content);
137
+ const changes = [];
138
+ // 1. Intent metadata updates
139
+ const intentUpdates = {};
140
+ if (parsed.title !== undefined && parsed.title !== originalData.intent.title) {
141
+ intentUpdates.title = parsed.title;
142
+ }
143
+ if (parsed.tone !== undefined && parsed.tone !== originalData.intent.tonePreference) {
144
+ intentUpdates.tonePreference = parsed.tone;
145
+ }
146
+ if (parsed.intent !== undefined && parsed.intent !== originalData.intent.rawText) {
147
+ intentUpdates.intentText = parsed.intent;
148
+ }
149
+ if (parsed.emoji !== undefined && parsed.emoji !== originalData.intent.emoji) {
150
+ intentUpdates.emoji = parsed.emoji;
151
+ }
152
+ if (Object.keys(intentUpdates).length > 0) {
153
+ await client.updateIntent(intentId, intentUpdates);
154
+ changes.push(`intent: updated ${Object.keys(intentUpdates).join(', ')}`);
155
+ }
156
+ // 2. Affirmation sync
157
+ if (parsed.affirmations && parsed.affirmations.length > 0) {
158
+ const syncResult = await client.syncAffirmations(intentId, {
159
+ affirmations: parsed.affirmations.map((a) => ({
160
+ id: a.id,
161
+ text: a.text,
162
+ enabled: a.enabled,
163
+ })),
164
+ });
165
+ const parts = [];
166
+ if (syncResult.added > 0)
167
+ parts.push(`${syncResult.added} added`);
168
+ if (syncResult.updated > 0)
169
+ parts.push(`${syncResult.updated} updated`);
170
+ if (syncResult.removed > 0)
171
+ parts.push(`${syncResult.removed} removed`);
172
+ if (parts.length > 0) {
173
+ changes.push(`affirmations: ${parts.join(', ')}`);
174
+ }
175
+ }
176
+ // 3. Render config updates
177
+ const hasRenderFields = parsed.voice !== undefined ||
178
+ parsed.duration !== undefined ||
179
+ parsed.pace !== undefined ||
180
+ parsed.renderContext !== undefined ||
181
+ parsed.intentContext !== undefined ||
182
+ parsed.background !== undefined ||
183
+ parsed.backgroundVolume !== undefined ||
184
+ parsed.repeats !== undefined ||
185
+ parsed.preamble !== undefined ||
186
+ parsed.playAll !== undefined;
187
+ if (hasRenderFields) {
188
+ if (!originalData.renderConfig) {
189
+ changes.push('render config: skipped (no existing config — run nl_render_configure first)');
190
+ }
191
+ else {
192
+ const rc = originalData.renderConfig;
193
+ const input = {
194
+ voiceId: parsed.voice ?? rc.voiceId ?? '',
195
+ sessionContext: (parsed.renderContext ?? parsed.intentContext ?? rc.sessionContext ?? 'general'),
196
+ durationMinutes: parsed.duration ?? Math.round(rc.durationSeconds / 60),
197
+ };
198
+ if (parsed.pace !== undefined)
199
+ input.paceWpm = parsed.pace;
200
+ if (parsed.background !== undefined)
201
+ input.backgroundAudioPath = parsed.background;
202
+ if (parsed.backgroundVolume !== undefined)
203
+ input.backgroundVolume = parsed.backgroundVolume;
204
+ if (parsed.repeats !== undefined)
205
+ input.affirmationRepeatCount = parsed.repeats;
206
+ if (parsed.preamble !== undefined)
207
+ input.includePreamble = parsed.preamble;
208
+ if (parsed.playAll !== undefined)
209
+ input.playAll = parsed.playAll;
210
+ await client.configureRender(intentId, input);
211
+ changes.push('render config: updated');
212
+ }
213
+ }
214
+ if (changes.length === 0) {
215
+ return 'No changes detected.';
216
+ }
217
+ return `Applied ${changes.length} change(s):\n${changes.map((c) => ` - ${c}`).join('\n')}`;
218
+ }
219
+ // ── Server ─────────────────────────────────────────────────────────────────
220
+ function buildServer() {
221
+ const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION });
222
+ // ── Library & Discovery ────────────────────────────────────────────────
223
+ server.registerTool('nl_library', {
224
+ description: "List all practice sets in the user's library. Returns title, emoji, context, affirmation count, and render status for each set.",
225
+ inputSchema: {},
226
+ }, async () => withClient(async (client) => {
227
+ const { items } = await client.getLibrary();
228
+ const summary = items.map((item) => ({
229
+ id: item.intent.id,
230
+ title: item.intent.title,
231
+ emoji: item.intent.emoji,
232
+ context: item.intent.sessionContext,
233
+ affirmationCount: item.latestAffirmationSet?.affirmationCount ?? 0,
234
+ renderStatus: item.latestRenderJob?.status ?? 'none',
235
+ updatedAt: item.intent.updatedAt,
236
+ }));
237
+ return textResult(JSON.stringify(summary, null, 2));
238
+ }));
239
+ server.registerTool('nl_search', {
240
+ description: 'Search practice sets in the library by keyword. Matches against title, emoji, and session context.',
241
+ inputSchema: {
242
+ query: z.string().min(1).describe('Search keyword to match against title, emoji, or context'),
243
+ },
244
+ }, async ({ query }) => withClient(async (client) => {
245
+ const { items } = await client.getLibrary();
246
+ const q = query.toLowerCase();
247
+ const matches = items.filter((item) => item.intent.title.toLowerCase().includes(q) ||
248
+ (item.intent.emoji ?? '').toLowerCase().includes(q) ||
249
+ item.intent.sessionContext.toLowerCase().includes(q));
250
+ const summary = matches.map((item) => ({
251
+ id: item.intent.id,
252
+ title: item.intent.title,
253
+ emoji: item.intent.emoji,
254
+ context: item.intent.sessionContext,
255
+ affirmationCount: item.latestAffirmationSet?.affirmationCount ?? 0,
256
+ renderStatus: item.latestRenderJob?.status ?? 'none',
257
+ }));
258
+ return textResult(matches.length === 0
259
+ ? `No practice sets found matching "${query}".`
260
+ : JSON.stringify(summary, null, 2));
261
+ }));
262
+ server.registerTool('nl_info', {
263
+ description: 'Get detailed information about a practice set, including all affirmations, render config, and share status. Accepts full or short ID.',
264
+ inputSchema: {
265
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
266
+ },
267
+ }, async ({ id }) => withClient(async (client) => {
268
+ const resolvedId = await resolveIntentId(client, id);
269
+ const { intent } = await client.getIntent(resolvedId);
270
+ if (!intent) {
271
+ return errorResult('Practice set not found. Use nl_library to see available sets.');
272
+ }
273
+ return textResult(JSON.stringify(intent, null, 2));
274
+ }));
275
+ server.registerTool('nl_voices', {
276
+ description: 'List available voices for rendering. Returns voice ID, name, gender, accent, and tier. Voices are used with nl_render_configure.',
277
+ inputSchema: {
278
+ gender: z.string().optional().describe('Filter by gender (e.g. Male, Female)'),
279
+ accent: z.string().optional().describe('Filter by accent (e.g. US, UK, AU)'),
280
+ tier: z.string().optional().describe('Filter by tier (e.g. free, premium)'),
281
+ },
282
+ }, async ({ gender, accent, tier }) => {
283
+ try {
284
+ // Voices endpoint is public — no auth needed, but use the correct env
285
+ const auth = loadAuth();
286
+ const baseUrl = API_BASE_URLS[auth?.env ?? 'production'];
287
+ const res = await fetch(`${baseUrl}/voices`);
288
+ if (!res.ok)
289
+ throw new Error(`HTTP ${res.status}`);
290
+ const data = (await res.json());
291
+ let voices = data.voices;
292
+ if (gender) {
293
+ const g = gender.toLowerCase();
294
+ voices = voices.filter((v) => String(v['gender'] ?? '').toLowerCase() === g);
295
+ }
296
+ if (accent) {
297
+ const a = accent.toLowerCase();
298
+ voices = voices.filter((v) => String(v['accent'] ?? '').toLowerCase() === a);
299
+ }
300
+ if (tier) {
301
+ const t = tier.toLowerCase();
302
+ voices = voices.filter((v) => String(v['tier'] ?? '').toLowerCase() === t);
303
+ }
304
+ return textResult(JSON.stringify(voices, null, 2));
305
+ }
306
+ catch (err) {
307
+ return errorResult(err instanceof Error ? err.message : String(err));
308
+ }
309
+ });
310
+ // ── Create & Edit ──────────────────────────────────────────────────────
311
+ server.registerTool('nl_create', {
312
+ description: 'Create a new practice set from intent text. AI generates affirmations based on your intent. Returns the new set with generated affirmations. Costs 1 credit.',
313
+ inputSchema: {
314
+ text: z
315
+ .string()
316
+ .min(1)
317
+ .max(500)
318
+ .describe('Intent text describing what you want to practice (e.g. "I am confident and capable")'),
319
+ tone: toneSchema.describe('Tone preference: grounded (default), open, or mystical'),
320
+ },
321
+ }, async ({ text, tone }) => withClient(async (client) => {
322
+ const result = await client.createAndGenerate(text, tone);
323
+ return textResult(JSON.stringify(result, null, 2));
324
+ }));
325
+ server.registerTool('nl_rename', {
326
+ description: 'Update the title and/or emoji of a practice set. At least one of title or emoji must be provided.',
327
+ inputSchema: {
328
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
329
+ title: z.string().min(1).max(200).optional().describe('New title'),
330
+ emoji: z.string().nullable().optional().describe('New emoji (or null to clear)'),
331
+ },
332
+ }, async ({ id, title, emoji }) => {
333
+ if (title === undefined && emoji === undefined) {
334
+ return errorResult('At least one of title or emoji must be provided.');
335
+ }
336
+ return withClient(async (client) => {
337
+ const resolvedId = await resolveIntentId(client, id);
338
+ const input = {};
339
+ if (title !== undefined)
340
+ input.title = title;
341
+ if (emoji !== undefined)
342
+ input.emoji = emoji;
343
+ const result = await client.updateIntent(resolvedId, input);
344
+ return textResult(JSON.stringify(result, null, 2));
345
+ });
346
+ });
347
+ server.registerTool('nl_sync_affirmations', {
348
+ description: 'Declarative edit of affirmations in a practice set. Provide the complete desired list — affirmations not in the list are removed, new ones are added, existing ones are updated. Each affirmation needs text and enabled status. Include id for existing affirmations to preserve them.',
349
+ inputSchema: {
350
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
351
+ affirmations: z
352
+ .array(z.object({
353
+ id: z.string().optional().describe('Existing affirmation ID (omit for new)'),
354
+ text: z.string().min(1).describe('Affirmation text'),
355
+ enabled: z.boolean().describe('Whether this affirmation is active'),
356
+ }))
357
+ .min(1)
358
+ .describe('Complete list of desired affirmations'),
359
+ },
360
+ }, async ({ id, affirmations }) => withClient(async (client) => {
361
+ const resolvedId = await resolveIntentId(client, id);
362
+ const result = await client.syncAffirmations(resolvedId, { affirmations });
363
+ return textResult(`Sync complete: ${result.added} added, ${result.updated} updated, ${result.removed} removed.`);
364
+ }));
365
+ server.registerTool('nl_delete', {
366
+ description: 'Delete a practice set permanently. This cannot be undone.',
367
+ inputSchema: {
368
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
369
+ },
370
+ }, async ({ id }) => withClient(async (client) => {
371
+ const resolvedId = await resolveIntentId(client, id);
372
+ await client.deleteIntent(resolvedId);
373
+ return textResult(`Deleted practice set ${resolvedId}.`);
374
+ }));
375
+ // ── Render & Playback ──────────────────────────────────────────────────
376
+ server.registerTool('nl_render_configure', {
377
+ description: 'Configure render settings for a practice set. Must be done before starting a render. Use nl_voices to find available voice IDs.',
378
+ inputSchema: {
379
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
380
+ voiceId: z.string().min(1).describe('Voice ID to use (from nl_voices)'),
381
+ sessionContext: z
382
+ .enum(['general', 'sleep', 'nap', 'meditation', 'workout', 'focus', 'walk', 'chores'])
383
+ .describe('Session context for pacing and tone'),
384
+ durationMinutes: z.number().int().min(1).max(120).describe('Target duration in minutes'),
385
+ paceWpm: z.number().int().min(90).max(220).optional().describe('Pace in words per minute'),
386
+ backgroundAudioPath: z
387
+ .string()
388
+ .nullable()
389
+ .optional()
390
+ .describe('Background sound storageKey (from nl_voices background list), or null to disable'),
391
+ backgroundVolume: z.number().min(0).max(1).optional().describe('Background volume 0-1'),
392
+ affirmationRepeatCount: z.number().int().min(1).max(5).optional().describe('Times each affirmation repeats'),
393
+ includePreamble: z.boolean().optional().describe('Include intro/outro preamble'),
394
+ playAll: z.boolean().optional().describe('Play all affirmations instead of fitting within duration'),
395
+ },
396
+ }, async ({ id, voiceId, sessionContext, durationMinutes, paceWpm, backgroundAudioPath, backgroundVolume, affirmationRepeatCount, includePreamble, playAll }) => withClient(async (client) => {
397
+ const resolvedId = await resolveIntentId(client, id);
398
+ const input = { voiceId, sessionContext, durationMinutes };
399
+ if (paceWpm !== undefined)
400
+ input.paceWpm = paceWpm;
401
+ if (backgroundAudioPath !== undefined)
402
+ input.backgroundAudioPath = backgroundAudioPath;
403
+ if (backgroundVolume !== undefined)
404
+ input.backgroundVolume = backgroundVolume;
405
+ if (affirmationRepeatCount !== undefined)
406
+ input.affirmationRepeatCount = affirmationRepeatCount;
407
+ if (includePreamble !== undefined)
408
+ input.includePreamble = includePreamble;
409
+ if (playAll !== undefined)
410
+ input.playAll = playAll;
411
+ const result = await client.configureRender(resolvedId, input);
412
+ return textResult(JSON.stringify(result, null, 2));
413
+ }));
414
+ server.registerTool('nl_render_start', {
415
+ description: 'Start rendering audio for a practice set. The set must have a render config (use nl_render_configure first). Returns a job ID for tracking progress.',
416
+ inputSchema: {
417
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
418
+ },
419
+ }, async ({ id }) => withClient(async (client) => {
420
+ const resolvedId = await resolveIntentId(client, id);
421
+ const result = await client.startRender(resolvedId);
422
+ return textResult(JSON.stringify(result, null, 2));
423
+ }));
424
+ server.registerTool('nl_render_status', {
425
+ description: 'Check the render progress of a practice set. Returns status (none, queued, processing, completed, failed) and progress percentage.',
426
+ inputSchema: {
427
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
428
+ },
429
+ }, async ({ id }) => withClient(async (client) => {
430
+ const resolvedId = await resolveIntentId(client, id);
431
+ const result = await client.getRenderStatus(resolvedId);
432
+ return textResult(JSON.stringify(result, null, 2));
433
+ }));
434
+ server.registerTool('nl_rerender', {
435
+ description: 'Re-render a practice set with its current config. Convenience wrapper that starts a new render job.',
436
+ inputSchema: {
437
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
438
+ },
439
+ }, async ({ id }) => withClient(async (client) => {
440
+ const resolvedId = await resolveIntentId(client, id);
441
+ const result = await client.startRender(resolvedId);
442
+ return textResult(JSON.stringify(result, null, 2));
443
+ }));
444
+ server.registerTool('nl_play', {
445
+ description: 'Download rendered audio for a practice set and return the local file path. The audio must be fully rendered first (status: completed). The file is cached locally for future use.',
446
+ inputSchema: {
447
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
448
+ },
449
+ }, async ({ id }) => withClient(async (client) => {
450
+ // Find the library item, resolving short IDs with ambiguity check
451
+ const { items } = await client.getLibrary();
452
+ let item = items.find((i) => i.intent.id === id);
453
+ if (!item) {
454
+ const prefixMatches = items.filter((i) => i.intent.id.startsWith(id));
455
+ if (prefixMatches.length === 1) {
456
+ item = prefixMatches[0];
457
+ }
458
+ else if (prefixMatches.length > 1) {
459
+ throw new Error(`Ambiguous ID "${id}" matches ${prefixMatches.length} sets. Use a longer prefix or the full ID.`);
460
+ }
461
+ }
462
+ if (!item) {
463
+ return errorResult('Practice set not found. Use nl_library to see available sets.');
464
+ }
465
+ const renderJob = item.latestRenderJob;
466
+ if (!renderJob?.id) {
467
+ return errorResult('No rendered audio available. Use nl_render_start first.');
468
+ }
469
+ if (renderJob.status !== 'completed') {
470
+ return errorResult(`Render is ${renderJob.status}, not ready to play. Wait for completion.`);
471
+ }
472
+ const cacheFile = join(AUDIO_CACHE_DIR, `${renderJob.id}.mp3`);
473
+ if (existsSync(cacheFile)) {
474
+ return textResult(JSON.stringify({ path: cacheFile, cached: true }, null, 2));
475
+ }
476
+ const audio = await client.getAudio(renderJob.id);
477
+ mkdirSync(AUDIO_CACHE_DIR, { recursive: true });
478
+ writeFileSync(cacheFile, audio);
479
+ return textResult(JSON.stringify({ path: cacheFile, cached: false }, null, 2));
480
+ }));
481
+ // ── Sharing & Settings ─────────────────────────────────────────────────
482
+ server.registerTool('nl_share', {
483
+ description: 'Generate a public share link for a practice set. Anyone with the link can view and copy it.',
484
+ inputSchema: {
485
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
486
+ },
487
+ }, async ({ id }) => withClient(async (client) => {
488
+ const resolvedId = await resolveIntentId(client, id);
489
+ const result = await client.shareIntent(resolvedId);
490
+ return textResult(JSON.stringify(result, null, 2));
491
+ }));
492
+ server.registerTool('nl_unshare', {
493
+ description: 'Revoke the share link for a practice set. The link will no longer work.',
494
+ inputSchema: {
495
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
496
+ },
497
+ }, async ({ id }) => withClient(async (client) => {
498
+ const resolvedId = await resolveIntentId(client, id);
499
+ await client.unshareIntent(resolvedId);
500
+ return textResult(`Share link revoked for ${resolvedId}.`);
501
+ }));
502
+ server.registerTool('nl_credits', {
503
+ description: 'Check the current credit balance. Shows subscription credits, purchased credits, and total available.',
504
+ inputSchema: {},
505
+ }, async () => withClient(async (client) => {
506
+ const { user } = await client.getMe();
507
+ return textResult(JSON.stringify({
508
+ creditBalance: user.creditBalance,
509
+ subscriptionCredits: user.subscriptionCredits,
510
+ purchasedCredits: user.purchasedCredits,
511
+ creditsResetAt: user.creditsResetAt,
512
+ subscriptionTier: user.subscriptionTier,
513
+ subscriptionStatus: user.subscriptionStatus,
514
+ }, null, 2));
515
+ }));
516
+ // ── YAML Set Files ─────────────────────────────────────────────────────
517
+ server.registerTool('nl_set_export', {
518
+ description: 'Export a practice set as a YAML string. Includes title, emoji, intent text, affirmations, and render config. The YAML can be edited and re-imported with nl_set_import.',
519
+ inputSchema: {
520
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
521
+ },
522
+ }, async ({ id }) => withClient(async (client) => {
523
+ const resolvedId = await resolveIntentId(client, id);
524
+ const data = await fetchSetFileData(client, resolvedId);
525
+ const yaml = serializeSetFile(data);
526
+ return textResult(yaml);
527
+ }));
528
+ server.registerTool('nl_set_import', {
529
+ description: 'Apply a YAML set file to an existing practice set. Updates title, emoji, affirmations, and render config based on the YAML content. Use nl_set_export to get the current YAML first, edit it, then import.',
530
+ inputSchema: {
531
+ id: z.string().min(1).describe('Practice set ID (full or short prefix)'),
532
+ yaml: z.string().min(1).describe('YAML content to apply (from nl_set_export, edited)'),
533
+ },
534
+ }, async ({ id, yaml }) => withClient(async (client) => {
535
+ const resolvedId = await resolveIntentId(client, id);
536
+ const originalData = await fetchSetFileData(client, resolvedId);
537
+ const result = await applySetFile(client, resolvedId, yaml, originalData);
538
+ return textResult(result);
539
+ }));
540
+ return server;
541
+ }
542
+ // ── Main ───────────────────────────────────────────────────────────────────
543
+ async function main() {
544
+ const server = buildServer();
545
+ const transport = new StdioServerTransport();
546
+ await server.connect(transport);
547
+ }
548
+ main().catch((err) => {
549
+ console.error('Fatal:', err);
550
+ process.exit(1);
551
+ });
552
+ //# sourceMappingURL=user-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-mcp.js","sourceRoot":"","sources":["../src/user-mcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@innerstacklabs/neuralingual-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Neuralingual CLI — AI-powered affirmation practice sets",
5
5
  "type": "module",
6
6
  "bin": {
7
- "neuralingual": "dist/cli.js"
7
+ "neuralingual": "dist/cli.js",
8
+ "neuralingual-mcp": "dist/user-mcp.js"
8
9
  },
9
10
  "files": [
10
11
  "dist/"
@@ -14,6 +15,7 @@
14
15
  "typecheck": "tsc -p tsconfig.json --noEmit"
15
16
  },
16
17
  "dependencies": {
18
+ "@modelcontextprotocol/sdk": "^1.29.0",
17
19
  "commander": "^14.0.0",
18
20
  "yaml": "^2.8.3",
19
21
  "zod": "^4.3.6"