@yuihub/mcp-server 1.0.0-beta.1
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/auth.d.ts +22 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +48 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +83 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +101 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/handlers.d.ts +9 -0
- package/dist/resources/handlers.d.ts.map +1 -0
- package/dist/resources/handlers.js +29 -0
- package/dist/resources/handlers.js.map +1 -0
- package/dist/resources/index.d.ts +7 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +72 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +37 -0
- package/dist/server.js.map +1 -0
- package/dist/sse-server.d.ts +7 -0
- package/dist/sse-server.d.ts.map +1 -0
- package/dist/sse-server.js +85 -0
- package/dist/sse-server.js.map +1 -0
- package/dist/tools/context.d.ts +22 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +43 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +83 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory.d.ts +26 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +39 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/session.d.ts +12 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +14 -0
- package/dist/tools/session.js.map +1 -0
- package/package.json +50 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Auth Token Reader
|
|
3
|
+
* Reads token from Backend's .token file
|
|
4
|
+
*/
|
|
5
|
+
export interface AuthToken {
|
|
6
|
+
token: string;
|
|
7
|
+
created_at: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get default data directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDefaultDataDir(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Read token from .token file
|
|
15
|
+
* This uses synchronous read since it's called during startup
|
|
16
|
+
*/
|
|
17
|
+
export declare function readTokenSync(dataDir?: string): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Read token from .token file (async)
|
|
20
|
+
*/
|
|
21
|
+
export declare function readToken(dataDir?: string): Promise<string | undefined>;
|
|
22
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAelE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7E"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Auth Token Reader
|
|
3
|
+
* Reads token from Backend's .token file
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import os from 'os';
|
|
8
|
+
/**
|
|
9
|
+
* Get default data directory
|
|
10
|
+
*/
|
|
11
|
+
export function getDefaultDataDir() {
|
|
12
|
+
return process.env.DATA_DIR || path.join(os.homedir(), '.yuihub');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read token from .token file
|
|
16
|
+
* This uses synchronous read since it's called during startup
|
|
17
|
+
*/
|
|
18
|
+
export function readTokenSync(dataDir) {
|
|
19
|
+
const dir = dataDir || getDefaultDataDir();
|
|
20
|
+
const tokenPath = path.join(dir, '.token');
|
|
21
|
+
try {
|
|
22
|
+
if (fs.existsSync(tokenPath)) {
|
|
23
|
+
const content = fs.readFileSync(tokenPath, 'utf-8');
|
|
24
|
+
const auth = JSON.parse(content);
|
|
25
|
+
return auth.token;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Token file not found or invalid
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Read token from .token file (async)
|
|
35
|
+
*/
|
|
36
|
+
export async function readToken(dataDir) {
|
|
37
|
+
const dir = dataDir || getDefaultDataDir();
|
|
38
|
+
const tokenPath = path.join(dir, '.token');
|
|
39
|
+
try {
|
|
40
|
+
const content = await fs.promises.readFile(tokenPath, 'utf-8');
|
|
41
|
+
const auth = JSON.parse(content);
|
|
42
|
+
return auth.token;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAOpB;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,GAAG,GAAG,OAAO,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB;IAC9C,MAAM,GAAG,GAAG,OAAO,IAAI,iBAAiB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - HTTP Client
|
|
3
|
+
* Communicates with YuiHub Backend API
|
|
4
|
+
*/
|
|
5
|
+
export interface ClientConfig {
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
token: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SaveEntry {
|
|
10
|
+
text: string;
|
|
11
|
+
session_id: string;
|
|
12
|
+
tags?: string[];
|
|
13
|
+
mode?: 'private' | 'public';
|
|
14
|
+
}
|
|
15
|
+
export interface SearchFilter {
|
|
16
|
+
tag?: string;
|
|
17
|
+
session?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SearchResult {
|
|
20
|
+
id: string;
|
|
21
|
+
text: string;
|
|
22
|
+
score: number;
|
|
23
|
+
mode: string;
|
|
24
|
+
tags: string;
|
|
25
|
+
session_id: string;
|
|
26
|
+
source: string;
|
|
27
|
+
date: string;
|
|
28
|
+
}
|
|
29
|
+
export interface Session {
|
|
30
|
+
id: string;
|
|
31
|
+
title: string;
|
|
32
|
+
created_at: string;
|
|
33
|
+
}
|
|
34
|
+
export interface Checkpoint {
|
|
35
|
+
id: string;
|
|
36
|
+
session_id: string;
|
|
37
|
+
snapshot: {
|
|
38
|
+
working_memory: string;
|
|
39
|
+
decision_rationale: string;
|
|
40
|
+
};
|
|
41
|
+
intent: string;
|
|
42
|
+
entry_ids: string[];
|
|
43
|
+
created_at: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ContextPacket {
|
|
46
|
+
intent: string;
|
|
47
|
+
session_id?: string;
|
|
48
|
+
working_memory: Record<string, unknown>;
|
|
49
|
+
long_term_memory: Array<{
|
|
50
|
+
text: string;
|
|
51
|
+
relevance: number;
|
|
52
|
+
}>;
|
|
53
|
+
meta: {
|
|
54
|
+
mode: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export interface HealthStatus {
|
|
58
|
+
status: string;
|
|
59
|
+
version: string;
|
|
60
|
+
}
|
|
61
|
+
export declare class YuiHubClient {
|
|
62
|
+
private baseUrl;
|
|
63
|
+
private token;
|
|
64
|
+
constructor(config: ClientConfig);
|
|
65
|
+
private request;
|
|
66
|
+
health(): Promise<HealthStatus>;
|
|
67
|
+
save(entries: SaveEntry[]): Promise<{
|
|
68
|
+
ok: boolean;
|
|
69
|
+
count: number;
|
|
70
|
+
}>;
|
|
71
|
+
search(query: string, limit?: number, filter?: SearchFilter): Promise<SearchResult[]>;
|
|
72
|
+
createThread(title?: string): Promise<Session>;
|
|
73
|
+
createCheckpoint(params: {
|
|
74
|
+
session_id: string;
|
|
75
|
+
summary: string;
|
|
76
|
+
intent: string;
|
|
77
|
+
working_memory?: Record<string, unknown>;
|
|
78
|
+
entry_ids?: string[];
|
|
79
|
+
}): Promise<Checkpoint>;
|
|
80
|
+
exportContext(intent?: string, session?: string): Promise<ContextPacket>;
|
|
81
|
+
}
|
|
82
|
+
export declare function createClient(config: ClientConfig): YuiHubClient;
|
|
83
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - HTTP Client
|
|
3
|
+
* Communicates with YuiHub Backend API
|
|
4
|
+
*/
|
|
5
|
+
import { YuiHubMCPError } from './errors.js';
|
|
6
|
+
export class YuiHubClient {
|
|
7
|
+
baseUrl;
|
|
8
|
+
token;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
11
|
+
this.token = config.token;
|
|
12
|
+
}
|
|
13
|
+
async request(method, path, body) {
|
|
14
|
+
const url = `${this.baseUrl}${path}`;
|
|
15
|
+
try {
|
|
16
|
+
const response = await fetch(url, {
|
|
17
|
+
method,
|
|
18
|
+
headers: {
|
|
19
|
+
'Content-Type': 'application/json',
|
|
20
|
+
'Authorization': `Bearer ${this.token}`,
|
|
21
|
+
},
|
|
22
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const text = await response.text();
|
|
26
|
+
if (response.status === 401) {
|
|
27
|
+
throw new YuiHubMCPError(-32001, `Unauthorized: ${text}`);
|
|
28
|
+
}
|
|
29
|
+
if (response.status === 400) {
|
|
30
|
+
throw new YuiHubMCPError(-32602, `Invalid params: ${text}`);
|
|
31
|
+
}
|
|
32
|
+
if (response.status === 429) {
|
|
33
|
+
throw new YuiHubMCPError(-32003, `Rate limited: ${text}`);
|
|
34
|
+
}
|
|
35
|
+
if (response.status >= 500) {
|
|
36
|
+
throw new YuiHubMCPError(-32603, `Internal error: ${text}`);
|
|
37
|
+
}
|
|
38
|
+
throw new YuiHubMCPError(-32603, `HTTP ${response.status}: ${text}`);
|
|
39
|
+
}
|
|
40
|
+
return await response.json();
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof YuiHubMCPError) {
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
// Connection error
|
|
47
|
+
throw new YuiHubMCPError(-32002, `Backend not reachable at ${this.baseUrl}: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Health check
|
|
51
|
+
async health() {
|
|
52
|
+
const res = await this.request('GET', '/health');
|
|
53
|
+
return res;
|
|
54
|
+
}
|
|
55
|
+
// Save entries
|
|
56
|
+
async save(entries) {
|
|
57
|
+
return this.request('POST', '/save', {
|
|
58
|
+
entries: entries.map(e => ({
|
|
59
|
+
text: e.text,
|
|
60
|
+
mode: e.mode || 'private',
|
|
61
|
+
tags: e.tags || [],
|
|
62
|
+
session_id: e.session_id,
|
|
63
|
+
})),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
// Search memory
|
|
67
|
+
async search(query, limit = 10, filter) {
|
|
68
|
+
const params = new URLSearchParams({ q: query, limit: limit.toString() });
|
|
69
|
+
if (filter?.tag)
|
|
70
|
+
params.set('tag', filter.tag);
|
|
71
|
+
if (filter?.session)
|
|
72
|
+
params.set('session', filter.session);
|
|
73
|
+
const res = await this.request('GET', `/search?${params}`);
|
|
74
|
+
return res.results;
|
|
75
|
+
}
|
|
76
|
+
// Create new session/thread
|
|
77
|
+
async createThread(title) {
|
|
78
|
+
const res = await this.request('POST', '/threads/new', { title });
|
|
79
|
+
return res.session;
|
|
80
|
+
}
|
|
81
|
+
// Create checkpoint
|
|
82
|
+
async createCheckpoint(params) {
|
|
83
|
+
const res = await this.request('POST', '/checkpoints', params);
|
|
84
|
+
return res.checkpoint;
|
|
85
|
+
}
|
|
86
|
+
// Export context
|
|
87
|
+
async exportContext(intent, session) {
|
|
88
|
+
const params = new URLSearchParams();
|
|
89
|
+
if (intent)
|
|
90
|
+
params.set('q', intent);
|
|
91
|
+
if (session)
|
|
92
|
+
params.set('session', session);
|
|
93
|
+
const query = params.toString();
|
|
94
|
+
const res = await this.request('GET', `/export/context${query ? '?' + query : ''}`);
|
|
95
|
+
return res.packet;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function createClient(config) {
|
|
99
|
+
return new YuiHubClient(config);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Error Definitions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* MCP Error Codes:
|
|
6
|
+
* -32001: Unauthorized (401)
|
|
7
|
+
* -32002: Backend not reachable
|
|
8
|
+
* -32003: Rate limited (429)
|
|
9
|
+
* -32602: Invalid params (400)
|
|
10
|
+
* -32603: Internal error (500)
|
|
11
|
+
*/
|
|
12
|
+
export declare class YuiHubMCPError extends Error {
|
|
13
|
+
readonly code: number;
|
|
14
|
+
readonly data?: unknown;
|
|
15
|
+
constructor(code: number, message: string, data?: unknown);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Convert any error to MCP-compatible error
|
|
19
|
+
*/
|
|
20
|
+
export declare function toMCPError(error: unknown): YuiHubMCPError;
|
|
21
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEnB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO;CAM1D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAUzD"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Error Definitions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* MCP Error Codes:
|
|
6
|
+
* -32001: Unauthorized (401)
|
|
7
|
+
* -32002: Backend not reachable
|
|
8
|
+
* -32003: Rate limited (429)
|
|
9
|
+
* -32602: Invalid params (400)
|
|
10
|
+
* -32603: Internal error (500)
|
|
11
|
+
*/
|
|
12
|
+
export class YuiHubMCPError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
data;
|
|
15
|
+
constructor(code, message, data) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'YuiHubMCPError';
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.data = data;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Convert any error to MCP-compatible error
|
|
24
|
+
*/
|
|
25
|
+
export function toMCPError(error) {
|
|
26
|
+
if (error instanceof YuiHubMCPError) {
|
|
27
|
+
return error;
|
|
28
|
+
}
|
|
29
|
+
if (error instanceof Error) {
|
|
30
|
+
return new YuiHubMCPError(-32603, error.message);
|
|
31
|
+
}
|
|
32
|
+
return new YuiHubMCPError(-32603, String(error));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAS;IACb,IAAI,CAAW;IAE/B,YAAY,IAAY,EAAE,OAAe,EAAE,IAAc;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* YuiHub MCP Server - Stdio Entry Point
|
|
4
|
+
* For Claude Desktop, VS Code Copilot, etc.
|
|
5
|
+
*/
|
|
6
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
|
+
import { createServer } from './server.js';
|
|
8
|
+
async function main() {
|
|
9
|
+
const { server } = createServer();
|
|
10
|
+
const transport = new StdioServerTransport();
|
|
11
|
+
await server.connect(transport);
|
|
12
|
+
// Handle shutdown
|
|
13
|
+
process.on('SIGINT', async () => {
|
|
14
|
+
await server.close();
|
|
15
|
+
process.exit(0);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
main().catch((error) => {
|
|
19
|
+
console.error('Failed to start MCP server:', error);
|
|
20
|
+
process.exit(1);
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAElC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Resources - Handlers
|
|
3
|
+
* yuihub://recent, yuihub://session/{id}, yuihub://system/status
|
|
4
|
+
*/
|
|
5
|
+
import type { YuiHubClient } from '../client.js';
|
|
6
|
+
export declare function handleRecent(client: YuiHubClient): Promise<string>;
|
|
7
|
+
export declare function handleSession(client: YuiHubClient, sessionId: string): Promise<string>;
|
|
8
|
+
export declare function handleSystemStatus(client: YuiHubClient): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAUxE;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW5F;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9E"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Resources - Handlers
|
|
3
|
+
* yuihub://recent, yuihub://session/{id}, yuihub://system/status
|
|
4
|
+
*/
|
|
5
|
+
export async function handleRecent(client) {
|
|
6
|
+
const results = await client.search('', 20);
|
|
7
|
+
if (results.length === 0) {
|
|
8
|
+
return 'No recent memories.';
|
|
9
|
+
}
|
|
10
|
+
return results.map((r, i) => `[${i + 1}] ${r.date}\n${r.text.slice(0, 150)}${r.text.length > 150 ? '...' : ''}`).join('\n\n');
|
|
11
|
+
}
|
|
12
|
+
export async function handleSession(client, sessionId) {
|
|
13
|
+
const results = await client.search('', 50, { session: sessionId });
|
|
14
|
+
if (results.length === 0) {
|
|
15
|
+
return `No entries found for session: ${sessionId}`;
|
|
16
|
+
}
|
|
17
|
+
return `Session: ${sessionId}\nEntries: ${results.length}\n\n` +
|
|
18
|
+
results.map((r, i) => `[${i + 1}] ${r.date}\n${r.text.slice(0, 200)}${r.text.length > 200 ? '...' : ''}`).join('\n\n');
|
|
19
|
+
}
|
|
20
|
+
export async function handleSystemStatus(client) {
|
|
21
|
+
try {
|
|
22
|
+
const health = await client.health();
|
|
23
|
+
return `Status: ${health.status}\nVersion: ${health.version}`;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return `Status: offline\nError: ${error.message}`;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/resources/handlers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB;IACrD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAoB,EAAE,SAAiB;IACzE,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,iCAAiC,SAAS,EAAE,CAAC;IACtD,CAAC;IAED,OAAO,YAAY,SAAS,cAAc,OAAO,CAAC,MAAM,MAAM;QAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAoB;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,OAAO,WAAW,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,2BAA4B,KAAe,CAAC,OAAO,EAAE,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Resources - Registration
|
|
3
|
+
*/
|
|
4
|
+
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import type { YuiHubClient } from '../client.js';
|
|
6
|
+
export declare function registerResources(server: Server, client: YuiHubClient): void;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiE5E"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Resources - Registration
|
|
3
|
+
*/
|
|
4
|
+
import { ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
5
|
+
import { toMCPError } from '../errors.js';
|
|
6
|
+
import { handleRecent, handleSession, handleSystemStatus } from './handlers.js';
|
|
7
|
+
export function registerResources(server, client) {
|
|
8
|
+
// List resources handler
|
|
9
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
10
|
+
return {
|
|
11
|
+
resources: [
|
|
12
|
+
{
|
|
13
|
+
uri: 'yuihub://recent',
|
|
14
|
+
name: 'Recent Memories',
|
|
15
|
+
description: 'Most recent thoughts and entries',
|
|
16
|
+
mimeType: 'text/plain',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
uri: 'yuihub://system/status',
|
|
20
|
+
name: 'System Status',
|
|
21
|
+
description: 'YuiHub backend health status',
|
|
22
|
+
mimeType: 'text/plain',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
// Resource templates for dynamic URIs
|
|
28
|
+
server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => {
|
|
29
|
+
return {
|
|
30
|
+
resourceTemplates: [
|
|
31
|
+
{
|
|
32
|
+
uriTemplate: 'yuihub://session/{id}',
|
|
33
|
+
name: 'Session History',
|
|
34
|
+
description: 'All entries for a specific session',
|
|
35
|
+
mimeType: 'text/plain',
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
// Read resource handler
|
|
41
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
42
|
+
const { uri } = request.params;
|
|
43
|
+
try {
|
|
44
|
+
let content;
|
|
45
|
+
if (uri === 'yuihub://recent') {
|
|
46
|
+
content = await handleRecent(client);
|
|
47
|
+
}
|
|
48
|
+
else if (uri === 'yuihub://system/status') {
|
|
49
|
+
content = await handleSystemStatus(client);
|
|
50
|
+
}
|
|
51
|
+
else if (uri.startsWith('yuihub://session/')) {
|
|
52
|
+
const sessionId = uri.replace('yuihub://session/', '');
|
|
53
|
+
content = await handleSession(client, sessionId);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
throw new Error(`Unknown resource: ${uri}`);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
contents: [{
|
|
60
|
+
uri,
|
|
61
|
+
mimeType: 'text/plain',
|
|
62
|
+
text: content,
|
|
63
|
+
}],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
const mcpError = toMCPError(error);
|
|
68
|
+
throw mcpError;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAoB;IACpE,yBAAyB;IACzB,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO;YACL,SAAS,EAAE;gBACT;oBACE,GAAG,EAAE,iBAAiB;oBACtB,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,kCAAkC;oBAC/C,QAAQ,EAAE,YAAY;iBACvB;gBACD;oBACE,GAAG,EAAE,wBAAwB;oBAC7B,IAAI,EAAE,eAAe;oBACrB,WAAW,EAAE,8BAA8B;oBAC3C,QAAQ,EAAE,YAAY;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,CAAC,iBAAiB,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACtE,OAAO;YACL,iBAAiB,EAAE;gBACjB;oBACE,WAAW,EAAE,uBAAuB;oBACpC,IAAI,EAAE,iBAAiB;oBACvB,WAAW,EAAE,oCAAoC;oBACjD,QAAQ,EAAE,YAAY;iBACvB;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAE/B,IAAI,CAAC;YACH,IAAI,OAAe,CAAC;YAEpB,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;iBAAM,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;gBAC5C,OAAO,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC7C,CAAC;iBAAM,IAAI,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBACvD,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC9C,CAAC;YAED,OAAO;gBACL,QAAQ,EAAE,CAAC;wBACT,GAAG;wBACH,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,OAAO;qBACd,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Core Server Setup
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { YuiHubClient } from './client.js';
|
|
6
|
+
export interface ServerConfig {
|
|
7
|
+
name?: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
dataDir?: string;
|
|
10
|
+
backendUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function createServer(config?: ServerConfig): {
|
|
13
|
+
server: Server;
|
|
14
|
+
client: YuiHubClient;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,YAAY,EAAgB,MAAM,aAAa,CAAC;AAKzD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAoChG"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Server - Core Server Setup
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { createClient } from './client.js';
|
|
6
|
+
import { readTokenSync, getDefaultDataDir } from './auth.js';
|
|
7
|
+
import { registerTools } from './tools/index.js';
|
|
8
|
+
import { registerResources } from './resources/index.js';
|
|
9
|
+
export function createServer(config = {}) {
|
|
10
|
+
const dataDir = config.dataDir || getDefaultDataDir();
|
|
11
|
+
const backendUrl = config.backendUrl || process.env.YUIHUB_API_URL || 'http://localhost:4182';
|
|
12
|
+
// Read token from .token file
|
|
13
|
+
const token = process.env.YUIHUB_TOKEN || readTokenSync(dataDir);
|
|
14
|
+
if (!token) {
|
|
15
|
+
throw new Error(`No auth token found. Make sure YuiHub Backend is running and has created ${dataDir}/.token`);
|
|
16
|
+
}
|
|
17
|
+
// Create HTTP client
|
|
18
|
+
const client = createClient({
|
|
19
|
+
baseUrl: backendUrl,
|
|
20
|
+
token,
|
|
21
|
+
});
|
|
22
|
+
// Create MCP server
|
|
23
|
+
const server = new Server({
|
|
24
|
+
name: config.name || 'yuihub-mcp',
|
|
25
|
+
version: config.version || '1.0.0',
|
|
26
|
+
}, {
|
|
27
|
+
capabilities: {
|
|
28
|
+
tools: {},
|
|
29
|
+
resources: {},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
// Register handlers
|
|
33
|
+
registerTools(server, client);
|
|
34
|
+
registerResources(server, client);
|
|
35
|
+
return { server, client };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAgB,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AASzD,MAAM,UAAU,YAAY,CAAC,SAAuB,EAAE;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,iBAAiB,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAC;IAE9F,8BAA8B;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAEjE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,4EAA4E,OAAO,SAAS,CAAC,CAAC;IAChH,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO,EAAE,UAAU;QACnB,KAAK;KACN,CAAC,CAAC;IAEH,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,YAAY;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;KACnC,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,EAAE;SACd;KACF,CACF,CAAC;IAEF,oBAAoB;IACpB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-server.d.ts","sourceRoot":"","sources":["../src/sse-server.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* YuiHub MCP Server - SSE Entry Point
|
|
4
|
+
* For browser clients
|
|
5
|
+
*/
|
|
6
|
+
import http from 'http';
|
|
7
|
+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
8
|
+
import { createServer } from './server.js';
|
|
9
|
+
const DEFAULT_PORT = 4106;
|
|
10
|
+
const port = parseInt(process.env.YUIHUB_MCP_PORT || String(DEFAULT_PORT), 10);
|
|
11
|
+
const httpServer = http.createServer();
|
|
12
|
+
// Store active transports
|
|
13
|
+
const transports = new Map();
|
|
14
|
+
let connectionId = 0;
|
|
15
|
+
httpServer.on('request', async (req, res) => {
|
|
16
|
+
// CORS headers
|
|
17
|
+
res.setHeader('Access-Control-Allow-Origin', '*');
|
|
18
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
19
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
|
|
20
|
+
if (req.method === 'OPTIONS') {
|
|
21
|
+
res.writeHead(200);
|
|
22
|
+
res.end();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const url = new URL(req.url || '/', `http://localhost:${port}`);
|
|
26
|
+
// SSE endpoint
|
|
27
|
+
if (url.pathname === '/sse' && req.method === 'GET') {
|
|
28
|
+
const id = `conn-${++connectionId}`;
|
|
29
|
+
console.log(`[SSE] New connection: ${id}`);
|
|
30
|
+
const { server } = createServer();
|
|
31
|
+
const transport = new SSEServerTransport('/message', res);
|
|
32
|
+
transports.set(id, transport);
|
|
33
|
+
res.on('close', () => {
|
|
34
|
+
console.log(`[SSE] Connection closed: ${id}`);
|
|
35
|
+
transports.delete(id);
|
|
36
|
+
});
|
|
37
|
+
await server.connect(transport);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Message endpoint for SSE clients
|
|
41
|
+
if (url.pathname === '/message' && req.method === 'POST') {
|
|
42
|
+
let body = '';
|
|
43
|
+
req.on('data', chunk => body += chunk);
|
|
44
|
+
req.on('end', async () => {
|
|
45
|
+
// Find the transport for this session (simplified - uses last transport)
|
|
46
|
+
const transport = Array.from(transports.values()).pop();
|
|
47
|
+
if (transport) {
|
|
48
|
+
// Handle incoming message
|
|
49
|
+
try {
|
|
50
|
+
await transport.handlePostMessage(req, res, body);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('[SSE] Message error:', error);
|
|
54
|
+
res.writeHead(500);
|
|
55
|
+
res.end('Internal error');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
res.writeHead(404);
|
|
60
|
+
res.end('No active connection');
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
// Health check
|
|
66
|
+
if (url.pathname === '/health') {
|
|
67
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
68
|
+
res.end(JSON.stringify({ status: 'ok', connections: transports.size }));
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Not found
|
|
72
|
+
res.writeHead(404);
|
|
73
|
+
res.end('Not Found');
|
|
74
|
+
});
|
|
75
|
+
httpServer.listen(port, () => {
|
|
76
|
+
console.log(`[YuiHub MCP] SSE Server running on http://localhost:${port}`);
|
|
77
|
+
console.log(`[YuiHub MCP] SSE endpoint: http://localhost:${port}/sse`);
|
|
78
|
+
});
|
|
79
|
+
// Handle shutdown
|
|
80
|
+
process.on('SIGINT', () => {
|
|
81
|
+
console.log('[YuiHub MCP] Shutting down...');
|
|
82
|
+
httpServer.close();
|
|
83
|
+
process.exit(0);
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=sse-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-server.js","sourceRoot":"","sources":["../src/sse-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Context Operations
|
|
3
|
+
* fetch_context, create_checkpoint
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { YuiHubClient } from '../client.js';
|
|
7
|
+
export declare const fetchContextSchema: z.ZodObject<{
|
|
8
|
+
intent: z.ZodOptional<z.ZodString>;
|
|
9
|
+
session: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type FetchContextInput = z.infer<typeof fetchContextSchema>;
|
|
12
|
+
export declare function fetchContext(client: YuiHubClient, input: FetchContextInput): Promise<string>;
|
|
13
|
+
export declare const createCheckpointSchema: z.ZodObject<{
|
|
14
|
+
session_id: z.ZodString;
|
|
15
|
+
summary: z.ZodString;
|
|
16
|
+
intent: z.ZodString;
|
|
17
|
+
working_memory: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
18
|
+
entry_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
19
|
+
}, z.core.$strip>;
|
|
20
|
+
export type CreateCheckpointInput = z.infer<typeof createCheckpointSchema>;
|
|
21
|
+
export declare function createCheckpoint(client: YuiHubClient, input: CreateCheckpointInput): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,kBAAkB;;;iBAG7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAalG;AAGD,eAAO,MAAM,sBAAsB;;;;;;iBAMjC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE3E,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAc1G"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Context Operations
|
|
3
|
+
* fetch_context, create_checkpoint
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// --- fetch_context ---
|
|
7
|
+
export const fetchContextSchema = z.object({
|
|
8
|
+
intent: z.string().optional().describe('Current intent/goal for context retrieval'),
|
|
9
|
+
session: z.string().optional().describe('Session ID to get context for'),
|
|
10
|
+
});
|
|
11
|
+
export async function fetchContext(client, input) {
|
|
12
|
+
const packet = await client.exportContext(input.intent, input.session);
|
|
13
|
+
const memories = packet.long_term_memory.map((m, i) => `[${i + 1}] (relevance: ${m.relevance.toFixed(3)})\n${m.text.slice(0, 200)}${m.text.length > 200 ? '...' : ''}`).join('\n\n');
|
|
14
|
+
return `Intent: ${packet.intent}
|
|
15
|
+
Session: ${packet.session_id || 'N/A'}
|
|
16
|
+
Mode: ${packet.meta.mode}
|
|
17
|
+
|
|
18
|
+
Long-term Memory:
|
|
19
|
+
${memories || 'No relevant memories found.'}`;
|
|
20
|
+
}
|
|
21
|
+
// --- create_checkpoint ---
|
|
22
|
+
export const createCheckpointSchema = z.object({
|
|
23
|
+
session_id: z.string().describe('Session ID to checkpoint'),
|
|
24
|
+
summary: z.string().describe('Summary of the decision/conclusion'),
|
|
25
|
+
intent: z.string().describe('Current goal/intent'),
|
|
26
|
+
working_memory: z.record(z.string(), z.unknown()).optional().describe('Current working memory state'),
|
|
27
|
+
entry_ids: z.array(z.string()).optional().describe('Related entry IDs'),
|
|
28
|
+
});
|
|
29
|
+
export async function createCheckpoint(client, input) {
|
|
30
|
+
const checkpoint = await client.createCheckpoint({
|
|
31
|
+
session_id: input.session_id,
|
|
32
|
+
summary: input.summary,
|
|
33
|
+
intent: input.intent,
|
|
34
|
+
working_memory: input.working_memory,
|
|
35
|
+
entry_ids: input.entry_ids,
|
|
36
|
+
});
|
|
37
|
+
return `Created checkpoint:
|
|
38
|
+
ID: ${checkpoint.id}
|
|
39
|
+
Session: ${checkpoint.session_id}
|
|
40
|
+
Intent: ${checkpoint.intent}
|
|
41
|
+
Created: ${checkpoint.created_at}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACnF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;CACzE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB,EAAE,KAAwB;IAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACpD,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAChH,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEf,OAAO,WAAW,MAAM,CAAC,MAAM;WACtB,MAAM,CAAC,UAAU,IAAI,KAAK;QAC7B,MAAM,CAAC,IAAI,CAAC,IAAI;;;EAGtB,QAAQ,IAAI,6BAA6B,EAAE,CAAC;AAC9C,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAClE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IACrG,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CACxE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAoB,EAAE,KAA4B;IACvF,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC;QAC/C,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IAEH,OAAO;MACH,UAAU,CAAC,EAAE;WACR,UAAU,CAAC,UAAU;UACtB,UAAU,CAAC,MAAM;WAChB,UAAU,CAAC,UAAU,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Registration
|
|
3
|
+
* Using Zod v4 native z.toJSONSchema()
|
|
4
|
+
*/
|
|
5
|
+
import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
+
import type { YuiHubClient } from '../client.js';
|
|
7
|
+
export declare function registerTools(server: Server, client: YuiHubClient): void;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AASjD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAwExE"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Registration
|
|
3
|
+
* Using Zod v4 native z.toJSONSchema()
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
import { toMCPError } from '../errors.js';
|
|
8
|
+
import { saveThoughtSchema, saveThought } from './memory.js';
|
|
9
|
+
import { searchMemorySchema, searchMemory } from './memory.js';
|
|
10
|
+
import { startSessionSchema, startSession } from './session.js';
|
|
11
|
+
import { fetchContextSchema, fetchContext } from './context.js';
|
|
12
|
+
import { createCheckpointSchema, createCheckpoint } from './context.js';
|
|
13
|
+
export function registerTools(server, client) {
|
|
14
|
+
// List tools handler
|
|
15
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
16
|
+
return {
|
|
17
|
+
tools: [
|
|
18
|
+
{
|
|
19
|
+
name: 'save_thought',
|
|
20
|
+
description: 'Save a thought, memo, or decision to YuiHub memory',
|
|
21
|
+
inputSchema: z.toJSONSchema(saveThoughtSchema),
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'search_memory',
|
|
25
|
+
description: 'Search past memories using semantic search',
|
|
26
|
+
inputSchema: z.toJSONSchema(searchMemorySchema),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'start_session',
|
|
30
|
+
description: 'Start a new thinking session/thread',
|
|
31
|
+
inputSchema: z.toJSONSchema(startSessionSchema),
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'fetch_context',
|
|
35
|
+
description: 'Fetch context packet for a given intent or session',
|
|
36
|
+
inputSchema: z.toJSONSchema(fetchContextSchema),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'create_checkpoint',
|
|
40
|
+
description: 'Create a decision checkpoint to persist current state',
|
|
41
|
+
inputSchema: z.toJSONSchema(createCheckpointSchema),
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
// Call tool handler
|
|
47
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
48
|
+
const { name, arguments: args } = request.params;
|
|
49
|
+
try {
|
|
50
|
+
let result;
|
|
51
|
+
switch (name) {
|
|
52
|
+
case 'save_thought':
|
|
53
|
+
result = await saveThought(client, saveThoughtSchema.parse(args));
|
|
54
|
+
break;
|
|
55
|
+
case 'search_memory':
|
|
56
|
+
result = await searchMemory(client, searchMemorySchema.parse(args));
|
|
57
|
+
break;
|
|
58
|
+
case 'start_session':
|
|
59
|
+
result = await startSession(client, startSessionSchema.parse(args));
|
|
60
|
+
break;
|
|
61
|
+
case 'fetch_context':
|
|
62
|
+
result = await fetchContext(client, fetchContextSchema.parse(args));
|
|
63
|
+
break;
|
|
64
|
+
case 'create_checkpoint':
|
|
65
|
+
result = await createCheckpoint(client, createCheckpointSchema.parse(args));
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: 'text', text: result }],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
const mcpError = toMCPError(error);
|
|
76
|
+
return {
|
|
77
|
+
content: [{ type: 'text', text: `Error: ${mcpError.message}` }],
|
|
78
|
+
isError: true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Memory Operations
|
|
3
|
+
* save_thought, search_memory
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { YuiHubClient } from '../client.js';
|
|
7
|
+
export declare const saveThoughtSchema: z.ZodObject<{
|
|
8
|
+
text: z.ZodString;
|
|
9
|
+
session_id: z.ZodString;
|
|
10
|
+
tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
11
|
+
mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
12
|
+
private: "private";
|
|
13
|
+
public: "public";
|
|
14
|
+
}>>>;
|
|
15
|
+
}, z.core.$strip>;
|
|
16
|
+
export type SaveThoughtInput = z.infer<typeof saveThoughtSchema>;
|
|
17
|
+
export declare function saveThought(client: YuiHubClient, input: SaveThoughtInput): Promise<string>;
|
|
18
|
+
export declare const searchMemorySchema: z.ZodObject<{
|
|
19
|
+
query: z.ZodString;
|
|
20
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
21
|
+
session: z.ZodOptional<z.ZodString>;
|
|
22
|
+
tag: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export type SearchMemoryInput = z.infer<typeof searchMemorySchema>;
|
|
25
|
+
export declare function searchMemory(client: YuiHubClient, input: SearchMemoryInput): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,iBAAiB;;;;;;;;iBAK5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAShG;AAGD,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAalG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Memory Operations
|
|
3
|
+
* save_thought, search_memory
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// --- save_thought ---
|
|
7
|
+
export const saveThoughtSchema = z.object({
|
|
8
|
+
text: z.string().describe('The thought, memo, or decision to save'),
|
|
9
|
+
session_id: z.string().describe('Session/Thread ID (th-ULID format)'),
|
|
10
|
+
tags: z.array(z.string()).optional().describe('Optional tags'),
|
|
11
|
+
mode: z.enum(['private', 'public']).optional().default('private').describe('Privacy mode'),
|
|
12
|
+
});
|
|
13
|
+
export async function saveThought(client, input) {
|
|
14
|
+
const result = await client.save([{
|
|
15
|
+
text: input.text,
|
|
16
|
+
session_id: input.session_id,
|
|
17
|
+
tags: input.tags,
|
|
18
|
+
mode: input.mode,
|
|
19
|
+
}]);
|
|
20
|
+
return `Saved ${result.count} entry to session ${input.session_id}`;
|
|
21
|
+
}
|
|
22
|
+
// --- search_memory ---
|
|
23
|
+
export const searchMemorySchema = z.object({
|
|
24
|
+
query: z.string().describe('Semantic search query'),
|
|
25
|
+
limit: z.number().optional().default(10).describe('Maximum results'),
|
|
26
|
+
session: z.string().optional().describe('Filter by session ID'),
|
|
27
|
+
tag: z.string().optional().describe('Filter by tag'),
|
|
28
|
+
});
|
|
29
|
+
export async function searchMemory(client, input) {
|
|
30
|
+
const results = await client.search(input.query, input.limit, {
|
|
31
|
+
session: input.session,
|
|
32
|
+
tag: input.tag,
|
|
33
|
+
});
|
|
34
|
+
if (results.length === 0) {
|
|
35
|
+
return 'No results found.';
|
|
36
|
+
}
|
|
37
|
+
return results.map((r, i) => `[${i + 1}] (score: ${r.score.toFixed(3)})\n${r.text.slice(0, 200)}${r.text.length > 200 ? '...' : ''}`).join('\n\n');
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,uBAAuB;AACvB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IACnE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACrE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;CAC3F,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAuB;IAC7E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,CAAC,CAAC,CAAC;IAEJ,OAAO,SAAS,MAAM,CAAC,KAAK,qBAAqB,KAAK,CAAC,UAAU,EAAE,CAAC;AACtE,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACpE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IAC/D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;CACrD,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB,EAAE,KAAwB;IAC/E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;QAC5D,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,KAAK,CAAC,GAAG;KACf,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACxG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Session Operations
|
|
3
|
+
* start_session
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { YuiHubClient } from '../client.js';
|
|
7
|
+
export declare const startSessionSchema: z.ZodObject<{
|
|
8
|
+
title: z.ZodOptional<z.ZodString>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type StartSessionInput = z.infer<typeof startSessionSchema>;
|
|
11
|
+
export declare function startSession(client: YuiHubClient, input: StartSessionInput): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YuiHub MCP Tools - Session Operations
|
|
3
|
+
* start_session
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// --- start_session ---
|
|
7
|
+
export const startSessionSchema = z.object({
|
|
8
|
+
title: z.string().optional().describe('Optional session title'),
|
|
9
|
+
});
|
|
10
|
+
export async function startSession(client, input) {
|
|
11
|
+
const session = await client.createThread(input.title);
|
|
12
|
+
return `Created new session:\nID: ${session.id}\nTitle: ${session.title}\nCreated: ${session.created_at}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/tools/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;CAChE,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB,EAAE,KAAwB;IAC/E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEvD,OAAO,6BAA6B,OAAO,CAAC,EAAE,YAAY,OAAO,CAAC,KAAK,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC;AAC5G,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@yuihub/mcp-server",
|
|
3
|
+
"version": "1.0.0-beta.1",
|
|
4
|
+
"description": "YuiHub MCP Server - Protocol Adapter for Semantic Memory",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/vemikrs/yuihub.git",
|
|
10
|
+
"directory": "apps/v1/mcp-server"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"yuihub",
|
|
14
|
+
"mcp",
|
|
15
|
+
"semantic-memory",
|
|
16
|
+
"ai",
|
|
17
|
+
"agent"
|
|
18
|
+
],
|
|
19
|
+
"bin": {
|
|
20
|
+
"yuihub-mcp": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"exports": {
|
|
23
|
+
".": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc",
|
|
30
|
+
"dev": "tsx watch src/index.ts",
|
|
31
|
+
"dev:stdio": "tsx src/index.ts",
|
|
32
|
+
"dev:sse": "tsx src/sse-server.ts",
|
|
33
|
+
"start": "node dist/index.js",
|
|
34
|
+
"start:sse": "node dist/sse-server.js",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:integration": "vitest run tests/integration",
|
|
37
|
+
"prepublishOnly": "npm run build"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
41
|
+
"@yuihub/core": "workspace:*",
|
|
42
|
+
"zod": "^4.3.5"
|
|
43
|
+
},
|
|
44
|
+
"devDependencies": {
|
|
45
|
+
"@types/node": "^25.0.9",
|
|
46
|
+
"tsx": "^4.21.0",
|
|
47
|
+
"typescript": "^5.9.3",
|
|
48
|
+
"vitest": "^4.0.17"
|
|
49
|
+
}
|
|
50
|
+
}
|