@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.
Files changed (49) hide show
  1. package/dist/auth.d.ts +22 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +48 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/client.d.ts +83 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +101 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/errors.d.ts +21 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +34 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/index.d.ts +7 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +22 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/resources/handlers.d.ts +9 -0
  18. package/dist/resources/handlers.d.ts.map +1 -0
  19. package/dist/resources/handlers.js +29 -0
  20. package/dist/resources/handlers.js.map +1 -0
  21. package/dist/resources/index.d.ts +7 -0
  22. package/dist/resources/index.d.ts.map +1 -0
  23. package/dist/resources/index.js +72 -0
  24. package/dist/resources/index.js.map +1 -0
  25. package/dist/server.d.ts +16 -0
  26. package/dist/server.d.ts.map +1 -0
  27. package/dist/server.js +37 -0
  28. package/dist/server.js.map +1 -0
  29. package/dist/sse-server.d.ts +7 -0
  30. package/dist/sse-server.d.ts.map +1 -0
  31. package/dist/sse-server.js +85 -0
  32. package/dist/sse-server.js.map +1 -0
  33. package/dist/tools/context.d.ts +22 -0
  34. package/dist/tools/context.d.ts.map +1 -0
  35. package/dist/tools/context.js +43 -0
  36. package/dist/tools/context.js.map +1 -0
  37. package/dist/tools/index.d.ts +8 -0
  38. package/dist/tools/index.d.ts.map +1 -0
  39. package/dist/tools/index.js +83 -0
  40. package/dist/tools/index.js.map +1 -0
  41. package/dist/tools/memory.d.ts +26 -0
  42. package/dist/tools/memory.d.ts.map +1 -0
  43. package/dist/tools/memory.js +39 -0
  44. package/dist/tools/memory.js.map +1 -0
  45. package/dist/tools/session.d.ts +12 -0
  46. package/dist/tools/session.d.ts.map +1 -0
  47. package/dist/tools/session.js +14 -0
  48. package/dist/tools/session.js.map +1 -0
  49. 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
@@ -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"}
@@ -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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"}
@@ -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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * YuiHub MCP Server - Stdio Entry Point
4
+ * For Claude Desktop, VS Code Copilot, etc.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * YuiHub MCP Server - SSE Entry Point
4
+ * For browser clients
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=sse-server.d.ts.map
@@ -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
+ }