@frase/mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +262 -0
  3. package/dist/api-client.d.ts +93 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +213 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/cache.d.ts +52 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +97 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/config.d.ts +17 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +31 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/formatter.d.ts +47 -0
  16. package/dist/formatter.d.ts.map +1 -0
  17. package/dist/formatter.js +136 -0
  18. package/dist/formatter.js.map +1 -0
  19. package/dist/index.d.ts +32 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +292 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/prompts/competitor-analysis.d.ts +18 -0
  24. package/dist/prompts/competitor-analysis.d.ts.map +1 -0
  25. package/dist/prompts/competitor-analysis.js +71 -0
  26. package/dist/prompts/competitor-analysis.js.map +1 -0
  27. package/dist/prompts/content-audit.d.ts +18 -0
  28. package/dist/prompts/content-audit.d.ts.map +1 -0
  29. package/dist/prompts/content-audit.js +67 -0
  30. package/dist/prompts/content-audit.js.map +1 -0
  31. package/dist/prompts/create-seo-article.d.ts +19 -0
  32. package/dist/prompts/create-seo-article.d.ts.map +1 -0
  33. package/dist/prompts/create-seo-article.js +78 -0
  34. package/dist/prompts/create-seo-article.js.map +1 -0
  35. package/dist/prompts/index.d.ts +18 -0
  36. package/dist/prompts/index.d.ts.map +1 -0
  37. package/dist/prompts/index.js +52 -0
  38. package/dist/prompts/index.js.map +1 -0
  39. package/dist/prompts/keyword-research.d.ts +18 -0
  40. package/dist/prompts/keyword-research.d.ts.map +1 -0
  41. package/dist/prompts/keyword-research.js +72 -0
  42. package/dist/prompts/keyword-research.js.map +1 -0
  43. package/dist/prompts/optimize-content.d.ts +18 -0
  44. package/dist/prompts/optimize-content.d.ts.map +1 -0
  45. package/dist/prompts/optimize-content.js +59 -0
  46. package/dist/prompts/optimize-content.js.map +1 -0
  47. package/dist/resources/briefs.d.ts +26 -0
  48. package/dist/resources/briefs.d.ts.map +1 -0
  49. package/dist/resources/briefs.js +144 -0
  50. package/dist/resources/briefs.js.map +1 -0
  51. package/dist/resources/content.d.ts +26 -0
  52. package/dist/resources/content.d.ts.map +1 -0
  53. package/dist/resources/content.js +128 -0
  54. package/dist/resources/content.js.map +1 -0
  55. package/dist/resources/index.d.ts +32 -0
  56. package/dist/resources/index.d.ts.map +1 -0
  57. package/dist/resources/index.js +85 -0
  58. package/dist/resources/index.js.map +1 -0
  59. package/dist/resources/sites.d.ts +26 -0
  60. package/dist/resources/sites.d.ts.map +1 -0
  61. package/dist/resources/sites.js +108 -0
  62. package/dist/resources/sites.js.map +1 -0
  63. package/dist/tools/ai-visibility.d.ts +25 -0
  64. package/dist/tools/ai-visibility.d.ts.map +1 -0
  65. package/dist/tools/ai-visibility.js +537 -0
  66. package/dist/tools/ai-visibility.js.map +1 -0
  67. package/dist/tools/analytics.d.ts +17 -0
  68. package/dist/tools/analytics.d.ts.map +1 -0
  69. package/dist/tools/analytics.js +311 -0
  70. package/dist/tools/analytics.js.map +1 -0
  71. package/dist/tools/audits.d.ts +73 -0
  72. package/dist/tools/audits.d.ts.map +1 -0
  73. package/dist/tools/audits.js +345 -0
  74. package/dist/tools/audits.js.map +1 -0
  75. package/dist/tools/briefs.d.ts +63 -0
  76. package/dist/tools/briefs.d.ts.map +1 -0
  77. package/dist/tools/briefs.js +276 -0
  78. package/dist/tools/briefs.js.map +1 -0
  79. package/dist/tools/content.d.ts +51 -0
  80. package/dist/tools/content.d.ts.map +1 -0
  81. package/dist/tools/content.js +233 -0
  82. package/dist/tools/content.js.map +1 -0
  83. package/dist/tools/index.d.ts +29 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +96 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/tools/jobs.d.ts +22 -0
  88. package/dist/tools/jobs.d.ts.map +1 -0
  89. package/dist/tools/jobs.js +124 -0
  90. package/dist/tools/jobs.js.map +1 -0
  91. package/dist/tools/optimizations.d.ts +19 -0
  92. package/dist/tools/optimizations.d.ts.map +1 -0
  93. package/dist/tools/optimizations.js +339 -0
  94. package/dist/tools/optimizations.js.map +1 -0
  95. package/dist/tools/research.d.ts +41 -0
  96. package/dist/tools/research.d.ts.map +1 -0
  97. package/dist/tools/research.js +151 -0
  98. package/dist/tools/research.js.map +1 -0
  99. package/dist/tools/serp.d.ts +15 -0
  100. package/dist/tools/serp.d.ts.map +1 -0
  101. package/dist/tools/serp.js +267 -0
  102. package/dist/tools/serp.js.map +1 -0
  103. package/dist/tools/sites.d.ts +31 -0
  104. package/dist/tools/sites.d.ts.map +1 -0
  105. package/dist/tools/sites.js +83 -0
  106. package/dist/tools/sites.js.map +1 -0
  107. package/dist/tools/webhooks.d.ts +19 -0
  108. package/dist/tools/webhooks.d.ts.map +1 -0
  109. package/dist/tools/webhooks.js +350 -0
  110. package/dist/tools/webhooks.js.map +1 -0
  111. package/dist/types.d.ts +167 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +5 -0
  114. package/dist/types.js.map +1 -0
  115. package/package.json +67 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Tool registry
