@atikk-co-jp/notion-mcp-server 0.4.0 → 0.5.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 (44) hide show
  1. package/README.ja.md +53 -12
  2. package/README.md +53 -12
  3. package/dist/src/index.d.ts +1 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +1 -1
  6. package/dist/src/notion-client.d.ts +24 -10
  7. package/dist/src/notion-client.d.ts.map +1 -1
  8. package/dist/src/notion-client.js +48 -11
  9. package/dist/src/schemas/block.d.ts +2 -1
  10. package/dist/src/schemas/block.d.ts.map +1 -1
  11. package/dist/src/tools/archive-database.d.ts +4 -0
  12. package/dist/src/tools/archive-database.d.ts.map +1 -0
  13. package/dist/src/tools/archive-database.js +23 -0
  14. package/dist/src/tools/archive-page.d.ts +4 -0
  15. package/dist/src/tools/archive-page.d.ts.map +1 -0
  16. package/dist/src/tools/archive-page.js +23 -0
  17. package/dist/src/tools/create-database.js +3 -3
  18. package/dist/src/tools/create-page-simple.d.ts.map +1 -1
  19. package/dist/src/tools/create-page-simple.js +6 -5
  20. package/dist/src/tools/create-page.js +6 -6
  21. package/dist/src/tools/index.d.ts +6 -2
  22. package/dist/src/tools/index.d.ts.map +1 -1
  23. package/dist/src/tools/index.js +12 -3
  24. package/dist/src/tools/move-page.d.ts.map +1 -1
  25. package/dist/src/tools/move-page.js +8 -7
  26. package/dist/src/tools/query-data-source.d.ts +4 -0
  27. package/dist/src/tools/query-data-source.d.ts.map +1 -0
  28. package/dist/src/tools/{query-database.js → query-data-source.js} +9 -7
  29. package/dist/src/tools/retrieve-data-source.d.ts +4 -0
  30. package/dist/src/tools/retrieve-data-source.d.ts.map +1 -0
  31. package/dist/src/tools/retrieve-data-source.js +55 -0
  32. package/dist/src/tools/retrieve-database.d.ts.map +1 -1
  33. package/dist/src/tools/retrieve-database.js +7 -24
  34. package/dist/src/tools/search.d.ts.map +1 -1
  35. package/dist/src/tools/search.js +6 -5
  36. package/dist/src/tools/update-data-source.d.ts +4 -0
  37. package/dist/src/tools/update-data-source.d.ts.map +1 -0
  38. package/dist/src/tools/update-data-source.js +31 -0
  39. package/dist/src/tools/update-database.d.ts.map +1 -1
  40. package/dist/src/tools/update-database.js +5 -8
  41. package/dist/src/tools/update-page.js +1 -1
  42. package/package.json +1 -1
  43. package/dist/src/tools/query-database.d.ts +0 -4
  44. package/dist/src/tools/query-database.d.ts.map +0 -1
@@ -7,7 +7,7 @@ const inputSchema = {
7
7
  properties: z
8
8
  .record(z.string(), z.any())
9
9
  .describe('Property schema (must include one title property)'),
10
- icon: z.any().optional().describe('Database icon'),
10
+ icon: z.any().optional().describe('Database icon { type: "emoji", emoji: "📝" } or { type: "external", external: { url: "..." } }. Emoji must be an actual emoji character.'),
11
11
  cover: z.any().optional().describe('Cover image'),
12
12
  is_inline: z.boolean().optional().describe('Inline database'),
13
13
  };
