@kunobi/mcp 0.0.2 → 0.0.3
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/discovery.d.ts +9 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +83 -15
- package/dist/discovery.js.map +1 -1
- package/dist/server.js +143 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/launch.d.ts +3 -0
- package/dist/tools/launch.d.ts.map +1 -0
- package/dist/tools/launch.js +73 -0
- package/dist/tools/launch.js.map +1 -0
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +17 -7
- package/dist/tools/status.js.map +1 -1
- package/package.json +1 -1
package/dist/discovery.d.ts
CHANGED
|
@@ -2,14 +2,23 @@ export type KunobiState = {
|
|
|
2
2
|
status: 'not_installed';
|
|
3
3
|
} | {
|
|
4
4
|
status: 'installed_not_running';
|
|
5
|
+
variants: string[];
|
|
5
6
|
} | {
|
|
6
7
|
status: 'running_mcp_unreachable';
|
|
7
8
|
pid: number;
|
|
9
|
+
variants: string[];
|
|
8
10
|
} | {
|
|
9
11
|
status: 'connected';
|
|
10
12
|
pid: number;
|
|
11
13
|
tools: string[];
|
|
14
|
+
variants: string[];
|
|
12
15
|
};
|
|
16
|
+
export declare function launchHint(): string;
|
|
17
|
+
export declare function getLaunchCommand(variant: string): {
|
|
18
|
+
command: string;
|
|
19
|
+
args: string[];
|
|
20
|
+
} | null;
|
|
13
21
|
export declare function getMcpUrl(): string;
|
|
22
|
+
export declare function findKunobiVariants(): string[];
|
|
14
23
|
export declare function detectKunobi(): Promise<KunobiState>;
|
|
15
24
|
//# sourceMappingURL=discovery.d.ts.map
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3B;IAAE,MAAM,EAAE,uBAAuB,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,yBAAyB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAU9E,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+B5C;AAID,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAgDD,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAgD7C;AAiDD,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAgCzD"}
|
package/dist/discovery.js
CHANGED
|
@@ -2,7 +2,46 @@ import { existsSync } from 'node:fs';
|
|
|
2
2
|
import { readdir, readFile } from 'node:fs/promises';
|
|
3
3
|
import { platform, homedir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
|
+
import { LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/sdk/types.js';
|
|
5
6
|
|
|
7
|
+
function launchHint() {
|
|
8
|
+
const os = platform();
|
|
9
|
+
if (os === 'darwin')
|
|
10
|
+
return 'Launch it from your Applications folder.';
|
|
11
|
+
if (os === 'win32')
|
|
12
|
+
return 'Launch it from the Start menu.';
|
|
13
|
+
return 'Launch Kunobi from your app launcher or run it from the terminal.';
|
|
14
|
+
}
|
|
15
|
+
function getLaunchCommand(variant) {
|
|
16
|
+
const os = platform();
|
|
17
|
+
if (os === 'darwin') {
|
|
18
|
+
return { command: 'open', args: ['-a', variant] };
|
|
19
|
+
}
|
|
20
|
+
if (os === 'linux') {
|
|
21
|
+
const bin = variant.toLowerCase().replace(/\s+/g, '-');
|
|
22
|
+
const dirs = [
|
|
23
|
+
'/usr/bin',
|
|
24
|
+
'/usr/local/bin',
|
|
25
|
+
join(homedir(), '.local', 'bin'),
|
|
26
|
+
];
|
|
27
|
+
for (const dir of dirs) {
|
|
28
|
+
const p = join(dir, bin);
|
|
29
|
+
if (existsSync(p))
|
|
30
|
+
return { command: p, args: [] };
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (os === 'win32') {
|
|
35
|
+
const localAppData = process.env.LOCALAPPDATA;
|
|
36
|
+
if (localAppData) {
|
|
37
|
+
const exe = join(localAppData, variant, `${variant}.exe`);
|
|
38
|
+
if (existsSync(exe))
|
|
39
|
+
return { command: exe, args: [] };
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
6
45
|
const DEFAULT_MCP_URL = 'http://127.0.0.1:3030/mcp';
|
|
7
46
|
function getMcpUrl() {
|
|
8
47
|
return process.env.KUNOBI_MCP_URL || DEFAULT_MCP_URL;
|
|
@@ -45,28 +84,54 @@ async function findKunobiLockFile() {
|
|
|
45
84
|
}
|
|
46
85
|
return null;
|
|
47
86
|
}
|
|
48
|
-
|
|
87
|
+
const KUNOBI_VARIANTS = ['', ' Dev', ' Unstable', ' E2E', ' Local'];
|
|
88
|
+
function variantLabel(suffix) {
|
|
89
|
+
return suffix ? `Kunobi${suffix}` : 'Kunobi';
|
|
90
|
+
}
|
|
91
|
+
function findKunobiVariants() {
|
|
49
92
|
const os = platform();
|
|
93
|
+
const found = [];
|
|
50
94
|
if (os === 'darwin') {
|
|
51
|
-
|
|
52
|
-
|
|
95
|
+
const dirs = ['/Applications', join(homedir(), 'Applications')];
|
|
96
|
+
for (const v of KUNOBI_VARIANTS) {
|
|
97
|
+
if (dirs.some((dir) => existsSync(join(dir, `Kunobi${v}.app`)))) {
|
|
98
|
+
found.push(variantLabel(v));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return found;
|
|
53
102
|
}
|
|
54
103
|
if (os === 'linux') {
|
|
55
|
-
const
|
|
56
|
-
'/usr/bin
|
|
57
|
-
'/usr/local/bin
|
|
58
|
-
join(homedir(), '.local', 'bin'
|
|
104
|
+
const dirs = [
|
|
105
|
+
'/usr/bin',
|
|
106
|
+
'/usr/local/bin',
|
|
107
|
+
join(homedir(), '.local', 'bin'),
|
|
108
|
+
];
|
|
109
|
+
const linuxVariants = [
|
|
110
|
+
['kunobi', 'Kunobi'],
|
|
111
|
+
['kunobi-dev', 'Kunobi Dev'],
|
|
112
|
+
['kunobi-unstable', 'Kunobi Unstable'],
|
|
113
|
+
['kunobi-e2e', 'Kunobi E2E'],
|
|
114
|
+
['kunobi-local', 'Kunobi Local'],
|
|
59
115
|
];
|
|
60
|
-
|
|
116
|
+
for (const [bin, label] of linuxVariants) {
|
|
117
|
+
if (dirs.some((dir) => existsSync(join(dir, bin)))) {
|
|
118
|
+
found.push(label);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return found;
|
|
61
122
|
}
|
|
62
|
-
// Windows — check common install location
|
|
63
123
|
if (os === 'win32') {
|
|
64
124
|
const localAppData = process.env.LOCALAPPDATA;
|
|
65
125
|
if (localAppData) {
|
|
66
|
-
|
|
126
|
+
for (const v of KUNOBI_VARIANTS) {
|
|
127
|
+
if (existsSync(join(localAppData, `Kunobi${v}`, `Kunobi${v}.exe`))) {
|
|
128
|
+
found.push(variantLabel(v));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
67
131
|
}
|
|
132
|
+
return found;
|
|
68
133
|
}
|
|
69
|
-
return
|
|
134
|
+
return found;
|
|
70
135
|
}
|
|
71
136
|
async function probeMcpServer(url) {
|
|
72
137
|
try {
|
|
@@ -78,7 +143,7 @@ async function probeMcpServer(url) {
|
|
|
78
143
|
id: 1,
|
|
79
144
|
method: 'initialize',
|
|
80
145
|
params: {
|
|
81
|
-
protocolVersion:
|
|
146
|
+
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
82
147
|
capabilities: {},
|
|
83
148
|
clientInfo: { name: 'kunobi-mcp-probe', version: '0.0.1' },
|
|
84
149
|
},
|
|
@@ -116,6 +181,7 @@ async function probeMcpServer(url) {
|
|
|
116
181
|
async function detectKunobi() {
|
|
117
182
|
const lockFile = await findKunobiLockFile();
|
|
118
183
|
const mcpUrl = getMcpUrl();
|
|
184
|
+
const variants = findKunobiVariants();
|
|
119
185
|
// Check if MCP server is reachable
|
|
120
186
|
const tools = await probeMcpServer(mcpUrl);
|
|
121
187
|
if (tools !== null) {
|
|
@@ -123,6 +189,7 @@ async function detectKunobi() {
|
|
|
123
189
|
status: 'connected',
|
|
124
190
|
pid: lockFile?.pid ?? 0,
|
|
125
191
|
tools,
|
|
192
|
+
variants,
|
|
126
193
|
};
|
|
127
194
|
}
|
|
128
195
|
// MCP not reachable — check if running via lock file
|
|
@@ -130,14 +197,15 @@ async function detectKunobi() {
|
|
|
130
197
|
return {
|
|
131
198
|
status: 'running_mcp_unreachable',
|
|
132
199
|
pid: lockFile.pid,
|
|
200
|
+
variants,
|
|
133
201
|
};
|
|
134
202
|
}
|
|
135
203
|
// Not running — check if installed
|
|
136
|
-
if (
|
|
137
|
-
return { status: 'installed_not_running' };
|
|
204
|
+
if (variants.length > 0) {
|
|
205
|
+
return { status: 'installed_not_running', variants };
|
|
138
206
|
}
|
|
139
207
|
return { status: 'not_installed' };
|
|
140
208
|
}
|
|
141
209
|
|
|
142
|
-
export { detectKunobi, getMcpUrl };
|
|
210
|
+
export { detectKunobi, findKunobiVariants, getLaunchCommand, getMcpUrl, launchHint };
|
|
143
211
|
//# sourceMappingURL=discovery.js.map
|
package/dist/discovery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.js","sources":["../src/discovery.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"discovery.js","sources":["../src/discovery.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -1,12 +1,121 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
2
3
|
import { McpBundler } from '@kunobi/mcp-bundler';
|
|
3
4
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
5
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
-
import { getMcpUrl } from './discovery.js';
|
|
6
|
+
import { detectKunobi, launchHint, getMcpUrl } from './discovery.js';
|
|
7
|
+
import { registerLaunchTool } from './tools/launch.js';
|
|
6
8
|
import { registerStatusTool } from './tools/status.js';
|
|
7
9
|
|
|
8
|
-
const
|
|
10
|
+
const require$1 = createRequire(import.meta.url);
|
|
11
|
+
const { version } = require$1('../package.json');
|
|
12
|
+
const arg = process.argv[2];
|
|
13
|
+
if (arg === '--help' || arg === '-h') {
|
|
14
|
+
console.log(`Kunobi MCP server v${version} — connects AI assistants to the Kunobi desktop app.
|
|
15
|
+
|
|
16
|
+
Usage (in Claude settings):
|
|
17
|
+
{
|
|
18
|
+
"mcpServers": {
|
|
19
|
+
"kunobi": {
|
|
20
|
+
"command": "npx",
|
|
21
|
+
"args": ["@kunobi/mcp"]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Options:
|
|
27
|
+
--help, -h Show this help message
|
|
28
|
+
--version, -v Show version number
|
|
29
|
+
|
|
30
|
+
Environment:
|
|
31
|
+
KUNOBI_MCP_URL Override Kunobi's MCP endpoint (default: http://127.0.0.1:3030/mcp)`);
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
if (arg === '--version' || arg === '-v') {
|
|
35
|
+
console.log(version);
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
const server = new McpServer({ name: 'kunobi', version }, { capabilities: { tools: { listChanged: true }, logging: {} } });
|
|
9
39
|
registerStatusTool(server);
|
|
40
|
+
registerLaunchTool(server);
|
|
41
|
+
// Resource: passive way for the LLM to check Kunobi state
|
|
42
|
+
server.registerResource('kunobi_status', 'kunobi://status', {
|
|
43
|
+
description: 'Current Kunobi connection state and available tools',
|
|
44
|
+
mimeType: 'application/json',
|
|
45
|
+
}, async () => {
|
|
46
|
+
const state = await detectKunobi();
|
|
47
|
+
return {
|
|
48
|
+
contents: [
|
|
49
|
+
{
|
|
50
|
+
uri: 'kunobi://status',
|
|
51
|
+
mimeType: 'application/json',
|
|
52
|
+
text: JSON.stringify(state, null, 2),
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
// Prompt: guide user through Kunobi setup
|
|
58
|
+
server.registerPrompt('kunobi-setup', {
|
|
59
|
+
description: 'Check Kunobi status and provide setup instructions',
|
|
60
|
+
}, async () => {
|
|
61
|
+
const state = await detectKunobi();
|
|
62
|
+
let instructions;
|
|
63
|
+
switch (state.status) {
|
|
64
|
+
case 'not_installed':
|
|
65
|
+
instructions =
|
|
66
|
+
'Kunobi is not installed. Download it from https://kunobi.ninja/downloads and install it on your system.';
|
|
67
|
+
break;
|
|
68
|
+
case 'installed_not_running':
|
|
69
|
+
instructions = `Kunobi is installed but not running (found: ${state.variants.join(', ')}). ${launchHint()}`;
|
|
70
|
+
break;
|
|
71
|
+
case 'running_mcp_unreachable':
|
|
72
|
+
instructions = `Kunobi is running (PID ${state.pid}) but the MCP endpoint is not reachable. Open Kunobi Settings and make sure MCP is enabled.`;
|
|
73
|
+
break;
|
|
74
|
+
case 'connected':
|
|
75
|
+
instructions = `Kunobi is connected and ready. ${state.tools.length} tools available: ${state.tools.join(', ')}.${state.variants.length > 0 ? ` Installed variants: ${state.variants.join(', ')}.` : ''}`;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
messages: [
|
|
80
|
+
{
|
|
81
|
+
role: 'user',
|
|
82
|
+
content: { type: 'text', text: instructions },
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
});
|
|
87
|
+
// Prompt: diagnose Kunobi connection issues
|
|
88
|
+
server.registerPrompt('kunobi-doctor', {
|
|
89
|
+
description: 'Diagnose why Kunobi tools are unavailable and suggest fixes',
|
|
90
|
+
}, async () => {
|
|
91
|
+
const state = await detectKunobi();
|
|
92
|
+
const steps = [];
|
|
93
|
+
switch (state.status) {
|
|
94
|
+
case 'not_installed':
|
|
95
|
+
steps.push('Kunobi is not installed on this system.', '1. Download Kunobi from https://kunobi.ninja/downloads', '2. Install and launch the application', '3. Enable MCP in Kunobi Settings');
|
|
96
|
+
break;
|
|
97
|
+
case 'installed_not_running':
|
|
98
|
+
steps.push(`Kunobi is installed but not running. Found variants: ${state.variants.join(', ')}.`, `1. ${launchHint()}`, '2. Wait a few seconds for MCP to initialize', '3. Tools will appear automatically once connected');
|
|
99
|
+
break;
|
|
100
|
+
case 'running_mcp_unreachable':
|
|
101
|
+
steps.push(`Kunobi is running (PID ${state.pid}) but the MCP endpoint is unreachable.`, '1. Open Kunobi Settings and verify MCP is enabled', `2. Check that the MCP endpoint is accessible at ${getMcpUrl()}`, '3. Try restarting Kunobi');
|
|
102
|
+
break;
|
|
103
|
+
case 'connected':
|
|
104
|
+
steps.push('No issues detected — Kunobi is connected and working.', `${state.tools.length} tools available: ${state.tools.join(', ')}`);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
messages: [
|
|
109
|
+
{
|
|
110
|
+
role: 'user',
|
|
111
|
+
content: { type: 'text', text: steps.join('\n') },
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
const CONNECTION_CHECK_AFTER = 6; // Check installation after ~30s (6 × 5s)
|
|
117
|
+
let failCount = 0;
|
|
118
|
+
let checkDone = false;
|
|
10
119
|
const bundler = new McpBundler({
|
|
11
120
|
name: 'kunobi',
|
|
12
121
|
url: getMcpUrl(),
|
|
@@ -15,9 +124,37 @@ const bundler = new McpBundler({
|
|
|
15
124
|
intervalMs: 5_000,
|
|
16
125
|
maxRetries: Number.POSITIVE_INFINITY,
|
|
17
126
|
},
|
|
18
|
-
logger: (level
|
|
127
|
+
logger: (level) => {
|
|
19
128
|
if (level === 'error') {
|
|
20
|
-
|
|
129
|
+
failCount++;
|
|
130
|
+
if (failCount >= CONNECTION_CHECK_AFTER && !checkDone) {
|
|
131
|
+
checkDone = true;
|
|
132
|
+
detectKunobi().then((state) => {
|
|
133
|
+
let msg;
|
|
134
|
+
switch (state.status) {
|
|
135
|
+
case 'not_installed':
|
|
136
|
+
msg =
|
|
137
|
+
'Kunobi is not installed. Download it from https://kunobi.ninja/downloads';
|
|
138
|
+
break;
|
|
139
|
+
case 'installed_not_running':
|
|
140
|
+
msg = `Kunobi is installed but not running (found: ${state.variants.join(', ')}). ${launchHint()}`;
|
|
141
|
+
break;
|
|
142
|
+
case 'running_mcp_unreachable':
|
|
143
|
+
msg =
|
|
144
|
+
'Kunobi is running but MCP is unreachable. Check that MCP is enabled in Kunobi Settings.';
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
if (msg) {
|
|
148
|
+
server.server
|
|
149
|
+
.sendLoggingMessage({
|
|
150
|
+
level: 'warning',
|
|
151
|
+
logger: 'kunobi-mcp',
|
|
152
|
+
data: msg,
|
|
153
|
+
})
|
|
154
|
+
.catch(() => { });
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
21
158
|
}
|
|
22
159
|
},
|
|
23
160
|
});
|
|
@@ -30,6 +167,8 @@ async function notifyToolsChanged() {
|
|
|
30
167
|
}
|
|
31
168
|
}
|
|
32
169
|
bundler.on('connected', async () => {
|
|
170
|
+
failCount = 0;
|
|
171
|
+
checkDone = false;
|
|
33
172
|
await bundler.registerTools(server);
|
|
34
173
|
await notifyToolsChanged();
|
|
35
174
|
});
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":[null],"names":["require"],"mappings":";;;;;;;;;AAUA,MAAMA,SAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9C,MAAM,EAAE,OAAO,EAAE,GAAGA,SAAO,CAAC,iBAAiB,CAAwB;AAErE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3B,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE;AACpC,IAAA,OAAO,CAAC,GAAG,CAAC,CAAA,mBAAA,EAAsB,OAAO,CAAA;;;;;;;;;;;;;;;;;AAiB4C,sFAAA,CAAA,CAAC;AACtF,IAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB;AAEA,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE;AACvC,IAAA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACpB,IAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB;AAEA,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAC3B,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAChE;AAED,kBAAkB,CAAC,MAAM,CAAC;AAC1B,kBAAkB,CAAC,MAAM,CAAC;AAE1B;AACA,MAAM,CAAC,gBAAgB,CACrB,eAAe,EACf,iBAAiB,EACjB;AACE,IAAA,WAAW,EAAE,qDAAqD;AAClE,IAAA,QAAQ,EAAE,kBAAkB;CAC7B,EACD,YAAW;AACT,IAAA,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE;IAClC,OAAO;AACL,QAAA,QAAQ,EAAE;AACR,YAAA;AACE,gBAAA,GAAG,EAAE,iBAAiB;AACtB,gBAAA,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrC,aAAA;AACF,SAAA;KACF;AACH,CAAC,CACF;AAED;AACA,MAAM,CAAC,cAAc,CACnB,cAAc,EACd;AACE,IAAA,WAAW,EAAE,oDAAoD;CAClE,EACD,YAAW;AACT,IAAA,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE;AAClC,IAAA,IAAI,YAAoB;AAExB,IAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,QAAA,KAAK,eAAe;YAClB,YAAY;AACV,gBAAA,yGAAyG;YAC3G;AACF,QAAA,KAAK,uBAAuB;AAC1B,YAAA,YAAY,GAAG,CAAA,4CAAA,EAA+C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,GAAA,EAAM,UAAU,EAAE,EAAE;YAC3G;AACF,QAAA,KAAK,yBAAyB;AAC5B,YAAA,YAAY,GAAG,CAAA,uBAAA,EAA0B,KAAK,CAAC,GAAG,6FAA6F;YAC/I;AACF,QAAA,KAAK,WAAW;AACd,YAAA,YAAY,GAAG,CAAA,+BAAA,EAAkC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA,kBAAA,EAAqB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,qBAAA,EAAwB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE,EAAE;YACzM;;IAGJ,OAAO;AACL,QAAA,QAAQ,EAAE;AACR,YAAA;AACE,gBAAA,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,EAAE;AACvD,aAAA;AACF,SAAA;KACF;AACH,CAAC,CACF;AAED;AACA,MAAM,CAAC,cAAc,CACnB,eAAe,EACf;AACE,IAAA,WAAW,EAAE,6DAA6D;CAC3E,EACD,YAAW;AACT,IAAA,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE;IAClC,MAAM,KAAK,GAAa,EAAE;AAE1B,IAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,QAAA,KAAK,eAAe;YAClB,KAAK,CAAC,IAAI,CACR,yCAAyC,EACzC,wDAAwD,EACxD,uCAAuC,EACvC,kCAAkC,CACnC;YACD;AACF,QAAA,KAAK,uBAAuB;YAC1B,KAAK,CAAC,IAAI,CACR,CAAA,qDAAA,EAAwD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,EACpF,CAAA,GAAA,EAAM,UAAU,EAAE,CAAA,CAAE,EACpB,6CAA6C,EAC7C,mDAAmD,CACpD;YACD;AACF,QAAA,KAAK,yBAAyB;AAC5B,YAAA,KAAK,CAAC,IAAI,CACR,0BAA0B,KAAK,CAAC,GAAG,CAAA,sCAAA,CAAwC,EAC3E,mDAAmD,EACnD,mDAAmD,SAAS,EAAE,EAAE,EAChE,0BAA0B,CAC3B;YACD;AACF,QAAA,KAAK,WAAW;YACd,KAAK,CAAC,IAAI,CACR,uDAAuD,EACvD,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CACnE;YACD;;IAGJ,OAAO;AACL,QAAA,QAAQ,EAAE;AACR,YAAA;AACE,gBAAA,IAAI,EAAE,MAAe;AACrB,gBAAA,OAAO,EAAE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AAC3D,aAAA;AACF,SAAA;KACF;AACH,CAAC,CACF;AAED,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,IAAI,SAAS,GAAG,CAAC;AACjB,IAAI,SAAS,GAAG,KAAK;AAErB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;AAC7B,IAAA,IAAI,EAAE,QAAQ;IACd,GAAG,EAAE,SAAS,EAAE;AAChB,IAAA,SAAS,EAAE;AACT,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,MAAM,CAAC,iBAAiB;AACrC,KAAA;AACD,IAAA,MAAM,EAAE,CAAC,KAAa,KAAI;AACxB,QAAA,IAAI,KAAK,KAAK,OAAO,EAAE;AACrB,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,SAAS,IAAI,sBAAsB,IAAI,CAAC,SAAS,EAAE;gBACrD,SAAS,GAAG,IAAI;AAChB,gBAAA,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;AAC5B,oBAAA,IAAI,GAAuB;AAC3B,oBAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,wBAAA,KAAK,eAAe;4BAClB,GAAG;AACD,gCAAA,0EAA0E;4BAC5E;AACF,wBAAA,KAAK,uBAAuB;AAC1B,4BAAA,GAAG,GAAG,CAAA,4CAAA,EAA+C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,GAAA,EAAM,UAAU,EAAE,EAAE;4BAClG;AACF,wBAAA,KAAK,yBAAyB;4BAC5B,GAAG;AACD,gCAAA,yFAAyF;4BAC3F;;oBAEJ,IAAI,GAAG,EAAE;AACP,wBAAA,MAAM,CAAC;AACJ,6BAAA,kBAAkB,CAAC;AAClB,4BAAA,KAAK,EAAE,SAAS;AAChB,4BAAA,MAAM,EAAE,YAAY;AACpB,4BAAA,IAAI,EAAE,GAAG;yBACV;AACA,6BAAA,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC;oBACpB;AACF,gBAAA,CAAC,CAAC;YACJ;QACF;IACF,CAAC;AACF,CAAA,CAAC;AAEF,eAAe,kBAAkB,GAAA;AAC/B,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE;IAC3C;AAAE,IAAA,MAAM;;IAER;AACF;AAEA,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,YAAW;IACjC,SAAS,GAAG,CAAC;IACb,SAAS,GAAG,KAAK;AACjB,IAAA,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;IACnC,MAAM,kBAAkB,EAAE;AAC5B,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,YAAW;AACpC,IAAA,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;IAC/B,MAAM,kBAAkB,EAAE;AAC5B,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,YAAW;AACrC,IAAA,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC;AAC/B,IAAA,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;IACnC,MAAM,kBAAkB,EAAE;AAC5B,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE;AAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAE/B;AACA,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,MAAK,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/tools/launch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8E1D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { findKunobiVariants, getLaunchCommand } from '../discovery.js';
|
|
4
|
+
|
|
5
|
+
function registerLaunchTool(server) {
|
|
6
|
+
server.registerTool('kunobi_launch', {
|
|
7
|
+
description: 'Launch the Kunobi desktop app. Optionally specify which variant to launch (e.g. "Kunobi Dev"). If omitted, launches the first installed variant.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
variant: z
|
|
10
|
+
.string()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('Which Kunobi variant to launch, e.g. "Kunobi", "Kunobi Dev"'),
|
|
13
|
+
},
|
|
14
|
+
annotations: {
|
|
15
|
+
readOnlyHint: false,
|
|
16
|
+
destructiveHint: false,
|
|
17
|
+
openWorldHint: false,
|
|
18
|
+
},
|
|
19
|
+
}, async ({ variant }) => {
|
|
20
|
+
const variants = findKunobiVariants();
|
|
21
|
+
if (variants.length === 0) {
|
|
22
|
+
return {
|
|
23
|
+
content: [
|
|
24
|
+
{
|
|
25
|
+
type: 'text',
|
|
26
|
+
text: 'Kunobi is not installed. Download it from https://kunobi.ninja/downloads',
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const target = variant ?? variants[0];
|
|
33
|
+
if (!variants.includes(target)) {
|
|
34
|
+
return {
|
|
35
|
+
content: [
|
|
36
|
+
{
|
|
37
|
+
type: 'text',
|
|
38
|
+
text: `Variant "${target}" is not installed. Available: ${variants.join(', ')}`,
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
isError: true,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const launch = getLaunchCommand(target);
|
|
45
|
+
if (!launch) {
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: 'text',
|
|
50
|
+
text: `Could not determine how to launch "${target}" on this platform.`,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
const child = spawn(launch.command, launch.args, {
|
|
57
|
+
detached: true,
|
|
58
|
+
stdio: 'ignore',
|
|
59
|
+
});
|
|
60
|
+
child.unref();
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: 'text',
|
|
65
|
+
text: `Launching ${target}. It may take a few seconds for MCP to become available.`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { registerLaunchTool };
|
|
73
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sources":["../../src/tools/launch.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAKM,SAAU,kBAAkB,CAAC,MAAiB,EAAA;AAClD,IAAA,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;AACE,QAAA,WAAW,EACT,kJAAkJ;AACpJ,QAAA,WAAW,EAAE;AACX,YAAA,OAAO,EAAE;AACN,iBAAA,MAAM;AACN,iBAAA,QAAQ;iBACR,QAAQ,CACP,6DAA6D,CAC9D;AACJ,SAAA;AACD,QAAA,WAAW,EAAE;AACX,YAAA,YAAY,EAAE,KAAK;AACnB,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,aAAa,EAAE,KAAK;AACrB,SAAA;AACF,KAAA,EACD,OAAO,EAAE,OAAO,EAAE,KAAI;AACpB,QAAA,MAAM,QAAQ,GAAG,kBAAkB,EAAE;AAErC,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;YACzB,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;AACrB,wBAAA,IAAI,EAAE,0EAA0E;AACjF,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,EAAE,IAAI;aACd;QACH;QAEA,MAAM,MAAM,GAAG,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC;QAErC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC9B,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,CAAA,SAAA,EAAY,MAAM,CAAA,+BAAA,EAAkC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;AAChF,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,EAAE,IAAI;aACd;QACH;AAEA,QAAA,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;AACL,gBAAA,OAAO,EAAE;AACP,oBAAA;AACE,wBAAA,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,CAAA,mCAAA,EAAsC,MAAM,CAAA,mBAAA,CAAqB;AACxE,qBAAA;AACF,iBAAA;AACD,gBAAA,OAAO,EAAE,IAAI;aACd;QACH;QAEA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;AAC/C,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE,QAAQ;AAChB,SAAA,CAAC;QACF,KAAK,CAAC,KAAK,EAAE;QAEb,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,CAAA,UAAA,EAAa,MAAM,CAAA,wDAAA,CAA0D;AACpF,iBAAA;AACF,aAAA;SACF;AACH,IAAA,CAAC,CACF;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuCzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmB1D"}
|
package/dist/tools/status.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { detectKunobi } from '../discovery.js';
|
|
1
|
+
import { detectKunobi, launchHint } from '../discovery.js';
|
|
2
2
|
|
|
3
3
|
function formatStatus(state) {
|
|
4
4
|
switch (state.status) {
|
|
@@ -6,13 +6,13 @@ function formatStatus(state) {
|
|
|
6
6
|
return [
|
|
7
7
|
'Kunobi is not installed.',
|
|
8
8
|
'',
|
|
9
|
-
'Download from: https://kunobi.ninja',
|
|
9
|
+
'Download from: https://kunobi.ninja/downloads',
|
|
10
10
|
].join('\n');
|
|
11
11
|
case 'installed_not_running':
|
|
12
12
|
return [
|
|
13
|
-
|
|
13
|
+
`Kunobi is installed but not running. Found: ${state.variants.join(', ')}.`,
|
|
14
14
|
'',
|
|
15
|
-
|
|
15
|
+
launchHint(),
|
|
16
16
|
].join('\n');
|
|
17
17
|
case 'running_mcp_unreachable':
|
|
18
18
|
return [
|
|
@@ -20,16 +20,26 @@ function formatStatus(state) {
|
|
|
20
20
|
'',
|
|
21
21
|
'Make sure MCP is enabled in Kunobi Settings.',
|
|
22
22
|
].join('\n');
|
|
23
|
-
case 'connected':
|
|
24
|
-
|
|
23
|
+
case 'connected': {
|
|
24
|
+
const lines = [
|
|
25
25
|
`Connected to Kunobi${state.pid ? ` (PID ${state.pid})` : ''}.`,
|
|
26
26
|
`${state.tools.length} tools available: ${state.tools.join(', ')}`,
|
|
27
|
-
]
|
|
27
|
+
];
|
|
28
|
+
if (state.variants.length > 0) {
|
|
29
|
+
lines.push(`Installed variants: ${state.variants.join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
return lines.join('\n');
|
|
32
|
+
}
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
function registerStatusTool(server) {
|
|
31
36
|
server.registerTool('kunobi_status', {
|
|
32
37
|
description: 'Check the connection status of Kunobi desktop app. Returns whether Kunobi is installed, running, and what tools are available.',
|
|
38
|
+
annotations: {
|
|
39
|
+
readOnlyHint: true,
|
|
40
|
+
destructiveHint: false,
|
|
41
|
+
openWorldHint: false,
|
|
42
|
+
},
|
|
33
43
|
}, async () => {
|
|
34
44
|
const state = await detectKunobi();
|
|
35
45
|
return {
|
package/dist/tools/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sources":["../../src/tools/status.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA,SAAS,YAAY,CAAC,KAAkB,EAAA;AACtC,IAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,QAAA,KAAK,eAAe;YAClB,OAAO;gBACL,0BAA0B;gBAC1B,EAAE;gBACF
|
|
1
|
+
{"version":3,"file":"status.js","sources":["../../src/tools/status.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA,SAAS,YAAY,CAAC,KAAkB,EAAA;AACtC,IAAA,QAAQ,KAAK,CAAC,MAAM;AAClB,QAAA,KAAK,eAAe;YAClB,OAAO;gBACL,0BAA0B;gBAC1B,EAAE;gBACF,+CAA+C;AAChD,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;AAEd,QAAA,KAAK,uBAAuB;YAC1B,OAAO;gBACL,CAAA,4CAAA,EAA+C,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;gBAC3E,EAAE;AACF,gBAAA,UAAU,EAAE;AACb,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;AAEd,QAAA,KAAK,yBAAyB;YAC5B,OAAO;gBACL,CAAA,uBAAA,EAA0B,KAAK,CAAC,GAAG,CAAA,kCAAA,CAAoC;gBACvE,EAAE;gBACF,8CAA8C;AAC/C,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;QAEd,KAAK,WAAW,EAAE;AAChB,YAAA,MAAM,KAAK,GAAG;AACZ,gBAAA,CAAA,mBAAA,EAAsB,KAAK,CAAC,GAAG,GAAG,CAAA,MAAA,EAAS,KAAK,CAAC,GAAG,CAAA,CAAA,CAAG,GAAG,EAAE,CAAA,CAAA,CAAG;AAC/D,gBAAA,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA,kBAAA,EAAqB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE;aACnE;YACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7B,gBAAA,KAAK,CAAC,IAAI,CAAC,CAAA,oBAAA,EAAuB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;YAChE;AACA,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB;;AAEJ;AAEM,SAAU,kBAAkB,CAAC,MAAiB,EAAA;AAClD,IAAA,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;AACE,QAAA,WAAW,EACT,gIAAgI;AAClI,QAAA,WAAW,EAAE;AACX,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,eAAe,EAAE,KAAK;AACtB,YAAA,aAAa,EAAE,KAAK;AACrB,SAAA;KACF,EACD,YAAW;AACT,QAAA,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE;QAClC,OAAO;AACL,YAAA,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;SAChE;AACH,IAAA,CAAC,CACF;AACH;;;;"}
|