@atikk-co-jp/notion-mcp-server 0.6.0 → 0.8.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 (135) hide show
  1. package/README.ja.md +1 -0
  2. package/README.md +20 -2
  3. package/dist/src/converters/__tests__/block-to-markdown.test.js +482 -111
  4. package/dist/src/converters/__tests__/markdown-to-blocks.test.js +116 -13
  5. package/dist/src/converters/__tests__/page-to-markdown.test.js +83 -70
  6. package/dist/src/converters/__tests__/rich-text-to-markdown.test.js +23 -26
  7. package/dist/src/converters/block-to-markdown.d.ts +4 -13
  8. package/dist/src/converters/block-to-markdown.d.ts.map +1 -1
  9. package/dist/src/converters/block-to-markdown.js +117 -120
  10. package/dist/src/converters/index.d.ts +3 -3
  11. package/dist/src/converters/index.d.ts.map +1 -1
  12. package/dist/src/converters/index.js +1 -1
  13. package/dist/src/converters/markdown-to-blocks.d.ts +21 -7
  14. package/dist/src/converters/markdown-to-blocks.d.ts.map +1 -1
  15. package/dist/src/converters/markdown-to-blocks.js +56 -0
  16. package/dist/src/converters/page-to-markdown.d.ts +5 -20
  17. package/dist/src/converters/page-to-markdown.d.ts.map +1 -1
  18. package/dist/src/converters/page-to-markdown.js +47 -37
  19. package/dist/src/converters/rich-text-to-markdown.d.ts +3 -47
  20. package/dist/src/converters/rich-text-to-markdown.d.ts.map +1 -1
  21. package/dist/src/converters/rich-text-to-markdown.js +15 -14
  22. package/dist/src/notion-client.d.ts +5 -177
  23. package/dist/src/notion-client.d.ts.map +1 -1
  24. package/dist/src/notion-client.js +6 -172
  25. package/dist/src/schemas/descriptions/examples.d.ts +14 -0
  26. package/dist/src/schemas/descriptions/examples.d.ts.map +1 -0
  27. package/dist/src/schemas/descriptions/examples.js +87 -0
  28. package/dist/src/schemas/descriptions/fields.d.ts +146 -0
  29. package/dist/src/schemas/descriptions/fields.d.ts.map +1 -0
  30. package/dist/src/schemas/descriptions/fields.js +184 -0
  31. package/dist/src/schemas/descriptions/index.d.ts +3 -0
  32. package/dist/src/schemas/descriptions/index.d.ts.map +1 -0
  33. package/dist/src/schemas/descriptions/index.js +2 -0
  34. package/dist/src/schemas/index.d.ts +1 -5
  35. package/dist/src/schemas/index.d.ts.map +1 -1
  36. package/dist/src/schemas/index.js +2 -10
  37. package/dist/src/tools/__tests__/context-size.test.d.ts +2 -0
  38. package/dist/src/tools/__tests__/context-size.test.d.ts.map +1 -0
  39. package/dist/src/tools/__tests__/context-size.test.js +143 -0
  40. package/dist/src/tools/__tests__/error-handler.test.d.ts +2 -0
  41. package/dist/src/tools/__tests__/error-handler.test.d.ts.map +1 -0
  42. package/dist/src/tools/__tests__/error-handler.test.js +125 -0
  43. package/dist/src/tools/append-block-children.d.ts.map +1 -1
  44. package/dist/src/tools/append-block-children.js +8 -5
  45. package/dist/src/tools/append-blocks-simple.d.ts.map +1 -1
  46. package/dist/src/tools/append-blocks-simple.js +9 -13
  47. package/dist/src/tools/archive-database.d.ts.map +1 -1
  48. package/dist/src/tools/archive-database.js +4 -4
  49. package/dist/src/tools/archive-page.d.ts.map +1 -1
  50. package/dist/src/tools/archive-page.js +3 -3
  51. package/dist/src/tools/create-comment-simple.d.ts +4 -0
  52. package/dist/src/tools/create-comment-simple.d.ts.map +1 -0
  53. package/dist/src/tools/create-comment-simple.js +51 -0
  54. package/dist/src/tools/create-comment.d.ts.map +1 -1
  55. package/dist/src/tools/create-comment.js +28 -8
  56. package/dist/src/tools/create-database.d.ts.map +1 -1
  57. package/dist/src/tools/create-database.js +19 -25
  58. package/dist/src/tools/create-page-simple.d.ts +1 -1
  59. package/dist/src/tools/create-page-simple.d.ts.map +1 -1
  60. package/dist/src/tools/create-page-simple.js +41 -26
  61. package/dist/src/tools/create-page.d.ts.map +1 -1
  62. package/dist/src/tools/create-page.js +11 -7
  63. package/dist/src/tools/delete-block.d.ts.map +1 -1
  64. package/dist/src/tools/delete-block.js +2 -1
  65. package/dist/src/tools/get-block-children.d.ts +1 -1
  66. package/dist/src/tools/get-block-children.d.ts.map +1 -1
  67. package/dist/src/tools/get-block-children.js +13 -27
  68. package/dist/src/tools/index.d.ts +4 -3
  69. package/dist/src/tools/index.d.ts.map +1 -1
  70. package/dist/src/tools/index.js +5 -3
  71. package/dist/src/tools/list-comments.d.ts +1 -1
  72. package/dist/src/tools/list-comments.d.ts.map +1 -1
  73. package/dist/src/tools/list-comments.js +11 -10
  74. package/dist/src/tools/list-users.d.ts.map +1 -1
  75. package/dist/src/tools/list-users.js +4 -3
  76. package/dist/src/tools/move-page.d.ts.map +1 -1
  77. package/dist/src/tools/move-page.js +5 -4
  78. package/dist/src/tools/query-data-source.d.ts +1 -1
  79. package/dist/src/tools/query-data-source.d.ts.map +1 -1
  80. package/dist/src/tools/query-data-source.js +23 -24
  81. package/dist/src/tools/retrieve-block.d.ts +1 -1
  82. package/dist/src/tools/retrieve-block.d.ts.map +1 -1
  83. package/dist/src/tools/retrieve-block.js +13 -10
  84. package/dist/src/tools/retrieve-bot-user.js +1 -1
  85. package/dist/src/tools/retrieve-data-source.d.ts +1 -1
  86. package/dist/src/tools/retrieve-data-source.d.ts.map +1 -1
  87. package/dist/src/tools/retrieve-data-source.js +15 -11
  88. package/dist/src/tools/retrieve-database.d.ts +1 -1
  89. package/dist/src/tools/retrieve-database.d.ts.map +1 -1
  90. package/dist/src/tools/retrieve-database.js +11 -6
  91. package/dist/src/tools/retrieve-page-property.d.ts.map +1 -1
  92. package/dist/src/tools/retrieve-page-property.js +7 -7
  93. package/dist/src/tools/retrieve-page.d.ts +1 -1
  94. package/dist/src/tools/retrieve-page.d.ts.map +1 -1
  95. package/dist/src/tools/retrieve-page.js +15 -20
  96. package/dist/src/tools/retrieve-user.d.ts.map +1 -1
  97. package/dist/src/tools/retrieve-user.js +2 -1
  98. package/dist/src/tools/search.d.ts.map +1 -1
  99. package/dist/src/tools/search.js +10 -17
  100. package/dist/src/tools/update-block-simple.d.ts +1 -1
  101. package/dist/src/tools/update-block-simple.d.ts.map +1 -1
  102. package/dist/src/tools/update-block-simple.js +14 -4
  103. package/dist/src/tools/update-block.d.ts.map +1 -1
  104. package/dist/src/tools/update-block.js +8 -5
  105. package/dist/src/tools/update-data-source.d.ts.map +1 -1
  106. package/dist/src/tools/update-data-source.js +8 -8
  107. package/dist/src/tools/update-database.d.ts.map +1 -1
  108. package/dist/src/tools/update-database.js +22 -32
  109. package/dist/src/tools/update-page.d.ts.map +1 -1
  110. package/dist/src/tools/update-page.js +13 -8
  111. package/dist/src/utils/error-handler.d.ts +20 -0
  112. package/dist/src/utils/error-handler.d.ts.map +1 -1
  113. package/dist/src/utils/error-handler.js +63 -0
  114. package/dist/src/utils/index.d.ts +1 -1
  115. package/dist/src/utils/index.d.ts.map +1 -1
  116. package/dist/src/utils/index.js +1 -1
  117. package/package.json +2 -1
  118. package/dist/src/schemas/block.d.ts +0 -3787
  119. package/dist/src/schemas/block.d.ts.map +0 -1
  120. package/dist/src/schemas/block.js +0 -402
  121. package/dist/src/schemas/common.d.ts +0 -638
  122. package/dist/src/schemas/common.d.ts.map +0 -1
  123. package/dist/src/schemas/common.js +0 -163
  124. package/dist/src/schemas/database.d.ts +0 -687
  125. package/dist/src/schemas/database.d.ts.map +0 -1
  126. package/dist/src/schemas/database.js +0 -258
  127. package/dist/src/schemas/filter.d.ts +0 -611
  128. package/dist/src/schemas/filter.d.ts.map +0 -1
  129. package/dist/src/schemas/filter.js +0 -222
  130. package/dist/src/schemas/page.d.ts +0 -2607
  131. package/dist/src/schemas/page.d.ts.map +0 -1
  132. package/dist/src/schemas/page.js +0 -328
  133. package/dist/src/schemas/schemas.test.d.ts +0 -2
  134. package/dist/src/schemas/schemas.test.d.ts.map +0 -1
  135. package/dist/src/schemas/schemas.test.js +0 -418
