@towry/mcp 0.1.7 → 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.
package/dist/index.js CHANGED
@@ -1,578 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * @towry/mcp - Knowledge Graph & Tmux MCP Server
3
+ * @towry/mcp - Grep MCP Server
4
4
  *
5
5
  * Provides tools for:
6
- * - Document management in a knowledge graph
7
- * - Tmux pane management and control
6
+ * - Fast grep-based code search
8
7
  *
9
- * Environment Variables:
10
- * - KG_API_URL: API base URL (default: http://localhost:8361)
11
- * - KG_API_KEY or KG_API_TOKEN: API authentication key
12
- *
13
- * Keywords: mcp, knowledge-graph, document-management, tmux, ai-tools, llm-server
8
+ * Keywords: mcp, grep, ai-tools, llm-server
14
9
  */
15
- import { spawn } from "node:child_process";
16
- import { z } from "zod";
17
10
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18
11
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
19
- import { TmuxCLI, getCurrentPaneInfo, shellQuote } from "./tmux.js";
20
12
  import { registerGrepFastTools } from "./grep-fast.js";
21
- // ============================================================================
22
- // Knowledge Graph Types
23
- // ============================================================================
24
- const DocTypeEnum = z.enum(["note", "doc", "task", "plan", "agent_session"]);
25
- const TaskStatusEnum = z.enum(["pending", "in_progress", "done", "blocked"]);
26
- // ============================================================================
27
- // Knowledge Graph API Client
28
- // ============================================================================
29
- function getKgBaseUrl() {
30
- return process.env.KG_API_URL ?? "http://localhost:8361";
31
- }
32
- function getKgApiKey() {
33
- return process.env.KG_API_KEY ?? process.env.KG_API_TOKEN ?? "kg-dev-api-key";
34
- }
35
- async function kgApiRequest(method, path, body) {
36
- const url = `${getKgBaseUrl()}${path}`;
37
- const headers = {
38
- "X-API-Key": getKgApiKey(),
39
- "Content-Type": "application/json",
40
- };
41
- const res = await fetch(url, {
42
- method,
43
- headers,
44
- body: body ? JSON.stringify(body) : undefined,
45
- });
46
- if (!res.ok) {
47
- const text = await res.text();
48
- throw new Error(`API error ${res.status}: ${text}`);
49
- }
50
- return res.json();
51
- }
52
- // ============================================================================
53
- // Tmux CLI Instance
54
- // ============================================================================
55
- const tmux = new TmuxCLI();
56
- const DEFAULT_CWD = process.cwd();
13
+ import { registerCheckpointTools } from "./checkpoints.js";
57
14
  // ============================================================================
58
15
  // MCP Server
59
16
  // ============================================================================
60
17
  const server = new McpServer({
61
18
  name: "towry-mcp",
62
- version: "0.1.0",
63
- });
64
- // ============================================================================
65
- // Knowledge Graph Tools
66
- // ============================================================================
67
- // kg_create_doc - Create or update a document
68
- server.registerTool("kg_create_doc", {
69
- description: "Create or update a document. Use 'note' for session learnings (ephemeral), 'doc' for stable reference docs, 'plan' for roadmaps, 'task' for actionable items. For insights from current chat, prefer kg_insight_save.",
70
- inputSchema: {
71
- title: z.string().describe("Document title"),
72
- body: z.string().describe("Document content"),
73
- doc_type: DocTypeEnum.describe("note: session learnings (ephemeral), doc: stable reference, task: actionable items, plan: roadmaps, agent_session: chat logs"),
74
- id: z.string().optional().describe("UUID to update existing doc"),
75
- project_repo: z.string().optional().describe("Project repo (owner/repo)"),
76
- tags: z.array(z.string()).optional().describe("Tags for categorization"),
77
- status: TaskStatusEnum.optional().describe("Task status (only for task type)"),
78
- parent_id: z
79
- .string()
80
- .optional()
81
- .describe("Parent document ID for hierarchy"),
82
- },
83
- }, async (params) => {
84
- const result = await kgApiRequest("POST", "/api/docs", {
85
- ...params,
86
- doc_type: params.doc_type ?? "note",
87
- });
88
- return {
89
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
90
- };
91
- });
92
- // kg_get_doc - Get full document by ID
93
- server.registerTool("kg_get_doc", {
94
- description: "Get full document by ID. Use AFTER kg_search when you need the complete body (snippets are truncated).",
95
- inputSchema: {
96
- id: z.string().describe("Document UUID"),
97
- },
98
- }, async (params) => {
99
- const result = await kgApiRequest("GET", `/api/docs/${params.id}`);
100
- return {
101
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
102
- };
103
- });
104
- // kg_delete_doc - Delete a document
105
- server.registerTool("kg_delete_doc", {
106
- description: "Delete a document from the knowledge graph.",
107
- inputSchema: {
108
- id: z.string().describe("Document UUID to delete"),
109
- },
110
- }, async (params) => {
111
- const result = await kgApiRequest("DELETE", `/api/docs/${params.id}`);
112
- return {
113
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
114
- };
115
- });
116
- // kg_search - Search documents
117
- server.registerTool("kg_search", {
118
- description: "Find plans, tasks, or docs. Use doc_type='plan' for plans, tag='insight' for insights. Returns snippets - use kg_get_doc for full content.",
119
- inputSchema: {
120
- q: z
121
- .string()
122
- .optional()
123
- .describe("Search query (optional - omit to list all of doc_type)"),
124
- doc_type: DocTypeEnum.optional().describe("Filter by type: 'plan' for plans, 'note' for insights/learnings"),
125
- project_repo: z.string().optional().describe("Filter by project repo"),
126
- status: TaskStatusEnum.optional().describe("Filter by task status"),
127
- tag: z.string().optional().describe("Filter by tag"),
128
- limit: z.number().int().min(1).max(100).default(20).optional(),
129
- offset: z.number().int().min(0).default(0).optional(),
130
- },
131
- }, async (params) => {
132
- const searchParams = new URLSearchParams();
133
- if (params.q)
134
- searchParams.set("q", params.q);
135
- if (params.doc_type)
136
- searchParams.set("doc_type", params.doc_type);
137
- if (params.project_repo)
138
- searchParams.set("project_repo", params.project_repo);
139
- if (params.status)
140
- searchParams.set("status", params.status);
141
- if (params.tag)
142
- searchParams.set("tag", params.tag);
143
- if (params.limit)
144
- searchParams.set("limit", String(params.limit));
145
- if (params.offset)
146
- searchParams.set("offset", String(params.offset));
147
- const result = await kgApiRequest("GET", `/api/docs/search?${searchParams.toString()}`);
148
- return {
149
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
150
- };
151
- });
152
- // kg_semantic_search - Semantic search using embeddings
153
- server.registerTool("kg_semantic_search", {
154
- description: "Semantic search using embeddings in the knowledge graph.",
155
- inputSchema: {
156
- q: z.string().describe("Search query (required)"),
157
- embedding_keywords: z
158
- .array(z.string())
159
- .optional()
160
- .describe("Keywords for embedding search. If provided, searches with these keywords. If not, fetches latest 2 docs."),
161
- doc_type: DocTypeEnum.optional().describe("Filter by document type"),
162
- project_repo: z.string().optional().describe("Filter by project repo"),
163
- tag: z.string().optional().describe("Filter by tag"),
164
- limit: z.number().int().min(1).max(20).default(5).optional(),
165
- },
166
- }, async (params) => {
167
- const searchParams = new URLSearchParams();
168
- const searchQuery = params.embedding_keywords && params.embedding_keywords.length > 0
169
- ? params.embedding_keywords.join(" ")
170
- : params.q;
171
- searchParams.set("q", searchQuery);
172
- if (params.doc_type)
173
- searchParams.set("doc_type", params.doc_type);
174
- if (params.project_repo)
175
- searchParams.set("project_repo", params.project_repo);
176
- if (params.tag)
177
- searchParams.set("tag", params.tag);
178
- if (params.limit)
179
- searchParams.set("limit", String(params.limit));
180
- const result = await kgApiRequest("GET", `/api/docs/semantic?${searchParams.toString()}`);
181
- return {
182
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
183
- };
184
- });
185
- // kg_status - Get document statistics
186
- server.registerTool("kg_status", {
187
- description: "Get document statistics: total count, breakdown by type (plan/task/doc/note) and by repo. Use to check what's stored before searching.",
188
- inputSchema: {},
189
- }, async () => {
190
- const result = await kgApiRequest("GET", "/api/docs/status");
191
- return {
192
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
193
- };
194
- });
195
- // ============================================================================
196
- // Tmux Tools
197
- // ============================================================================
198
- // tmux_list_sessions - List all tmux sessions
199
- server.registerTool("tmux_list_sessions", {
200
- description: "List all tmux sessions with their windows count and attachment status",
201
- inputSchema: {},
202
- }, async () => {
203
- try {
204
- const sessions = await tmux.listTmuxSessions();
205
- return {
206
- content: [{ type: "text", text: JSON.stringify(sessions, null, 2) }],
207
- };
208
- }
209
- catch (err) {
210
- return {
211
- content: [{ type: "text", text: String(err) }],
212
- isError: true,
213
- };
214
- }
215
- });
216
- // tmux_create_session - Create a new tmux session
217
- server.registerTool("tmux_create_session", {
218
- description: "Create a new detached tmux session",
219
- inputSchema: {
220
- name: z.string().describe("Session name"),
221
- command: z
222
- .string()
223
- .optional()
224
- .describe("Optional command to run in the new session"),
225
- cwd: z
226
- .string()
227
- .optional()
228
- .describe("Working directory for the session. Must be an absolute path that exists."),
229
- },
230
- }, async (params) => {
231
- try {
232
- const result = await tmux.createTmuxSession(params.name, params.command, params.cwd);
233
- if (!result) {
234
- return {
235
- content: [{ type: "text", text: "failed to create session" }],
236
- isError: true,
237
- };
238
- }
239
- return {
240
- content: [{ type: "text", text: `created session: ${result}` }],
241
- };
242
- }
243
- catch (err) {
244
- return {
245
- content: [{ type: "text", text: String(err) }],
246
- isError: true,
247
- };
248
- }
249
- });
250
- // tmux_kill_session - Kill a tmux session
251
- server.registerTool("tmux_kill_session", {
252
- description: "Kill a tmux session. Cannot kill the current session you are attached to.",
253
- inputSchema: {
254
- name: z.string().describe("Session name to kill"),
255
- },
256
- }, async (params) => {
257
- try {
258
- const result = await tmux.killTmuxSession(params.name);
259
- if (!result) {
260
- return {
261
- content: [{ type: "text", text: "failed to kill session" }],
262
- isError: true,
263
- };
264
- }
265
- return {
266
- content: [{ type: "text", text: `killed session: ${params.name}` }],
267
- };
268
- }
269
- catch (err) {
270
- return {
271
- content: [{ type: "text", text: String(err) }],
272
- isError: true,
273
- };
274
- }
275
- });
276
- // tmux_create_window - Create a new window
277
- server.registerTool("tmux_create_window", {
278
- description: "Create a new window in the current or specified session. Window is created in background by default (detached).",
279
- inputSchema: {
280
- name: z.string().optional().describe("Window name"),
281
- command: z
282
- .string()
283
- .optional()
284
- .describe("Optional command to run in the new window"),
285
- session: z
286
- .string()
287
- .optional()
288
- .describe("Target session. Defaults to current session."),
289
- cwd: z
290
- .string()
291
- .optional()
292
- .describe("Working directory for the window. Must be an absolute path that exists."),
293
- detached: z
294
- .boolean()
295
- .default(true)
296
- .optional()
297
- .describe("Create window in background without switching to it. Default: true."),
298
- },
299
- }, async (params) => {
300
- try {
301
- const paneId = await tmux.createTmuxWindow({
302
- name: params.name,
303
- command: params.command,
304
- session: params.session,
305
- cwd: params.cwd,
306
- detached: params.detached ?? true,
307
- });
308
- if (!paneId) {
309
- return {
310
- content: [{ type: "text", text: "failed to create window" }],
311
- isError: true,
312
- };
313
- }
314
- return {
315
- content: [{ type: "text", text: `created window in pane ${paneId}` }],
316
- };
317
- }
318
- catch (err) {
319
- return {
320
- content: [{ type: "text", text: String(err) }],
321
- isError: true,
322
- };
323
- }
324
- });
325
- // tmux_list_panes - List all tmux panes
326
- server.registerTool("tmux_list_panes", {
327
- description: "List all tmux panes in the current session (or specified session) across all windows.",
328
- inputSchema: {
329
- session: z
330
- .string()
331
- .optional()
332
- .describe("Session name to list panes from. If omitted, lists panes in current window."),
333
- },
334
- }, async (params) => {
335
- try {
336
- const panes = await tmux.listTmuxPanes(params.session);
337
- // Filter out current pane to prevent self-operations
338
- const currentPane = process.env.TMUX_PANE || (await getCurrentPaneInfo()).id;
339
- const filtered = currentPane
340
- ? panes.filter((p) => p.id !== currentPane)
341
- : panes;
342
- return {
343
- content: [{ type: "text", text: JSON.stringify(filtered, null, 2) }],
344
- };
345
- }
346
- catch (err) {
347
- return {
348
- content: [{ type: "text", text: String(err) }],
349
- isError: true,
350
- };
351
- }
352
- });
353
- // tmux_send - Send keys to a pane
354
- server.registerTool("tmux_send", {
355
- description: "Send keys to a tmux pane with pane id, after you send, wait for notify from target pane or user, do not polling for result",
356
- inputSchema: {
357
- pane: z
358
- .string()
359
- .describe("Target pane id in %N format (e.g., %886). Note: pane id is different from pane index. Use tmux_list_panes to get pane ids."),
360
- keys: z.string().describe("Keys to send"),
361
- enter: z.boolean().default(true).optional().describe("Send Enter after"),
362
- },
363
- }, async (params) => {
364
- const targetPane = params.pane;
365
- const currentPane = process.env.TMUX_PANE;
366
- if (currentPane && targetPane === currentPane) {
367
- return {
368
- content: [{ type: "text", text: "cannot send keys to current pane" }],
369
- isError: true,
370
- };
371
- }
372
- try {
373
- const paneInfo = await getCurrentPaneInfo();
374
- const signature = paneInfo.id
375
- ? ` [from ${paneInfo.id}${paneInfo.title ? `: ${paneInfo.title}` : ""}]`
376
- : "";
377
- const keysWithSig = params.keys + signature;
378
- await tmux.sendTmuxKeys(keysWithSig, {
379
- pane: targetPane,
380
- enter: params.enter ?? true,
381
- });
382
- return {
383
- content: [
384
- {
385
- type: "text",
386
- text: `sent to ${targetPane}${params.enter === false ? " (no enter)" : ""}`,
387
- },
388
- ],
389
- };
390
- }
391
- catch (err) {
392
- return {
393
- content: [{ type: "text", text: String(err) }],
394
- isError: true,
395
- };
396
- }
397
- });
398
- // tmux_kill_pane - Kill a pane
399
- server.registerTool("tmux_kill_pane", {
400
- description: "Kill a tmux pane by index (cannot close the last page)",
401
- inputSchema: {
402
- pane: z
403
- .string()
404
- .describe("Pane ID in %N format (e.g., %886). Do NOT use session:window.pane format - indices shift when panes are killed."),
405
- },
406
- }, async (params) => {
407
- // Reject volatile formatted IDs
408
- if (params.pane.includes(":") || params.pane.includes(".")) {
409
- return {
410
- content: [
411
- {
412
- type: "text",
413
- text: `Invalid pane ID format: "${params.pane}". Use stable %N format (e.g., %886), not session:window.pane format which shifts when panes are killed.`,
414
- },
415
- ],
416
- isError: true,
417
- };
418
- }
419
- const normalize = (id) => (id.startsWith("%") ? id : `%${id}`);
420
- const inputNorm = normalize(params.pane);
421
- // Safety: prevent killing current pane
422
- const envPane = process.env.TMUX_PANE;
423
- if (envPane && inputNorm === normalize(envPane)) {
424
- return {
425
- content: [{ type: "text", text: "cannot kill current pane (self)" }],
426
- isError: true,
427
- };
428
- }
429
- if (!envPane) {
430
- const currentInfo = await getCurrentPaneInfo();
431
- if (currentInfo.id && inputNorm === normalize(currentInfo.id)) {
432
- return {
433
- content: [{ type: "text", text: "cannot kill current pane (self)" }],
434
- isError: true,
435
- };
436
- }
437
- }
438
- try {
439
- await tmux.killTmuxPane(inputNorm);
440
- return {
441
- content: [{ type: "text", text: "killed" }],
442
- };
443
- }
444
- catch (err) {
445
- return {
446
- content: [{ type: "text", text: String(err) }],
447
- isError: true,
448
- };
449
- }
450
- });
451
- // tmux_capture - Capture pane content
452
- server.registerTool("tmux_capture", {
453
- description: "Capture the content of a tmux pane. Defaults to last 10 lines. Use filter for grep with context. Do not use this for checking result, just wait for notify.",
454
- inputSchema: {
455
- pane: z.string().describe("Target pane id to capture"),
456
- lines: z
457
- .number()
458
- .optional()
459
- .describe("Number of lines to capture from end (default: 10)"),
460
- filter: z
461
- .string()
462
- .optional()
463
- .describe("Grep pattern (case-insensitive, extended regex). Use | for OR: 'error|fail|warning'"),
464
- },
465
- }, async (params) => {
466
- const currentPane = process.env.TMUX_PANE;
467
- if (currentPane && params.pane === currentPane) {
468
- return {
469
- content: [{ type: "text", text: "cannot capture current pane" }],
470
- isError: true,
471
- };
472
- }
473
- try {
474
- let output = await tmux.captureTmuxPane({
475
- pane: params.pane,
476
- lines: params.lines ?? 10,
477
- });
478
- if (params.filter?.trim()) {
479
- const grepProc = spawn("grep", ["-i", "-E", "-C3", params.filter.trim()], {
480
- stdio: ["pipe", "pipe", "pipe"],
481
- });
482
- grepProc.stdin.write(output);
483
- grepProc.stdin.end();
484
- output = await new Promise((resolve) => {
485
- let out = "";
486
- grepProc.stdout.on("data", (d) => (out += d.toString()));
487
- grepProc.on("close", () => resolve(out.trim()));
488
- });
489
- }
490
- return {
491
- content: [{ type: "text", text: output || "(no matching content)" }],
492
- };
493
- }
494
- catch (err) {
495
- return {
496
- content: [{ type: "text", text: String(err) }],
497
- isError: true,
498
- };
499
- }
500
- });
501
- // tmux_run - Run command in new pane
502
- server.registerTool("tmux_run", {
503
- description: "Run a long-running command in a new tmux pane. Checks for existing panes with same name to prevent duplicates (e.g., port conflicts).",
504
- inputSchema: {
505
- command: z.string().describe("Command to run"),
506
- name: z
507
- .string()
508
- .optional()
509
- .describe("Unique identifier for duplicate detection. If omitted, derived from command."),
510
- cwd: z
511
- .string()
512
- .optional()
513
- .describe("Working directory for the command. Defaults to current project cwd."),
514
- },
515
- }, async (params) => {
516
- if (!params.command?.trim()) {
517
- return {
518
- content: [{ type: "text", text: "command is required" }],
519
- isError: true,
520
- };
521
- }
522
- const workingDir = params.cwd || DEFAULT_CWD;
523
- // Derive title
524
- const cmdSlug = params.command
525
- .trim()
526
- .slice(0, 40)
527
- .replace(/[^a-zA-Z0-9 _\-.]/g, "")
528
- .trim();
529
- const title = params.name?.trim()
530
- ? `pi-run:${cmdSlug}:${params.name.trim()}`
531
- : `pi-run:${cmdSlug}`;
532
- try {
533
- // Check for existing pane with same title
534
- const panes = await tmux.listTmuxPanes();
535
- const existing = panes.find((pane) => pane.title === title);
536
- if (existing) {
537
- return {
538
- content: [
539
- {
540
- type: "text",
541
- text: `pane "${title}" already exists: ${existing.id}. Kill it first to restart.`,
542
- },
543
- ],
544
- isError: true,
545
- };
546
- }
547
- // Build command with title setting
548
- const startCommand = `cd ${shellQuote(workingDir)} && tmux set-option -p allow-set-title off && tmux select-pane -T ${shellQuote(title)} && ${params.command}`;
549
- const paneId = await tmux.launchTmuxPane(startCommand, {
550
- vertical: true,
551
- size: 50,
552
- });
553
- if (!paneId) {
554
- return {
555
- content: [{ type: "text", text: "launch failed" }],
556
- isError: true,
557
- };
558
- }
559
- return {
560
- content: [
561
- { type: "text", text: `started in pane ${paneId}. title: ${title}` },
562
- ],
563
- };
564
- }
565
- catch (err) {
566
- return {
567
- content: [{ type: "text", text: String(err) }],
568
- isError: true,
569
- };
570
- }
19
+ version: "0.3.0",
571
20
  });
572
21
  // ============================================================================
573
- // Grep Fast Tools
22
+ // Tools Registration
574
23
  // ============================================================================
575
24
  registerGrepFastTools(server);
25
+ registerCheckpointTools(server);
576
26
  // ============================================================================
577
27
  // Start Server
578
28
  // ============================================================================
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAEhC,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@towry/mcp",
3
- "version": "0.1.7",
3
+ "version": "0.3.0",
4
4
  "description": "MCP server implementation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",