@atikk-co-jp/notion-mcp-server 0.1.0 → 0.2.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 (97) hide show
  1. package/README.ja.md +97 -6
  2. package/README.md +97 -6
  3. package/dist/bin/cli.js +10 -10
  4. package/dist/src/converters/__tests__/block-to-markdown.test.d.ts +2 -0
  5. package/dist/src/converters/__tests__/block-to-markdown.test.d.ts.map +1 -0
  6. package/dist/src/converters/__tests__/block-to-markdown.test.js +611 -0
  7. package/dist/src/converters/__tests__/page-to-markdown.test.d.ts +2 -0
  8. package/dist/src/converters/__tests__/page-to-markdown.test.d.ts.map +1 -0
  9. package/dist/src/converters/__tests__/page-to-markdown.test.js +567 -0
  10. package/dist/src/converters/__tests__/rich-text-to-markdown.test.d.ts +2 -0
  11. package/dist/src/converters/__tests__/rich-text-to-markdown.test.d.ts.map +1 -0
  12. package/dist/src/converters/__tests__/rich-text-to-markdown.test.js +353 -0
  13. package/dist/src/converters/block-to-markdown.d.ts +38 -0
  14. package/dist/src/converters/block-to-markdown.d.ts.map +1 -0
  15. package/dist/src/converters/block-to-markdown.js +484 -0
  16. package/dist/src/converters/index.d.ts +9 -0
  17. package/dist/src/converters/index.d.ts.map +1 -0
  18. package/dist/src/converters/index.js +11 -0
  19. package/dist/src/converters/page-to-markdown.d.ts +64 -0
  20. package/dist/src/converters/page-to-markdown.d.ts.map +1 -0
  21. package/dist/src/converters/page-to-markdown.js +189 -0
  22. package/dist/src/converters/rich-text-to-markdown.d.ts +61 -0
  23. package/dist/src/converters/rich-text-to-markdown.d.ts.map +1 -0
  24. package/dist/src/converters/rich-text-to-markdown.js +95 -0
  25. package/dist/src/index.d.ts +6 -6
  26. package/dist/src/index.d.ts.map +1 -1
  27. package/dist/src/index.js +5 -5
  28. package/dist/src/notion-client.d.ts +58 -15
  29. package/dist/src/notion-client.d.ts.map +1 -1
  30. package/dist/src/notion-client.js +23 -13
  31. package/dist/src/schemas/block.d.ts +2158 -622
  32. package/dist/src/schemas/block.d.ts.map +1 -1
  33. package/dist/src/schemas/block.js +283 -76
  34. package/dist/src/schemas/common.d.ts +518 -6
  35. package/dist/src/schemas/common.d.ts.map +1 -1
  36. package/dist/src/schemas/common.js +120 -42
  37. package/dist/src/schemas/database.d.ts +687 -0
  38. package/dist/src/schemas/database.d.ts.map +1 -0
  39. package/dist/src/schemas/database.js +264 -0
  40. package/dist/src/schemas/filter.d.ts +509 -3
  41. package/dist/src/schemas/filter.d.ts.map +1 -1
  42. package/dist/src/schemas/filter.js +110 -13
  43. package/dist/src/schemas/index.d.ts +5 -4
  44. package/dist/src/schemas/index.d.ts.map +1 -1
  45. package/dist/src/schemas/index.js +7 -5
  46. package/dist/src/schemas/page.d.ts +2152 -19
  47. package/dist/src/schemas/page.d.ts.map +1 -1
  48. package/dist/src/schemas/page.js +216 -22
  49. package/dist/src/schemas/schemas.test.d.ts +2 -0
  50. package/dist/src/schemas/schemas.test.d.ts.map +1 -0
  51. package/dist/src/schemas/schemas.test.js +418 -0
  52. package/dist/src/server.d.ts +2 -2
  53. package/dist/src/server.d.ts.map +1 -1
  54. package/dist/src/server.js +6 -6
  55. package/dist/src/tools/append-block-children.d.ts +2 -2
  56. package/dist/src/tools/append-block-children.d.ts.map +1 -1
  57. package/dist/src/tools/append-block-children.js +16 -10
  58. package/dist/src/tools/create-comment.d.ts +2 -2
  59. package/dist/src/tools/create-comment.d.ts.map +1 -1
  60. package/dist/src/tools/create-comment.js +15 -9
  61. package/dist/src/tools/create-database.d.ts +4 -0
  62. package/dist/src/tools/create-database.d.ts.map +1 -0
  63. package/dist/src/tools/create-database.js +57 -0
  64. package/dist/src/tools/create-page.d.ts +2 -2
  65. package/dist/src/tools/create-page.d.ts.map +1 -1
  66. package/dist/src/tools/create-page.js +22 -24
  67. package/dist/src/tools/get-block-children.d.ts +2 -2
  68. package/dist/src/tools/get-block-children.d.ts.map +1 -1
  69. package/dist/src/tools/get-block-children.js +39 -6
  70. package/dist/src/tools/index.d.ts +13 -11
  71. package/dist/src/tools/index.d.ts.map +1 -1
  72. package/dist/src/tools/index.js +13 -9
  73. package/dist/src/tools/query-database.d.ts +2 -2
  74. package/dist/src/tools/query-database.d.ts.map +1 -1
  75. package/dist/src/tools/query-database.js +27 -18
  76. package/dist/src/tools/retrieve-page.d.ts +2 -2
  77. package/dist/src/tools/retrieve-page.d.ts.map +1 -1
  78. package/dist/src/tools/retrieve-page.js +44 -4
  79. package/dist/src/tools/search.d.ts +2 -2
  80. package/dist/src/tools/search.d.ts.map +1 -1
  81. package/dist/src/tools/search.js +18 -12
  82. package/dist/src/tools/update-database.d.ts +4 -0
  83. package/dist/src/tools/update-database.d.ts.map +1 -0
  84. package/dist/src/tools/update-database.js +74 -0
  85. package/dist/src/tools/update-page.d.ts +2 -2
  86. package/dist/src/tools/update-page.d.ts.map +1 -1
  87. package/dist/src/tools/update-page.js +23 -18
  88. package/dist/src/utils/error-handler.d.ts +1 -1
  89. package/dist/src/utils/error-handler.d.ts.map +1 -1
  90. package/dist/src/utils/error-handler.js +14 -14
  91. package/dist/src/utils/index.d.ts +2 -2
  92. package/dist/src/utils/index.d.ts.map +1 -1
  93. package/dist/src/utils/index.js +2 -2
  94. package/dist/src/utils/response-formatter.d.ts +13 -1
  95. package/dist/src/utils/response-formatter.d.ts.map +1 -1
  96. package/dist/src/utils/response-formatter.js +46 -3
  97. package/package.json +11 -2
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Notionページプロパティをシンプルな形式に変換するモジュール
3
+ */
4
+ import { richTextToPlain } from './rich-text-to-markdown.js';
5
+ /**
6
+ * 単一のプロパティから値を抽出
7
+ */
8
+ function extractPropertyValue(prop) {
9
+ const type = prop.type;
10
+ const data = prop[type];
11
+ switch (type) {
12
+ case 'title': {
13
+ return richTextToPlain(data);
14
+ }
15
+ case 'rich_text': {
16
+ return richTextToPlain(data);
17
+ }
18
+ case 'number': {
19
+ return data ?? null;
20
+ }
21
+ case 'select': {
22
+ const select = data;
23
+ return select?.name ?? null;
24
+ }
25
+ case 'multi_select': {
26
+ const multiSelect = data;
27
+ return multiSelect?.map((item) => item.name) ?? [];
28
+ }
29
+ case 'status': {
30
+ const status = data;
31
+ return status?.name ?? null;
32
+ }
33
+ case 'date': {
34
+ const date = data;
35
+ if (!date)
36
+ return null;
37
+ if (date.end) {
38
+ return `${date.start} → ${date.end}`;
39
+ }
40
+ return date.start;
41
+ }
42
+ case 'checkbox': {
43
+ return data;
44
+ }
45
+ case 'url': {
46
+ return data ?? null;
47
+ }
48
+ case 'email': {
49
+ return data ?? null;
50
+ }
51
+ case 'phone_number': {
52
+ return data ?? null;
53
+ }
54
+ case 'formula': {
55
+ const formula = data;
56
+ if (!formula)
57
+ return null;
58
+ switch (formula.type) {
59
+ case 'string':
60
+ return formula.string ?? null;
61
+ case 'number':
62
+ return formula.number ?? null;
63
+ case 'boolean':
64
+ return formula.boolean ?? null;
65
+ case 'date':
66
+ return formula.date?.start ?? null;
67
+ default:
68
+ return null;
69
+ }
70
+ }
71
+ case 'relation': {
72
+ const relations = data;
73
+ return relations?.map((item) => item.id) ?? [];
74
+ }
75
+ case 'rollup': {
76
+ const rollup = data;
77
+ if (!rollup)
78
+ return null;
79
+ switch (rollup.type) {
80
+ case 'number':
81
+ return rollup.number ?? null;
82
+ case 'date':
83
+ return rollup.date?.start ?? null;
84
+ case 'array':
85
+ return `[${rollup.array?.length ?? 0} items]`;
86
+ default:
87
+ return null;
88
+ }
89
+ }
90
+ case 'people': {
91
+ const people = data;
92
+ return people?.map((person) => person.name ?? person.id) ?? [];
93
+ }
94
+ case 'files': {
95
+ const files = data;
96
+ return (files?.map((f) => {
97
+ const url = f.external?.url ?? f.file?.url;
98
+ return f.name ?? url ?? 'file';
99
+ }) ?? []);
100
+ }
101
+ case 'created_time': {
102
+ return data ?? null;
103
+ }
104
+ case 'created_by': {
105
+ const user = data;
106
+ return user?.name ?? user?.id ?? null;
107
+ }
108
+ case 'last_edited_time': {
109
+ return data ?? null;
110
+ }
111
+ case 'last_edited_by': {
112
+ const user = data;
113
+ return user?.name ?? user?.id ?? null;
114
+ }
115
+ case 'unique_id': {
116
+ const uniqueId = data;
117
+ if (!uniqueId)
118
+ return null;
119
+ return uniqueId.prefix ? `${uniqueId.prefix}-${uniqueId.number}` : String(uniqueId.number);
120
+ }
121
+ case 'verification': {
122
+ const verification = data;
123
+ return verification?.state ?? null;
124
+ }
125
+ case 'button': {
126
+ return '[Button]';
127
+ }
128
+ default: {
129
+ // 未知のプロパティタイプ
130
+ if (data !== undefined && data !== null) {
131
+ return JSON.stringify(data);
132
+ }
133
+ return null;
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * ページプロパティをシンプルな形式に変換
139
+ * @param properties - Notion APIから取得したプロパティオブジェクト
140
+ * @returns シンプル化されたプロパティの配列
141
+ */
142
+ export function pagePropertiesToSimple(properties) {
143
+ if (!properties) {
144
+ return [];
145
+ }
146
+ return Object.entries(properties).map(([name, prop]) => ({
147
+ name,
148
+ type: prop.type,
149
+ value: extractPropertyValue(prop),
150
+ }));
151
+ }
152
+ /**
153
+ * ページプロパティをオブジェクト形式に変換(キー: プロパティ名、値: 値)
154
+ * @param properties - Notion APIから取得したプロパティオブジェクト
155
+ * @returns シンプル化されたプロパティオブジェクト
156
+ */
157
+ export function pagePropertiesToObject(properties) {
158
+ if (!properties) {
159
+ return {};
160
+ }
161
+ const result = {};
162
+ for (const [name, prop] of Object.entries(properties)) {
163
+ result[name] = extractPropertyValue(prop);
164
+ }
165
+ return result;
166
+ }
167
+ /**
168
+ * ページオブジェクトをシンプルな形式に変換
169
+ * @param page - Notion APIから取得したページオブジェクト
170
+ * @returns シンプル化されたページオブジェクト
171
+ */
172
+ export function pageToSimple(page) {
173
+ return {
174
+ id: page.id,
175
+ url: page.url ?? '',
176
+ properties: pagePropertiesToObject(page.properties),
177
+ };
178
+ }
179
+ /**
180
+ * ページ配列をシンプルな形式に変換
181
+ * @param pages - Notion APIから取得したページ配列
182
+ * @returns シンプル化されたページ配列
183
+ */
184
+ export function pagesToSimple(pages) {
185
+ if (!pages) {
186
+ return [];
187
+ }
188
+ return pages.map(pageToSimple);
189
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * RichText配列をマークダウン文字列に変換するモジュール
3
+ */
4
+ /**
5
+ * Notion APIのRichTextアイテムの型定義
6
+ */
7
+ export interface RichTextItem {
8
+ type?: string;
9
+ text?: {
10
+ content: string;
11
+ link?: {
12
+ url: string;
13
+ } | null;
14
+ };
15
+ annotations?: {
16
+ bold?: boolean;
17
+ italic?: boolean;
18
+ strikethrough?: boolean;
19
+ underline?: boolean;
20
+ code?: boolean;
21
+ color?: string;
22
+ };
23
+ plain_text?: string;
24
+ href?: string | null;
25
+ mention?: {
26
+ type: string;
27
+ user?: {
28
+ name?: string;
29
+ id: string;
30
+ };
31
+ page?: {
32
+ id: string;
33
+ };
34
+ database?: {
35
+ id: string;
36
+ };
37
+ date?: {
38
+ start: string;
39
+ end?: string | null;
40
+ };
41
+ link_preview?: {
42
+ url: string;
43
+ };
44
+ };
45
+ equation?: {
46
+ expression: string;
47
+ };
48
+ }
49
+ /**
50
+ * RichText配列をマークダウン文字列に変換
51
+ * @param richTexts - Notion APIから取得したRichText配列
52
+ * @returns マークダウン文字列
53
+ */
54
+ export declare function richTextToMarkdown(richTexts: RichTextItem[]): string;
55
+ /**
56
+ * RichText配列からプレーンテキストを抽出
57
+ * @param richTexts - Notion APIから取得したRichText配列
58
+ * @returns プレーンテキスト文字列
59
+ */
60
+ export declare function richTextToPlain(richTexts: RichTextItem[]): string;
61
+ //# sourceMappingURL=rich-text-to-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text-to-markdown.d.ts","sourceRoot":"","sources":["../../../src/converters/rich-text-to-markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAC9B,CAAA;IACD,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,MAAM,CAAC,EAAE,OAAO,CAAA;QAChB,aAAa,CAAC,EAAE,OAAO,CAAA;QACvB,SAAS,CAAC,EAAE,OAAO,CAAA;QACnB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAEpB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QACpC,IAAI,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QACrB,QAAQ,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;QACzB,IAAI,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAA;QAC7C,YAAY,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAC/B,CAAA;IAED,QAAQ,CAAC,EAAE;QACT,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAoFD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAKpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,CAKjE"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * RichText配列をマークダウン文字列に変換するモジュール
3
+ */
4
+ /**
5
+ * 単一のRichTextアイテムをマークダウンに変換
6
+ */
7
+ function convertRichTextItem(item) {
8
+ // テキスト内容を取得
9
+ let text = item.text?.content ?? item.plain_text ?? '';
10
+ // Mention type の処理
11
+ if (item.type === 'mention' && item.mention) {
12
+ const mention = item.mention;
13
+ switch (mention.type) {
14
+ case 'user':
15
+ text = `@${mention.user?.name ?? 'user'}`;
16
+ break;
17
+ case 'page':
18
+ text = item.plain_text ?? `[page](${mention.page?.id})`;
19
+ break;
20
+ case 'database':
21
+ text = item.plain_text ?? `[database](${mention.database?.id})`;
22
+ break;
23
+ case 'date':
24
+ text = mention.date?.start ?? '';
25
+ if (mention.date?.end) {
26
+ text += ` → ${mention.date.end}`;
27
+ }
28
+ break;
29
+ case 'link_preview':
30
+ text = mention.link_preview?.url ?? '';
31
+ break;
32
+ default:
33
+ text = item.plain_text ?? '';
34
+ }
35
+ }
36
+ // Equation type の処理
37
+ if (item.type === 'equation' && item.equation) {
38
+ return `$${item.equation.expression}$`;
39
+ }
40
+ // 空文字列の場合はそのまま返す
41
+ if (!text) {
42
+ return '';
43
+ }
44
+ const annotations = item.annotations;
45
+ // アノテーション適用(内側から外側へ)
46
+ // code が最も内側
47
+ if (annotations?.code) {
48
+ text = `\`${text}\``;
49
+ }
50
+ // strikethrough
51
+ if (annotations?.strikethrough) {
52
+ text = `~~${text}~~`;
53
+ }
54
+ // italic
55
+ if (annotations?.italic) {
56
+ text = `*${text}*`;
57
+ }
58
+ // bold
59
+ if (annotations?.bold) {
60
+ text = `**${text}**`;
61
+ }
62
+ // underline はマークダウンで標準サポートされていないため、HTMLタグを使用
63
+ if (annotations?.underline) {
64
+ text = `<u>${text}</u>`;
65
+ }
66
+ // リンク処理(text.link または href)
67
+ const href = item.text?.link?.url ?? item.href;
68
+ if (href && !annotations?.code) {
69
+ // コード内のリンクは無視
70
+ text = `[${text}](${href})`;
71
+ }
72
+ return text;
73
+ }
74
+ /**
75
+ * RichText配列をマークダウン文字列に変換
76
+ * @param richTexts - Notion APIから取得したRichText配列
77
+ * @returns マークダウン文字列
78
+ */
79
+ export function richTextToMarkdown(richTexts) {
80
+ if (!richTexts || richTexts.length === 0) {
81
+ return '';
82
+ }
83
+ return richTexts.map(convertRichTextItem).join('');
84
+ }
85
+ /**
86
+ * RichText配列からプレーンテキストを抽出
87
+ * @param richTexts - Notion APIから取得したRichText配列
88
+ * @returns プレーンテキスト文字列
89
+ */
90
+ export function richTextToPlain(richTexts) {
91
+ if (!richTexts || richTexts.length === 0) {
92
+ return '';
93
+ }
94
+ return richTexts.map((item) => item.plain_text ?? item.text?.content ?? '').join('');
95
+ }
@@ -1,7 +1,7 @@
1
- export { createNotionClient, type NotionClient } from "./notion-client.js";
2
- export * from "./schemas/index.js";
3
- export { startServer } from "./server.js";
4
- export { registerAllTools, registerAppendBlockChildren, registerCreateComment, registerCreatePage, registerGetBlockChildren, registerQueryDatabase, registerRetrievePage, registerSearch, registerUpdatePage, } from "./tools/index.js";
5
- export type { McpResponse, McpTextContent } from "./utils/index.js";
6
- export { formatResponse, formatSuccessMessage, handleError } from "./utils/index.js";
1
+ export { createNotionClient, type NotionClient } from './notion-client.js';
2
+ export * from './schemas/index.js';
3
+ export { startServer } from './server.js';
4
+ export { registerAllTools, registerAppendBlockChildren, registerCreateComment, registerCreatePage, registerGetBlockChildren, registerQueryDatabase, registerRetrievePage, registerSearch, registerUpdatePage, } from './tools/index.js';
5
+ export type { McpResponse, McpTextContent } from './utils/index.js';
6
+ export { formatResponse, formatSuccessMessage, handleError } from './utils/index.js';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE1E,cAAc,oBAAoB,CAAA;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzC,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEnE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/src/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  // Main exports
2
- export { createNotionClient } from "./notion-client.js";
2
+ export { createNotionClient } from './notion-client.js';
3
3
  // Schemas
4
- export * from "./schemas/index.js";
5
- export { startServer } from "./server.js";
4
+ export * from './schemas/index.js';
5
+ export { startServer } from './server.js';
6
6
  // Tool registration
7
- export { registerAllTools, registerAppendBlockChildren, registerCreateComment, registerCreatePage, registerGetBlockChildren, registerQueryDatabase, registerRetrievePage, registerSearch, registerUpdatePage, } from "./tools/index.js";
7
+ export { registerAllTools, registerAppendBlockChildren, registerCreateComment, registerCreatePage, registerGetBlockChildren, registerQueryDatabase, registerRetrievePage, registerSearch, registerUpdatePage, } from './tools/index.js';
8
8
  // Utils
9
- export { formatResponse, formatSuccessMessage, handleError } from "./utils/index.js";
9
+ export { formatResponse, formatSuccessMessage, handleError } from './utils/index.js';
@@ -1,13 +1,26 @@
1
+ import type { z } from 'zod';
2
+ import type { Block } from './schemas/block.js';
3
+ import type { CoverSchema, IconSchema, RichTextSchema } from './schemas/common.js';
4
+ import type { DatabasePropertiesSchema } from './schemas/database.js';
5
+ import type { FilterSchema, SortSchema } from './schemas/filter.js';
6
+ import type { PropertyValueSchema } from './schemas/page.js';
7
+ type RichText = z.infer<typeof RichTextSchema>;
8
+ type Icon = z.infer<typeof IconSchema>;
9
+ type Cover = z.infer<typeof CoverSchema>;
10
+ type PropertyValue = z.infer<typeof PropertyValueSchema>;
11
+ type DatabaseProperties = z.infer<typeof DatabasePropertiesSchema>;
12
+ type Filter = z.infer<typeof FilterSchema>;
13
+ type Sort = z.infer<typeof SortSchema>;
1
14
  export interface NotionClientOptions {
2
15
  token: string;
3
16
  }
4
17
  export interface NotionRequestOptions {
5
- method?: "GET" | "POST" | "PATCH" | "DELETE";
18
+ method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';
6
19
  body?: unknown;
7
20
  query?: Record<string, string | number | undefined>;
8
21
  }
9
22
  export interface NotionError {
10
- object: "error";
23
+ object: 'error';
11
24
  status: number;
12
25
  code: string;
13
26
  message: string;
@@ -23,30 +36,53 @@ export declare class NotionClient {
23
36
  } | {
24
37
  page_id: string;
25
38
  };
26
- properties: Record<string, unknown>;
27
- children?: unknown[];
28
- icon?: unknown;
29
- cover?: unknown;
39
+ properties: Record<string, PropertyValue>;
40
+ children?: Block[];
41
+ icon?: Icon;
42
+ cover?: Cover;
30
43
  }) => Promise<T>;
31
44
  retrieve: <T>(params: {
32
45
  page_id: string;
33
46
  }) => Promise<T>;
34
47
  update: <T>(params: {
35
48
  page_id: string;
36
- properties?: Record<string, unknown>;
49
+ properties?: Record<string, PropertyValue>;
37
50
  archived?: boolean;
38
- icon?: unknown;
39
- cover?: unknown;
51
+ icon?: Icon | null;
52
+ cover?: Cover | null;
40
53
  }) => Promise<T>;
41
54
  };
42
55
  databases: {
56
+ create: <T>(params: {
57
+ parent: {
58
+ page_id: string;
59
+ };
60
+ title?: RichText[];
61
+ properties: DatabaseProperties;
62
+ icon?: Icon;
63
+ cover?: Cover;
64
+ is_inline?: boolean;
65
+ }) => Promise<T>;
43
66
  query: <T>(params: {
44
67
  database_id: string;
45
- filter?: unknown;
46
- sorts?: unknown[];
68
+ filter?: Filter;
69
+ sorts?: Sort[];
47
70
  start_cursor?: string;
48
71
  page_size?: number;
49
72
  }) => Promise<T>;
73
+ retrieve: <T>(params: {
74
+ database_id: string;
75
+ }) => Promise<T>;
76
+ update: <T>(params: {
77
+ database_id: string;
78
+ title?: RichText[];
79
+ description?: RichText[];
80
+ properties?: DatabaseProperties;
81
+ icon?: Icon | null;
82
+ cover?: Cover | null;
83
+ is_inline?: boolean;
84
+ archived?: boolean;
85
+ }) => Promise<T>;
50
86
  };
51
87
  blocks: {
52
88
  children: {
@@ -57,7 +93,7 @@ export declare class NotionClient {
57
93
  }) => Promise<T>;
58
94
  append: <T>(params: {
59
95
  block_id: string;
60
- children: unknown[];
96
+ children: Block[];
61
97
  after?: string;
62
98
  }) => Promise<T>;
63
99
  };
@@ -67,16 +103,23 @@ export declare class NotionClient {
67
103
  parent: {
68
104
  page_id: string;
69
105
  };
70
- rich_text: unknown[];
106
+ rich_text: RichText[];
71
107
  }) => Promise<T>;
72
108
  };
