@grackle-ai/mcp 0.19.0 → 0.21.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 (55) hide show
  1. package/dist/error-handler.d.ts +7 -0
  2. package/dist/error-handler.d.ts.map +1 -0
  3. package/dist/error-handler.js +40 -0
  4. package/dist/error-handler.js.map +1 -0
  5. package/dist/mcp-server.d.ts.map +1 -1
  6. package/dist/mcp-server.js +29 -7
  7. package/dist/mcp-server.js.map +1 -1
  8. package/dist/result-helpers.d.ts +7 -0
  9. package/dist/result-helpers.d.ts.map +1 -0
  10. package/dist/result-helpers.js +15 -0
  11. package/dist/result-helpers.js.map +1 -0
  12. package/dist/tool-registry.d.ts +12 -9
  13. package/dist/tool-registry.d.ts.map +1 -1
  14. package/dist/tool-registry.js +6 -0
  15. package/dist/tool-registry.js.map +1 -1
  16. package/dist/tools/env.d.ts +4 -0
  17. package/dist/tools/env.d.ts.map +1 -0
  18. package/dist/tools/env.js +267 -0
  19. package/dist/tools/env.js.map +1 -0
  20. package/dist/tools/finding.d.ts +4 -0
  21. package/dist/tools/finding.d.ts.map +1 -0
  22. package/dist/tools/finding.js +95 -0
  23. package/dist/tools/finding.js.map +1 -0
  24. package/dist/tools/index.d.ts.map +1 -1
  25. package/dist/tools/index.js +14 -4
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/logs.d.ts +4 -0
  28. package/dist/tools/logs.d.ts.map +1 -0
  29. package/dist/tools/logs.js +149 -0
  30. package/dist/tools/logs.js.map +1 -0
  31. package/dist/tools/persona.d.ts +4 -0
  32. package/dist/tools/persona.d.ts.map +1 -0
  33. package/dist/tools/persona.js +172 -0
  34. package/dist/tools/persona.js.map +1 -0
  35. package/dist/tools/project.d.ts +4 -0
  36. package/dist/tools/project.d.ts.map +1 -0
  37. package/dist/tools/project.js +208 -0
  38. package/dist/tools/project.js.map +1 -0
  39. package/dist/tools/session.d.ts +4 -0
  40. package/dist/tools/session.d.ts.map +1 -0
  41. package/dist/tools/session.js +239 -0
  42. package/dist/tools/session.js.map +1 -0
  43. package/dist/tools/task.d.ts +4 -0
  44. package/dist/tools/task.d.ts.map +1 -0
  45. package/dist/tools/task.js +398 -0
  46. package/dist/tools/task.js.map +1 -0
  47. package/package.json +4 -2
  48. package/dist/tools/list-environments.d.ts +0 -4
  49. package/dist/tools/list-environments.d.ts.map +0 -1
  50. package/dist/tools/list-environments.js +0 -28
  51. package/dist/tools/list-environments.js.map +0 -1
  52. package/dist/tools/list-projects.d.ts +0 -4
  53. package/dist/tools/list-projects.d.ts.map +0 -1
  54. package/dist/tools/list-projects.js +0 -28
  55. package/dist/tools/list-projects.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ import { z } from "zod";
