@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.
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,GAC3B;IAAE,MAAM,EAAE,uBAAuB,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,yBAAyB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAY1D,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAuHD,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CA6BzD"}
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
- function isKunobiInstalled() {
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
- return (existsSync('/Applications/Kunobi.app') ||
52
- existsSync(join(homedir(), 'Applications', 'Kunobi.app')));
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 paths = [
56
- '/usr/bin/kunobi',
57
- '/usr/local/bin/kunobi',
58
- join(homedir(), '.local', 'bin', 'kunobi'),
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
- return paths.some((p) => existsSync(p));
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
- return existsSync(join(localAppData, 'Kunobi', 'Kunobi.exe'));
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 false;
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: '2025-03-26',
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 (isKunobiInstalled()) {
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
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.js","sources":["../src/discovery.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
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 server = new McpServer({ name: 'kunobi', version: '0.0.1' }, { capabilities: { tools: { listChanged: true } } });
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, msg, data) => {
127
+ logger: (level) => {
19
128
  if (level === 'error') {
20
- console.error(`[kunobi-mcp] ${msg}`, data ?? '');
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
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAQA,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EACpC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CACnD;AAED,kBAAkB,CAAC,MAAM,CAAC;AAE1B,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;IACD,MAAM,EAAE,CAAC,KAAa,EAAE,GAAW,EAAE,IAAc,KAAI;AACrD,QAAA,IAAI,KAAK,KAAK,OAAO,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,EAAE,IAAI,IAAI,EAAE,CAAC;QAClD;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;AACjC,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"}
1
+ {"version":3,"file":"server.js","sources":["../src/server.ts"],"sourcesContent":[null],"names":["require"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerLaunchTool(server: McpServer): void;
3
+ //# sourceMappingURL=launch.d.ts.map
@@ -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;AAkCzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAc1D"}
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"}
@@ -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
- 'Kunobi is installed but not running.',
13
+ `Kunobi is installed but not running. Found: ${state.variants.join(', ')}.`,
14
14
  '',
15
- 'Launch it from your Applications folder.',
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
- return [
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
- ].join('\n');
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 {
@@ -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,qCAAqC;AACtC,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;AAEd,QAAA,KAAK,uBAAuB;YAC1B,OAAO;gBACL,sCAAsC;gBACtC,EAAE;gBACF,0CAA0C;AAC3C,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;AAEd,QAAA,KAAK,WAAW;YACd,OAAO;AACL,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,aAAA,CAAC,IAAI,CAAC,IAAI,CAAC;;AAElB;AAEM,SAAU,kBAAkB,CAAC,MAAiB,EAAA;AAClD,IAAA,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;AACE,QAAA,WAAW,EACT,gIAAgI;KACnI,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;;;;"}
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;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kunobi/mcp",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "MCP server for Kunobi — platform management for AI assistants",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",