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 +231 -0
- package/dist/api-client.d.ts +32 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +142 -0
- package/dist/api-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +488 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +109 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +45 -0
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":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,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":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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 @@
|
|
|
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
|
+
}
|