owner-clone-ai-mcp 1.13.2 → 1.14.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 (2) hide show
  1. package/index.js +98 -9
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1019,7 +1019,7 @@ room_id フィールドはChatworkのルームIDです(設定名と合わせ
1019
1019
  },
1020
1020
  {
1021
1021
  name: 'update_knowledge_folder',
1022
- description: 'ナレッジフォルダの名前またはカラーを変更します。【書き込み権限付きキーが必要】',
1022
+ description: 'ナレッジフォルダの名前・カラー・説明を変更します。【書き込み権限付きキーが必要】',
1023
1023
  annotations: { destructiveHint: false, idempotentHint: true },
1024
1024
  inputSchema: {
1025
1025
  type: 'object',
@@ -1027,6 +1027,7 @@ room_id フィールドはChatworkのルームIDです(設定名と合わせ
1027
1027
  id: { type: 'string', description: '更新するフォルダのID' },
1028
1028
  name: { type: 'string', description: '新しいフォルダ名(省略時は変更なし)' },
1029
1029
  color: { type: 'string', description: '新しいカラー(省略時は変更なし)' },
1030
+ description: { type: 'string', description: 'フォルダの説明(省略時は変更なし)' },
1030
1031
  },
1031
1032
  required: ['id'],
1032
1033
  },
@@ -1109,7 +1110,7 @@ room_id フィールドはChatworkのルームIDです(設定名と合わせ
1109
1110
  },
1110
1111
  {
1111
1112
  name: 'update_knowledge',
1112
- description: '既存のナレッジを更新します。【書き込み権限付きキーが必要】本文を変更した場合は自動的に再ベクトル化されます。',
1113
+ description: '既存のナレッジを更新します。【書き込み権限付きキーが必要】本文を変更した場合は自動的に再ベクトル化されます。folder_id でフォルダ移動も可能(null で未分類に移動)。',
1113
1114
  annotations: { destructiveHint: false, idempotentHint: true },
1114
1115
  inputSchema: {
1115
1116
  type: 'object',
@@ -1118,6 +1119,7 @@ room_id フィールドはChatworkのルームIDです(設定名と合わせ
1118
1119
  title: { type: 'string', description: '新しいタイトル(省略時は変更なし)' },
1119
1120
  text_content: { type: 'string', description: '新しい本文(省略時は変更なし)' },
1120
1121
  category: { type: 'string', description: '新しいカテゴリ(省略時は変更なし)' },
1122
+ folder_id: { type: 'string', description: '移動先フォルダID(null または省略で変更なし、空文字列で未分類へ移動)' },
1121
1123
  },
1122
1124
  required: ['id'],
1123
1125
  },
@@ -1134,6 +1136,69 @@ room_id フィールドはChatworkのルームIDです(設定名と合わせ
1134
1136
  required: ['id'],
1135
1137
  },
1136
1138
  },
1139
+ {
1140
+ name: 'generate_folder_description',
1141
+ description: `指定フォルダのナレッジ内容をAIが分析し、フォルダ説明を自動生成します。【書き込み権限付きキーが必要・AIコスト発生】
1142
+
1143
+ ⚠️ 【必須】このツールを呼ぶ前に、必ずユーザーへ実行方法を確認してください ⚠️
1144
+ フォルダ説明の生成には2つの方法があります。ユーザーが明示的に選択するまでこのツールを呼んではいけません。
1145
+
1146
+ 【方法A】Owner Clone AI で生成(このツール)
1147
+ - Owner Clone AI サーバーのAIがフォルダ内ナレッジを読み込んで説明を生成
1148
+ - save=true を指定すると生成後に自動でフォルダに保存
1149
+
1150
+ 【方法B】Claude Code が直接実行
1151
+ - list_knowledge_items(folder_id=xxx) でフォルダ内容を取得
1152
+ - Claude Code 自身が内容を分析して説明を生成
1153
+ - update_knowledge_folder(id=xxx, description="生成した説明") で保存
1154
+
1155
+ ユーザーに「方法A(Owner Clone AIで生成)」「方法B(Claude Codeが直接実行)」のどちらにするか確認し、
1156
+ 「方法A」を選んだ場合のみこのツールを呼んでください。`,
1157
+ annotations: { destructiveHint: false, idempotentHint: false },
1158
+ inputSchema: {
1159
+ type: 'object',
1160
+ properties: {
1161
+ folder_id: { type: 'string', description: '説明を生成するフォルダのID' },
1162
+ provider: { type: 'string', description: 'AIプロバイダー(claude / openai / gemini / openrouter / groq。デフォルト: openai)', enum: ['claude', 'openai', 'gemini', 'openrouter', 'groq'] },
1163
+ model: { type: 'string', description: '使用モデル(省略時はプロバイダーのデフォルトモデル)' },
1164
+ save: { type: 'boolean', description: '生成後にフォルダへ自動保存するか(デフォルト: false)' },
1165
+ },
1166
+ required: ['folder_id'],
1167
+ },
1168
+ },
1169
+ {
1170
+ name: 'ai_reorganize_folders',
1171
+ description: `全フォルダとナレッジをAIが分析し、より適切なフォルダへの移動提案を生成します。【書き込み権限付きキーが必要・AIコスト発生】
1172
+ フォルダに説明(description)が設定されていると提案精度が向上します。
1173
+
1174
+ ⚠️ 【必須】このツールを呼ぶ前に、必ずユーザーへ実行方法を確認してください ⚠️
1175
+ フォルダ整理には2つの方法があります。ユーザーが明示的に選択するまでこのツールを呼んではいけません。
1176
+
1177
+ 【方法A】Owner Clone AI で実行(このツール)
1178
+ - Owner Clone AI サーバーのAIが全フォルダ・ナレッジを分析して移動提案を返す
1179
+ - 提案一覧を受け取り、承認した提案を update_knowledge(id, folder_id=to_folder_id) で実行
1180
+
1181
+ 【方法B】Claude Code が直接実行
1182
+ - list_knowledge_folders() でフォルダ一覧を取得
1183
+ - list_knowledge_items() でナレッジ一覧を取得
1184
+ - Claude Code 自身が内容を分析して移動先を提案
1185
+ - ユーザー承認後、update_knowledge(id=xxx, folder_id=xxx) で移動を実行
1186
+
1187
+ ユーザーに「方法A(Owner Clone AIで実行)」「方法B(Claude Codeが直接実行)」のどちらにするか確認し、
1188
+ 「方法A」を選んだ場合のみこのツールを呼んでください。
1189
+
1190
+ ■ 提案の実行方法:
1191
+ 返ってきた proposals の各アイテムについて、ユーザーが承認したものを
1192
+ update_knowledge(id=item_id, folder_id=to_folder_id) で実行してください。`,
1193
+ annotations: { destructiveHint: false, idempotentHint: false },
1194
+ inputSchema: {
1195
+ type: 'object',
1196
+ properties: {
1197
+ provider: { type: 'string', description: 'AIプロバイダー(claude / openai / gemini / openrouter / groq。デフォルト: openai)', enum: ['claude', 'openai', 'gemini', 'openrouter', 'groq'] },
1198
+ model: { type: 'string', description: '使用モデル(省略時はプロバイダーのデフォルトモデル)' },
1199
+ },
1200
+ },
1201
+ },
1137
1202
  ];
