@atikk-co-jp/notion-mcp-server 0.7.0 → 0.8.1

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 (134) hide show
  1. package/README.ja.md +3 -2
  2. package/README.md +3 -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 +3 -2
  49. package/dist/src/tools/archive-page.d.ts.map +1 -1
  50. package/dist/src/tools/archive-page.js +2 -1
  51. package/dist/src/tools/create-comment-simple.d.ts.map +1 -1
  52. package/dist/src/tools/create-comment-simple.js +5 -4
  53. package/dist/src/tools/create-comment.d.ts.map +1 -1
  54. package/dist/src/tools/create-comment.js +9 -6
  55. package/dist/src/tools/create-database.d.ts.map +1 -1
  56. package/dist/src/tools/create-database.js +19 -25
  57. package/dist/src/tools/create-page-simple.d.ts +1 -1
  58. package/dist/src/tools/create-page-simple.d.ts.map +1 -1
  59. package/dist/src/tools/create-page-simple.js +26 -27
  60. package/dist/src/tools/create-page.d.ts.map +1 -1
  61. package/dist/src/tools/create-page.js +10 -6
  62. package/dist/src/tools/delete-block.d.ts.map +1 -1
  63. package/dist/src/tools/delete-block.js +2 -1
  64. package/dist/src/tools/get-block-children.d.ts +1 -1
  65. package/dist/src/tools/get-block-children.d.ts.map +1 -1
  66. package/dist/src/tools/get-block-children.js +13 -27
  67. package/dist/src/tools/index.d.ts +2 -2
  68. package/dist/src/tools/index.d.ts.map +1 -1
  69. package/dist/src/tools/index.js +2 -2
  70. package/dist/src/tools/list-comments.d.ts +1 -1
  71. package/dist/src/tools/list-comments.d.ts.map +1 -1
  72. package/dist/src/tools/list-comments.js +11 -10
  73. package/dist/src/tools/list-users.d.ts.map +1 -1
  74. package/dist/src/tools/list-users.js +4 -3
  75. package/dist/src/tools/move-page.d.ts.map +1 -1
  76. package/dist/src/tools/move-page.js +5 -4
  77. package/dist/src/tools/query-data-source.d.ts +1 -1
  78. package/dist/src/tools/query-data-source.d.ts.map +1 -1
  79. package/dist/src/tools/query-data-source.js +23 -30
  80. package/dist/src/tools/retrieve-block.d.ts +1 -1
  81. package/dist/src/tools/retrieve-block.d.ts.map +1 -1
  82. package/dist/src/tools/retrieve-block.js +13 -10
  83. package/dist/src/tools/retrieve-bot-user.js +1 -1
  84. package/dist/src/tools/retrieve-data-source.d.ts +1 -1
  85. package/dist/src/tools/retrieve-data-source.d.ts.map +1 -1
  86. package/dist/src/tools/retrieve-data-source.js +15 -11
  87. package/dist/src/tools/retrieve-database.d.ts +1 -1
  88. package/dist/src/tools/retrieve-database.d.ts.map +1 -1
  89. package/dist/src/tools/retrieve-database.js +11 -6
  90. package/dist/src/tools/retrieve-page-property.d.ts.map +1 -1
  91. package/dist/src/tools/retrieve-page-property.js +6 -5
  92. package/dist/src/tools/retrieve-page.d.ts +1 -1
  93. package/dist/src/tools/retrieve-page.d.ts.map +1 -1
  94. package/dist/src/tools/retrieve-page.js +15 -20
  95. package/dist/src/tools/retrieve-user.d.ts.map +1 -1
  96. package/dist/src/tools/retrieve-user.js +2 -1
  97. package/dist/src/tools/search.d.ts.map +1 -1
  98. package/dist/src/tools/search.js +10 -17
  99. package/dist/src/tools/update-block-simple.d.ts +1 -1
  100. package/dist/src/tools/update-block-simple.d.ts.map +1 -1
  101. package/dist/src/tools/update-block-simple.js +14 -4
  102. package/dist/src/tools/update-block.d.ts.map +1 -1
  103. package/dist/src/tools/update-block.js +8 -5
  104. package/dist/src/tools/update-data-source.d.ts.map +1 -1
  105. package/dist/src/tools/update-data-source.js +7 -7
  106. package/dist/src/tools/update-database.d.ts.map +1 -1
  107. package/dist/src/tools/update-database.js +22 -32
  108. package/dist/src/tools/update-page.d.ts.map +1 -1
  109. package/dist/src/tools/update-page.js +11 -8
  110. package/dist/src/utils/error-handler.d.ts +16 -7
  111. package/dist/src/utils/error-handler.d.ts.map +1 -1
  112. package/dist/src/utils/error-handler.js +44 -17
  113. package/dist/src/utils/index.d.ts +1 -1
  114. package/dist/src/utils/index.d.ts.map +1 -1
  115. package/dist/src/utils/index.js +1 -1
  116. package/package.json +2 -1
  117. package/dist/src/schemas/block.d.ts +0 -3787
  118. package/dist/src/schemas/block.d.ts.map +0 -1
  119. package/dist/src/schemas/block.js +0 -402
  120. package/dist/src/schemas/common.d.ts +0 -638
  121. package/dist/src/schemas/common.d.ts.map +0 -1
  122. package/dist/src/schemas/common.js +0 -163
  123. package/dist/src/schemas/database.d.ts +0 -687
  124. package/dist/src/schemas/database.d.ts.map +0 -1
  125. package/dist/src/schemas/database.js +0 -258
  126. package/dist/src/schemas/filter.d.ts +0 -611
  127. package/dist/src/schemas/filter.d.ts.map +0 -1
  128. package/dist/src/schemas/filter.js +0 -222
  129. package/dist/src/schemas/page.d.ts +0 -2607
  130. package/dist/src/schemas/page.d.ts.map +0 -1
  131. package/dist/src/schemas/page.js +0 -328
  132. package/dist/src/schemas/schemas.test.d.ts +0 -2
  133. package/dist/src/schemas/schemas.test.d.ts.map +0 -1
  134. package/dist/src/schemas/schemas.test.js +0 -418