@@ -1 +1 @@
1
- {"version":3,"file":"create-page-simple.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page-simple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4DtF"}
1
+ {"version":3,"file":"create-page-simple.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page-simple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAIxE,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAiBzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAqEtF"}
@@ -1,23 +1,38 @@
1
1
  import { z } from 'zod';
2
2
  import { markdownToBlocks } from '../converters/index.js';
3
- import { formatResponse, handleError } from '../utils/index.js';
3
+ import { isFullDataSource } from '../notion-client.js';
4
+ import { F } from '../schemas/descriptions/index.js';
5
+ import { formatResponse, handleErrorWithContext } from '../utils/index.js';
4
6
  // Minimal schema for MCP
5
7
  const inputSchema = {
6
- data_source_id: z.string().describe('Data source ID (required in API 2025-09-03)'),
7
- title: z.string().describe('Page title'),
8
- content: z.string().optional().describe('Page content in Markdown'),
9
- properties: z.record(z.string(), z.any()).optional().describe('Additional properties'),
10
- icon: z.string().optional().describe('Emoji character (e.g. "📝", "🐛", "✅"). Must be an actual emoji, not a name.'),
8
+ data_source_id: z.string().describe(F.data_source_id),
9
+ title: z.string().describe(F.title),
10
+ content: z.string().optional().describe(F.content),
11
+ properties: z.record(z.string(), z.any()).optional().describe(F.properties),
12
+ icon: z.string().optional().describe(F.icon_emoji),
11
13
  };
