@bulkpublishing/mcp-server 1.0.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/README.md +170 -0
- package/dist/ai/engine.d.ts +12 -0
- package/dist/ai/engine.d.ts.map +1 -0
- package/dist/ai/engine.js +397 -0
- package/dist/ai/engine.js.map +1 -0
- package/dist/ai/prompts.d.ts +30 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +207 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/auth/context.d.ts +81 -0
- package/dist/auth/context.d.ts.map +1 -0
- package/dist/auth/context.js +68 -0
- package/dist/auth/context.js.map +1 -0
- package/dist/auth/validate.d.ts +13 -0
- package/dist/auth/validate.d.ts.map +1 -0
- package/dist/auth/validate.js +87 -0
- package/dist/auth/validate.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/csv.d.ts +18 -0
- package/dist/tools/csv.d.ts.map +1 -0
- package/dist/tools/csv.js +673 -0
- package/dist/tools/csv.js.map +1 -0
- package/dist/tools/generation.d.ts +14 -0
- package/dist/tools/generation.d.ts.map +1 -0
- package/dist/tools/generation.js +291 -0
- package/dist/tools/generation.js.map +1 -0
- package/dist/tools/indexing.d.ts +11 -0
- package/dist/tools/indexing.d.ts.map +1 -0
- package/dist/tools/indexing.js +219 -0
- package/dist/tools/indexing.js.map +1 -0
- package/dist/tools/projects.d.ts +11 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +181 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/research.d.ts +12 -0
- package/dist/tools/research.d.ts.map +1 -0
- package/dist/tools/research.js +88 -0
- package/dist/tools/research.js.map +1 -0
- package/dist/tools/seo.d.ts +12 -0
- package/dist/tools/seo.d.ts.map +1 -0
- package/dist/tools/seo.js +164 -0
- package/dist/tools/seo.js.map +1 -0
- package/dist/tools/wordpress.d.ts +15 -0
- package/dist/tools/wordpress.d.ts.map +1 -0
- package/dist/tools/wordpress.js +447 -0
- package/dist/tools/wordpress.js.map +1 -0
- package/dist/types.d.ts +206 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — Project Management Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - list_projects: List all user projects
|
|
6
|
+
* - switch_project: Set active project
|
|
7
|
+
* - get_project_settings: View project settings
|
|
8
|
+
*/
|
|
9
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
export declare function registerProjectTools(server: McpServer): void;
|
|
11
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QA4MrD"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — Project Management Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - list_projects: List all user projects
|
|
6
|
+
* - switch_project: Set active project
|
|
7
|
+
* - get_project_settings: View project settings
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { getUserContext, getProjectSettings } from '../auth/context.js';
|
|
11
|
+
export function registerProjectTools(server) {
|
|
12
|
+
// ============================================
|
|
13
|
+
// list_projects
|
|
14
|
+
// ============================================
|
|
15
|
+
server.tool('list_projects', 'List all projects for the authenticated user. Shows project names, IDs, descriptions, and WordPress connection status.', {}, async () => {
|
|
16
|
+
const ctx = getUserContext();
|
|
17
|
+
if (!ctx.authenticated) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{
|
|
20
|
+
type: 'text', text: JSON.stringify({
|
|
21
|
+
error: 'Not authenticated. Check your BPAI_API_KEY.',
|
|
22
|
+
}, null, 2)
|
|
23
|
+
}],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const projects = ctx.projects.map(p => ({
|
|
27
|
+
id: p.id,
|
|
28
|
+
name: p.name,
|
|
29
|
+
description: p.description || '',
|
|
30
|
+
color: p.color,
|
|
31
|
+
is_active: p.id === ctx.activeProjectId,
|
|
32
|
+
wordpress_connected: !!p.settings?.wordpress?.connected,
|
|
33
|
+
internal_linking_enabled: !!p.settings?.internal_linking?.enabled,
|
|
34
|
+
}));
|
|
35
|
+
return {
|
|
36
|
+
content: [{
|
|
37
|
+
type: 'text', text: JSON.stringify({
|
|
38
|
+
total: projects.length,
|
|
39
|
+
active_project: ctx.activeProjectId,
|
|
40
|
+
projects,
|
|
41
|
+
}, null, 2)
|
|
42
|
+
}],
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
// ============================================
|
|
46
|
+
// switch_project
|
|
47
|
+
// ============================================
|
|
48
|
+
server.tool('switch_project', 'Switch the active project. All subsequent generation, publishing, and export commands will use this project\'s settings.', {
|
|
49
|
+
project_id: z.string().optional().describe('Project UUID to switch to'),
|
|
50
|
+
project_name: z.string().optional().describe('Project name to switch to (fuzzy match)'),
|
|
51
|
+
}, async (args) => {
|
|
52
|
+
const ctx = getUserContext();
|
|
53
|
+
if (!ctx.authenticated) {
|
|
54
|
+
return {
|
|
55
|
+
content: [{
|
|
56
|
+
type: 'text', text: JSON.stringify({
|
|
57
|
+
error: 'Not authenticated.',
|
|
58
|
+
}, null, 2)
|
|
59
|
+
}],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
let target = null;
|
|
63
|
+
if (args.project_id) {
|
|
64
|
+
target = ctx.projects.find(p => p.id === args.project_id);
|
|
65
|
+
}
|
|
66
|
+
else if (args.project_name) {
|
|
67
|
+
const search = args.project_name.toLowerCase();
|
|
68
|
+
target = ctx.projects.find(p => p.name.toLowerCase().includes(search));
|
|
69
|
+
}
|
|
70
|
+
if (!target) {
|
|
71
|
+
return {
|
|
72
|
+
content: [{
|
|
73
|
+
type: 'text', text: JSON.stringify({
|
|
74
|
+
error: 'Project not found.',
|
|
75
|
+
available: ctx.projects.map(p => ({ id: p.id, name: p.name })),
|
|
76
|
+
}, null, 2)
|
|
77
|
+
}],
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
ctx.activeProjectId = target.id;
|
|
81
|
+
return {
|
|
82
|
+
content: [{
|
|
83
|
+
type: 'text', text: JSON.stringify({
|
|
84
|
+
status: 'switched',
|
|
85
|
+
active_project: {
|
|
86
|
+
id: target.id,
|
|
87
|
+
name: target.name,
|
|
88
|
+
wordpress_connected: !!target.settings?.wordpress?.connected,
|
|
89
|
+
internal_linking_enabled: !!target.settings?.internal_linking?.enabled,
|
|
90
|
+
},
|
|
91
|
+
}, null, 2)
|
|
92
|
+
}],
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
// ============================================
|
|
96
|
+
// get_project_settings
|
|
97
|
+
// ============================================
|
|
98
|
+
server.tool('get_project_settings', 'View the full settings for a project, including WordPress connection, internal linking config, cross-linking, and knowledge base items.', {
|
|
99
|
+
project_id: z.string().optional().describe('Project ID (defaults to active project)'),
|
|
100
|
+
}, async (args) => {
|
|
101
|
+
const ctx = getUserContext();
|
|
102
|
+
if (!ctx.authenticated) {
|
|
103
|
+
return {
|
|
104
|
+
content: [{
|
|
105
|
+
type: 'text', text: JSON.stringify({
|
|
106
|
+
error: 'Not authenticated.',
|
|
107
|
+
}, null, 2)
|
|
108
|
+
}],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const project = getProjectSettings(args.project_id);
|
|
112
|
+
if (!project) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{
|
|
115
|
+
type: 'text', text: JSON.stringify({
|
|
116
|
+
error: 'Project not found.',
|
|
117
|
+
}, null, 2)
|
|
118
|
+
}],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
// Get KB items for this project
|
|
122
|
+
const kbItems = ctx.knowledgeBase
|
|
123
|
+
.filter(kb => kb.project_id === project.id || kb.project_id === null)
|
|
124
|
+
.map(kb => ({ id: kb.id, title: kb.title, type: kb.type }));
|
|
125
|
+
return {
|
|
126
|
+
content: [{
|
|
127
|
+
type: 'text', text: JSON.stringify({
|
|
128
|
+
project: {
|
|
129
|
+
id: project.id,
|
|
130
|
+
name: project.name,
|
|
131
|
+
description: project.description,
|
|
132
|
+
},
|
|
133
|
+
wordpress: project.settings?.wordpress ? {
|
|
134
|
+
connected: true,
|
|
135
|
+
site_url: project.settings.wordpress.siteUrl,
|
|
136
|
+
username: project.settings.wordpress.username,
|
|
137
|
+
// Never expose the app password in tool output
|
|
138
|
+
password: '••••••••',
|
|
139
|
+
} : { connected: false },
|
|
140
|
+
internal_linking: project.settings?.internal_linking || { enabled: false },
|
|
141
|
+
cross_linking: project.settings?.cross_linking || { enabled: false },
|
|
142
|
+
knowledge_base: {
|
|
143
|
+
total: kbItems.length,
|
|
144
|
+
items: kbItems,
|
|
145
|
+
},
|
|
146
|
+
}, null, 2)
|
|
147
|
+
}],
|
|
148
|
+
};
|
|
149
|
+
});
|
|
150
|
+
// ============================================
|
|
151
|
+
// list_models (updated to use account settings)
|
|
152
|
+
// ============================================
|
|
153
|
+
server.tool('get_settings', 'View current AI generation settings including configured providers, default model, temperature, and token limits.', {}, async () => {
|
|
154
|
+
const ctx = getUserContext();
|
|
155
|
+
if (!ctx.authenticated) {
|
|
156
|
+
return {
|
|
157
|
+
content: [{
|
|
158
|
+
type: 'text', text: JSON.stringify({
|
|
159
|
+
error: 'Not authenticated.',
|
|
160
|
+
}, null, 2)
|
|
161
|
+
}],
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
// Show which providers have keys configured (without exposing the keys)
|
|
165
|
+
const configuredProviders = Object.entries(ctx.settings.api_keys)
|
|
166
|
+
.filter(([_, value]) => !!value)
|
|
167
|
+
.map(([provider]) => provider);
|
|
168
|
+
return {
|
|
169
|
+
content: [{
|
|
170
|
+
type: 'text', text: JSON.stringify({
|
|
171
|
+
configured_providers: configuredProviders,
|
|
172
|
+
model_settings: ctx.settings.model_settings,
|
|
173
|
+
prompt_strategy: ctx.settings.global_prompts.strategy || 'optimized',
|
|
174
|
+
has_custom_prompt: !!ctx.settings.global_prompts.customSystem,
|
|
175
|
+
has_additional_instructions: !!ctx.settings.global_prompts.additionalInstructions,
|
|
176
|
+
}, null, 2)
|
|
177
|
+
}],
|
|
178
|
+
};
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/tools/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — Research Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handler for research_topic:
|
|
5
|
+
* Uses Perplexity (or another research provider) to fetch real-time web
|
|
6
|
+
* research data with citations for a given topic.
|
|
7
|
+
*
|
|
8
|
+
* API keys are loaded from the authenticated user's BPAI account.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare function registerResearchTools(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=research.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.d.ts","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAwFtD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — Research Tool
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handler for research_topic:
|
|
5
|
+
* Uses Perplexity (or another research provider) to fetch real-time web
|
|
6
|
+
* research data with citations for a given topic.
|
|
7
|
+
*
|
|
8
|
+
* API keys are loaded from the authenticated user's BPAI account.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { generateContent } from '../ai/engine.js';
|
|
12
|
+
import { RESEARCH_PROMPT } from '../ai/prompts.js';
|
|
13
|
+
import { getUserContext, getApiKey } from '../auth/context.js';
|
|
14
|
+
export function registerResearchTools(server) {
|
|
15
|
+
server.tool('research_topic', 'Perform live web research on a topic using Perplexity Sonar or another research-capable provider. Returns structured findings with source citations. API keys are loaded from your BPAI account.', {
|
|
16
|
+
topic: z.string().describe('Topic or keyword to research'),
|
|
17
|
+
provider: z.enum(['perplexity', 'openai', 'grok', 'gemini', 'deepseek']).default('perplexity').describe('Research provider (Perplexity recommended for citations)'),
|
|
18
|
+
model: z.string().optional().describe('Specific model (e.g., sonar-pro, sonar-deep-research)'),
|
|
19
|
+
focus: z.string().optional().describe('Research focus area (e.g., "pricing", "competitors", "recent updates")'),
|
|
20
|
+
}, async (args) => {
|
|
21
|
+
const ctx = getUserContext();
|
|
22
|
+
if (!ctx.authenticated) {
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
|
|
24
|
+
}
|
|
25
|
+
const provider = args.provider;
|
|
26
|
+
const keys = {
|
|
27
|
+
perplexity: getApiKey('perplexity'),
|
|
28
|
+
openai: getApiKey('openai'),
|
|
29
|
+
grok: getApiKey('grok'),
|
|
30
|
+
gemini: getApiKey('gemini'),
|
|
31
|
+
deepseek: getApiKey('deepseek'),
|
|
32
|
+
};
|
|
33
|
+
if (!keys[provider]) {
|
|
34
|
+
return {
|
|
35
|
+
content: [{
|
|
36
|
+
type: 'text', text: JSON.stringify({
|
|
37
|
+
error: `Missing API key for research provider "${provider}". Add it in BPAI Settings → API Keys.`,
|
|
38
|
+
}, null, 2)
|
|
39
|
+
}],
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
let userPrompt = `Research the following topic thoroughly: "${args.topic}"`;
|
|
43
|
+
if (args.focus) {
|
|
44
|
+
userPrompt += `\n\nFocus specifically on: ${args.focus}`;
|
|
45
|
+
}
|
|
46
|
+
const defaultModels = {
|
|
47
|
+
perplexity: 'sonar-pro',
|
|
48
|
+
openai: 'gpt-5.2',
|
|
49
|
+
grok: 'grok-4.1-fast',
|
|
50
|
+
gemini: 'gemini-3-pro',
|
|
51
|
+
deepseek: 'deepseek-chat',
|
|
52
|
+
};
|
|
53
|
+
const settings = {
|
|
54
|
+
model: args.model || defaultModels[provider],
|
|
55
|
+
temperature: 0.3,
|
|
56
|
+
maxTokens: 8192,
|
|
57
|
+
};
|
|
58
|
+
const result = await generateContent({
|
|
59
|
+
provider,
|
|
60
|
+
systemPrompt: RESEARCH_PROMPT,
|
|
61
|
+
userPrompt,
|
|
62
|
+
settings,
|
|
63
|
+
}, keys);
|
|
64
|
+
if (result.error) {
|
|
65
|
+
return {
|
|
66
|
+
content: [{
|
|
67
|
+
type: 'text', text: JSON.stringify({
|
|
68
|
+
error: result.error,
|
|
69
|
+
}, null, 2)
|
|
70
|
+
}],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
content: [{
|
|
75
|
+
type: 'text', text: JSON.stringify({
|
|
76
|
+
status: 'success',
|
|
77
|
+
topic: args.topic,
|
|
78
|
+
provider,
|
|
79
|
+
model: settings.model,
|
|
80
|
+
research: result.text,
|
|
81
|
+
citations: result.citations || [],
|
|
82
|
+
citation_count: (result.citations || []).length,
|
|
83
|
+
}, null, 2)
|
|
84
|
+
}],
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=research.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/tools/research.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — SEO Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - generate_seo_metadata: Generate title, slug, meta description from a keyword
|
|
6
|
+
* - humanize_content: Anti-AI detection pass on existing content
|
|
7
|
+
*
|
|
8
|
+
* API keys are loaded from the authenticated user's BPAI account.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
export declare function registerSEOTools(server: McpServer): void;
|
|
12
|
+
//# sourceMappingURL=seo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/tools/seo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAmKjD"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — SEO Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - generate_seo_metadata: Generate title, slug, meta description from a keyword
|
|
6
|
+
* - humanize_content: Anti-AI detection pass on existing content
|
|
7
|
+
*
|
|
8
|
+
* API keys are loaded from the authenticated user's BPAI account.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { generateContent } from '../ai/engine.js';
|
|
12
|
+
import { SEO_GENERATOR_PROMPT, HUMANIZE_PROMPT } from '../ai/prompts.js';
|
|
13
|
+
import { getUserContext, getApiKey } from '../auth/context.js';
|
|
14
|
+
export function registerSEOTools(server) {
|
|
15
|
+
// ============================================
|
|
16
|
+
// generate_seo_metadata
|
|
17
|
+
// ============================================
|
|
18
|
+
server.tool('generate_seo_metadata', 'Generate optimized SEO metadata (title, title tag, slug, meta description, secondary keywords) from a keyword. Returns structured JSON.', {
|
|
19
|
+
keyword: z.string().describe('Target keyword or topic'),
|
|
20
|
+
provider: z.enum(['openai', 'claude', 'deepseek', 'grok', 'gemini', 'perplexity', 'kimi']).default('openai'),
|
|
21
|
+
model: z.string().optional(),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
const ctx = getUserContext();
|
|
24
|
+
if (!ctx.authenticated) {
|
|
25
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated. Check your BPAI_API_KEY.' }, null, 2) }] };
|
|
26
|
+
}
|
|
27
|
+
const provider = args.provider;
|
|
28
|
+
const keys = {
|
|
29
|
+
openai: getApiKey('openai'),
|
|
30
|
+
claude: getApiKey('claude'),
|
|
31
|
+
deepseek: getApiKey('deepseek'),
|
|
32
|
+
grok: getApiKey('grok'),
|
|
33
|
+
gemini: getApiKey('gemini'),
|
|
34
|
+
perplexity: getApiKey('perplexity'),
|
|
35
|
+
kimi: getApiKey('kimi'),
|
|
36
|
+
};
|
|
37
|
+
if (!keys[provider]) {
|
|
38
|
+
return {
|
|
39
|
+
content: [{
|
|
40
|
+
type: 'text', text: JSON.stringify({
|
|
41
|
+
error: `Missing API key for provider "${provider}". Add it in BPAI Settings → API Keys.`,
|
|
42
|
+
}, null, 2)
|
|
43
|
+
}],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const settings = {
|
|
47
|
+
model: args.model || getDefaultModel(provider),
|
|
48
|
+
temperature: 0.5,
|
|
49
|
+
maxTokens: 1024,
|
|
50
|
+
};
|
|
51
|
+
const result = await generateContent({
|
|
52
|
+
provider,
|
|
53
|
+
systemPrompt: SEO_GENERATOR_PROMPT,
|
|
54
|
+
userPrompt: `Generate SEO metadata for this keyword: "${args.keyword}"`,
|
|
55
|
+
settings,
|
|
56
|
+
}, keys);
|
|
57
|
+
if (result.error) {
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: 'text', text: JSON.stringify({ error: result.error }, null, 2) }],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Parse JSON response (the prompt asks for JSON output)
|
|
63
|
+
try {
|
|
64
|
+
let text = result.text.trim();
|
|
65
|
+
text = text.replace(/^```json?\n?/i, '').replace(/\n?```$/i, '').trim();
|
|
66
|
+
const metadata = JSON.parse(text);
|
|
67
|
+
return {
|
|
68
|
+
content: [{
|
|
69
|
+
type: 'text', text: JSON.stringify({
|
|
70
|
+
status: 'success',
|
|
71
|
+
keyword: args.keyword,
|
|
72
|
+
metadata,
|
|
73
|
+
}, null, 2)
|
|
74
|
+
}],
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {
|
|
79
|
+
content: [{
|
|
80
|
+
type: 'text', text: JSON.stringify({
|
|
81
|
+
status: 'success',
|
|
82
|
+
keyword: args.keyword,
|
|
83
|
+
raw_response: result.text,
|
|
84
|
+
note: 'Could not parse as JSON. Raw response returned.',
|
|
85
|
+
}, null, 2)
|
|
86
|
+
}],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// ============================================
|
|
91
|
+
// humanize_content
|
|
92
|
+
// ============================================
|
|
93
|
+
server.tool('humanize_content', 'Run an anti-AI detection pass on existing content. Rewrites AI-sounding phrases, fixes banned patterns, removes em-dashes, and preserves all links, data and content depth.', {
|
|
94
|
+
content: z.string().describe('The article content to humanize (Markdown format)'),
|
|
95
|
+
provider: z.enum(['openai', 'claude', 'deepseek', 'grok', 'gemini', 'perplexity', 'kimi']).default('openai'),
|
|
96
|
+
model: z.string().optional(),
|
|
97
|
+
}, async (args) => {
|
|
98
|
+
const ctx = getUserContext();
|
|
99
|
+
if (!ctx.authenticated) {
|
|
100
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'Not authenticated.' }, null, 2) }] };
|
|
101
|
+
}
|
|
102
|
+
const provider = args.provider;
|
|
103
|
+
const keys = {
|
|
104
|
+
openai: getApiKey('openai'),
|
|
105
|
+
claude: getApiKey('claude'),
|
|
106
|
+
deepseek: getApiKey('deepseek'),
|
|
107
|
+
grok: getApiKey('grok'),
|
|
108
|
+
gemini: getApiKey('gemini'),
|
|
109
|
+
perplexity: getApiKey('perplexity'),
|
|
110
|
+
kimi: getApiKey('kimi'),
|
|
111
|
+
};
|
|
112
|
+
if (!keys[provider]) {
|
|
113
|
+
return {
|
|
114
|
+
content: [{
|
|
115
|
+
type: 'text', text: JSON.stringify({
|
|
116
|
+
error: `Missing API key for provider "${provider}". Add it in BPAI Settings → API Keys.`,
|
|
117
|
+
}, null, 2)
|
|
118
|
+
}],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const humanizePrompt = HUMANIZE_PROMPT.replace('{{content}}', args.content);
|
|
122
|
+
const settings = {
|
|
123
|
+
model: args.model || getDefaultModel(provider),
|
|
124
|
+
temperature: 0.5,
|
|
125
|
+
maxTokens: 65536,
|
|
126
|
+
};
|
|
127
|
+
const result = await generateContent({
|
|
128
|
+
provider,
|
|
129
|
+
systemPrompt: 'You are a senior human editor.',
|
|
130
|
+
userPrompt: humanizePrompt,
|
|
131
|
+
settings,
|
|
132
|
+
}, keys);
|
|
133
|
+
if (result.error) {
|
|
134
|
+
return {
|
|
135
|
+
content: [{ type: 'text', text: JSON.stringify({ error: result.error }, null, 2) }],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const originalWordCount = args.content.split(/\s+/).length;
|
|
139
|
+
const humanizedWordCount = result.text.split(/\s+/).length;
|
|
140
|
+
return {
|
|
141
|
+
content: [{
|
|
142
|
+
type: 'text', text: JSON.stringify({
|
|
143
|
+
status: 'success',
|
|
144
|
+
original_word_count: originalWordCount,
|
|
145
|
+
humanized_word_count: humanizedWordCount,
|
|
146
|
+
content: result.text,
|
|
147
|
+
}, null, 2)
|
|
148
|
+
}],
|
|
149
|
+
};
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function getDefaultModel(provider) {
|
|
153
|
+
const defaults = {
|
|
154
|
+
openai: 'gpt-5.2',
|
|
155
|
+
claude: 'claude-opus-4.5',
|
|
156
|
+
deepseek: 'deepseek-chat',
|
|
157
|
+
grok: 'grok-4.1-fast',
|
|
158
|
+
gemini: 'gemini-3-pro',
|
|
159
|
+
perplexity: 'sonar-pro',
|
|
160
|
+
kimi: 'kimi-k2.5',
|
|
161
|
+
};
|
|
162
|
+
return defaults[provider] || 'gpt-5.2';
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=seo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/tools/seo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BPAI MCP Server — WordPress Publishing Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tool handlers for:
|
|
5
|
+
* - test_wp_connection: Test WordPress credentials and fetch site info
|
|
6
|
+
* - publish_to_wordpress: Publish a single article via REST API
|
|
7
|
+
* - publish_batch: Publish multiple articles with rate limiting
|
|
8
|
+
* - list_wp_categories: List WordPress categories
|
|
9
|
+
*
|
|
10
|
+
* WordPress credentials are loaded from the authenticated user's project settings.
|
|
11
|
+
* Users can override credentials inline if publishing to a different site.
|
|
12
|
+
*/
|
|
13
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
+
export declare function registerWordPressTools(server: McpServer): void;
|
|
15
|
+
//# sourceMappingURL=wordpress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wordpress.d.ts","sourceRoot":"","sources":["../../src/tools/wordpress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,QAsavD"}
|