73
109
  search: <T>(params?: {
74
110
  query?: string;
75
- filter?: unknown;
76
- sort?: unknown;
111
+ filter?: {
112
+ value: "page" | "database";
113
+ property: "object";
114
+ };
115
+ sort?: {
116
+ direction: "ascending" | "descending";
117
+ timestamp: "last_edited_time";
118
+ };
77
119
  start_cursor?: string;
78
120
  page_size?: number;
79
121
  }) => Promise<T>;
80
122
  }
81
123
  export declare function createNotionClient(): NotionClient;
124
+ export {};
82
125
  //# sourceMappingURL=notion-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notion-client.d.ts","sourceRoot":"","sources":["../../src/notion-client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,mBAAmB;YAI1B,OAAO;IAwCrB,KAAK;iBACM,CAAC,UAAU;YAClB,MAAM,EAAE;gBAAE,WAAW,EAAE,MAAM,CAAA;aAAE,GAAG;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC;YACtD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,EAAE,OAAO,CAAC;YACf,KAAK,CAAC,EAAE,OAAO,CAAC;SACjB,KAAG,OAAO,CAAC,CAAC,CAAC;mBAIH,CAAC,UAAU;YAAE,OAAO,EAAE,MAAM,CAAA;SAAE,KAAG,OAAO,CAAC,CAAC,CAAC;iBAI7C,CAAC,UAAU;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,IAAI,CAAC,EAAE,OAAO,CAAC;YACf,KAAK,CAAC,EAAE,OAAO,CAAC;SACjB,KAAG,OAAO,CAAC,CAAC,CAAC;MAId;IAGF,SAAS;gBACC,CAAC,UAAU;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,MAAM,CAAC,EAAE,OAAO,CAAC;YACjB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;YAClB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,KAAG,OAAO,CAAC,CAAC,CAAC;MAId;IAGF,MAAM;;mBAEK,CAAC,UAAU;gBAChB,QAAQ,EAAE,MAAM,CAAC;gBACjB,YAAY,CAAC,EAAE,MAAM,CAAC;gBACtB,SAAS,CAAC,EAAE,MAAM,CAAC;aACpB,KAAG,OAAO,CAAC,CAAC,CAAC;qBAOL,CAAC,UAAU;gBAClB,QAAQ,EAAE,MAAM,CAAC;gBACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;gBACpB,KAAK,CAAC,EAAE,MAAM,CAAC;aAChB,KAAG,OAAO,CAAC,CAAC,CAAC;;MAKhB;IAGF,QAAQ;iBACG,CAAC,UAAU;YAAE,MAAM,EAAE;gBAAE,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,SAAS,EAAE,OAAO,EAAE,CAAA;SAAE,KAAG,OAAO,CAAC,CAAC,CAAC;MAGtF;IAGF,MAAM,GAAI,CAAC,EAAE,SAAS;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAG,OAAO,CAAC,CAAC,CAAC,CAEZ;CACH;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CASjD"}
