nlook-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,231 @@
1
+ # nlook-mcp-server
2
+
3
+ NLook MCP (Model Context Protocol) Server for Claude Desktop and other AI tools.
4
+
5
+ ## Overview
6
+
7
+ This MCP server enables AI assistants like Claude to directly interact with your NLook account, allowing you to:
8
+
9
+ - Save AI-generated content as documents
10
+ - Manage your task/todo list
11
+ - Search and retrieve existing documents
12
+ - Update and delete content
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install -g nlook-mcp-server
18
+ ```
19
+
20
+ Or use with npx (recommended):
21
+
22
+ ```bash
23
+ npx nlook-mcp-server
24
+ ```
25
+
26
+ ## Setup
27
+
28
+ ### 1. Get Your API Key
29
+
30
+ 1. Go to [NLook Settings](https://nlook.me/settings?tab=integrations)
31
+ 2. Navigate to **API Key Management**
32
+ 3. Click **Create New API Key**
33
+ 4. Set permissions (read, write, delete)
34
+ 5. Copy and save the API key (shown only once!)
35
+
36
+ ### 2. Configure Claude Desktop
37
+
38
+ Edit your Claude Desktop configuration file:
39
+
40
+ - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
41
+ - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
42
+
43
+ Add the NLook server:
44
+
45
+ ```json
46
+ {
47
+ "mcpServers": {
48
+ "nlook": {
49
+ "command": "npx",
50
+ "args": ["-y", "nlook-mcp-server"],
51
+ "env": {
52
+ "NLOOK_API_KEY": "your-api-key-here"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ ```
58
+
59
+ ### 3. Restart Claude Desktop
60
+
61
+ After saving the configuration, restart Claude Desktop to load the NLook MCP server.
62
+
63
+ ## Available Tools
64
+
65
+ ### Documents
66
+
67
+ | Tool | Description |
68
+ |------|-------------|
69
+ | `create_document` | Save a new document to NLook |
70
+ | `list_documents` | Get a list of documents with optional search/filter |
71
+ | `get_document` | Get full content of a specific document |
72
+ | `update_document` | Update an existing document |
73
+ | `delete_document` | Delete a document |
74
+
75
+ ### Tasks
76
+
77
+ | Tool | Description |
78
+ |------|-------------|
79
+ | `create_task` | Create a new task/todo |
80
+ | `list_tasks` | Get a list of tasks with optional filters |
81
+ | `update_task` | Update task details or status |
82
+ | `delete_task` | Delete a task |
83
+ | `complete_task` | Mark a task as completed |
84
+
85
+ ### Task Lists
86
+
87
+ | Tool | Description |
88
+ |------|-------------|
89
+ | `list_task_lists` | Get all task lists |
90
+ | `create_task_list` | Create a new task list |
91
+
92
+ ### Google Drive
93
+
94
+ | Tool | Description |
95
+ |------|-------------|
96
+ | `upload_to_google_drive` | Upload a local file to your connected Google Drive |
97
+
98
+ > **Note**: Google Drive integration requires connecting your Google Drive account in NLook settings first. See [Prerequisites](#google-drive-prerequisites) for setup instructions.
99
+
100
+ ## Usage Examples
101
+
102
+ ### Saving Content
103
+
104
+ ```
105
+ Save this meeting notes to NLook:
106
+
107
+ # Team Meeting - December 2024
108
+
109
+ ## Attendees
110
+ - Alice
111
+ - Bob
112
+
113
+ ## Discussion
114
+ - Project timeline review
115
+ - Resource allocation
116
+
117
+ ## Action Items
118
+ 1. Alice: Update documentation
119
+ 2. Bob: Review pull requests
120
+ ```
121
+
122
+ ### Managing Tasks
123
+
124
+ ```
125
+ Add a task to NLook:
126
+ - Title: Review quarterly report
127
+ - Priority: high
128
+ - Due: tomorrow
129
+ ```
130
+
131
+ ```
132
+ Show me my pending tasks in NLook
133
+ ```
134
+
135
+ ```
136
+ Mark task #123 as completed in NLook
137
+ ```
138
+
139
+ ### Uploading Files to Google Drive
140
+
141
+ ```
142
+ Upload this image to Google Drive:
143
+ /Users/username/Downloads/screenshot.png
144
+ ```
145
+
146
+ ```
147
+ Save this file to my Google Drive: /path/to/document.pdf
148
+ ```
149
+
150
+ ### Searching Documents
151
+
152
+ ```
153
+ Find all documents tagged with "meeting" in NLook
154
+ ```
155
+
156
+ ```
157
+ Get the document with ID 456 from NLook
158
+ ```
159
+
160
+ ## Environment Variables
161
+
162
+ | Variable | Required | Description |
163
+ |----------|----------|-------------|
164
+ | `NLOOK_API_KEY` | Yes | Your NLook API key |
165
+ | `NLOOK_API_URL` | No | Custom API URL (default: https://nlook.me) |
166
+
167
+ ## Google Drive Prerequisites
168
+
169
+ To use the Google Drive upload feature:
170
+
171
+ 1. Go to [NLook Settings](https://nlook.me/settings?tab=integrations)
172
+ 2. Find **Google Drive** in the integrations section
173
+ 3. Click **Connect** and authorize NLook to access your Google Drive
174
+ 4. Once connected, you can upload files through the MCP server
175
+
176
+ Uploaded files will be stored in a folder named `nlook` in your Google Drive.
177
+
178
+ ## Troubleshooting
179
+
180
+ ### "Invalid API key" error
181
+
182
+ - Verify your API key is correct
183
+ - Check the key is still active in NLook settings
184
+ - Ensure the key hasn't expired
185
+
186
+ ### "Permission denied" error
187
+
188
+ - Check your API key has the required permissions (read/write/delete)
189
+ - Create a new key with appropriate permissions if needed
190
+
191
+ ### Server not appearing in Claude
192
+
193
+ - Ensure configuration file is valid JSON
194
+ - Check the path to the configuration file is correct
195
+ - Restart Claude Desktop after changes
196
+
197
+ ### "Google Drive integration required" error
198
+
199
+ - Connect your Google Drive in [NLook Settings](https://nlook.me/settings?tab=integrations)
200
+ - Ensure the connection is still active (re-authorize if needed)
201
+ - Check that your API key has write permissions
202
+
203
+ ### "Google Drive reconnection required" error
204
+
205
+ - Your Google Drive authorization has expired
206
+ - Go to [NLook Settings](https://nlook.me/settings?tab=integrations) and reconnect Google Drive
207
+
208
+ ## Development
209
+
210
+ ```bash
211
+ # Clone the repository
212
+ git clone https://github.com/nlook-service/nlook.git
213
+ cd nlook/packages/mcp-server
214
+
215
+ # Install dependencies
216
+ npm install
217
+
218
+ # Build
219
+ npm run build
220
+
221
+ # Run locally
222
+ NLOOK_API_KEY=your-key npm start
223
+ ```
224
+
225
+ ## License
226
+
227
+ MIT
228
+
229
+ ## Support
230
+
231
+ - [GitHub Issues](https://github.com/nlook-service/nlook/issues)
@@ -0,0 +1,32 @@
1
+ import type { Document, CreateDocumentRequest, UpdateDocumentRequest, Task, CreateTaskRequest, UpdateTaskRequest, TaskList, CreateTaskListRequest, APIResponse, ListResponse, TaskListResponse, TaskListsResponse, GoogleDriveUploadResponse } from './types.js';
2
+ export declare class NLookAPIClient {
3
+ private baseURL;
4
+ private apiKey;
5
+ constructor(apiKey: string, baseURL?: string);
6
+ private request;
7
+ createDocument(data: CreateDocumentRequest): Promise<APIResponse<Document>>;
8
+ listDocuments(params?: {
9
+ limit?: number;
10
+ offset?: number;
11
+ search?: string;
12
+ tags?: string[];
13
+ }): Promise<ListResponse<Document>>;
14
+ getDocument(id: number): Promise<APIResponse<Document>>;
15
+ updateDocument(id: number, data: UpdateDocumentRequest): Promise<APIResponse<Document>>;
16
+ deleteDocument(id: number): Promise<APIResponse<void>>;
17
+ createTask(data: CreateTaskRequest): Promise<APIResponse<Task>>;
18
+ listTasks(params?: {
19
+ limit?: number;
20
+ offset?: number;
21
+ status?: string;
22
+ priority?: string;
23
+ task_list_id?: number;
24
+ }): Promise<TaskListResponse>;
25
+ getTask(id: number): Promise<APIResponse<Task>>;
26
+ updateTask(id: number, data: UpdateTaskRequest): Promise<APIResponse<Task>>;
27
+ deleteTask(id: number): Promise<APIResponse<void>>;
28
+ listTaskLists(): Promise<TaskListsResponse>;
29
+ createTaskList(data: CreateTaskListRequest): Promise<APIResponse<TaskList>>;
30
+ uploadToGoogleDrive(filePath: string): Promise<GoogleDriveUploadResponse>;
31
+ }
32
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,qBAAqB,EACrB,qBAAqB,EACrB,IAAI,EACJ,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAIpB,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAA2B;YAKlD,OAAO;IAwBf,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAO3E,aAAa,CAAC,MAAM,CAAC,EAAE;QAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAW7B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAIvD,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAOvF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAOtD,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAO/D,SAAS,CAAC,MAAM,CAAC,EAAE;QACvB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAYvB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAI/C,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAO3E,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAOlD,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI3C,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAQ3E,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAuChF"}
@@ -0,0 +1,142 @@
1
+ import { readFileSync } from 'fs';
2
+ import { basename } from 'path';
3
+ export class NLookAPIClient {
4
+ baseURL;
5
+ apiKey;
6
+ constructor(apiKey, baseURL = 'https://nlook.me') {
7
+ this.apiKey = apiKey;
8
+ this.baseURL = baseURL;
9
+ }
10
+ async request(endpoint, options = {}) {
11
+ const url = `${this.baseURL}${endpoint}`;
12
+ const response = await fetch(url, {
13
+ ...options,
14
+ headers: {
15
+ 'Authorization': `Bearer ${this.apiKey}`,
16
+ 'Content-Type': 'application/json',
17
+ ...options.headers,
18
+ },
19
+ });
20
+ if (!response.ok) {
21
+ const errorBody = await response.json().catch(() => ({}));
22
+ throw new Error(errorBody.error || `API request failed: ${response.status}`);
23
+ }
24
+ return response.json();
25
+ }
26
+ // Document APIs
27
+ async createDocument(data) {
28
+ return this.request('/api/v1/public/documents', {
29
+ method: 'POST',
30
+ body: JSON.stringify(data),
31
+ });
32
+ }
33
+ async listDocuments(params) {
34
+ const searchParams = new URLSearchParams();
35
+ if (params?.limit)
36
+ searchParams.set('limit', String(params.limit));
37
+ if (params?.offset)
38
+ searchParams.set('offset', String(params.offset));
39
+ if (params?.search)
40
+ searchParams.set('search', params.search);
41
+ if (params?.tags?.length)
42
+ searchParams.set('tags', params.tags.join(','));
43
+ const query = searchParams.toString();
44
+ return this.request(`/api/v1/public/documents${query ? `?${query}` : ''}`);
45
+ }
46
+ async getDocument(id) {
47
+ return this.request(`/api/v1/public/documents/${id}`);
48
+ }
49
+ async updateDocument(id, data) {
50
+ return this.request(`/api/v1/public/documents/${id}`, {
51
+ method: 'PUT',
52
+ body: JSON.stringify(data),
53
+ });
54
+ }
55
+ async deleteDocument(id) {
56
+ return this.request(`/api/v1/public/documents/${id}`, {
57
+ method: 'DELETE',
58
+ });
59
+ }
60
+ // Task APIs
61
+ async createTask(data) {
62
+ return this.request('/api/v1/public/tasks', {
63
+ method: 'POST',
64
+ body: JSON.stringify(data),
65
+ });
66
+ }
67
+ async listTasks(params) {
68
+ const searchParams = new URLSearchParams();
69
+ if (params?.limit)
70
+ searchParams.set('limit', String(params.limit));
71
+ if (params?.offset)
72
+ searchParams.set('offset', String(params.offset));
73
+ if (params?.status)
74
+ searchParams.set('status', params.status);
75
+ if (params?.priority)
76
+ searchParams.set('priority', params.priority);
77
+ if (params?.task_list_id)
78
+ searchParams.set('task_list_id', String(params.task_list_id));
79
+ const query = searchParams.toString();
80
+ return this.request(`/api/v1/public/tasks${query ? `?${query}` : ''}`);
81
+ }
82
+ async getTask(id) {
83
+ return this.request(`/api/v1/public/tasks/${id}`);
84
+ }
85
+ async updateTask(id, data) {
86
+ return this.request(`/api/v1/public/tasks/${id}`, {
87
+ method: 'PUT',
88
+ body: JSON.stringify(data),
89
+ });
90
+ }
91
+ async deleteTask(id) {
92
+ return this.request(`/api/v1/public/tasks/${id}`, {
93
+ method: 'DELETE',
94
+ });
95
+ }
96
+ // Task List APIs
97
+ async listTaskLists() {
98
+ return this.request('/api/v1/public/task-lists');
99
+ }
100
+ async createTaskList(data) {
101
+ return this.request('/api/v1/public/task-lists', {
102
+ method: 'POST',
103
+ body: JSON.stringify(data),
104
+ });
105
+ }
106
+ // Google Drive APIs
107
+ async uploadToGoogleDrive(filePath) {
108
+ const url = `${this.baseURL}/api/v1/public/google-drive/upload`;
109
+ // Read file from local path
110
+ const fileBuffer = readFileSync(filePath);
111
+ const fileName = basename(filePath);
112
+ // Create FormData for multipart upload
113
+ const formData = new FormData();
114
+ const blob = new Blob([fileBuffer]);
115
+ formData.append('file', blob, fileName);
116
+ formData.append('fileName', fileName);
117
+ const response = await fetch(url, {
118
+ method: 'POST',
119
+ headers: {
120
+ 'Authorization': `Bearer ${this.apiKey}`,
121
+ },
122
+ body: formData,
123
+ });
124
+ if (!response.ok) {
125
+ const errorBody = await response.json().catch(() => ({}));
126
+ return {
127
+ success: false,
128
+ error: errorBody.error || errorBody.message || `Upload failed: ${response.status}`,
129
+ };
130
+ }
131
+ const data = await response.json();
132
+ return {
133
+ success: true,
134
+ data: {
135
+ url: data.url || '',
136
+ file_id: data.file_id || '',
137
+ file_name: data.file_name || fileName,
138
+ },
139
+ };
140
+ }
141
+ }
142
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../src/api-client.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,OAAO,cAAc;IACjB,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAc,EAAE,UAAkB,kBAAkB;QAC9D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,QAAgB,EAChB,UAAuB,EAAE;QAEzB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;QAEzC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;gBACxC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAuB,CAAC;YAChF,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,IAAI,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,cAAc,CAAC,IAA2B;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAKnB;QACC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,MAAM,EAAE,KAAK;YAAE,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,MAAM,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1E,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,IAA2B;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,EAAE;YACpD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,EAAE;YACpD,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,UAAU,CAAC,IAAuB;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAMf;QACC,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAC;QAC3C,IAAI,MAAM,EAAE,KAAK;YAAE,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,IAAI,MAAM,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,QAAQ;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,MAAM,EAAE,YAAY;YAAE,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QAExF,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC,OAAO,CAAC,uBAAuB,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,IAAuB;QAClD,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,EAAE;YAChD,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAA2B;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;YAC/C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,oCAAoC,CAAC;QAEhE,4BAA4B;QAC5B,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEpC,uCAAuC;QACvC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACpC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACzC;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAyC,CAAC;YAClG,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,OAAO,IAAI,kBAAkB,QAAQ,CAAC,MAAM,EAAE;aACnF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA4D,CAAC;QAC7F,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE;gBACJ,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ;aACtC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,488 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { z } from 'zod';
5
+ import { NLookAPIClient } from './api-client.js';
6
+ // Get API key from environment
7
+ const apiKey = process.env.NLOOK_API_KEY;
8
+ const baseURL = process.env.NLOOK_API_URL || 'https://nlook.me';
9
+ if (!apiKey) {
10
+ console.error('Error: NLOOK_API_KEY environment variable is required');
11
+ process.exit(1);
12
+ }
13
+ // Initialize API client
14
+ const client = new NLookAPIClient(apiKey, baseURL);
15
+ // Create MCP server
16
+ const server = new McpServer({
17
+ name: 'nlook',
18
+ version: '1.0.0',
19
+ });
20
+ // ============================================================
21
+ // Document Tools
22
+ // ============================================================
23
+ // Create Document
24
+ server.tool('create_document', 'Save a new document to NLook. Use this to save notes, meeting memos, ideas, or any text content.', {
25
+ title: z.string().describe('Document title'),
26
+ content: z.string().describe('Document content in HTML format'),
27
+ tags: z.array(z.string()).optional().describe('Optional tags for categorization'),
28
+ is_public: z.boolean().optional().describe('Whether the document is public (default: false)'),
29
+ }, async ({ title, content, tags, is_public }) => {
30
+ try {
31
+ const result = await client.createDocument({
32
+ title,
33
+ content,
34
+ tags,
35
+ is_public,
36
+ });
37
+ if (result.success && result.data) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `Document saved successfully!\n\nID: ${result.data.id}\nTitle: ${result.data.title}\nTags: ${result.data.tags?.join(', ') || 'None'}\nURL: https://nlook.me/documents/${result.data.id}`,
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ else {
48
+ return {
49
+ content: [{ type: 'text', text: `Failed to save document: ${result.error}` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ }
54
+ catch (error) {
55
+ return {
56
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
57
+ isError: true,
58
+ };
59
+ }
60
+ });
61
+ // List Documents
62
+ server.tool('list_documents', 'Get a list of documents from NLook. Use this to search or browse your saved documents.', {
63
+ limit: z.number().optional().describe('Maximum number of documents to return (default: 10)'),
64
+ search: z.string().optional().describe('Search query to filter documents'),
65
+ tags: z.array(z.string()).optional().describe('Filter by tags'),
66
+ }, async ({ limit, search, tags }) => {
67
+ try {
68
+ const result = await client.listDocuments({
69
+ limit: limit || 10,
70
+ search,
71
+ tags,
72
+ });
73
+ if (result.success) {
74
+ const docs = result.data || [];
75
+ if (docs.length === 0) {
76
+ return {
77
+ content: [{ type: 'text', text: 'No documents found.' }],
78
+ };
79
+ }
80
+ const docList = docs
81
+ .map((doc, i) => `${i + 1}. [${doc.id}] ${doc.title}\n Tags: ${doc.tags?.join(', ') || 'None'}\n Updated: ${doc.updated_at}`)
82
+ .join('\n\n');
83
+ return {
84
+ content: [
85
+ {
86
+ type: 'text',
87
+ text: `Found ${result.total} documents:\n\n${docList}`,
88
+ },
89
+ ],
90
+ };
91
+ }
92
+ else {
93
+ return {
94
+ content: [{ type: 'text', text: 'Failed to list documents' }],
95
+ isError: true,
96
+ };
97
+ }
98
+ }
99
+ catch (error) {
100
+ return {
101
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ // Get Document
107
+ server.tool('get_document', 'Get the full content of a specific document by ID.', {
108
+ id: z.number().describe('Document ID'),
109
+ }, async ({ id }) => {
110
+ try {
111
+ const result = await client.getDocument(id);
112
+ if (result.success && result.data) {
113
+ const doc = result.data;
114
+ return {
115
+ content: [
116
+ {
117
+ type: 'text',
118
+ text: `# ${doc.title}\n\nID: ${doc.id}\nTags: ${doc.tags?.join(', ') || 'None'}\nCreated: ${doc.created_at}\nUpdated: ${doc.updated_at}\n\n---\n\n${doc.content}`,
119
+ },
120
+ ],
121
+ };
122
+ }
123
+ else {
124
+ return {
125
+ content: [{ type: 'text', text: `Document not found: ${result.error}` }],
126
+ isError: true,
127
+ };
128
+ }
129
+ }
130
+ catch (error) {
131
+ return {
132
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
133
+ isError: true,
134
+ };
135
+ }
136
+ });
137
+ // Update Document
138
+ server.tool('update_document', 'Update an existing document in NLook.', {
139
+ id: z.number().describe('Document ID to update'),
140
+ title: z.string().optional().describe('New title'),
141
+ content: z.string().optional().describe('New content in HTML format'),
142
+ tags: z.array(z.string()).optional().describe('New tags'),
143
+ }, async ({ id, title, content, tags }) => {
144
+ try {
145
+ const result = await client.updateDocument(id, { title, content, tags });
146
+ if (result.success && result.data) {
147
+ return {
148
+ content: [
149
+ {
150
+ type: 'text',
151
+ text: `Document updated successfully!\n\nID: ${result.data.id}\nTitle: ${result.data.title}`,
152
+ },
153
+ ],
154
+ };
155
+ }
156
+ else {
157
+ return {
158
+ content: [{ type: 'text', text: `Failed to update document: ${result.error}` }],
159
+ isError: true,
160
+ };
161
+ }
162
+ }
163
+ catch (error) {
164
+ return {
165
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
166
+ isError: true,
167
+ };
168
+ }
169
+ });
170
+ // Delete Document
171
+ server.tool('delete_document', 'Delete a document from NLook. This action is permanent.', {
172
+ id: z.number().describe('Document ID to delete'),
173
+ }, async ({ id }) => {
174
+ try {
175
+ const result = await client.deleteDocument(id);
176
+ if (result.success) {
177
+ return {
178
+ content: [{ type: 'text', text: `Document ${id} deleted successfully.` }],
179
+ };
180
+ }
181
+ else {
182
+ return {
183
+ content: [{ type: 'text', text: `Failed to delete document: ${result.error}` }],
184
+ isError: true,
185
+ };
186
+ }
187
+ }
188
+ catch (error) {
189
+ return {
190
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
191
+ isError: true,
192
+ };
193
+ }
194
+ });
195
+ // ============================================================
196
+ // Task Tools
197
+ // ============================================================
198
+ // Create Task
199
+ server.tool('create_task', 'Create a new task/todo in NLook.', {
200
+ title: z.string().describe('Task title'),
201
+ notes: z.string().optional().describe('Task notes or description'),
202
+ priority: z.enum(['none', 'low', 'medium', 'high']).optional().describe('Task priority'),
203
+ due_date: z.string().optional().describe('Due date in ISO format (e.g., 2024-12-31T23:59:59Z)'),
204
+ task_list_id: z.number().optional().describe('Task list ID to add the task to'),
205
+ }, async ({ title, notes, priority, due_date, task_list_id }) => {
206
+ try {
207
+ const result = await client.createTask({
208
+ title,
209
+ notes,
210
+ priority,
211
+ due_date,
212
+ task_list_id,
213
+ });
214
+ if (result.success && result.data) {
215
+ const task = result.data;
216
+ return {
217
+ content: [
218
+ {
219
+ type: 'text',
220
+ text: `Task created successfully!\n\nID: ${task.id}\nTitle: ${task.title}\nPriority: ${task.priority}\nDue: ${task.due_date || 'Not set'}`,
221
+ },
222
+ ],
223
+ };
224
+ }
225
+ else {
226
+ return {
227
+ content: [{ type: 'text', text: `Failed to create task: ${result.error}` }],
228
+ isError: true,
229
+ };
230
+ }
231
+ }
232
+ catch (error) {
233
+ return {
234
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
235
+ isError: true,
236
+ };
237
+ }
238
+ });
239
+ // List Tasks
240
+ server.tool('list_tasks', 'Get a list of tasks from NLook.', {
241
+ limit: z.number().optional().describe('Maximum number of tasks to return (default: 10)'),
242
+ status: z.enum(['pending', 'in_progress', 'completed']).optional().describe('Filter by status'),
243
+ priority: z.enum(['none', 'low', 'medium', 'high']).optional().describe('Filter by priority'),
244
+ task_list_id: z.number().optional().describe('Filter by task list'),
245
+ }, async ({ limit, status, priority, task_list_id }) => {
246
+ try {
247
+ const result = await client.listTasks({
248
+ limit: limit || 10,
249
+ status,
250
+ priority,
251
+ task_list_id,
252
+ });
253
+ if (!result.success || !result.data) {
254
+ return {
255
+ content: [{ type: 'text', text: result.error || 'Failed to fetch tasks.' }],
256
+ isError: true,
257
+ };
258
+ }
259
+ const tasks = result.data.tasks || [];
260
+ if (tasks.length === 0) {
261
+ return {
262
+ content: [{ type: 'text', text: 'No tasks found.' }],
263
+ };
264
+ }
265
+ const taskList = tasks
266
+ .map((task) => {
267
+ const statusIcon = task.status === 'completed' ? '✅' : task.status === 'in_progress' ? '🔄' : '⬜';
268
+ const priorityIcon = task.priority === 'high' ? '🔴' : task.priority === 'medium' ? '🟡' : task.priority === 'low' ? '🟢' : '';
269
+ return `${statusIcon} ${priorityIcon} [${task.id}] ${task.title}\n Due: ${task.due_date || 'Not set'}`;
270
+ })
271
+ .join('\n\n');
272
+ return {
273
+ content: [
274
+ {
275
+ type: 'text',
276
+ text: `Found ${result.data.total} tasks:\n\n${taskList}`,
277
+ },
278
+ ],
279
+ };
280
+ }
281
+ catch (error) {
282
+ return {
283
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
284
+ isError: true,
285
+ };
286
+ }
287
+ });
288
+ // Update Task
289
+ server.tool('update_task', 'Update an existing task in NLook. Use this to mark tasks as completed or update details.', {
290
+ id: z.number().describe('Task ID to update'),
291
+ title: z.string().optional().describe('New title'),
292
+ notes: z.string().optional().describe('New notes'),
293
+ priority: z.enum(['none', 'low', 'medium', 'high']).optional().describe('New priority'),
294
+ status: z.enum(['pending', 'in_progress', 'completed']).optional().describe('New status'),
295
+ due_date: z.string().optional().describe('New due date'),
296
+ }, async ({ id, title, notes, priority, status, due_date }) => {
297
+ try {
298
+ const result = await client.updateTask(id, { title, notes, priority, status, due_date });
299
+ if (result.success && result.data) {
300
+ const task = result.data;
301
+ return {
302
+ content: [
303
+ {
304
+ type: 'text',
305
+ text: `Task updated successfully!\n\nID: ${task.id}\nTitle: ${task.title}\nStatus: ${task.status}\nPriority: ${task.priority}`,
306
+ },
307
+ ],
308
+ };
309
+ }
310
+ else {
311
+ return {
312
+ content: [{ type: 'text', text: `Failed to update task: ${result.error}` }],
313
+ isError: true,
314
+ };
315
+ }
316
+ }
317
+ catch (error) {
318
+ return {
319
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
320
+ isError: true,
321
+ };
322
+ }
323
+ });
324
+ // Delete Task
325
+ server.tool('delete_task', 'Delete a task from NLook.', {
326
+ id: z.number().describe('Task ID to delete'),
327
+ }, async ({ id }) => {
328
+ try {
329
+ const result = await client.deleteTask(id);
330
+ if (result.success) {
331
+ return {
332
+ content: [{ type: 'text', text: `Task ${id} deleted successfully.` }],
333
+ };
334
+ }
335
+ else {
336
+ return {
337
+ content: [{ type: 'text', text: `Failed to delete task: ${result.error}` }],
338
+ isError: true,
339
+ };
340
+ }
341
+ }
342
+ catch (error) {
343
+ return {
344
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
345
+ isError: true,
346
+ };
347
+ }
348
+ });
349
+ // Complete Task (convenience tool)
350
+ server.tool('complete_task', 'Mark a task as completed.', {
351
+ id: z.number().describe('Task ID to complete'),
352
+ }, async ({ id }) => {
353
+ try {
354
+ const result = await client.updateTask(id, { status: 'completed' });
355
+ if (result.success && result.data) {
356
+ return {
357
+ content: [{ type: 'text', text: `✅ Task "${result.data.title}" marked as completed!` }],
358
+ };
359
+ }
360
+ else {
361
+ return {
362
+ content: [{ type: 'text', text: `Failed to complete task: ${result.error}` }],
363
+ isError: true,
364
+ };
365
+ }
366
+ }
367
+ catch (error) {
368
+ return {
369
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
370
+ isError: true,
371
+ };
372
+ }
373
+ });
374
+ // ============================================================
375
+ // Task List Tools
376
+ // ============================================================
377
+ // List Task Lists
378
+ server.tool('list_task_lists', 'Get all task lists from NLook.', {}, async () => {
379
+ try {
380
+ const result = await client.listTaskLists();
381
+ if (!result.success || !result.data) {
382
+ return {
383
+ content: [{ type: 'text', text: result.error || 'Failed to fetch task lists.' }],
384
+ isError: true,
385
+ };
386
+ }
387
+ const lists = result.data.task_lists || [];
388
+ if (lists.length === 0) {
389
+ return {
390
+ content: [{ type: 'text', text: 'No task lists found.' }],
391
+ };
392
+ }
393
+ const listText = lists
394
+ .map((list) => `[${list.id}] ${list.title} (${list.task_count || 0} tasks)`)
395
+ .join('\n');
396
+ return {
397
+ content: [
398
+ {
399
+ type: 'text',
400
+ text: `Task Lists:\n\n${listText}`,
401
+ },
402
+ ],
403
+ };
404
+ }
405
+ catch (error) {
406
+ return {
407
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
408
+ isError: true,
409
+ };
410
+ }
411
+ });
412
+ // Create Task List
413
+ server.tool('create_task_list', 'Create a new task list in NLook.', {
414
+ name: z.string().describe('Task list name'),
415
+ color: z.string().optional().describe('Task list color (hex code)'),
416
+ }, async ({ name, color }) => {
417
+ try {
418
+ const result = await client.createTaskList({ name, color });
419
+ if (result.success && result.data) {
420
+ return {
421
+ content: [
422
+ {
423
+ type: 'text',
424
+ text: `Task list created!\n\nID: ${result.data.id}\nName: ${result.data.name}`,
425
+ },
426
+ ],
427
+ };
428
+ }
429
+ else {
430
+ return {
431
+ content: [{ type: 'text', text: `Failed to create task list: ${result.error}` }],
432
+ isError: true,
433
+ };
434
+ }
435
+ }
436
+ catch (error) {
437
+ return {
438
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
439
+ isError: true,
440
+ };
441
+ }
442
+ });
443
+ // ============================================================
444
+ // Google Drive Tools
445
+ // ============================================================
446
+ // Upload to Google Drive
447
+ server.tool('upload_to_google_drive', 'Upload a local file to Google Drive connected to NLook. Returns the Google Drive URL of the uploaded file.', {
448
+ file_path: z.string().describe('Absolute path to the local file to upload'),
449
+ }, async ({ file_path }) => {
450
+ try {
451
+ const result = await client.uploadToGoogleDrive(file_path);
452
+ if (result.success && result.data) {
453
+ return {
454
+ content: [
455
+ {
456
+ type: 'text',
457
+ text: `File uploaded to Google Drive successfully!\n\nFile Name: ${result.data.file_name}\nURL: ${result.data.url}\nFile ID: ${result.data.file_id}`,
458
+ },
459
+ ],
460
+ };
461
+ }
462
+ else {
463
+ return {
464
+ content: [{ type: 'text', text: `Failed to upload file: ${result.error}` }],
465
+ isError: true,
466
+ };
467
+ }
468
+ }
469
+ catch (error) {
470
+ return {
471
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : 'Unknown error'}` }],
472
+ isError: true,
473
+ };
474
+ }
475
+ });
476
+ // ============================================================
477
+ // Start Server
478
+ // ============================================================
479
+ async function main() {
480
+ const transport = new StdioServerTransport();
481
+ await server.connect(transport);
482
+ console.error('NLook MCP Server running on stdio');
483
+ }
484
+ main().catch((error) => {
485
+ console.error('Fatal error:', error);
486
+ process.exit(1);
487
+ });
488
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,+BAA+B;AAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;AACzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,kBAAkB,CAAC;AAEhE,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,wBAAwB;AACxB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,+DAA+D;AAC/D,iBAAiB;AACjB,+DAA+D;AAE/D,kBAAkB;AAClB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,kGAAkG,EAClG;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC/D,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IACjF,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;CAC9F,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;YACzC,KAAK;YACL,OAAO;YACP,IAAI;YACJ,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,uCAAuC,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,qCAAqC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE;qBAC/L;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC7E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wFAAwF,EACxF;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC5F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC1E,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAChE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;YACxC,KAAK,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM;YACN,IAAI;SACL,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;iBACzD,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,IAAI;iBACjB,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,CAAC;iBAChI,IAAI,CAAC,MAAM,CAAC,CAAC;YAEhB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,SAAS,MAAM,CAAC,KAAK,kBAAkB,OAAO,EAAE;qBACvD;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;gBAC7D,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oDAAoD,EACpD;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;CACvC,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAE5C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,KAAK,GAAG,CAAC,KAAK,WAAW,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,cAAc,GAAG,CAAC,UAAU,cAAc,GAAG,CAAC,UAAU,cAAc,GAAG,CAAC,OAAO,EAAE;qBAClK;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,uCAAuC,EACvC;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACrE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;CAC1D,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yCAAyC,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;qBAC7F;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,kBAAkB;AAClB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,yDAAyD,EACzD;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;CACjD,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,wBAAwB,EAAE,CAAC;aAC1E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,kCAAkC,EAClC;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACxF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC/F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;CAChF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;YACrC,KAAK;YACL,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qCAAqC,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,KAAK,eAAe,IAAI,CAAC,QAAQ,UAAU,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;qBAC3I;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,aAAa;AACb,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,iCAAiC,EACjC;IACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACxF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC/F,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CACpE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;YACpC,KAAK,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM;YACN,QAAQ;YACR,YAAY;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,wBAAwB,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;aACrD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK;aACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAClG,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/H,OAAO,GAAG,UAAU,IAAI,YAAY,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC3G,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,KAAK,cAAc,QAAQ,EAAE;iBACzD;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,0FAA0F,EAC1F;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IAClD,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;IACvF,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;IACzF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;CACzD,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEzF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,qCAAqC,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,eAAe,IAAI,CAAC,QAAQ,EAAE;qBAC/H;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,cAAc;AACd,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2BAA2B,EAC3B;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;CAC7C,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC;aACtE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2BAA2B,EAC3B;IACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;CAC/C,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAEpE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,MAAM,CAAC,IAAI,CAAC,KAAK,wBAAwB,EAAE,CAAC;aACxF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,4BAA4B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC7E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,kBAAkB;AAClB,+DAA+D;AAE/D,kBAAkB;AAClB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,gCAAgC,EAChC,EAAE,EACF,KAAK,IAAI,EAAE;IACT,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,IAAI,6BAA6B,EAAE,CAAC;gBAChF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC;aAC1D,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK;aACnB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC;aAC3E,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kBAAkB,QAAQ,EAAE;iBACnC;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,mBAAmB;AACnB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,kCAAkC,EAClC;IACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACpE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6BAA6B,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;qBAC/E;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+BAA+B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAChF,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,qBAAqB;AACrB,+DAA+D;AAE/D,yBAAyB;AACzB,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,4GAA4G,EAC5G;IACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;CAC5E,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6DAA6D,MAAM,CAAC,IAAI,CAAC,SAAS,UAAU,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;qBACrJ;iBACF;aACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC;YACvG,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,+DAA+D;AAC/D,eAAe;AACf,+DAA+D;AAE/D,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,109 @@
1
+ export interface Document {
2
+ id: number;
3
+ title: string;
4
+ content: string;
5
+ tags: string[];
6
+ is_public: boolean;
7
+ created_at: string;
8
+ updated_at: string;
9
+ }
10
+ export interface CreateDocumentRequest {
11
+ title: string;
12
+ content: string;
13
+ tags?: string[];
14
+ is_public?: boolean;
15
+ }
16
+ export interface UpdateDocumentRequest {
17
+ title?: string;
18
+ content?: string;
19
+ tags?: string[];
20
+ is_public?: boolean;
21
+ }
22
+ export interface Task {
23
+ id: number;
24
+ title: string;
25
+ notes: string;
26
+ priority: 'none' | 'low' | 'medium' | 'high';
27
+ status: 'pending' | 'in_progress' | 'completed';
28
+ due_date: string | null;
29
+ completed_at: string | null;
30
+ task_list_id: number | null;
31
+ created_at: string;
32
+ updated_at: string;
33
+ }
34
+ export interface CreateTaskRequest {
35
+ title: string;
36
+ notes?: string;
37
+ priority?: 'none' | 'low' | 'medium' | 'high';
38
+ due_date?: string;
39
+ task_list_id?: number;
40
+ }
41
+ export interface UpdateTaskRequest {
42
+ title?: string;
43
+ notes?: string;
44
+ priority?: 'none' | 'low' | 'medium' | 'high';
45
+ status?: 'pending' | 'in_progress' | 'completed';
46
+ due_date?: string;
47
+ task_list_id?: number;
48
+ }
49
+ export interface TaskList {
50
+ id: number;
51
+ title: string;
52
+ name?: string;
53
+ description?: string;
54
+ color: string;
55
+ position: number;
56
+ user_id: number;
57
+ is_default: boolean;
58
+ task_count: number;
59
+ pending_count: number;
60
+ completed_count: number;
61
+ created_at: string;
62
+ updated_at: string;
63
+ }
64
+ export interface CreateTaskListRequest {
65
+ name: string;
66
+ color?: string;
67
+ }
68
+ export interface APIResponse<T> {
69
+ success: boolean;
70
+ data?: T;
71
+ error?: string;
72
+ message?: string;
73
+ }
74
+ export interface ListResponse<T> {
75
+ success: boolean;
76
+ data?: T[];
77
+ total: number;
78
+ }
79
+ export interface TaskListData {
80
+ tasks: Task[];
81
+ total: number;
82
+ page: number;
83
+ limit: number;
84
+ total_pages: number;
85
+ }
86
+ export interface TaskListResponse {
87
+ success: boolean;
88
+ data?: TaskListData;
89
+ error?: string;
90
+ }
91
+ export interface TaskListsData {
92
+ task_lists: TaskList[];
93
+ total: number;
94
+ }
95
+ export interface TaskListsResponse {
96
+ success: boolean;
97
+ data?: TaskListsData;
98
+ error?: string;
99
+ }
100
+ export interface GoogleDriveUploadResponse {
101
+ success: boolean;
102
+ data?: {
103
+ url: string;
104
+ file_id: string;
105
+ file_name: string;
106
+ };
107
+ error?: string;
108
+ }
109
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // NLook API Types
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,kBAAkB"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "nlook-mcp",
3
+ "version": "1.0.0",
4
+ "description": "NLook MCP Server for Claude Desktop and AI tools integration",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "nlook-mcp": "./dist/index.js"
8
+ },
9
+ "type": "module",
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "nlook",
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "claude",
21
+ "ai"
22
+ ],
23
+ "author": "NLook Team",
24
+ "license": "MIT",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/nlook-service/nlook.git",
28
+ "directory": "packages/mcp-server"
29
+ },
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.0.0",
32
+ "zod": "^3.23.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^20.0.0",
36
+ "typescript": "^5.0.0"
37
+ },
38
+ "engines": {
39
+ "node": ">=18.0.0"
40
+ },
41
+ "files": [
42
+ "dist",
43
+ "README.md"
44
+ ]
45
+ }