@frase/mcp-server 0.3.2 → 0.3.4

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,7 @@
1
+ /**
2
+ * CMS Posts tools — CRUD, publish/unpublish, bulk import
3
+ */
4
+ import type { McpToolDefinition, ToolContext, ToolResult } from "../types.js";
5
+ export declare const cmsPostTools: McpToolDefinition[];
6
+ export declare const cmsPostExecutors: Record<string, (input: unknown, context: ToolContext) => Promise<ToolResult>>;
7
+ //# sourceMappingURL=cms-posts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-posts.d.ts","sourceRoot":"","sources":["../../src/tools/cms-posts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAyB,MAAM,aAAa,CAAC;AAyiBrG,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAU3C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAU1G,CAAC"}
@@ -0,0 +1,499 @@
1
+ /**
2
+ * CMS Posts tools — CRUD, publish/unpublish, bulk import
3
+ */
4
+ import { z } from "zod";
5
+ import { formatTable, formatStatus, formatDate, formatPagination, formatKeyValue, truncate, } from "../formatter.js";
6
+ import { CACHE_TTL } from "../cache.js";
7
+ // ============================================
8
+ // list_cms_posts
9
+ // ============================================
10
+ const listCmsPostsSchema = z.object({
11
+ site_id: z.string().min(1),
12
+ status: z.enum(["draft", "published", "scheduled"]).optional(),
13
+ type: z.enum(["blog_post", "page"]).optional(),
14
+ page: z.number().min(1).optional().default(1),
15
+ page_size: z.number().min(1).max(100).optional().default(20),
16
+ });
17
+ const listCmsPostsTool = {
18
+ name: "list_cms_posts",
19
+ description: "List CMS posts for a site. Filter by status (draft, published, scheduled) or type (blog_post, page). Returns paginated results with title, slug, status, and dates.",
20
+ inputSchema: {
21
+ type: "object",
22
+ properties: {
23
+ site_id: { type: "string", description: "Site ID (required). Use list_sites to find site IDs." },
24
+ status: { type: "string", enum: ["draft", "published", "scheduled"], description: "Filter by post status" },
25
+ type: { type: "string", enum: ["blog_post", "page"], description: "Filter by post type" },
26
+ page: { type: "number", description: "Page number (default: 1)" },
27
+ page_size: { type: "number", description: "Items per page, max 100 (default: 20)" },
28
+ },
29
+ required: ["site_id"],
30
+ },
31
+ };
32
+ async function executeListCmsPosts(input, context) {
33
+ const parsed = listCmsPostsSchema.safeParse(input);
34
+ if (!parsed.success)
35
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
36
+ const { site_id, status, type, page, page_size } = parsed.data;
37
+ try {
38
+ const params = { site_id, page: String(page), page_size: String(page_size) };
39
+ if (status)
40
+ params.status = status;
41
+ if (type)
42
+ params.type = type;
43
+ const response = await context.client.get("/cms/posts", params, CACHE_TTL.lists);
44
+ const posts = response.data;
45
+ const pagination = response.pagination;
46
+ if (!posts || posts.length === 0) {
47
+ return { success: true, markdown: "No CMS posts found for this site." };
48
+ }
49
+ const headers = ["Title", "Slug", "Status", "Type", "Published"];
50
+ const rows = posts.map((p) => [
51
+ truncate(p.title, 40),
52
+ truncate(p.slug, 30),
53
+ formatStatus(p.status),
54
+ p.type === "blog_post" ? "Blog Post" : "Page",
55
+ p.published_at ? formatDate(p.published_at) : "—",
56
+ ]);
57
+ const table = formatTable(headers, rows);
58
+ const pag = formatPagination(pagination);
59
+ return { success: true, markdown: `## CMS Posts\n\n${table}\n\n${pag}`, data: response };
60
+ }
61
+ catch (error) {
62
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
63
+ }
64
+ }
65
+ // ============================================
66
+ // get_cms_post
67
+ // ============================================
68
+ const getCmsPostSchema = z.object({
69
+ post_id: z.string().min(1),
70
+ });
71
+ const getCmsPostTool = {
72
+ name: "get_cms_post",
73
+ description: "Get a single CMS post by ID, including full content body, SEO fields, and metadata.",
74
+ inputSchema: {
75
+ type: "object",
76
+ properties: {
77
+ post_id: { type: "string", description: "Post ID (required)" },
78
+ },
79
+ required: ["post_id"],
80
+ },
81
+ };
82
+ async function executeGetCmsPost(input, context) {
83
+ const parsed = getCmsPostSchema.safeParse(input);
84
+ if (!parsed.success)
85
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
86
+ try {
87
+ const response = await context.client.get(`/cms/posts/${parsed.data.post_id}`, undefined, CACHE_TTL.resources);
88
+ const post = response.data;
89
+ const markdown = `## ${post.title}\n\n${formatKeyValue({
90
+ ID: post.id,
91
+ Slug: post.slug,
92
+ Status: formatStatus(post.status),
93
+ Type: post.type === "blog_post" ? "Blog Post" : "Page",
94
+ "Published At": post.published_at ? formatDate(post.published_at) : "—",
95
+ "Created At": formatDate(post.created_at),
96
+ "SEO Title": post.seo_title || "—",
97
+ "SEO Description": post.seo_description ? truncate(post.seo_description, 80) : "—",
98
+ "Focus Keyword": post.focus_keyword || "—",
99
+ "Featured Image": post.featured_image || "—",
100
+ "Canonical URL": post.canonical_url || "—",
101
+ })}\n\n### Content\n\n${truncate(post.content, 2000)}`;
102
+ return { success: true, markdown, data: response };
103
+ }
104
+ catch (error) {
105
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
106
+ }
107
+ }
108
+ // ============================================
109
+ // create_cms_post
110
+ // ============================================
111
+ const createCmsPostSchema = z.object({
112
+ site_id: z.string().min(1),
113
+ title: z.string().min(1),
114
+ content: z.string().min(1),
115
+ slug: z.string().optional(),
116
+ status: z.enum(["draft", "published", "scheduled"]).optional(),
117
+ type: z.enum(["blog_post", "page"]).optional(),
118
+ excerpt: z.string().optional(),
119
+ featured_image: z.string().url().optional(),
120
+ seo_title: z.string().optional(),
121
+ seo_description: z.string().optional(),
122
+ focus_keyword: z.string().optional(),
123
+ canonical_url: z.string().url().optional(),
124
+ published_at: z.string().optional(),
125
+ schema_markup: z.record(z.unknown()).optional(),
126
+ });
127
+ const createCmsPostTool = {
128
+ name: "create_cms_post",
129
+ description: "Create a new CMS post. Requires site_id, title, and content (HTML). Optionally set slug, status, type, SEO fields, and featured image.",
130
+ inputSchema: {
131
+ type: "object",
132
+ properties: {
133
+ site_id: { type: "string", description: "Site ID (required)" },
134
+ title: { type: "string", description: "Post title (required)" },
135
+ content: { type: "string", description: "Post content as HTML (required)" },
136
+ slug: { type: "string", description: "URL slug (auto-generated from title if omitted)" },
137
+ status: { type: "string", enum: ["draft", "published", "scheduled"], description: "Post status (default: draft)" },
138
+ type: { type: "string", enum: ["blog_post", "page"], description: "Post type (default: blog_post)" },
139
+ excerpt: { type: "string", description: "Short excerpt/summary" },
140
+ featured_image: { type: "string", description: "Featured image HTTPS URL" },
141
+ seo_title: { type: "string", description: "SEO title (meta title)" },
142
+ seo_description: { type: "string", description: "SEO meta description" },
143
+ focus_keyword: { type: "string", description: "Target keyword for SEO" },
144
+ canonical_url: { type: "string", description: "Canonical URL (HTTPS)" },
145
+ published_at: { type: "string", description: "ISO 8601 publish date" },
146
+ schema_markup: { type: "object", description: "JSON-LD schema markup" },
147
+ },
148
+ required: ["site_id", "title", "content"],
149
+ },
150
+ };
151
+ async function executeCreateCmsPost(input, context) {
152
+ const parsed = createCmsPostSchema.safeParse(input);
153
+ if (!parsed.success)
154
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
155
+ try {
156
+ const response = await context.client.post("/cms/posts", parsed.data);
157
+ const post = response.data;
158
+ return {
159
+ success: true,
160
+ markdown: `## Post Created\n\n${formatKeyValue({
161
+ ID: post.id,
162
+ Title: post.title,
163
+ Slug: post.slug,
164
+ Status: formatStatus(post.status),
165
+ Type: post.type === "blog_post" ? "Blog Post" : "Page",
166
+ })}`,
167
+ data: response,
168
+ };
169
+ }
170
+ catch (error) {
171
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
172
+ }
173
+ }
174
+ // ============================================
175
+ // update_cms_post
176
+ // ============================================
177
+ const updateCmsPostSchema = z.object({
178
+ post_id: z.string().min(1),
179
+ title: z.string().optional(),
180
+ content: z.string().optional(),
181
+ slug: z.string().optional(),
182
+ type: z.enum(["blog_post", "page"]).optional(),
183
+ excerpt: z.string().optional(),
184
+ featured_image: z.string().url().optional(),
185
+ seo_title: z.string().optional(),
186
+ seo_description: z.string().optional(),
187
+ focus_keyword: z.string().optional(),
188
+ canonical_url: z.string().url().optional(),
189
+ schema_markup: z.record(z.unknown()).optional(),
190
+ });
191
+ const updateCmsPostTool = {
192
+ name: "update_cms_post",
193
+ description: "Update an existing CMS post. Only provide the fields you want to change — omitted fields remain unchanged.",
194
+ inputSchema: {
195
+ type: "object",
196
+ properties: {
197
+ post_id: { type: "string", description: "Post ID (required)" },
198
+ title: { type: "string", description: "New title" },
199
+ content: { type: "string", description: "New HTML content" },
200
+ slug: { type: "string", description: "New URL slug" },
201
+ type: { type: "string", enum: ["blog_post", "page"], description: "Post type" },
202
+ excerpt: { type: "string", description: "Short excerpt/summary" },
203
+ featured_image: { type: "string", description: "Featured image HTTPS URL" },
204
+ seo_title: { type: "string", description: "SEO title" },
205
+ seo_description: { type: "string", description: "SEO meta description" },
206
+ focus_keyword: { type: "string", description: "Target keyword" },
207
+ canonical_url: { type: "string", description: "Canonical URL (HTTPS)" },
208
+ schema_markup: { type: "object", description: "JSON-LD schema markup" },
209
+ },
210
+ required: ["post_id"],
211
+ },
212
+ };
213
+ async function executeUpdateCmsPost(input, context) {
214
+ const parsed = updateCmsPostSchema.safeParse(input);
215
+ if (!parsed.success)
216
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
217
+ const { post_id, ...updates } = parsed.data;
218
+ try {
219
+ const response = await context.client.put(`/cms/posts/${post_id}`, updates);
220
+ const post = response.data;
221
+ return {
222
+ success: true,
223
+ markdown: `## Post Updated\n\n${formatKeyValue({
224
+ ID: post.id,
225
+ Title: post.title,
226
+ Slug: post.slug,
227
+ Status: formatStatus(post.status),
228
+ })}`,
229
+ data: response,
230
+ };
231
+ }
232
+ catch (error) {
233
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
234
+ }
235
+ }
236
+ // ============================================
237
+ // delete_cms_post
238
+ // ============================================
239
+ const deleteCmsPostSchema = z.object({
240
+ post_id: z.string().min(1),
241
+ });
242
+ const deleteCmsPostTool = {
243
+ name: "delete_cms_post",
244
+ description: "Delete a CMS post by ID. This action is irreversible.",
245
+ inputSchema: {
246
+ type: "object",
247
+ properties: {
248
+ post_id: { type: "string", description: "Post ID to delete (required)" },
249
+ },
250
+ required: ["post_id"],
251
+ },
252
+ };
253
+ async function executeDeleteCmsPost(input, context) {
254
+ const parsed = deleteCmsPostSchema.safeParse(input);
255
+ if (!parsed.success)
256
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
257
+ try {
258
+ await context.client.delete(`/cms/posts/${parsed.data.post_id}`);
259
+ return { success: true, markdown: `**Post deleted** (${parsed.data.post_id})` };
260
+ }
261
+ catch (error) {
262
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
263
+ }
264
+ }
265
+ // ============================================
266
+ // publish_cms_post
267
+ // ============================================
268
+ const publishCmsPostSchema = z.object({
269
+ post_id: z.string().min(1),
270
+ });
271
+ const publishCmsPostTool = {
272
+ name: "publish_cms_post",
273
+ description: "Publish a CMS post (changes status from draft to published). The post becomes visible on the public blog.",
274
+ inputSchema: {
275
+ type: "object",
276
+ properties: {
277
+ post_id: { type: "string", description: "Post ID to publish (required)" },
278
+ },
279
+ required: ["post_id"],
280
+ },
281
+ };
282
+ async function executePublishCmsPost(input, context) {
283
+ const parsed = publishCmsPostSchema.safeParse(input);
284
+ if (!parsed.success)
285
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
286
+ try {
287
+ const response = await context.client.post(`/cms/posts/${parsed.data.post_id}/publish`, {});
288
+ const post = response.data;
289
+ return {
290
+ success: true,
291
+ markdown: `## Post Published\n\n${formatKeyValue({
292
+ ID: post.id,
293
+ Title: post.title,
294
+ Slug: post.slug,
295
+ Status: formatStatus(post.status),
296
+ "Published At": post.published_at ? formatDate(post.published_at) : "—",
297
+ })}`,
298
+ data: response,
299
+ };
300
+ }
301
+ catch (error) {
302
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
303
+ }
304
+ }
305
+ // ============================================
306
+ // unpublish_cms_post
307
+ // ============================================
308
+ const unpublishCmsPostSchema = z.object({
309
+ post_id: z.string().min(1),
310
+ });
311
+ const unpublishCmsPostTool = {
312
+ name: "unpublish_cms_post",
313
+ description: "Unpublish a CMS post (changes status from published back to draft). The post is removed from the public blog.",
314
+ inputSchema: {
315
+ type: "object",
316
+ properties: {
317
+ post_id: { type: "string", description: "Post ID to unpublish (required)" },
318
+ },
319
+ required: ["post_id"],
320
+ },
321
+ };
322
+ async function executeUnpublishCmsPost(input, context) {
323
+ const parsed = unpublishCmsPostSchema.safeParse(input);
324
+ if (!parsed.success)
325
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
326
+ try {
327
+ const response = await context.client.post(`/cms/posts/${parsed.data.post_id}/unpublish`, {});
328
+ const post = response.data;
329
+ return {
330
+ success: true,
331
+ markdown: `## Post Unpublished\n\n${formatKeyValue({
332
+ ID: post.id,
333
+ Title: post.title,
334
+ Status: formatStatus(post.status),
335
+ })}`,
336
+ data: response,
337
+ };
338
+ }
339
+ catch (error) {
340
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
341
+ }
342
+ }
343
+ // ============================================
344
+ // import_cms_posts
345
+ // ============================================
346
+ const importCmsPostsSchema = z.object({
347
+ site_id: z.string().min(1),
348
+ posts: z.array(z.object({
349
+ title: z.string().min(1),
350
+ content: z.string().min(1),
351
+ slug: z.string().optional(),
352
+ status: z.enum(["draft", "published", "scheduled"]).optional(),
353
+ type: z.enum(["blog_post", "page"]).optional(),
354
+ excerpt: z.string().optional(),
355
+ featured_image: z.string().optional(),
356
+ seo_title: z.string().optional(),
357
+ seo_description: z.string().optional(),
358
+ focus_keyword: z.string().optional(),
359
+ canonical_url: z.string().optional(),
360
+ published_at: z.string().optional(),
361
+ })).min(1).max(100),
362
+ options: z.object({
363
+ on_conflict: z.enum(["skip", "overwrite"]).optional(),
364
+ default_status: z.enum(["draft", "published", "scheduled"]).optional(),
365
+ }).optional(),
366
+ });
367
+ const importCmsPostsTool = {
368
+ name: "import_cms_posts",
369
+ description: "Start an async bulk import of CMS posts (max 100 per request). Returns a job ID to poll for progress. Use get_cms_import_status to check completion.",
370
+ inputSchema: {
371
+ type: "object",
372
+ properties: {
373
+ site_id: { type: "string", description: "Site ID (required)" },
374
+ posts: {
375
+ type: "array",
376
+ description: "Array of posts to import (max 100). Each must have title and content.",
377
+ items: {
378
+ type: "object",
379
+ properties: {
380
+ title: { type: "string" },
381
+ content: { type: "string" },
382
+ slug: { type: "string" },
383
+ status: { type: "string", enum: ["draft", "published", "scheduled"] },
384
+ type: { type: "string", enum: ["blog_post", "page"] },
385
+ excerpt: { type: "string" },
386
+ featured_image: { type: "string" },
387
+ seo_title: { type: "string" },
388
+ seo_description: { type: "string" },
389
+ focus_keyword: { type: "string" },
390
+ canonical_url: { type: "string" },
391
+ published_at: { type: "string" },
392
+ },
393
+ required: ["title", "content"],
394
+ },
395
+ },
396
+ options: {
397
+ type: "object",
398
+ description: "Import options",
399
+ properties: {
400
+ on_conflict: { type: "string", enum: ["skip", "overwrite"], description: "What to do if slug already exists (default: skip)" },
401
+ default_status: { type: "string", enum: ["draft", "published", "scheduled"], description: "Default status for posts without explicit status (default: draft)" },
402
+ },
403
+ },
404
+ },
405
+ required: ["site_id", "posts"],
406
+ },
407
+ };
408
+ async function executeImportCmsPosts(input, context) {
409
+ const parsed = importCmsPostsSchema.safeParse(input);
410
+ if (!parsed.success)
411
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
412
+ try {
413
+ const response = await context.client.post("/cms/posts/import", parsed.data);
414
+ const job = response.data;
415
+ return {
416
+ success: true,
417
+ markdown: `## Import Started\n\n${formatKeyValue({
418
+ "Job ID": job.job_id,
419
+ Status: formatStatus(job.status),
420
+ "Posts Queued": job.posts_queued,
421
+ })}\n\n> Use \`get_cms_import_status\` with job ID to check progress.`,
422
+ data: response,
423
+ };
424
+ }
425
+ catch (error) {
426
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
427
+ }
428
+ }
429
+ // ============================================
430
+ // get_cms_import_status
431
+ // ============================================
432
+ const getCmsImportStatusSchema = z.object({
433
+ job_id: z.string().min(1),
434
+ });
435
+ const getCmsImportStatusTool = {
436
+ name: "get_cms_import_status",
437
+ description: "Check the status of a CMS bulk import job. Shows posts queued, succeeded, failed, and skipped counts.",
438
+ inputSchema: {
439
+ type: "object",
440
+ properties: {
441
+ job_id: { type: "string", description: "Import job ID (required)" },
442
+ },
443
+ required: ["job_id"],
444
+ },
445
+ };
446
+ async function executeGetCmsImportStatus(input, context) {
447
+ const parsed = getCmsImportStatusSchema.safeParse(input);
448
+ if (!parsed.success)
449
+ return { success: false, markdown: `**Error:** ${parsed.error.message}` };
450
+ try {
451
+ const response = await context.client.get(`/cms/posts/import/${parsed.data.job_id}`);
452
+ const job = response.data;
453
+ let markdown = `## Import Job Status\n\n${formatKeyValue({
454
+ "Job ID": job.job_id,
455
+ Status: formatStatus(job.status),
456
+ "Posts Queued": job.posts_queued,
457
+ "Succeeded": job.posts_succeeded,
458
+ "Failed": job.posts_failed,
459
+ "Skipped": job.posts_skipped,
460
+ "Created At": formatDate(job.created_at),
461
+ "Completed At": job.completed_at ? formatDate(job.completed_at) : "—",
462
+ })}`;
463
+ if (job.errors && job.errors.length > 0) {
464
+ const errHeaders = ["Index", "Slug", "Error"];
465
+ const errRows = job.errors.map((e) => [String(e.index), e.slug, truncate(e.error, 60)]);
466
+ markdown += `\n\n### Errors\n\n${formatTable(errHeaders, errRows)}`;
467
+ }
468
+ return { success: true, markdown, data: response };
469
+ }
470
+ catch (error) {
471
+ return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
472
+ }
473
+ }
474
+ // ============================================
475
+ // Exports
476
+ // ============================================
477
+ export const cmsPostTools = [
478
+ listCmsPostsTool,
479
+ getCmsPostTool,
480
+ createCmsPostTool,
481
+ updateCmsPostTool,
482
+ deleteCmsPostTool,
483
+ publishCmsPostTool,
484
+ unpublishCmsPostTool,
485
+ importCmsPostsTool,
486
+ getCmsImportStatusTool,
487
+ ];
488
+ export const cmsPostExecutors = {
489
+ list_cms_posts: executeListCmsPosts,
490
+ get_cms_post: executeGetCmsPost,
491
+ create_cms_post: executeCreateCmsPost,
492
+ update_cms_post: executeUpdateCmsPost,
493
+ delete_cms_post: executeDeleteCmsPost,
494
+ publish_cms_post: executePublishCmsPost,
495
+ unpublish_cms_post: executeUnpublishCmsPost,
496
+ import_cms_posts: executeImportCmsPosts,
497
+ get_cms_import_status: executeGetCmsImportStatus,
498
+ };
499
+ //# sourceMappingURL=cms-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cms-posts.js","sourceRoot":"","sources":["../../src/tools/cms-posts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Comment & AI-suggestion tools.
3
+ *
4
+ * Surfaces the five `/api/v1/{content,comments}/...` endpoints added in the
5
+ * editor-polish branch. Flow:
6
+ * 1. `request_ai_comments` — ask the agent to review a piece of content.
7
+ * 2. `list_content_comments` — see what it produced.
8
+ * 3. `apply_ai_comment` — splice a suggestion into the draft.
9
+ * 4. `set_comment_status` / `bulk_set_comment_status` — resolve / reopen.
10
+ */
11
+ import type { McpToolDefinition, ToolContext, ToolResult } from "../types.js";
12
+ export declare const listContentCommentsTool: McpToolDefinition;
13
+ export declare function executeListContentComments(input: unknown, context: ToolContext): Promise<ToolResult>;
14
+ export declare const requestAiCommentsTool: McpToolDefinition;
15
+ export declare function executeRequestAiComments(input: unknown, context: ToolContext): Promise<ToolResult>;
16
+ export declare const applyAiCommentTool: McpToolDefinition;
17
+ export declare function executeApplyAiComment(input: unknown, context: ToolContext): Promise<ToolResult>;
18
+ export declare const setCommentStatusTool: McpToolDefinition;
19
+ export declare function executeSetCommentStatus(input: unknown, context: ToolContext): Promise<ToolResult>;
20
+ export declare const bulkSetCommentStatusTool: McpToolDefinition;
21
+ export declare function executeBulkSetCommentStatus(input: unknown, context: ToolContext): Promise<ToolResult>;
22
+ export declare const commentTools: McpToolDefinition[];
23
+ export declare const commentExecutors: Record<string, (input: unknown, context: ToolContext) => Promise<ToolResult>>;
24
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/tools/comments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAEV,iBAAiB,EAEjB,WAAW,EACX,UAAU,EACX,MAAM,aAAa,CAAC;AAwBrB,eAAO,MAAM,uBAAuB,EAAE,iBAgBrC,CAAC;AAEF,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAyCrB;AAWD,eAAO,MAAM,qBAAqB,EAAE,iBAenC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAqCrB;AAWD,eAAO,MAAM,kBAAkB,EAAE,iBAYhC,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAqCrB;AAWD,eAAO,MAAM,oBAAoB,EAAE,iBAYlC,CAAC;AAEF,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAkBrB;AAWD,eAAO,MAAM,wBAAwB,EAAE,iBAiBtC,CAAC;AAEF,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAsBrB;AAMD,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAM3C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,MAAM,EACN,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAO9D,CAAC"}