@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.
- package/README.ja.md +3 -2
- package/README.md +3 -2
- package/dist/src/converters/__tests__/block-to-markdown.test.js +482 -111
- package/dist/src/converters/__tests__/markdown-to-blocks.test.js +116 -13
- package/dist/src/converters/__tests__/page-to-markdown.test.js +83 -70
- package/dist/src/converters/__tests__/rich-text-to-markdown.test.js +23 -26
- package/dist/src/converters/block-to-markdown.d.ts +4 -13
- package/dist/src/converters/block-to-markdown.d.ts.map +1 -1
- package/dist/src/converters/block-to-markdown.js +117 -120
- package/dist/src/converters/index.d.ts +3 -3
- package/dist/src/converters/index.d.ts.map +1 -1
- package/dist/src/converters/index.js +1 -1
- package/dist/src/converters/markdown-to-blocks.d.ts +21 -7
- package/dist/src/converters/markdown-to-blocks.d.ts.map +1 -1
- package/dist/src/converters/markdown-to-blocks.js +56 -0
- package/dist/src/converters/page-to-markdown.d.ts +5 -20
- package/dist/src/converters/page-to-markdown.d.ts.map +1 -1
- package/dist/src/converters/page-to-markdown.js +47 -37
- package/dist/src/converters/rich-text-to-markdown.d.ts +3 -47
- package/dist/src/converters/rich-text-to-markdown.d.ts.map +1 -1
- package/dist/src/converters/rich-text-to-markdown.js +15 -14
- package/dist/src/notion-client.d.ts +5 -177
- package/dist/src/notion-client.d.ts.map +1 -1
- package/dist/src/notion-client.js +6 -172
- package/dist/src/schemas/descriptions/examples.d.ts +14 -0
- package/dist/src/schemas/descriptions/examples.d.ts.map +1 -0
- package/dist/src/schemas/descriptions/examples.js +87 -0
- package/dist/src/schemas/descriptions/fields.d.ts +146 -0
- package/dist/src/schemas/descriptions/fields.d.ts.map +1 -0
- package/dist/src/schemas/descriptions/fields.js +184 -0
- package/dist/src/schemas/descriptions/index.d.ts +3 -0
- package/dist/src/schemas/descriptions/index.d.ts.map +1 -0
- package/dist/src/schemas/descriptions/index.js +2 -0
- package/dist/src/schemas/index.d.ts +1 -5
- package/dist/src/schemas/index.d.ts.map +1 -1
- package/dist/src/schemas/index.js +2 -10
- package/dist/src/tools/__tests__/context-size.test.d.ts +2 -0
- package/dist/src/tools/__tests__/context-size.test.d.ts.map +1 -0
- package/dist/src/tools/__tests__/context-size.test.js +143 -0
- package/dist/src/tools/__tests__/error-handler.test.d.ts +2 -0
- package/dist/src/tools/__tests__/error-handler.test.d.ts.map +1 -0
- package/dist/src/tools/__tests__/error-handler.test.js +125 -0
- package/dist/src/tools/append-block-children.d.ts.map +1 -1
- package/dist/src/tools/append-block-children.js +8 -5
- package/dist/src/tools/append-blocks-simple.d.ts.map +1 -1
- package/dist/src/tools/append-blocks-simple.js +9 -13
- package/dist/src/tools/archive-database.d.ts.map +1 -1
- package/dist/src/tools/archive-database.js +3 -2
- package/dist/src/tools/archive-page.d.ts.map +1 -1
- package/dist/src/tools/archive-page.js +2 -1
- package/dist/src/tools/create-comment-simple.d.ts.map +1 -1
- package/dist/src/tools/create-comment-simple.js +5 -4
- package/dist/src/tools/create-comment.d.ts.map +1 -1
- package/dist/src/tools/create-comment.js +9 -6
- package/dist/src/tools/create-database.d.ts.map +1 -1
- package/dist/src/tools/create-database.js +19 -25
- package/dist/src/tools/create-page-simple.d.ts +1 -1
- package/dist/src/tools/create-page-simple.d.ts.map +1 -1
- package/dist/src/tools/create-page-simple.js +26 -27
- package/dist/src/tools/create-page.d.ts.map +1 -1
- package/dist/src/tools/create-page.js +10 -6
- package/dist/src/tools/delete-block.d.ts.map +1 -1
- package/dist/src/tools/delete-block.js +2 -1
- package/dist/src/tools/get-block-children.d.ts +1 -1
- package/dist/src/tools/get-block-children.d.ts.map +1 -1
- package/dist/src/tools/get-block-children.js +13 -27
- package/dist/src/tools/index.d.ts +2 -2
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +2 -2
- package/dist/src/tools/list-comments.d.ts +1 -1
- package/dist/src/tools/list-comments.d.ts.map +1 -1
- package/dist/src/tools/list-comments.js +11 -10
- package/dist/src/tools/list-users.d.ts.map +1 -1
- package/dist/src/tools/list-users.js +4 -3
- package/dist/src/tools/move-page.d.ts.map +1 -1
- package/dist/src/tools/move-page.js +5 -4
- package/dist/src/tools/query-data-source.d.ts +1 -1
- package/dist/src/tools/query-data-source.d.ts.map +1 -1
- package/dist/src/tools/query-data-source.js +23 -30
- package/dist/src/tools/retrieve-block.d.ts +1 -1
- package/dist/src/tools/retrieve-block.d.ts.map +1 -1
- package/dist/src/tools/retrieve-block.js +13 -10
- package/dist/src/tools/retrieve-bot-user.js +1 -1
- package/dist/src/tools/retrieve-data-source.d.ts +1 -1
- package/dist/src/tools/retrieve-data-source.d.ts.map +1 -1
- package/dist/src/tools/retrieve-data-source.js +15 -11
- package/dist/src/tools/retrieve-database.d.ts +1 -1
- package/dist/src/tools/retrieve-database.d.ts.map +1 -1
- package/dist/src/tools/retrieve-database.js +11 -6
- package/dist/src/tools/retrieve-page-property.d.ts.map +1 -1
- package/dist/src/tools/retrieve-page-property.js +6 -5
- package/dist/src/tools/retrieve-page.d.ts +1 -1
- package/dist/src/tools/retrieve-page.d.ts.map +1 -1
- package/dist/src/tools/retrieve-page.js +15 -20
- package/dist/src/tools/retrieve-user.d.ts.map +1 -1
- package/dist/src/tools/retrieve-user.js +2 -1
- package/dist/src/tools/search.d.ts.map +1 -1
- package/dist/src/tools/search.js +10 -17
- package/dist/src/tools/update-block-simple.d.ts +1 -1
- package/dist/src/tools/update-block-simple.d.ts.map +1 -1
- package/dist/src/tools/update-block-simple.js +14 -4
- package/dist/src/tools/update-block.d.ts.map +1 -1
- package/dist/src/tools/update-block.js +8 -5
- package/dist/src/tools/update-data-source.d.ts.map +1 -1
- package/dist/src/tools/update-data-source.js +7 -7
- package/dist/src/tools/update-database.d.ts.map +1 -1
- package/dist/src/tools/update-database.js +22 -32
- package/dist/src/tools/update-page.d.ts.map +1 -1
- package/dist/src/tools/update-page.js +11 -8
- package/dist/src/utils/error-handler.d.ts +16 -7
- package/dist/src/utils/error-handler.d.ts.map +1 -1
- package/dist/src/utils/error-handler.js +44 -17
- package/dist/src/utils/index.d.ts +1 -1
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -1
- package/package.json +2 -1
- package/dist/src/schemas/block.d.ts +0 -3787
- package/dist/src/schemas/block.d.ts.map +0 -1
- package/dist/src/schemas/block.js +0 -402
- package/dist/src/schemas/common.d.ts +0 -638
- package/dist/src/schemas/common.d.ts.map +0 -1
- package/dist/src/schemas/common.js +0 -163
- package/dist/src/schemas/database.d.ts +0 -687
- package/dist/src/schemas/database.d.ts.map +0 -1
- package/dist/src/schemas/database.js +0 -258
- package/dist/src/schemas/filter.d.ts +0 -611
- package/dist/src/schemas/filter.d.ts.map +0 -1
- package/dist/src/schemas/filter.js +0 -222
- package/dist/src/schemas/page.d.ts +0 -2607
- package/dist/src/schemas/page.d.ts.map +0 -1
- package/dist/src/schemas/page.js +0 -328
- package/dist/src/schemas/schemas.test.d.ts +0 -2
- package/dist/src/schemas/schemas.test.d.ts.map +0 -1
- 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(
|
|
7
|
-
title: z.string().describe(
|
|
8
|
-
content: z.string().optional().describe(
|
|
9
|
-
properties: z.record(z.string(), z.any()).optional().describe(
|
|
10
|
-
icon: z.string().optional().describe(
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
//
|
|
48
|
-
const
|
|
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
|
-
|
|
53
|
-
|
|
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,
|
|
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;
|
|
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(
|
|
6
|
-
properties: z.record(z.string(), z.any()).describe(
|
|
7
|
-
children: z.array(z.any()).optional().describe(
|
|
8
|
-
icon: z.any().optional().describe(
|
|
9
|
-
cover: z.any().optional().describe(
|
|
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,
|
|
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;
|
|
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(
|
|
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
|
|
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,
|
|
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(
|
|
6
|
-
start_cursor: z
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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(
|
|
34
|
+
markdown = await blocksToMarkdown(blocks, { fetchChildren });
|
|
49
35
|
}
|
|
50
36
|
else {
|
|
51
37
|
// 子ブロック取得なし(同期版)
|
|
52
|
-
markdown = blocksToMarkdownSync(
|
|
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,
|
|
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"}
|
package/dist/src/tools/index.js
CHANGED
|
@@ -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
|
|
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,
|
|
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(
|
|
5
|
-
page_id: z
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
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;
|
|
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(
|
|
5
|
-
page_size: z.number().optional().describe(
|
|
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
|
|
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;
|
|
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(
|
|
5
|
+
page_id: z.string().describe(F.page_id),
|
|
5
6
|
parent: z
|
|
6
7
|
.object({
|
|
7
|
-
page_id: z.string().optional().describe(
|
|
8
|
-
data_source_id: z.string().optional().describe(
|
|
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(
|
|
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
|
|
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,
|
|
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 {
|
|
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(
|
|
7
|
-
filter: z
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
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(
|
|
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
|
-
//
|
|
25
|
-
|
|
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) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type
|
|
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,
|
|
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(
|
|
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
|
-
|
|
31
|
-
|
|
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' &&
|
|
35
|
-
const multiSelectProp =
|
|
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' &&
|
|
39
|
-
const statusProp =
|
|
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
|
|
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,
|
|
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"}
|