@@ -1,31 +1,33 @@
1
1
  import { z } from 'zod';
2
2
  import { markdownToBlocks } from '../converters/index.js';
3
+ import { isFullDataSource } from '../notion-client.js';
4
+ import { F } from '../schemas/descriptions/index.js';
3
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
16
  description: 'Create a page with Markdown. Title is auto-mapped to the database title property. ' +
15
- 'Supports: # headings, - lists, - [ ] checkboxes, ``` code, > quotes, **bold**, *italic*, [links]().',
17
+ 'Supports: # headings, - lists, - [ ] checkboxes, ``` code, > quotes, | tables |, **bold**, *italic*, [links]().',
16
18
  inputSchema,
17
19
  }, async ({ data_source_id, title, content, properties, icon }) => {
18
20
  try {
19
21
  // Try to fetch data source schema to find the title property name
20
22
  let titlePropertyName = 'Name'; // Default fallback
21
23
  try {
22
- const schema = await notion.dataSources.retrieve({
23
- data_source_id,
24
- });
25
- // Find the title property name from schema
26
- const foundTitleProp = Object.entries(schema.properties).find(([, prop]) => prop.type === 'title');
27
- if (foundTitleProp) {
28
- titlePropertyName = foundTitleProp[0];
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
+ }
29
31
  }
30
32
  }
31
33
  catch {
@@ -44,25 +46,22 @@ export function registerCreatePageSimple(server, notion) {
44
46
  title: [{ type: 'text', text: { content: title } }],
45
47
  };
46
48
  }
47
- // Build params
48
- 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({
49
54
  parent: { data_source_id },
50
55
  properties: pageProperties,
51
- };
52
- // Convert markdown to blocks if content provided
53
- if (content) {
54
- params.children = markdownToBlocks(content);
55
- }
56
- // Add icon if provided
57
- if (icon) {
58
- params.icon = { type: 'emoji', emoji: icon };
59
- }
60
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
61
- const response = await notion.pages.create(params);
56
+ ...(children && { children }),
57
+ ...(icon && { icon: { type: 'emoji', emoji: icon } }),
58
+ });
62
59
  return formatResponse(response);
