@frase/mcp-server 0.2.1 → 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/api-client.d.ts +3 -90
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +2 -214
- package/dist/api-client.js.map +1 -1
- package/dist/cache.d.ts +2 -49
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +2 -94
- package/dist/cache.js.map +1 -1
- package/dist/cli/config-writer.d.ts.map +1 -1
- package/dist/cli/config-writer.js +52 -7
- package/dist/cli/config-writer.js.map +1 -1
- package/dist/config.d.ts +3 -14
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -28
- package/dist/config.js.map +1 -1
- package/dist/formatter.d.ts +2 -44
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +2 -142
- package/dist/formatter.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prompts/cms-publishing.d.ts +16 -0
- package/dist/prompts/cms-publishing.d.ts.map +1 -0
- package/dist/prompts/cms-publishing.js +84 -0
- package/dist/prompts/cms-publishing.js.map +1 -0
- package/dist/prompts/competitive-intelligence.d.ts +16 -0
- package/dist/prompts/competitive-intelligence.d.ts.map +1 -0
- package/dist/prompts/competitive-intelligence.js +78 -0
- package/dist/prompts/competitive-intelligence.js.map +1 -0
- package/dist/prompts/content-governance.d.ts +16 -0
- package/dist/prompts/content-governance.d.ts.map +1 -0
- package/dist/prompts/content-governance.js +113 -0
- package/dist/prompts/content-governance.js.map +1 -0
- package/dist/prompts/geo-optimization.d.ts +17 -0
- package/dist/prompts/geo-optimization.d.ts.map +1 -0
- package/dist/prompts/geo-optimization.js +79 -0
- package/dist/prompts/geo-optimization.js.map +1 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +15 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/tools/atomization.d.ts +8 -0
- package/dist/tools/atomization.d.ts.map +1 -0
- package/dist/tools/atomization.js +172 -0
- package/dist/tools/atomization.js.map +1 -0
- package/dist/tools/audits.d.ts.map +1 -1
- package/dist/tools/audits.js +1 -2
- package/dist/tools/audits.js.map +1 -1
- package/dist/tools/briefs.d.ts +2 -2
- package/dist/tools/briefs.d.ts.map +1 -1
- package/dist/tools/briefs.js +63 -4
- package/dist/tools/briefs.js.map +1 -1
- package/dist/tools/clusters.d.ts +9 -0
- package/dist/tools/clusters.d.ts.map +1 -0
- package/dist/tools/clusters.js +166 -0
- package/dist/tools/clusters.js.map +1 -0
- package/dist/tools/cms-connections.d.ts +7 -0
- package/dist/tools/cms-connections.d.ts.map +1 -0
- package/dist/tools/cms-connections.js +96 -0
- package/dist/tools/cms-connections.js.map +1 -0
- package/dist/tools/competitive-analysis.js +2 -2
- package/dist/tools/competitive-analysis.js.map +1 -1
- package/dist/tools/content.d.ts +2 -2
- package/dist/tools/content.d.ts.map +1 -1
- package/dist/tools/content.js +73 -9
- package/dist/tools/content.js.map +1 -1
- package/dist/tools/discover.d.ts +15 -0
- package/dist/tools/discover.d.ts.map +1 -0
- package/dist/tools/discover.js +180 -0
- package/dist/tools/discover.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jobs.d.ts +2 -2
- package/dist/tools/opportunities.d.ts +11 -0
- package/dist/tools/opportunities.d.ts.map +1 -0
- package/dist/tools/opportunities.js +122 -0
- package/dist/tools/opportunities.js.map +1 -0
- package/dist/tools/site-health.d.ts +7 -0
- package/dist/tools/site-health.d.ts.map +1 -0
- package/dist/tools/site-health.js +120 -0
- package/dist/tools/site-health.js.map +1 -0
- package/dist/types.d.ts +2 -180
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +26 -7
- package/server.json +4 -4
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opportunities tools — unified opportunity detection
|
|
3
|
+
*
|
|
4
|
+
* Sources: GSC data, competitor gaps, decay alerts, programmatic patterns
|
|
5
|
+
* Scoring: Impact 35%, Effort 25%, Speed 20%, Strategic 20%
|
|
6
|
+
* Views: quick-wins, growth, strategic
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import { formatTable, formatKeyValue } from "../formatter.js";
|
|
10
|
+
// ============================================
|
|
11
|
+
// list_opportunities
|
|
12
|
+
// ============================================
|
|
13
|
+
const listOpportunitiesSchema = z.object({
|
|
14
|
+
site_id: z.string().min(1),
|
|
15
|
+
view: z.enum(["quick-wins", "growth", "strategic", "all"]).optional().default("all"),
|
|
16
|
+
limit: z.number().min(1).max(100).optional().default(20),
|
|
17
|
+
});
|
|
18
|
+
const listOpportunitiesTool = {
|
|
19
|
+
name: "list_opportunities",
|
|
20
|
+
description: "Get unified content opportunities scored by Impact (35%), Effort (25%), Speed (20%), and Strategic value (20%). Views: quick-wins (low effort, proven demand), growth (medium effort, validated gaps), strategic (high effort, high reward).",
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
site_id: { type: "string", description: "Site ID (required)" },
|
|
25
|
+
view: {
|
|
26
|
+
type: "string",
|
|
27
|
+
enum: ["quick-wins", "growth", "strategic", "all"],
|
|
28
|
+
description: "Opportunity view (default: all)",
|
|
29
|
+
},
|
|
30
|
+
limit: { type: "number", description: "Max results (default: 20, max: 100)" },
|
|
31
|
+
},
|
|
32
|
+
required: ["site_id"],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
async function executeListOpportunities(input, context) {
|
|
36
|
+
const parsed = listOpportunitiesSchema.safeParse(input || {});
|
|
37
|
+
if (!parsed.success)
|
|
38
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
39
|
+
try {
|
|
40
|
+
const response = await context.client.get("/opportunities", { site_id: parsed.data.site_id, view: parsed.data.view, limit: parsed.data.limit });
|
|
41
|
+
const opps = response.data || [];
|
|
42
|
+
const headers = ["ID", "Title", "Type", "Score", "Impact", "Effort"];
|
|
43
|
+
const rows = opps.map((o) => [o.id, o.title.slice(0, 35), o.type, String(o.score), String(o.impact), o.effort]);
|
|
44
|
+
const table = formatTable(headers, rows);
|
|
45
|
+
return { success: true, markdown: `## Opportunities (${parsed.data.view})\n\n${table}`, data: response };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ============================================
|
|
52
|
+
// get_opportunity
|
|
53
|
+
// ============================================
|
|
54
|
+
const getOpportunitySchema = z.object({ id: z.string().min(1) });
|
|
55
|
+
const getOpportunityTool = {
|
|
56
|
+
name: "get_opportunity",
|
|
57
|
+
description: "Get opportunity details with full scoring breakdown (impact, effort, speed, strategic value) and recommended actions.",
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: "object",
|
|
60
|
+
properties: { id: { type: "string", description: "Opportunity ID (required)" } },
|
|
61
|
+
required: ["id"],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
async function executeGetOpportunity(input, context) {
|
|
65
|
+
const parsed = getOpportunitySchema.safeParse(input);
|
|
66
|
+
if (!parsed.success)
|
|
67
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
68
|
+
try {
|
|
69
|
+
const response = await context.client.get(`/opportunities/${parsed.data.id}`);
|
|
70
|
+
const o = response.data;
|
|
71
|
+
let markdown = `## Opportunity: ${o.title}\n\n`;
|
|
72
|
+
markdown += formatKeyValue(o);
|
|
73
|
+
return { success: true, markdown, data: response };
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ============================================
|
|
80
|
+
// create_from_opportunity
|
|
81
|
+
// ============================================
|
|
82
|
+
const createFromOpportunitySchema = z.object({ id: z.string().min(1) });
|
|
83
|
+
const createFromOpportunityTool = {
|
|
84
|
+
name: "create_from_opportunity",
|
|
85
|
+
description: "Generate a content brief directly from an opportunity — pre-fills topic, keywords, and competitive context.",
|
|
86
|
+
inputSchema: {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: { id: { type: "string", description: "Opportunity ID (required)" } },
|
|
89
|
+
required: ["id"],
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
async function executeCreateFromOpportunity(input, context) {
|
|
93
|
+
const parsed = createFromOpportunitySchema.safeParse(input);
|
|
94
|
+
if (!parsed.success)
|
|
95
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
96
|
+
try {
|
|
97
|
+
const response = await context.client.post(`/opportunities/${parsed.data.id}/brief`, {});
|
|
98
|
+
const b = response.data;
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
markdown: `## Brief Created from Opportunity\n\n${formatKeyValue({ "Brief ID": b.brief_id, Topic: b.topic })}\n\nUse \`get_brief\` with \`id: "${b.brief_id}"\` to view the full brief.`,
|
|
102
|
+
data: response,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// ============================================
|
|
110
|
+
// Exports
|
|
111
|
+
// ============================================
|
|
112
|
+
export const opportunityTools = [
|
|
113
|
+
listOpportunitiesTool,
|
|
114
|
+
getOpportunityTool,
|
|
115
|
+
createFromOpportunityTool,
|
|
116
|
+
];
|
|
117
|
+
export const opportunityExecutors = {
|
|
118
|
+
list_opportunities: executeListOpportunities,
|
|
119
|
+
get_opportunity: executeGetOpportunity,
|
|
120
|
+
create_from_opportunity: executeCreateFromOpportunity,
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=opportunities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opportunities.js","sourceRoot":"","sources":["../../src/tools/opportunities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Site Health tools — health scores, link graphs, cannibalization detection
|
|
3
|
+
*/
|
|
4
|
+
import type { McpToolDefinition, ToolContext, ToolResult } from "../types.js";
|
|
5
|
+
export declare const siteHealthTools: McpToolDefinition[];
|
|
6
|
+
export declare const siteHealthExecutors: Record<string, (input: unknown, context: ToolContext) => Promise<ToolResult>>;
|
|
7
|
+
//# sourceMappingURL=site-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-health.d.ts","sourceRoot":"","sources":["../../src/tools/site-health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiI9E,eAAO,MAAM,eAAe,EAAE,iBAAiB,EAI9C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAI7G,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Site Health tools — health scores, link graphs, cannibalization detection
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { formatTable, formatKeyValue } from "../formatter.js";
|
|
6
|
+
import { CACHE_TTL } from "../cache.js";
|
|
7
|
+
// ============================================
|
|
8
|
+
// get_site_health
|
|
9
|
+
// ============================================
|
|
10
|
+
const getSiteHealthSchema = z.object({ site_id: z.string().min(1) });
|
|
11
|
+
const getSiteHealthTool = {
|
|
12
|
+
name: "get_site_health",
|
|
13
|
+
description: "Get overall site health score, issue counts by severity, and page statistics. Use this before diving into specific issues.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: "object",
|
|
16
|
+
properties: { site_id: { type: "string", description: "Site ID (required)" } },
|
|
17
|
+
required: ["site_id"],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
async function executeGetSiteHealth(input, context) {
|
|
21
|
+
const parsed = getSiteHealthSchema.safeParse(input);
|
|
22
|
+
if (!parsed.success)
|
|
23
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
24
|
+
try {
|
|
25
|
+
const response = await context.client.get("/site-health", { site_id: parsed.data.site_id }, CACHE_TTL.resources);
|
|
26
|
+
const h = response.data;
|
|
27
|
+
return {
|
|
28
|
+
success: true,
|
|
29
|
+
markdown: `## Site Health\n\n${formatKeyValue({
|
|
30
|
+
"Health Score": `${h.health_score}/100`,
|
|
31
|
+
"Total Pages": h.total_pages,
|
|
32
|
+
"Issues": h.issues_count,
|
|
33
|
+
"Critical": h.critical_issues,
|
|
34
|
+
"Warnings": h.warnings,
|
|
35
|
+
})}`,
|
|
36
|
+
data: response,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// ============================================
|
|
44
|
+
// get_cannibalization
|
|
45
|
+
// ============================================
|
|
46
|
+
const getCannibalizationSchema = z.object({ site_id: z.string().min(1) });
|
|
47
|
+
const getCannibalizationTool = {
|
|
48
|
+
name: "get_cannibalization",
|
|
49
|
+
description: "Detect pages competing for the same keywords. Shows keyword groups with conflicting pages and their positions.",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: { site_id: { type: "string", description: "Site ID (required)" } },
|
|
53
|
+
required: ["site_id"],
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
async function executeGetCannibalization(input, context) {
|
|
57
|
+
const parsed = getCannibalizationSchema.safeParse(input);
|
|
58
|
+
if (!parsed.success)
|
|
59
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
60
|
+
try {
|
|
61
|
+
const response = await context.client.get("/site-health/cannibalization", { site_id: parsed.data.site_id }, CACHE_TTL.resources);
|
|
62
|
+
const groups = response.data || [];
|
|
63
|
+
if (groups.length === 0) {
|
|
64
|
+
return { success: true, markdown: `## Cannibalization Report\n\n_No cannibalization issues detected._`, data: response };
|
|
65
|
+
}
|
|
66
|
+
let markdown = `## Cannibalization Report\n\n**${groups.length} keyword conflicts found:**\n\n`;
|
|
67
|
+
for (const g of groups.slice(0, 20)) {
|
|
68
|
+
markdown += `### "${g.keyword}"\n`;
|
|
69
|
+
const headers = ["URL", "Position"];
|
|
70
|
+
const rows = g.pages.map((p) => [p.url, String(p.position)]);
|
|
71
|
+
markdown += formatTable(headers, rows) + "\n\n";
|
|
72
|
+
}
|
|
73
|
+
return { success: true, markdown, data: response };
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ============================================
|
|
80
|
+
// get_link_graph
|
|
81
|
+
// ============================================
|
|
82
|
+
const getLinkGraphSchema = z.object({ site_id: z.string().min(1) });
|
|
83
|
+
const getLinkGraphTool = {
|
|
84
|
+
name: "get_link_graph",
|
|
85
|
+
description: "Get internal link structure analysis — orphan pages, most-linked pages, link depth distribution, and broken links.",
|
|
86
|
+
inputSchema: {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: { site_id: { type: "string", description: "Site ID (required)" } },
|
|
89
|
+
required: ["site_id"],
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
async function executeGetLinkGraph(input, context) {
|
|
93
|
+
const parsed = getLinkGraphSchema.safeParse(input);
|
|
94
|
+
if (!parsed.success)
|
|
95
|
+
return { success: false, markdown: `**Error:** ${parsed.error.message}` };
|
|
96
|
+
try {
|
|
97
|
+
const response = await context.client.get("/site-health/links", { site_id: parsed.data.site_id }, CACHE_TTL.resources);
|
|
98
|
+
const data = response.data;
|
|
99
|
+
let markdown = `## Internal Link Analysis\n\n`;
|
|
100
|
+
markdown += `\`\`\`json\n${JSON.stringify(data, null, 2)}\n\`\`\``;
|
|
101
|
+
return { success: true, markdown, data: response };
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return { success: false, markdown: `**Error:** ${error instanceof Error ? error.message : "Unknown error"}` };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// ============================================
|
|
108
|
+
// Exports
|
|
109
|
+
// ============================================
|
|
110
|
+
export const siteHealthTools = [
|
|
111
|
+
getSiteHealthTool,
|
|
112
|
+
getCannibalizationTool,
|
|
113
|
+
getLinkGraphTool,
|
|
114
|
+
];
|
|
115
|
+
export const siteHealthExecutors = {
|
|
116
|
+
get_site_health: executeGetSiteHealth,
|
|
117
|
+
get_cannibalization: executeGetCannibalization,
|
|
118
|
+
get_link_graph: executeGetLinkGraph,
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=site-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-health.js","sourceRoot":"","sources":["../../src/tools/site-health.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,183 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Type definitions
|
|
2
|
+
* Type definitions — re-exported from @frase/core
|
|
3
3
|
*/
|
|
4
|
-
|
|
5
|
-
import type { Config } from "./config.js";
|
|
6
|
-
/**
|
|
7
|
-
* Context passed to tool executors
|
|
8
|
-
*/
|
|
9
|
-
export interface ToolContext {
|
|
10
|
-
client: FraseApiClient;
|
|
11
|
-
config: Config;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Result of a tool execution
|
|
15
|
-
*/
|
|
16
|
-
export interface ToolResult {
|
|
17
|
-
success: boolean;
|
|
18
|
-
markdown: string;
|
|
19
|
-
data?: unknown;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* MCP Tool definition
|
|
23
|
-
*/
|
|
24
|
-
export interface McpToolDefinition {
|
|
25
|
-
name: string;
|
|
26
|
-
description: string;
|
|
27
|
-
inputSchema: {
|
|
28
|
-
type: "object";
|
|
29
|
-
properties: Record<string, unknown>;
|
|
30
|
-
required?: string[];
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* MCP Resource definition
|
|
35
|
-
*/
|
|
36
|
-
export interface McpResourceDefinition {
|
|
37
|
-
uri: string;
|
|
38
|
-
name: string;
|
|
39
|
-
description: string;
|
|
40
|
-
mimeType: string;
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* MCP Prompt definition
|
|
44
|
-
*/
|
|
45
|
-
export interface McpPromptDefinition {
|
|
46
|
-
name: string;
|
|
47
|
-
description: string;
|
|
48
|
-
arguments?: {
|
|
49
|
-
name: string;
|
|
50
|
-
description: string;
|
|
51
|
-
required?: boolean;
|
|
52
|
-
}[];
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Tool executor function type
|
|
56
|
-
*/
|
|
57
|
-
export type ToolExecutor = (input: unknown, context: ToolContext) => Promise<ToolResult>;
|
|
58
|
-
/**
|
|
59
|
-
* Site from API
|
|
60
|
-
*/
|
|
61
|
-
export interface Site {
|
|
62
|
-
id: string;
|
|
63
|
-
name: string;
|
|
64
|
-
domain: string;
|
|
65
|
-
created_at: string;
|
|
66
|
-
updated_at: string | null;
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Brief from API
|
|
70
|
-
*/
|
|
71
|
-
export interface Brief {
|
|
72
|
-
id: string;
|
|
73
|
-
topic: string;
|
|
74
|
-
target_keywords: string[];
|
|
75
|
-
content_type: string;
|
|
76
|
-
status: "draft" | "pending" | "research" | "ready" | "generating" | "completed";
|
|
77
|
-
search_intent: string | null;
|
|
78
|
-
target_word_count: number | null;
|
|
79
|
-
site_id: string | null;
|
|
80
|
-
editor_metadata?: Record<string, unknown>;
|
|
81
|
-
created_at: string;
|
|
82
|
-
updated_at: string | null;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Content from API
|
|
86
|
-
*/
|
|
87
|
-
export interface Content {
|
|
88
|
-
id: string;
|
|
89
|
-
title: string;
|
|
90
|
-
status: "draft" | "generating" | "review" | "published" | "archived";
|
|
91
|
-
word_count: number | null;
|
|
92
|
-
site_id: string | null;
|
|
93
|
-
editor_metadata?: Record<string, unknown>;
|
|
94
|
-
created_at: string;
|
|
95
|
-
updated_at: string | null;
|
|
96
|
-
published_at: string | null;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Research session from API
|
|
100
|
-
*/
|
|
101
|
-
export interface Research {
|
|
102
|
-
id: string;
|
|
103
|
-
query: string;
|
|
104
|
-
status: string;
|
|
105
|
-
type: string;
|
|
106
|
-
language: string | null;
|
|
107
|
-
country: string | null;
|
|
108
|
-
site_id: string | null;
|
|
109
|
-
created_at: string;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Audit from API
|
|
113
|
-
*/
|
|
114
|
-
export interface Audit {
|
|
115
|
-
id: string;
|
|
116
|
-
site_id: string;
|
|
117
|
-
status: string;
|
|
118
|
-
pages_crawled: number;
|
|
119
|
-
pages_total: number;
|
|
120
|
-
created_at: string;
|
|
121
|
-
completed_at: string | null;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Job status from API
|
|
125
|
-
*/
|
|
126
|
-
export interface JobStatus {
|
|
127
|
-
id: string;
|
|
128
|
-
type: string;
|
|
129
|
-
status: string;
|
|
130
|
-
progress?: number;
|
|
131
|
-
message?: string;
|
|
132
|
-
created_at: string;
|
|
133
|
-
updated_at: string | null;
|
|
134
|
-
completed_at: string | null;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Optimization from API
|
|
138
|
-
*/
|
|
139
|
-
export interface Optimization {
|
|
140
|
-
id: string;
|
|
141
|
-
content_id: string;
|
|
142
|
-
alert_id: string | null;
|
|
143
|
-
status: "pending" | "analyzing" | "ready" | "applied" | "auto_applying" | "dismissed" | "failed";
|
|
144
|
-
suggestions_count: number;
|
|
145
|
-
applied_count: number;
|
|
146
|
-
error: string | null;
|
|
147
|
-
created_at: string;
|
|
148
|
-
updated_at: string;
|
|
149
|
-
analyzed_at: string | null;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Competitive Analysis from API
|
|
153
|
-
*/
|
|
154
|
-
export interface CompetitiveAnalysis {
|
|
155
|
-
id: string;
|
|
156
|
-
url: string;
|
|
157
|
-
status: "pending" | "crawling_page" | "fetching_rankings" | "analyzing_competitors" | "generating_report" | "ready" | "failed";
|
|
158
|
-
opportunity_score: number | null;
|
|
159
|
-
error: string | null;
|
|
160
|
-
created_at: string;
|
|
161
|
-
completed_at: string | null;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Paginated response from API
|
|
165
|
-
*/
|
|
166
|
-
export interface PaginatedApiResponse<T> {
|
|
167
|
-
data: T[];
|
|
168
|
-
pagination: {
|
|
169
|
-
page: number;
|
|
170
|
-
page_size: number;
|
|
171
|
-
total: number;
|
|
172
|
-
has_more: boolean;
|
|
173
|
-
};
|
|
174
|
-
request_id: string;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Single item response from API
|
|
178
|
-
*/
|
|
179
|
-
export interface SingleApiResponse<T> {
|
|
180
|
-
data: T;
|
|
181
|
-
request_id: string;
|
|
182
|
-
}
|
|
4
|
+
export type { ToolContext, ToolResult, McpToolDefinition, McpResourceDefinition, McpPromptDefinition, ToolExecutor, Site, Brief, Content, Research, Audit, JobStatus, Optimization, CompetitiveAnalysis, SerpAnalysis, AiVisibility, AnalyticsMetric, AnalyticsOverview, Webhook, RuleSet, Playbook, PlaybookRun, Template, Atomization, Opportunity, TopicCluster, SiteHealth, CmsConnection, AutoOptimizationStatus, PaginatedApiResponse, SingleApiResponse, } from "@frase/core";
|
|
183
5
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,QAAQ,EACR,KAAK,EACL,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
|
package/dist/types.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frase/mcp-server",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Frase MCP Server -
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Frase MCP Server — The complete content platform for AI agents. Research, write, optimize, and host SEO & GEO-optimized content with built-in AI search visibility monitoring. Includes Frase CMS for auto-optimized web hosting, 95 tools, 9 agent skills, and 7 workflows. The only MCP server that creates, optimizes, publishes, AND monitors content across Google and AI search engines (ChatGPT, Perplexity, Claude, Gemini, AI Overviews). Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, Lovable, Replit, and any MCP-compatible tool.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"build:mcpb": "npm run build && mcpb pack"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
+
"@frase/core": "^0.1.0",
|
|
48
49
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
49
50
|
"dotenv": "^16.4.7",
|
|
50
51
|
"zod": "^3.24.1"
|
|
@@ -61,20 +62,38 @@
|
|
|
61
62
|
},
|
|
62
63
|
"keywords": [
|
|
63
64
|
"mcp",
|
|
65
|
+
"mcp-server",
|
|
64
66
|
"frase",
|
|
65
67
|
"seo",
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"ai"
|
|
68
|
+
"geo",
|
|
69
|
+
"aeo",
|
|
70
|
+
"ai-visibility",
|
|
71
|
+
"ai-search",
|
|
72
|
+
"content-automation",
|
|
73
|
+
"content-optimization",
|
|
74
|
+
"content-hosting",
|
|
75
|
+
"headless-cms",
|
|
76
|
+
"blog-hosting",
|
|
77
|
+
"content-pipeline",
|
|
78
|
+
"ai-agent",
|
|
79
|
+
"claude-code",
|
|
80
|
+
"cursor",
|
|
81
|
+
"windsurf",
|
|
82
|
+
"lovable",
|
|
83
|
+
"replit",
|
|
84
|
+
"chatgpt",
|
|
85
|
+
"perplexity",
|
|
86
|
+
"gemini",
|
|
87
|
+
"ai-overviews"
|
|
69
88
|
],
|
|
70
89
|
"repository": {
|
|
71
90
|
"type": "git",
|
|
72
|
-
"url": "https://github.com/frase-io/
|
|
91
|
+
"url": "https://github.com/frase-io/newfrase.git",
|
|
73
92
|
"directory": "packages/customer-mcp-server"
|
|
74
93
|
},
|
|
75
94
|
"homepage": "https://frase.io",
|
|
76
95
|
"bugs": {
|
|
77
|
-
"url": "https://github.com/frase-io/
|
|
96
|
+
"url": "https://github.com/frase-io/newfrase/issues"
|
|
78
97
|
},
|
|
79
98
|
"license": "MIT",
|
|
80
99
|
"author": {
|
package/server.json
CHANGED
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.frase/mcp-server",
|
|
4
4
|
"title": "Frase SEO",
|
|
5
|
-
"description": "Connect to your Frase account — manage content briefs, research, site audits, AI visibility tracking, SERP analysis, and SEO optimization with
|
|
6
|
-
"version": "0.
|
|
5
|
+
"description": "Connect to your Frase account — manage content briefs, research, site audits, AI visibility tracking, SERP analysis, and SEO optimization with 95 tools.",
|
|
6
|
+
"version": "0.3.0",
|
|
7
7
|
"websiteUrl": "https://frase.io/agents",
|
|
8
8
|
"repository": {
|
|
9
|
-
"url": "https://github.com/frase-io/
|
|
9
|
+
"url": "https://github.com/frase-io/newfrase.git",
|
|
10
10
|
"source": "github"
|
|
11
11
|
},
|
|
12
12
|
"packages": [
|
|
13
13
|
{
|
|
14
14
|
"registryType": "npm",
|
|
15
15
|
"identifier": "@frase/mcp-server",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "0.3.0",
|
|
17
17
|
"transport": {
|
|
18
18
|
"type": "stdio"
|
|
19
19
|
},
|