@kawoou/kadoc-mcp 0.1.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/README.md +200 -0
- package/dist/client/kadoc-client.d.ts +74 -0
- package/dist/client/kadoc-client.d.ts.map +1 -0
- package/dist/client/kadoc-client.js +202 -0
- package/dist/client/kadoc-client.js.map +1 -0
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +175 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/envelope.d.ts +43 -0
- package/dist/crypto/envelope.d.ts.map +1 -0
- package/dist/crypto/envelope.js +77 -0
- package/dist/crypto/envelope.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/documents.d.ts +11 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +133 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/folders.d.ts +11 -0
- package/dist/tools/folders.d.ts.map +1 -0
- package/dist/tools/folders.js +117 -0
- package/dist/tools/folders.js.map +1 -0
- package/dist/tools/search.d.ts +11 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +41 -0
- package/dist/tools/search.js.map +1 -0
- package/package.json +51 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as fs from 'fs';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
import { request } from 'undici';
|
|
6
|
+
const serverAuthSchema = z.object({
|
|
7
|
+
authKey: z.string(),
|
|
8
|
+
});
|
|
9
|
+
const serverConfigSchema = z.object({
|
|
10
|
+
url: z.string().url(),
|
|
11
|
+
auth: serverAuthSchema,
|
|
12
|
+
});
|
|
13
|
+
const configSchema = z.object({
|
|
14
|
+
servers: z.record(z.string(), serverConfigSchema),
|
|
15
|
+
defaultServer: z.string(),
|
|
16
|
+
});
|
|
17
|
+
// Partial config schema for loading config without auth
|
|
18
|
+
const partialServerConfigSchema = z.object({
|
|
19
|
+
url: z.string().url(),
|
|
20
|
+
auth: serverAuthSchema.optional(),
|
|
21
|
+
});
|
|
22
|
+
const partialConfigSchema = z.object({
|
|
23
|
+
servers: z.record(z.string(), partialServerConfigSchema),
|
|
24
|
+
defaultServer: z.string(),
|
|
25
|
+
});
|
|
26
|
+
const DEFAULT_CONFIG_PATH = path.join(os.homedir(), '.kadoc.json');
|
|
27
|
+
/**
|
|
28
|
+
* Register a new user with the kadoc server
|
|
29
|
+
*/
|
|
30
|
+
async function registerUser(serverUrl) {
|
|
31
|
+
const response = await request(`${serverUrl}/auth/register`, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
});
|
|
34
|
+
if (response.statusCode !== 200 && response.statusCode !== 201) {
|
|
35
|
+
const text = await response.body.text();
|
|
36
|
+
throw new Error(`Failed to register user: ${response.statusCode} ${text}`);
|
|
37
|
+
}
|
|
38
|
+
const body = await response.body.json();
|
|
39
|
+
return body.data.authKey;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Save config to file
|
|
43
|
+
*/
|
|
44
|
+
function saveConfig(configPath, config) {
|
|
45
|
+
const dir = path.dirname(configPath);
|
|
46
|
+
if (dir && !fs.existsSync(dir)) {
|
|
47
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
48
|
+
}
|
|
49
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Create default config structure
|
|
53
|
+
*/
|
|
54
|
+
function createDefaultConfig(serverUrl) {
|
|
55
|
+
return {
|
|
56
|
+
servers: {
|
|
57
|
+
default: {
|
|
58
|
+
url: serverUrl,
|
|
59
|
+
auth: {
|
|
60
|
+
authKey: '', // Will be filled after registration
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
defaultServer: 'default',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Load configuration, auto-registering if auth is missing
|
|
69
|
+
*/
|
|
70
|
+
export async function loadConfigAsync(configPath) {
|
|
71
|
+
const filePath = configPath ?? process.env.KADOC_CONFIG ?? DEFAULT_CONFIG_PATH;
|
|
72
|
+
const defaultServerUrl = process.env.KADOC_SERVER_URL ?? 'http://localhost:3000';
|
|
73
|
+
// If config file doesn't exist, create it and register
|
|
74
|
+
if (!fs.existsSync(filePath)) {
|
|
75
|
+
console.error(`Configuration file not found, creating new one at: ${filePath}`);
|
|
76
|
+
const config = createDefaultConfig(defaultServerUrl);
|
|
77
|
+
// Register user
|
|
78
|
+
console.error(`Registering new user with server: ${defaultServerUrl}`);
|
|
79
|
+
const authKey = await registerUser(defaultServerUrl);
|
|
80
|
+
config.servers.default.auth.authKey = authKey;
|
|
81
|
+
// Save config
|
|
82
|
+
saveConfig(filePath, config);
|
|
83
|
+
console.error(`Configuration saved with new authKey`);
|
|
84
|
+
return config;
|
|
85
|
+
}
|
|
86
|
+
// Load existing config
|
|
87
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
parsed = JSON.parse(content);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new Error(`Invalid JSON in configuration file: ${filePath}`);
|
|
94
|
+
}
|
|
95
|
+
// Parse as partial config first
|
|
96
|
+
const partialResult = partialConfigSchema.safeParse(parsed);
|
|
97
|
+
if (!partialResult.success) {
|
|
98
|
+
const errors = partialResult.error.errors.map(e => ` - ${e.path.join('.')}: ${e.message}`).join('\n');
|
|
99
|
+
throw new Error(`Configuration validation failed:\n${errors}`);
|
|
100
|
+
}
|
|
101
|
+
const partialConfig = partialResult.data;
|
|
102
|
+
// Validate that defaultServer exists in servers
|
|
103
|
+
if (!partialConfig.servers[partialConfig.defaultServer]) {
|
|
104
|
+
throw new Error(`Default server '${partialConfig.defaultServer}' not found in servers`);
|
|
105
|
+
}
|
|
106
|
+
// Check if any server is missing auth and register
|
|
107
|
+
let configChanged = false;
|
|
108
|
+
const fullConfig = {
|
|
109
|
+
servers: {},
|
|
110
|
+
defaultServer: partialConfig.defaultServer,
|
|
111
|
+
};
|
|
112
|
+
for (const [name, serverConfig] of Object.entries(partialConfig.servers)) {
|
|
113
|
+
if (!serverConfig.auth?.authKey) {
|
|
114
|
+
console.error(`Server '${name}' is missing authKey, registering new user...`);
|
|
115
|
+
const authKey = await registerUser(serverConfig.url);
|
|
116
|
+
fullConfig.servers[name] = {
|
|
117
|
+
url: serverConfig.url,
|
|
118
|
+
auth: { authKey },
|
|
119
|
+
};
|
|
120
|
+
configChanged = true;
|
|
121
|
+
console.error(`Registered new user for server '${name}'`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
fullConfig.servers[name] = {
|
|
125
|
+
url: serverConfig.url,
|
|
126
|
+
auth: serverConfig.auth,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Save updated config if changed
|
|
131
|
+
if (configChanged) {
|
|
132
|
+
saveConfig(filePath, fullConfig);
|
|
133
|
+
console.error(`Configuration updated with new authKey(s)`);
|
|
134
|
+
}
|
|
135
|
+
return fullConfig;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Synchronous config load (for backward compatibility, throws if auth missing)
|
|
139
|
+
*/
|
|
140
|
+
export function loadConfig(configPath) {
|
|
141
|
+
const filePath = configPath ?? process.env.KADOC_CONFIG ?? DEFAULT_CONFIG_PATH;
|
|
142
|
+
if (!fs.existsSync(filePath)) {
|
|
143
|
+
throw new Error(`Configuration file not found: ${filePath}. Run MCP once to auto-register.`);
|
|
144
|
+
}
|
|
145
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
146
|
+
let parsed;
|
|
147
|
+
try {
|
|
148
|
+
parsed = JSON.parse(content);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
throw new Error(`Invalid JSON in configuration file: ${filePath}`);
|
|
152
|
+
}
|
|
153
|
+
const result = configSchema.safeParse(parsed);
|
|
154
|
+
if (!result.success) {
|
|
155
|
+
const errors = result.error.errors.map(e => ` - ${e.path.join('.')}: ${e.message}`).join('\n');
|
|
156
|
+
throw new Error(`Configuration validation failed:\n${errors}`);
|
|
157
|
+
}
|
|
158
|
+
// Validate that defaultServer exists in servers
|
|
159
|
+
if (!result.data.servers[result.data.defaultServer]) {
|
|
160
|
+
throw new Error(`Default server '${result.data.defaultServer}' not found in servers`);
|
|
161
|
+
}
|
|
162
|
+
return result.data;
|
|
163
|
+
}
|
|
164
|
+
export function getServerConfig(config, serverName) {
|
|
165
|
+
const name = serverName ?? config.defaultServer;
|
|
166
|
+
const serverConfig = config.servers[name];
|
|
167
|
+
if (!serverConfig) {
|
|
168
|
+
throw new Error(`Server '${name}' not found in configuration`);
|
|
169
|
+
}
|
|
170
|
+
return serverConfig;
|
|
171
|
+
}
|
|
172
|
+
export function getConfigPath() {
|
|
173
|
+
return process.env.KADOC_CONFIG ?? DEFAULT_CONFIG_PATH;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,IAAI,EAAE,gBAAgB;CACvB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC;IACjD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,wDAAwD;AACxD,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACrB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC;IACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAMH,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAEnE;;GAEG;AACH,KAAK,UAAU,YAAY,CAAC,SAAiB;IAC3C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,SAAS,gBAAgB,EAAE;QAC3D,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAmC,CAAC;IACzE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,UAAkB,EAAE,MAAc;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO;QACL,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE;oBACJ,OAAO,EAAE,EAAE,EAAE,oCAAoC;iBAClD;aACF;SACF;QACD,aAAa,EAAE,SAAS;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAmB;IACvD,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;IAC/E,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;IAEjF,uDAAuD;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAC;QAEhF,MAAM,MAAM,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;QAErD,gBAAgB;QAChB,OAAO,CAAC,KAAK,CAAC,qCAAqC,gBAAgB,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAE9C,cAAc;QACd,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAEtD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE5D,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC;IAEzC,gDAAgD;IAChD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,mBAAmB,aAAa,CAAC,aAAa,wBAAwB,CAAC,CAAC;IAC1F,CAAC;IAED,mDAAmD;IACnD,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,UAAU,GAAW;QACzB,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,aAAa,CAAC,aAAa;KAC3C,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,+CAA+C,CAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACrD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACzB,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,IAAI,EAAE,EAAE,OAAO,EAAE;aAClB,CAAC;YACF,aAAa,GAAG,IAAI,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,GAAG,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACzB,GAAG,EAAE,YAAY,CAAC,GAAG;gBACrB,IAAI,EAAE,YAAY,CAAC,IAAI;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,IAAI,aAAa,EAAE,CAAC;QAClB,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,QAAQ,GAAG,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;IAE/E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,kCAAkC,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,gDAAgD;IAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,IAAI,CAAC,aAAa,wBAAwB,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAAmB;IACjE,MAAM,IAAI,GAAG,UAAU,IAAI,MAAM,CAAC,aAAa,CAAC;IAChD,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,8BAA8B,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Envelope encryption utilities using NaCl (TweetNaCl)
|
|
3
|
+
* Client-side implementation
|
|
4
|
+
*/
|
|
5
|
+
export interface KeyPair {
|
|
6
|
+
publicKey: Uint8Array;
|
|
7
|
+
secretKey: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
export interface EncryptedPayload {
|
|
10
|
+
nonce: string;
|
|
11
|
+
ciphertext: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Generate a new X25519 key pair
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateKeyPair(): KeyPair;
|
|
18
|
+
/**
|
|
19
|
+
* Compute shared secret from own secret key and peer's public key
|
|
20
|
+
*/
|
|
21
|
+
export declare function computeSharedSecret(mySecretKey: Uint8Array, theirPublicKey: Uint8Array): Uint8Array;
|
|
22
|
+
/**
|
|
23
|
+
* Encrypt data using shared secret
|
|
24
|
+
*/
|
|
25
|
+
export declare function encrypt(data: string | object, sharedSecret: Uint8Array): EncryptedPayload;
|
|
26
|
+
/**
|
|
27
|
+
* Decrypt data using shared secret
|
|
28
|
+
*/
|
|
29
|
+
export declare function decrypt(payload: EncryptedPayload, sharedSecret: Uint8Array): string | null;
|
|
30
|
+
/**
|
|
31
|
+
* Decrypt and parse JSON data
|
|
32
|
+
*/
|
|
33
|
+
export declare function decryptJson<T>(payload: EncryptedPayload, sharedSecret: Uint8Array): T | null;
|
|
34
|
+
/**
|
|
35
|
+
* Encode/decode helpers
|
|
36
|
+
*/
|
|
37
|
+
export declare function encodePublicKey(publicKey: Uint8Array): string;
|
|
38
|
+
export declare function decodePublicKey(encoded: string): Uint8Array;
|
|
39
|
+
/**
|
|
40
|
+
* Generate a random nonce string
|
|
41
|
+
*/
|
|
42
|
+
export declare function generateNonce(): string;
|
|
43
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"AAKA;;;GAGG;AAEH,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,UAAU,CAAC;IACtB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,UAAU,EACvB,cAAc,EAAE,UAAU,GACzB,UAAU,CAEZ;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,GAAG,MAAM,EACrB,YAAY,EAAE,UAAU,GACvB,gBAAgB,CAYlB;AAED;;GAEG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,UAAU,GACvB,MAAM,GAAG,IAAI,CAcf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,gBAAgB,EACzB,YAAY,EAAE,UAAU,GACvB,CAAC,GAAG,IAAI,CAWV;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAE7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAE3D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import nacl from 'tweetnacl';
|
|
2
|
+
import tweetnaclUtil from 'tweetnacl-util';
|
|
3
|
+
const { encodeBase64, decodeBase64 } = tweetnaclUtil;
|
|
4
|
+
/**
|
|
5
|
+
* Generate a new X25519 key pair
|
|
6
|
+
*/
|
|
7
|
+
export function generateKeyPair() {
|
|
8
|
+
return nacl.box.keyPair();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compute shared secret from own secret key and peer's public key
|
|
12
|
+
*/
|
|
13
|
+
export function computeSharedSecret(mySecretKey, theirPublicKey) {
|
|
14
|
+
return nacl.box.before(theirPublicKey, mySecretKey);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Encrypt data using shared secret
|
|
18
|
+
*/
|
|
19
|
+
export function encrypt(data, sharedSecret) {
|
|
20
|
+
const message = typeof data === 'string' ? data : JSON.stringify(data);
|
|
21
|
+
const messageBytes = new TextEncoder().encode(message);
|
|
22
|
+
const nonce = nacl.randomBytes(nacl.secretbox.nonceLength);
|
|
23
|
+
const ciphertext = nacl.secretbox(messageBytes, nonce, sharedSecret);
|
|
24
|
+
return {
|
|
25
|
+
nonce: encodeBase64(nonce),
|
|
26
|
+
ciphertext: encodeBase64(ciphertext),
|
|
27
|
+
timestamp: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Decrypt data using shared secret
|
|
32
|
+
*/
|
|
33
|
+
export function decrypt(payload, sharedSecret) {
|
|
34
|
+
try {
|
|
35
|
+
const nonce = decodeBase64(payload.nonce);
|
|
36
|
+
const ciphertext = decodeBase64(payload.ciphertext);
|
|
37
|
+
const decrypted = nacl.secretbox.open(ciphertext, nonce, sharedSecret);
|
|
38
|
+
if (!decrypted) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
return new TextDecoder().decode(decrypted);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Decrypt and parse JSON data
|
|
49
|
+
*/
|
|
50
|
+
export function decryptJson(payload, sharedSecret) {
|
|
51
|
+
const plaintext = decrypt(payload, sharedSecret);
|
|
52
|
+
if (!plaintext) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return JSON.parse(plaintext);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Encode/decode helpers
|
|
64
|
+
*/
|
|
65
|
+
export function encodePublicKey(publicKey) {
|
|
66
|
+
return encodeBase64(publicKey);
|
|
67
|
+
}
|
|
68
|
+
export function decodePublicKey(encoded) {
|
|
69
|
+
return decodeBase64(encoded);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate a random nonce string
|
|
73
|
+
*/
|
|
74
|
+
export function generateNonce() {
|
|
75
|
+
return encodeBase64(nacl.randomBytes(16));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/crypto/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,aAAa,CAAC;AAkBrD;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAuB,EACvB,cAA0B;IAE1B,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,IAAqB,EACrB,YAAwB;IAExB,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAErE,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;QAC1B,UAAU,EAAE,YAAY,CAAC,UAAU,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,OAAyB,EACzB,YAAwB;IAExB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAyB,EACzB,YAAwB;IAExB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAM,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAqB;IACnD,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { loadConfigAsync } from './config.js';
|
|
6
|
+
import { KadocClient } from './client/kadoc-client.js';
|
|
7
|
+
import { documentTools, handleDocumentTool } from './tools/documents.js';
|
|
8
|
+
import { searchTools, handleSearchTool } from './tools/search.js';
|
|
9
|
+
import { folderTools, handleFolderTool } from './tools/folders.js';
|
|
10
|
+
async function main() {
|
|
11
|
+
// Load configuration (auto-registers if auth missing)
|
|
12
|
+
let config;
|
|
13
|
+
try {
|
|
14
|
+
config = await loadConfigAsync();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
console.error('Failed to load configuration:', error);
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
// Create kadoc client
|
|
21
|
+
const client = new KadocClient(config);
|
|
22
|
+
// Create MCP server
|
|
23
|
+
const server = new Server({
|
|
24
|
+
name: 'kadoc-mcp',
|
|
25
|
+
version: '0.1.0',
|
|
26
|
+
}, {
|
|
27
|
+
capabilities: {
|
|
28
|
+
tools: {},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
// List available tools
|
|
32
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
33
|
+
return {
|
|
34
|
+
tools: [
|
|
35
|
+
...documentTools,
|
|
36
|
+
...searchTools,
|
|
37
|
+
...folderTools,
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
// Handle tool calls
|
|
42
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
43
|
+
const { name, arguments: args } = request.params;
|
|
44
|
+
try {
|
|
45
|
+
// Document tools
|
|
46
|
+
if (name.startsWith('kadoc_') && ['write_document', 'read_document', 'delete_document', 'update_document', 'list_documents'].some(t => name === `kadoc_${t}`)) {
|
|
47
|
+
return await handleDocumentTool(client, name, args);
|
|
48
|
+
}
|
|
49
|
+
// Search tools
|
|
50
|
+
if (name === 'kadoc_search') {
|
|
51
|
+
return await handleSearchTool(client, name, args);
|
|
52
|
+
}
|
|
53
|
+
// Folder tools
|
|
54
|
+
if (name.startsWith('kadoc_') && ['create_folder', 'list_folders', 'delete_folder', 'get_index_settings', 'set_index_settings'].some(t => name === `kadoc_${t}`)) {
|
|
55
|
+
return await handleFolderTool(client, name, args);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `Unknown tool: ${name}`,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return {
|
|
69
|
+
content: [
|
|
70
|
+
{
|
|
71
|
+
type: 'text',
|
|
72
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
isError: true,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
// Start server
|
|
80
|
+
const transport = new StdioServerTransport();
|
|
81
|
+
await server.connect(transport);
|
|
82
|
+
console.error('kadoc-mcp server started');
|
|
83
|
+
}
|
|
84
|
+
main().catch((error) => {
|
|
85
|
+
console.error('Fatal error:', error);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { KadocClient } from '../client/kadoc-client.js';
|
|
3
|
+
export declare const documentTools: Tool[];
|
|
4
|
+
export declare function handleDocumentTool(client: KadocClient, name: string, args: Record<string, unknown> | undefined): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
isError?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,eAAO,MAAM,aAAa,EAAE,IAAI,EAsE/B,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAiEhF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
export const documentTools = [
|
|
2
|
+
{
|
|
3
|
+
name: 'write_document',
|
|
4
|
+
description: 'Create a new document',
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
path: { type: 'string', description: 'e.g., notes/meeting' },
|
|
9
|
+
title: { type: 'string' },
|
|
10
|
+
content: { type: 'string', description: 'Markdown' },
|
|
11
|
+
metadata: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
description: 'Custom metadata fields (e.g., { "author": "...", "tags": [...] })',
|
|
14
|
+
additionalProperties: true,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
required: ['path', 'title', 'content'],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'read_document',
|
|
22
|
+
description: 'Read a document',
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: 'object',
|
|
25
|
+
properties: {
|
|
26
|
+
path: { type: 'string' },
|
|
27
|
+
},
|
|
28
|
+
required: ['path'],
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'delete_document',
|
|
33
|
+
description: 'Delete a document',
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
path: { type: 'string' },
|
|
38
|
+
},
|
|
39
|
+
required: ['path'],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'update_document',
|
|
44
|
+
description: 'Update a document',
|
|
45
|
+
inputSchema: {
|
|
46
|
+
type: 'object',
|
|
47
|
+
properties: {
|
|
48
|
+
path: { type: 'string' },
|
|
49
|
+
title: { type: 'string', description: 'optional' },
|
|
50
|
+
content: { type: 'string', description: 'optional' },
|
|
51
|
+
metadata: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
description: 'Custom metadata fields to update',
|
|
54
|
+
additionalProperties: true,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
required: ['path'],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'list_documents',
|
|
62
|
+
description: 'List documents',
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: 'object',
|
|
65
|
+
properties: {
|
|
66
|
+
folder: { type: 'string', description: 'optional' },
|
|
67
|
+
limit: { type: 'number', description: 'optional, default: 20' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
];
|
|
72
|
+
export async function handleDocumentTool(client, name, args) {
|
|
73
|
+
const params = args ?? {};
|
|
74
|
+
try {
|
|
75
|
+
switch (name) {
|
|
76
|
+
case 'write_document': {
|
|
77
|
+
const result = await client.createDocument({
|
|
78
|
+
path: params.path,
|
|
79
|
+
title: params.title,
|
|
80
|
+
content: params.content,
|
|
81
|
+
metadata: params.metadata,
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
case 'read_document': {
|
|
88
|
+
const result = await client.readDocument(params.path);
|
|
89
|
+
return {
|
|
90
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
case 'delete_document': {
|
|
94
|
+
await client.deleteDocument(params.path);
|
|
95
|
+
return {
|
|
96
|
+
content: [{ type: 'text', text: 'Document deleted successfully' }],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
case 'update_document': {
|
|
100
|
+
const result = await client.updateDocument({
|
|
101
|
+
path: params.path,
|
|
102
|
+
title: params.title,
|
|
103
|
+
content: params.content,
|
|
104
|
+
metadata: params.metadata,
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
case 'list_documents': {
|
|
111
|
+
const result = await client.listDocuments({
|
|
112
|
+
folder: params.folder,
|
|
113
|
+
limit: params.limit,
|
|
114
|
+
});
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
default:
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: 'text', text: `Unknown document tool: ${name}` }],
|
|
122
|
+
isError: true,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return {
|
|
128
|
+
content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
|
|
129
|
+
isError: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../src/tools/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { KadocClient } from '../client/kadoc-client.js';
|
|
3
|
+
export declare const folderTools: Tool[];
|
|
4
|
+
export declare function handleFolderTool(client: KadocClient, name: string, args: Record<string, unknown> | undefined): Promise<{
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
isError?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=folders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.d.ts","sourceRoot":"","sources":["../../src/tools/folders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,eAAO,MAAM,WAAW,EAAE,IAAI,EA8D7B,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA2DhF"}
|