@kolbo/mcp 1.87.12 → 1.87.13
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/package.json +1 -1
- package/src/index.js +264 -257
- package/src/toolAnnotations.js +149 -145
- package/src/tools/_shared.js +1213 -1191
- package/src/tools/models.js +531 -527
package/src/toolAnnotations.js
CHANGED
|
@@ -1,145 +1,149 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Public MCP safety contract.
|
|
5
|
-
*
|
|
6
|
-
* ChatGPT app review requires every exposed tool to declare all three hints.
|
|
7
|
-
* Keep this map exact: the submission gate rejects missing, duplicate, stale,
|
|
8
|
-
* or non-boolean entries whenever the registered tool surface changes.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
const READ_ONLY = [
|
|
12
|
-
'get_creative_director_status', 'get_generation_status', 'list_models',
|
|
13
|
-
'check_credits', 'show_plans', 'get_session_usage', 'list_voices',
|
|
14
|
-
'chat_list_conversations', 'chat_get_messages',
|
|
15
|
-
'list_visual_dnas', 'get_visual_dna', 'list_visual_dna_folders',
|
|
16
|
-
'list_moodboards', 'get_moodboard',
|
|
17
|
-
'list_color_palettes', 'analyze_color_palette',
|
|
18
|
-
'list_media', 'list_media_folders', 'get_media', 'get_media_stats',
|
|
19
|
-
'list_presets', 'list_cinematic_presets',
|
|
20
|
-
'list_projects', 'get_project', 'list_sessions', 'list_project_context', 'get_project_profile',
|
|
21
|
-
'list_project_assets',
|
|
22
|
-
'list_session_generations',
|
|
23
|
-
'list_agents', 'list_docs', 'get_doc',
|
|
24
|
-
'get_review_storage_usage', 'list_review_assets', 'get_review_asset',
|
|
25
|
-
'list_review_collections', 'list_review_comments', 'list_review_share_links',
|
|
26
|
-
'search_music_library', 'analyze_script_for_music', 'browse_music_library',
|
|
27
|
-
'get_music_library_facets', 'get_music_track_audio',
|
|
28
|
-
'get_music_track_related', 'get_music_track_lyrics',
|
|
29
|
-
'search_stock_media', 'get_stock_sources', 'get_stock_categories',
|
|
30
|
-
'get_stock_collections', 'get_stock_asset', 'analyze_script_for_stock',
|
|
31
|
-
];
|
|
32
|
-
|
|
33
|
-
const OPEN_WORLD_READ_ONLY = [
|
|
34
|
-
'blender_list_sessions', 'blender_get_scene', 'blender_search_docs',
|
|
35
|
-
'blender_get_command_status',
|
|
36
|
-
];
|
|
37
|
-
|
|
38
|
-
const PRIVATE_WRITE = [
|
|
39
|
-
'media_upload_widget', 'create_upload_ticket', 'upload_media',
|
|
40
|
-
'favorite_media', 'unfavorite_media',
|
|
41
|
-
'create_media_folder', 'update_media_folder',
|
|
42
|
-
'add_media_to_folder', 'remove_media_from_folder',
|
|
43
|
-
'share_media_folder',
|
|
44
|
-
'restore_media', 'move_media', 'bulk_restore_media', 'bulk_move_media',
|
|
45
|
-
'move_folder_contents',
|
|
46
|
-
'import_elevenlabs_voice',
|
|
47
|
-
'create_visual_dna', 'create_visual_dna_folder', 'update_visual_dna_folder',
|
|
48
|
-
'move_visual_dna_to_folder',
|
|
49
|
-
'create_moodboard',
|
|
50
|
-
'create_color_palette', 'activate_color_palette', 'deactivate_color_palette',
|
|
51
|
-
'move_session', 'bulk_move_sessions', 'move_generations_to_session',
|
|
52
|
-
'split_session', 'undo_session_organization',
|
|
53
|
-
'rename_session', 'restore_session',
|
|
54
|
-
'create_project', 'duplicate_project', 'update_project',
|
|
55
|
-
'archive_project', 'unarchive_project', 'add_project_context',
|
|
56
|
-
'link_project_asset', 'unlink_project_asset',
|
|
57
|
-
'create_agent',
|
|
58
|
-
'create_doc',
|
|
59
|
-
'create_review_asset', 'update_review_asset', 'add_review_version',
|
|
60
|
-
'set_review_status', 'create_review_collection', 'update_review_collection',
|
|
61
|
-
'create_review_comment', 'reply_review_comment',
|
|
62
|
-
'resolve_review_comment', 'unresolve_review_comment',
|
|
63
|
-
'import_stock_asset',
|
|
64
|
-
];
|
|
65
|
-
|
|
66
|
-
const DESTRUCTIVE_WRITE = [
|
|
67
|
-
// These actions spend credits, enqueue irreversible work, or cancel it.
|
|
68
|
-
'generate_image', 'generate_image_edit', 'generate_creative_director',
|
|
69
|
-
'generate_video', 'generate_video_from_image', 'generate_music',
|
|
70
|
-
'generate_speech', 'generate_sound', 'cancel_generation',
|
|
71
|
-
'generate_elements', 'generate_first_last_frame', 'generate_lipsync',
|
|
72
|
-
'generate_video_from_video', 'transcribe_audio', 'generate_3d',
|
|
73
|
-
'edit_image', 'edit_video', 'trim_video', 'clone_voice',
|
|
74
|
-
'chat_send_message', 'generate_character_sheet',
|
|
75
|
-
'acquire_clean_music_track', 'import_music_track_to_library',
|
|
76
|
-
'separate_audio_stems', 'clean_dialogue_leftovers', 'separate_ambience',
|
|
77
|
-
'analyze_video',
|
|
78
|
-
|
|
79
|
-
// Deletes and whole-value replacement updates are conservatively destructive.
|
|
80
|
-
'delete_voice', 'update_visual_dna', 'delete_visual_dna', 'delete_visual_dna_folder',
|
|
81
|
-
'update_moodboard', 'delete_moodboard',
|
|
82
|
-
'update_color_palette', 'delete_color_palette',
|
|
83
|
-
'delete_media_folder', 'delete_media', 'permanently_delete_media',
|
|
84
|
-
'bulk_delete_media', 'bulk_permanently_delete_media',
|
|
85
|
-
'unshare_media_folder',
|
|
86
|
-
'delete_session',
|
|
87
|
-
'delete_project_context', 'regenerate_project_profile',
|
|
88
|
-
'update_project_asset',
|
|
89
|
-
'update_agent', 'delete_agent', 'update_doc', 'delete_doc',
|
|
90
|
-
'delete_review_asset', 'delete_review_collection',
|
|
91
|
-
'edit_review_comment', 'delete_review_comment',
|
|
92
|
-
];
|
|
93
|
-
|
|
94
|
-
const OPEN_WORLD_WRITE = [
|
|
95
|
-
'publish_html_artifact', 'create_review_share_link', 'blender_capture_viewport',
|
|
96
|
-
];
|
|
97
|
-
|
|
98
|
-
const OPEN_WORLD_DESTRUCTIVE = [
|
|
99
|
-
'share_doc', 'revoke_review_share_link',
|
|
100
|
-
'blender_apply_operations', 'blender_import_media', 'blender_render',
|
|
101
|
-
'blender_undo', 'blender_file_operation', 'blender_execute_python',
|
|
102
|
-
];
|
|
103
|
-
|
|
104
|
-
const CONTRACT_GROUPS = [
|
|
105
|
-
[READ_ONLY, { readOnlyHint: true, openWorldHint: false, destructiveHint: false }],
|
|
106
|
-
[OPEN_WORLD_READ_ONLY, { readOnlyHint: true, openWorldHint: true, destructiveHint: false }],
|
|
107
|
-
[PRIVATE_WRITE, { readOnlyHint: false, openWorldHint: false, destructiveHint: false }],
|
|
108
|
-
[DESTRUCTIVE_WRITE, { readOnlyHint: false, openWorldHint: false, destructiveHint: true }],
|
|
109
|
-
[OPEN_WORLD_WRITE, { readOnlyHint: false, openWorldHint: true, destructiveHint: false }],
|
|
110
|
-
[OPEN_WORLD_DESTRUCTIVE, { readOnlyHint: false, openWorldHint: true, destructiveHint: true }],
|
|
111
|
-
];
|
|
112
|
-
|
|
113
|
-
function buildToolAnnotations() {
|
|
114
|
-
const annotations = Object.create(null);
|
|
115
|
-
for (const [names, hints] of CONTRACT_GROUPS) {
|
|
116
|
-
for (const name of names) {
|
|
117
|
-
if (annotations[name]) throw new Error(`Duplicate safety annotation contract for tool: ${name}`);
|
|
118
|
-
annotations[name] = Object.freeze({ ...hints });
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return Object.freeze(annotations);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const TOOL_ANNOTATIONS = buildToolAnnotations();
|
|
125
|
-
|
|
126
|
-
function attachToolAnnotations(server) {
|
|
127
|
-
const registered = server?._registeredTools || {};
|
|
128
|
-
const registeredNames = Object.keys(registered).sort();
|
|
129
|
-
const contractNames = Object.keys(TOOL_ANNOTATIONS).sort();
|
|
130
|
-
const missing = registeredNames.filter((name) => !TOOL_ANNOTATIONS[name]);
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
TOOL_ANNOTATIONS
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Public MCP safety contract.
|
|
5
|
+
*
|
|
6
|
+
* ChatGPT app review requires every exposed tool to declare all three hints.
|
|
7
|
+
* Keep this map exact: the submission gate rejects missing, duplicate, stale,
|
|
8
|
+
* or non-boolean entries whenever the registered tool surface changes.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const READ_ONLY = [
|
|
12
|
+
'get_creative_director_status', 'get_generation_status', 'list_models',
|
|
13
|
+
'check_credits', 'show_plans', 'get_session_usage', 'list_voices',
|
|
14
|
+
'chat_list_conversations', 'chat_get_messages',
|
|
15
|
+
'list_visual_dnas', 'get_visual_dna', 'list_visual_dna_folders',
|
|
16
|
+
'list_moodboards', 'get_moodboard',
|
|
17
|
+
'list_color_palettes', 'analyze_color_palette',
|
|
18
|
+
'list_media', 'list_media_folders', 'get_media', 'get_media_stats',
|
|
19
|
+
'list_presets', 'list_cinematic_presets',
|
|
20
|
+
'list_projects', 'get_project', 'list_sessions', 'list_project_context', 'get_project_profile',
|
|
21
|
+
'list_project_assets',
|
|
22
|
+
'list_session_generations',
|
|
23
|
+
'list_agents', 'list_docs', 'get_doc',
|
|
24
|
+
'get_review_storage_usage', 'list_review_assets', 'get_review_asset',
|
|
25
|
+
'list_review_collections', 'list_review_comments', 'list_review_share_links',
|
|
26
|
+
'search_music_library', 'analyze_script_for_music', 'browse_music_library',
|
|
27
|
+
'get_music_library_facets', 'get_music_track_audio',
|
|
28
|
+
'get_music_track_related', 'get_music_track_lyrics',
|
|
29
|
+
'search_stock_media', 'get_stock_sources', 'get_stock_categories',
|
|
30
|
+
'get_stock_collections', 'get_stock_asset', 'analyze_script_for_stock',
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const OPEN_WORLD_READ_ONLY = [
|
|
34
|
+
'blender_list_sessions', 'blender_get_scene', 'blender_search_docs',
|
|
35
|
+
'blender_get_command_status',
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const PRIVATE_WRITE = [
|
|
39
|
+
'media_upload_widget', 'create_upload_ticket', 'upload_media',
|
|
40
|
+
'favorite_media', 'unfavorite_media',
|
|
41
|
+
'create_media_folder', 'update_media_folder',
|
|
42
|
+
'add_media_to_folder', 'remove_media_from_folder',
|
|
43
|
+
'share_media_folder',
|
|
44
|
+
'restore_media', 'move_media', 'bulk_restore_media', 'bulk_move_media',
|
|
45
|
+
'move_folder_contents',
|
|
46
|
+
'import_elevenlabs_voice',
|
|
47
|
+
'create_visual_dna', 'create_visual_dna_folder', 'update_visual_dna_folder',
|
|
48
|
+
'move_visual_dna_to_folder',
|
|
49
|
+
'create_moodboard',
|
|
50
|
+
'create_color_palette', 'activate_color_palette', 'deactivate_color_palette',
|
|
51
|
+
'move_session', 'bulk_move_sessions', 'move_generations_to_session',
|
|
52
|
+
'split_session', 'undo_session_organization',
|
|
53
|
+
'rename_session', 'restore_session',
|
|
54
|
+
'create_project', 'duplicate_project', 'update_project',
|
|
55
|
+
'archive_project', 'unarchive_project', 'add_project_context',
|
|
56
|
+
'link_project_asset', 'unlink_project_asset',
|
|
57
|
+
'create_agent',
|
|
58
|
+
'create_doc',
|
|
59
|
+
'create_review_asset', 'update_review_asset', 'add_review_version',
|
|
60
|
+
'set_review_status', 'create_review_collection', 'update_review_collection',
|
|
61
|
+
'create_review_comment', 'reply_review_comment',
|
|
62
|
+
'resolve_review_comment', 'unresolve_review_comment',
|
|
63
|
+
'import_stock_asset',
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const DESTRUCTIVE_WRITE = [
|
|
67
|
+
// These actions spend credits, enqueue irreversible work, or cancel it.
|
|
68
|
+
'generate_image', 'generate_image_edit', 'generate_creative_director',
|
|
69
|
+
'generate_video', 'generate_video_from_image', 'generate_music',
|
|
70
|
+
'generate_speech', 'generate_sound', 'cancel_generation',
|
|
71
|
+
'generate_elements', 'generate_first_last_frame', 'generate_lipsync',
|
|
72
|
+
'generate_video_from_video', 'transcribe_audio', 'generate_3d',
|
|
73
|
+
'edit_image', 'edit_video', 'trim_video', 'clone_voice',
|
|
74
|
+
'chat_send_message', 'generate_character_sheet',
|
|
75
|
+
'acquire_clean_music_track', 'import_music_track_to_library',
|
|
76
|
+
'separate_audio_stems', 'clean_dialogue_leftovers', 'separate_ambience',
|
|
77
|
+
'analyze_video',
|
|
78
|
+
|
|
79
|
+
// Deletes and whole-value replacement updates are conservatively destructive.
|
|
80
|
+
'delete_voice', 'update_visual_dna', 'delete_visual_dna', 'delete_visual_dna_folder',
|
|
81
|
+
'update_moodboard', 'delete_moodboard',
|
|
82
|
+
'update_color_palette', 'delete_color_palette',
|
|
83
|
+
'delete_media_folder', 'delete_media', 'permanently_delete_media',
|
|
84
|
+
'bulk_delete_media', 'bulk_permanently_delete_media',
|
|
85
|
+
'unshare_media_folder',
|
|
86
|
+
'delete_session',
|
|
87
|
+
'delete_project_context', 'regenerate_project_profile',
|
|
88
|
+
'update_project_asset',
|
|
89
|
+
'update_agent', 'delete_agent', 'update_doc', 'delete_doc',
|
|
90
|
+
'delete_review_asset', 'delete_review_collection',
|
|
91
|
+
'edit_review_comment', 'delete_review_comment',
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
const OPEN_WORLD_WRITE = [
|
|
95
|
+
'publish_html_artifact', 'create_review_share_link', 'blender_capture_viewport',
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
const OPEN_WORLD_DESTRUCTIVE = [
|
|
99
|
+
'share_doc', 'revoke_review_share_link',
|
|
100
|
+
'blender_apply_operations', 'blender_import_media', 'blender_render',
|
|
101
|
+
'blender_undo', 'blender_file_operation', 'blender_execute_python',
|
|
102
|
+
];
|
|
103
|
+
|
|
104
|
+
const CONTRACT_GROUPS = [
|
|
105
|
+
[READ_ONLY, { readOnlyHint: true, openWorldHint: false, destructiveHint: false }],
|
|
106
|
+
[OPEN_WORLD_READ_ONLY, { readOnlyHint: true, openWorldHint: true, destructiveHint: false }],
|
|
107
|
+
[PRIVATE_WRITE, { readOnlyHint: false, openWorldHint: false, destructiveHint: false }],
|
|
108
|
+
[DESTRUCTIVE_WRITE, { readOnlyHint: false, openWorldHint: false, destructiveHint: true }],
|
|
109
|
+
[OPEN_WORLD_WRITE, { readOnlyHint: false, openWorldHint: true, destructiveHint: false }],
|
|
110
|
+
[OPEN_WORLD_DESTRUCTIVE, { readOnlyHint: false, openWorldHint: true, destructiveHint: true }],
|
|
111
|
+
];
|
|
112
|
+
|
|
113
|
+
function buildToolAnnotations() {
|
|
114
|
+
const annotations = Object.create(null);
|
|
115
|
+
for (const [names, hints] of CONTRACT_GROUPS) {
|
|
116
|
+
for (const name of names) {
|
|
117
|
+
if (annotations[name]) throw new Error(`Duplicate safety annotation contract for tool: ${name}`);
|
|
118
|
+
annotations[name] = Object.freeze({ ...hints });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return Object.freeze(annotations);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const TOOL_ANNOTATIONS = buildToolAnnotations();
|
|
125
|
+
|
|
126
|
+
function attachToolAnnotations(server) {
|
|
127
|
+
const registered = server?._registeredTools || {};
|
|
128
|
+
const registeredNames = Object.keys(registered).sort();
|
|
129
|
+
const contractNames = Object.keys(TOOL_ANNOTATIONS).sort();
|
|
130
|
+
const missing = registeredNames.filter((name) => !TOOL_ANNOTATIONS[name]);
|
|
131
|
+
// Tools a server PROFILE may legitimately leave unregistered. show_plans is
|
|
132
|
+
// dropped under `commerce: false` (the ChatGPT app profile — OpenAI forbids
|
|
133
|
+
// selling digital goods there); its contract row stays for every other host.
|
|
134
|
+
const PROFILE_OPTIONAL = new Set(['show_plans']);
|
|
135
|
+
const stale = contractNames.filter((name) => !registered[name] && !PROFILE_OPTIONAL.has(name));
|
|
136
|
+
if (missing.length || stale.length) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`Tool annotation contract mismatch. Missing: ${missing.join(', ') || 'none'}. `
|
|
139
|
+
+ `Stale: ${stale.join(', ') || 'none'}.`
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
for (const name of registeredNames) registered[name].annotations = TOOL_ANNOTATIONS[name];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
module.exports = {
|
|
146
|
+
TOOL_ANNOTATIONS,
|
|
147
|
+
CONTRACT_GROUPS,
|
|
148
|
+
attachToolAnnotations,
|
|
149
|
+
};
|