owner-clone-ai-mcp 1.67.0 → 1.69.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/domains/chatbots.js +12 -4
- package/domains/slides.js +139 -0
- package/index.js +2 -1
- package/package.json +1 -1
package/domains/chatbots.js
CHANGED
|
@@ -60,11 +60,14 @@ widget_token は自動生成され、埋め込みコードに使用されます
|
|
|
60
60
|
diagnostic_goal_url: { type: 'string', description: '診断結果後のCTAボタンリンク先URL' },
|
|
61
61
|
diagnostic_goal_button_text: { type: 'string', description: '診断結果後のボタン表示テキスト' },
|
|
62
62
|
escalation_enabled: { type: 'boolean', description: 'true=有人対応切り替え機能を有効化。デフォルト: false' },
|
|
63
|
-
escalation_trigger: { type: 'string', enum: ['user_request', 'keyword'], description: '
|
|
63
|
+
escalation_trigger: { type: 'string', enum: ['user_request', 'keyword', 'ai_judgment', 'both'], description: 'エスカレーション発動条件。user_request=「担当者に繋ぐ」ボタン表示, keyword=指定キーワード検知, ai_judgment=AIが回答不能と判断したとき, both=ボタン+AI判断の両方' },
|
|
64
64
|
escalation_email: { type: 'string', description: 'エスカレーション通知先メールアドレス(省略可)' },
|
|
65
65
|
escalation_chatwork_room_id: { type: 'string', description: 'エスカレーション通知先ChatWorkルームID(省略可)' },
|
|
66
|
-
escalation_message: { type: 'string', description: '
|
|
66
|
+
escalation_message: { type: 'string', description: 'エスカレーション時にユーザーへ表示するメッセージ。連絡先フォーム表示時は「フォーム送信後に表示するテキスト」として使われる' },
|
|
67
67
|
escalation_keywords: { type: 'string', description: 'keyword triggerの場合のキーワードリスト。改行区切り' },
|
|
68
|
+
escalation_collect_contact: { type: 'string', enum: ['off', 'optional', 'required'], description: 'エスカレーション時の訪問者連絡先フォーム。off=表示しない(既定・従来どおり)/ optional=フォーム表示(未入力でも送信可)/ required=メールアドレスか電話番号のいずれか入力必須。★設定意図: 埋め込みチャットの訪問者は匿名のため、連絡先を収集しないと会話内に連絡先がない限りオーナーから返信できない。入力内容は通知(メール/Chatwork)にのみ記載されDB保存されない' },
|
|
69
|
+
escalation_form_intro: { type: 'string', description: '連絡先フォーム上部に表示するテキスト。空=既定文言「担当者にお繋ぎします。ご連絡先を教えてください。」' },
|
|
70
|
+
escalation_form_fields: { type: 'array', items: { type: 'string', enum: ['name', 'email', 'phone', 'note'] }, description: '連絡先フォームに表示する項目。name=お名前, email=メールアドレス, phone=電話番号, note=お問い合わせ内容(複数行)。既定=全4項目。required の必須チェックは email/phone のどちらかを含む場合のみ働く' },
|
|
68
71
|
branch_yes_label: { type: 'string', description: 'branchモードのYesボタン表示テキスト(デフォルト: "はい")' },
|
|
69
72
|
branch_no_label: { type: 'string', description: 'branchモードのNoボタン表示テキスト(デフォルト: "いいえ")' },
|
|
70
73
|
},
|
|
@@ -103,11 +106,14 @@ widget_token は自動生成され、埋め込みコードに使用されます
|
|
|
103
106
|
diagnostic_goal_url: { type: 'string', description: '診断後CTAリンク先(省略時は変更なし)' },
|
|
104
107
|
diagnostic_goal_button_text: { type: 'string', description: '診断後ボタンテキスト(省略時は変更なし)' },
|
|
105
108
|
escalation_enabled: { type: 'boolean', description: 'エスカレーション有効/無効(省略時は変更なし)' },
|
|
106
|
-
escalation_trigger: { type: 'string', enum: ['user_request', 'keyword'], description: '
|
|
109
|
+
escalation_trigger: { type: 'string', enum: ['user_request', 'keyword', 'ai_judgment', 'both'], description: 'エスカレーション発動条件変更(省略時は変更なし)。user_request=ボタン, keyword=キーワード検知, ai_judgment=AI判断, both=ボタン+AI判断' },
|
|
107
110
|
escalation_email: { type: 'string', description: 'エスカレーション通知メール(省略時は変更なし)' },
|
|
108
111
|
escalation_chatwork_room_id: { type: 'string', description: 'エスカレーション通知ChatWorkルームID(省略時は変更なし)' },
|
|
109
|
-
escalation_message: { type: 'string', description: '
|
|
112
|
+
escalation_message: { type: 'string', description: 'エスカレーション時のメッセージ(省略時は変更なし)。連絡先フォーム表示時は「フォーム送信後に表示するテキスト」として使われる' },
|
|
110
113
|
escalation_keywords: { type: 'string', description: 'エスカレーションキーワード改行区切り(省略時は変更なし)' },
|
|
114
|
+
escalation_collect_contact: { type: 'string', enum: ['off', 'optional', 'required'], description: '訪問者連絡先フォーム(省略時は変更なし)。off=表示しない / optional=表示・未入力でも送信可 / required=メールか電話のいずれか必須。訪問者は匿名のため収集しないと返信手段がない。入力は通知にのみ記載されDB保存されない' },
|
|
115
|
+
escalation_form_intro: { type: 'string', description: 'フォーム上部テキスト(省略時は変更なし・空文字=既定文言に戻す)' },
|
|
116
|
+
escalation_form_fields: { type: 'array', items: { type: 'string', enum: ['name', 'email', 'phone', 'note'] }, description: 'フォーム表示項目(省略時は変更なし)。既定=全4項目。required の必須チェックは email/phone を含む場合のみ働く' },
|
|
111
117
|
branch_yes_label: { type: 'string', description: 'branchモードYesボタンテキスト(省略時は変更なし)' },
|
|
112
118
|
branch_no_label: { type: 'string', description: 'branchモードNoボタンテキスト(省略時は変更なし)' },
|
|
113
119
|
},
|
|
@@ -379,6 +385,7 @@ const handlers = {
|
|
|
379
385
|
'diagnostic_goal_cta','diagnostic_goal_url','diagnostic_goal_button_text',
|
|
380
386
|
'escalation_enabled','escalation_trigger','escalation_email',
|
|
381
387
|
'escalation_chatwork_room_id','escalation_message','escalation_keywords',
|
|
388
|
+
'escalation_collect_contact','escalation_form_intro','escalation_form_fields',
|
|
382
389
|
'branch_yes_label','branch_no_label',
|
|
383
390
|
];
|
|
384
391
|
cbAllFields.forEach(f => { if (args[f] !== undefined) cbCreate[f] = args[f]; });
|
|
@@ -404,6 +411,7 @@ const handlers = {
|
|
|
404
411
|
'diagnostic_goal_cta','diagnostic_goal_url','diagnostic_goal_button_text',
|
|
405
412
|
'escalation_enabled','escalation_trigger','escalation_email',
|
|
406
413
|
'escalation_chatwork_room_id','escalation_message','escalation_keywords',
|
|
414
|
+
'escalation_collect_contact','escalation_form_intro','escalation_form_fields',
|
|
407
415
|
'branch_yes_label','branch_no_label',
|
|
408
416
|
];
|
|
409
417
|
cbFields.forEach(f => { if (args[f] !== undefined) body[f] = args[f]; });
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// スライド作成ドメイン(docs/SLIDE_PLAN.md Phase 1・v1.69.0〜)
|
|
2
|
+
// ナレッジ/テキストからAIがスライドデッキを自動設計し、UIで編集・PDF/PPTX/画像書き出しできる機能。
|
|
3
|
+
// ※ プランopt-inの機能(未解放プランでは403)。
|
|
4
|
+
const { callApi } = require('../lib/api');
|
|
5
|
+
|
|
6
|
+
const tools = [
|
|
7
|
+
{
|
|
8
|
+
name: 'get_slide_schema',
|
|
9
|
+
description: 'スライド作成のスキーマ情報(テンプレ種別20種・デザインテーマ13種・用途4種の一覧と説明)を取得します。create_slide_deck / update_slide_deck で deck JSON を組む前に一度確認してください。',
|
|
10
|
+
annotations: { readOnlyHint: true },
|
|
11
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: 'list_slide_decks',
|
|
15
|
+
description: 'スライドデッキの一覧(ID・タイトル・枚数・テーマ・用途)を取得します。',
|
|
16
|
+
annotations: { readOnlyHint: true },
|
|
17
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'get_slide_deck',
|
|
21
|
+
description: 'スライドデッキの内容(全スライドのJSON)を取得します。deck.chapters が各スライド(kind=テンプレ種別)。',
|
|
22
|
+
annotations: { readOnlyHint: true },
|
|
23
|
+
inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'デッキID(list_slide_decksで確認)' } }, required: ['id'] },
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'generate_slide_deck',
|
|
27
|
+
description: `ナレッジやテキストからAIがスライドデッキを自動設計して新規作成します(スライド作成機能の中核)。
|
|
28
|
+
生成後ユーザーは編集画面(/slides/デッキID)で微調整し、PDF/PPTX/画像に書き出せます。
|
|
29
|
+
◆ 用途: document=配布資料(資料だけで意味が通る密度) / lecture=講座 / vsl=セールス構成 / ad=広告(誇大表現を避ける)
|
|
30
|
+
◆ テーマ: light-clean(明るく清潔・既定) / dark-navy(信頼・テック) / warm-cream / mono-minimal / corporate / vivid-pop / elegant-gold(高級) / light-colorful / passion-red(VSL) / plain-doc(実務資料風) / paper-note / aurora-glass / gradient-pop`,
|
|
31
|
+
annotations: { destructiveHint: false },
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
knowledge_item_ids: { type: 'array', items: { type: 'string' }, description: '生成元ナレッジID(複数可)' },
|
|
36
|
+
knowledge_folder_ids: { type: 'array', items: { type: 'string' }, description: '生成元ナレッジフォルダID(サブフォルダ含む・複数可)' },
|
|
37
|
+
text: { type: 'string', description: '生成元テキスト(ナレッジ指定と併用可)' },
|
|
38
|
+
purpose: { type: 'string', enum: ['document', 'lecture', 'vsl', 'ad'], description: '用途(省略時 document)' },
|
|
39
|
+
theme: { type: 'string', description: 'デザインテーマID(省略時 light-clean)' },
|
|
40
|
+
instructions: { type: 'string', description: '追加指示(例: 経営者向けのトーンで・料金比較の表を入れて)' },
|
|
41
|
+
slide_count_hint: { type: 'number', description: '目安のスライド枚数' },
|
|
42
|
+
title: { type: 'string', description: 'タイトル(省略時は表紙から自動)' },
|
|
43
|
+
},
|
|
44
|
+
required: [],
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: 'create_slide_deck',
|
|
49
|
+
description: 'deck JSON を渡してスライドデッキを直接作成します(AI生成でなく自分で構成する場合)。形式: {"chapters":[{"kind":"cover","title":"..."}...]}。kind の一覧とフィールドは get_slide_schema で確認。フィールドは省略するとそのパーツが非表示になります。',
|
|
50
|
+
annotations: { destructiveHint: false },
|
|
51
|
+
inputSchema: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
properties: {
|
|
54
|
+
title: { type: 'string' },
|
|
55
|
+
purpose: { type: 'string', enum: ['document', 'lecture', 'vsl', 'ad'] },
|
|
56
|
+
theme: { type: 'string', description: 'テーマID' },
|
|
57
|
+
deck: { type: 'object', description: '{"chapters":[...]}' },
|
|
58
|
+
},
|
|
59
|
+
required: ['deck'],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: 'ai_edit_slide_deck',
|
|
64
|
+
description: '既存のスライドデッキを自然言語の指示でAIが修正します(例:「3枚目をもっと具体的に」「料金比較の表スライドを追加」)。slide_index 指定でその1枚だけを対象にできます(速い・確実)。部分的な修正はこのツールを優先。',
|
|
65
|
+
annotations: { destructiveHint: false },
|
|
66
|
+
inputSchema: {
|
|
67
|
+
type: 'object',
|
|
68
|
+
properties: {
|
|
69
|
+
id: { type: 'string', description: 'デッキID' },
|
|
70
|
+
instruction: { type: 'string', description: '修正指示' },
|
|
71
|
+
slide_index: { type: 'number', description: '対象スライド(0始まり・省略時は全体)' },
|
|
72
|
+
},
|
|
73
|
+
required: ['id', 'instruction'],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'update_slide_deck',
|
|
78
|
+
description: 'スライドデッキを直接更新します(タイトル/用途/テーマ/deck全置換)。deck を渡すと全置換なので、部分修正は ai_edit_slide_deck の方が安全。',
|
|
79
|
+
annotations: { destructiveHint: false },
|
|
80
|
+
inputSchema: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: {
|
|
83
|
+
id: { type: 'string', description: 'デッキID' },
|
|
84
|
+
title: { type: 'string' },
|
|
85
|
+
purpose: { type: 'string', enum: ['document', 'lecture', 'vsl', 'ad'] },
|
|
86
|
+
theme: { type: 'string' },
|
|
87
|
+
deck: { type: 'object', description: '{"chapters":[...]}(省略時は変更なし)' },
|
|
88
|
+
},
|
|
89
|
+
required: ['id'],
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'delete_slide_deck',
|
|
94
|
+
description: 'スライドデッキを完全に削除します(元に戻せません)。ユーザーの明示的な依頼があるときのみ使用。',
|
|
95
|
+
annotations: { destructiveHint: true },
|
|
96
|
+
inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'デッキID' } }, required: ['id'] },
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
const handlers = {
|
|
101
|
+
get_slide_schema: async () => {
|
|
102
|
+
const d = await callApi('/slides/schema');
|
|
103
|
+
const kinds = Object.entries(d.kinds || {}).map(([k, v]) => `- ${k}(${v.label}): ${v.spec}`).join('\n');
|
|
104
|
+
const themes = Object.entries(d.themes || {}).map(([k, v]) => `- ${k}: ${v}`).join('\n');
|
|
105
|
+
const purposes = Object.entries(d.purposes || {}).map(([k, v]) => `- ${k}: ${v}`).join('\n');
|
|
106
|
+
return `## テンプレート(kind)\n${kinds}\n\n## テーマ\n${themes}\n\n## 用途\n${purposes}`;
|
|
107
|
+
},
|
|
108
|
+
list_slide_decks: async () => {
|
|
109
|
+
const rows = await callApi('/slides');
|
|
110
|
+
if (!rows.length) return 'スライドデッキはまだありません。generate_slide_deck で作成できます。';
|
|
111
|
+
return rows.map(r => `- ${r.title || '無題'}(${r.slide_count}枚 / ${r.theme} / ${r.purpose})\n ID: ${r.id} / 更新: ${r.updated_at}`).join('\n');
|
|
112
|
+
},
|
|
113
|
+
get_slide_deck: async ({ id }) => {
|
|
114
|
+
const r = await callApi(`/slides/${id}`);
|
|
115
|
+
return JSON.stringify({ id: r.id, title: r.title, purpose: r.purpose, theme: r.theme, deck: r.deck }, null, 2);
|
|
116
|
+
},
|
|
117
|
+
generate_slide_deck: async (args) => {
|
|
118
|
+
const d = await callApi('/slides/generate', { method: 'POST', body: JSON.stringify(args) });
|
|
119
|
+
return `✅ ${d.message}\nID: ${d.id}\nタイトル: ${d.title}\n枚数: ${d.slide_count}枚\n編集画面: /slides/${d.id}`;
|
|
120
|
+
},
|
|
121
|
+
create_slide_deck: async (args) => {
|
|
122
|
+
const d = await callApi('/slides', { method: 'POST', body: JSON.stringify(args) });
|
|
123
|
+
return `✅ ${d.message}\nID: ${d.id}\nタイトル: ${d.title}`;
|
|
124
|
+
},
|
|
125
|
+
ai_edit_slide_deck: async ({ id, instruction, slide_index }) => {
|
|
126
|
+
const d = await callApi(`/slides/${id}/ai-edit`, { method: 'POST', body: JSON.stringify({ instruction, slide_index }) });
|
|
127
|
+
return `✅ ${d.message}(現在${d.slide_count}枚)`;
|
|
128
|
+
},
|
|
129
|
+
update_slide_deck: async ({ id, ...rest }) => {
|
|
130
|
+
const d = await callApi(`/slides/${id}`, { method: 'PATCH', body: JSON.stringify(rest) });
|
|
131
|
+
return `✅ ${d.message}\nID: ${d.id}`;
|
|
132
|
+
},
|
|
133
|
+
delete_slide_deck: async ({ id }) => {
|
|
134
|
+
const d = await callApi(`/slides/${id}`, { method: 'DELETE' });
|
|
135
|
+
return `✅ ${d.message}`;
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
module.exports = { tools, handlers };
|
package/index.js
CHANGED
|
@@ -20,12 +20,13 @@ const projects = require('./domains/projects');
|
|
|
20
20
|
const brain = require('./domains/brain');
|
|
21
21
|
const funnels = require('./domains/funnels');
|
|
22
22
|
const skills = require('./domains/skills');
|
|
23
|
+
const slides = require('./domains/slides');
|
|
23
24
|
const analytics = require('./domains/analytics');
|
|
24
25
|
const myasp = require('./domains/myasp');
|
|
25
26
|
const wordpress = require('./domains/wordpress');
|
|
26
27
|
const macbuil = require('./domains/macbuil');
|
|
27
28
|
|
|
28
|
-
const allDomains = [knowledge, agentPresets, workflows, chatbots, schedulesAndTasks, projects, brain, funnels, skills, analytics, myasp, wordpress, macbuil];
|
|
29
|
+
const allDomains = [knowledge, agentPresets, workflows, chatbots, schedulesAndTasks, projects, brain, funnels, skills, slides, analytics, myasp, wordpress, macbuil];
|
|
29
30
|
|
|
30
31
|
const TOOLS = allDomains.flatMap(d => d.tools);
|
|
31
32
|
const HANDLERS = Object.assign({}, ...allDomains.map(d => d.handlers));
|