12
14
  export function registerCreatePageSimple(server, notion) {
13
15
  server.registerTool('create-page-simple', {
14
- description: 'Create a Notion page with Markdown content. ' +
15
- 'Simpler than create-page: just provide title and markdown text. ' +
16
- 'Supports: headings (#), lists (- or 1.), checkboxes (- [ ]), code blocks (```), quotes (>), images (![]()), bold (**), italic (*), links ([]()), etc. ' +
17
- '(API version 2025-09-03)',
16
+ description: 'Create a page with Markdown. Title is auto-mapped to the database title property. ' +
17
+ 'Supports: # headings, - lists, - [ ] checkboxes, ``` code, > quotes, | tables |, **bold**, *italic*, [links]().',
18
18
  inputSchema,
19
19
  }, async ({ data_source_id, title, content, properties, icon }) => {
20
20
  try {
21
+ // Try to fetch data source schema to find the title property name
22
+ let titlePropertyName = 'Name'; // Default fallback
23
+ try {
24
+ const schema = await notion.dataSources.retrieve({ data_source_id });
25
+ if (isFullDataSource(schema)) {
26
+ // Find the title property name from schema
27
+ const foundTitleProp = Object.entries(schema.properties).find(([, prop]) => prop.type === 'title');
28
+ if (foundTitleProp) {
29
+ titlePropertyName = foundTitleProp[0];
30
+ }
31
+ }
32
+ }
33
+ catch {
34
+ // If schema fetch fails, fall back to 'Name'
35
+ }
21
36
  // Build properties with title
22
37
  const pageProperties = {
23
38
  ...properties,
@@ -25,31 +40,31 @@ export function registerCreatePageSimple(server, notion) {
25
40
  // Check if any title property is already provided
26
41
  // Title properties have the structure: { title: [...] }
27
42
  const hasTitleProperty = Object.values(pageProperties).some((prop) => prop && typeof prop === 'object' && 'title' in prop);
28
- // Only add Name if no title property exists
43
+ // Add title property if not already provided
29
44
  if (!hasTitleProperty) {
30
- pageProperties.Name = {
45
+ pageProperties[titlePropertyName] = {
31
46
  title: [{ type: 'text', text: { content: title } }],
32
47
  };
33
48
  }
34
- // Build params
35
- const params = {
49
+ // Cast markdownToBlocks output to SDK's BlockObjectRequest type
50
+ const children = content
51
+ ? markdownToBlocks(content)
52
+ : undefined;
53
+ const response = await notion.pages.create({
36
54
  parent: { data_source_id },
37
55
  properties: pageProperties,
38
- };
39
- // Convert markdown to blocks if content provided
40
- if (content) {
41
- params.children = markdownToBlocks(content);
42
- }
43
- // Add icon if provided
44
- if (icon) {
45
- params.icon = { type: 'emoji', emoji: icon };
46
- }
47
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
- const response = await notion.pages.create(params);
56
+ ...(children && { children }),
57
+ ...(icon && { icon: { type: 'emoji', emoji: icon } }),
58
+ });
49
59
  return formatResponse(response);
50
60
  }
51
61
  catch (error) {
52
- return handleError(error);
62
+ return handleErrorWithContext(error, notion, {
63
+ dataSourceId: data_source_id,
64
+ exampleType: 'page',
65
+ hint: 'Hint: The "title" parameter automatically sets the title property. ' +
66
+ 'Use "properties" for other fields like select or multi_select.',
67
+ });
53
68
  }
54
69
  });
55
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-page.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAkBvD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA0ChF"}
1
+ {"version":3,"file":"create-page.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAoBvD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6ChF"}
@@ -1,12 +1,13 @@
1
1
  import { z } from 'zod';
2
- import { formatResponse, handleError } from '../utils/index.js';
2
+ import { F } from '../schemas/descriptions/index.js';
3
+ import { formatResponse, handleErrorWithContext } from '../utils/index.js';
3
4
  // Minimal schema for MCP (full validation by Notion API)
4
5
  const inputSchema = {
5
- data_source_id: z.string().describe('Data source ID (required in API 2025-09-03)'),
6
- properties: z.record(z.string(), z.any()).describe('Notion properties object'),
7
- children: z.array(z.any()).optional().describe('Block objects array'),
8
- icon: z.any().optional().describe('Page icon { type: "emoji", emoji: "📝" } or { type: "external", external: { url: "..." } }. Emoji must be an actual emoji character.'),
9
- cover: z.any().optional().describe('Cover image'),
6
+ data_source_id: z.string().describe(F.data_source_id),
7
+ properties: z.record(z.string(), z.any()).describe(F.properties),
8
+ children: z.array(z.any()).optional().describe(F.children),
9
+ icon: z.any().optional().describe(F.icon),
10
+ cover: z.any().optional().describe(F.cover),
10
11
  };
11
12
  export function registerCreatePage(server, notion) {
12
13
  server.registerTool('create-page', {
@@ -33,7 +34,10 @@ export function registerCreatePage(server, notion) {
33
34
  return formatResponse(response);
34
35
  }
35
36
  catch (error) {
36
- return handleError(error);
37
+ return handleErrorWithContext(error, notion, {
38
+ dataSourceId: data_source_id,
39
+ exampleType: 'page',
40
+ });
37
41
  }
38
42
  });
39
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"delete-block.d.ts","sourceRoot":"","sources":["../../../src/tools/delete-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAOvD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkBjF"}
1
+ {"version":3,"file":"delete-block.d.ts","sourceRoot":"","sources":["../../../src/tools/delete-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAQvD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkBjF"}
@@ -1,7 +1,8 @@
1
1
  import { z } from 'zod';
2
+ import { F } from '../schemas/descriptions/index.js';
2
3
  import { formatResponse, handleError } from '../utils/index.js';
3
4
  const inputSchema = {
4
- block_id: z.string().describe('Block ID to delete'),
5
+ block_id: z.string().describe(F.block_id),
5
6
  };
6
7
  export function registerDeleteBlock(server, notion) {
7
8
  server.registerTool('delete-block', {
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
2
+ import { type NotionClient } from '../notion-client.js';
3
3
  export declare function registerGetBlockChildren(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=get-block-children.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-block-children.d.ts","sourceRoot":"","sources":["../../../src/tools/get-block-children.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAqCvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA2CtF"}
1
+ {"version":3,"file":"get-block-children.d.ts","sourceRoot":"","sources":["../../../src/tools/get-block-children.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAyC,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAY9F,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4CtF"}
@@ -1,28 +1,14 @@
1
1
  import { z } from 'zod';
2
2
  import { blocksToMarkdown, blocksToMarkdownSync } from '../converters/index.js';
3
+ import { isFullBlock } from '../notion-client.js';
4
+ import { F } from '../schemas/descriptions/index.js';
3
5
  import { formatMarkdownResponse, formatPaginatedResponse, handleError } from '../utils/index.js';
4
6
  const inputSchema = {
5
- block_id: z.string().describe('The ID of the block or page to get children from'),
6
- start_cursor: z
7
- .string()
8
- .optional()
9
- .describe('Cursor for pagination. Use the next_cursor from previous response.'),
10
- page_size: z
11
- .number()
12
- .min(1)
13
- .max(100)
14
- .optional()
15
- .describe('Number of results to return (1-100). Default is 100.'),
16
- format: z
17
- .enum(['json', 'markdown'])
18
- .optional()
19
- .default('markdown')
20
- .describe("Output format: 'markdown' (default) returns human-readable text with significantly reduced token usage, 'json' returns raw Notion API response"),
21
- fetch_nested: z
22
- .boolean()
23
- .optional()
24
- .default(false)
25
- .describe("When format='markdown', fetch nested children blocks recursively (toggle, list items with children, etc.). Default is false."),
7
+ block_id: z.string().describe(F.block_id),
8
+ start_cursor: z.string().optional().describe(F.start_cursor),
9
+ page_size: z.number().min(1).max(100).optional().describe(F.page_size),
10
+ format: z.enum(['json', 'markdown']).optional().default('markdown').describe(F.format),
11
+ fetch_nested: z.boolean().optional().default(false).describe(F.fetch_nested),
26
12
  };
27
13
  export function registerGetBlockChildren(server, notion) {
28
14
  server.registerTool('get-block-children', {
@@ -35,21 +21,21 @@ export function registerGetBlockChildren(server, notion) {
35
21
  start_cursor,
36
22
  page_size,
37
23
  });
24
+ // Filter to full blocks
25
+ const blocks = response.results.filter(isFullBlock);
38
26
  if (format === 'markdown') {
39
27
  let markdown;
40
28
  if (fetch_nested) {
41
29
  // 子ブロックを再帰的に取得
42
30
  const fetchChildren = async (blockId) => {
43
- const res = await notion.blocks.children.list({
44
- block_id: blockId,
45
- });
46
- return res.results;
31
+ const res = await notion.blocks.children.list({ block_id: blockId });
32
+ return res.results.filter(isFullBlock);
47
33
  };
48
- markdown = await blocksToMarkdown(response.results, { fetchChildren });
34
+ markdown = await blocksToMarkdown(blocks, { fetchChildren });
49
35
  }
50
36
  else {
51
37
  // 子ブロック取得なし(同期版)
52
- markdown = blocksToMarkdownSync(response.results);
38
+ markdown = blocksToMarkdownSync(blocks);
53
39
  }
54
40
  return formatMarkdownResponse(markdown, response.has_more, response.next_cursor);
55
41
  }
@@ -5,6 +5,7 @@ import { registerAppendBlocksSimple } from './append-blocks-simple.js';
5
5
  import { registerArchiveDatabase } from './archive-database.js';
6
6
  import { registerArchivePage } from './archive-page.js';
7
7
  import { registerCreateComment } from './create-comment.js';
8
+ import { registerCreateCommentSimple } from './create-comment-simple.js';
8
9
  import { registerCreateDatabase } from './create-database.js';
9
10
  import { registerCreatePage } from './create-page.js';
10
11
  import { registerCreatePageSimple } from './create-page-simple.js';
@@ -16,17 +17,17 @@ import { registerMovePage } from './move-page.js';
16
17
  import { registerQueryDataSource } from './query-data-source.js';
17
18
  import { registerRetrieveBlock } from './retrieve-block.js';
18
19
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
19
- import { registerRetrieveDatabase } from './retrieve-database.js';
20
20
  import { registerRetrieveDataSource } from './retrieve-data-source.js';
21
+ import { registerRetrieveDatabase } from './retrieve-database.js';
21
22
  import { registerRetrievePage } from './retrieve-page.js';
22
23
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
23
24
  import { registerRetrieveUser } from './retrieve-user.js';
24
25
  import { registerSearch } from './search.js';
25
26
  import { registerUpdateBlock } from './update-block.js';
26
27
  import { registerUpdateBlockSimple } from './update-block-simple.js';
27
- import { registerUpdateDatabase } from './update-database.js';
28
28
  import { registerUpdateDataSource } from './update-data-source.js';
29
+ import { registerUpdateDatabase } from './update-database.js';
29
30
  import { registerUpdatePage } from './update-page.js';
30
31
  export declare function registerAllTools(server: McpServer, notion: NotionClient): void;
31
- export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
32
+ export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerCreateCommentSimple, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
32
33
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAyC9E;AAED,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,GACxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA0C9E;AAED,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,GACxB,CAAA"}
@@ -3,6 +3,7 @@ import { registerAppendBlocksSimple } from './append-blocks-simple.js';
3
3
  import { registerArchiveDatabase } from './archive-database.js';
4
4
  import { registerArchivePage } from './archive-page.js';
5
5
  import { registerCreateComment } from './create-comment.js';
6
+ import { registerCreateCommentSimple } from './create-comment-simple.js';
6
7
  import { registerCreateDatabase } from './create-database.js';
7
8
  import { registerCreatePage } from './create-page.js';
8
9
  import { registerCreatePageSimple } from './create-page-simple.js';
@@ -14,16 +15,16 @@ import { registerMovePage } from './move-page.js';
14
15
  import { registerQueryDataSource } from './query-data-source.js';
15
16
  import { registerRetrieveBlock } from './retrieve-block.js';
16
17
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
17
- import { registerRetrieveDatabase } from './retrieve-database.js';
18
18
  import { registerRetrieveDataSource } from './retrieve-data-source.js';
19
+ import { registerRetrieveDatabase } from './retrieve-database.js';
19
20
  import { registerRetrievePage } from './retrieve-page.js';
20
21
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
21
22
  import { registerRetrieveUser } from './retrieve-user.js';
22
23
  import { registerSearch } from './search.js';
23
24
  import { registerUpdateBlock } from './update-block.js';
24
25
  import { registerUpdateBlockSimple } from './update-block-simple.js';
25
- import { registerUpdateDatabase } from './update-database.js';
26
26
  import { registerUpdateDataSource } from './update-data-source.js';
27
+ import { registerUpdateDatabase } from './update-database.js';
27
28
  import { registerUpdatePage } from './update-page.js';
28
29
  export function registerAllTools(server, notion) {
29
30
  // Page operations
@@ -55,10 +56,11 @@ export function registerAllTools(server, notion) {
55
56
  registerDeleteBlock(server, notion);
56
57
  // Comment operations
57
58
  registerCreateComment(server, notion);
59
+ registerCreateCommentSimple(server, notion);
58
60
  registerListComments(server, notion);
59
61
  // User operations
60
62
  registerListUsers(server, notion);
61
63
  registerRetrieveUser(server, notion);
62
64
  registerRetrieveBotUser(server, notion);
63
65
  }
64
- export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
66
+ export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerCreateCommentSimple, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
2
+ import { type NotionClient } from '../notion-client.js';
3
3
  export declare function registerListComments(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=list-comments.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA6BvD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6ClF"}
1
+ {"version":3,"file":"list-comments.d.ts","sourceRoot":"","sources":["../../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAWtE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA+ClF"}
@@ -1,13 +1,12 @@
1
1
  import { z } from 'zod';
2
+ import { isFullComment } from '../notion-client.js';
3
+ import { F } from '../schemas/descriptions/index.js';
2
4
  import { formatPaginatedResponse, handleError } from '../utils/index.js';
3
5
  const inputSchema = {
4
- block_id: z.string().optional().describe('Block ID to get comments from'),
5
- page_id: z
6
- .string()
7
- .optional()
8
- .describe('Page ID to get comments from (use either block_id or page_id)'),
9
- start_cursor: z.string().optional().describe('Pagination cursor'),
10
- page_size: z.number().optional().describe('Number of results (1-100)'),
6
+ block_id: z.string().optional().describe(F.block_id),
7
+ page_id: z.string().optional().describe(F.page_id),
8
+ start_cursor: z.string().optional().describe(F.start_cursor),
9
+ page_size: z.number().optional().describe(F.page_size),
11
10
  };
12
11
  export function registerListComments(server, notion) {
13
12
  server.registerTool('list-comments', {
@@ -28,13 +27,15 @@ export function registerListComments(server, notion) {
28
27
  };
29
28
  }
30
29
  // Notion API only accepts block_id (page_id works as block_id since pages are blocks)
30
+ // We checked above that at least one is defined, so we can safely use the fallback
31
+ const targetBlockId = block_id ?? page_id ?? '';
31
32
  const response = await notion.comments.list({
32
- block_id: block_id || page_id,
33
+ block_id: targetBlockId,
33
34
  start_cursor,
34
35
  page_size,
35
36
  });
36
- // Format comments with essential info
37
- const comments = response.results.map((comment) => ({
37
+ // Format comments with essential info (filter to full comments only)
38
+ const comments = response.results.filter(isFullComment).map((comment) => ({
38
39
  id: comment.id,
39
40
  discussion_id: comment.discussion_id,
40
41
  text: comment.rich_text.map((t) => t.plain_text).join(''),
@@ -1 +1 @@
1
- {"version":3,"file":"list-users.d.ts","sourceRoot":"","sources":["../../../src/tools/list-users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAuBvD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8B/E"}
1
+ {"version":3,"file":"list-users.d.ts","sourceRoot":"","sources":["../../../src/tools/list-users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AASvD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA8B/E"}
@@ -1,8 +1,9 @@
1
1
  import { z } from 'zod';
2
+ import { F } from '../schemas/descriptions/index.js';
2
3
  import { formatPaginatedResponse, handleError } from '../utils/index.js';
3
4
  const inputSchema = {
4
- start_cursor: z.string().optional().describe('Pagination cursor'),
5
- page_size: z.number().optional().describe('Number of results (1-100)'),
5
+ start_cursor: z.string().optional().describe(F.start_cursor),
6
+ page_size: z.number().optional().describe(F.page_size),
6
7
  };
7
8
  export function registerListUsers(server, notion) {
8
9
  server.registerTool('list-users', {
@@ -20,7 +21,7 @@ export function registerListUsers(server, notion) {
20
21
  type: user.type,
21
22
  name: user.name,
22
23
  avatar_url: user.avatar_url,
23
- email: user.person?.email,
24
+ email: user.type === 'person' ? user.person.email : undefined,
24
25
  }));
25
26
  return formatPaginatedResponse(users, response.has_more, response.next_cursor);
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"move-page.d.ts","sourceRoot":"","sources":["../../../src/tools/move-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAavD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuC9E"}
1
+ {"version":3,"file":"move-page.d.ts","sourceRoot":"","sources":["../../../src/tools/move-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAcvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuC9E"}
@@ -1,13 +1,14 @@
1
1
  import { z } from 'zod';
2
+ import { F } from '../schemas/descriptions/index.js';
2
3
  import { formatResponse, handleError } from '../utils/index.js';
3
4
  const inputSchema = {
4
- page_id: z.string().describe('Page ID to move'),
5
+ page_id: z.string().describe(F.page_id),
5
6
  parent: z
6
7
  .object({
7
- page_id: z.string().optional().describe('Target parent page ID'),
8
- data_source_id: z.string().optional().describe('Target data source ID'),
8
+ page_id: z.string().optional().describe(F.page_id_target),
9
+ data_source_id: z.string().optional().describe(F.data_source_id_target),
9
10
  })
10
- .describe('New parent (provide either page_id or data_source_id)'),
11
+ .describe(F.parent),
11
12
  };
12
13
  export function registerMovePage(server, notion) {
13
14
  server.registerTool('move-page', {
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
2
+ import { type NotionClient } from '../notion-client.js';
3
3
  export declare function registerQueryDataSource(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=query-data-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/query-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8BvD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsDrF"}
1
+ {"version":3,"file":"query-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/query-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAmBnE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAqCrF"}
@@ -1,14 +1,17 @@
1
1
  import { z } from 'zod';
2
2
  import { pagesToSimple } from '../converters/index.js';
3
- import { formatPaginatedResponse, formatSimplePaginatedResponse, handleError, } from '../utils/index.js';
3
+ import { isFullPage } from '../notion-client.js';
4
+ import { F } from '../schemas/descriptions/index.js';
5
+ import { formatPaginatedResponse, formatSimplePaginatedResponse, handleErrorWithContext, } from '../utils/index.js';
4
6
  // Minimal schema for MCP (full validation by Notion API)
7
+ // Uses z.any() for filter/sorts to reduce context size (~8,000 tokens saved)
5
8
  const inputSchema = {
6
- data_source_id: z.string().describe('Data source ID'),
7
- filter: z.any().optional().describe('Filter conditions'),
8
- sorts: z.array(z.any()).optional().describe('Sort conditions'),
9
- start_cursor: z.string().optional().describe('Pagination cursor'),
10
- page_size: z.number().optional().describe('Results per page (1-100)'),
11
- format: z.enum(['json', 'simple']).optional().describe('Output format (default: simple)'),
9
+ data_source_id: z.string().describe(F.data_source_id),
10
+ filter: z.any().optional().describe(F.filter),
11
+ sorts: z.array(z.any()).optional().describe(F.sorts),
12
+ start_cursor: z.string().optional().describe(F.start_cursor),
13
+ page_size: z.number().optional().describe(F.page_size),
14
+ format: z.enum(['json', 'simple']).optional().describe(F.format),
12
15
  };
13
16
  export function registerQueryDataSource(server, notion) {
14
17
  server.registerTool('query-data-source', {
@@ -18,29 +21,25 @@ export function registerQueryDataSource(server, notion) {
18
21
  inputSchema,
19
22
  }, async ({ data_source_id, filter, sorts, start_cursor, page_size, format }) => {
20
23
  try {
21
- const params = { data_source_id };
22
- if (filter) {
23
- params.filter = filter;
24
- }
25
- if (sorts) {
26
- params.sorts = sorts;
27
- }
28
- if (start_cursor) {
29
- params.start_cursor = start_cursor;
30
- }
31
- if (page_size) {
32
- params.page_size = page_size;
33
- }
34
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
- const response = await notion.dataSources.query(params);
24
+ const response = await notion.dataSources.query({
25
+ data_source_id,
26
+ ...(filter && { filter }),
27
+ ...(sorts && { sorts }),
28
+ ...(start_cursor && { start_cursor }),
29
+ ...(page_size && { page_size }),
30
+ });
36
31
  if (format === 'simple') {
37
- const simplePages = pagesToSimple(response.results);
32
+ // Filter to full pages and cast for pagesToSimple converter
33
+ const fullPages = response.results.filter(isFullPage);
34
+ const simplePages = pagesToSimple(fullPages);
38
35
  return formatSimplePaginatedResponse(simplePages, response.has_more, response.next_cursor);
39
36
  }
40
37
  return formatPaginatedResponse(response.results, response.has_more, response.next_cursor);
41
38
  }
42
39
  catch (error) {
43
- return handleError(error);
40
+ return handleErrorWithContext(error, notion, {
41
+ exampleType: 'filter',
42
+ });
44
43
  }
45
44
  });
46
45
  }
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
2
+ import { type NotionClient } from '../notion-client.js';
3
3
  export declare function registerRetrieveBlock(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=retrieve-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retrieve-block.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAWvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA2BnF"}
1
+ {"version":3,"file":"retrieve-block.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-block.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AASpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAgCnF"}
@@ -1,12 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import { blocksToMarkdownSync } from '../converters/index.js';
3
+ import { isFullBlock } from '../notion-client.js';
4
+ import { F } from '../schemas/descriptions/index.js';
3
5
  import { formatMarkdownResponse, formatResponse, handleError } from '../utils/index.js';
4
6
  const inputSchema = {
5
- block_id: z.string().describe('Block ID to retrieve'),
6
- format: z
7
- .enum(['markdown', 'json'])
8
- .optional()
9
- .describe("Output format: 'markdown' (default) or 'json'"),
7
+ block_id: z.string().describe(F.block_id),
8
+ format: z.enum(['markdown', 'json']).optional().describe(F.format),
10
9
  };
11
10
  export function registerRetrieveBlock(server, notion) {
12
11
  server.registerTool('retrieve-block', {
@@ -15,14 +14,18 @@ export function registerRetrieveBlock(server, notion) {
15
14
  inputSchema,
16
15
  }, async ({ block_id, format = 'markdown' }) => {
17
16
  try {
18
- const response = await notion.blocks.retrieve({
19
- block_id,
20
- });
17
+ const response = await notion.blocks.retrieve({ block_id });
21
18
  if (format === 'json') {
22
19
  return formatResponse(response);
23
20
  }
24
- // Convert to markdown
25
- const markdown = blocksToMarkdownSync([response]);
21
+ // Need full block for markdown conversion
22
+ if (!isFullBlock(response)) {
23
+ return formatResponse(response);
24
+ }
25
+ // Convert to markdown (cast to any for now until converters are updated)
26
+ const markdown = blocksToMarkdownSync([
27
+ response,
28
+ ]);
26
29
  return formatMarkdownResponse(markdown, false, null);
27
30
  }
28
31
  catch (error) {
@@ -6,7 +6,7 @@ export function registerRetrieveBotUser(server, notion) {
6
6
  inputSchema: {},
7
7
  }, async () => {
8
8
  try {
9
- const response = await notion.users.me();
9
+ const response = await notion.users.me({});
10
10
  return formatResponse(response);
11
11
  }
12
12
  catch (error) {
@@ -1,4 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
2
+ import { type NotionClient } from '../notion-client.js';
3
3
  export declare function registerRetrieveDataSource(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=retrieve-data-source.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retrieve-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA2BvD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAwDxF"}
1
+ {"version":3,"file":"retrieve-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAezE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkExF"}