63
60
  }
64
61
  catch (error) {
65
- return handleErrorWithContext(error, notion, data_source_id, {
62
+ return handleErrorWithContext(error, notion, {
63
+ dataSourceId: data_source_id,
64
+ exampleType: 'page',
66
65
  hint: 'Hint: The "title" parameter automatically sets the title property. ' +
67
66
  'Use "properties" for other fields like select or multi_select.',
68
67
  });
@@ -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 { F } from '../schemas/descriptions/index.js';
2
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 handleErrorWithContext(error, notion, data_source_id);
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('Fetch nested children recursively. Default false. WARNING: causes many API calls for deep structures.'),
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
  }
@@ -17,16 +17,16 @@ import { registerMovePage } from './move-page.js';
17
17
  import { registerQueryDataSource } from './query-data-source.js';
18
18
  import { registerRetrieveBlock } from './retrieve-block.js';
19
19
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
20
- import { registerRetrieveDatabase } from './retrieve-database.js';
21
20
  import { registerRetrieveDataSource } from './retrieve-data-source.js';
21
+ import { registerRetrieveDatabase } from './retrieve-database.js';
22
22
  import { registerRetrievePage } from './retrieve-page.js';
23
23
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
24
24
  import { registerRetrieveUser } from './retrieve-user.js';
25
25
  import { registerSearch } from './search.js';
26
26
  import { registerUpdateBlock } from './update-block.js';
27
27
  import { registerUpdateBlockSimple } from './update-block-simple.js';
28
- import { registerUpdateDatabase } from './update-database.js';
29
28
  import { registerUpdateDataSource } from './update-data-source.js';
29
+ import { registerUpdateDatabase } from './update-database.js';
30
30
  import { registerUpdatePage } from './update-page.js';
31
31
  export declare function registerAllTools(server: McpServer, notion: NotionClient): void;
32
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, };
@@ -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,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,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,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"}
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"}
@@ -15,16 +15,16 @@ import { registerMovePage } from './move-page.js';
15
15
  import { registerQueryDataSource } from './query-data-source.js';
16
16
  import { registerRetrieveBlock } from './retrieve-block.js';
17
17
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
18
- import { registerRetrieveDatabase } from './retrieve-database.js';
19
18
  import { registerRetrieveDataSource } from './retrieve-data-source.js';
19
+ import { registerRetrieveDatabase } from './retrieve-database.js';
20
20
  import { registerRetrievePage } from './retrieve-page.js';
21
21
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
22
22
  import { registerRetrieveUser } from './retrieve-user.js';
23
23
  import { registerSearch } from './search.js';
24
24
  import { registerUpdateBlock } from './update-block.js';
25
25
  import { registerUpdateBlockSimple } from './update-block-simple.js';
26
- import { registerUpdateDatabase } from './update-database.js';
27
26
  import { registerUpdateDataSource } from './update-data-source.js';
27
+ import { registerUpdateDatabase } from './update-database.js';
28
28
  import { registerUpdatePage } from './update-page.js';
29
29
  export function registerAllTools(server, notion) {
30
30
  // Page operations
@@ -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;AAoCvD,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,20 +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
8
- .any()
9
- .optional()
10
- .describe('Filter object. Example: {"property":"Status","select":{"equals":"Done"}}'),
11
- sorts: z
12
- .array(z.any())
13
- .optional()
14
- .describe('Sort array. Example: [{"property":"Date","direction":"descending"}]'),
15
- start_cursor: z.string().optional().describe('Pagination cursor'),
16
- page_size: z.number().optional().describe('Results per page (1-100)'),
17
- 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),
18
15
  };