@@ -15,13 +15,13 @@ export function registerCreateDatabase(server, notion) {
15
15
  server.registerTool('create-database', {
16
16
  description: 'Create a new database as a subpage of an existing Notion page. ' +
17
17
  'Requires a parent_page_id and properties object defining the database schema. ' +
18
- 'Each database must have exactly one title property.',
18
+ 'Each database must have exactly one title property. (API version 2025-09-03)',
19
19
  inputSchema,
20
20
  }, async ({ parent_page_id, title, properties, icon, cover, is_inline }) => {
21
21
  try {
22
22
  const params = {
23
23
  parent: { page_id: parent_page_id },
24
- properties: properties,
24
+ initial_data_source: { properties: properties },
25
25
  };
26
26
  if (title) {
27
27
  params.title = title;
@@ -1 +1 @@
1
- {"version":3,"file":"create-page-simple.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page-simple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA2DtF"}
1
+ {"version":3,"file":"create-page-simple.d.ts","sourceRoot":"","sources":["../../../src/tools/create-page-simple.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4DtF"}
@@ -3,19 +3,20 @@ import { markdownToBlocks } from '../converters/index.js';
3
3
  import { formatResponse, handleError } from '../utils/index.js';
4
4
  // Minimal schema for MCP
5
5
  const inputSchema = {
6
- database_id: z.string().describe('Database ID'),
6
+ data_source_id: z.string().describe('Data source ID (required in API 2025-09-03)'),
7
7
  title: z.string().describe('Page title'),
8
8
  content: z.string().optional().describe('Page content in Markdown'),
9
9
  properties: z.record(z.string(), z.any()).optional().describe('Additional properties'),
10
- icon: z.string().optional().describe('Emoji icon (e.g. "bug")'),
10
+ icon: z.string().optional().describe('Emoji character (e.g. "📝", "🐛", "✅"). Must be an actual emoji, not a name.'),
11
11
  };
12
12
  export function registerCreatePageSimple(server, notion) {
13
13
  server.registerTool('create-page-simple', {
14
14
  description: 'Create a Notion page with Markdown content. ' +
15
15
  'Simpler than create-page: just provide title and markdown text. ' +
16
- 'Supports: headings (#), lists (- or 1.), checkboxes (- [ ]), code blocks (```), quotes (>), images (![]()), bold (**), italic (*), links ([]()), etc.',
16
+ 'Supports: headings (#), lists (- or 1.), checkboxes (- [ ]), code blocks (```), quotes (>), images (![]()), bold (**), italic (*), links ([]()), etc. ' +
17
+ '(API version 2025-09-03)',
17
18
  inputSchema,
18
- }, async ({ database_id, title, content, properties, icon }) => {
19
+ }, async ({ data_source_id, title, content, properties, icon }) => {
19
20
  try {
20
21
  // Build properties with title
21
22
  const pageProperties = {
@@ -32,7 +33,7 @@ export function registerCreatePageSimple(server, notion) {
32
33
  }
33
34
  // Build params
34
35
  const params = {
35
- parent: { database_id },
36
+ parent: { data_source_id },
36
37
  properties: pageProperties,
37
38
  };
38
39
  // Convert markdown to blocks if content provided
@@ -2,22 +2,22 @@ import { z } from 'zod';
2
2
  import { formatResponse, handleError } from '../utils/index.js';
3
3
  // Minimal schema for MCP (full validation by Notion API)
4
4
  const inputSchema = {
5
- database_id: z.string().describe('Database ID'),
5
+ data_source_id: z.string().describe('Data source ID (required in API 2025-09-03)'),
6
6
  properties: z.record(z.string(), z.any()).describe('Notion properties object'),
7
7
  children: z.array(z.any()).optional().describe('Block objects array'),
8
- icon: z.any().optional().describe('Page icon'),
8
+ icon: z.any().optional().describe('Page icon { type: "emoji", emoji: "📝" } or { type: "external", external: { url: "..." } }. Emoji must be an actual emoji character.'),
9
9
  cover: z.any().optional().describe('Cover image'),
10
10
  };
11
11
  export function registerCreatePage(server, notion) {
12
12
  server.registerTool('create-page', {
13
- description: 'Create a new page in a Notion database. Requires a database_id and properties object. ' +
13
+ description: 'Create a new page in a Notion data source. Requires a data_source_id and properties object. ' +
14
14
  'Optionally include initial content blocks, icon, and cover image. ' +
15
- 'Returns the created page with its ID and URL.',
15
+ 'Returns the created page with its ID and URL. (API version 2025-09-03)',
16
16
  inputSchema,
17
- }, async ({ database_id, properties, children, icon, cover }) => {
17
+ }, async ({ data_source_id, properties, children, icon, cover }) => {
18
18
  try {
19
19
  const params = {
20
- parent: { database_id },
20
+ parent: { data_source_id },
21
21
  properties: properties,
22
22
  };
23
23
  if (children) {
@@ -2,6 +2,8 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { NotionClient } from '../notion-client.js';
3
3
  import { registerAppendBlockChildren } from './append-block-children.js';
4
4
  import { registerAppendBlocksSimple } from './append-blocks-simple.js';
5
+ import { registerArchiveDatabase } from './archive-database.js';
6
+ import { registerArchivePage } from './archive-page.js';
5
7
  import { registerCreateComment } from './create-comment.js';
6
8
  import { registerCreateDatabase } from './create-database.js';
7
9
  import { registerCreatePage } from './create-page.js';
@@ -11,10 +13,11 @@ import { registerGetBlockChildren } from './get-block-children.js';
11
13
  import { registerListComments } from './list-comments.js';
12
14
  import { registerListUsers } from './list-users.js';
13
15
  import { registerMovePage } from './move-page.js';
14
- import { registerQueryDatabase } from './query-database.js';
16
+ import { registerQueryDataSource } from './query-data-source.js';
15
17
  import { registerRetrieveBlock } from './retrieve-block.js';
16
18
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
17
19
  import { registerRetrieveDatabase } from './retrieve-database.js';
20
+ import { registerRetrieveDataSource } from './retrieve-data-source.js';
18
21
  import { registerRetrievePage } from './retrieve-page.js';
19
22
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
20
23
  import { registerRetrieveUser } from './retrieve-user.js';
@@ -22,7 +25,8 @@ import { registerSearch } from './search.js';
22
25
  import { registerUpdateBlock } from './update-block.js';
23
26
  import { registerUpdateBlockSimple } from './update-block-simple.js';
24
27
  import { registerUpdateDatabase } from './update-database.js';
28
+ import { registerUpdateDataSource } from './update-data-source.js';
25
29
  import { registerUpdatePage } from './update-page.js';
26
30
  export declare function registerAllTools(server: McpServer, notion: NotionClient): void;
27
- export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerQueryDatabase, registerRetrieveDatabase, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
31
+ export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
28
32
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAmC9E;AAED,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,GACxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAyC9E;AAED,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,GACxB,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import { registerAppendBlockChildren } from './append-block-children.js';
2
2
  import { registerAppendBlocksSimple } from './append-blocks-simple.js';
3
+ import { registerArchiveDatabase } from './archive-database.js';
4
+ import { registerArchivePage } from './archive-page.js';
3
5
  import { registerCreateComment } from './create-comment.js';
4
6
  import { registerCreateDatabase } from './create-database.js';
5
7
  import { registerCreatePage } from './create-page.js';
@@ -9,10 +11,11 @@ import { registerGetBlockChildren } from './get-block-children.js';
9
11
  import { registerListComments } from './list-comments.js';
10
12
  import { registerListUsers } from './list-users.js';
11
13
  import { registerMovePage } from './move-page.js';
12
- import { registerQueryDatabase } from './query-database.js';
14
+ import { registerQueryDataSource } from './query-data-source.js';
13
15
  import { registerRetrieveBlock } from './retrieve-block.js';
14
16
  import { registerRetrieveBotUser } from './retrieve-bot-user.js';
15
17
  import { registerRetrieveDatabase } from './retrieve-database.js';
18
+ import { registerRetrieveDataSource } from './retrieve-data-source.js';
16
19
  import { registerRetrievePage } from './retrieve-page.js';
17
20
  import { registerRetrievePageProperty } from './retrieve-page-property.js';
18
21
  import { registerRetrieveUser } from './retrieve-user.js';
@@ -20,6 +23,7 @@ import { registerSearch } from './search.js';
20
23
  import { registerUpdateBlock } from './update-block.js';
21
24
  import { registerUpdateBlockSimple } from './update-block-simple.js';
22
25
  import { registerUpdateDatabase } from './update-database.js';
26
+ import { registerUpdateDataSource } from './update-data-source.js';
23
27
  import { registerUpdatePage } from './update-page.js';
24
28
  export function registerAllTools(server, notion) {
25
29
  // Page operations
@@ -27,13 +31,18 @@ export function registerAllTools(server, notion) {
27
31
  registerCreatePage(server, notion);
28
32
  registerCreatePageSimple(server, notion);
29
33
  registerUpdatePage(server, notion);
34
+ registerArchivePage(server, notion);
30
35
  registerRetrievePageProperty(server, notion);
31
36
  registerMovePage(server, notion);
32
37
  // Database operations
33
38
  registerCreateDatabase(server, notion);
34
39
  registerUpdateDatabase(server, notion);
35
- registerQueryDatabase(server, notion);
40
+ registerArchiveDatabase(server, notion);
36
41
  registerRetrieveDatabase(server, notion);
42
+ // Data Source operations (API 2025-09-03)
43
+ registerRetrieveDataSource(server, notion);
44
+ registerQueryDataSource(server, notion);
45
+ registerUpdateDataSource(server, notion);
37
46
  // Search
38
47
  registerSearch(server, notion);
39
48
  // Block operations
@@ -52,4 +61,4 @@ export function registerAllTools(server, notion) {
52
61
  registerRetrieveUser(server, notion);
53
62
  registerRetrieveBotUser(server, notion);
54
63
  }
55
- export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerQueryDatabase, registerRetrieveDatabase, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
64
+ export { registerRetrievePage, registerCreatePage, registerCreatePageSimple, registerUpdatePage, registerArchivePage, registerRetrievePageProperty, registerMovePage, registerCreateDatabase, registerUpdateDatabase, registerArchiveDatabase, registerRetrieveDatabase, registerRetrieveDataSource, registerQueryDataSource, registerUpdateDataSource, registerSearch, registerGetBlockChildren, registerAppendBlockChildren, registerAppendBlocksSimple, registerRetrieveBlock, registerUpdateBlock, registerUpdateBlockSimple, registerDeleteBlock, registerCreateComment, registerListComments, registerListUsers, registerRetrieveUser, registerRetrieveBotUser, };
@@ -1 +1 @@
1
- {"version":3,"file":"move-page.d.ts","sourceRoot":"","sources":["../../../src/tools/move-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAavD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsC9E"}
1
+ {"version":3,"file":"move-page.d.ts","sourceRoot":"","sources":["../../../src/tools/move-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAavD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuC9E"}
@@ -5,23 +5,24 @@ const inputSchema = {
5
5
  parent: z
6
6
  .object({
7
7
  page_id: z.string().optional().describe('Target parent page ID'),
8
- database_id: z.string().optional().describe('Target database ID'),
8
+ data_source_id: z.string().optional().describe('Target data source ID'),
9
9
  })
10
- .describe('New parent (provide either page_id or database_id)'),
10
+ .describe('New parent (provide either page_id or data_source_id)'),
11
11
  };
12
12
  export function registerMovePage(server, notion) {
13
13
  server.registerTool('move-page', {
14
- description: 'Move a page to a new parent (page or database). ' +
15
- 'Provide either page_id or database_id as the new parent.',
14
+ description: 'Move a page to a new parent (page or data source). ' +
15
+ 'Provide either page_id or data_source_id as the new parent. ' +
16
+ '(API version 2025-09-03)',
16
17
  inputSchema,
17
18
  }, async ({ page_id, parent }) => {
18
19
  try {
19
- if (!parent.page_id && !parent.database_id) {
20
+ if (!parent.page_id && !parent.data_source_id) {
20
21
  return {
21
22
  content: [
22
23
  {
23
24
  type: 'text',
24
- text: 'Error: Parent must have either page_id or database_id.',
25
+ text: 'Error: Parent must have either page_id or data_source_id.',
25
26
  },
26
27
  ],
27
28
  isError: true,
@@ -29,7 +30,7 @@ export function registerMovePage(server, notion) {
29
30
  }
30
31
  const parentParam = parent.page_id
31
32
  ? { page_id: parent.page_id }
32
- : { database_id: parent.database_id };
33
+ : { data_source_id: parent.data_source_id };
33
34
  const response = await notion.pages.move({
34
35
  page_id,
35
36
  parent: parentParam,
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NotionClient } from '../notion-client.js';
3
+ export declare function registerQueryDataSource(server: McpServer, notion: NotionClient): void;
4
+ //# sourceMappingURL=query-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/query-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8BvD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsDrF"}
@@ -3,20 +3,22 @@ import { pagesToSimple } from '../converters/index.js';
3
3
  import { formatPaginatedResponse, formatSimplePaginatedResponse, handleError, } from '../utils/index.js';
4
4
  // Minimal schema for MCP (full validation by Notion API)
5
5
  const inputSchema = {
6
- database_id: z.string().describe('Database ID'),
6
+ data_source_id: z.string().describe('Data source ID'),
7
7
  filter: z.any().optional().describe('Filter conditions'),
8
8
  sorts: z.array(z.any()).optional().describe('Sort conditions'),
9
9
  start_cursor: z.string().optional().describe('Pagination cursor'),
10
10
  page_size: z.number().optional().describe('Results per page (1-100)'),
11
11
  format: z.enum(['json', 'simple']).optional().describe('Output format (default: simple)'),
12
12
  };
13
- export function registerQueryDatabase(server, notion) {
14
- server.registerTool('query-database', {
15
- description: "Query a Notion database with optional filters and sorts. Returns paginated results. Use format='simple' (default) for human-readable output with reduced token usage.",
13
+ export function registerQueryDataSource(server, notion) {
14
+ server.registerTool('query-data-source', {
15
+ description: 'Query a Notion data source with optional filters and sorts. Returns paginated results. ' +
16
+ "Use format='simple' (default) for human-readable output with reduced token usage. " +
17
+ '(API version 2025-09-03)',
16
18
  inputSchema,
17
- }, async ({ database_id, filter, sorts, start_cursor, page_size, format }) => {
19
+ }, async ({ data_source_id, filter, sorts, start_cursor, page_size, format }) => {
18
20
  try {
19
- const params = { database_id };
21
+ const params = { data_source_id };
20
22
  if (filter) {
21
23
  params.filter = filter;
22
24
  }
@@ -30,7 +32,7 @@ export function registerQueryDatabase(server, notion) {
30
32
  params.page_size = page_size;
31
33
  }
32
34
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
- const response = await notion.databases.query(params);
35
+ const response = await notion.dataSources.query(params);
34
36
  if (format === 'simple') {
35
37
  const simplePages = pagesToSimple(response.results);
36
38
  return formatSimplePaginatedResponse(simplePages, response.has_more, response.next_cursor);
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NotionClient } from '../notion-client.js';
3
+ export declare function registerRetrieveDataSource(server: McpServer, notion: NotionClient): void;
4
+ //# sourceMappingURL=retrieve-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieve-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA2BvD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAwDxF"}
@@ -0,0 +1,55 @@
1
+ import { z } from 'zod';
2
+ import { formatResponse, formatSimpleResponse, handleError } from '../utils/index.js';
3
+ const inputSchema = {
4
+ data_source_id: z.string().describe('Data source ID'),
5
+ format: z
6
+ .enum(['json', 'simple'])
7
+ .optional()
8
+ .describe("Output format: 'simple' (default) or 'json'"),
9
+ };
10
+ export function registerRetrieveDataSource(server, notion) {
11
+ server.registerTool('retrieve-data-source', {
12
+ description: 'Retrieve a data source schema by its ID. Returns data source properties (columns) and their types. ' +
13
+ "Use format='simple' (default) for reduced token usage, 'json' for full Notion API response. " +
14
+ '(API version 2025-09-03)',
15
+ inputSchema,
16
+ }, async ({ data_source_id, format = 'simple' }) => {
17
+ try {
18
+ const response = await notion.dataSources.retrieve({ data_source_id });
19
+ if (format === 'json') {
20
+ return formatResponse(response);
21
+ }
22
+ // Simple format: extract essential info
23
+ const simpleProperties = {};
24
+ for (const [name, prop] of Object.entries(response.properties)) {
25
+ const simpleProp = {
26
+ id: prop.id,
27
+ type: prop.type,
28
+ };
29
+ // Include options for select/multi_select/status
30
+ if (prop.type === 'select' && prop.select) {
31
+ const selectProp = prop.select;
32
+ simpleProp.options = selectProp.options;
33
+ }
34
+ else if (prop.type === 'multi_select' && prop.multi_select) {
35
+ const multiSelectProp = prop.multi_select;
36
+ simpleProp.options = multiSelectProp.options;
37
+ }
38
+ else if (prop.type === 'status' && prop.status) {
39
+ const statusProp = prop.status;
40
+ simpleProp.options = statusProp.options;
41
+ }
42
+ simpleProperties[name] = simpleProp;
43
+ }
44
+ const simpleResponse = {
45
+ id: response.id,
46
+ parent_database_id: response.parent.database_id,
47
+ properties: simpleProperties,
48
+ };
49
+ return formatSimpleResponse(simpleResponse);
50
+ }
51
+ catch (error) {
52
+ return handleError(error);
53
+ }
54
+ });
55
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"retrieve-database.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8BvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA2DtF"}
1
+ {"version":3,"file":"retrieve-database.d.ts","sourceRoot":"","sources":["../../../src/tools/retrieve-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA+BvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAsCtF"}
@@ -9,7 +9,8 @@ const inputSchema = {
9
9
  };
10
10
  export function registerRetrieveDatabase(server, notion) {
11
11
  server.registerTool('retrieve-database', {
12
- description: 'Retrieve a database schema by its ID. Returns database properties (columns) and their types. ' +
12
+ description: 'Retrieve a database container by its ID. Returns database metadata and associated data sources. ' +
13
+ 'Note: In API 2025-09-03, database properties/schema are retrieved via retrieve-data-source using data_source_id. ' +
13
14
  "Use format='simple' (default) for reduced token usage, 'json' for full Notion API response.",
14
15
  inputSchema,
15
16
  }, async ({ database_id, format = 'simple' }) => {
@@ -19,35 +20,17 @@ export function registerRetrieveDatabase(server, notion) {
19
20
  return formatResponse(response);
20
21
  }
21
22
  // Simple format: extract essential info
22
- const simpleProperties = {};
23
- for (const [name, prop] of Object.entries(response.properties)) {
24
- const simpleProp = {
25
- id: prop.id,
26
- type: prop.type,
27
- };
28
- // Include options for select/multi_select/status
29
- if (prop.type === 'select' && prop.select) {
30
- const selectProp = prop.select;
31
- simpleProp.options = selectProp.options;
32
- }
33
- else if (prop.type === 'multi_select' && prop.multi_select) {
34
- const multiSelectProp = prop.multi_select;
35
- simpleProp.options = multiSelectProp.options;
36
- }
37
- else if (prop.type === 'status' && prop.status) {
38
- const statusProp = prop.status;
39
- simpleProp.options = statusProp.options;
40
- }
41
- simpleProperties[name] = simpleProp;
42
- }
43
23
  const simpleResponse = {
44
24
  id: response.id,
45
25
  title: response.title.map((t) => t.plain_text).join(''),
46
26
  description: response.description.map((t) => t.plain_text).join(''),
47
27
  url: response.url,
48
- properties: simpleProperties,
49
28
  is_inline: response.is_inline,
50
- archived: response.archived,
29
+ in_trash: response.in_trash,
30
+ data_sources: response.data_sources,
31
+ icon: response.icon,
32
+ created_time: response.created_time,
33
+ last_edited_time: response.last_edited_time,
51
34
  };
52
35
  return formatSimpleResponse(simpleResponse);
53
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8CvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAgD5E"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8CvD,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAiD5E"}
@@ -4,11 +4,11 @@ const inputSchema = {
4
4
  query: z.string().optional().describe('Text to search for in page titles and content'),
5
5
  filter: z
6
6
  .object({
7
- value: z.enum(['page', 'database']),
7
+ value: z.enum(['page', 'data_source']),
8
8
  property: z.literal('object'),
9
9
  })
10
10
  .optional()
11
- .describe('Filter to limit results to pages or databases. ' +
11
+ .describe('Filter to limit results to pages or data sources. ' +
12
12
  'Example: { "value": "page", "property": "object" }'),
13
13
  sort: z
14
14
  .object({
@@ -31,10 +31,11 @@ const inputSchema = {
31
31
  };
32
32
  export function registerSearch(server, notion) {
33
33
  server.registerTool('search', {
34
- description: 'Search across all pages and databases in the workspace by title and content. ' +
35
- 'Filter results by type (page or database) and sort by last edited time. ' +
34
+ description: 'Search across all pages and data sources in the workspace by title and content. ' +
35
+ 'Filter results by type (page or data_source) and sort by last edited time. ' +
36
36
  'Returns paginated results. ' +
37
- 'For querying a specific database with filters, use query-database instead.',
37
+ 'For querying a specific data source with filters, use query-data-source instead. ' +
38
+ '(API version 2025-09-03)',
38
39
  inputSchema,
39
40
  }, async ({ query, filter, sort, start_cursor, page_size }) => {
40
41
  try {
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { NotionClient } from '../notion-client.js';
3
+ export declare function registerUpdateDataSource(server: McpServer, notion: NotionClient): void;
4
+ //# sourceMappingURL=update-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-data-source.d.ts","sourceRoot":"","sources":["../../../src/tools/update-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAYvD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA6BtF"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ import { formatResponse, handleError } from '../utils/index.js';
3
+ // Minimal schema for MCP (full validation by Notion API)
4
+ const inputSchema = {
5
+ data_source_id: z.string().describe('Data source ID'),
6
+ properties: z
7
+ .record(z.string(), z.any())
8
+ .optional()
9
+ .describe('Properties to add/update/delete (set to null to delete)'),
10
+ };
11
+ export function registerUpdateDataSource(server, notion) {
12
+ server.registerTool('update-data-source', {
13
+ description: 'Update a data source schema (properties/columns). ' +
14
+ 'Use this to add, update, or delete properties. Set a property to null to delete it. ' +
15
+ '(API version 2025-09-03)',
16
+ inputSchema,
17
+ }, async ({ data_source_id, properties }) => {
18
+ try {
19
+ const params = { data_source_id };
20
+ if (properties !== undefined) {
21
+ params.properties = properties;
22
+ }
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const response = await notion.dataSources.update(params);
25
+ return formatResponse(response);
26
+ }
27
+ catch (error) {
28
+ return handleError(error);
29
+ }
30
+ });
31
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"update-database.d.ts","sourceRoot":"","sources":["../../../src/tools/update-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAevD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA4DpF"}
1
+ {"version":3,"file":"update-database.d.ts","sourceRoot":"","sources":["../../../src/tools/update-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAevD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAuDpF"}
@@ -1,22 +1,22 @@
1
1
  import { z } from 'zod';
2
2
  import { formatResponse, handleError } from '../utils/index.js';
3
3
  // Minimal schema for MCP (full validation by Notion API)
4
+ // Note: Properties (schema) updates should use update-data-source in API 2025-09-03
4
5
  const inputSchema = {
5
6
  database_id: z.string().describe('Database ID'),
6
7
  title: z.array(z.any()).optional().describe('New title'),
7
8
  description: z.array(z.any()).optional().describe('New description'),
8
- properties: z.record(z.string(), z.any()).optional().describe('Properties to add/update/delete'),
9
- icon: z.any().optional().describe('Icon (null to remove)'),
9
+ icon: z.any().optional().describe('Icon object { type: "emoji", emoji: "📝" } or null to remove. Emoji must be an actual emoji character.'),
10
10
  cover: z.any().optional().describe('Cover (null to remove)'),
11
11
  is_inline: z.boolean().optional().describe('Inline database'),
12
12
  archived: z.boolean().optional().describe('Archive status'),
13
13
  };
14
14
  export function registerUpdateDatabase(server, notion) {
15
15
  server.registerTool('update-database', {
16
- description: 'Update an existing Notion database. Can modify title, description, properties (add/update/delete columns), icon, cover, inline status, and archive status. ' +
17
- 'Returns the updated database object.',
16
+ description: 'Update a Notion database container. Can modify title, description, icon, cover, inline status, and archive status. ' +
17
+ 'For schema (properties/columns) updates, use update-data-source instead. (API version 2025-09-03)',
18
18
  inputSchema,
19
- }, async ({ database_id, title, description, properties, icon, cover, is_inline, archived }) => {
19
+ }, async ({ database_id, title, description, icon, cover, is_inline, archived }) => {
20
20
  try {
21
21
  const params = {
22
22
  database_id,
@@ -27,9 +27,6 @@ export function registerUpdateDatabase(server, notion) {
27
27
  if (description !== undefined) {
28
28
  params.description = description;
29
29
  }
30
- if (properties !== undefined) {
31
- params.properties = properties;
32
- }
33
30
  if (icon !== undefined) {
34
31
  params.icon = icon;
35
32
  }
@@ -5,7 +5,7 @@ const inputSchema = {
5
5
  page_id: z.string().describe('Page ID'),
6
6
  properties: z.record(z.string(), z.any()).optional().describe('Properties to update'),
7
7
  archived: z.boolean().optional().describe('Archive the page'),
8
- icon: z.any().optional().describe('Page icon (null to remove)'),
8
+ icon: z.any().optional().describe('Page icon { type: "emoji", emoji: "📝" } or { type: "external", external: { url: "..." } }, or null to remove. Emoji must be an actual emoji character.'),
9
9
  cover: z.any().optional().describe('Cover image (null to remove)'),
10
10
  };
11
11
  export function registerUpdatePage(server, notion) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atikk-co-jp/notion-mcp-server",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "MCP server for Notion API - Create, read, update pages and databases",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,4 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { NotionClient } from '../notion-client.js';
3
- export declare function registerQueryDatabase(server: McpServer, notion: NotionClient): void;
4
- //# sourceMappingURL=query-database.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"query-database.d.ts","sourceRoot":"","sources":["../../../src/tools/query-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AA8BvD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAoDnF"}