@n24q02m/better-notion-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.
Files changed (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/bin/cli.mjs +117 -0
  4. package/build/scripts/start-server.d.ts +6 -0
  5. package/build/scripts/start-server.d.ts.map +1 -0
  6. package/build/scripts/start-server.js +21 -0
  7. package/build/scripts/start-server.js.map +1 -0
  8. package/build/src/init-server.d.ts +29 -0
  9. package/build/src/init-server.d.ts.map +1 -0
  10. package/build/src/init-server.js +32 -0
  11. package/build/src/init-server.js.map +1 -0
  12. package/build/src/tools/composite/blocks.d.ts +16 -0
  13. package/build/src/tools/composite/blocks.d.ts.map +1 -0
  14. package/build/src/tools/composite/blocks.js +104 -0
  15. package/build/src/tools/composite/blocks.js.map +1 -0
  16. package/build/src/tools/composite/comments.d.ts +16 -0
  17. package/build/src/tools/composite/comments.d.ts.map +1 -0
  18. package/build/src/tools/composite/comments.js +69 -0
  19. package/build/src/tools/composite/comments.js.map +1 -0
  20. package/build/src/tools/composite/content.d.ts +13 -0
  21. package/build/src/tools/composite/content.d.ts.map +1 -0
  22. package/build/src/tools/composite/content.js +50 -0
  23. package/build/src/tools/composite/content.js.map +1 -0
  24. package/build/src/tools/composite/databases.d.ts +33 -0
  25. package/build/src/tools/composite/databases.d.ts.map +1 -0
  26. package/build/src/tools/composite/databases.js +419 -0
  27. package/build/src/tools/composite/databases.js.map +1 -0
  28. package/build/src/tools/composite/pages.d.ts +24 -0
  29. package/build/src/tools/composite/pages.d.ts.map +1 -0
  30. package/build/src/tools/composite/pages.js +316 -0
  31. package/build/src/tools/composite/pages.js.map +1 -0
  32. package/build/src/tools/composite/search.d.ts +23 -0
  33. package/build/src/tools/composite/search.d.ts.map +1 -0
  34. package/build/src/tools/composite/search.js +94 -0
  35. package/build/src/tools/composite/search.js.map +1 -0
  36. package/build/src/tools/composite/users.d.ts +15 -0
  37. package/build/src/tools/composite/users.d.ts.map +1 -0
  38. package/build/src/tools/composite/users.js +93 -0
  39. package/build/src/tools/composite/users.js.map +1 -0
  40. package/build/src/tools/composite/workspace.d.ts +25 -0
  41. package/build/src/tools/composite/workspace.d.ts.map +1 -0
  42. package/build/src/tools/composite/workspace.js +72 -0
  43. package/build/src/tools/composite/workspace.js.map +1 -0
  44. package/build/src/tools/helpers/errors.d.ts +43 -0
  45. package/build/src/tools/helpers/errors.d.ts.map +1 -0
  46. package/build/src/tools/helpers/errors.js +162 -0
  47. package/build/src/tools/helpers/errors.js.map +1 -0
  48. package/build/src/tools/helpers/markdown.d.ts +45 -0
  49. package/build/src/tools/helpers/markdown.d.ts.map +1 -0
  50. package/build/src/tools/helpers/markdown.js +320 -0
  51. package/build/src/tools/helpers/markdown.js.map +1 -0
  52. package/build/src/tools/helpers/pagination.d.ts +42 -0
  53. package/build/src/tools/helpers/pagination.d.ts.map +1 -0
  54. package/build/src/tools/helpers/pagination.js +72 -0
  55. package/build/src/tools/helpers/pagination.js.map +1 -0
  56. package/build/src/tools/helpers/properties.d.ts +10 -0
  57. package/build/src/tools/helpers/properties.d.ts.map +1 -0
  58. package/build/src/tools/helpers/properties.js +57 -0
  59. package/build/src/tools/helpers/properties.js.map +1 -0
  60. package/build/src/tools/helpers/richtext.d.ts +85 -0
  61. package/build/src/tools/helpers/richtext.d.ts.map +1 -0
  62. package/build/src/tools/helpers/richtext.js +146 -0
  63. package/build/src/tools/helpers/richtext.js.map +1 -0
  64. package/build/src/tools/registry.d.ts +10 -0
  65. package/build/src/tools/registry.d.ts.map +1 -0
  66. package/build/src/tools/registry.js +342 -0
  67. package/build/src/tools/registry.js.map +1 -0
  68. package/build/tsconfig.tsbuildinfo +1 -0
  69. package/package.json +71 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Pages Mega Tool
3
+ * All page operations in one unified interface
4
+ */
5
+ import { NotionMCPError, withErrorHandling } from '../helpers/errors.js';
6
+ import { blocksToMarkdown, markdownToBlocks } from '../helpers/markdown.js';
7
+ import { autoPaginate } from '../helpers/pagination.js';
8
+ import { convertToNotionProperties } from '../helpers/properties.js';
9
+ import * as RichText from '../helpers/richtext.js';
10
+ /**
11
+ * Unified pages tool - handles all page operations
12
+ */
13
+ export async function pages(notion, input) {
14
+ return withErrorHandling(async () => {
15
+ switch (input.action) {
16
+ case 'create':
17
+ return await createPage(notion, input);
18
+ case 'get':
19
+ return await getPage(notion, input);
20
+ case 'update':
21
+ return await updatePage(notion, input);
22
+ case 'archive':
23
+ case 'restore':
24
+ return await archivePage(notion, input);
25
+ case 'duplicate':
26
+ return await duplicatePage(notion, input);
27
+ default:
28
+ throw new NotionMCPError(`Unknown action: ${input.action}`, 'VALIDATION_ERROR', 'Supported actions: create, get, update, archive, restore, move, duplicate');
29
+ }
30
+ })();
31
+ }
32
+ /**
33
+ * Create page with title and content
34
+ * Maps to: POST /v1/pages + PATCH /v1/blocks/{id}/children
35
+ */
36
+ async function createPage(notion, input) {
37
+ if (!input.title) {
38
+ throw new NotionMCPError('title is required for create action', 'VALIDATION_ERROR', 'Provide page title');
39
+ }
40
+ if (!input.parent_id) {
41
+ throw new NotionMCPError('parent_id is required for page creation', 'VALIDATION_ERROR', 'Integration tokens cannot create workspace-level pages. Provide parent_id (database or page ID).');
42
+ }
43
+ const normalizedId = input.parent_id.replace(/-/g, '');
44
+ // Auto-detect parent type
45
+ let parent;
46
+ if (input.properties && Object.keys(input.properties).length > 0) {
47
+ parent = { type: 'database_id', database_id: normalizedId };
48
+ }
49
+ else {
50
+ parent = { type: 'page_id', page_id: normalizedId };
51
+ }
52
+ // Prepare properties
53
+ let properties = {};
54
+ if (parent.database_id) {
55
+ properties = convertToNotionProperties(input.properties || {});
56
+ if (!properties.title && !properties.Name && !properties.Title) {
57
+ properties.Name = { title: [RichText.text(input.title)] };
58
+ }
59
+ }
60
+ else {
61
+ properties = { title: { title: [RichText.text(input.title)] } };
62
+ }
63
+ const pageData = { parent, properties };
64
+ if (input.icon)
65
+ pageData.icon = { type: 'emoji', emoji: input.icon };
66
+ if (input.cover)
67
+ pageData.cover = { type: 'external', external: { url: input.cover } };
68
+ const page = await notion.pages.create(pageData);
69
+ // Add content if provided
70
+ if (input.content) {
71
+ const blocks = markdownToBlocks(input.content);
72
+ if (blocks.length > 0) {
73
+ await notion.blocks.children.append({
74
+ block_id: page.id,
75
+ children: blocks
76
+ });
77
+ }
78
+ }
79
+ return {
80
+ action: 'create',
81
+ page_id: page.id,
82
+ url: page.url,
83
+ created: true
84
+ };
85
+ }
86
+ /**
87
+ * Get page with full content as markdown
88
+ * Maps to: GET /v1/pages/{id} + GET /v1/blocks/{id}/children
89
+ */
90
+ async function getPage(notion, input) {
91
+ if (!input.page_id) {
92
+ throw new NotionMCPError('page_id is required for get action', 'VALIDATION_ERROR', 'Provide page_id');
93
+ }
94
+ const page = await notion.pages.retrieve({ page_id: input.page_id });
95
+ // Get all blocks with auto-pagination
96
+ const blocks = await autoPaginate((cursor) => notion.blocks.children.list({
97
+ block_id: input.page_id,
98
+ start_cursor: cursor,
99
+ page_size: 100
100
+ }));
101
+ const markdown = blocksToMarkdown(blocks);
102
+ // Extract properties
103
+ const properties = {};
104
+ for (const [key, prop] of Object.entries(page.properties)) {
105
+ const p = prop;
106
+ if (p.type === 'title' && p.title) {
107
+ properties[key] = p.title.map((t) => t.plain_text).join('');
108
+ }
109
+ else if (p.type === 'rich_text' && p.rich_text) {
110
+ properties[key] = p.rich_text.map((t) => t.plain_text).join('');
111
+ }
112
+ else if (p.type === 'select' && p.select) {
113
+ properties[key] = p.select.name;
114
+ }
115
+ else if (p.type === 'multi_select' && p.multi_select) {
116
+ properties[key] = p.multi_select.map((s) => s.name);
117
+ }
118
+ else if (p.type === 'number') {
119
+ properties[key] = p.number;
120
+ }
121
+ else if (p.type === 'checkbox') {
122
+ properties[key] = p.checkbox;
123
+ }
124
+ else if (p.type === 'url') {
125
+ properties[key] = p.url;
126
+ }
127
+ else if (p.type === 'email') {
128
+ properties[key] = p.email;
129
+ }
130
+ else if (p.type === 'phone_number') {
131
+ properties[key] = p.phone_number;
132
+ }
133
+ else if (p.type === 'date' && p.date) {
134
+ properties[key] = p.date.start + (p.date.end ? ` to ${p.date.end}` : '');
135
+ }
136
+ }
137
+ return {
138
+ action: 'get',
139
+ page_id: page.id,
140
+ url: page.url,
141
+ created_time: page.created_time,
142
+ last_edited_time: page.last_edited_time,
143
+ archived: page.archived,
144
+ properties,
145
+ content: markdown,
146
+ block_count: blocks.length
147
+ };
148
+ }
149
+ /**
150
+ * Update page content/properties
151
+ * Maps to: PATCH /v1/pages/{id} + PATCH /v1/blocks/{id}/children
152
+ */
153
+ async function updatePage(notion, input) {
154
+ if (!input.page_id) {
155
+ throw new NotionMCPError('page_id is required for update action', 'VALIDATION_ERROR', 'Provide page_id');
156
+ }
157
+ const updates = {};
158
+ // Update metadata
159
+ if (input.icon)
160
+ updates.icon = { type: 'emoji', emoji: input.icon };
161
+ if (input.cover)
162
+ updates.cover = { type: 'external', external: { url: input.cover } };
163
+ if (input.archived !== undefined)
164
+ updates.archived = input.archived;
165
+ // Update properties
166
+ if (input.properties || input.title) {
167
+ updates.properties = {};
168
+ if (input.title) {
169
+ updates.properties.title = { title: [RichText.text(input.title)] };
170
+ }
171
+ if (input.properties) {
172
+ const converted = convertToNotionProperties(input.properties);
173
+ updates.properties = { ...updates.properties, ...converted };
174
+ }
175
+ }
176
+ // Update page if we have metadata/property changes
177
+ if (Object.keys(updates).length > 0) {
178
+ await notion.pages.update({
179
+ page_id: input.page_id,
180
+ ...updates
181
+ });
182
+ }
183
+ // Handle content updates
184
+ if (input.content || input.append_content || input.prepend_content) {
185
+ if (input.content) {
186
+ // Replace all content
187
+ const existingBlocks = await autoPaginate((cursor) => notion.blocks.children.list({
188
+ block_id: input.page_id,
189
+ start_cursor: cursor,
190
+ page_size: 100
191
+ }));
192
+ for (const block of existingBlocks) {
193
+ await notion.blocks.delete({ block_id: block.id });
194
+ }
195
+ const newBlocks = markdownToBlocks(input.content);
196
+ if (newBlocks.length > 0) {
197
+ await notion.blocks.children.append({
198
+ block_id: input.page_id,
199
+ children: newBlocks
200
+ });
201
+ }
202
+ }
203
+ else if (input.append_content) {
204
+ const blocks = markdownToBlocks(input.append_content);
205
+ if (blocks.length > 0) {
206
+ await notion.blocks.children.append({
207
+ block_id: input.page_id,
208
+ children: blocks
209
+ });
210
+ }
211
+ }
212
+ else if (input.prepend_content) {
213
+ const existingBlocks = await autoPaginate((cursor) => notion.blocks.children.list({
214
+ block_id: input.page_id,
215
+ start_cursor: cursor,
216
+ page_size: 1
217
+ }));
218
+ const newBlocks = markdownToBlocks(input.prepend_content);
219
+ if (newBlocks.length > 0) {
220
+ const firstBlockId = existingBlocks[0]?.id;
221
+ if (firstBlockId) {
222
+ await notion.blocks.children.append({
223
+ block_id: input.page_id,
224
+ children: newBlocks,
225
+ after: undefined
226
+ });
227
+ }
228
+ else {
229
+ await notion.blocks.children.append({
230
+ block_id: input.page_id,
231
+ children: newBlocks
232
+ });
233
+ }
234
+ }
235
+ }
236
+ }
237
+ return {
238
+ action: 'update',
239
+ page_id: input.page_id,
240
+ updated: true
241
+ };
242
+ }
243
+ /**
244
+ * Archive or restore page
245
+ * Maps to: PATCH /v1/pages/{id}
246
+ */
247
+ async function archivePage(notion, input) {
248
+ const pageIds = input.page_ids || (input.page_id ? [input.page_id] : []);
249
+ if (pageIds.length === 0) {
250
+ throw new NotionMCPError('page_id or page_ids required', 'VALIDATION_ERROR', 'Provide at least one page ID');
251
+ }
252
+ const archived = input.action === 'archive';
253
+ const results = [];
254
+ for (const pageId of pageIds) {
255
+ await notion.pages.update({
256
+ page_id: pageId,
257
+ archived
258
+ });
259
+ results.push({ page_id: pageId, archived });
260
+ }
261
+ return {
262
+ action: input.action,
263
+ processed: results.length,
264
+ results
265
+ };
266
+ }
267
+ /**
268
+ * Move page to new parent
269
+ * Maps to: PATCH /v1/pages/{id}
270
+ */
271
+ /**
272
+ * Duplicate page
273
+ * Maps to: GET /v1/pages/{id} + POST /v1/pages + GET/PATCH /v1/blocks
274
+ */
275
+ async function duplicatePage(notion, input) {
276
+ const pageIds = input.page_ids || (input.page_id ? [input.page_id] : []);
277
+ if (pageIds.length === 0) {
278
+ throw new NotionMCPError('page_id or page_ids required', 'VALIDATION_ERROR', 'Provide at least one page ID');
279
+ }
280
+ const results = [];
281
+ for (const pageId of pageIds) {
282
+ // Get original page
283
+ const originalPage = await notion.pages.retrieve({ page_id: pageId });
284
+ // Get original content
285
+ const originalBlocks = await autoPaginate((cursor) => notion.blocks.children.list({
286
+ block_id: pageId,
287
+ start_cursor: cursor,
288
+ page_size: 100
289
+ }));
290
+ // Create duplicate
291
+ const duplicatePage = await notion.pages.create({
292
+ parent: originalPage.parent,
293
+ properties: originalPage.properties,
294
+ icon: originalPage.icon,
295
+ cover: originalPage.cover
296
+ });
297
+ // Copy content
298
+ if (originalBlocks.length > 0) {
299
+ await notion.blocks.children.append({
300
+ block_id: duplicatePage.id,
301
+ children: originalBlocks
302
+ });
303
+ }
304
+ results.push({
305
+ original_id: pageId,
306
+ duplicate_id: duplicatePage.id,
307
+ url: duplicatePage.url
308
+ });
309
+ }
310
+ return {
311
+ action: 'duplicate',
312
+ processed: results.length,
313
+ results
314
+ };
315
+ }
316
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../../../src/tools/composite/pages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Search Composite Tool
3
+ * Smart context-aware search across workspace
4
+ */
5
+ import { Client } from '@notionhq/client';
6
+ export interface SearchSmartInput {
7
+ query: string;
8
+ filter?: {
9
+ object?: 'page' | 'database';
10
+ property?: string;
11
+ value?: any;
12
+ };
13
+ sort?: {
14
+ direction: 'ascending' | 'descending';
15
+ timestamp: 'last_edited_time' | 'created_time';
16
+ };
17
+ limit?: number;
18
+ }
19
+ /**
20
+ * Smart search with context-aware ranking
21
+ */
22
+ export declare function searchSmart(notion: Client, input: SearchSmartInput): Promise<any>;
23
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIzC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,CAAC,EAAE,GAAG,CAAA;KACZ,CAAA;IACD,IAAI,CAAC,EAAE;QACL,SAAS,EAAE,WAAW,GAAG,YAAY,CAAA;QACrC,SAAS,EAAE,kBAAkB,GAAG,cAAc,CAAA;KAC/C,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,GAAG,CAAC,CAmDd"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Search Composite Tool
3
+ * Smart context-aware search across workspace
4
+ */
5
+ import { withErrorHandling } from '../helpers/errors.js';
6
+ import * as RichText from '../helpers/richtext.js';
7
+ /**
8
+ * Smart search with context-aware ranking
9
+ */
10
+ export async function searchSmart(notion, input) {
11
+ return withErrorHandling(async () => {
12
+ const searchParams = {
13
+ query: input.query,
14
+ page_size: Math.min(input.limit || 100, 100)
15
+ };
16
+ if (input.filter) {
17
+ searchParams.filter = input.filter;
18
+ }
19
+ if (input.sort) {
20
+ searchParams.sort = input.sort;
21
+ }
22
+ const response = await notion.search(searchParams);
23
+ const results = response.results.map((item) => {
24
+ if (item.object === 'page') {
25
+ return {
26
+ type: 'page',
27
+ id: item.id,
28
+ url: item.url,
29
+ title: extractTitle(item),
30
+ created_time: item.created_time,
31
+ last_edited_time: item.last_edited_time,
32
+ archived: item.archived,
33
+ parent: formatParent(item.parent)
34
+ };
35
+ }
36
+ else if (item.object === 'database') {
37
+ return {
38
+ type: 'database',
39
+ id: item.id,
40
+ url: item.url,
41
+ title: extractDatabaseTitle(item),
42
+ created_time: item.created_time,
43
+ last_edited_time: item.last_edited_time,
44
+ archived: item.archived,
45
+ description: item.description
46
+ };
47
+ }
48
+ return item;
49
+ });
50
+ return {
51
+ query: input.query,
52
+ total_results: results.length,
53
+ has_more: response.has_more,
54
+ results
55
+ };
56
+ })();
57
+ }
58
+ /**
59
+ * Extract title from page
60
+ */
61
+ function extractTitle(page) {
62
+ if (!page.properties)
63
+ return 'Untitled';
64
+ const titleProp = Object.values(page.properties).find((prop) => prop.type === 'title');
65
+ if (titleProp && titleProp.title && titleProp.title.length > 0) {
66
+ return RichText.extractPlainText(titleProp.title);
67
+ }
68
+ return 'Untitled';
69
+ }
70
+ /**
71
+ * Extract database title
72
+ */
73
+ function extractDatabaseTitle(database) {
74
+ if (database.title && database.title.length > 0) {
75
+ return RichText.extractPlainText(database.title);
76
+ }
77
+ return 'Untitled Database';
78
+ }
79
+ /**
80
+ * Format parent information
81
+ */
82
+ function formatParent(parent) {
83
+ if (parent.type === 'workspace') {
84
+ return { type: 'workspace' };
85
+ }
86
+ else if (parent.type === 'page_id') {
87
+ return { type: 'page', id: parent.page_id };
88
+ }
89
+ else if (parent.type === 'database_id') {
90
+ return { type: 'database', id: parent.database_id };
91
+ }
92
+ return parent;
93
+ }
94
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/tools/composite/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Users Mega Tool
3
+ * All user operations in one unified interface
4
+ */
5
+ import { Client } from '@notionhq/client';
6
+ export interface UsersInput {
7
+ action: 'list' | 'get' | 'me' | 'from_workspace';
8
+ user_id?: string;
9
+ }
10
+ /**
11
+ * Unified users tool
12
+ * Maps to: GET /v1/users and GET /v1/users/{id} and GET /v1/users/me
13
+ */
14
+ export declare function users(notion: Client, input: UsersInput): Promise<any>;
15
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/users.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIzC,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,gBAAgB,CAAA;IAChD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,GAAG,CAAC,CAmGd"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Users Mega Tool
3
+ * All user operations in one unified interface
4
+ */
5
+ import { NotionMCPError, withErrorHandling } from '../helpers/errors.js';
6
+ import { autoPaginate } from '../helpers/pagination.js';
7
+ /**
8
+ * Unified users tool
9
+ * Maps to: GET /v1/users and GET /v1/users/{id} and GET /v1/users/me
10
+ */
11
+ export async function users(notion, input) {
12
+ return withErrorHandling(async () => {
13
+ switch (input.action) {
14
+ case 'list': {
15
+ const usersList = await autoPaginate((cursor) => notion.users.list({
16
+ start_cursor: cursor,
17
+ page_size: 100
18
+ }));
19
+ return {
20
+ action: 'list',
21
+ total: usersList.length,
22
+ users: usersList.map((user) => ({
23
+ id: user.id,
24
+ type: user.type,
25
+ name: user.name || 'Unknown',
26
+ avatar_url: user.avatar_url,
27
+ email: user.type === 'person' ? user.person?.email : undefined
28
+ }))
29
+ };
30
+ }
31
+ case 'get': {
32
+ if (!input.user_id) {
33
+ throw new NotionMCPError('user_id required for get action', 'VALIDATION_ERROR', 'Provide user_id');
34
+ }
35
+ const user = await notion.users.retrieve({ user_id: input.user_id });
36
+ return {
37
+ action: 'get',
38
+ id: user.id,
39
+ type: user.type,
40
+ name: user.name || 'Unknown',
41
+ avatar_url: user.avatar_url,
42
+ email: user.type === 'person' ? user.person?.email : undefined
43
+ };
44
+ }
45
+ case 'me': {
46
+ const botUser = await notion.users.retrieve({ user_id: 'me' });
47
+ return {
48
+ action: 'me',
49
+ id: botUser.id,
50
+ type: botUser.type,
51
+ name: botUser.name || 'Bot',
52
+ bot: botUser.bot
53
+ };
54
+ }
55
+ case 'from_workspace': {
56
+ // Alternative method: Search pages and extract user info from metadata
57
+ // This bypasses the permission issue with direct users.list() call
58
+ const searchResults = await notion.search({
59
+ filter: { property: 'object', value: 'page' },
60
+ page_size: 100
61
+ });
62
+ const usersMap = new Map();
63
+ for (const page of searchResults.results) {
64
+ // Extract users from created_by and last_edited_by
65
+ if (page.created_by) {
66
+ usersMap.set(page.created_by.id, {
67
+ id: page.created_by.id,
68
+ type: page.created_by.object,
69
+ source: 'page_metadata'
70
+ });
71
+ }
72
+ if (page.last_edited_by) {
73
+ usersMap.set(page.last_edited_by.id, {
74
+ id: page.last_edited_by.id,
75
+ type: page.last_edited_by.object,
76
+ source: 'page_metadata'
77
+ });
78
+ }
79
+ }
80
+ const users = Array.from(usersMap.values());
81
+ return {
82
+ action: 'from_workspace',
83
+ total: users.length,
84
+ users,
85
+ note: 'Users extracted from accessible pages. Use "me" action for bot info, or share more pages for more users.'
86
+ };
87
+ }
88
+ default:
89
+ throw new NotionMCPError(`Unknown action: ${input.action}`, 'VALIDATION_ERROR', 'Supported actions: list, get, me, from_workspace');
90
+ }
91
+ })();
92
+ }
93
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../../../src/tools/composite/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Workspace Mega Tool
3
+ * Workspace exploration and info
4
+ */
5
+ import { Client } from '@notionhq/client';
6
+ export interface WorkspaceInput {
7
+ action: 'info' | 'search';
8
+ query?: string;
9
+ filter?: {
10
+ object?: 'page' | 'data_source';
11
+ property?: string;
12
+ value?: any;
13
+ };
14
+ sort?: {
15
+ direction?: 'ascending' | 'descending';
16
+ timestamp?: 'last_edited_time' | 'created_time';
17
+ };
18
+ limit?: number;
19
+ }
20
+ /**
21
+ * Unified workspace tool
22
+ * Maps to: GET /v1/users/me and POST /v1/search
23
+ */
24
+ export declare function workspace(notion: Client, input: WorkspaceInput): Promise<any>;
25
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../../src/tools/composite/workspace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIzC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAA;IAGzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAAA;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,CAAC,EAAE,GAAG,CAAA;KACZ,CAAA;IACD,IAAI,CAAC,EAAE;QACL,SAAS,CAAC,EAAE,WAAW,GAAG,YAAY,CAAA;QACtC,SAAS,CAAC,EAAE,kBAAkB,GAAG,cAAc,CAAA;KAChD,CAAA;IACD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,GAAG,CAAC,CA2Ed"}