19
16
  export function registerQueryDataSource(server, notion) {
20
17
  server.registerTool('query-data-source', {
@@ -24,29 +21,25 @@ export function registerQueryDataSource(server, notion) {
24
21
  inputSchema,
25
22
  }, async ({ data_source_id, filter, sorts, start_cursor, page_size, format }) => {
26
23
  try {
27
- const params = { data_source_id };
28
- if (filter) {
29
- params.filter = filter;
30
- }
31
- if (sorts) {
32
- params.sorts = sorts;
33
- }
34
- if (start_cursor) {
35
- params.start_cursor = start_cursor;
36
- }
37
- if (page_size) {
38
- params.page_size = page_size;
39
- }
40
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
41
- 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
+ });
42
31
  if (format === 'simple') {
43
- 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);
44
35
  return formatSimplePaginatedResponse(simplePages, response.has_more, response.next_cursor);
45
36
  }
46
37
  return formatPaginatedResponse(response.results, response.has_more, response.next_cursor);
47
38
  }
48
39
  catch (error) {
49
- return handleError(error);
40
+ return handleErrorWithContext(error, notion, {
41
+ exampleType: 'filter',
42
+ });
50
43
  }
51
44
  });
52
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"}
@@ -1,11 +1,10 @@
1
1
  import { z } from 'zod';
2
+ import { isFullDataSource } from '../notion-client.js';
3
+ import { F } from '../schemas/descriptions/index.js';
2
4
  import { formatResponse, formatSimpleResponse, handleError } from '../utils/index.js';
3
5
  const inputSchema = {
4
- data_source_id: z.string().describe('Data source ID'),
5
- format: z
6
- .enum(['json', 'simple'])
7
- .optional()
8
- .describe("Output format: 'simple' (default) or 'json'"),
6
+ data_source_id: z.string().describe(F.data_source_id),
7
+ format: z.enum(['json', 'simple']).optional().describe(F.format),
9
8
  };
10
9
  export function registerRetrieveDataSource(server, notion) {
11
10
  server.registerTool('retrieve-data-source', {
@@ -19,6 +18,10 @@ export function registerRetrieveDataSource(server, notion) {
19
18
  if (format === 'json') {
20
19
  return formatResponse(response);
21
20
  }
21
+ // Need full data source for simple format
22
+ if (!isFullDataSource(response)) {
23
+ return formatResponse(response);
24
+ }
22
25
  // Simple format: extract essential info
23
26
  const simpleProperties = {};
24
27
  for (const [name, prop] of Object.entries(response.properties)) {
@@ -27,16 +30,17 @@ export function registerRetrieveDataSource(server, notion) {
27
30
  type: prop.type,
28
31
  };
29
32
  // Include options for select/multi_select/status
30
- if (prop.type === 'select' && prop.select) {
31
- const selectProp = prop.select;
33
+ const propAny = prop;
34
+ if (prop.type === 'select' && propAny.select) {
35
+ const selectProp = propAny.select;
32
36
  simpleProp.options = selectProp.options;
33
37
  }
34
- else if (prop.type === 'multi_select' && prop.multi_select) {
35
- const multiSelectProp = prop.multi_select;
38
+ else if (prop.type === 'multi_select' && propAny.multi_select) {
39
+ const multiSelectProp = propAny.multi_select;
36
40
  simpleProp.options = multiSelectProp.options;
37
41
  }
38
- else if (prop.type === 'status' && prop.status) {
39
- const statusProp = prop.status;
42
+ else if (prop.type === 'status' && propAny.status) {
43
+ const statusProp = propAny.status;
40
44
  simpleProp.options = statusProp.options;
41
45
  }
42
46
  simpleProperties[name] = simpleProp;
@@ -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 registerRetrieveDatabase(server: McpServer, notion: NotionClient): void;
4
4
  //# sourceMappingURL=retrieve-database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retrieve-database.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA+BvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsCtF"}
1
+ {"version":3,"file":"retrieve-database.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAA;AASvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6CtF"}