2
+ import { jsonResult } from "../result-helpers.js";
3
+ import { grpcErrorToToolResult } from "../error-handler.js";
4
+ /** MCP tools for Grackle finding management. */
5
+ export const findingTools = [
6
+ {
7
+ name: "finding_list",
8
+ group: "finding",
9
+ description: "Query findings for a project, optionally filtering by category and tags.",
10
+ inputSchema: z.object({
11
+ projectId: z.string().describe("Project ID to query findings for"),
12
+ category: z.string().optional().describe("Filter by finding category"),
13
+ tag: z.string().optional().describe("Filter by tag"),
14
+ limit: z.number().int().positive().optional().describe("Maximum number of findings to return"),
15
+ }),
16
+ rpcMethod: "queryFindings",
17
+ mutating: false,
18
+ annotations: {
19
+ readOnlyHint: true,
20
+ destructiveHint: false,
21
+ idempotentHint: true,
22
+ openWorldHint: false,
23
+ },
24
+ async handler(args, client) {
25
+ try {
26
+ const response = await client.queryFindings({
27
+ projectId: args.projectId,
28
+ categories: args.category ? [args.category] : [],
29
+ tags: args.tag ? [args.tag] : [],
30
+ limit: args.limit ?? 0,
31
+ });
32
+ return jsonResult(response.findings.map((f) => ({
33
+ id: f.id,
34
+ projectId: f.projectId,
35
+ taskId: f.taskId,
36
+ sessionId: f.sessionId,
37
+ category: f.category,
38
+ title: f.title,
39
+ content: f.content,
40
+ tags: [...f.tags],
41
+ createdAt: f.createdAt,
42
+ })));
43
+ }
44
+ catch (error) {
45
+ return grpcErrorToToolResult(error);
46
+ }
47
+ },
48
+ },
49
+ {
50
+ name: "finding_post",
51
+ group: "finding",
52
+ description: "Post a new finding to a project with a title, category, content, and tags.",
53
+ inputSchema: z.object({
54
+ projectId: z.string().describe("Project ID to post the finding to"),
55
+ title: z.string().describe("Finding title"),
56
+ category: z.string().optional().describe("Finding category (e.g. 'bug', 'insight', 'risk')"),
57
+ content: z.string().optional().describe("Detailed finding content"),
58
+ tags: z.array(z.string()).optional().describe("Tags for the finding"),
59
+ }),
60
+ rpcMethod: "postFinding",
61
+ mutating: true,
62
+ annotations: {
63
+ readOnlyHint: false,
64
+ destructiveHint: false,
65
+ idempotentHint: false,
66
+ openWorldHint: false,
67
+ },
68
+ async handler(args, client) {
69
+ try {
70
+ const finding = await client.postFinding({
71
+ projectId: args.projectId,
72
+ title: args.title,
73
+ category: args.category ?? "",
74
+ content: args.content ?? "",
75
+ tags: args.tags ?? [],
76
+ taskId: "",
77
+ sessionId: "",
78
+ });
79
+ return jsonResult({
80
+ id: finding.id,
81
+ projectId: finding.projectId,
82
+ category: finding.category,
83
+ title: finding.title,
84
+ content: finding.content,
85
+ tags: [...finding.tags],
86
+ createdAt: finding.createdAt,
87
+ });
88
+ }
89
+ catch (error) {
90
+ return grpcErrorToToolResult(error);
91
+ }
92
+ },
93
+ },
94
+ ];
95
+ //# sourceMappingURL=finding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finding.js","sourceRoot":"","sources":["../../src/tools/finding.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,YAAY,CAKjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AASnD,wEAAwE;AACxE,wBAAgB,kBAAkB,IAAI,YAAY,CAUjD"}
@@ -1,11 +1,21 @@
1
1
  import { ToolRegistry } from "../tool-registry.js";
2
- import { listEnvironmentsTool } from "./list-environments.js";
3
- import { listProjectsTool } from "./list-projects.js";
2
+ import { envTools } from "./env.js";
3
+ import { sessionTools } from "./session.js";
4
+ import { projectTools } from "./project.js";
5
+ import { taskTools } from "./task.js";
6
+ import { findingTools } from "./finding.js";
7
+ import { personaTools } from "./persona.js";
8
+ import { logsTools } from "./logs.js";
4
9
  /** Create a ToolRegistry pre-populated with all available MCP tools. */
5
10
  export function createToolRegistry() {
6
11
  const registry = new ToolRegistry();
7
- registry.register(listEnvironmentsTool);
8
- registry.register(listProjectsTool);
12
+ registry.registerAll(envTools);
13
+ registry.registerAll(sessionTools);
14
+ registry.registerAll(projectTools);
15
+ registry.registerAll(taskTools);
16
+ registry.registerAll(findingTools);
17
+ registry.registerAll(personaTools);
18
+ registry.registerAll(logsTools);
9
19
  return registry;
10
20
  }