3
+ *
4
+ * All MCP tools are registered here. Each tool module exports:
5
+ * - Tool definitions (McpToolDefinition[])
6
+ * - Executors (Record<string, ToolExecutor>)
7
+ */
8
+ // Import tool modules
9
+ import { siteTools, siteExecutors } from "./sites.js";
10
+ import { briefTools, briefExecutors } from "./briefs.js";
11
+ import { contentTools, contentExecutors } from "./content.js";
12
+ import { researchTools, researchExecutors } from "./research.js";
13
+ import { jobTools, jobExecutors } from "./jobs.js";
14
+ // Phase 3 tool modules
15
+ import { auditTools, auditExecutors } from "./audits.js";
16
+ import { serpTools, serpExecutors } from "./serp.js";
17
+ import { aiVisibilityTools, aiVisibilityExecutors } from "./ai-visibility.js";
18
+ import { analyticsTools, analyticsExecutors } from "./analytics.js";
19
+ import { optimizationTools, optimizationExecutors } from "./optimizations.js";
20
+ import { webhookTools, webhookExecutors } from "./webhooks.js";
21
+ // ============================================
22
+ // Tool Registry
23
+ // ============================================
24
+ /**
25
+ * All available MCP tools
26
+ */
27
+ export const ALL_TOOLS = [
28
+ // Sites (Phase 1)
29
+ ...siteTools,
30
+ // Briefs (Phase 2)
31
+ ...briefTools,
32
+ // Content (Phase 2)
33
+ ...contentTools,
34
+ // Research (Phase 2)
35
+ ...researchTools,
36
+ // Jobs (Phase 2)
37
+ ...jobTools,
38
+ // Audits (Phase 3)
39
+ ...auditTools,
40
+ // SERP (Phase 3)
41
+ ...serpTools,
42
+ // AI Visibility (Phase 3)
43
+ ...aiVisibilityTools,
44
+ // Analytics (Phase 3)
45
+ ...analyticsTools,
46
+ // Optimizations (Phase 3)
47
+ ...optimizationTools,
48
+ // Webhooks (Phase 3)
49
+ ...webhookTools,
50
+ ];
51
+ /**
52
+ * Tool executor mapping
53
+ */
54
+ export const TOOL_EXECUTORS = {
55
+ // Sites (Phase 1)
56
+ ...siteExecutors,
57
+ // Briefs (Phase 2)
58
+ ...briefExecutors,
59
+ // Content (Phase 2)
60
+ ...contentExecutors,
61
+ // Research (Phase 2)
62
+ ...researchExecutors,
63
+ // Jobs (Phase 2)
64
+ ...jobExecutors,
65
+ // Audits (Phase 3)
66
+ ...auditExecutors,
67
+ // SERP (Phase 3)
68
+ ...serpExecutors,
69
+ // AI Visibility (Phase 3)
70
+ ...aiVisibilityExecutors,
71
+ // Analytics (Phase 3)
72
+ ...analyticsExecutors,
73
+ // Optimizations (Phase 3)
74
+ ...optimizationExecutors,
75
+ // Webhooks (Phase 3)
76
+ ...webhookExecutors,
77
+ };
78
+ /**
79
+ * Get tool definition by name
80
+ */
81
+ export function getToolByName(name) {
82
+ return ALL_TOOLS.find((tool) => tool.name === name);
83
+ }
84
+ /**
85
+ * Get tool executor by name
86
+ */
87
+ export function getToolExecutor(name) {
88
+ return TOOL_EXECUTORS[name];
89
+ }
90
+ /**
91
+ * Get total tool count
92
+ */
93
+ export function getToolCount() {
94
+ return ALL_TOOLS.length;
95
+ }
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnD,uBAAuB;AACvB,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE/D,+CAA+C;AAC/C,gBAAgB;AAChB,+CAA+C;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAwB;IAC5C,kBAAkB;IAClB,GAAG,SAAS;IAEZ,mBAAmB;IACnB,GAAG,UAAU;IAEb,oBAAoB;IACpB,GAAG,YAAY;IAEf,qBAAqB;IACrB,GAAG,aAAa;IAEhB,iBAAiB;IACjB,GAAG,QAAQ;IAEX,mBAAmB;IACnB,GAAG,UAAU;IAEb,iBAAiB;IACjB,GAAG,SAAS;IAEZ,0BAA0B;IAC1B,GAAG,iBAAiB;IAEpB,sBAAsB;IACtB,GAAG,cAAc;IAEjB,0BAA0B;IAC1B,GAAG,iBAAiB;IAEpB,qBAAqB;IACrB,GAAG,YAAY;CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAGvB;IACF,kBAAkB;IAClB,GAAG,aAAa;IAEhB,mBAAmB;IACnB,GAAG,cAAc;IAEjB,oBAAoB;IACpB,GAAG,gBAAgB;IAEnB,qBAAqB;IACrB,GAAG,iBAAiB;IAEpB,iBAAiB;IACjB,GAAG,YAAY;IAEf,mBAAmB;IACnB,GAAG,cAAc;IAEjB,iBAAiB;IACjB,GAAG,aAAa;IAEhB,0BAA0B;IAC1B,GAAG,qBAAqB;IAExB,sBAAsB;IACtB,GAAG,kBAAkB;IAErB,0BAA0B;IAC1B,GAAG,qBAAqB;IAExB,qBAAqB;IACrB,GAAG,gBAAgB;CACpB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY;IAEZ,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Job status tools
3
+ */
4
+ import { z } from "zod";
5
+ import type { McpToolDefinition, ToolContext, ToolResult } from "../types.js";
6
+ declare const getJobStatusInputSchema: z.ZodObject<{
7
+ id: z.ZodString;
8
+ type: z.ZodOptional<z.ZodEnum<["audit", "research", "content", "brief", "optimization", "atomization"]>>;
9
+ }, "strip", z.ZodTypeAny, {
10
+ id: string;
11
+ type?: "research" | "audit" | "content" | "brief" | "optimization" | "atomization" | undefined;
12
+ }, {
13
+ id: string;
14
+ type?: "research" | "audit" | "content" | "brief" | "optimization" | "atomization" | undefined;
15
+ }>;
16
+ export type GetJobStatusInput = z.infer<typeof getJobStatusInputSchema>;
17
+ export declare const getJobStatusTool: McpToolDefinition;
18
+ export declare function executeGetJobStatus(input: unknown, context: ToolContext): Promise<ToolResult>;
19
+ export declare const jobTools: McpToolDefinition[];
20
+ export declare const jobExecutors: Record<string, (input: unknown, context: ToolContext) => Promise<ToolResult>>;
21
+ export {};
22
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAa,MAAM,aAAa,CAAC;AAOzF,QAAA,MAAM,uBAAuB;;;;;;;;;EAK3B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,eAAO,MAAM,gBAAgB,EAAE,iBAoB9B,CAAC;AAcF,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA8FrB;AAMD,eAAO,MAAM,QAAQ,EAAE,iBAAiB,EAAuB,CAAC;AAEhE,eAAO,MAAM,YAAY,EAAE,MAAM,CAC/B,MAAM,EACN,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAG9D,CAAC"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Job status tools
3
+ */
4
+ import { z } from "zod";
5
+ import { formatKeyValue, formatDate } from "../formatter.js";
6
+ // ============================================
7
+ // get_job_status
8
+ // ============================================
9
+ const getJobStatusInputSchema = z.object({
10
+ id: z.string().min(1),
11
+ type: z
12
+ .enum(["audit", "research", "content", "brief", "optimization", "atomization"])
13
+ .optional(),
14
+ });
15
+ export const getJobStatusTool = {
16
+ name: "get_job_status",
17
+ description: "Check the status of an async job (audit, research, content generation, brief outline, optimization). " +
18
+ "Specify the type for faster lookup, or omit to search all types.",
19
+ inputSchema: {
20
+ type: "object",
21
+ properties: {
22
+ id: {
23
+ type: "string",
24
+ description: "The job/resource ID to check",
25
+ },
26
+ type: {
27
+ type: "string",
28
+ enum: ["audit", "research", "content", "brief", "optimization", "atomization"],
29
+ description: "The type of job (optional, for faster lookup)",
30
+ },
31
+ },
32
+ required: ["id"],
33
+ },
34
+ };
35
+ export async function executeGetJobStatus(input, context) {
36
+ const parsed = getJobStatusInputSchema.safeParse(input);
37
+ if (!parsed.success) {
38
+ return {
39
+ success: false,
40
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
41
+ };
42
+ }
43
+ const { id, type } = parsed.data;
44
+ try {
45
+ const params = {};
46
+ if (type)
47
+ params.type = type;
48
+ const response = await context.client.get(`/jobs/${id}/status`, params
49
+ // Don't cache job status - we want fresh data
50
+ );
51
+ const job = response.data;
52
+ // Determine if job is complete
53
+ const isComplete = ["completed", "ready", "published", "draft", "failed"].includes(job.status.toLowerCase());
54
+ const isFailed = job.status.toLowerCase() === "failed" || !!job.error;
55
+ const isProcessing = !isComplete;
56
+ // Format status with appropriate indicator
57
+ let statusDisplay = job.status;
58
+ if (isComplete && !isFailed) {
59
+ statusDisplay = `✅ ${job.status}`;
60
+ }
61
+ else if (isFailed) {
62
+ statusDisplay = `❌ ${job.status}`;
63
+ }
64
+ else {
65
+ statusDisplay = `🔄 ${job.status}`;
66
+ }
67
+ let markdown = `## Job Status\n\n`;
68
+ markdown += formatKeyValue({
69
+ ID: job.id,
70
+ Type: job.type,
71
+ Status: statusDisplay,
72
+ Progress: job.progress !== undefined ? `${job.progress}%` : undefined,
73
+ Created: formatDate(job.created_at),
74
+ Updated: job.updated_at ? formatDate(job.updated_at) : undefined,
75
+ Completed: job.completed_at ? formatDate(job.completed_at) : undefined,
76
+ });
77
+ // Error message
78
+ if (job.error) {
79
+ markdown += `\n\n**Error:** ${job.error}`;
80
+ }
81
+ // Metadata
82
+ if (job.metadata && Object.keys(job.metadata).length > 0) {
83
+ markdown += `\n\n### Details\n\n`;
84
+ markdown += formatKeyValue(Object.fromEntries(Object.entries(job.metadata).map(([k, v]) => [k, String(v)])));
85
+ }
86
+ // Next steps
87
+ if (isProcessing) {
88
+ markdown += `\n\n*Job is still processing. Check again in a few moments.*`;
89
+ }
90
+ else if (isComplete && !isFailed) {
91
+ markdown += `\n\n*Job completed successfully.*`;
92
+ // Suggest next action based on type
93
+ if (job.type === "brief") {
94
+ markdown += ` Use \`get_brief\` with \`id: "${job.id}"\` to see the outline.`;
95
+ }
96
+ else if (job.type === "research") {
97
+ markdown += ` Use \`get_research\` with \`id: "${job.id}"\` to see the results.`;
98
+ }
99
+ else if (job.type === "content") {
100
+ markdown += ` Use \`get_content\` with \`id: "${job.id}"\` to see the content.`;
101
+ }
102
+ }
103
+ return {
104
+ success: true,
105
+ markdown,
106
+ data: response,
107
+ };
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : "Unknown error";
111
+ return {
112
+ success: false,
113
+ markdown: `**Error:** Failed to get job status - ${message}`,
114
+ };
115
+ }
116
+ }
117
+ // ============================================
118
+ // Export all job tools
119
+ // ============================================
120
+ export const jobTools = [getJobStatusTool];
121
+ export const jobExecutors = {
122
+ get_job_status: executeGetJobStatus,
123
+ };
124
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Optimization tools
3
+ *
4
+ * Content optimization suggestions and applications
5
+ */
6
+ import type { McpToolDefinition, ToolContext, ToolResult } from "../types.js";
7
+ export declare const listOptimizationsTool: McpToolDefinition;
8
+ export declare function executeListOptimizations(input: unknown, context: ToolContext): Promise<ToolResult>;
9
+ export declare const startOptimizationTool: McpToolDefinition;
10
+ export declare function executeStartOptimization(input: unknown, context: ToolContext): Promise<ToolResult>;
11
+ export declare const getOptimizationTool: McpToolDefinition;
12
+ export declare function executeGetOptimization(input: unknown, context: ToolContext): Promise<ToolResult>;
13
+ export declare const applyOptimizationTool: McpToolDefinition;
14
+ export declare function executeApplyOptimization(input: unknown, context: ToolContext): Promise<ToolResult>;
15
+ export declare const getOptimizationInsightsTool: McpToolDefinition;
16
+ export declare function executeGetOptimizationInsights(input: unknown, context: ToolContext): Promise<ToolResult>;
17
+ export declare const optimizationTools: McpToolDefinition[];
18
+ export declare const optimizationExecutors: Record<string, (input: unknown, context: ToolContext) => Promise<ToolResult>>;
19
+ //# sourceMappingURL=optimizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizations.d.ts","sourceRoot":"","sources":["../../src/tools/optimizations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,UAAU,EAIX,MAAM,aAAa,CAAC;AAkDrB,eAAO,MAAM,qBAAqB,EAAE,iBAyBnC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA8CrB;AAUD,eAAO,MAAM,qBAAqB,EAAE,iBAanC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAoCrB;AAUD,eAAO,MAAM,mBAAmB,EAAE,iBAajC,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAyDrB;AAWD,eAAO,MAAM,qBAAqB,EAAE,iBAkBnC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAUD,eAAO,MAAM,2BAA2B,EAAE,iBAYzC,CAAC;AAEF,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAgDrB;AAMD,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,EAMhD,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CACxC,MAAM,EACN,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAO9D,CAAC"}
@@ -0,0 +1,339 @@
1
+ /**
2
+ * Optimization tools
3
+ *
4
+ * Content optimization suggestions and applications
5
+ */
6
+ import { z } from "zod";
7
+ import { CACHE_TTL } from "../cache.js";
8
+ import { formatTable, formatStatus, formatDate, formatPagination, formatKeyValue, } from "../formatter.js";
9
+ // ============================================
10
+ // list_optimizations
11
+ // ============================================
12
+ const listOptimizationsInputSchema = z.object({
13
+ page: z.number().min(1).optional().default(1),
14
+ page_size: z.number().min(1).max(100).optional().default(20),
15
+ status: z.enum(["pending", "analyzing", "ready", "applied", "dismissed", "failed"]).optional(),
16
+ content_id: z.string().optional(),
17
+ });
18
+ export const listOptimizationsTool = {
19
+ name: "list_optimizations",
20
+ description: "List content optimization sessions. Each session contains suggestions to improve your content.",
21
+ inputSchema: {
22
+ type: "object",
23
+ properties: {
24
+ page: {
25
+ type: "number",
26
+ description: "Page number (default: 1)",
27
+ },
28
+ page_size: {
29
+ type: "number",
30
+ description: "Items per page, max 100 (default: 20)",
31
+ },
32
+ status: {
33
+ type: "string",
34
+ enum: ["pending", "analyzing", "ready", "applied", "dismissed", "failed"],
35
+ description: "Filter by status",
36
+ },
37
+ content_id: {
38
+ type: "string",
39
+ description: "Filter by content ID",
40
+ },
41
+ },
42
+ },
43
+ };
44
+ export async function executeListOptimizations(input, context) {
45
+ const parsed = listOptimizationsInputSchema.safeParse(input || {});
46
+ if (!parsed.success) {
47
+ return {
48
+ success: false,
49
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
50
+ };
51
+ }
52
+ const { page, page_size, status, content_id } = parsed.data;
53
+ try {
54
+ const params = { page, page_size };
55
+ if (status)
56
+ params.status = status;
57
+ if (content_id)
58
+ params.content_id = content_id;
59
+ const response = await context.client.get("/optimizations", params, CACHE_TTL.lists);
60
+ const headers = ["Content ID", "Status", "Suggestions", "Applied", "Created"];
61
+ const rows = response.data.map((opt) => [
62
+ opt.content_id,
63
+ formatStatus(opt.status),
64
+ opt.suggestions_count.toString(),
65
+ opt.applied_count.toString(),
66
+ formatDate(opt.created_at),
67
+ ]);
68
+ const table = formatTable(headers, rows);
69
+ const pagination = formatPagination(response.pagination);
70
+ return {
71
+ success: true,
72
+ markdown: `## Optimizations (Page ${page})\n\n${table}${pagination}`,
73
+ data: response,
74
+ };
75
+ }
76
+ catch (error) {
77
+ const message = error instanceof Error ? error.message : "Unknown error";
78
+ return {
79
+ success: false,
80
+ markdown: `**Error:** Failed to list optimizations - ${message}`,
81
+ };
82
+ }
83
+ }
84
+ // ============================================
85
+ // start_optimization
86
+ // ============================================
87
+ const startOptimizationInputSchema = z.object({
88
+ content_id: z.string().min(1),
89
+ });
90
+ export const startOptimizationTool = {
91
+ name: "start_optimization",
92
+ description: "Start a new optimization analysis for a piece of content. This will analyze the content and generate improvement suggestions.",
93
+ inputSchema: {
94
+ type: "object",
95
+ properties: {
96
+ content_id: {
97
+ type: "string",
98
+ description: "The ID of the content to optimize (required)",
99
+ },
100
+ },
101
+ required: ["content_id"],
102
+ },
103
+ };
104
+ export async function executeStartOptimization(input, context) {
105
+ const parsed = startOptimizationInputSchema.safeParse(input);
106
+ if (!parsed.success) {
107
+ return {
108
+ success: false,
109
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
110
+ };
111
+ }
112
+ const { content_id } = parsed.data;
113
+ try {
114
+ const response = await context.client.post("/optimizations", { content_id });
115
+ const opt = response.data;
116
+ const details = formatKeyValue({
117
+ id: opt.id,
118
+ content_id: opt.content_id,
119
+ status: opt.status,
120
+ });
121
+ return {
122
+ success: true,
123
+ markdown: `## Optimization Started\n\n${details}\n\n**Note:** The optimization is now analyzing your content. Use \`get_optimization\` with id \`${opt.id}\` to see suggestions when ready.`,
124
+ data: response,
125
+ };
126
+ }
127
+ catch (error) {
128
+ const message = error instanceof Error ? error.message : "Unknown error";
129
+ return {
130
+ success: false,
131
+ markdown: `**Error:** Failed to start optimization - ${message}`,
132
+ };
133
+ }
134
+ }
135
+ // ============================================
136
+ // get_optimization
137
+ // ============================================
138
+ const getOptimizationInputSchema = z.object({
139
+ id: z.string().min(1),
140
+ });
141
+ export const getOptimizationTool = {
142
+ name: "get_optimization",
143
+ description: "Get details of an optimization session, including all suggestions.",
144
+ inputSchema: {
145
+ type: "object",
146
+ properties: {
147
+ id: {
148
+ type: "string",
149
+ description: "The optimization ID (required)",
150
+ },
151
+ },
152
+ required: ["id"],
153
+ },
154
+ };
155
+ export async function executeGetOptimization(input, context) {
156
+ const parsed = getOptimizationInputSchema.safeParse(input);
157
+ if (!parsed.success) {
158
+ return {
159
+ success: false,
160
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
161
+ };
162
+ }
163
+ const { id } = parsed.data;
164
+ try {
165
+ const response = await context.client.get(`/optimizations/${id}`, {}, CACHE_TTL.resources);
166
+ const opt = response.data;
167
+ let markdown = `## Optimization: ${opt.content?.title || opt.content_id}\n\n`;
168
+ markdown += formatKeyValue({
169
+ id: opt.id,
170
+ content_id: opt.content_id,
171
+ status: opt.status,
172
+ suggestions: opt.suggestions_count,
173
+ applied: opt.applied_count,
174
+ analyzed: opt.analyzed_at ? formatDate(opt.analyzed_at) : null,
175
+ });
176
+ if (opt.suggestions && opt.suggestions.length > 0) {
177
+ markdown += "\n\n### Suggestions\n\n";
178
+ for (const suggestion of opt.suggestions) {
179
+ const status = suggestion.applied ? "Applied" : "Pending";
180
+ markdown += `#### ${suggestion.title}\n\n`;
181
+ markdown += `**Type:** ${suggestion.type} | **Priority:** ${suggestion.priority} | **Status:** ${status}\n\n`;
182
+ markdown += `${suggestion.description}\n\n`;
183
+ }
184
+ }
185
+ else if (opt.status === "analyzing") {
186
+ markdown += "\n\n_Analysis in progress. Check back soon for suggestions._";
187
+ }
188
+ else {
189
+ markdown += "\n\n_No suggestions generated._";
190
+ }
191
+ return {
192
+ success: true,
193
+ markdown,
194
+ data: response,
195
+ };
196
+ }
197
+ catch (error) {
198
+ const message = error instanceof Error ? error.message : "Unknown error";
199
+ return {
200
+ success: false,
201
+ markdown: `**Error:** Failed to get optimization - ${message}`,
202
+ };
203
+ }
204
+ }
205
+ // ============================================
206
+ // apply_optimization
207
+ // ============================================
208
+ const applyOptimizationInputSchema = z.object({
209
+ id: z.string().min(1),
210
+ suggestion_ids: z.array(z.string()).optional(),
211
+ });
212
+ export const applyOptimizationTool = {
213
+ name: "apply_optimization",
214
+ description: "Apply optimization suggestions to the content. Optionally specify which suggestions to apply.",
215
+ inputSchema: {
216
+ type: "object",
217
+ properties: {
218
+ id: {
219
+ type: "string",
220
+ description: "The optimization ID (required)",
221
+ },
222
+ suggestion_ids: {
223
+ type: "array",
224
+ items: { type: "string" },
225
+ description: "Specific suggestion IDs to apply (optional, applies all if not specified)",
226
+ },
227
+ },
228
+ required: ["id"],
229
+ },
230
+ };
231
+ export async function executeApplyOptimization(input, context) {
232
+ const parsed = applyOptimizationInputSchema.safeParse(input);
233
+ if (!parsed.success) {
234
+ return {
235
+ success: false,
236
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
237
+ };
238
+ }
239
+ const { id, suggestion_ids } = parsed.data;
240
+ try {
241
+ const body = {};
242
+ if (suggestion_ids)
243
+ body.suggestion_ids = suggestion_ids;
244
+ const response = await context.client.post(`/optimizations/${id}/apply`, body);
245
+ const opt = response.data;
246
+ return {
247
+ success: true,
248
+ markdown: `## Optimization Applied\n\n${formatKeyValue({
249
+ id: opt.id,
250
+ status: opt.status,
251
+ applied: opt.applied_count,
252
+ })}\n\n**Note:** The suggestions have been applied to your content.`,
253
+ data: response,
254
+ };
255
+ }
256
+ catch (error) {
257
+ const message = error instanceof Error ? error.message : "Unknown error";
258
+ return {
259
+ success: false,
260
+ markdown: `**Error:** Failed to apply optimization - ${message}`,
261
+ };
262
+ }
263
+ }
264
+ // ============================================
265
+ // get_optimization_insights
266
+ // ============================================
267
+ const getOptimizationInsightsInputSchema = z.object({
268
+ limit: z.number().min(1).max(50).optional().default(10),
269
+ });
270
+ export const getOptimizationInsightsTool = {
271
+ name: "get_optimization_insights",
272
+ description: "Get optimization insights - common issues and opportunities across your content.",
273
+ inputSchema: {
274
+ type: "object",
275
+ properties: {
276
+ limit: {
277
+ type: "number",
278
+ description: "Max insights to return (default: 10)",
279
+ },
280
+ },
281
+ },
282
+ };
283
+ export async function executeGetOptimizationInsights(input, context) {
284
+ const parsed = getOptimizationInsightsInputSchema.safeParse(input || {});
285
+ if (!parsed.success) {
286
+ return {
287
+ success: false,
288
+ markdown: `**Error:** Invalid input - ${parsed.error.message}`,
289
+ };
290
+ }
291
+ const { limit } = parsed.data;
292
+ try {
293
+ const response = await context.client.get("/optimizations/insights", { limit }, CACHE_TTL.resources);
294
+ const insights = response.data;
295
+ if (insights.length === 0) {
296
+ return {
297
+ success: true,
298
+ markdown: "## Optimization Insights\n\n_No insights available. Run optimizations on your content to generate insights._",
299
+ data: response,
300
+ };
301
+ }
302
+ let markdown = "## Optimization Insights\n\n";
303
+ for (const insight of insights) {
304
+ markdown += `### ${insight.title}\n\n`;
305
+ markdown += `**Type:** ${insight.type} | **Priority:** ${insight.priority} | **Affected Content:** ${insight.affected_content_count}\n\n`;
306
+ markdown += `${insight.description}\n\n`;
307
+ }
308
+ return {
309
+ success: true,
310
+ markdown,
311
+ data: response,
312
+ };
313
+ }
314
+ catch (error) {
315
+ const message = error instanceof Error ? error.message : "Unknown error";
316
+ return {
317
+ success: false,
318
+ markdown: `**Error:** Failed to get optimization insights - ${message}`,
319
+ };
320
+ }
321
+ }
322
+ // ============================================
323
+ // Export all
324
+ // ============================================
325
+ export const optimizationTools = [
326
+ listOptimizationsTool,
327
+ startOptimizationTool,
328
+ getOptimizationTool,
329
+ applyOptimizationTool,
330
+ getOptimizationInsightsTool,
331
+ ];
332
+ export const optimizationExecutors = {
333
+ list_optimizations: executeListOptimizations,
334
+ start_optimization: executeStartOptimization,
335
+ get_optimization: executeGetOptimization,
336
+ apply_optimization: executeApplyOptimization,
337
+ get_optimization_insights: executeGetOptimizationInsights,
338
+ };
339
+ //# sourceMappingURL=optimizations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizations.js","sourceRoot":"","sources":["../../src/tools/optimizations.ts"],"names":[],"mappings":"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"}