@m2ai-mcp/notion-mcp 0.1.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 (60) hide show
  1. package/.env.example +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +228 -0
  4. package/dist/index.d.ts +10 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +374 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/tools/blocks.d.ts +43 -0
  9. package/dist/tools/blocks.d.ts.map +1 -0
  10. package/dist/tools/blocks.js +124 -0
  11. package/dist/tools/blocks.js.map +1 -0
  12. package/dist/tools/databases.d.ts +71 -0
  13. package/dist/tools/databases.d.ts.map +1 -0
  14. package/dist/tools/databases.js +121 -0
  15. package/dist/tools/databases.js.map +1 -0
  16. package/dist/tools/index.d.ts +9 -0
  17. package/dist/tools/index.d.ts.map +1 -0
  18. package/dist/tools/index.js +9 -0
  19. package/dist/tools/index.js.map +1 -0
  20. package/dist/tools/pages.d.ts +72 -0
  21. package/dist/tools/pages.d.ts.map +1 -0
  22. package/dist/tools/pages.js +153 -0
  23. package/dist/tools/pages.js.map +1 -0
  24. package/dist/tools/search.d.ts +28 -0
  25. package/dist/tools/search.d.ts.map +1 -0
  26. package/dist/tools/search.js +62 -0
  27. package/dist/tools/search.js.map +1 -0
  28. package/dist/tools/users.d.ts +33 -0
  29. package/dist/tools/users.d.ts.map +1 -0
  30. package/dist/tools/users.js +51 -0
  31. package/dist/tools/users.js.map +1 -0
  32. package/dist/utils/markdown-converter.d.ts +31 -0
  33. package/dist/utils/markdown-converter.d.ts.map +1 -0
  34. package/dist/utils/markdown-converter.js +355 -0
  35. package/dist/utils/markdown-converter.js.map +1 -0
  36. package/dist/utils/notion-client.d.ts +32 -0
  37. package/dist/utils/notion-client.d.ts.map +1 -0
  38. package/dist/utils/notion-client.js +111 -0
  39. package/dist/utils/notion-client.js.map +1 -0
  40. package/dist/utils/types.d.ts +212 -0
  41. package/dist/utils/types.d.ts.map +1 -0
  42. package/dist/utils/types.js +18 -0
  43. package/dist/utils/types.js.map +1 -0
  44. package/jest.config.cjs +33 -0
  45. package/package.json +53 -0
  46. package/server.json +92 -0
  47. package/src/index.ts +435 -0
  48. package/src/tools/blocks.ts +184 -0
  49. package/src/tools/databases.ts +216 -0
  50. package/src/tools/index.ts +9 -0
  51. package/src/tools/pages.ts +253 -0
  52. package/src/tools/search.ts +96 -0
  53. package/src/tools/users.ts +93 -0
  54. package/src/utils/markdown-converter.ts +408 -0
  55. package/src/utils/notion-client.ts +159 -0
  56. package/src/utils/types.ts +237 -0
  57. package/tests/markdown-converter.test.ts +252 -0
  58. package/tests/notion-client.test.ts +67 -0
  59. package/tests/tools.test.ts +448 -0
  60. package/tsconfig.json +20 -0
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Block Tools
3
+ * append_blocks, update_block, delete_block
4
+ */
5
+ import { NotionClient } from '../utils/notion-client.js';
6
+ export interface AppendBlocksParams {
7
+ parent_id: string;
8
+ content: string;
9
+ }
10
+ export interface AppendBlocksResult {
11
+ success: boolean;
12
+ blocks?: {
13
+ id: string;
14
+ type: string;
15
+ }[];
16
+ block_count?: number;
17
+ error?: string;
18
+ }
19
+ export declare function appendBlocks(client: NotionClient, params: AppendBlocksParams): Promise<AppendBlocksResult>;
20
+ export interface UpdateBlockParams {
21
+ block_id: string;
22
+ content: string;
23
+ }
24
+ export interface UpdateBlockResult {
25
+ success: boolean;
26
+ block?: {
27
+ id: string;
28
+ type: string;
29
+ last_edited_time: string;
30
+ };
31
+ error?: string;
32
+ }
33
+ export declare function updateBlock(client: NotionClient, params: UpdateBlockParams): Promise<UpdateBlockResult>;
34
+ export interface DeleteBlockParams {
35
+ block_id: string;
36
+ }
37
+ export interface DeleteBlockResult {
38
+ success: boolean;
39
+ deleted_id?: string;
40
+ error?: string;
41
+ }
42
+ export declare function deleteBlock(client: NotionClient, params: DeleteBlockParams): Promise<DeleteBlockResult>;
43
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,2BAA2B,CAAC;AAK1E,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,EAAE,CAAC;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAkChH;AAGD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4E7G;AAGD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB7G"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Block Tools
3
+ * append_blocks, update_block, delete_block
4
+ */
5
+ import { extractNotionId } from '../utils/notion-client.js';
6
+ import { markdownToBlocks } from '../utils/markdown-converter.js';
7
+ export async function appendBlocks(client, params) {
8
+ const { parent_id, content } = params;
9
+ const parentId = extractNotionId(parent_id);
10
+ // Convert markdown content to Notion blocks
11
+ const blocks = markdownToBlocks(content);
12
+ if (blocks.length === 0) {
13
+ return {
14
+ success: false,
15
+ error: 'No valid content to append'
16
+ };
17
+ }
18
+ const response = await client.patch(`/blocks/${parentId}/children`, { children: blocks });
19
+ if (!response.success || !response.data) {
20
+ return {
21
+ success: false,
22
+ error: response.error || 'Failed to append blocks'
23
+ };
24
+ }
25
+ return {
26
+ success: true,
27
+ blocks: response.data.results.map(block => ({
28
+ id: block.id,
29
+ type: block.type
30
+ })),
31
+ block_count: response.data.results.length
32
+ };
33
+ }
34
+ export async function updateBlock(client, params) {
35
+ const { block_id, content } = params;
36
+ const blockId = extractNotionId(block_id);
37
+ // First, get the current block to determine its type
38
+ const getResponse = await client.get(`/blocks/${blockId}`);
39
+ if (!getResponse.success || !getResponse.data) {
40
+ return {
41
+ success: false,
42
+ error: getResponse.error || 'Failed to get block for update'
43
+ };
44
+ }
45
+ const currentBlock = getResponse.data;
46
+ const blockType = currentBlock.type;
47
+ // Convert the new content to a block and extract the content part
48
+ const newBlocks = markdownToBlocks(content);
49
+ if (newBlocks.length === 0) {
50
+ return {
51
+ success: false,
52
+ error: 'Invalid content provided'
53
+ };
54
+ }
55
+ // Use the first block's content for the update
56
+ const newBlock = newBlocks[0];
57
+ // Build update body based on block type
58
+ const updateBody = {};
59
+ // Handle common block types
60
+ if (blockType === 'paragraph' && newBlock.type === 'paragraph') {
61
+ updateBody.paragraph = newBlock.paragraph;
62
+ }
63
+ else if (blockType === 'heading_1' && newBlock.type === 'heading_1') {
64
+ updateBody.heading_1 = newBlock.heading_1;
65
+ }
66
+ else if (blockType === 'heading_2' && newBlock.type === 'heading_2') {
67
+ updateBody.heading_2 = newBlock.heading_2;
68
+ }
69
+ else if (blockType === 'heading_3' && newBlock.type === 'heading_3') {
70
+ updateBody.heading_3 = newBlock.heading_3;
71
+ }
72
+ else if (blockType === 'bulleted_list_item' && newBlock.type === 'bulleted_list_item') {
73
+ updateBody.bulleted_list_item = newBlock.bulleted_list_item;
74
+ }
75
+ else if (blockType === 'numbered_list_item' && newBlock.type === 'numbered_list_item') {
76
+ updateBody.numbered_list_item = newBlock.numbered_list_item;
77
+ }
78
+ else if (blockType === 'to_do' && newBlock.type === 'to_do') {
79
+ updateBody.to_do = newBlock.to_do;
80
+ }
81
+ else if (blockType === 'quote' && newBlock.type === 'quote') {
82
+ updateBody.quote = newBlock.quote;
83
+ }
84
+ else if (blockType === 'code' && newBlock.type === 'code') {
85
+ updateBody.code = newBlock.code;
86
+ }
87
+ else {
88
+ // For type mismatch or unsupported types, update as paragraph with rich text
89
+ updateBody[blockType] = {
90
+ rich_text: [{ type: 'text', text: { content } }]
91
+ };
92
+ }
93
+ const response = await client.patch(`/blocks/${blockId}`, updateBody);
94
+ if (!response.success || !response.data) {
95
+ return {
96
+ success: false,
97
+ error: response.error || 'Failed to update block'
98
+ };
99
+ }
100
+ return {
101
+ success: true,
102
+ block: {
103
+ id: response.data.id,
104
+ type: response.data.type,
105
+ last_edited_time: response.data.last_edited_time
106
+ }
107
+ };
108
+ }
109
+ export async function deleteBlock(client, params) {
110
+ const { block_id } = params;
111
+ const blockId = extractNotionId(block_id);
112
+ const response = await client.delete(`/blocks/${blockId}`);
113
+ if (!response.success) {
114
+ return {
115
+ success: false,
116
+ error: response.error || 'Failed to delete block'
117
+ };
118
+ }
119
+ return {
120
+ success: true,
121
+ deleted_id: blockId
122
+ };
123
+ }
124
+ //# sourceMappingURL=blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/tools/blocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Database Tools
3
+ * get_database, query_database, create_database
4
+ */
5
+ import { NotionClient } from '../utils/notion-client.js';
6
+ import { NotionFilter, NotionSort } from '../utils/types.js';
7
+ export interface GetDatabaseParams {
8
+ database_id: string;
9
+ }
10
+ export interface GetDatabaseResult {
11
+ success: boolean;
12
+ database?: {
13
+ id: string;
14
+ title: string;
15
+ description: string;
16
+ url: string;
17
+ created_time: string;
18
+ last_edited_time: string;
19
+ properties: Record<string, {
20
+ id: string;
21
+ name: string;
22
+ type: string;
23
+ }>;
24
+ is_inline: boolean;
25
+ archived: boolean;
26
+ };
27
+ error?: string;
28
+ }
29
+ export declare function getDatabase(client: NotionClient, params: GetDatabaseParams): Promise<GetDatabaseResult>;
30
+ export interface QueryDatabaseParams {
31
+ database_id: string;
32
+ filter?: NotionFilter;
33
+ sorts?: NotionSort[];
34
+ page_size?: number;
35
+ }
36
+ export interface QueryDatabaseResult {
37
+ success: boolean;
38
+ pages?: {
39
+ id: string;
40
+ title: string;
41
+ url: string;
42
+ created_time: string;
43
+ last_edited_time: string;
44
+ properties: Record<string, unknown>;
45
+ }[];
46
+ total_count?: number;
47
+ has_more?: boolean;
48
+ next_cursor?: string | null;
49
+ error?: string;
50
+ }
51
+ export declare function queryDatabase(client: NotionClient, params: QueryDatabaseParams): Promise<QueryDatabaseResult>;
52
+ export interface CreateDatabaseParams {
53
+ parent_page_id: string;
54
+ title: string;
55
+ properties: Record<string, DatabasePropertySchema>;
56
+ }
57
+ export interface DatabasePropertySchema {
58
+ type: string;
59
+ [key: string]: unknown;
60
+ }
61
+ export interface CreateDatabaseResult {
62
+ success: boolean;
63
+ database?: {
64
+ id: string;
65
+ title: string;
66
+ url: string;
67
+ };
68
+ error?: string;
69
+ }
70
+ export declare function createDatabase(client: NotionClient, params: CreateDatabaseParams): Promise<CreateDatabaseResult>;
71
+ //# sourceMappingURL=databases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../../src/tools/databases.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAiF,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG5I,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YACzB,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;SACd,CAAC,CAAC;QACH,SAAS,EAAE,OAAO,CAAC;QACnB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAqC7G;AAGD,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,EAAE,CAAC;IACJ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4CnH;AAGD,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmDtH"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Database Tools
3
+ * get_database, query_database, create_database
4
+ */
5
+ import { extractNotionId } from '../utils/notion-client.js';
6
+ import { getPageTitle, getDatabaseTitle } from '../utils/types.js';
7
+ export async function getDatabase(client, params) {
8
+ const databaseId = extractNotionId(params.database_id);
9
+ const response = await client.get(`/databases/${databaseId}`);
10
+ if (!response.success || !response.data) {
11
+ return {
12
+ success: false,
13
+ error: response.error || 'Failed to get database'
14
+ };
15
+ }
16
+ const db = response.data;
17
+ // Simplify properties schema
18
+ const properties = {};
19
+ for (const [name, prop] of Object.entries(db.properties)) {
20
+ properties[name] = {
21
+ id: prop.id,
22
+ name: prop.name,
23
+ type: prop.type
24
+ };
25
+ }
26
+ return {
27
+ success: true,
28
+ database: {
29
+ id: db.id,
30
+ title: getDatabaseTitle(db),
31
+ description: db.description.map(d => d.plain_text || d.text?.content || '').join(''),
32
+ url: db.url,
33
+ created_time: db.created_time,
34
+ last_edited_time: db.last_edited_time,
35
+ properties,
36
+ is_inline: db.is_inline,
37
+ archived: db.archived
38
+ }
39
+ };
40
+ }
41
+ export async function queryDatabase(client, params) {
42
+ const { database_id, filter, sorts, page_size = 100 } = params;
43
+ const databaseId = extractNotionId(database_id);
44
+ const requestBody = {
45
+ page_size: Math.min(Math.max(page_size, 1), 100)
46
+ };
47
+ if (filter) {
48
+ requestBody.filter = filter;
49
+ }
50
+ if (sorts && sorts.length > 0) {
51
+ requestBody.sorts = sorts;
52
+ }
53
+ const response = await client.post(`/databases/${databaseId}/query`, requestBody);
54
+ if (!response.success || !response.data) {
55
+ return {
56
+ success: false,
57
+ error: response.error || 'Failed to query database'
58
+ };
59
+ }
60
+ const pages = response.data.results.map(page => ({
61
+ id: page.id,
62
+ title: getPageTitle(page),
63
+ url: page.url,
64
+ created_time: page.created_time,
65
+ last_edited_time: page.last_edited_time,
66
+ properties: page.properties
67
+ }));
68
+ return {
69
+ success: true,
70
+ pages,
71
+ total_count: pages.length,
72
+ has_more: response.data.has_more,
73
+ next_cursor: response.data.next_cursor
74
+ };
75
+ }
76
+ export async function createDatabase(client, params) {
77
+ const { parent_page_id, title, properties } = params;
78
+ const pageId = extractNotionId(parent_page_id);
79
+ // Ensure there's at least a title property
80
+ const dbProperties = { ...properties };
81
+ // Every database needs a title property
82
+ let hasTitleProperty = false;
83
+ for (const prop of Object.values(dbProperties)) {
84
+ if (prop.type === 'title') {
85
+ hasTitleProperty = true;
86
+ break;
87
+ }
88
+ }
89
+ if (!hasTitleProperty) {
90
+ dbProperties['Name'] = { title: {} };
91
+ }
92
+ const requestBody = {
93
+ parent: {
94
+ type: 'page_id',
95
+ page_id: pageId
96
+ },
97
+ title: [
98
+ {
99
+ type: 'text',
100
+ text: { content: title }
101
+ }
102
+ ],
103
+ properties: dbProperties
104
+ };
105
+ const response = await client.post('/databases', requestBody);
106
+ if (!response.success || !response.data) {
107
+ return {
108
+ success: false,
109
+ error: response.error || 'Failed to create database'
110
+ };
111
+ }
112
+ return {
113
+ success: true,
114
+ database: {
115
+ id: response.data.id,
116
+ title: getDatabaseTitle(response.data),
117
+ url: response.data.url
118
+ }
119
+ };
120
+ }
121
+ //# sourceMappingURL=databases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databases.js","sourceRoot":"","sources":["../../src/tools/databases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool Exports
3
+ */
4
+ export * from './search.js';
5
+ export * from './pages.js';
6
+ export * from './blocks.js';
7
+ export * from './databases.js';
8
+ export * from './users.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Tool Exports
3
+ */
4
+ export * from './search.js';
5
+ export * from './pages.js';
6
+ export * from './blocks.js';
7
+ export * from './databases.js';
8
+ export * from './users.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Page Tools
3
+ * get_page, create_page, update_page, get_page_content
4
+ */
5
+ import { NotionClient } from '../utils/notion-client.js';
6
+ export interface GetPageParams {
7
+ page_id: string;
8
+ }
9
+ export interface GetPageResult {
10
+ success: boolean;
11
+ page?: {
12
+ id: string;
13
+ title: string;
14
+ url: string;
15
+ created_time: string;
16
+ last_edited_time: string;
17
+ archived: boolean;
18
+ properties: Record<string, unknown>;
19
+ parent: {
20
+ type: string;
21
+ id?: string;
22
+ };
23
+ };
24
+ error?: string;
25
+ }
26
+ export declare function getPage(client: NotionClient, params: GetPageParams): Promise<GetPageResult>;
27
+ export interface CreatePageParams {
28
+ parent_id: string;
29
+ parent_type: 'database_id' | 'page_id';
30
+ title: string;
31
+ properties?: Record<string, unknown>;
32
+ content?: string;
33
+ }
34
+ export interface CreatePageResult {
35
+ success: boolean;
36
+ page?: {
37
+ id: string;
38
+ url: string;
39
+ title: string;
40
+ };
41
+ error?: string;
42
+ }
43
+ export declare function createPage(client: NotionClient, params: CreatePageParams): Promise<CreatePageResult>;
44
+ export interface UpdatePageParams {
45
+ page_id: string;
46
+ properties: Record<string, unknown>;
47
+ archived?: boolean;
48
+ }
49
+ export interface UpdatePageResult {
50
+ success: boolean;
51
+ page?: {
52
+ id: string;
53
+ url: string;
54
+ title: string;
55
+ last_edited_time: string;
56
+ };
57
+ error?: string;
58
+ }
59
+ export declare function updatePage(client: NotionClient, params: UpdatePageParams): Promise<UpdatePageResult>;
60
+ export interface GetPageContentParams {
61
+ page_id: string;
62
+ format?: 'markdown' | 'blocks' | 'plain_text';
63
+ }
64
+ export interface GetPageContentResult {
65
+ success: boolean;
66
+ content?: string | unknown[];
67
+ format?: string;
68
+ block_count?: number;
69
+ error?: string;
70
+ }
71
+ export declare function getPageContent(client: NotionClient, params: GetPageContentParams): Promise<GetPageContentResult>;
72
+ //# sourceMappingURL=pages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["../../src/tools/pages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,2BAA2B,CAAC;AAK1E,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,EAAE,CAAC,EAAE,MAAM,CAAC;SACb,CAAC;KACH,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BjG;AAGD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuD1G;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8B1G;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkDtH"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Page Tools
3
+ * get_page, create_page, update_page, get_page_content
4
+ */
5
+ import { extractNotionId } from '../utils/notion-client.js';
6
+ import { getPageTitle } from '../utils/types.js';
7
+ import { markdownToBlocks, blocksToMarkdown, blocksToPlainText } from '../utils/markdown-converter.js';
8
+ export async function getPage(client, params) {
9
+ const pageId = extractNotionId(params.page_id);
10
+ const response = await client.get(`/pages/${pageId}`);
11
+ if (!response.success || !response.data) {
12
+ return {
13
+ success: false,
14
+ error: response.error || 'Failed to get page'
15
+ };
16
+ }
17
+ const page = response.data;
18
+ return {
19
+ success: true,
20
+ page: {
21
+ id: page.id,
22
+ title: getPageTitle(page),
23
+ url: page.url,
24
+ created_time: page.created_time,
25
+ last_edited_time: page.last_edited_time,
26
+ archived: page.archived,
27
+ properties: page.properties,
28
+ parent: {
29
+ type: page.parent.type,
30
+ id: page.parent.database_id || page.parent.page_id
31
+ }
32
+ }
33
+ };
34
+ }
35
+ export async function createPage(client, params) {
36
+ const { parent_id, parent_type, title, properties = {}, content } = params;
37
+ const parentId = extractNotionId(parent_id);
38
+ // Build parent object
39
+ const parent = {};
40
+ parent[parent_type] = parentId;
41
+ // Build properties - always include title
42
+ const pageProperties = { ...properties };
43
+ // For database parents, title is usually a property called "Name" or "Title"
44
+ // For page parents, we need to set the title via page properties
45
+ if (parent_type === 'database_id') {
46
+ // If no title property is set, try "Name" first, then "Title"
47
+ if (!pageProperties['Name'] && !pageProperties['Title'] && !pageProperties['title']) {
48
+ pageProperties['Name'] = {
49
+ title: [{ type: 'text', text: { content: title } }]
50
+ };
51
+ }
52
+ }
53
+ else {
54
+ // For page parents, set title property
55
+ pageProperties['title'] = {
56
+ title: [{ type: 'text', text: { content: title } }]
57
+ };
58
+ }
59
+ // Build request body
60
+ const requestBody = {
61
+ parent,
62
+ properties: pageProperties
63
+ };
64
+ // Add content as children blocks if provided
65
+ if (content) {
66
+ requestBody.children = markdownToBlocks(content);
67
+ }
68
+ const response = await client.post('/pages', requestBody);
69
+ if (!response.success || !response.data) {
70
+ return {
71
+ success: false,
72
+ error: response.error || 'Failed to create page'
73
+ };
74
+ }
75
+ return {
76
+ success: true,
77
+ page: {
78
+ id: response.data.id,
79
+ url: response.data.url,
80
+ title: getPageTitle(response.data)
81
+ }
82
+ };
83
+ }
84
+ export async function updatePage(client, params) {
85
+ const { page_id, properties, archived } = params;
86
+ const pageId = extractNotionId(page_id);
87
+ const requestBody = {
88
+ properties
89
+ };
90
+ if (archived !== undefined) {
91
+ requestBody.archived = archived;
92
+ }
93
+ const response = await client.patch(`/pages/${pageId}`, requestBody);
94
+ if (!response.success || !response.data) {
95
+ return {
96
+ success: false,
97
+ error: response.error || 'Failed to update page'
98
+ };
99
+ }
100
+ return {
101
+ success: true,
102
+ page: {
103
+ id: response.data.id,
104
+ url: response.data.url,
105
+ title: getPageTitle(response.data),
106
+ last_edited_time: response.data.last_edited_time
107
+ }
108
+ };
109
+ }
110
+ export async function getPageContent(client, params) {
111
+ const { page_id, format = 'markdown' } = params;
112
+ const pageId = extractNotionId(page_id);
113
+ // Fetch all blocks (with pagination)
114
+ const allBlocks = [];
115
+ let cursor;
116
+ let hasMore = true;
117
+ while (hasMore) {
118
+ const endpoint = cursor
119
+ ? `/blocks/${pageId}/children?start_cursor=${cursor}&page_size=100`
120
+ : `/blocks/${pageId}/children?page_size=100`;
121
+ const response = await client.get(endpoint);
122
+ if (!response.success || !response.data) {
123
+ return {
124
+ success: false,
125
+ error: response.error || 'Failed to get page content'
126
+ };
127
+ }
128
+ allBlocks.push(...response.data.results);
129
+ hasMore = response.data.has_more;
130
+ cursor = response.data.next_cursor || undefined;
131
+ }
132
+ // Convert blocks to requested format
133
+ let content;
134
+ switch (format) {
135
+ case 'blocks':
136
+ content = allBlocks;
137
+ break;
138
+ case 'plain_text':
139
+ content = blocksToPlainText(allBlocks);
140
+ break;
141
+ case 'markdown':
142
+ default:
143
+ content = blocksToMarkdown(allBlocks);
144
+ break;
145
+ }
146
+ return {
147
+ success: true,
148
+ content,
149
+ format,
150
+ block_count: allBlocks.length
151
+ };
152
+ }
153
+ //# sourceMappingURL=pages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pages.js","sourceRoot":"","sources":["../../src/tools/pages.ts"],"names":[],"mappings":"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"}