@m2ai-mcp/notion-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/.env.example +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +228 -0
  4. package/dist/index.d.ts +10 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +374 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/tools/blocks.d.ts +43 -0
  9. package/dist/tools/blocks.d.ts.map +1 -0
  10. package/dist/tools/blocks.js +124 -0
  11. package/dist/tools/blocks.js.map +1 -0
  12. package/dist/tools/databases.d.ts +71 -0
  13. package/dist/tools/databases.d.ts.map +1 -0
  14. package/dist/tools/databases.js +121 -0
  15. package/dist/tools/databases.js.map +1 -0
  16. package/dist/tools/index.d.ts +9 -0
  17. package/dist/tools/index.d.ts.map +1 -0
  18. package/dist/tools/index.js +9 -0
  19. package/dist/tools/index.js.map +1 -0
  20. package/dist/tools/pages.d.ts +72 -0
  21. package/dist/tools/pages.d.ts.map +1 -0
  22. package/dist/tools/pages.js +153 -0
  23. package/dist/tools/pages.js.map +1 -0
  24. package/dist/tools/search.d.ts +28 -0
  25. package/dist/tools/search.d.ts.map +1 -0
  26. package/dist/tools/search.js +62 -0
  27. package/dist/tools/search.js.map +1 -0
  28. package/dist/tools/users.d.ts +33 -0
  29. package/dist/tools/users.d.ts.map +1 -0
  30. package/dist/tools/users.js +51 -0
  31. package/dist/tools/users.js.map +1 -0
  32. package/dist/utils/markdown-converter.d.ts +31 -0
  33. package/dist/utils/markdown-converter.d.ts.map +1 -0
  34. package/dist/utils/markdown-converter.js +355 -0
  35. package/dist/utils/markdown-converter.js.map +1 -0
  36. package/dist/utils/notion-client.d.ts +32 -0
  37. package/dist/utils/notion-client.d.ts.map +1 -0
  38. package/dist/utils/notion-client.js +111 -0
  39. package/dist/utils/notion-client.js.map +1 -0
  40. package/dist/utils/types.d.ts +212 -0
  41. package/dist/utils/types.d.ts.map +1 -0
  42. package/dist/utils/types.js +18 -0
  43. package/dist/utils/types.js.map +1 -0
  44. package/jest.config.cjs +33 -0
  45. package/package.json +53 -0
  46. package/server.json +92 -0
  47. package/src/index.ts +435 -0
  48. package/src/tools/blocks.ts +184 -0
  49. package/src/tools/databases.ts +216 -0
  50. package/src/tools/index.ts +9 -0
  51. package/src/tools/pages.ts +253 -0
  52. package/src/tools/search.ts +96 -0
  53. package/src/tools/users.ts +93 -0
  54. package/src/utils/markdown-converter.ts +408 -0
  55. package/src/utils/notion-client.ts +159 -0
  56. package/src/utils/types.ts +237 -0
  57. package/tests/markdown-converter.test.ts +252 -0
  58. package/tests/notion-client.test.ts +67 -0
  59. package/tests/tools.test.ts +448 -0
  60. package/tsconfig.json +20 -0
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Search Tool
3
+ * Search across all pages and databases in the workspace
4
+ */
5
+ import { NotionClient } from '../utils/notion-client.js';
6
+ export interface SearchParams {
7
+ query: string;
8
+ filter_type?: 'page' | 'database';
9
+ sort_direction?: 'ascending' | 'descending';
10
+ page_size?: number;
11
+ }
12
+ export interface SearchResult {
13
+ id: string;
14
+ type: 'page' | 'database';
15
+ title: string;
16
+ url: string;
17
+ last_edited_time: string;
18
+ }
19
+ export interface SearchToolResult {
20
+ success: boolean;
21
+ results?: SearchResult[];
22
+ total_count?: number;
23
+ has_more?: boolean;
24
+ error?: string;
25
+ suggestion?: string;
26
+ }
27
+ export declare function search(client: NotionClient, params: SearchParams): Promise<SearchToolResult>;
28
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAClC,cAAc,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+DlG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Search Tool
3
+ * Search across all pages and databases in the workspace
4
+ */
5
+ import { getPageTitle, getDatabaseTitle } from '../utils/types.js';
6
+ export async function search(client, params) {
7
+ const { query, filter_type, sort_direction = 'descending', page_size = 10 } = params;
8
+ const requestBody = {
9
+ query,
10
+ page_size: Math.min(Math.max(page_size, 1), 100)
11
+ };
12
+ if (filter_type) {
13
+ requestBody.filter = {
14
+ value: filter_type,
15
+ property: 'object'
16
+ };
17
+ }
18
+ requestBody.sort = {
19
+ direction: sort_direction,
20
+ timestamp: 'last_edited_time'
21
+ };
22
+ const response = await client.post('/search', requestBody);
23
+ if (!response.success || !response.data) {
24
+ return {
25
+ success: false,
26
+ error: response.error || 'Failed to search'
27
+ };
28
+ }
29
+ const results = response.data.results.map(item => {
30
+ if (item.object === 'page') {
31
+ const page = item;
32
+ return {
33
+ id: page.id,
34
+ type: 'page',
35
+ title: getPageTitle(page),
36
+ url: page.url,
37
+ last_edited_time: page.last_edited_time
38
+ };
39
+ }
40
+ else {
41
+ const database = item;
42
+ return {
43
+ id: database.id,
44
+ type: 'database',
45
+ title: getDatabaseTitle(database),
46
+ url: database.url,
47
+ last_edited_time: database.last_edited_time
48
+ };
49
+ }
50
+ });
51
+ const result = {
52
+ success: true,
53
+ results,
54
+ total_count: results.length,
55
+ has_more: response.data.has_more
56
+ };
57
+ if (results.length === 0) {
58
+ result.suggestion = `No results found for "${query}". Try alternative search terms or check that the content is shared with the integration.`;
59
+ }
60
+ return result;
61
+ }
62
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAkB,YAAY,EAAE,gBAAgB,EAA8B,MAAM,mBAAmB,CAAC;AA0B/G,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAoB,EAAE,MAAoB;IACrE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,GAAG,YAAY,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAErF,MAAM,WAAW,GAA4B;QAC3C,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC;KACjD,CAAC;IAEF,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,MAAM,GAAG;YACnB,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,QAAQ;SACnB,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAI,GAAG;QACjB,SAAS,EAAE,cAAc;QACzB,SAAS,EAAE,kBAAkB;KAC9B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAiB,SAAS,EAAE,WAAW,CAAC,CAAC;IAE3E,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,kBAAkB;SAC5C,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAmB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAkB,CAAC;YAChC,OAAO;gBACL,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,MAAe;gBACrB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;gBACzB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAsB,CAAC;YACxC,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,IAAI,EAAE,UAAmB;gBACzB,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC;gBACjC,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;aAC5C,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAqB;QAC/B,OAAO,EAAE,IAAI;QACb,OAAO;QACP,WAAW,EAAE,OAAO,CAAC,MAAM;QAC3B,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,UAAU,GAAG,yBAAyB,KAAK,2FAA2F,CAAC;IAChJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * User Tools
3
+ * list_users, get_user
4
+ */
5
+ import { NotionClient } from '../utils/notion-client.js';
6
+ export interface ListUsersParams {
7
+ page_size?: number;
8
+ }
9
+ export interface UserInfo {
10
+ id: string;
11
+ type: 'person' | 'bot' | undefined;
12
+ name: string | undefined;
13
+ avatar_url: string | null | undefined;
14
+ email?: string;
15
+ }
16
+ export interface ListUsersResult {
17
+ success: boolean;
18
+ users?: UserInfo[];
19
+ total_count?: number;
20
+ has_more?: boolean;
21
+ error?: string;
22
+ }
23
+ export declare function listUsers(client: NotionClient, params?: ListUsersParams): Promise<ListUsersResult>;
24
+ export interface GetUserParams {
25
+ user_id: string;
26
+ }
27
+ export interface GetUserResult {
28
+ success: boolean;
29
+ user?: UserInfo;
30
+ error?: string;
31
+ }
32
+ export declare function getUser(client: NotionClient, params: GetUserParams): Promise<GetUserResult>;
33
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAmB,MAAM,2BAA2B,CAAC;AAI1E,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IACnC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,GAAE,eAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CA2B5G;AAGD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBjG"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * User Tools
3
+ * list_users, get_user
4
+ */
5
+ import { extractNotionId } from '../utils/notion-client.js';
6
+ export async function listUsers(client, params = {}) {
7
+ const { page_size = 100 } = params;
8
+ const endpoint = `/users?page_size=${Math.min(Math.max(page_size, 1), 100)}`;
9
+ const response = await client.get(endpoint);
10
+ if (!response.success || !response.data) {
11
+ return {
12
+ success: false,
13
+ error: response.error || 'Failed to list users'
14
+ };
15
+ }
16
+ const users = response.data.results.map(user => ({
17
+ id: user.id,
18
+ type: user.type,
19
+ name: user.name,
20
+ avatar_url: user.avatar_url,
21
+ email: user.person?.email
22
+ }));
23
+ return {
24
+ success: true,
25
+ users,
26
+ total_count: users.length,
27
+ has_more: response.data.has_more
28
+ };
29
+ }
30
+ export async function getUser(client, params) {
31
+ const userId = extractNotionId(params.user_id);
32
+ const response = await client.get(`/users/${userId}`);
33
+ if (!response.success || !response.data) {
34
+ return {
35
+ success: false,
36
+ error: response.error || 'Failed to get user'
37
+ };
38
+ }
39
+ const user = response.data;
40
+ return {
41
+ success: true,
42
+ user: {
43
+ id: user.id,
44
+ type: user.type,
45
+ name: user.name,
46
+ avatar_url: user.avatar_url,
47
+ email: user.person?.email
48
+ }
49
+ };
50
+ }
51
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAgB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAwB1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB,EAAE,SAA0B,EAAE;IAChF,MAAM,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC;IAEnC,MAAM,QAAQ,GAAG,oBAAoB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC7E,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAgC,QAAQ,CAAC,CAAC;IAE3E,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,sBAAsB;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAe,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;KAC1B,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO,EAAE,IAAI;QACb,KAAK;QACL,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ;KACjC,CAAC;AACJ,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAoB,EAAE,MAAqB;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAa,UAAU,MAAM,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,oBAAoB;SAC9C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE3B,OAAO;QACL,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;SAC1B;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Markdown to Notion Block Converter
3
+ * Converts markdown text to Notion block format
4
+ */
5
+ export interface NotionRichText {
6
+ type: 'text';
7
+ text: {
8
+ content: string;
9
+ link?: {
10
+ url: string;
11
+ } | null;
12
+ };
13
+ annotations?: {
14
+ bold?: boolean;
15
+ italic?: boolean;
16
+ strikethrough?: boolean;
17
+ underline?: boolean;
18
+ code?: boolean;
19
+ color?: string;
20
+ };
21
+ }
22
+ export interface NotionBlock {
23
+ object: 'block';
24
+ type: string;
25
+ [key: string]: unknown;
26
+ }
27
+ export declare function parseInlineFormatting(text: string): NotionRichText[];
28
+ export declare function markdownToBlocks(markdown: string): NotionBlock[];
29
+ export declare function blocksToMarkdown(blocks: unknown[]): string;
30
+ export declare function blocksToPlainText(blocks: unknown[]): string;
31
+ //# sourceMappingURL=markdown-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-converter.d.ts","sourceRoot":"","sources":["../../src/utils/markdown-converter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;KAC/B,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CA+EpE;AAyKD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CA0BhE;AAGD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAuD1D;AA+BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAgB3D"}
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Markdown to Notion Block Converter
3
+ * Converts markdown text to Notion block format
4
+ */
5
+ // Parse inline formatting (bold, italic, code, links, strikethrough)
6
+ export function parseInlineFormatting(text) {
7
+ const result = [];
8
+ let remaining = text;
9
+ // Regex patterns for inline formatting
10
+ const patterns = [
11
+ { regex: /\*\*(.+?)\*\*/g, annotation: 'bold' },
12
+ { regex: /\*(.+?)\*/g, annotation: 'italic' },
13
+ { regex: /~~(.+?)~~/g, annotation: 'strikethrough' },
14
+ { regex: /`(.+?)`/g, annotation: 'code' },
15
+ { regex: /\[([^\]]+)\]\(([^)]+)\)/g, annotation: 'link' }
16
+ ];
17
+ // Simple approach: find the first match of any pattern
18
+ while (remaining.length > 0) {
19
+ let earliestMatch = null;
20
+ for (const { regex, annotation } of patterns) {
21
+ regex.lastIndex = 0;
22
+ const match = regex.exec(remaining);
23
+ if (match && (!earliestMatch || match.index < earliestMatch.index)) {
24
+ if (annotation === 'link') {
25
+ earliestMatch = {
26
+ index: match.index,
27
+ length: match[0].length,
28
+ content: match[1],
29
+ annotation,
30
+ url: match[2]
31
+ };
32
+ }
33
+ else {
34
+ earliestMatch = {
35
+ index: match.index,
36
+ length: match[0].length,
37
+ content: match[1],
38
+ annotation
39
+ };
40
+ }
41
+ }
42
+ }
43
+ if (earliestMatch) {
44
+ // Add plain text before the match
45
+ if (earliestMatch.index > 0) {
46
+ result.push({
47
+ type: 'text',
48
+ text: { content: remaining.substring(0, earliestMatch.index) }
49
+ });
50
+ }
51
+ // Add formatted text
52
+ const richText = {
53
+ type: 'text',
54
+ text: {
55
+ content: earliestMatch.content,
56
+ link: earliestMatch.url ? { url: earliestMatch.url } : null
57
+ },
58
+ annotations: {}
59
+ };
60
+ if (earliestMatch.annotation !== 'link') {
61
+ richText.annotations = { [earliestMatch.annotation]: true };
62
+ }
63
+ result.push(richText);
64
+ remaining = remaining.substring(earliestMatch.index + earliestMatch.length);
65
+ }
66
+ else {
67
+ // No more matches, add remaining text
68
+ if (remaining.length > 0) {
69
+ result.push({
70
+ type: 'text',
71
+ text: { content: remaining }
72
+ });
73
+ }
74
+ break;
75
+ }
76
+ }
77
+ return result.length > 0 ? result : [{ type: 'text', text: { content: text } }];
78
+ }
79
+ // Convert a single line to a Notion block
80
+ function lineToBlock(line) {
81
+ const trimmed = line.trim();
82
+ if (trimmed === '') {
83
+ return null;
84
+ }
85
+ // Heading 1
86
+ if (trimmed.startsWith('# ')) {
87
+ return {
88
+ object: 'block',
89
+ type: 'heading_1',
90
+ heading_1: {
91
+ rich_text: parseInlineFormatting(trimmed.substring(2))
92
+ }
93
+ };
94
+ }
95
+ // Heading 2
96
+ if (trimmed.startsWith('## ')) {
97
+ return {
98
+ object: 'block',
99
+ type: 'heading_2',
100
+ heading_2: {
101
+ rich_text: parseInlineFormatting(trimmed.substring(3))
102
+ }
103
+ };
104
+ }
105
+ // Heading 3
106
+ if (trimmed.startsWith('### ')) {
107
+ return {
108
+ object: 'block',
109
+ type: 'heading_3',
110
+ heading_3: {
111
+ rich_text: parseInlineFormatting(trimmed.substring(4))
112
+ }
113
+ };
114
+ }
115
+ // Checkbox / To-do
116
+ if (trimmed.startsWith('- [ ] ') || trimmed.startsWith('- [x] ')) {
117
+ const checked = trimmed.startsWith('- [x] ');
118
+ const content = trimmed.substring(6);
119
+ return {
120
+ object: 'block',
121
+ type: 'to_do',
122
+ to_do: {
123
+ rich_text: parseInlineFormatting(content),
124
+ checked
125
+ }
126
+ };
127
+ }
128
+ // Bullet list
129
+ if (trimmed.startsWith('- ') || trimmed.startsWith('* ')) {
130
+ return {
131
+ object: 'block',
132
+ type: 'bulleted_list_item',
133
+ bulleted_list_item: {
134
+ rich_text: parseInlineFormatting(trimmed.substring(2))
135
+ }
136
+ };
137
+ }
138
+ // Numbered list
139
+ const numberedMatch = trimmed.match(/^(\d+)\.\s+(.+)$/);
140
+ if (numberedMatch) {
141
+ return {
142
+ object: 'block',
143
+ type: 'numbered_list_item',
144
+ numbered_list_item: {
145
+ rich_text: parseInlineFormatting(numberedMatch[2])
146
+ }
147
+ };
148
+ }
149
+ // Blockquote
150
+ if (trimmed.startsWith('> ')) {
151
+ return {
152
+ object: 'block',
153
+ type: 'quote',
154
+ quote: {
155
+ rich_text: parseInlineFormatting(trimmed.substring(2))
156
+ }
157
+ };
158
+ }
159
+ // Horizontal rule
160
+ if (trimmed === '---' || trimmed === '***' || trimmed === '___') {
161
+ return {
162
+ object: 'block',
163
+ type: 'divider',
164
+ divider: {}
165
+ };
166
+ }
167
+ // Default: paragraph
168
+ return {
169
+ object: 'block',
170
+ type: 'paragraph',
171
+ paragraph: {
172
+ rich_text: parseInlineFormatting(trimmed)
173
+ }
174
+ };
175
+ }
176
+ // Handle code blocks
177
+ function parseCodeBlocks(markdown) {
178
+ const parts = [];
179
+ const lines = markdown.split('\n');
180
+ let inCodeBlock = false;
181
+ let codeContent = [];
182
+ let codeLanguage = '';
183
+ let textContent = [];
184
+ for (const line of lines) {
185
+ if (line.startsWith('```')) {
186
+ if (inCodeBlock) {
187
+ // End of code block
188
+ parts.push({
189
+ content: codeContent.join('\n'),
190
+ isCode: true,
191
+ language: codeLanguage || 'plain text'
192
+ });
193
+ codeContent = [];
194
+ codeLanguage = '';
195
+ inCodeBlock = false;
196
+ }
197
+ else {
198
+ // Start of code block
199
+ if (textContent.length > 0) {
200
+ parts.push({
201
+ content: textContent.join('\n'),
202
+ isCode: false
203
+ });
204
+ textContent = [];
205
+ }
206
+ codeLanguage = line.substring(3).trim();
207
+ inCodeBlock = true;
208
+ }
209
+ }
210
+ else if (inCodeBlock) {
211
+ codeContent.push(line);
212
+ }
213
+ else {
214
+ textContent.push(line);
215
+ }
216
+ }
217
+ // Handle remaining content
218
+ if (textContent.length > 0) {
219
+ parts.push({
220
+ content: textContent.join('\n'),
221
+ isCode: false
222
+ });
223
+ }
224
+ if (codeContent.length > 0) {
225
+ parts.push({
226
+ content: codeContent.join('\n'),
227
+ isCode: true,
228
+ language: codeLanguage || 'plain text'
229
+ });
230
+ }
231
+ return parts;
232
+ }
233
+ // Main conversion function
234
+ export function markdownToBlocks(markdown) {
235
+ const blocks = [];
236
+ const parts = parseCodeBlocks(markdown);
237
+ for (const part of parts) {
238
+ if (part.isCode) {
239
+ blocks.push({
240
+ object: 'block',
241
+ type: 'code',
242
+ code: {
243
+ rich_text: [{ type: 'text', text: { content: part.content } }],
244
+ language: part.language || 'plain text'
245
+ }
246
+ });
247
+ }
248
+ else {
249
+ const lines = part.content.split('\n');
250
+ for (const line of lines) {
251
+ const block = lineToBlock(line);
252
+ if (block) {
253
+ blocks.push(block);
254
+ }
255
+ }
256
+ }
257
+ }
258
+ return blocks;
259
+ }
260
+ // Convert Notion blocks to markdown
261
+ export function blocksToMarkdown(blocks) {
262
+ const lines = [];
263
+ for (const block of blocks) {
264
+ const b = block;
265
+ const type = b.type;
266
+ switch (type) {
267
+ case 'paragraph':
268
+ lines.push(richTextToMarkdown(b.paragraph.rich_text));
269
+ break;
270
+ case 'heading_1':
271
+ lines.push('# ' + richTextToMarkdown(b.heading_1.rich_text));
272
+ break;
273
+ case 'heading_2':
274
+ lines.push('## ' + richTextToMarkdown(b.heading_2.rich_text));
275
+ break;
276
+ case 'heading_3':
277
+ lines.push('### ' + richTextToMarkdown(b.heading_3.rich_text));
278
+ break;
279
+ case 'bulleted_list_item':
280
+ lines.push('- ' + richTextToMarkdown(b.bulleted_list_item.rich_text));
281
+ break;
282
+ case 'numbered_list_item':
283
+ lines.push('1. ' + richTextToMarkdown(b.numbered_list_item.rich_text));
284
+ break;
285
+ case 'to_do': {
286
+ const todo = b.to_do;
287
+ const checked = todo.checked ? 'x' : ' ';
288
+ lines.push(`- [${checked}] ` + richTextToMarkdown(todo.rich_text));
289
+ break;
290
+ }
291
+ case 'quote':
292
+ lines.push('> ' + richTextToMarkdown(b.quote.rich_text));
293
+ break;
294
+ case 'code': {
295
+ const code = b.code;
296
+ const lang = code.language || '';
297
+ lines.push('```' + lang);
298
+ lines.push(richTextToMarkdown(code.rich_text));
299
+ lines.push('```');
300
+ break;
301
+ }
302
+ case 'divider':
303
+ lines.push('---');
304
+ break;
305
+ default:
306
+ // For unsupported blocks, try to extract any rich_text
307
+ if (b[type] && b[type].rich_text) {
308
+ lines.push(richTextToMarkdown(b[type].rich_text));
309
+ }
310
+ }
311
+ }
312
+ return lines.join('\n\n');
313
+ }
314
+ // Convert rich text array to markdown string
315
+ function richTextToMarkdown(richText) {
316
+ if (!richText || !Array.isArray(richText))
317
+ return '';
318
+ return richText.map(rt => {
319
+ let text = rt.text?.content || '';
320
+ const annotations = rt.annotations;
321
+ if (annotations?.code) {
322
+ text = `\`${text}\``;
323
+ }
324
+ if (annotations?.bold) {
325
+ text = `**${text}**`;
326
+ }
327
+ if (annotations?.italic) {
328
+ text = `*${text}*`;
329
+ }
330
+ if (annotations?.strikethrough) {
331
+ text = `~~${text}~~`;
332
+ }
333
+ if (rt.text?.link?.url) {
334
+ text = `[${text}](${rt.text.link.url})`;
335
+ }
336
+ return text;
337
+ }).join('');
338
+ }
339
+ // Convert blocks to plain text
340
+ export function blocksToPlainText(blocks) {
341
+ const lines = [];
342
+ for (const block of blocks) {
343
+ const b = block;
344
+ const type = b.type;
345
+ const blockContent = b[type];
346
+ if (blockContent?.rich_text) {
347
+ const richText = blockContent.rich_text;
348
+ const text = richText.map(rt => rt.text?.content || '').join('');
349
+ if (text)
350
+ lines.push(text);
351
+ }
352
+ }
353
+ return lines.join('\n');
354
+ }
355
+ //# sourceMappingURL=markdown-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-converter.js","sourceRoot":"","sources":["../../src/utils/markdown-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Notion API Client
3
+ * Handles all HTTP communication with Notion API
4
+ */
5
+ export interface NotionClientConfig {
6
+ apiKey: string;
7
+ }
8
+ export interface NotionResponse<T = unknown> {
9
+ success: boolean;
10
+ data?: T;
11
+ error?: string;
12
+ status?: number;
13
+ }
14
+ export interface RateLimitConfig {
15
+ requestsPerSecond: number;
16
+ minDelayMs: number;
17
+ }
18
+ export declare class NotionClient {
19
+ private apiKey;
20
+ private lastRequestTime;
21
+ private rateLimitConfig;
22
+ constructor(config: NotionClientConfig);
23
+ private rateLimit;
24
+ private getHeaders;
25
+ request<T>(method: string, endpoint: string, body?: unknown): Promise<NotionResponse<T>>;
26
+ get<T>(endpoint: string): Promise<NotionResponse<T>>;
27
+ post<T>(endpoint: string, body?: unknown): Promise<NotionResponse<T>>;
28
+ patch<T>(endpoint: string, body?: unknown): Promise<NotionResponse<T>>;
29
+ delete<T>(endpoint: string): Promise<NotionResponse<T>>;
30
+ }
31
+ export declare function extractNotionId(input: string): string;
32
+ //# sourceMappingURL=notion-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notion-client.d.ts","sourceRoot":"","sources":["../../src/utils/notion-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,eAAe,CAGrB;gBAEU,MAAM,EAAE,kBAAkB;YAIxB,SAAS;IAYvB,OAAO,CAAC,UAAU;IAQZ,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAuCvB,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAIpD,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAIrE,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAItE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAG9D;AAYD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgCrD"}