1138
1203
 
1139
1204
  // ── ツール実行 ─────────────────────────────────────────────────
@@ -1175,7 +1240,7 @@ async function executeTool(name, args) {
1175
1240
  case 'list_knowledge_folders': {
1176
1241
  const data = await callApi('/knowledge-folders');
1177
1242
  if (!data.folders || data.folders.length === 0) return 'フォルダが作成されていません。';
1178
- const lines = data.folders.map(f => `- [${f.id}] ${f.name}`);
1243
+ const lines = data.folders.map(f => `- [${f.id}] ${f.name}${f.description ? `\n 説明: ${f.description}` : ''}`);
1179
1244
  return `フォルダ一覧(${data.folders.length}件):\n\n${lines.join('\n')}`;
1180
1245
  }
1181
1246
 
@@ -1343,9 +1408,9 @@ async function executeTool(name, args) {
1343
1408
  case 'update_knowledge_folder': {
1344
1409
  const data = await callApi(`/knowledge-folders/${args.id}`, {
1345
1410
  method: 'PUT',
1346
- body: JSON.stringify({ name: args.name, color: args.color }),
1411
+ body: JSON.stringify({ name: args.name, color: args.color, ...(args.description !== undefined ? { description: args.description } : {}) }),
1347
1412
  });
1348
- return `✅ ${data.message}\nID: ${data.id}\nフォルダ名: ${data.name}`;
1413
+ return `✅ ${data.message}\nID: ${data.id}\nフォルダ名: ${data.name}${data.description ? `\n説明: ${data.description}` : ''}`;
1349
1414
  }
1350
1415
 
1351
1416
  case 'reorder_knowledge_folders': {
@@ -1396,14 +1461,15 @@ async function executeTool(name, args) {
1396
1461
 
1397
1462
  case 'update_knowledge': {
1398
1463
  const body = {};
1399
- if (args.title) body.title = args.title;
1400
- if (args.text_content) body.text_content = args.text_content;
1401
- if (args.category) body.category = args.category;
1464
+ if (args.title) body.title = args.title;
1465
+ if (args.text_content) body.text_content = args.text_content;
1466
+ if (args.category) body.category = args.category;
1467
+ if (args.folder_id !== undefined) body.folder_id = args.folder_id || null;
1402
1468
  const data = await callApi(`/knowledge/${args.id}`, {
1403
1469
  method: 'PATCH',
1404
1470
  body: JSON.stringify(body),
1405
1471
  });
1406
- return `✅ ${data.message}\nID: ${data.id}\nタイトル: ${data.title}\n更新日時: ${data.updated_at}`;
1472
+ return `✅ ${data.message}\nID: ${data.id}\nタイトル: ${data.title}\n更新日時: ${data.updated_at}${data.folder_id ? `\nフォルダID: ${data.folder_id}` : '\nフォルダ: 未分類'}`;
1407
1473
  }
1408
1474
 
1409
1475
  case 'delete_knowledge': {
@@ -1411,6 +1477,29 @@ async function executeTool(name, args) {
1411
1477
  return `✅ ${data.message}\n削除したナレッジ: ${data.deleted.title} (ID: ${data.deleted.id})`;
1412
1478
  }
1413
1479
 
1480
+ case 'generate_folder_description': {
1481
+ const data = await callApi(`/knowledge-folders/${args.folder_id}/generate-description`, {
1482
+ method: 'POST',
1483
+ body: JSON.stringify({ provider: args.provider, model: args.model, save: args.save }),
1484
+ });
1485
+ const saveNote = data.saved ? '(フォルダに保存済み)' : '(未保存 — update_knowledge_folder で保存可能)';
1486
+ return `✅ ${data.message}\nフォルダ名: ${data.folder_name}\n\n生成された説明 ${saveNote}:\n${data.description}`;
1487
+ }
1488
+
1489
+ case 'ai_reorganize_folders': {
1490
+ const data = await callApi('/knowledge-folders/ai-reorganize', {
1491
+ method: 'POST',
1492
+ body: JSON.stringify({ provider: args.provider, model: args.model }),
1493
+ });
1494
+ if (!data.proposals || data.proposals.length === 0) {
1495
+ return `✅ 分析完了。現在の配置は適切です。移動の提案はありません。`;
1496
+ }
1497
+ const lines = data.proposals.map((p, i) =>
1498
+ `[${i + 1}] ${p.item_title}\n ID: ${p.item_id}\n ${p.from_folder_name} → ${p.to_folder_name}(移動先ID: ${p.to_folder_id})\n 理由: ${p.reason}`
1499
+ );
1500
+ return `✅ ${data.message}\n\n【移動提案一覧】\n${lines.join('\n\n')}\n\n--- 承認した提案を実行するには ---\nupdate_knowledge(id=<item_id>, folder_id=<to_folder_id>) を各提案について呼んでください。`;
1501
+ }
1502
+
1414
1503
  case 'list_schedules': {
1415
1504
  const params = new URLSearchParams();
1416
1505
  if (args.from) params.set('from', args.from);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "owner-clone-ai-mcp",
3
- "version": "1.13.2",
3
+ "version": "1.14.0",
4
4
  "description": "MCP server for Owner Clone AI — exposes knowledge and agent presets to Claude Code",
5
5
  "main": "index.js",
6
6
  "bin": {