1
+ {"version":3,"file":"notion-client.d.ts","sourceRoot":"","sources":["../../src/notion-client.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
- const NOTION_API_BASE = "https://api.notion.com/v1";
2
- const NOTION_VERSION = "2022-06-28";
1
+ const NOTION_API_BASE = 'https://api.notion.com/v1';
2
+ const NOTION_VERSION = '2022-06-28';
3
3
  export class NotionClient {
4
4
  token;
5
5
  constructor(options) {
6
6
  this.token = options.token;
7
7
  }
8
8
  async request(endpoint, options = {}) {
9
- const { method = "GET", body, query } = options;
9
+ const { method = 'GET', body, query } = options;
10
10
  let url = `${NOTION_API_BASE}${endpoint}`;
11
11
  if (query) {
12
12
  const params = new URLSearchParams();
@@ -22,8 +22,8 @@ export class NotionClient {
22
22
  }
23
23
  const headers = {
24
24
  Authorization: `Bearer ${this.token}`,
25
- "Notion-Version": NOTION_VERSION,
26
- "Content-Type": "application/json",
25
+ 'Notion-Version': NOTION_VERSION,
26
+ 'Content-Type': 'application/json',
27
27
  };
28
28
  const response = await fetch(url, {
29
29
  method,
@@ -40,21 +40,31 @@ export class NotionClient {
40
40
  // Pages
41
41
  pages = {
42
42
  create: (params) => {
43
- return this.request("/pages", { method: "POST", body: params });
43
+ return this.request('/pages', { method: 'POST', body: params });
44
44
  },
45
45
  retrieve: (params) => {
46
46
  return this.request(`/pages/${params.page_id}`);
47
47
  },
48
48
  update: (params) => {
49
49
  const { page_id, ...body } = params;
50
- return this.request(`/pages/${page_id}`, { method: "PATCH", body });
50
+ return this.request(`/pages/${page_id}`, { method: 'PATCH', body });
51
51
  },
52
52
  };
53
53
  // Databases
54
54
  databases = {
55
+ create: (params) => {
56
+ return this.request('/databases', { method: 'POST', body: params });
57
+ },
55
58
  query: (params) => {
56
59
  const { database_id, ...body } = params;
57
- return this.request(`/databases/${database_id}/query`, { method: "POST", body });
60
+ return this.request(`/databases/${database_id}/query`, { method: 'POST', body });
61
+ },
62
+ retrieve: (params) => {
63
+ return this.request(`/databases/${params.database_id}`);
64
+ },
65
+ update: (params) => {
66
+ const { database_id, ...body } = params;
67
+ return this.request(`/databases/${database_id}`, { method: 'PATCH', body });
58
68
  },
59
69
  };
60
70
  // Blocks
@@ -68,26 +78,26 @@ export class NotionClient {
68
78
  },
69
79
  append: (params) => {
70
80
  const { block_id, ...body } = params;
71
- return this.request(`/blocks/${block_id}/children`, { method: "PATCH", body });
81
+ return this.request(`/blocks/${block_id}/children`, { method: 'PATCH', body });
72
82
  },
73
83
  },
74
84
  };
75
85
  // Comments
76
86
  comments = {
77
87
  create: (params) => {
78
- return this.request("/comments", { method: "POST", body: params });
88
+ return this.request('/comments', { method: 'POST', body: params });
79
89
  },
80
90
  };
81
91
  // Search
82
92
  search = (params) => {
83
- return this.request("/search", { method: "POST", body: params || {} });
93
+ return this.request('/search', { method: 'POST', body: params || {} });
84
94
  };
85
95
  }
86
96
  export function createNotionClient() {
87
97
  const token = process.env.NOTION_TOKEN;
88
98
  if (!token) {
89
- throw new Error("NOTION_TOKEN environment variable is required. " +
90
- "Please set it to your Notion integration token.");
99
+ throw new Error('NOTION_TOKEN environment variable is required. ' +
100
+ 'Please set it to your Notion integration token.');
91
101
  }
92
102
  return new NotionClient({ token });
93
103
  }