11
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,wEAAwE;AACxE,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACpC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,wEAAwE;AACxE,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "../tool-registry.js";
2
+ /** MCP tools for reading session logs. */
3
+ export declare const logsTools: ToolDefinition[];
4
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAU1D,0CAA0C;AAC1C,eAAO,MAAM,SAAS,EAAE,cAAc,EAgKrC,CAAC"}
@@ -0,0 +1,149 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { eventTypeToString } from "@grackle-ai/common";
4
+ import { z } from "zod";
5
+ import { jsonResult } from "../result-helpers.js";
6
+ import { grpcErrorToToolResult } from "../error-handler.js";
7
+ /** Default timeout in seconds for tail mode. */
8
+ const DEFAULT_TAIL_TIMEOUT_SECONDS = 10;
9
+ /** Maximum timeout in seconds for tail mode. */
10
+ const MAX_TAIL_TIMEOUT_SECONDS = 60;
11
+ /** MCP tools for reading session logs. */
12
+ export const logsTools = [
13
+ {
14
+ name: "logs_get",
15
+ group: "logs",
16
+ description: "Retrieve session logs — raw stream events, formatted transcript, or live tail with timeout.",
17
+ inputSchema: z.object({
18
+ sessionId: z.string().describe("Session ID to retrieve logs for"),
19
+ transcript: z.boolean().optional().describe("Return formatted transcript instead of raw events"),
20
+ tail: z.boolean().optional().describe("Live-tail the session stream with a timeout"),
21
+ timeoutSeconds: z.number().int().positive().max(MAX_TAIL_TIMEOUT_SECONDS).default(DEFAULT_TAIL_TIMEOUT_SECONDS).describe("Timeout in seconds for tail mode (default 10, max 60)"),
22
+ maxEvents: z.number().int().positive().optional().describe("Maximum events to return in tail mode"),
23
+ }),
24
+ rpcMethod: "listSessions",
25
+ mutating: false,
26
+ annotations: {
27
+ readOnlyHint: true,
28
+ destructiveHint: false,
29
+ idempotentHint: true,
30
+ openWorldHint: false,
31
+ },
32
+ async handler(args, client) {
33
+ try {
34
+ // Find the session to get its logPath
35
+ const sessionsResponse = await client.listSessions({
36
+ environmentId: "",
37
+ status: "",
38
+ });
39
+ const session = sessionsResponse.sessions.find((s) => s.id === args.sessionId);
40
+ if (!session) {
41
+ return {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: JSON.stringify({ error: "Session not found", code: "NOT_FOUND" }, null, 2),
46
+ },
47
+ ],
48
+ isError: true,
49
+ };
50
+ }
51
+ if (!session.logPath) {
52
+ return {
53
+ content: [
54
+ {
55
+ type: "text",
56
+ text: JSON.stringify({ error: "Session has no log path", code: "NOT_FOUND" }, null, 2),
57
+ },
58
+ ],
59
+ isError: true,
60
+ };
61
+ }
62
+ // Tail mode: stream live events with timeout
63
+ if (args.tail) {
64
+ const timeout = Math.min(args.timeoutSeconds ?? DEFAULT_TAIL_TIMEOUT_SECONDS, MAX_TAIL_TIMEOUT_SECONDS);
65
+ const maxEvents = args.maxEvents;
66
+ const controller = new AbortController();
67
+ const timer = setTimeout(() => controller.abort(), timeout * 1000);
68
+ const events = [];
69
+ let timedOut = false;
70
+ try {
71
+ const stream = client.streamSession({ id: args.sessionId }, { signal: controller.signal });
72
+ for await (const event of stream) {
73
+ events.push({
74
+ type: eventTypeToString(event.type) || String(event.type),
75
+ timestamp: event.timestamp,
76
+ content: event.content,
77
+ });
78
+ if (maxEvents && events.length >= maxEvents) {
79
+ break;
80
+ }
81
+ }
82
+ }
83
+ catch (err) {
84
+ if (controller.signal.aborted) {
85
+ timedOut = true;
86
+ }
87
+ else {
88
+ clearTimeout(timer);
89
+ throw err;
90
+ }
91
+ }
92
+ finally {
93
+ clearTimeout(timer);
94
+ }
95
+ return jsonResult({ events, timedOut });
96
+ }
97
+ // Transcript mode: read transcript.md
98
+ if (args.transcript) {
99
+ const transcriptPath = join(session.logPath, "transcript.md");
100
+ try {
101
+ const content = await readFile(transcriptPath, "utf-8");
102
+ return jsonResult({ sessionId: session.id, transcript: content });
103
+ }
104
+ catch {
105
+ return {
106
+ content: [
107
+ {
108
+ type: "text",
109
+ text: JSON.stringify({ error: "Transcript file not found", code: "NOT_FOUND" }, null, 2),
110
+ },
111
+ ],
112
+ isError: true,
113
+ };
114
+ }
115
+ }
116
+ // Default: read stream.jsonl
117
+ // TODO: Add GetSessionLogs RPC for proper streaming log access
118
+ const streamPath = join(session.logPath, "stream.jsonl");
119
+ try {
120
+ const content = await readFile(streamPath, "utf-8");
121
+ const events = content
122
+ .trim()
123
+ .split("\n")
124
+ .filter((line) => line.length > 0)
125
+ .map((line) => JSON.parse(line));
126
+ return jsonResult({ sessionId: session.id, events });
127
+ }
128
+ catch (err) {
129
+ const isNotFound = err instanceof Error && "code" in err && err.code === "ENOENT";
130
+ const errorMessage = isNotFound ? "Log file not found" : `Failed to read log file: ${err instanceof Error ? err.message : String(err)}`;
131
+ const errorCode = isNotFound ? "NOT_FOUND" : "INTERNAL";
132
+ return {
133
+ content: [
134
+ {
135
+ type: "text",
136
+ text: JSON.stringify({ error: errorMessage, code: errorCode }, null, 2),
137
+ },
138
+ ],
139
+ isError: true,
140
+ };
141
+ }
142
+ }
143
+ catch (error) {
144
+ return grpcErrorToToolResult(error);
145
+ }
146
+ },
147
+ },
148
+ ];
149
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "../tool-registry.js";
2
+ /** MCP tools for Grackle persona management. */
3
+ export declare const personaTools: ToolDefinition[];
4
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../src/tools/persona.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA6B1D,gDAAgD;AAChD,eAAO,MAAM,YAAY,EAAE,cAAc,EAmJxC,CAAC"}
@@ -0,0 +1,172 @@
1
+ import { z } from "zod";
2
+ import { jsonResult } from "../result-helpers.js";
3
+ import { grpcErrorToToolResult } from "../error-handler.js";
4
+ /** Serialize a Persona proto message to a plain object. */
5
+ function serializePersona(p) {
6
+ return {
7
+ id: p.id,
8
+ name: p.name,
9
+ description: p.description,
10
+ systemPrompt: p.systemPrompt,
11
+ runtime: p.runtime,
12
+ model: p.model,
13
+ maxTurns: p.maxTurns,
14
+ createdAt: p.createdAt,
15
+ updatedAt: p.updatedAt,
16
+ };
17
+ }
18
+ /** MCP tools for Grackle persona management. */
19
+ export const personaTools = [
20
+ {
21
+ name: "persona_list",
22
+ group: "persona",
23
+ description: "List all available personas with their names, descriptions, and configurations.",
24
+ inputSchema: z.object({}),
25
+ rpcMethod: "listPersonas",
26
+ mutating: false,
27
+ annotations: {
28
+ readOnlyHint: true,
29
+ destructiveHint: false,
30
+ idempotentHint: true,
31
+ openWorldHint: false,
32
+ },
33
+ async handler(_args, client) {
34
+ try {
35
+ const response = await client.listPersonas({});
36
+ return jsonResult(response.personas.map(serializePersona));
37
+ }
38
+ catch (error) {
39
+ return grpcErrorToToolResult(error);
40
+ }
41
+ },
42
+ },
43
+ {
44
+ name: "persona_create",
45
+ group: "persona",
46
+ description: "Create a new persona template with a system prompt and optional runtime configuration.",
47
+ inputSchema: z.object({
48
+ name: z.string().describe("Persona name"),
49
+ systemPrompt: z.string().describe("System prompt for the persona"),
50
+ description: z.string().optional().describe("Human-readable description"),
51
+ runtime: z.string().optional().describe("Agent runtime (e.g. 'claude-code')"),
52
+ model: z.string().optional().describe("Model to use"),
53
+ maxTurns: z.number().int().positive().optional().describe("Maximum turns for sessions"),
54
+ }),
55
+ rpcMethod: "createPersona",
56
+ mutating: true,
57
+ annotations: {
58
+ readOnlyHint: false,
59
+ destructiveHint: false,
60
+ idempotentHint: false,
61
+ openWorldHint: false,
62
+ },
63
+ async handler(args, client) {
64
+ try {
65
+ const persona = await client.createPersona({
66
+ name: args.name,
67
+ systemPrompt: args.systemPrompt,
68
+ description: args.description ?? "",
69
+ runtime: args.runtime ?? "",
70
+ model: args.model ?? "",
71
+ maxTurns: args.maxTurns ?? 0,
72
+ mcpServers: [],
73
+ });
74
+ return jsonResult(serializePersona(persona));
75
+ }
76
+ catch (error) {
77
+ return grpcErrorToToolResult(error);
78
+ }
79
+ },
80
+ },
81
+ {
82
+ name: "persona_show",
83
+ group: "persona",
84
+ description: "Get full details of a persona including its system prompt and configuration.",
85
+ inputSchema: z.object({
86
+ personaId: z.string().describe("Persona ID"),
87
+ }),
88
+ rpcMethod: "getPersona",
89
+ mutating: false,
90
+ annotations: {
91
+ readOnlyHint: true,
92
+ destructiveHint: false,
93
+ idempotentHint: true,
94
+ openWorldHint: false,
95
+ },
96
+ async handler(args, client) {
97
+ try {
98
+ const persona = await client.getPersona({ id: args.personaId });
99
+ return jsonResult(serializePersona(persona));
100
+ }
101
+ catch (error) {
102
+ return grpcErrorToToolResult(error);
103
+ }
104
+ },
105
+ },
106
+ {
107
+ name: "persona_edit",
108
+ group: "persona",
109
+ description: "Update an existing persona's name, system prompt, description, or runtime settings.",
110
+ inputSchema: z.object({
111
+ personaId: z.string().describe("Persona ID to update"),
112
+ name: z.string().optional().describe("New persona name"),
113
+ systemPrompt: z.string().optional().describe("New system prompt"),
114
+ description: z.string().optional().describe("New description"),
115
+ runtime: z.string().optional().describe("New agent runtime"),
116
+ model: z.string().optional().describe("New model"),
117
+ maxTurns: z.number().int().positive().optional().describe("New maximum turns"),
118
+ }),
119
+ rpcMethod: "updatePersona",
120
+ mutating: true,
121
+ annotations: {
122
+ readOnlyHint: false,
123
+ destructiveHint: false,
124
+ idempotentHint: true,
125
+ openWorldHint: false,
126
+ },
127
+ async handler(args, client) {
128
+ try {
129
+ const persona = await client.updatePersona({
130
+ id: args.personaId,
131
+ name: args.name ?? "",
132
+ systemPrompt: args.systemPrompt ?? "",
133
+ description: args.description ?? "",
134
+ runtime: args.runtime ?? "",
135
+ model: args.model ?? "",
136
+ maxTurns: args.maxTurns ?? 0,
137
+ mcpServers: [],
138
+ });
139
+ return jsonResult(serializePersona(persona));
140
+ }
141
+ catch (error) {
142
+ return grpcErrorToToolResult(error);
143
+ }
144
+ },
145
+ },
146
+ {
147
+ name: "persona_delete",
148
+ group: "persona",
149
+ description: "Delete a persona template permanently. This cannot be undone.",
150
+ inputSchema: z.object({
151
+ personaId: z.string().describe("Persona ID to delete"),
152
+ }),
153
+ rpcMethod: "deletePersona",
154
+ mutating: true,
155
+ annotations: {
156
+ readOnlyHint: false,
157
+ destructiveHint: true,
158
+ idempotentHint: true,
159
+ openWorldHint: false,
160
+ },
161
+ async handler(args, client) {
162
+ try {
163
+ await client.deletePersona({ id: args.personaId });
164
+ return jsonResult({ success: true });
165
+ }
166
+ catch (error) {
167
+ return grpcErrorToToolResult(error);
168
+ }
169
+ },
170
+ },
171
+ ];
172
+ //# sourceMappingURL=persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.js","sourceRoot":"","sources":["../../src/tools/persona.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "../tool-registry.js";
2
+ /** MCP tools for managing Grackle projects (CRUD + archive). */
3
+ export declare const projectTools: ToolDefinition[];
4
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAI1D,gEAAgE;AAChE,eAAO,MAAM,YAAY,EAAE,cAAc,EAgNxC,CAAC"}